From 07e27045f6aebea27f504a79955a7b871a299b6f Mon Sep 17 00:00:00 2001 From: Lis Pardi <lis@lindenlab.com> Date: Tue, 27 Oct 2009 18:47:27 -0400 Subject: [PATCH 001/306] ext-1925 dig Push to talk out of 1.23 and reinstate in viewer 2 --- .../xui/en/panel_preferences_advanced.xml | 105 ++++++++++++------ 1 file changed, 69 insertions(+), 36 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index f42bab14de1..258e63ae764 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -20,8 +20,9 @@ </panel.string> <check_box control_name="UseChatBubbles" + follows="left|top" height="16" - label="Bubble Chat" + label="Bubble chat" layout="topleft" left="30" top="10" @@ -30,6 +31,7 @@ <slider control_name="ChatBubbleOpacity" + follows="left|top" height="16" increment="0.05" initial_value="1" @@ -40,40 +42,24 @@ label_width="50" name="bubble_chat_opacity" width="200" /> - - <!-- <check_box - control_name="UIAutoScale" - height="16" - label="Resolution independent scale" - layout="topleft" - left="30" - name="ui_auto_scale" - top_pad="10" - width="256" />--> - <!-- - <combo_box - height="18" - layout="topleft" - left_pad="5" - name="fullscreen combo" - top_delta="-1" - width="150" /--> <text + follows="left|top" type="string" length="1" height="25" layout="topleft" left="30" - top_pad="20" + top_pad="5" name="AspectRatioLabel1" tool_tip="width / height" label_width="50" width="120"> - Aspect Ratio + Aspect ratio </text> <combo_box allow_text_entry="true" height="20" + follows="left|top" layout="topleft" left_pad="0" max_chars="100" @@ -104,6 +90,7 @@ </combo_box> <check_box control_name="FullScreenAutoDetectAspectRatio" + follows="left|top" height="25" label="Auto-detect" layout="topleft" @@ -113,14 +100,14 @@ <check_box.commit_callback function="Pref.AutoDetectAspect" /> </check_box> - <text + follows="left|top" type="string" length="1" height="10" left="30" name="heading1" - top_pad="10" + top_pad="5" width="270"> Camera: </text> @@ -128,7 +115,7 @@ Camera: can_edit_text="true" control_name="CameraAngle" decimal_digits="2" - top_pad="10" + top_pad="5" follows="left|top" height="16" increment="0.025" @@ -159,56 +146,62 @@ Camera: name="camera_offset_scale" show_text="false" width="240" - top_pad="10"/> + top_pad="5"/> <text + follows="left|top" type="string" length="1" height="10" left="30" name="heading2" - width="270"> + width="270" + top_pad="5"> Automatic positioning for: </text> <check_box control_name="EditCameraMovement" height="20" + follows="left|top" label="Build/Edit" layout="topleft" left_delta="50" name="edit_camera_movement" tool_tip="Use automatic camera positioning when entering and exiting edit mode" width="280" - top_pad="10" /> + top_pad="5" /> <check_box control_name="AppearanceCameraMovement" + follows="left|top" height="16" label="Appearance" layout="topleft" name="appearance_camera_movement" tool_tip="Use automatic camera positioning while in edit mode" width="242" /> - <text + follows="left|top" type="string" length="1" height="10" left="30" name="heading3" - top_pad="10" + top_pad="5" width="270"> Avatars: </text> <check_box control_name="FirstPersonAvatarVisible" + follows="left|top" height="20" label="Show me in Mouselook" layout="topleft" left_delta="50" name="first_person_avatar_visible" width="256" - top_pad="10"/> + top_pad="0"/> <check_box control_name="ArrowKeysMoveAvatar" + follows="left|top" height="20" label="Arrow keys always move me" layout="topleft" @@ -218,6 +211,7 @@ Avatars: top_pad="0"/> <check_box control_name="AllowTapTapHoldRun" + follows="left|top" height="20" label="Tap-tap-hold to run" layout="topleft" @@ -227,6 +221,7 @@ Avatars: top_pad="0"/> <check_box control_name="LipSyncEnabled" + follows="left|top" height="20" label="Move avatar lips when speaking" layout="topleft" @@ -236,16 +231,18 @@ Avatars: top_pad="0" /> <check_box control_name="ShowScriptErrors" + follows="left|top" height="20" label="Show script errors" layout="topleft" left="30" name="show_script_errors" width="256" - top_pad="10"/> + top_pad="5"/> <radio_group enabled_control="ShowScriptErrors" control_name="ShowScriptErrorsLocation" + follows="top|left" draw_border="false" height="40" layout="topleft" @@ -259,17 +256,53 @@ Avatars: layout="topleft" left="3" name="0" - top="3" + top="0" width="315" /> <radio_item height="16" label="In window" layout="topleft" - left_delta="0" + left_delta="175" name="1" - top_delta="16" + top_delta="0" width="315" /> </radio_group> - - + <check_box + follows="top|left" + height="20" + label="Use Push-to-talk in toggle mode" + layout="topleft" + left="30" + name="push_to_talk_toggle_check" + width="237" + top_pad="-25" + tool_tip="When in toggle mode, press and release the push-to-talk trigger to switch your microphone on and off. When not in toggle mode, the microphone is active only when the trigger is held down."/> + <line_editor + follows="top|left" + height="19" + left_delta="50" + max_length="254" + name="modifier_combo" + label="Push-to-talk trigger" + top_pad="0" + width="280" /> + <button + follows="top|left" + height="20" + label="Set Key" + left_delta="0" + name="set_voice_hotkey_button" + width="115" + top_pad="5" /> + <button + bottom_delta="0" + follows="left" + font="SansSerif" + halign="center" + height="20" + label="Middle Mouse Button" + left_delta="120" + mouse_opaque="true" + name="set_voice_middlemouse_button" + width="160" /> </panel> -- GitLab From cc1c8bb9bc2f210d029aa9e056e520ababe2f00e Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Thu, 29 Oct 2009 11:19:45 -0400 Subject: [PATCH 002/306] EXT-1804: Operations on the current look do not enforce one wearable per type DEV-39346: OUTFITS (Operations) : Restrict one shape per look, and some # of multiwearables per look DEV-38436: OUTFITS : Guarantee every outfit has fully populated links to (one each of) all body parts. Consolidated all paths for replacing or appending to COF, with common enforcement mechanism for counts of body parts, clothing, etc. Several functions are no longer needed after these changes, will clean up in a later pass. --- indra/newview/llappearancemgr.cpp | 200 ++++++++++++++++++++++++++---- indra/newview/llappearancemgr.h | 15 ++- 2 files changed, 193 insertions(+), 22 deletions(-) diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 4e022aeb299..8e1f7775d2c 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -296,15 +296,28 @@ struct LLWearableHoldingPattern bool append; }; +/* static */ void removeDuplicateItems(LLInventoryModel::item_array_t& items) +{ + LLInventoryModel::item_array_t new_items; + std::set<LLUUID> items_seen; + for (S32 i=0; i<items.count(); i++) + { + LLViewerInventoryItem *item = items.get(i); + LLUUID item_id = item->getLinkedUUID(); + if (items_seen.find(item_id)!=items_seen.end()) + continue; + items_seen.insert(item_id); + new_items.push_back(item); + } + items = new_items; +} void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src) { LLInventoryModel::item_array_t new_dst; std::set<LLUUID> mark_inventory; - std::set<LLUUID> mark_asset; S32 inventory_dups = 0; - S32 asset_dups = 0; for (LLInventoryModel::item_array_t::const_iterator src_pos = src.begin(); src_pos != src.end(); @@ -312,8 +325,6 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory { LLUUID src_item_id = (*src_pos)->getLinkedUUID(); mark_inventory.insert(src_item_id); - LLUUID src_asset_id = (*src_pos)->getAssetUUID(); - mark_asset.insert(src_asset_id); } for (LLInventoryModel::item_array_t::const_iterator dst_pos = dst.begin(); @@ -323,33 +334,22 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory LLUUID dst_item_id = (*dst_pos)->getLinkedUUID(); if (mark_inventory.find(dst_item_id) == mark_inventory.end()) - { - } - else - { - inventory_dups++; - } - - LLUUID dst_asset_id = (*dst_pos)->getAssetUUID(); - - if (mark_asset.find(dst_asset_id) == mark_asset.end()) { // Item is not already present in COF. new_dst.put(*dst_pos); - mark_asset.insert(dst_item_id); + mark_inventory.insert(dst_item_id); } else { - asset_dups++; + inventory_dups++; } } llinfos << "removeDups, original " << dst.count() << " final " << new_dst.count() - << " inventory dups " << inventory_dups << " asset_dups " << asset_dups << llendl; + << " inventory dups " << inventory_dups << llendl; dst = new_dst; } - /* static */ LLUUID LLAppearanceManager::getCOF() { @@ -363,6 +363,9 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo if (!proceed) return; +#if 1 + updateCOF(category,append); +#else if (append) { updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF. @@ -380,6 +383,7 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo rebuildCOFFromOutfit(category); } } +#endif } // Append to current COF contents by recursively traversing a folder. @@ -520,6 +524,130 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID } } } +/* static */ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links) +{ + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + gInventory.collectDescendents(getCOF(), cats, items, + LLInventoryModel::EXCLUDE_TRASH); + for (S32 i = 0; i < items.count(); ++i) + { + LLViewerInventoryItem *item = items.get(i); + if (keep_outfit_links && (item->getActualType() == LLAssetType::AT_LINK_FOLDER)) + continue; + gInventory.purgeObject(item->getUUID()); + } +} + +// Keep the last N wearables of each type. For viewer 2.0, N is 1 for +// both body parts and clothing items. +/* static */ void LLAppearanceManager::filterWearableItems( + LLInventoryModel::item_array_t& items, S32 max_per_type) +{ + // 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(); + items_by_type[type].push_back(item); + } + + // rebuild items list, retaining the last max_per_type of each array + items.clear(); + for (S32 i=0; i<WT_COUNT; i++) + { + S32 size = items_by_type[i].size(); + if (size <= 0) + continue; + S32 start_index = max(0,size-max_per_type); + for (S32 j = start_index; j<size; j++) + { + items.push_back(items_by_type[i][j]); + } + } +} + +// Create links to all listed items. +/* static */ void LLAppearanceManager::linkAll(const LLUUID& category, + LLInventoryModel::item_array_t& items, + LLPointer<LLInventoryCallback> cb) +{ + for (S32 i=0; i<items.count(); i++) + { + const LLInventoryItem* item = items.get(i).get(); + link_inventory_item(gAgent.getID(), + item->getLinkedUUID(), + category, + item->getName(), + LLAssetType::AT_LINK, + cb); + } +} + +/* static */ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) +{ + const LLUUID cof = getCOF(); + + // Collect and filter descendents to determine new COF contents. + + // - Body parts: always include COF contents as a fallback in case any + // required parts are missing. + LLInventoryModel::item_array_t body_items; + getDescendentsOfAssetType(cof, body_items, LLAssetType::AT_BODYPART, false); + getDescendentsOfAssetType(category, body_items, LLAssetType::AT_BODYPART, false); + // Reduce body items to max of one per type. + removeDuplicateItems(body_items); + filterWearableItems(body_items, 1); + + // - Wearables: include COF contents only if appending. + LLInventoryModel::item_array_t wear_items; + if (append) + getDescendentsOfAssetType(cof, wear_items, LLAssetType::AT_CLOTHING, false); + getDescendentsOfAssetType(category, wear_items, LLAssetType::AT_CLOTHING, false); + // Reduce wearables to max of one per type. + removeDuplicateItems(wear_items); + filterWearableItems(wear_items, 1); + + // - Attachments: include COF contents only if appending. + LLInventoryModel::item_array_t obj_items; + if (append) + getDescendentsOfAssetType(cof, obj_items, LLAssetType::AT_OBJECT, false); + getDescendentsOfAssetType(category, obj_items, LLAssetType::AT_OBJECT, false); + removeDuplicateItems(obj_items); + + // - Gestures: include COF contents only if appending. + LLInventoryModel::item_array_t gest_items; + if (append) + getDescendentsOfAssetType(cof, gest_items, LLAssetType::AT_GESTURE, false); + getDescendentsOfAssetType(category, gest_items, LLAssetType::AT_GESTURE, false); + removeDuplicateItems(gest_items); + + // Remove current COF contents. + bool keep_outfit_links = append; + purgeCategory(cof, keep_outfit_links); + gInventory.notifyObservers(); + + // Create links to new COF contents. + LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy; + + linkAll(cof, body_items, link_waiter); + linkAll(cof, wear_items, link_waiter); + linkAll(cof, obj_items, link_waiter); + linkAll(cof, gest_items, link_waiter); + + // Add link to outfit if category is an outfit. + LLViewerInventoryCategory* catp = gInventory.getCategory(category); + if (!append && catp && catp->getPreferredType() == LLAssetType::AT_OUTFIT) + { + link_inventory_item(gAgent.getID(), category, cof, catp->getName(), + LLAssetType::AT_LINK_FOLDER, link_waiter); + } + +} /* static */ bool LLAppearanceManager::isMandatoryWearableType(EWearableType type) @@ -792,6 +920,22 @@ void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category, follow_folder_links); } +/* static */ +void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category, + LLInventoryModel::item_array_t& items, + LLAssetType::EType type, + bool follow_folder_links) +{ + LLInventoryModel::cat_array_t cats; + LLIsType is_of_type(type); + gInventory.collectDescendentsIf(category, + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + is_of_type, + follow_folder_links); +} + /* static */ void LLAppearanceManager::getUserDescendents(const LLUUID& category, LLInventoryModel::item_array_t& wear_items, @@ -998,14 +1142,16 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update) } } +//#define DUMP_CAT_VERBOSE + /* static */ -void LLAppearanceManager::dumpCat(const LLUUID& cat_id, std::string str) +void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg) { LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; gInventory.collectDescendents(cat_id, cats, items, LLInventoryModel::EXCLUDE_TRASH); -#if 0 +#ifdef DUMP_CAT_VERBOSE llinfos << llendl; llinfos << str << llendl; S32 hitcount = 0; @@ -1017,6 +1163,18 @@ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, std::string str) llinfos << i <<" "<< item->getName() <<llendl; } #endif - llinfos << str << " count " << items.count() << llendl; + llinfos << msg << " count " << items.count() << llendl; } +/* static */ +void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& items, + const std::string& msg) +{ + llinfos << msg << llendl; + for (S32 i=0; i<items.count(); i++) + { + LLViewerInventoryItem *item = items.get(i); + llinfos << i <<" " << item->getName() << llendl; + } + llinfos << llendl; +} diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 828af321013..ea3ebdf4ea7 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -46,6 +46,7 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager> static void updateAppearanceFromCOF(); static bool needToSaveCOF(); static void changeOutfit(bool proceed, const LLUUID& category, bool append); + static void updateCOF(const LLUUID& category, bool append = false); static void updateCOFFromCategory(const LLUUID& category, bool append); static void rebuildCOFFromOutfit(const LLUUID& category); static void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append); @@ -65,9 +66,20 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager> static void removeItemLinks(const LLUUID& item_id, bool do_update = true); // For debugging - could be moved elsewhere. - static void dumpCat(const LLUUID& cat_id, std::string str); + static void dumpCat(const LLUUID& cat_id, const std::string& msg); + static void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg); private: + static void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type); + static void linkAll(const LLUUID& category, + LLInventoryModel::item_array_t& items, + LLPointer<LLInventoryCallback> cb); + + static void getDescendentsOfAssetType(const LLUUID& category, + LLInventoryModel::item_array_t& items, + LLAssetType::EType type, + bool follow_folder_links); + static void getCOFValidDescendents(const LLUUID& category, LLInventoryModel::item_array_t& items); @@ -81,6 +93,7 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager> static bool isMandatoryWearableType(EWearableType type); static void checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found); static void purgeCOFBeforeRebuild(const LLUUID& category); + static void purgeCategory(const LLUUID& category, bool keep_outfit_links); }; #define SUPPORT_ENSEMBLES 0 -- GitLab From 3b6e5fb59ec2d19eb189e25408f2dd12cd3bb263 Mon Sep 17 00:00:00 2001 From: angela <angela@lindenlab.com> Date: Mon, 2 Nov 2009 12:19:24 +0800 Subject: [PATCH 003/306] EXT-1738 [BSI] Manage Telehub... in Region/Estate floater silently fails when clicked --- indra/newview/llfloaterregioninfo.cpp | 15 ++++--- indra/newview/llfloaterregioninfo.h | 8 +++- .../newview/llpanelmediasettingssecurity.cpp | 40 +++++++++---------- .../default/xui/en/panel_region_general.xml | 10 ++--- .../xui/en/panel_region_general_layout.xml | 10 ++--- 5 files changed, 44 insertions(+), 39 deletions(-) diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 11544f5b7b5..17ddeb9d95c 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -179,6 +179,8 @@ BOOL LLFloaterRegionInfo::postBuild() LLPanelRegionInfo* panel; panel = new LLPanelRegionGeneralInfo; mInfoPanels.push_back(panel); + panel->getCommitCallbackRegistrar().add("RegionInfo.ManageTelehub", boost::bind(&LLPanelRegionInfo::onClickManageTelehub, panel)); + LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_general.xml"); mTab->addTabPanel(LLTabContainer::TabPanelParams().panel(panel).select_tab(true)); @@ -554,6 +556,12 @@ void LLPanelRegionInfo::onClickHelp(std::string xml_alert) LLNotifications::instance().add(xml_alert); } +void LLPanelRegionInfo::onClickManageTelehub() +{ + LLFloaterReg::hideInstance("region_info"); + LLFloaterReg::showInstance("telehubs"); +} + ///////////////////////////////////////////////////////////////////////////// // LLPanelRegionGeneralInfo // @@ -604,7 +612,6 @@ BOOL LLPanelRegionGeneralInfo::postBuild() childSetAction("kick_all_btn", onClickKickAll, this); childSetAction("im_btn", onClickMessage, this); // childSetAction("manage_telehub_btn", onClickManageTelehub, this); - mCommitCallbackRegistrar.add("RegionInfo.Cancel", boost::bind(&LLPanelRegionGeneralInfo::onClickManageTelehub, this)); return LLPanelRegionInfo::postBuild(); } @@ -712,11 +719,7 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L return false; } -void LLPanelRegionGeneralInfo::onClickManageTelehub() -{ - LLFloaterReg::hideInstance("region_info"); - LLFloaterReg::showInstance("telehubs"); -} + // setregioninfo // strings[0] = 'Y' - block terraform, 'N' - not diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index 95833af8a10..94fbbf9febb 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -123,10 +123,13 @@ class LLPanelRegionInfo : public LLPanel void enableButton(const std::string& btn_name, BOOL enable = TRUE); void disableButton(const std::string& btn_name); + void onClickManageTelehub(); + protected: void initCtrl(const std::string& name); void initHelpBtn(const std::string& name, const std::string& xml_alert); + // Callback for all help buttons, data is name of XML alert to show. void onClickHelp(std::string xml_alert); @@ -152,6 +155,7 @@ class LLPanelRegionInfo : public LLPanel class LLPanelRegionGeneralInfo : public LLPanelRegionInfo { + public: LLPanelRegionGeneralInfo() : LLPanelRegionInfo() {} @@ -161,16 +165,16 @@ class LLPanelRegionGeneralInfo : public LLPanelRegionInfo // LLPanel virtual BOOL postBuild(); + protected: virtual BOOL sendUpdate(); - static void onClickKick(void* userdata); static void onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata); static void onClickKickAll(void* userdata); bool onKickAllCommit(const LLSD& notification, const LLSD& response); static void onClickMessage(void* userdata); bool onMessageCommit(const LLSD& notification, const LLSD& response); - void onClickManageTelehub(); + }; ///////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp index f5607aa2874..33f0952f536 100644 --- a/indra/newview/llpanelmediasettingssecurity.cpp +++ b/indra/newview/llpanelmediasettingssecurity.cpp @@ -50,10 +50,11 @@ LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() : mParent( NULL ) { - // build dialog from XML - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml"); mCommitCallbackRegistrar.add("Media.whitelistAdd", boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this)); mCommitCallbackRegistrar.add("Media.whitelistDelete", boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this)); + // build dialog from XML + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml"); + } //////////////////////////////////////////////////////////////////////////////// @@ -62,10 +63,7 @@ BOOL LLPanelMediaSettingsSecurity::postBuild() { mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY ); mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY ); - - childSetAction("whitelist_add", onBtnAdd, this); - childSetAction("whitelist_del", onBtnDel, this); - + setDefaultBtn("whitelist_add"); return true; @@ -237,17 +235,17 @@ void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in ) const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& src_url ) { // use LLURI to determine if we have a valid scheme - LLURI candidate_url( src_url ); - if ( candidate_url.scheme().empty() ) - { + LLURI candidate_url( src_url ); + if ( candidate_url.scheme().empty() ) + { // build a URL comprised of default scheme and the original fragment const std::string default_scheme( "http://" ); return default_scheme + src_url; - }; - - // we *could* test the "default scheme" + "original fragment" URL again - // using LLURI to see if it's valid but I think the outcome is the same - // in either case - our only option is to return the original URL + }; + + // we *could* test the "default scheme" + "original fragment" URL again + // using LLURI to see if it's valid but I think the outcome is the same + // in either case - our only option is to return the original URL // we *think* the original url passed in was valid return src_url; @@ -334,10 +332,10 @@ void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata ) self->mWhiteListList->deleteSelectedItems(); } -//////////////////////////////////////////////////////////////////////////////// -// -void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent ) -{ - mParent = parent; -}; - +//////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent ) +{ + mParent = parent; +}; + diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index 160ae96fc4e..b6d13a0fdde 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -299,10 +299,7 @@ left="108" name="apply_btn" top="320" - width="100"> - <button.commit_callback - function="RegionInfo.Cancel" /> - </button> + width="100"/> <button follows="left|top" height="20" @@ -338,5 +335,8 @@ left="250" name="manage_telehub_btn" top="70" - width="150" /> + width="150"> + <button.commit_callback + function="RegionInfo.ManageTelehub" /> + </button> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml index 9b9c62dbf9d..42297cdc073 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml @@ -299,10 +299,7 @@ left="108" name="apply_btn" top="320" - width="100"> - <button.commit_callback - function="RegionInfo.Cancel" /> - </button> + width="100"/> <button follows="left|top" height="20" @@ -338,5 +335,8 @@ left_delta="0" name="manage_telehub_btn" top_pad="20" - width="150" /> + width="150" > + <button.commit_callback + function="RegionInfo.ManageTelehub" /> + </button> </panel> -- GitLab From 25538beb77b66fe6968edcddd6e15a4133ec3564 Mon Sep 17 00:00:00 2001 From: angela <angela@lindenlab.com> Date: Mon, 2 Nov 2009 19:22:19 +0800 Subject: [PATCH 004/306] Script Editor: changing Mono checkbox doesn't enable Save button --- indra/newview/llpreviewscript.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index ac7abf14485..b391c6ff1da 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -452,7 +452,7 @@ bool LLScriptEdCore::hasChanged() { if (!mEditor) return false; - return !mEditor->isPristine(); + return ((!mEditor->isPristine() || mEnableSave) && mHasScriptData); } void LLScriptEdCore::draw() -- GitLab From e12d1371cc044560fb892d222acc253f7a015f0c Mon Sep 17 00:00:00 2001 From: angela <angela@lindenlab.com> Date: Mon, 2 Nov 2009 20:57:24 +0800 Subject: [PATCH 005/306] EXT-1736 [BSI] About Land > Objects > Object Owners list doesn't display names --- indra/newview/llfloaterland.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index bdf9842b015..7ec85f942b9 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -1519,7 +1519,9 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo } // Placeholder for name. - item_params.columns.add().font(FONT).column("name"); + std::string name; + gCacheName->getFullName(owner_id, name); + item_params.columns.add().value(name).font(FONT).column("name"); object_count_str = llformat("%d", object_count); item_params.columns.add().value(object_count_str).font(FONT).column("count"); -- GitLab From 116f5c7880ceead16133d51693adc1ca25564049 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Mon, 2 Nov 2009 10:01:47 -0800 Subject: [PATCH 006/306] added ignores for winmerge cruft --- .hgignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.hgignore b/.hgignore index 8e02212e798..6357f0afd7f 100644 --- a/.hgignore +++ b/.hgignore @@ -44,3 +44,7 @@ tarfile_tmp ^indra/web/dataservice/lib/shared/vault.* ^indra/web/dataservice/vendor.* glob:indra/newview/dbghelp.dll +glob:*.cpp.orig +glob:*.cpp.bak +glob:*.h.bak +glob:*.h.orig -- GitLab From a3f90362cc37dcbb4197d0a1f07127241cf63861 Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk <slitovchuk@productengine.com> Date: Mon, 2 Nov 2009 20:23:30 +0200 Subject: [PATCH 007/306] no ticket. Fixed warnings of "use_ellipses" parameter. --HG-- branch : product-engine --- .../newview/skins/default/xui/en/panel_group_info_sidetray.xml | 2 +- indra/newview/skins/default/xui/en/panel_pick_info.xml | 2 +- indra/newview/skins/default/xui/en/panel_profile.xml | 2 +- indra/newview/skins/default/xui/en/panel_profile_view.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index d8d47c40084..132c031942c 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -47,7 +47,7 @@ background_visible="true" text_color="white" top="0" value="(Loading...)" - use_elipsis="true" + use_ellipses="true" width="300" /> <line_editor follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml index a67ae59b4a4..3cc9c3f38a0 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml @@ -30,7 +30,7 @@ text_color="white" top="0" value="Pick Info" - use_elipsis="true" + use_ellipses="true" width="275" /> <scroll_container color="DkGray2" diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 5af7d7d6744..c3a92f9d9ae 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -157,7 +157,7 @@ value="http://librarianavengers.org" width="280" word_wrap="false" - use_elipsis="true" + use_ellipses="true" /> <text follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml index 195b7315313..4b2e901718e 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -36,7 +36,7 @@ text_color="white" top="0" value="(Loading...)" - use_elipsis="true" + use_ellipses="true" width="275" /> <text follows="top|left" -- GitLab From 86b1ee7703bb57c6b1e1c068cda02bfb9ed0721e Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Mon, 2 Nov 2009 14:10:56 -0500 Subject: [PATCH 008/306] Work in progress on attachment tracking. --- indra/newview/llappearancemgr.cpp | 38 +++++++++++++++++++++++++++++-- indra/newview/llappearancemgr.h | 6 +++++ indra/newview/llvoavatarself.cpp | 10 ++++---- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 8e1f7775d2c..c297f8db298 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -528,7 +528,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID { LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; - gInventory.collectDescendents(getCOF(), cats, items, + gInventory.collectDescendents(category, cats, items, LLInventoryModel::EXCLUDE_TRASH); for (S32 i = 0; i < items.count(); ++i) { @@ -563,7 +563,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID S32 size = items_by_type[i].size(); if (size <= 0) continue; - S32 start_index = max(0,size-max_per_type); + S32 start_index = llmax(0,size-max_per_type); for (S32 j = start_index; j<size; j++) { items.push_back(items_by_type[i][j]); @@ -1178,3 +1178,37 @@ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& it } llinfos << llendl; } + + +std::set<LLUUID> LLAppearanceManager::sRegisteredAttachments; + +void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg) +{ + llinfos << msg << llendl; + for (std::set<LLUUID>::const_iterator it = atts.begin(); + it != atts.end(); + ++it) + { + LLUUID item_id = *it; + LLViewerInventoryItem *item = gInventory.getItem(item_id); + if (item) + llinfos << "atts " << item->getName() << llendl; + else + llinfos << "atts " << "UNKNOWN[" << item_id.asString() << "]" << llendl; + } + llinfos << llendl; +} + +/* static */ +void LLAppearanceManager::registerAttachment(const LLUUID& item_id) +{ + sRegisteredAttachments.insert(item_id); + dumpAttachmentSet(sRegisteredAttachments,"after register:"); +} + +/* static */ +void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id) +{ + sRegisteredAttachments.erase(item_id); + dumpAttachmentSet(sRegisteredAttachments,"after unregister:"); +} diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index ea3ebdf4ea7..45c6e23bae7 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -68,6 +68,9 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager> // For debugging - could be moved elsewhere. static void dumpCat(const LLUUID& cat_id, const std::string& msg); static void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg); + static void unregisterAttachment(const LLUUID& item_id); + static void registerAttachment(const LLUUID& item_id); + private: static void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type); @@ -94,6 +97,9 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager> static void checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found); static void purgeCOFBeforeRebuild(const LLUUID& category); static void purgeCategory(const LLUUID& category, bool keep_outfit_links); + + static std::set<LLUUID> sRegisteredAttachments; + }; #define SUPPORT_ENSEMBLES 0 diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 758db538a28..44fd81f0d17 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1080,6 +1080,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view if (attachment->isObjectAttached(viewer_object)) { const LLUUID& attachment_id = viewer_object->getItemID(); + LLAppearanceManager::registerAttachment(attachment_id); LLViewerInventoryItem *item = gInventory.getItem(attachment_id); if (item) { @@ -1096,12 +1097,12 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view //virtual BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object) { - const LLUUID item_id = viewer_object->getItemID(); + const LLUUID attachment_id = viewer_object->getItemID(); if (LLVOAvatar::detachObject(viewer_object)) { // the simulator should automatically handle permission revocation - stopMotionFromSource(item_id); + stopMotionFromSource(attachment_id); LLFollowCamMgr::setCameraActive(viewer_object->getID(), FALSE); LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren(); @@ -1127,11 +1128,12 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object) else { LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:"); - LLAppearanceManager::removeItemLinks(item_id, false); + LLAppearanceManager::removeItemLinks(attachment_id, false); + LLAppearanceManager::unregisterAttachment(attachment_id); } // BAP - needs to change for label to track link. - gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); + gInventory.addChangedMask(LLInventoryObserver::LABEL, attachment_id); gInventory.notifyObservers(); return TRUE; } -- GitLab From d4a3ccc52cf0c9113428c71280a9e4d28f781bfd Mon Sep 17 00:00:00 2001 From: Eugene Kondrashev <ekondrashev@productengine.com> Date: Mon, 2 Nov 2009 21:27:37 +0200 Subject: [PATCH 009/306] Fixed normal bug EXT-957-IM Verb button missing --HG-- branch : product-engine --- indra/newview/llpanelimcontrolpanel.cpp | 21 ++++++++++++++----- indra/newview/llpanelimcontrolpanel.h | 2 ++ .../default/xui/en/floater_im_session.xml | 10 ++++----- .../default/xui/en/panel_im_control_panel.xml | 10 ++++++++- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index b54975b76b6..b5e0cdccc0c 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -112,21 +112,32 @@ BOOL LLPanelIMControlPanel::postBuild() childSetAction("add_friend_btn", boost::bind(&LLPanelIMControlPanel::onAddFriendButtonClicked, this)); childSetAction("share_btn", boost::bind(&LLPanelIMControlPanel::onShareButtonClicked, this)); + childSetAction("teleport_btn", boost::bind(&LLPanelIMControlPanel::onTeleportButtonClicked, this)); + childSetAction("pay_btn", boost::bind(&LLPanelIMControlPanel::onPayButtonClicked, this)); childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId())); return LLPanelChatControlPanel::postBuild(); } +void LLPanelIMControlPanel::onTeleportButtonClicked() +{ + LLAvatarActions::offerTeleport(mAvatarID); +} +void LLPanelIMControlPanel::onPayButtonClicked() +{ + LLAvatarActions::pay(mAvatarID); +} + void LLPanelIMControlPanel::onViewProfileButtonClicked() { - LLAvatarActions::showProfile(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId()); + LLAvatarActions::showProfile(mAvatarID); } void LLPanelIMControlPanel::onAddFriendButtonClicked() { LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon"); std::string full_name = avatar_icon->getFirstName() + " " + avatar_icon->getLastName(); - LLAvatarActions::requestFriendshipDialog(avatar_icon->getAvatarId(), full_name); + LLAvatarActions::requestFriendshipDialog(mAvatarID, full_name); } void LLPanelIMControlPanel::onShareButtonClicked() @@ -140,12 +151,12 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) LLIMModel& im_model = LLIMModel::instance(); - LLUUID avatar_id = im_model.getOtherParticipantID(session_id); + mAvatarID = im_model.getOtherParticipantID(session_id); // Disable "Add friend" button for friends. - childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(avatar_id)); + childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID)); - getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(avatar_id); + getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID); // Disable profile button if participant is not realy SL avatar LLIMModel::LLIMSession* im_session = diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index d25f33935a3..b60ddc1d8d8 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -73,6 +73,8 @@ class LLPanelIMControlPanel : public LLPanelChatControlPanel void onViewProfileButtonClicked(); void onAddFriendButtonClicked(); void onShareButtonClicked(); + void onTeleportButtonClicked(); + void onPayButtonClicked(); LLUUID mAvatarID; }; 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 26d2f4e497f..c314fce42dc 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -3,7 +3,7 @@ legacy_header_height="18" background_visible="true" follows="left|top|right|bottom" - height="270" + height="330" layout="topleft" left="0" name="panel_im" @@ -17,7 +17,7 @@ min_width="200" min_height="150"> <layout_stack follows="left|top|right|bottom" - height="255" + height="305" width="365" layout="topleft" orientation="horizontal" @@ -29,11 +29,11 @@ layout="topleft" top_delta="-3" width="146" - height="255" + height="305" follows="left" label="IM Control Panel" user_resize="false" /> - <layout_panel height="255" + <layout_panel height="305" width="200" left_delta="146" top="0" @@ -56,7 +56,7 @@ length="1" follows="left|top|right|bottom" font="SansSerif" - height="205" + height="255" layout="topleft" name="chat_history" parse_highlights="true" 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 c4cdaa41f97..a9396661e0a 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 @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="panel_im_control_panel" width="125" - height="248" + height="298" border="false"> <avatar_icon name="avatar_icon" @@ -39,9 +39,17 @@ height="20" visible="false"/> + <button name="teleport_btn" + label="Teleport" + width="125" + height="20" /> <button name="share_btn" label="Share" width="125" height="20" /> + <button name="pay_btn" + label="Pay" + width="125" + height="20" /> </panel> -- GitLab From 08f1e05552796f2f0d67f95aefca181ca96c5615 Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Mon, 2 Nov 2009 21:51:39 +0200 Subject: [PATCH 010/306] fixed major bug EXT-1984 Speak button light should not disable when voice channel is open --HG-- branch : product-engine --- indra/newview/llchiclet.cpp | 1 + indra/newview/lloutputmonitorctrl.cpp | 12 ++++++++++-- indra/newview/lloutputmonitorctrl.h | 3 +++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index bad61101c1b..a854eb852fe 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -1336,6 +1336,7 @@ LLTalkButton::LLTalkButton(const Params& p) // never show "muted" because you can't mute yourself mOutputMonitor->setIsMuted(false); + mOutputMonitor->setIsAgentControl(true); } LLTalkButton::~LLTalkButton() diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp index 8bac9937f0d..39381e3faae 100644 --- a/indra/newview/lloutputmonitorctrl.cpp +++ b/indra/newview/lloutputmonitorctrl.cpp @@ -80,7 +80,8 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p) mImageLevel2(p.image_level_2), mImageLevel3(p.image_level_3), mAutoUpdate(p.auto_update), - mSpeakerId(p.speaker_id) + mSpeakerId(p.speaker_id), + mIsAgentControl(false) { //static LLUIColor output_monitor_muted_color = LLUIColorTable::instance().getColor("OutputMonitorMutedColor", LLColor4::orange); //static LLUIColor output_monitor_overdriven_color = LLUIColorTable::instance().getColor("OutputMonitorOverdrivenColor", LLColor4::red); @@ -132,7 +133,14 @@ void LLOutputMonitorCtrl::draw() if (getVisible() && mAutoUpdate && !mIsMuted && mSpeakerId.notNull()) { setPower(gVoiceClient->getCurrentPower(mSpeakerId)); - setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId)); + if(mIsAgentControl) + { + setIsTalking(gVoiceClient->getUserPTTState()); + } + else + { + setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId)); + } } LLPointer<LLUIImage> icon; diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h index 7a7b8bc3a18..85ea552a572 100644 --- a/indra/newview/lloutputmonitorctrl.h +++ b/indra/newview/lloutputmonitorctrl.h @@ -81,6 +81,8 @@ class LLOutputMonitorCtrl // For the current user, need to know the PTT state to show // correct button image. + void setIsAgentControl(bool val) { mIsAgentControl = val; } + void setIsTalking(bool val) { mIsTalking = val; } void setSpeakerId(const LLUUID& speaker_id); @@ -100,6 +102,7 @@ class LLOutputMonitorCtrl F32 mPower; + bool mIsAgentControl; bool mIsMuted; bool mIsTalking; LLPointer<LLUIImage> mImageMute; -- GitLab From 3a8a93d59650f9a6f0d47a1db7076e9c3d50e9d6 Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Mon, 2 Nov 2009 21:53:31 +0200 Subject: [PATCH 011/306] fix for EXT-1232 \"You are Here\" banner for Place Profile - Parcel Characteristics Note: Now distance check is not depend on Z coordinate --HG-- branch : product-engine --- indra/newview/llagentui.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp index 09f7c49f23d..41c8066aca4 100644 --- a/indra/newview/llagentui.cpp +++ b/indra/newview/llagentui.cpp @@ -92,7 +92,10 @@ std::string LLAgentUI::buildSLURL(const bool escaped /*= true*/) //static BOOL LLAgentUI::checkAgentDistance(const LLVector3& pole, F32 radius) { - return (gAgent.getPositionAgent() - pole).length() < radius; + S32 delta_x = gAgent.getPositionAgent().mV[VX] - pole.mV[VX]; + S32 delta_y = gAgent.getPositionAgent().mV[VY] - pole.mV[VY]; + + return sqrt( delta_x* delta_x + delta_y* delta_y ) < radius; } BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const LLVector3& agent_pos_region) { -- GitLab From b94d2ff4c5bd26ffe821a6f40c2bc5883ae2ebba Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Mon, 2 Nov 2009 12:03:00 -0800 Subject: [PATCH 012/306] EXT-462 Fixed freeze/eject commands in right-click and avatar inspector menus We were incorrectly only enabling them for gods. They now properly enable for region/land owners. --- indra/newview/llinspectavatar.cpp | 37 +++++- indra/newview/llviewermenu.cpp | 109 ++++++++++-------- indra/newview/llviewermenu.h | 8 ++ .../xui/en/menu_inspect_avatar_gear.xml | 6 +- 4 files changed, 105 insertions(+), 55 deletions(-) diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index 99580d09189..bfad2b16248 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -107,9 +107,12 @@ class LLInspectAvatar : public LLInspect void onClickPay(); void onClickBlock(); void onClickReport(); + void onClickFreeze(); + void onClickEject(); void onClickZoomIn(); void onClickFindOnMap(); bool onVisibleFindOnMap(); + bool onVisibleFreezeEject(); void onClickMuteVolume(); void onVolumeChange(const LLSD& data); @@ -190,11 +193,16 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd) mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup", boost::bind(&LLInspectAvatar::onClickInviteToGroup, this)); mCommitCallbackRegistrar.add("InspectAvatar.Pay", boost::bind(&LLInspectAvatar::onClickPay, this)); mCommitCallbackRegistrar.add("InspectAvatar.Block", boost::bind(&LLInspectAvatar::onClickBlock, this)); + mCommitCallbackRegistrar.add("InspectAvatar.Freeze", + boost::bind(&LLInspectAvatar::onClickFreeze, this)); + mCommitCallbackRegistrar.add("InspectAvatar.Eject", + boost::bind(&LLInspectAvatar::onClickEject, this)); mCommitCallbackRegistrar.add("InspectAvatar.Report", boost::bind(&LLInspectAvatar::onClickReport, this)); mCommitCallbackRegistrar.add("InspectAvatar.FindOnMap", boost::bind(&LLInspectAvatar::onClickFindOnMap, this)); mCommitCallbackRegistrar.add("InspectAvatar.ZoomIn", boost::bind(&LLInspectAvatar::onClickZoomIn, this)); mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap", boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this)); - + mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFreezeEject", + boost::bind(&LLInspectAvatar::onVisibleFreezeEject, this)); // can't make the properties request until the widgets are constructed // as it might return immediately, so do it in postBuild. @@ -437,13 +445,13 @@ void LLInspectAvatar::nameUpdatedCallback( void LLInspectAvatar::onClickAddFriend() { LLAvatarActions::requestFriendshipDialog(mAvatarID, mAvatarName); + closeFloater(); } void LLInspectAvatar::onClickViewProfile() { - // hide inspector when showing profile - setFocus(FALSE); LLAvatarActions::showProfile(mAvatarID); + closeFloater(); } bool LLInspectAvatar::onVisibleFindOnMap() @@ -451,24 +459,33 @@ bool LLInspectAvatar::onVisibleFindOnMap() return gAgent.isGodlike() || is_agent_mappable(mAvatarID); } +bool LLInspectAvatar::onVisibleFreezeEject() +{ + return enable_freeze_eject( LLSD(mAvatarID) ); +} + void LLInspectAvatar::onClickIM() { LLAvatarActions::startIM(mAvatarID); + closeFloater(); } void LLInspectAvatar::onClickTeleport() { LLAvatarActions::offerTeleport(mAvatarID); + closeFloater(); } void LLInspectAvatar::onClickInviteToGroup() { LLAvatarActions::inviteToGroup(mAvatarID); + closeFloater(); } void LLInspectAvatar::onClickPay() { LLAvatarActions::pay(mAvatarID); + closeFloater(); } void LLInspectAvatar::onClickBlock() @@ -476,11 +493,25 @@ void LLInspectAvatar::onClickBlock() LLMute mute(mAvatarID, mAvatarName, LLMute::AGENT); LLMuteList::getInstance()->add(mute); LLPanelBlockedList::showPanelAndSelect(mute.mID); + closeFloater(); } void LLInspectAvatar::onClickReport() { LLFloaterReporter::showFromObject(mAvatarID); + closeFloater(); +} + +void LLInspectAvatar::onClickFreeze() +{ + handle_avatar_freeze( LLSD(mAvatarID) ); + closeFloater(); +} + +void LLInspectAvatar::onClickEject() +{ + handle_avatar_eject( LLSD(mAvatarID) ); + closeFloater(); } void LLInspectAvatar::onClickZoomIn() diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 864cf9d57bb..9da9ff5ce7f 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2963,11 +2963,20 @@ bool callback_freeze(const LLSD& notification, const LLSD& response) } -class LLAvatarFreeze : public view_listener_t +void handle_avatar_freeze(const LLSD& avatar_id) { - bool handleEvent(const LLSD& userdata) - { - LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); + // Use avatar_id if available, otherwise default to right-click avatar + LLVOAvatar* avatar = NULL; + if (avatar_id.asUUID().notNull()) + { + avatar = find_avatar_from_object(avatar_id.asUUID()); + } + else + { + avatar = find_avatar_from_object( + LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); + } + if( avatar ) { std::string fullname = avatar->getFullname(); @@ -2991,9 +3000,7 @@ class LLAvatarFreeze : public view_listener_t callback_freeze); } } - return true; - } -}; +} class LLAvatarVisibleDebug : public view_listener_t { @@ -3003,14 +3010,6 @@ class LLAvatarVisibleDebug : public view_listener_t } }; -class LLAvatarEnableDebug : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - return gAgent.isGodlike(); - } -}; - class LLAvatarDebug : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -3087,11 +3086,20 @@ bool callback_eject(const LLSD& notification, const LLSD& response) return false; } -class LLAvatarEject : public view_listener_t +void handle_avatar_eject(const LLSD& avatar_id) { - bool handleEvent(const LLSD& userdata) - { - LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); + // Use avatar_id if available, otherwise default to right-click avatar + LLVOAvatar* avatar = NULL; + if (avatar_id.asUUID().notNull()) + { + avatar = find_avatar_from_object(avatar_id.asUUID()); + } + else + { + avatar = find_avatar_from_object( + LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); + } + if( avatar ) { LLSD payload; @@ -3142,38 +3150,41 @@ class LLAvatarEject : public view_listener_t } } } - return true; - } -}; +} -class LLAvatarEnableFreezeEject : public view_listener_t +bool enable_freeze_eject(const LLSD& avatar_id) { - bool handleEvent(const LLSD& userdata) + // Use avatar_id if available, otherwise default to right-click avatar + LLVOAvatar* avatar = NULL; + if (avatar_id.asUUID().notNull()) { - LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); - bool new_value = (avatar != NULL); + avatar = find_avatar_from_object(avatar_id.asUUID()); + } + else + { + avatar = find_avatar_from_object( + LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()); + } + if (!avatar) return false; - if (new_value) - { - const LLVector3& pos = avatar->getPositionRegion(); - const LLVector3d& pos_global = avatar->getPositionGlobal(); - LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel(); - LLViewerRegion* region = avatar->getRegion(); - new_value = (region != NULL); - - if (new_value) - { - new_value = region->isOwnedSelf(pos); - if (!new_value || region->isOwnedGroup(pos)) - { - new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN); - } - } - } + // Gods can always freeze + if (gAgent.isGodlike()) return true; - return new_value; + // Estate owners / managers can freeze + // Parcel owners can also freeze + const LLVector3& pos = avatar->getPositionRegion(); + const LLVector3d& pos_global = avatar->getPositionGlobal(); + LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel(); + LLViewerRegion* region = avatar->getRegion(); + if (!region) return false; + + bool new_value = region->isOwnedSelf(pos); + if (!new_value || region->isOwnedGroup(pos)) + { + new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN); } -}; + return new_value; +} class LLAvatarGiveCard : public view_listener_t { @@ -8021,18 +8032,18 @@ void initialize_menus() view_listener_t::addMenu(new LLObjectMute(), "Avatar.Mute"); view_listener_t::addMenu(new LLAvatarAddFriend(), "Avatar.AddFriend"); view_listener_t::addMenu(new LLAvatarAddContact(), "Avatar.AddContact"); - view_listener_t::addMenu(new LLAvatarFreeze(), "Avatar.Freeze"); + commit.add("Avatar.Freeze", boost::bind(&handle_avatar_freeze, LLSD())); view_listener_t::addMenu(new LLAvatarDebug(), "Avatar.Debug"); view_listener_t::addMenu(new LLAvatarVisibleDebug(), "Avatar.VisibleDebug"); - view_listener_t::addMenu(new LLAvatarEnableDebug(), "Avatar.EnableDebug"); view_listener_t::addMenu(new LLAvatarInviteToGroup(), "Avatar.InviteToGroup"); view_listener_t::addMenu(new LLAvatarGiveCard(), "Avatar.GiveCard"); - view_listener_t::addMenu(new LLAvatarEject(), "Avatar.Eject"); + commit.add("Avatar.Eject", boost::bind(&handle_avatar_eject, LLSD())); view_listener_t::addMenu(new LLAvatarSendIM(), "Avatar.SendIM"); view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse"); view_listener_t::addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend"); - view_listener_t::addMenu(new LLAvatarEnableFreezeEject(), "Avatar.EnableFreezeEject"); + enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2)); + visible.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2)); // Object pie menu view_listener_t::addMenu(new LLObjectBuild(), "Object.Build"); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 6d32df2bc54..b65878b5e63 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -101,6 +101,14 @@ void handle_take_copy(); void handle_look_at_selection(const LLSD& param); void handle_zoom_to_object(LLUUID object_id); +// Takes avatar UUID, or if no UUID passed, uses last selected object +void handle_avatar_freeze(const LLSD& avatar_id); + +// Takes avatar UUID, or if no UUID passed, uses last selected object +void handle_avatar_eject(const LLSD& avatar_id); + +bool enable_freeze_eject(const LLSD& avatar_id); + // Can anyone take a free copy of the object? // *TODO: Move to separate file bool anyone_copy_selection(LLSelectNode* nodep); diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml index edff1a093a4..6049476a43f 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml @@ -68,7 +68,7 @@ <menu_item_call.on_click function="InspectAvatar.Freeze"/> <menu_item_call.on_visible - function="IsGodCustomerService"/> + function="InspectAvatar.VisibleFreezeEject"/> </menu_item_call> <menu_item_call label="Eject" @@ -76,13 +76,13 @@ <menu_item_call.on_click function="InspectAvatar.Eject"/> <menu_item_call.on_visible - function="IsGodCustomerService"/> + function="InspectAvatar.VisibleFreezeEject"/> </menu_item_call> <menu_item_call label="Debug" name="debug"> <menu_item_call.on_click - function="InspectAvatar.Debug"/> + function="Avatar.Debug"/> <menu_item_call.on_visible function="IsGodCustomerService"/> </menu_item_call> -- GitLab From bde7d67066d189416a725da4527a02eb4f78ba4a Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Mon, 2 Nov 2009 15:39:55 -0500 Subject: [PATCH 013/306] EXT-1866 : Inventory Side Panel svn merge -r137106:137808 svn+ssh://svn.lindenlab.com/svn/linden/branches/avatar-pipeline/inventory-panel Porting over changes from svn Inventory Panel work. --- indra/newview/CMakeLists.txt | 3543 ++--- indra/newview/llagentwearables.cpp | 1 + indra/newview/llassetuploadresponders.cpp | 1 + indra/newview/llfloaterbuy.cpp | 1 + indra/newview/llfloaterbuycontents.cpp | 3 +- indra/newview/llfloatergesture.cpp | 1 + indra/newview/llfloaterinventory.cpp | 2108 +-- indra/newview/llfloaterinventory.h | 350 +- indra/newview/llfloateropenobject.cpp | 11 +- indra/newview/llfloateropenobject.h | 4 +- indra/newview/llfloatertools.cpp | 2 +- indra/newview/llfolderview.cpp | 1 + indra/newview/llimpanel.cpp | 1 + indra/newview/llinventorybridge.cpp | 10288 +++++++------- indra/newview/llinventorybridge.h | 7 +- indra/newview/llinventoryfunctions.cpp | 344 + indra/newview/llinventoryfunctions.h | 136 + indra/newview/llinventorymodel.cpp | 10 +- indra/newview/llpanelcontents.cpp | 10 +- indra/newview/llpanelcontents.h | 11 +- indra/newview/llpanelgroupnotices.cpp | 1 + indra/newview/llpanellandmarks.cpp | 1909 +-- indra/newview/llpanelmaininventory.cpp | 818 ++ indra/newview/llpanelmaininventory.h | 125 + indra/newview/llpanelobject.h | 1 - indra/newview/llpanelobjectinventory.cpp | 1905 +++ indra/newview/llpanelobjectinventory.h | 102 + indra/newview/llpanelvolume.cpp | 1 - indra/newview/llpanelvolume.h | 1 - indra/newview/llplacesinventorybridge.cpp | 5 +- indra/newview/llpreviewscript.cpp | 1 - indra/newview/llsidepanelinventory.cpp | 276 + indra/newview/llsidepanelinventory.h | 85 + indra/newview/lltexturectrl.cpp | 2 + indra/newview/lltoastgroupnotifypanel.cpp | 1 + indra/newview/llviewerinventory.cpp | 1 + indra/newview/llviewermenu.cpp | 1 + indra/newview/llviewermessage.cpp | 11445 ++++++++-------- .../skins/default/textures/textures.xml | 6 +- .../default/xui/en/floater_inventory.xml | 423 +- .../default/xui/en/floater_openobject.xml | 2 +- .../skins/default/xui/en/floater_tools.xml | 2 +- .../default/xui/en/panel_main_inventory.xml | 417 + .../skins/default/xui/en/panel_side_tray.xml | 280 +- .../xui/en/panel_sidetray_home_tab.xml | 63 +- .../default/xui/en/sidepanel_inventory.xml | 122 + 46 files changed, 18384 insertions(+), 16444 deletions(-) create mode 100644 indra/newview/llinventoryfunctions.cpp create mode 100644 indra/newview/llinventoryfunctions.h create mode 100644 indra/newview/llpanelmaininventory.cpp create mode 100644 indra/newview/llpanelmaininventory.h create mode 100644 indra/newview/llpanelobjectinventory.cpp create mode 100644 indra/newview/llpanelobjectinventory.h create mode 100644 indra/newview/llsidepanelinventory.cpp create mode 100644 indra/newview/llsidepanelinventory.h create mode 100644 indra/newview/skins/default/xui/en/panel_main_inventory.xml create mode 100644 indra/newview/skins/default/xui/en/sidepanel_inventory.xml diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index a7681e4a1d0..644ebfa3f44 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1,1766 +1,1777 @@ -# -*- cmake -*- - -project(viewer) - -include(00-Common) -include(Boost) -include(BuildVersion) -include(DBusGlib) -include(DirectX) -include(ELFIO) -include(FMOD) -include(OPENAL) -include(FindOpenGL) -include(LLAudio) -include(LLCharacter) -include(LLCommon) -include(LLImage) -include(LLImageJ2COJ) -include(LLInventory) -include(LLMath) -include(LLMessage) -include(LLPlugin) -include(LLPrimitive) -include(LLRender) -include(LLUI) -include(LLVFS) -include(LLWindow) -include(LLXML) -include(LLXUIXML) -include(LScript) -include(Linking) -include(NDOF) -include(GooglePerfTools) -include(TemplateCheck) -include(UI) -include(UnixInstall) -include(LLKDU) -include(ViewerMiscLibs) -include(LLLogin) -include(CMakeCopyIfDifferent) - -include_directories( - ${DBUSGLIB_INCLUDE_DIRS} - ${ELFIO_INCLUDE_DIR} - ${LLAUDIO_INCLUDE_DIRS} - ${LLCHARACTER_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLIMAGE_INCLUDE_DIRS} - ${LLINVENTORY_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLMESSAGE_INCLUDE_DIRS} - ${LLPLUGIN_INCLUDE_DIRS} - ${LLPRIMITIVE_INCLUDE_DIRS} - ${LLRENDER_INCLUDE_DIRS} - ${LLUI_INCLUDE_DIRS} - ${LLVFS_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ${LLXUIXML_INCLUDE_DIRS} - ${LSCRIPT_INCLUDE_DIRS} - ${LSCRIPT_INCLUDE_DIRS}/lscript_compile - ${LLLOGIN_INCLUDE_DIRS} - ) - -set(viewer_SOURCE_FILES - llaccordionctrl.cpp - llaccordionctrltab.cpp - llagent.cpp - llagentaccess.cpp - llagentdata.cpp - llagentlanguage.cpp - llagentlistener.cpp - llagentpicksinfo.cpp - llagentpilot.cpp - llagentui.cpp - llagentwearables.cpp - llanimstatelabels.cpp - llappearancemgr.cpp - llappviewer.cpp - llappviewerlistener.cpp - llassetuploadqueue.cpp - llassetuploadresponders.cpp - llaudiosourcevo.cpp - llavataractions.cpp - llavatariconctrl.cpp - llavatarlist.cpp - llavatarlistitem.cpp - llavatarpropertiesprocessor.cpp - llbottomtray.cpp - llbox.cpp - llbreadcrumbview.cpp - llcallbacklist.cpp - llcallingcard.cpp - llcapabilitylistener.cpp - llcaphttpsender.cpp - llchannelmanager.cpp - llchatbar.cpp - llchathistory.cpp - llchatitemscontainerctrl.cpp - llchatmsgbox.cpp - llchiclet.cpp - llclassifiedinfo.cpp - llclassifiedstatsresponder.cpp - llcloud.cpp - llcolorswatch.cpp - llcommandhandler.cpp - llcommandlineparser.cpp - llcompilequeue.cpp - llconfirmationmanager.cpp - llcurrencyuimanager.cpp - llcylinder.cpp - lldateutil.cpp - lldebugmessagebox.cpp - lldebugview.cpp - lldelayedgestureerror.cpp - lldirpicker.cpp - lldndbutton.cpp - lldrawable.cpp - lldrawpool.cpp - lldrawpoolalpha.cpp - lldrawpoolavatar.cpp - lldrawpoolbump.cpp - lldrawpoolground.cpp - lldrawpoolsimple.cpp - lldrawpoolsky.cpp - lldrawpoolterrain.cpp - lldrawpooltree.cpp - lldrawpoolwater.cpp - lldrawpoolwlsky.cpp - lldriverparam.cpp - lldynamictexture.cpp - llemote.cpp - lleventinfo.cpp - lleventnotifier.cpp - lleventpoll.cpp - llexpandabletextbox.cpp - llface.cpp - llfasttimerview.cpp - llfavoritesbar.cpp - llfeaturemanager.cpp - llfilepicker.cpp - llfirstuse.cpp - llflexibleobject.cpp - llfloaterabout.cpp - llfloateractivespeakers.cpp - llfloateranimpreview.cpp - llfloaterauction.cpp - llfloateravatarpicker.cpp - llfloateravatartextures.cpp - llfloaterbeacons.cpp - llfloaterbuildoptions.cpp - llfloaterbulkpermission.cpp - llfloaterbump.cpp - llfloaterbuy.cpp - llfloaterbuycontents.cpp - llfloaterbuycurrency.cpp - llfloaterbuyland.cpp - llfloatercall.cpp - llfloatercamera.cpp - llfloaterchat.cpp - llfloaterchatterbox.cpp - llfloatercolorpicker.cpp - llfloatercustomize.cpp - llfloaterdaycycle.cpp - llfloaterenvsettings.cpp - llfloaterfonttest.cpp - llfloaterfriends.cpp - llfloatergesture.cpp - llfloatergodtools.cpp - llfloatergroupinvite.cpp - llfloatergroups.cpp - llfloaterhandler.cpp - llfloaterhardwaresettings.cpp - llfloaterhelpbrowser.cpp - llfloaterhud.cpp - llfloaterimagepreview.cpp - llfloaterinspect.cpp - llfloaterinventory.cpp - llfloaterjoystick.cpp - llfloaterlagmeter.cpp - llfloaterland.cpp - llfloaterlandholdings.cpp - llfloatermap.cpp - llfloatermediabrowser.cpp - llfloatermediasettings.cpp - llfloatermemleak.cpp - llfloaternamedesc.cpp - llfloaternotificationsconsole.cpp - llfloateropenobject.cpp - llfloaterparcel.cpp - llfloaterpay.cpp - llfloaterperms.cpp - llfloaterpostcard.cpp - llfloaterpostprocess.cpp - llfloaterpreference.cpp - llfloaterproperties.cpp - llfloaterregioninfo.cpp - llfloaterreporter.cpp - llfloaterscriptdebug.cpp - llfloatersearch.cpp - llfloatersellland.cpp - llfloatersettingsdebug.cpp - llfloatersnapshot.cpp - llfloatertelehub.cpp - llfloatertestinspectors.cpp - llfloatertestlistview.cpp - llfloatertools.cpp - llfloatertopobjects.cpp - llfloatertos.cpp - llfloateruipreview.cpp - llfloaterurldisplay.cpp - llfloaterurlentry.cpp - llfloatervoicedevicesettings.cpp - llfloaterwater.cpp - llfloaterwhitelistentry.cpp - llfloaterwindlight.cpp - llfloaterworldmap.cpp - llfoldertype.cpp - llfolderview.cpp - llfolderviewitem.cpp - llfollowcam.cpp - llfriendcard.cpp - llgesturemgr.cpp - llglsandbox.cpp - llgroupactions.cpp - llgrouplist.cpp - llgroupmgr.cpp - llgroupnotify.cpp - llhomelocationresponder.cpp - llhudeffect.cpp - llhudeffectbeam.cpp - llhudeffectlookat.cpp - llhudeffectpointat.cpp - llhudeffecttrail.cpp - llhudicon.cpp - llhudmanager.cpp - llhudobject.cpp - llhudrender.cpp - llhudtext.cpp - llhudview.cpp - llimcontrolpanel.cpp - llimfloater.cpp - llimhandler.cpp - llimpanel.cpp - llimview.cpp - llinspect.cpp - llinspectavatar.cpp - llinspectgroup.cpp - llinspectobject.cpp - llinventorybridge.cpp - llinventoryclipboard.cpp - llinventoryfilter.cpp - llinventorymodel.cpp - llinventorysubtreepanel.cpp - lljoystickbutton.cpp - lllandmarkactions.cpp - lllandmarklist.cpp - lllistbrowser.cpp - lllistview.cpp - lllocaltextureobject.cpp - lllocationhistory.cpp - lllocationinputctrl.cpp - lllogchat.cpp - llloginhandler.cpp - lllogininstance.cpp - llmanip.cpp - llmaniprotate.cpp - llmanipscale.cpp - llmaniptranslate.cpp - llmapresponders.cpp - llmediactrl.cpp - llmediadataclient.cpp - llmediaremotectrl.cpp - llmemoryview.cpp - llmenucommands.cpp - llmetricperformancetester.cpp - llmimetypes.cpp - llmorphview.cpp - llmoveview.cpp - llmutelist.cpp - llnamebox.cpp - llnameeditor.cpp - llnamelistctrl.cpp - llnavigationbar.cpp - llnearbychat.cpp - llnearbychatbar.cpp - llnearbychathandler.cpp - llnetmap.cpp - llnotificationalerthandler.cpp - llnotificationgrouphandler.cpp - llnotificationmanager.cpp - llnotificationscripthandler.cpp - llnotificationtiphandler.cpp - llnotify.cpp - lloutputmonitorctrl.cpp - lloverlaybar.cpp - llpanelappearance.cpp - llpanelappearancetab.cpp - llpanelavatar.cpp - llpanelavatarrow.cpp - llpanelavatartag.cpp - llpanelblockedlist.cpp - llpanelclassified.cpp - llpanelcontents.cpp - llpaneleditwearable.cpp - llpanelevent.cpp - llpanelface.cpp - llpanelgroup.cpp - llpanelgroupgeneral.cpp - llpanelgroupinvite.cpp - llpanelgrouplandmoney.cpp - llpanelgroupnotices.cpp - llpanelgrouproles.cpp - llpanelimcontrolpanel.cpp - llpanelinventory.cpp - llpanelland.cpp - llpanellandaudio.cpp - llpanellandmarks.cpp - llpanellandmedia.cpp - llpanellogin.cpp - llpanellookinfo.cpp - llpanellooks.cpp - llpanelmedia.cpp - llpanelmediasettingsgeneral.cpp - llpanelmediasettingspermissions.cpp - llpanelmediasettingssecurity.cpp - llpanelmeprofile.cpp - llpanelobject.cpp - llpanelpeople.cpp - llpanelpeoplemenus.cpp - llpanelpermissions.cpp - llpanelpick.cpp - llpanelpicks.cpp - llpanelplace.cpp - llpanelplaceinfo.cpp - llpanelplaces.cpp - llpanelplacestab.cpp - llpanelprimmediacontrols.cpp - llpanelprofile.cpp - llpanelprofileview.cpp - llpanelshower.cpp - llpanelteleporthistory.cpp - llpanelvolume.cpp - llparcelselection.cpp - llparticipantlist.cpp - llpatchvertexarray.cpp - llplacesinventorybridge.cpp - llpolymesh.cpp - llpolymorph.cpp - llpreview.cpp - llpreviewanim.cpp - llpreviewgesture.cpp - llpreviewnotecard.cpp - llpreviewscript.cpp - llpreviewsound.cpp - llpreviewtexture.cpp - llproductinforequest.cpp - llprogressview.cpp - llrecentpeople.cpp - llregionposition.cpp - llremoteparcelrequest.cpp - llsavedsettingsglue.cpp - llscreenchannel.cpp - llscrollingpanelparam.cpp - llsearchcombobox.cpp - llsearchhistory.cpp - llselectmgr.cpp - llsidetray.cpp - llsidetraypanelcontainer.cpp - llsky.cpp - llslurl.cpp - llspatialpartition.cpp - llspeakers.cpp - llsplitbutton.cpp - llsprite.cpp - llstartup.cpp - llstatusbar.cpp - llstylemap.cpp - llsurface.cpp - llsurfacepatch.cpp - llsyswellitem.cpp - llsyswellwindow.cpp - llteleporthistory.cpp - llteleporthistorystorage.cpp - lltexglobalcolor.cpp - lltexlayer.cpp - lltexlayerparams.cpp - lltextureatlas.cpp - lltextureatlasmanager.cpp - lltexturecache.cpp - lltexturectrl.cpp - lltexturefetch.cpp - lltextureview.cpp - lltoast.cpp - lltoastalertpanel.cpp - lltoastgroupnotifypanel.cpp - lltoastimpanel.cpp - lltoastnotifypanel.cpp - lltoastpanel.cpp - lltool.cpp - lltoolbar.cpp - lltoolbrush.cpp - lltoolcomp.cpp - lltooldraganddrop.cpp - lltoolface.cpp - lltoolfocus.cpp - lltoolgrab.cpp - lltoolgun.cpp - lltoolindividual.cpp - lltoolmgr.cpp - lltoolmorph.cpp - lltoolobjpicker.cpp - lltoolpie.cpp - lltoolpipette.cpp - lltoolplacer.cpp - lltoolselect.cpp - lltoolselectland.cpp - lltoolselectrect.cpp - lltracker.cpp - lltransientdockablefloater.cpp - lltransientfloatermgr.cpp - lluilistener.cpp - lluploaddialog.cpp - llurl.cpp - llurldispatcher.cpp - llurlhistory.cpp - llurllineeditorctrl.cpp - llurlsimstring.cpp - llurlwhitelist.cpp - llvectorperfoptions.cpp - llviewchildren.cpp - llviewerassetstorage.cpp - llvieweraudio.cpp - llviewercamera.cpp - llviewercontrol.cpp - llviewercontrollistener.cpp - llviewerdisplay.cpp - llviewerfloaterreg.cpp - llviewergenericmessage.cpp - llviewergesture.cpp - llviewerhelp.cpp - llviewerhelputil.cpp - llviewerinventory.cpp - llviewerjoint.cpp - llviewerjointattachment.cpp - llviewerjointmesh.cpp - llviewerjointmesh_sse.cpp - llviewerjointmesh_sse2.cpp - llviewerjointmesh_vec.cpp - llviewerjoystick.cpp - llviewerkeyboard.cpp - llviewerlayer.cpp - llviewermedia.cpp - llviewermedia_streamingaudio.cpp - llviewermediafocus.cpp - llviewermenu.cpp - llviewermenufile.cpp - llviewermessage.cpp - llviewernetwork.cpp - llviewerobject.cpp - llviewerobjectlist.cpp - llviewerparcelmedia.cpp - llviewerparcelmediaautoplay.cpp - llviewerparcelmgr.cpp - llviewerparceloverlay.cpp - llviewerpartsim.cpp - llviewerpartsource.cpp - llviewerregion.cpp - llviewershadermgr.cpp - llviewerstats.cpp - llviewertexteditor.cpp - llviewertexture.cpp - llviewertextureanim.cpp - llviewertexturelist.cpp - llviewerthrottle.cpp - llviewervisualparam.cpp - llviewerwindow.cpp - llviewerwindowlistener.cpp - llvlcomposition.cpp - llvlmanager.cpp - llvoavatar.cpp - llvoavatardefines.cpp - llvoavatarself.cpp - llvocache.cpp - llvoclouds.cpp - llvograss.cpp - llvoground.cpp - llvoicechannel.cpp - llvoiceclient.cpp - llvoicecontrolpanel.cpp - llvoiceremotectrl.cpp - llvoicevisualizer.cpp - llvoinventorylistener.cpp - llvopartgroup.cpp - llvosky.cpp - llvosurfacepatch.cpp - llvotextbubble.cpp - llvotree.cpp - llvovolume.cpp - llvowater.cpp - llvowlsky.cpp - llwatchdog.cpp - llwaterparammanager.cpp - llwaterparamset.cpp - llwearable.cpp - llwearabledictionary.cpp - llwearablelist.cpp - llweb.cpp - llwind.cpp - llwlanimator.cpp - llwldaycycle.cpp - llwlparammanager.cpp - llwlparamset.cpp - llworld.cpp - llworldmap.cpp - llworldmapview.cpp - llxmlrpclistener.cpp - llxmlrpctransaction.cpp - noise.cpp - pipeline.cpp - ) - -set(VIEWER_BINARY_NAME "secondlife-bin" CACHE STRING - "The name of the viewer executable to create.") - -if (LINUX) - # We can't set these flags for Darwin, because they get passed to - # the PPC compiler. Ugh. - - set_source_files_properties( - llviewerjointmesh_sse.cpp - PROPERTIES COMPILE_FLAGS "-msse -mfpmath=sse" - ) - set_source_files_properties( - llviewerjointmesh_sse2.cpp - PROPERTIES COMPILE_FLAGS "-msse2 -mfpmath=sse" - ) -endif (LINUX) - -set(viewer_HEADER_FILES - CMakeLists.txt - ViewerInstall.cmake - llaccordionctrl.h - llaccordionctrltab.h - llagent.h - llagentaccess.h - llagentdata.h - llagentlanguage.h - llagentlistener.h - llagentpicksinfo.h - llagentpilot.h - llagentui.h - llagentwearables.h - llanimstatelabels.h - llappearance.h - llappearancemgr.h - llappviewer.h - llappviewerlistener.h - llassetuploadqueue.h - llassetuploadresponders.h - llaudiosourcevo.h - llavataractions.h - llavatariconctrl.h - llavatarlist.h - llavatarlistitem.h - llavatarpropertiesprocessor.h - llbottomtray.h - llbox.h - llbreadcrumbview.h - llcallbacklist.h - llcallingcard.h - llcapabilitylistener.h - llcapabilityprovider.h - llcaphttpsender.h - llchannelmanager.h - llchatbar.h - llchathistory.h - llchatitemscontainerctrl.h - llchatmsgbox.h - llchiclet.h - llclassifiedinfo.h - llclassifiedstatsresponder.h - llcloud.h - llcolorswatch.h - llcommandhandler.h - llcommandlineparser.h - llcompilequeue.h - llconfirmationmanager.h - llcurrencyuimanager.h - llcylinder.h - lldateutil.h - lldebugmessagebox.h - lldebugview.h - lldelayedgestureerror.h - lldirpicker.h - lldndbutton.h - lldrawable.h - lldrawpool.h - lldrawpoolalpha.h - lldrawpoolavatar.h - lldrawpoolbump.h - lldrawpoolclouds.h - lldrawpoolground.h - lldrawpoolsimple.h - lldrawpoolsky.h - lldrawpoolterrain.h - lldrawpooltree.h - lldrawpoolwater.h - lldrawpoolwlsky.h - lldriverparam.h - lldynamictexture.h - llemote.h - lleventinfo.h - lleventnotifier.h - lleventpoll.h - llexpandabletextbox.h - llface.h - llfasttimerview.h - llfavoritesbar.h - llfeaturemanager.h - llfilepicker.h - llfirstuse.h - llflexibleobject.h - llfloaterabout.h - llfloateractivespeakers.h - llfloateranimpreview.h - llfloaterauction.h - llfloateravatarpicker.h - llfloateravatartextures.h - llfloaterbeacons.h - llfloaterbuildoptions.h - llfloaterbulkpermission.h - llfloaterbump.h - llfloaterbuy.h - llfloaterbuycontents.h - llfloaterbuycurrency.h - llfloaterbuyland.h - llfloatercall.h - llfloatercamera.h - llfloaterchat.h - llfloaterchatterbox.h - llfloatercolorpicker.h - llfloatercustomize.h - llfloaterdaycycle.h - llfloaterenvsettings.h - llfloaterfonttest.h - llfloaterfriends.h - llfloatergesture.h - llfloatergodtools.h - llfloatergroupinvite.h - llfloatergroups.h - llfloaterhandler.h - llfloaterhardwaresettings.h - llfloaterhelpbrowser.h - llfloaterhud.h - llfloaterimagepreview.h - llfloaterinspect.h - llfloaterinventory.h - llfloaterjoystick.h - llfloaterlagmeter.h - llfloaterland.h - llfloaterlandholdings.h - llfloatermap.h - llfloatermediabrowser.h - llfloatermediasettings.h - llfloatermemleak.h - llfloaternamedesc.h - llfloaternotificationsconsole.h - llfloateropenobject.h - llfloaterparcel.h - llfloaterpay.h - llfloaterperms.h - llfloaterpostcard.h - llfloaterpostprocess.h - llfloaterpreference.h - llfloaterproperties.h - llfloaterregioninfo.h - llfloaterreporter.h - llfloaterscriptdebug.h - llfloatersearch.h - llfloatersellland.h - llfloatersettingsdebug.h - llfloatersnapshot.h - llfloatertelehub.h - llfloatertestinspectors.h - llfloatertestlistview.h - llfloatertools.h - llfloatertopobjects.h - llfloatertos.h - llfloateruipreview.h - llfloaterurldisplay.h - llfloaterurlentry.h - llfloatervoicedevicesettings.h - llfloaterwater.h - llfloaterwhitelistentry.h - llfloaterwindlight.h - llfloaterworldmap.h - llfoldertype.h - llfolderview.h - llfoldervieweventlistener.h - llfolderviewitem.h - llfollowcam.h - llfriendcard.h - llgesturemgr.h - llgroupactions.h - llgrouplist.h - llgroupmgr.h - llgroupnotify.h - llhomelocationresponder.h - llhudeffect.h - llhudeffectbeam.h - llhudeffectlookat.h - llhudeffectpointat.h - llhudeffecttrail.h - llhudicon.h - llhudmanager.h - llhudobject.h - llhudrender.h - llhudtext.h - llhudview.h - llimcontrolpanel.h - llimfloater.h - llimpanel.h - llimview.h - llinspect.h - llinspectavatar.h - llinspectgroup.h - llinspectobject.h - llinventorybridge.h - llinventoryclipboard.h - llinventoryfilter.h - llinventorymodel.h - llinventorysubtreepanel.h - lljoystickbutton.h - lllandmarkactions.h - lllandmarklist.h - lllightconstants.h - lllistbrowser.h - lllistview.h - lllocaltextureobject.h - lllocationhistory.h - lllocationinputctrl.h - lllogchat.h - llloginhandler.h - lllogininstance.h - llmanip.h - llmaniprotate.h - llmanipscale.h - llmaniptranslate.h - llmapresponders.h - llmediactrl.h - llmediadataclient.h - llmediaremotectrl.h - llmemoryview.h - llmenucommands.h - llmetricperformancetester.h - llmimetypes.h - llmorphview.h - llmoveview.h - llmutelist.h - llnamebox.h - llnameeditor.h - llnamelistctrl.h - llnavigationbar.h - llnearbychat.h - llnearbychatbar.h - llnearbychathandler.h - llnetmap.h - llnotificationhandler.h - llnotificationmanager.h - llnotify.h - lloutputmonitorctrl.h - lloverlaybar.h - llpanelappearance.h - llpanelappearancetab.h - llpanelavatar.h - llpanelavatarrow.h - llpanelavatartag.h - llpanelblockedlist.h - llpanelclassified.h - llpanelcontents.h - llpaneleditwearable.h - llpanelevent.h - llpanelface.h - llpanelgroup.h - llpanelgroupgeneral.h - llpanelgroupinvite.h - llpanelgrouplandmoney.h - llpanelgroupnotices.h - llpanelgrouproles.h - llpanelimcontrolpanel.h - llpanelinventory.h - llpanelland.h - llpanellandaudio.h - llpanellandmarks.h - llpanellandmedia.h - llpanellogin.h - llpanellookinfo.h - llpanellooks.h - llpanelmedia.h - llpanelmediasettingsgeneral.h - llpanelmediasettingspermissions.h - llpanelmediasettingssecurity.h - llpanelmeprofile.h - llpanelobject.h - llpanelpeople.h - llpanelpeoplemenus.h - llpanelpermissions.h - llpanelpick.h - llpanelpicks.h - llpanelplace.h - llpanelplaceinfo.h - llpanelplaces.h - llpanelplacestab.h - llpanelprimmediacontrols.h - llpanelprofile.h - llpanelprofileview.h - llpanelshower.h - llpanelteleporthistory.h - llpanelvolume.h - llparcelselection.h - llparticipantlist.h - llpatchvertexarray.h - llplacesinventorybridge.h - llpolymesh.h - llpolymorph.h - llpreview.h - llpreviewanim.h - llpreviewgesture.h - llpreviewnotecard.h - llpreviewscript.h - llpreviewsound.h - llpreviewtexture.h - llproductinforequest.h - llprogressview.h - llrecentpeople.h - llregionposition.h - llremoteparcelrequest.h - llresourcedata.h - llrootview.h - llsavedsettingsglue.h - llscreenchannel.h - llscrollingpanelparam.h - llsearchcombobox.h - llsearchhistory.h - llselectmgr.h - llsidetray.h - llsidetraypanelcontainer.h - llsky.h - llslurl.h - llspatialpartition.h - llspeakers.h - llsplitbutton.h - llsprite.h - llstartup.h - llstatusbar.h - llstylemap.h - llsurface.h - llsurfacepatch.h - llsyswellitem.h - llsyswellwindow.h - lltable.h - llteleporthistory.h - llteleporthistorystorage.h - lltexglobalcolor.h - lltexlayer.h - lltexlayerparams.h - lltextureatlas.h - lltextureatlasmanager.h - lltexturecache.h - lltexturectrl.h - lltexturefetch.h - lltextureview.h - lltoast.h - lltoastalertpanel.h - lltoastgroupnotifypanel.h - lltoastimpanel.h - lltoastnotifypanel.h - lltoastpanel.h - lltool.h - lltoolbar.h - lltoolbrush.h - lltoolcomp.h - lltooldraganddrop.h - lltoolface.h - lltoolfocus.h - lltoolgrab.h - lltoolgun.h - lltoolindividual.h - lltoolmgr.h - lltoolmorph.h - lltoolobjpicker.h - lltoolpie.h - lltoolpipette.h - lltoolplacer.h - lltoolselect.h - lltoolselectland.h - lltoolselectrect.h - lltracker.h - lltransientdockablefloater.h - lltransientfloatermgr.h - lluiconstants.h - lluilistener.h - lluploaddialog.h - llurl.h - llurldispatcher.h - llurlhistory.h - llurllineeditorctrl.h - llurlsimstring.h - llurlwhitelist.h - llvectorperfoptions.h - llviewchildren.h - llviewerassetstorage.h - llvieweraudio.h - llviewerbuild.h - llviewercamera.h - llviewercontrol.h - llviewercontrollistener.h - llviewerdisplay.h - llviewerfloaterreg.h - llviewergenericmessage.h - llviewergesture.h - llviewerhelp.h - llviewerinventory.h - llviewerjoint.h - llviewerjointattachment.h - llviewerjointmesh.h - llviewerjoystick.h - llviewerkeyboard.h - llviewerlayer.h - llviewermedia.h - llviewermediafocus.h - llviewermediaobserver.h - llviewermenu.h - llviewermenufile.h - llviewermessage.h - llviewernetwork.h - llviewerobject.h - llviewerobjectlist.h - llviewerparcelmedia.h - llviewerparcelmediaautoplay.h - llviewerparcelmgr.h - llviewerparceloverlay.h - llviewerpartsim.h - llviewerpartsource.h - llviewerprecompiledheaders.h - llviewerregion.h - llviewershadermgr.h - llviewerstats.h - llviewertexteditor.h - llviewertexture.h - llviewertextureanim.h - llviewertexturelist.h - llviewerthrottle.h - llviewervisualparam.h - llviewerwindow.h - llviewerwindowlistener.h - llvlcomposition.h - llvlmanager.h - llvoavatar.h - llvoavatardefines.h - llvoavatarself.h - llvocache.h - llvoclouds.h - llvograss.h - llvoground.h - llvoicechannel.h - llvoiceclient.h - llvoicecontrolpanel.h - llvoiceremotectrl.h - llvoicevisualizer.h - llvoinventorylistener.h - llvopartgroup.h - llvosky.h - llvosurfacepatch.h - llvotextbubble.h - llvotree.h - llvotreenew.h - llvovolume.h - llvowater.h - llvowlsky.h - llwatchdog.h - llwaterparammanager.h - llwaterparamset.h - llwearable.h - llwearabledictionary.h - llwearablelist.h - llweb.h - llwind.h - llwindebug.h - llwlanimator.h - llwldaycycle.h - llwlparammanager.h - llwlparamset.h - llworld.h - llworldmap.h - llworldmapview.h - llxmlrpclistener.h - llxmlrpctransaction.h - macmain.h - noise.h - pipeline.h - randgauss.h - VertexCache.h - VorbisFramework.h - ) - -source_group("CMake Rules" FILES ViewerInstall.cmake) - -if (DARWIN) - LIST(APPEND viewer_SOURCE_FILES llappviewermacosx.cpp) - - find_library(AGL_LIBRARY AGL) - find_library(APPKIT_LIBRARY AppKit) - find_library(COCOA_LIBRARY Cocoa) - find_library(IOKIT_LIBRARY IOKit) - - set(viewer_LIBRARIES - ${COCOA_LIBRARY} - ${AGL_LIBRARY} - ${IOKIT_LIBRARY} - ) - - # Add resource files to the project. - set(viewer_RESOURCE_FILES - secondlife.icns - macview.r - gpu_table.txt - Info-SecondLife.plist - SecondLife.nib/ - # CMake doesn't seem to support Xcode language variants well just yet - English.lproj/InfoPlist.strings - English.lproj/language.txt - German.lproj/language.txt - Japanese.lproj/language.txt - Korean.lproj/language.txt - ) - set_source_files_properties( - ${viewer_RESOURCE_FILES} - PROPERTIES - HEADER_FILE_ONLY TRUE - #MACOSX_PACKAGE_LOCATION Resources #don't do this! this tells cmake to copy the files. - ) - SOURCE_GROUP("Resources" FILES ${viewer_RESOURCE_FILES}) - list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) -endif (DARWIN) - -if (LINUX) - LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp) - LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp) - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") - - set(viewer_LIBRARIES - Xinerama - ) -endif (LINUX) - -if (WINDOWS) - list(APPEND viewer_SOURCE_FILES - llappviewerwin32.cpp - llwindebug.cpp - ) - - list(APPEND viewer_HEADER_FILES - llappviewerwin32.h - llwindebug.h - ) - - # precompiled header configuration - # llviewerprecompiledheaders.cpp generates - # the .pch file. - # All sources added to viewer_SOURCE_FILES - # at this point use it. - set_source_files_properties(llviewerprecompiledheaders.cpp - PROPERTIES - COMPILE_FLAGS "/Ycllviewerprecompiledheaders.h" - ) - foreach( src_file ${viewer_SOURCE_FILES} ) - set_source_files_properties( - ${src_file} - PROPERTIES - COMPILE_FLAGS "/Yullviewerprecompiledheaders.h" - ) - endforeach( src_file ${viewer_SOURCE_FILES} ) - list(APPEND viewer_SOURCE_FILES llviewerprecompiledheaders.cpp) - # llstartup.cpp needs special symbols for audio libraries, so it resets - # COMPILE_FLAGS below. Make sure it maintains precompiled header settings. - set(LLSTARTUP_COMPILE_FLAGS - "${LLSTARTUP_COMPILE_FLAGS} /Yullviewerprecompiledheaders.h") - - # Add resource files to the project. - # viewerRes.rc is the only buildable file, but - # the rest are all dependencies of it. - set(viewer_RESOURCE_FILES - res/arrow.cur - res/arrowcop.cur - res/arrowcopmulti.cur - res/arrowdrag.cur - res/circleandline.cur - res/icon1.ico - res/llarrow.cur - res/llarrowdrag.cur - res/llarrowdragmulti.cur - res/llarrowlocked.cur - res/llgrablocked.cur - res/llno.cur - res/llnolocked.cur - res/lltoolcamera.cur - res/lltoolcreate.cur - res/lltoolfocus.cur - res/lltoolgrab.cur - res/lltoolland.cur - res/lltoolpan.cur - res/lltoolpipette.cur - res/lltoolrotate.cur - res/lltoolscale.cur - res/lltooltranslate.cur - res/lltoolzoomin.cur - res/lltoolzoomout.cur - res/ll_icon.BMP - res/ll_icon.ico - res/resource.h - res/toolpickobject.cur - res/toolpickobject2.cur - res/toolpickobject3.cur - res/toolpipette.cur - ) - - set_source_files_properties(${viewer_RESOURCE_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - - set(viewer_RESOURCE_FILES - res/viewerRes.rc - ${viewer_RESOURCE_FILES} - ) - - SOURCE_GROUP("Resource Files" FILES ${viewer_RESOURCE_FILES}) - - if (NOT STANDALONE) - list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) - endif (NOT STANDALONE) - - find_library(DINPUT_LIBRARY dinput8 ${DIRECTX_LIBRARY_DIR}) - find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR}) - mark_as_advanced( - DINPUT_LIBRARY - DXGUID_LIBRARY - ) - - set(viewer_LIBRARIES - ${WINDOWS_LIBRARIES} - comdlg32 - ${DINPUT_LIBRARY} - ${DXGUID_LIBRARY} - kernel32 - odbc32 - odbccp32 - ole32 - oleaut32 - opengl32 - shell32 - Vfw32 - winspool - ) - - find_library(INTEL_MEMOPS_LIBRARY - NAMES ll_intel_memops - PATHS - optimized ${ARCH_PREBUILT_DIRS_RELEASE} - debug ${ARCH_PREBUILT_DIRS_DEBUG} - ) - mark_as_advanced(INTEL_MEMOPS_LIBRARY) - - if (INTEL_MEMOPS_LIBRARY) - list(APPEND viewer_LIBRARIES ${INTEL_MEMOPS_LIBRARY}) - endif (INTEL_MEMOPS_LIBRARY) - - use_prebuilt_binary(dbghelp) -endif (WINDOWS) - -# Add the xui files. This is handy for searching for xui elements -# from within the IDE. -set(viewer_XUI_FILES - skins/default/colors.xml - skins/default/textures/textures.xml - - - - ) -file(GLOB DEFAULT_XUI_FILE_GLOB_LIST - ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en/*.xml) -list(APPEND viewer_XUI_FILES ${DEFAULT_XUI_FILE_GLOB_LIST}) - -file(GLOB DEFAULT_WIDGET_FILE_GLOB_LIST - ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en/widgets/*.xml) -list(APPEND viewer_XUI_FILES ${DEFAULT_WIDGET_FILE_GLOB_LIST}) - -file(GLOB SILVER_XUI_FILE_GLOB_LIST - ${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/*.xml) -list(APPEND viewer_XUI_FILES ${SILVER_XUI_FILE_GLOB_LIST}) - -# Cannot append empty lists in CMake, wait until we have files here. -#file(GLOB SILVER_WIDGET_FILE_GLOB_LIST -# ${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/widgets/*.xml) -#list(APPEND viewer_XUI_FILES ${SILVER_WIDGET_FILE_GLOB_LIST}) - -list(SORT viewer_XUI_FILES) - -source_group("XUI Files" FILES ${viewer_XUI_FILES}) - -set_source_files_properties(${viewer_XUI_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES}) - -set(viewer_APPSETTINGS_FILES - app_settings/anim.ini - app_settings/cmd_line.xml - app_settings/grass.xml - app_settings/high_graphics.xml - app_settings/keys.ini - app_settings/keywords.ini - app_settings/logcontrol.xml - app_settings/low_graphics.xml - app_settings/mid_graphics.xml - app_settings/settings.xml - app_settings/settings_crash_behavior.xml - app_settings/settings_files.xml - app_settings/settings_per_account.xml - app_settings/std_bump.ini - app_settings/trees.xml - app_settings/ultra_graphics.xml - app_settings/viewerart.xml - ${CMAKE_SOURCE_DIR}/../etc/message.xml - ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg - ) - -use_prebuilt_binary(artwork-common) - -source_group("App Settings" FILES ${viewer_APPSETTINGS_FILES}) - -set_source_files_properties(${viewer_APPSETTINGS_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -list(APPEND viewer_SOURCE_FILES ${viewer_APPSETTINGS_FILES}) - -set(viewer_CHARACTER_FILES - character/attentions.xml - character/attentionsN.xml - character/avatar_lad.xml - character/avatar_skeleton.xml - character/genepool.xml - ) - -source_group("Character File" FILES ${viewer_CHARACTER_FILES}) - -set_source_files_properties(${viewer_CHARACTER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) -if (NOT STANDALONE) - list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES}) -endif (NOT STANDALONE) - -if (WINDOWS) - file(GLOB viewer_INSTALLER_FILES installers/windows/*.nsi) - - source_group("Installer Files" FILES ${viewer_INSTALLER_FILES}) - - set_source_files_properties(${viewer_INSTALLER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - - list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES}) -endif (WINDOWS) - -if (OPENAL) - set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_OPENAL") -endif (OPENAL) - -if (FMOD) - set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMOD") - - if (DARWIN) - set(fmodwrapper_SOURCE_FILES fmodwrapper.cpp) - add_library(fmodwrapper SHARED ${fmodwrapper_SOURCE_FILES}) - set(fmodwrapper_needed_LIBRARIES ${FMOD_LIBRARY} ${CARBON_LIBRARY}) - set_target_properties( - fmodwrapper - PROPERTIES - BUILD_WITH_INSTALL_RPATH 1 - INSTALL_NAME_DIR "@executable_path/../Resources" - LINK_FLAGS "-unexported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/fmod_hidden_symbols.exp" - ) - set(FMODWRAPPER_LIBRARY fmodwrapper) - target_link_libraries(fmodwrapper ${fmodwrapper_needed_LIBRARIES}) - else (DARWIN) - # fmodwrapper unnecessary on linux or windows - set(FMODWRAPPER_LIBRARY ${FMOD_LIBRARY}) - endif (DARWIN) -endif (FMOD) - -set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") - -list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES}) - -set_source_files_properties(${viewer_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -add_executable(${VIEWER_BINARY_NAME} - WIN32 - MACOSX_BUNDLE - ${viewer_SOURCE_FILES} - ) -check_message_template(${VIEWER_BINARY_NAME}) - -if (LLKDU_LIBRARY) - add_dependencies(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARY}) -endif (LLKDU_LIBRARY) - -# add package files -file(GLOB EVENT_HOST_SCRIPT_GLOB_LIST - ${CMAKE_CURRENT_SOURCE_DIR}/../viewer_components/*.py) -list(APPEND EVENT_HOST_SCRIPTS ${EVENT_HOST_SCRIPT_GLOB_LIST}) - -set(PACKAGE OFF CACHE BOOL - "Add a package target that builds an installer package.") - -if (WINDOWS) - if(MSVC71) - set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map /MAPINFO:LINES") - else(MSVC71) - set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map") - endif(MSVC71) - - set_target_properties(${VIEWER_BINARY_NAME} - PROPERTIES - # *TODO -reenable this once we get server usage sorted out - #LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:\"__tcmalloc\"" - LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS" - LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO" - LINK_FLAGS_RELEASE ${release_flags} - ) - - # sets the 'working directory' for debugging from visual studio. - if (NOT UNATTENDED) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe - ARGS - --solution - ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln - --workingdir - ${VIEWER_BINARY_NAME} - ${CMAKE_CURRENT_SOURCE_DIR} - COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging." - ) - endif (NOT UNATTENDED) - - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/messages/message_template.msg - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message_template.msg - COMMENT "Copying message_template.msg to the runtime folder." - ) - - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml - COMMENT "Copying message.xml to the runtime folder." - ) - - if(WINDOWS) - # Copy Win Libs... - # This happens at build time, not config time. We can't glob files in this cmake. - # *FIX:Mani Write a sub script to glob the files... - # *FIX:Mani Use actually dependencies rather than bulk copy. - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_directory - ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} - COMMENT "Copying staged dlls." - ) - - add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon) - if(LLKDU_LIBRARY) - # kdu may not exist! - add_dependencies(${VIEWER_BINARY_NAME} llkdu) - endif(LLKDU_LIBRARY) - endif(WINDOWS) - - if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) - add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts) - endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) - - add_custom_command( - OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --configuration=${CMAKE_CFG_INTDIR} - --channel=${VIEWER_CHANNEL} - --login_channel=${VIEWER_LOGIN_CHANNEL} - --grid=${GRID} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --artwork=${ARTWORK_DIR} - --build=${CMAKE_CURRENT_BINARY_DIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} - --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat - DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ) - - add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit) - - if (PACKAGE) - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2 - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py - ${CMAKE_CURRENT_SOURCE_DIR}/.. - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CFG_INTDIR} - - DEPENDS - lleventhost - ${EVENT_HOST_SCRIPTS} - ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py) - - add_custom_target(package ALL - DEPENDS - ${CMAKE_CFG_INTDIR}/touched.bat) - # temporarily disable packaging of event_host until hg subrepos get - # sorted out on the parabuild cluster... - #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2) - add_dependencies(package windows-updater windows-crash-logger) - - - endif (PACKAGE) -endif (WINDOWS) - -target_link_libraries(${VIEWER_BINARY_NAME} - ${LLAUDIO_LIBRARIES} - ${LLCHARACTER_LIBRARIES} - ${LLIMAGE_LIBRARIES} - ${LLIMAGEJ2COJ_LIBRARIES} - ${LLINVENTORY_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLPLUGIN_LIBRARIES} - ${LLPRIMITIVE_LIBRARIES} - ${LLRENDER_LIBRARIES} - ${FREETYPE_LIBRARIES} - ${LLUI_LIBRARIES} - ${LLVFS_LIBRARIES} - ${LLWINDOW_LIBRARIES} - ${LLXML_LIBRARIES} - ${LLXUIXML_LIBRARIES} - ${LSCRIPT_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${NDOF_LIBRARY} - ${viewer_LIBRARIES} - ${BOOST_PROGRAM_OPTIONS_LIBRARY} - ${BOOST_REGEX_LIBRARY} - ${DBUSGLIB_LIBRARIES} - ${OPENGL_LIBRARIES} - ${FMODWRAPPER_LIBRARY} - ${OPENGL_LIBRARIES} - ${SDL_LIBRARY} - ${SMARTHEAP_LIBRARY} - ${UI_LIBRARIES} - ${WINDOWS_LIBRARIES} - ${XMLRPCEPI_LIBRARIES} - ${ELFIO_LIBRARIES} - ${LLLOGIN_LIBRARIES} - ${GOOGLE_PERFTOOLS_LIBRARIES} - ) - -build_version(viewer) - -set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH - "Path to artwork files.") - - -if (LINUX) - add_custom_command( - OUTPUT secondlife-stripped - COMMAND strip - ARGS --strip-debug -o secondlife-stripped ${VIEWER_BINARY_NAME} - DEPENDS ${VIEWER_BINARY_NAME} - ) - - set(product SecondLife-${ARCH}-${viewer_VERSION}) - - add_custom_command( - OUTPUT ${product}.tar.bz2 - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --grid=${GRID} - --channel=${VIEWER_CHANNEL} - --login_channel=${VIEWER_LOGIN_CHANNEL} - --installer_name=${product} - --arch=${ARCH} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --artwork=${ARTWORK_DIR} - --build=${CMAKE_CURRENT_BINARY_DIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged - --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched - DEPENDS secondlife-stripped ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ) - - add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_gstreamer010 media_plugin_webkit) - - if (NOT INSTALL) - add_custom_target(package ALL DEPENDS ${product}.tar.bz2) - add_dependencies(package linux-crash-logger-strip-target) - add_dependencies(package linux-updater-strip-target) - endif (NOT INSTALL) -endif (LINUX) - -if (DARWIN) - set(product "Second Life") - set_target_properties( - ${VIEWER_BINARY_NAME} - PROPERTIES - OUTPUT_NAME "${product}" - MACOSX_BUNDLE_INFO_STRING "info string - localize me" - MACOSX_BUNDLE_ICON_FILE "secondlife.icns" - MACOSX_BUNDLE_GUI_IDENTIFIER "Second Life" - MACOSX_BUNDLE_LONG_VERSION_STRING "ververver" - MACOSX_BUNDLE_BUNDLE_NAME "Second Life" - MACOSX_BUNDLE_SHORT_VERSION_STRING "asdf" - MACOSX_BUNDLE_BUNDLE_VERSION "asdf" - MACOSX_BUNDLE_COPYRIGHT "copyright linden lab 2007 - localize me and run me through a legal wringer" - ) - - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --grid=${GRID} - --actions=copy - --configuration=${CMAKE_CFG_INTDIR} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --artwork=${ARTWORK_DIR} - --build=${CMAKE_CURRENT_BINARY_DIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app - DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ) - - add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit) - - if (PACKAGE) - add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME}) - add_dependencies(package mac-updater mac-crash-logger) - - add_custom_command( - TARGET package POST_BUILD - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --grid=${GRID} - --configuration=${CMAKE_CFG_INTDIR} - --channel=${VIEWER_CHANNEL} - --login_channel=${VIEWER_LOGIN_CHANNEL} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --artwork=${ARTWORK_DIR} - --build=${CMAKE_CURRENT_BINARY_DIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app - --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched - DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ) - - - add_custom_command( - TARGET package POST_BUILD - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --grid=${GRID} - --configuration=${CMAKE_CFG_INTDIR} - --channel=${VIEWER_CHANNEL} - --login_channel=${VIEWER_LOGIN_CHANNEL} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --artwork=${ARTWORK_DIR} - --build=${CMAKE_CURRENT_BINARY_DIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app - --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched - DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - ) - - endif (PACKAGE) -endif (DARWIN) - -if (INSTALL) - include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake) -endif (INSTALL) - -# To add a viewer unit test, just add the test .cpp file below -# This creates a separate test project per file listed. -include(LLAddBuildTest) -SET(viewer_TEST_SOURCE_FILES - llagentaccess.cpp - lldateutil.cpp - llmediadataclient.cpp - llviewerhelputil.cpp - lllogininstance.cpp - ) -set_source_files_properties( - ${viewer_TEST_SOURCE_FILES} - PROPERTIES - LL_TEST_ADDITIONAL_SOURCE_FILES llviewerprecompiledheaders.cpp - ) -LL_ADD_PROJECT_UNIT_TESTS(${VIEWER_BINARY_NAME} "${viewer_TEST_SOURCE_FILES}") - -#set(TEST_DEBUG on) -set(test_sources llcapabilitylistener.cpp llviewerprecompiledheaders.cpp) -set(test_libs - ${LLMESSAGE_LIBRARIES} - ${WINDOWS_LIBRARIES} - ${LLVFS_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${GOOGLEMOCK_LIBRARIES} - ) - -LL_ADD_INTEGRATION_TEST(llcapabilitylistener - "${test_sources}" - "${test_libs}" - ${PYTHON_EXECUTABLE} - "${CMAKE_SOURCE_DIR}/llmessage/tests/test_llsdmessage_peer.py" - ) - -#ADD_VIEWER_BUILD_TEST(llmemoryview viewer) - - -# Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py -if (WINDOWS) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - make_directory - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin - COMMENT "Creating llplugin dir." - ) - - get_target_property(BUILT_SLPLUGIN SLPlugin LOCATION) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_SLPLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} - COMMENT "Copying SLPlugin executable to the runtime folder." - ) - - get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_WEBKIT_PLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin - COMMENT "Copying WebKit Plugin to the runtime folder." - ) - - get_target_property(BUILT_QUICKTIME_PLUGIN media_plugin_quicktime LOCATION) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_QUICKTIME_PLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin - COMMENT "Copying Quicktime Plugin to the runtime folder." - ) - - #******************************* - # Copy media plugin support dlls - # Debug config runtime files required for the plugins - set(plugins_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug") - set(plugins_debug_files - libeay32.dll - qtcored4.dll - qtguid4.dll - qtnetworkd4.dll - qtopengld4.dll - qtwebkitd4.dll - ssleay32.dll - ) - copy_if_different( - ${plugins_debug_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/Debug/llplugin" - out_targets - ${plugins_debug_files} - ) - set(media_plugin_targets ${media_plugin_targets} ${out_targets}) - - # Release & ReleaseDebInfo config runtime files required for the plugins - set(plugins_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release") - set(plugins_release_files - libeay32.dll - qtcore4.dll - qtgui4.dll - qtnetwork4.dll - qtopengl4.dll - qtwebkit4.dll - ssleay32.dll - ) - copy_if_different( - ${plugins_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin" - out_targets - ${plugins_release_files} - ) - set(media_plugin_targets ${media_plugin_targets} ${out_targets}) - - copy_if_different( - ${plugins_release_src_dir} - "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin" - out_targets - ${plugins_release_files} - ) - set(media_plugin_targets ${media_plugin_targets} ${out_targets}) - - add_custom_target(copy_media_plugin_libs ALL - DEPENDS - ${media_plugin_targets} - ) - - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_directory - ${CMAKE_BINARY_DIR}/test_apps/llplugintest/${CMAKE_CFG_INTDIR}/imageformats - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin/imageformats - COMMENT "Copying llpluging imageformat libs." - ) - - add_dependencies(${VIEWER_BINARY_NAME} llmediaplugintest copy_media_plugin_libs) - -endif (WINDOWS) - +# -*- cmake -*- + +project(viewer) + +include(00-Common) +include(Boost) +include(BuildVersion) +include(DBusGlib) +include(DirectX) +include(ELFIO) +include(FMOD) +include(OPENAL) +include(FindOpenGL) +include(LLAudio) +include(LLCharacter) +include(LLCommon) +include(LLImage) +include(LLImageJ2COJ) +include(LLInventory) +include(LLMath) +include(LLMessage) +include(LLPlugin) +include(LLPrimitive) +include(LLRender) +include(LLUI) +include(LLVFS) +include(LLWindow) +include(LLXML) +include(LLXUIXML) +include(LScript) +include(Linking) +include(NDOF) +include(GooglePerfTools) +include(TemplateCheck) +include(UI) +include(UnixInstall) +include(LLKDU) +include(ViewerMiscLibs) +include(LLLogin) +include(CMakeCopyIfDifferent) + +include_directories( + ${DBUSGLIB_INCLUDE_DIRS} + ${ELFIO_INCLUDE_DIR} + ${LLAUDIO_INCLUDE_DIRS} + ${LLCHARACTER_INCLUDE_DIRS} + ${LLCOMMON_INCLUDE_DIRS} + ${LLIMAGE_INCLUDE_DIRS} + ${LLINVENTORY_INCLUDE_DIRS} + ${LLMATH_INCLUDE_DIRS} + ${LLMESSAGE_INCLUDE_DIRS} + ${LLPLUGIN_INCLUDE_DIRS} + ${LLPRIMITIVE_INCLUDE_DIRS} + ${LLRENDER_INCLUDE_DIRS} + ${LLUI_INCLUDE_DIRS} + ${LLVFS_INCLUDE_DIRS} + ${LLWINDOW_INCLUDE_DIRS} + ${LLXML_INCLUDE_DIRS} + ${LLXUIXML_INCLUDE_DIRS} + ${LSCRIPT_INCLUDE_DIRS} + ${LSCRIPT_INCLUDE_DIRS}/lscript_compile + ${LLLOGIN_INCLUDE_DIRS} + ) + +set(viewer_SOURCE_FILES + llaccordionctrl.cpp + llaccordionctrltab.cpp + llagent.cpp + llagentaccess.cpp + llagentdata.cpp + llagentlanguage.cpp + llagentlistener.cpp + llagentpicksinfo.cpp + llagentpilot.cpp + llagentui.cpp + llagentwearables.cpp + llanimstatelabels.cpp + llappearancemgr.cpp + llappviewer.cpp + llappviewerlistener.cpp + llassetuploadqueue.cpp + llassetuploadresponders.cpp + llaudiosourcevo.cpp + llavataractions.cpp + llavatariconctrl.cpp + llavatarlist.cpp + llavatarlistitem.cpp + llavatarpropertiesprocessor.cpp + llbottomtray.cpp + llbox.cpp + llbreadcrumbview.cpp + llcallbacklist.cpp + llcallingcard.cpp + llcapabilitylistener.cpp + llcaphttpsender.cpp + llchannelmanager.cpp + llchatbar.cpp + llchathistory.cpp + llchatitemscontainerctrl.cpp + llchatmsgbox.cpp + llchiclet.cpp + llclassifiedinfo.cpp + llclassifiedstatsresponder.cpp + llcloud.cpp + llcolorswatch.cpp + llcommandhandler.cpp + llcommandlineparser.cpp + llcompilequeue.cpp + llconfirmationmanager.cpp + llcurrencyuimanager.cpp + llcylinder.cpp + lldateutil.cpp + lldebugmessagebox.cpp + lldebugview.cpp + lldelayedgestureerror.cpp + lldirpicker.cpp + lldndbutton.cpp + lldrawable.cpp + lldrawpool.cpp + lldrawpoolalpha.cpp + lldrawpoolavatar.cpp + lldrawpoolbump.cpp + lldrawpoolground.cpp + lldrawpoolsimple.cpp + lldrawpoolsky.cpp + lldrawpoolterrain.cpp + lldrawpooltree.cpp + lldrawpoolwater.cpp + lldrawpoolwlsky.cpp + lldriverparam.cpp + lldynamictexture.cpp + llemote.cpp + lleventinfo.cpp + lleventnotifier.cpp + lleventpoll.cpp + llexpandabletextbox.cpp + llface.cpp + llfasttimerview.cpp + llfavoritesbar.cpp + llfeaturemanager.cpp + llfilepicker.cpp + llfirstuse.cpp + llflexibleobject.cpp + llfloaterabout.cpp + llfloateractivespeakers.cpp + llfloateranimpreview.cpp + llfloaterauction.cpp + llfloateravatarpicker.cpp + llfloateravatartextures.cpp + llfloaterbeacons.cpp + llfloaterbuildoptions.cpp + llfloaterbulkpermission.cpp + llfloaterbump.cpp + llfloaterbuy.cpp + llfloaterbuycontents.cpp + llfloaterbuycurrency.cpp + llfloaterbuyland.cpp + llfloatercall.cpp + llfloatercamera.cpp + llfloaterchat.cpp + llfloaterchatterbox.cpp + llfloatercolorpicker.cpp + llfloatercustomize.cpp + llfloaterdaycycle.cpp + llfloaterenvsettings.cpp + llfloaterfonttest.cpp + llfloaterfriends.cpp + llfloatergesture.cpp + llfloatergodtools.cpp + llfloatergroupinvite.cpp + llfloatergroups.cpp + llfloaterhandler.cpp + llfloaterhardwaresettings.cpp + llfloaterhelpbrowser.cpp + llfloaterhud.cpp + llfloaterimagepreview.cpp + llfloaterinspect.cpp + llfloaterinventory.cpp + llfloaterjoystick.cpp + llfloaterlagmeter.cpp + llfloaterland.cpp + llfloaterlandholdings.cpp + llfloatermap.cpp + llfloatermediabrowser.cpp + llfloatermediasettings.cpp + llfloatermemleak.cpp + llfloaternamedesc.cpp + llfloaternotificationsconsole.cpp + llfloateropenobject.cpp + llfloaterparcel.cpp + llfloaterpay.cpp + llfloaterperms.cpp + llfloaterpostcard.cpp + llfloaterpostprocess.cpp + llfloaterpreference.cpp + llfloaterproperties.cpp + llfloaterregioninfo.cpp + llfloaterreporter.cpp + llfloaterscriptdebug.cpp + llfloatersearch.cpp + llfloatersellland.cpp + llfloatersettingsdebug.cpp + llfloatersnapshot.cpp + llfloatertelehub.cpp + llfloatertestinspectors.cpp + llfloatertestlistview.cpp + llfloatertools.cpp + llfloatertopobjects.cpp + llfloatertos.cpp + llfloateruipreview.cpp + llfloaterurldisplay.cpp + llfloaterurlentry.cpp + llfloatervoicedevicesettings.cpp + llfloaterwater.cpp + llfloaterwhitelistentry.cpp + llfloaterwindlight.cpp + llfloaterworldmap.cpp + llfoldertype.cpp + llfolderview.cpp + llfolderviewitem.cpp + llfollowcam.cpp + llfriendcard.cpp + llgesturemgr.cpp + llglsandbox.cpp + llgroupactions.cpp + llgrouplist.cpp + llgroupmgr.cpp + llgroupnotify.cpp + llhomelocationresponder.cpp + llhudeffect.cpp + llhudeffectbeam.cpp + llhudeffectlookat.cpp + llhudeffectpointat.cpp + llhudeffecttrail.cpp + llhudicon.cpp + llhudmanager.cpp + llhudobject.cpp + llhudrender.cpp + llhudtext.cpp + llhudview.cpp + llimcontrolpanel.cpp + llimfloater.cpp + llimhandler.cpp + llimpanel.cpp + llimview.cpp + llinspect.cpp + llinspectavatar.cpp + llinspectgroup.cpp + llinspectobject.cpp + llinventorybridge.cpp + llinventoryclipboard.cpp + llinventoryfilter.cpp + llinventoryfunctions.cpp + llinventorymodel.cpp + llinventorypanel.cpp + llinventorysubtreepanel.cpp + lljoystickbutton.cpp + lllandmarkactions.cpp + lllandmarklist.cpp + lllistbrowser.cpp + lllistview.cpp + lllocaltextureobject.cpp + lllocationhistory.cpp + lllocationinputctrl.cpp + lllogchat.cpp + llloginhandler.cpp + lllogininstance.cpp + llmanip.cpp + llmaniprotate.cpp + llmanipscale.cpp + llmaniptranslate.cpp + llmapresponders.cpp + llmediactrl.cpp + llmediadataclient.cpp + llmediaremotectrl.cpp + llmemoryview.cpp + llmenucommands.cpp + llmetricperformancetester.cpp + llmimetypes.cpp + llmorphview.cpp + llmoveview.cpp + llmutelist.cpp + llnamebox.cpp + llnameeditor.cpp + llnamelistctrl.cpp + llnavigationbar.cpp + llnearbychat.cpp + llnearbychatbar.cpp + llnearbychathandler.cpp + llnetmap.cpp + llnotificationalerthandler.cpp + llnotificationgrouphandler.cpp + llnotificationmanager.cpp + llnotificationscripthandler.cpp + llnotificationtiphandler.cpp + llnotify.cpp + lloutputmonitorctrl.cpp + lloverlaybar.cpp + llpanelappearance.cpp + llpanelappearancetab.cpp + llpanelavatar.cpp + llpanelavatarrow.cpp + llpanelavatartag.cpp + llpanelblockedlist.cpp + llpanelclassified.cpp + llpanelcontents.cpp + llpaneleditwearable.cpp + llpanelevent.cpp + llpanelface.cpp + llpanelgroup.cpp + llpanelgroupgeneral.cpp + llpanelgroupinvite.cpp + llpanelgrouplandmoney.cpp + llpanelgroupnotices.cpp + llpanelgrouproles.cpp + llpanelimcontrolpanel.cpp + llpanelland.cpp + llpanellandaudio.cpp + llpanellandmarks.cpp + llpanellandmedia.cpp + llpanellogin.cpp + llpanellookinfo.cpp + llpanellooks.cpp + llpanelmaininventory.cpp + llpanelmedia.cpp + llpanelmediasettingsgeneral.cpp + llpanelmediasettingspermissions.cpp + llpanelmediasettingssecurity.cpp + llpanelmeprofile.cpp + llpanelobject.cpp + llpanelobjectinventory.cpp + llpanelpeople.cpp + llpanelpeoplemenus.cpp + llpanelpermissions.cpp + llpanelpick.cpp + llpanelpicks.cpp + llpanelplace.cpp + llpanelplaceinfo.cpp + llpanelplaces.cpp + llpanelplacestab.cpp + llpanelprimmediacontrols.cpp + llpanelprofile.cpp + llpanelprofileview.cpp + llpanelshower.cpp + llpanelteleporthistory.cpp + llpanelvolume.cpp + llparcelselection.cpp + llparticipantlist.cpp + llpatchvertexarray.cpp + llplacesinventorybridge.cpp + llpolymesh.cpp + llpolymorph.cpp + llpreview.cpp + llpreviewanim.cpp + llpreviewgesture.cpp + llpreviewnotecard.cpp + llpreviewscript.cpp + llpreviewsound.cpp + llpreviewtexture.cpp + llproductinforequest.cpp + llprogressview.cpp + llrecentpeople.cpp + llregionposition.cpp + llremoteparcelrequest.cpp + llsavedsettingsglue.cpp + llscreenchannel.cpp + llscrollingpanelparam.cpp + llsearchcombobox.cpp + llsearchhistory.cpp + llselectmgr.cpp + llsidepanelinventory.cpp + llsidepanelobjectinfo.cpp + llsidetray.cpp + llsidetraypanelcontainer.cpp + llsky.cpp + llslurl.cpp + llspatialpartition.cpp + llspeakers.cpp + llsplitbutton.cpp + llsprite.cpp + llstartup.cpp + llstatusbar.cpp + llstylemap.cpp + llsurface.cpp + llsurfacepatch.cpp + llsyswellitem.cpp + llsyswellwindow.cpp + llteleporthistory.cpp + llteleporthistorystorage.cpp + lltexglobalcolor.cpp + lltexlayer.cpp + lltexlayerparams.cpp + lltextureatlas.cpp + lltextureatlasmanager.cpp + lltexturecache.cpp + lltexturectrl.cpp + lltexturefetch.cpp + lltextureview.cpp + lltoast.cpp + lltoastalertpanel.cpp + lltoastgroupnotifypanel.cpp + lltoastimpanel.cpp + lltoastnotifypanel.cpp + lltoastpanel.cpp + lltool.cpp + lltoolbar.cpp + lltoolbrush.cpp + lltoolcomp.cpp + lltooldraganddrop.cpp + lltoolface.cpp + lltoolfocus.cpp + lltoolgrab.cpp + lltoolgun.cpp + lltoolindividual.cpp + lltoolmgr.cpp + lltoolmorph.cpp + lltoolobjpicker.cpp + lltoolpie.cpp + lltoolpipette.cpp + lltoolplacer.cpp + lltoolselect.cpp + lltoolselectland.cpp + lltoolselectrect.cpp + lltracker.cpp + lltransientdockablefloater.cpp + lltransientfloatermgr.cpp + lluilistener.cpp + lluploaddialog.cpp + llurl.cpp + llurldispatcher.cpp + llurlhistory.cpp + llurllineeditorctrl.cpp + llurlsimstring.cpp + llurlwhitelist.cpp + llvectorperfoptions.cpp + llviewchildren.cpp + llviewerassetstorage.cpp + llvieweraudio.cpp + llviewercamera.cpp + llviewercontrol.cpp + llviewercontrollistener.cpp + llviewerdisplay.cpp + llviewerfloaterreg.cpp + llviewergenericmessage.cpp + llviewergesture.cpp + llviewerhelp.cpp + llviewerhelputil.cpp + llviewerinventory.cpp + llviewerjoint.cpp + llviewerjointattachment.cpp + llviewerjointmesh.cpp + llviewerjointmesh_sse.cpp + llviewerjointmesh_sse2.cpp + llviewerjointmesh_vec.cpp + llviewerjoystick.cpp + llviewerkeyboard.cpp + llviewerlayer.cpp + llviewermedia.cpp + llviewermedia_streamingaudio.cpp + llviewermediafocus.cpp + llviewermenu.cpp + llviewermenufile.cpp + llviewermessage.cpp + llviewernetwork.cpp + llviewerobject.cpp + llviewerobjectlist.cpp + llviewerparcelmedia.cpp + llviewerparcelmediaautoplay.cpp + llviewerparcelmgr.cpp + llviewerparceloverlay.cpp + llviewerpartsim.cpp + llviewerpartsource.cpp + llviewerregion.cpp + llviewershadermgr.cpp + llviewerstats.cpp + llviewertexteditor.cpp + llviewertexture.cpp + llviewertextureanim.cpp + llviewertexturelist.cpp + llviewerthrottle.cpp + llviewervisualparam.cpp + llviewerwindow.cpp + llviewerwindowlistener.cpp + llvlcomposition.cpp + llvlmanager.cpp + llvoavatar.cpp + llvoavatardefines.cpp + llvoavatarself.cpp + llvocache.cpp + llvoclouds.cpp + llvograss.cpp + llvoground.cpp + llvoicechannel.cpp + llvoiceclient.cpp + llvoicecontrolpanel.cpp + llvoiceremotectrl.cpp + llvoicevisualizer.cpp + llvoinventorylistener.cpp + llvopartgroup.cpp + llvosky.cpp + llvosurfacepatch.cpp + llvotextbubble.cpp + llvotree.cpp + llvovolume.cpp + llvowater.cpp + llvowlsky.cpp + llwatchdog.cpp + llwaterparammanager.cpp + llwaterparamset.cpp + llwearable.cpp + llwearabledictionary.cpp + llwearablelist.cpp + llweb.cpp + llwind.cpp + llwlanimator.cpp + llwldaycycle.cpp + llwlparammanager.cpp + llwlparamset.cpp + llworld.cpp + llworldmap.cpp + llworldmapview.cpp + llxmlrpclistener.cpp + llxmlrpctransaction.cpp + noise.cpp + pipeline.cpp + ) + +set(VIEWER_BINARY_NAME "secondlife-bin" CACHE STRING + "The name of the viewer executable to create.") + +if (LINUX) + # We can't set these flags for Darwin, because they get passed to + # the PPC compiler. Ugh. + + set_source_files_properties( + llviewerjointmesh_sse.cpp + PROPERTIES COMPILE_FLAGS "-msse -mfpmath=sse" + ) + set_source_files_properties( + llviewerjointmesh_sse2.cpp + PROPERTIES COMPILE_FLAGS "-msse2 -mfpmath=sse" + ) +endif (LINUX) + +set(viewer_HEADER_FILES + CMakeLists.txt + ViewerInstall.cmake + llaccordionctrl.h + llaccordionctrltab.h + llagent.h + llagentaccess.h + llagentdata.h + llagentlanguage.h + llagentlistener.h + llagentpicksinfo.h + llagentpilot.h + llagentui.h + llagentwearables.h + llanimstatelabels.h + llappearance.h + llappearancemgr.h + llappviewer.h + llappviewerlistener.h + llassetuploadqueue.h + llassetuploadresponders.h + llaudiosourcevo.h + llavataractions.h + llavatariconctrl.h + llavatarlist.h + llavatarlistitem.h + llavatarpropertiesprocessor.h + llbottomtray.h + llbox.h + llbreadcrumbview.h + llcallbacklist.h + llcallingcard.h + llcapabilitylistener.h + llcapabilityprovider.h + llcaphttpsender.h + llchannelmanager.h + llchatbar.h + llchathistory.h + llchatitemscontainerctrl.h + llchatmsgbox.h + llchiclet.h + llclassifiedinfo.h + llclassifiedstatsresponder.h + llcloud.h + llcolorswatch.h + llcommandhandler.h + llcommandlineparser.h + llcompilequeue.h + llconfirmationmanager.h + llcurrencyuimanager.h + llcylinder.h + lldateutil.h + lldebugmessagebox.h + lldebugview.h + lldelayedgestureerror.h + lldirpicker.h + lldndbutton.h + lldrawable.h + lldrawpool.h + lldrawpoolalpha.h + lldrawpoolavatar.h + lldrawpoolbump.h + lldrawpoolclouds.h + lldrawpoolground.h + lldrawpoolsimple.h + lldrawpoolsky.h + lldrawpoolterrain.h + lldrawpooltree.h + lldrawpoolwater.h + lldrawpoolwlsky.h + lldriverparam.h + lldynamictexture.h + llemote.h + lleventinfo.h + lleventnotifier.h + lleventpoll.h + llexpandabletextbox.h + llface.h + llfasttimerview.h + llfavoritesbar.h + llfeaturemanager.h + llfilepicker.h + llfirstuse.h + llflexibleobject.h + llfloaterabout.h + llfloateractivespeakers.h + llfloateranimpreview.h + llfloaterauction.h + llfloateravatarpicker.h + llfloateravatartextures.h + llfloaterbeacons.h + llfloaterbuildoptions.h + llfloaterbulkpermission.h + llfloaterbump.h + llfloaterbuy.h + llfloaterbuycontents.h + llfloaterbuycurrency.h + llfloaterbuyland.h + llfloatercall.h + llfloatercamera.h + llfloaterchat.h + llfloaterchatterbox.h + llfloatercolorpicker.h + llfloatercustomize.h + llfloaterdaycycle.h + llfloaterenvsettings.h + llfloaterfonttest.h + llfloaterfriends.h + llfloatergesture.h + llfloatergodtools.h + llfloatergroupinvite.h + llfloatergroups.h + llfloaterhandler.h + llfloaterhardwaresettings.h + llfloaterhelpbrowser.h + llfloaterhud.h + llfloaterimagepreview.h + llfloaterinspect.h + llfloaterinventory.h + llfloaterjoystick.h + llfloaterlagmeter.h + llfloaterland.h + llfloaterlandholdings.h + llfloatermap.h + llfloatermediabrowser.h + llfloatermediasettings.h + llfloatermemleak.h + llfloaternamedesc.h + llfloaternotificationsconsole.h + llfloateropenobject.h + llfloaterparcel.h + llfloaterpay.h + llfloaterperms.h + llfloaterpostcard.h + llfloaterpostprocess.h + llfloaterpreference.h + llfloaterproperties.h + llfloaterregioninfo.h + llfloaterreporter.h + llfloaterscriptdebug.h + llfloatersearch.h + llfloatersellland.h + llfloatersettingsdebug.h + llfloatersnapshot.h + llfloatertelehub.h + llfloatertestinspectors.h + llfloatertestlistview.h + llfloatertools.h + llfloatertopobjects.h + llfloatertos.h + llfloateruipreview.h + llfloaterurldisplay.h + llfloaterurlentry.h + llfloatervoicedevicesettings.h + llfloaterwater.h + llfloaterwhitelistentry.h + llfloaterwindlight.h + llfloaterworldmap.h + llfoldertype.h + llfolderview.h + llfoldervieweventlistener.h + llfolderviewitem.h + llfollowcam.h + llfriendcard.h + llgesturemgr.h + llgroupactions.h + llgrouplist.h + llgroupmgr.h + llgroupnotify.h + llhomelocationresponder.h + llhudeffect.h + llhudeffectbeam.h + llhudeffectlookat.h + llhudeffectpointat.h + llhudeffecttrail.h + llhudicon.h + llhudmanager.h + llhudobject.h + llhudrender.h + llhudtext.h + llhudview.h + llimcontrolpanel.h + llimfloater.h + llimpanel.h + llimview.h + llinspect.h + llinspectavatar.h + llinspectgroup.h + llinspectobject.h + llinventorybridge.h + llinventoryclipboard.h + llinventoryfilter.h + llinventoryfunctions.h + llinventorymodel.h + llinventorypanel.h + llinventorysubtreepanel.h + lljoystickbutton.h + lllandmarkactions.h + lllandmarklist.h + lllightconstants.h + lllistbrowser.h + lllistview.h + lllocaltextureobject.h + lllocationhistory.h + lllocationinputctrl.h + lllogchat.h + llloginhandler.h + lllogininstance.h + llmanip.h + llmaniprotate.h + llmanipscale.h + llmaniptranslate.h + llmapresponders.h + llmediactrl.h + llmediadataclient.h + llmediaremotectrl.h + llmemoryview.h + llmenucommands.h + llmetricperformancetester.h + llmimetypes.h + llmorphview.h + llmoveview.h + llmutelist.h + llnamebox.h + llnameeditor.h + llnamelistctrl.h + llnavigationbar.h + llnearbychat.h + llnearbychatbar.h + llnearbychathandler.h + llnetmap.h + llnotificationhandler.h + llnotificationmanager.h + llnotify.h + lloutputmonitorctrl.h + lloverlaybar.h + llpanelappearance.h + llpanelappearancetab.h + llpanelavatar.h + llpanelavatarrow.h + llpanelavatartag.h + llpanelblockedlist.h + llpanelclassified.h + llpanelcontents.h + llpaneleditwearable.h + llpanelevent.h + llpanelface.h + llpanelgroup.h + llpanelgroupgeneral.h + llpanelgroupinvite.h + llpanelgrouplandmoney.h + llpanelgroupnotices.h + llpanelgrouproles.h + llpanelimcontrolpanel.h + llpanelinventory.h + llpanelland.h + llpanellandaudio.h + llpanellandmarks.h + llpanellandmedia.h + llpanellogin.h + llpanellookinfo.h + llpanellooks.h + llpanelmaininventory.h + llpanelmedia.h + llpanelmediasettingsgeneral.h + llpanelmediasettingspermissions.h + llpanelmediasettingssecurity.h + llpanelmeprofile.h + llpanelobject.h + llpanelobjectinventory.h + llpanelpeople.h + llpanelpeoplemenus.h + llpanelpermissions.h + llpanelpick.h + llpanelpicks.h + llpanelplace.h + llpanelplaceinfo.h + llpanelplaces.h + llpanelplacestab.h + llpanelprimmediacontrols.h + llpanelprofile.h + llpanelprofileview.h + llpanelshower.h + llpanelteleporthistory.h + llpanelvolume.h + llparcelselection.h + llparticipantlist.h + llpatchvertexarray.h + llplacesinventorybridge.h + llpolymesh.h + llpolymorph.h + llpreview.h + llpreviewanim.h + llpreviewgesture.h + llpreviewnotecard.h + llpreviewscript.h + llpreviewsound.h + llpreviewtexture.h + llproductinforequest.h + llprogressview.h + llrecentpeople.h + llregionposition.h + llremoteparcelrequest.h + llresourcedata.h + llrootview.h + llsavedsettingsglue.h + llscreenchannel.h + llscrollingpanelparam.h + llsearchcombobox.h + llsearchhistory.h + llselectmgr.h + llsidepanelinventory.h + llsidepanelobjectinfo.h + llsidetray.h + llsidetraypanelcontainer.h + llsky.h + llslurl.h + llspatialpartition.h + llspeakers.h + llsplitbutton.h + llsprite.h + llstartup.h + llstatusbar.h + llstylemap.h + llsurface.h + llsurfacepatch.h + llsyswellitem.h + llsyswellwindow.h + lltable.h + llteleporthistory.h + llteleporthistorystorage.h + lltexglobalcolor.h + lltexlayer.h + lltexlayerparams.h + lltextureatlas.h + lltextureatlasmanager.h + lltexturecache.h + lltexturectrl.h + lltexturefetch.h + lltextureview.h + lltoast.h + lltoastalertpanel.h + lltoastgroupnotifypanel.h + lltoastimpanel.h + lltoastnotifypanel.h + lltoastpanel.h + lltool.h + lltoolbar.h + lltoolbrush.h + lltoolcomp.h + lltooldraganddrop.h + lltoolface.h + lltoolfocus.h + lltoolgrab.h + lltoolgun.h + lltoolindividual.h + lltoolmgr.h + lltoolmorph.h + lltoolobjpicker.h + lltoolpie.h + lltoolpipette.h + lltoolplacer.h + lltoolselect.h + lltoolselectland.h + lltoolselectrect.h + lltracker.h + lltransientdockablefloater.h + lltransientfloatermgr.h + lluiconstants.h + lluilistener.h + lluploaddialog.h + llurl.h + llurldispatcher.h + llurlhistory.h + llurllineeditorctrl.h + llurlsimstring.h + llurlwhitelist.h + llvectorperfoptions.h + llviewchildren.h + llviewerassetstorage.h + llvieweraudio.h + llviewerbuild.h + llviewercamera.h + llviewercontrol.h + llviewercontrollistener.h + llviewerdisplay.h + llviewerfloaterreg.h + llviewergenericmessage.h + llviewergesture.h + llviewerhelp.h + llviewerinventory.h + llviewerjoint.h + llviewerjointattachment.h + llviewerjointmesh.h + llviewerjoystick.h + llviewerkeyboard.h + llviewerlayer.h + llviewermedia.h + llviewermediafocus.h + llviewermediaobserver.h + llviewermenu.h + llviewermenufile.h + llviewermessage.h + llviewernetwork.h + llviewerobject.h + llviewerobjectlist.h + llviewerparcelmedia.h + llviewerparcelmediaautoplay.h + llviewerparcelmgr.h + llviewerparceloverlay.h + llviewerpartsim.h + llviewerpartsource.h + llviewerprecompiledheaders.h + llviewerregion.h + llviewershadermgr.h + llviewerstats.h + llviewertexteditor.h + llviewertexture.h + llviewertextureanim.h + llviewertexturelist.h + llviewerthrottle.h + llviewervisualparam.h + llviewerwindow.h + llviewerwindowlistener.h + llvlcomposition.h + llvlmanager.h + llvoavatar.h + llvoavatardefines.h + llvoavatarself.h + llvocache.h + llvoclouds.h + llvograss.h + llvoground.h + llvoicechannel.h + llvoiceclient.h + llvoicecontrolpanel.h + llvoiceremotectrl.h + llvoicevisualizer.h + llvoinventorylistener.h + llvopartgroup.h + llvosky.h + llvosurfacepatch.h + llvotextbubble.h + llvotree.h + llvotreenew.h + llvovolume.h + llvowater.h + llvowlsky.h + llwatchdog.h + llwaterparammanager.h + llwaterparamset.h + llwearable.h + llwearabledictionary.h + llwearablelist.h + llweb.h + llwind.h + llwindebug.h + llwlanimator.h + llwldaycycle.h + llwlparammanager.h + llwlparamset.h + llworld.h + llworldmap.h + llworldmapview.h + llxmlrpclistener.h + llxmlrpctransaction.h + macmain.h + noise.h + pipeline.h + randgauss.h + VertexCache.h + VorbisFramework.h + ) + +source_group("CMake Rules" FILES ViewerInstall.cmake) + +if (DARWIN) + LIST(APPEND viewer_SOURCE_FILES llappviewermacosx.cpp) + + find_library(AGL_LIBRARY AGL) + find_library(APPKIT_LIBRARY AppKit) + find_library(COCOA_LIBRARY Cocoa) + find_library(IOKIT_LIBRARY IOKit) + + set(viewer_LIBRARIES + ${COCOA_LIBRARY} + ${AGL_LIBRARY} + ${IOKIT_LIBRARY} + ) + + # Add resource files to the project. + set(viewer_RESOURCE_FILES + secondlife.icns + macview.r + gpu_table.txt + Info-SecondLife.plist + SecondLife.nib/ + # CMake doesn't seem to support Xcode language variants well just yet + English.lproj/InfoPlist.strings + English.lproj/language.txt + German.lproj/language.txt + Japanese.lproj/language.txt + Korean.lproj/language.txt + ) + set_source_files_properties( + ${viewer_RESOURCE_FILES} + PROPERTIES + HEADER_FILE_ONLY TRUE + #MACOSX_PACKAGE_LOCATION Resources #don't do this! this tells cmake to copy the files. + ) + SOURCE_GROUP("Resources" FILES ${viewer_RESOURCE_FILES}) + list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) +endif (DARWIN) + +if (LINUX) + LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp) + LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp) + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") + + set(viewer_LIBRARIES + Xinerama + ) +endif (LINUX) + +if (WINDOWS) + list(APPEND viewer_SOURCE_FILES + llappviewerwin32.cpp + llwindebug.cpp + ) + + list(APPEND viewer_HEADER_FILES + llappviewerwin32.h + llwindebug.h + ) + + # precompiled header configuration + # llviewerprecompiledheaders.cpp generates + # the .pch file. + # All sources added to viewer_SOURCE_FILES + # at this point use it. + set_source_files_properties(llviewerprecompiledheaders.cpp + PROPERTIES + COMPILE_FLAGS "/Ycllviewerprecompiledheaders.h" + ) + foreach( src_file ${viewer_SOURCE_FILES} ) + set_source_files_properties( + ${src_file} + PROPERTIES + COMPILE_FLAGS "/Yullviewerprecompiledheaders.h" + ) + endforeach( src_file ${viewer_SOURCE_FILES} ) + list(APPEND viewer_SOURCE_FILES llviewerprecompiledheaders.cpp) + # llstartup.cpp needs special symbols for audio libraries, so it resets + # COMPILE_FLAGS below. Make sure it maintains precompiled header settings. + set(LLSTARTUP_COMPILE_FLAGS + "${LLSTARTUP_COMPILE_FLAGS} /Yullviewerprecompiledheaders.h") + + # Add resource files to the project. + # viewerRes.rc is the only buildable file, but + # the rest are all dependencies of it. + set(viewer_RESOURCE_FILES + res/arrow.cur + res/arrowcop.cur + res/arrowcopmulti.cur + res/arrowdrag.cur + res/circleandline.cur + res/icon1.ico + res/llarrow.cur + res/llarrowdrag.cur + res/llarrowdragmulti.cur + res/llarrowlocked.cur + res/llgrablocked.cur + res/llno.cur + res/llnolocked.cur + res/lltoolcamera.cur + res/lltoolcreate.cur + res/lltoolfocus.cur + res/lltoolgrab.cur + res/lltoolland.cur + res/lltoolpan.cur + res/lltoolpipette.cur + res/lltoolrotate.cur + res/lltoolscale.cur + res/lltooltranslate.cur + res/lltoolzoomin.cur + res/lltoolzoomout.cur + res/ll_icon.BMP + res/ll_icon.ico + res/resource.h + res/toolpickobject.cur + res/toolpickobject2.cur + res/toolpickobject3.cur + res/toolpipette.cur + ) + + set_source_files_properties(${viewer_RESOURCE_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + + set(viewer_RESOURCE_FILES + res/viewerRes.rc + ${viewer_RESOURCE_FILES} + ) + + SOURCE_GROUP("Resource Files" FILES ${viewer_RESOURCE_FILES}) + + if (NOT STANDALONE) + list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) + endif (NOT STANDALONE) + + find_library(DINPUT_LIBRARY dinput8 ${DIRECTX_LIBRARY_DIR}) + find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR}) + mark_as_advanced( + DINPUT_LIBRARY + DXGUID_LIBRARY + ) + + set(viewer_LIBRARIES + ${WINDOWS_LIBRARIES} + comdlg32 + ${DINPUT_LIBRARY} + ${DXGUID_LIBRARY} + kernel32 + odbc32 + odbccp32 + ole32 + oleaut32 + opengl32 + shell32 + Vfw32 + winspool + ) + + find_library(INTEL_MEMOPS_LIBRARY + NAMES ll_intel_memops + PATHS + optimized ${ARCH_PREBUILT_DIRS_RELEASE} + debug ${ARCH_PREBUILT_DIRS_DEBUG} + ) + mark_as_advanced(INTEL_MEMOPS_LIBRARY) + + if (INTEL_MEMOPS_LIBRARY) + list(APPEND viewer_LIBRARIES ${INTEL_MEMOPS_LIBRARY}) + endif (INTEL_MEMOPS_LIBRARY) + + use_prebuilt_binary(dbghelp) +endif (WINDOWS) + +# Add the xui files. This is handy for searching for xui elements +# from within the IDE. +set(viewer_XUI_FILES + skins/default/colors.xml + skins/default/textures/textures.xml + + + + ) +file(GLOB DEFAULT_XUI_FILE_GLOB_LIST + ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en/*.xml) +list(APPEND viewer_XUI_FILES ${DEFAULT_XUI_FILE_GLOB_LIST}) + +file(GLOB DEFAULT_WIDGET_FILE_GLOB_LIST + ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en/widgets/*.xml) +list(APPEND viewer_XUI_FILES ${DEFAULT_WIDGET_FILE_GLOB_LIST}) + +file(GLOB SILVER_XUI_FILE_GLOB_LIST + ${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/*.xml) +list(APPEND viewer_XUI_FILES ${SILVER_XUI_FILE_GLOB_LIST}) + +# Cannot append empty lists in CMake, wait until we have files here. +#file(GLOB SILVER_WIDGET_FILE_GLOB_LIST +# ${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/widgets/*.xml) +#list(APPEND viewer_XUI_FILES ${SILVER_WIDGET_FILE_GLOB_LIST}) + +list(SORT viewer_XUI_FILES) + +source_group("XUI Files" FILES ${viewer_XUI_FILES}) + +set_source_files_properties(${viewer_XUI_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES}) + +set(viewer_APPSETTINGS_FILES + app_settings/anim.ini + app_settings/cmd_line.xml + app_settings/grass.xml + app_settings/high_graphics.xml + app_settings/keys.ini + app_settings/keywords.ini + app_settings/logcontrol.xml + app_settings/low_graphics.xml + app_settings/mid_graphics.xml + app_settings/settings.xml + app_settings/settings_crash_behavior.xml + app_settings/settings_files.xml + app_settings/settings_per_account.xml + app_settings/std_bump.ini + app_settings/trees.xml + app_settings/ultra_graphics.xml + app_settings/viewerart.xml + ${CMAKE_SOURCE_DIR}/../etc/message.xml + ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg + ) + +use_prebuilt_binary(artwork-common) + +source_group("App Settings" FILES ${viewer_APPSETTINGS_FILES}) + +set_source_files_properties(${viewer_APPSETTINGS_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +list(APPEND viewer_SOURCE_FILES ${viewer_APPSETTINGS_FILES}) + +set(viewer_CHARACTER_FILES + character/attentions.xml + character/attentionsN.xml + character/avatar_lad.xml + character/avatar_skeleton.xml + character/genepool.xml + ) + +source_group("Character File" FILES ${viewer_CHARACTER_FILES}) + +set_source_files_properties(${viewer_CHARACTER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) +if (NOT STANDALONE) + list(APPEND viewer_SOURCE_FILES ${viewer_CHARACTER_FILES}) +endif (NOT STANDALONE) + +if (WINDOWS) + file(GLOB viewer_INSTALLER_FILES installers/windows/*.nsi) + + source_group("Installer Files" FILES ${viewer_INSTALLER_FILES}) + + set_source_files_properties(${viewer_INSTALLER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + + list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES}) +endif (WINDOWS) + +if (OPENAL) + set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_OPENAL") +endif (OPENAL) + +if (FMOD) + set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMOD") + + if (DARWIN) + set(fmodwrapper_SOURCE_FILES fmodwrapper.cpp) + add_library(fmodwrapper SHARED ${fmodwrapper_SOURCE_FILES}) + set(fmodwrapper_needed_LIBRARIES ${FMOD_LIBRARY} ${CARBON_LIBRARY}) + set_target_properties( + fmodwrapper + PROPERTIES + BUILD_WITH_INSTALL_RPATH 1 + INSTALL_NAME_DIR "@executable_path/../Resources" + LINK_FLAGS "-unexported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/fmod_hidden_symbols.exp" + ) + set(FMODWRAPPER_LIBRARY fmodwrapper) + target_link_libraries(fmodwrapper ${fmodwrapper_needed_LIBRARIES}) + else (DARWIN) + # fmodwrapper unnecessary on linux or windows + set(FMODWRAPPER_LIBRARY ${FMOD_LIBRARY}) + endif (DARWIN) +endif (FMOD) + +set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") + +list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES}) + +set_source_files_properties(${viewer_HEADER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +add_executable(${VIEWER_BINARY_NAME} + WIN32 + MACOSX_BUNDLE + ${viewer_SOURCE_FILES} + ) +check_message_template(${VIEWER_BINARY_NAME}) + +if (LLKDU_LIBRARY) + add_dependencies(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARY}) +endif (LLKDU_LIBRARY) + +# add package files +file(GLOB EVENT_HOST_SCRIPT_GLOB_LIST + ${CMAKE_CURRENT_SOURCE_DIR}/../viewer_components/*.py) +list(APPEND EVENT_HOST_SCRIPTS ${EVENT_HOST_SCRIPT_GLOB_LIST}) + +set(PACKAGE OFF CACHE BOOL + "Add a package target that builds an installer package.") + +if (WINDOWS) + if(MSVC71) + set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map /MAPINFO:LINES") + else(MSVC71) + set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map") + endif(MSVC71) + + set_target_properties(${VIEWER_BINARY_NAME} + PROPERTIES + # *TODO -reenable this once we get server usage sorted out + #LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:\"__tcmalloc\"" + LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS" + LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO" + LINK_FLAGS_RELEASE ${release_flags} + ) + + # sets the 'working directory' for debugging from visual studio. + if (NOT UNATTENDED) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} PRE_BUILD + COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe + ARGS + --solution + ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln + --workingdir + ${VIEWER_BINARY_NAME} + ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging." + ) + endif (NOT UNATTENDED) + + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/messages/message_template.msg + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message_template.msg + COMMENT "Copying message_template.msg to the runtime folder." + ) + + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml + COMMENT "Copying message.xml to the runtime folder." + ) + + if(WINDOWS) + # Copy Win Libs... + # This happens at build time, not config time. We can't glob files in this cmake. + # *FIX:Mani Write a sub script to glob the files... + # *FIX:Mani Use actually dependencies rather than bulk copy. + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} PRE_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_directory + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR} + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} + COMMENT "Copying staged dlls." + ) + + add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon) + if(LLKDU_LIBRARY) + # kdu may not exist! + add_dependencies(${VIEWER_BINARY_NAME} llkdu) + endif(LLKDU_LIBRARY) + endif(WINDOWS) + + if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) + add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts) + endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) + + add_custom_command( + OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --configuration=${CMAKE_CFG_INTDIR} + --channel=${VIEWER_CHANNEL} + --login_channel=${VIEWER_LOGIN_CHANNEL} + --grid=${GRID} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} + --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat + DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ) + + add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit) + + if (PACKAGE) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2 + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py + ${CMAKE_CURRENT_SOURCE_DIR}/.. + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CFG_INTDIR} + + DEPENDS + lleventhost + ${EVENT_HOST_SCRIPTS} + ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py) + + add_custom_target(package ALL + DEPENDS + ${CMAKE_CFG_INTDIR}/touched.bat) + # temporarily disable packaging of event_host until hg subrepos get + # sorted out on the parabuild cluster... + #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2) + add_dependencies(package windows-updater windows-crash-logger) + + + endif (PACKAGE) +endif (WINDOWS) + +target_link_libraries(${VIEWER_BINARY_NAME} + ${LLAUDIO_LIBRARIES} + ${LLCHARACTER_LIBRARIES} + ${LLIMAGE_LIBRARIES} + ${LLIMAGEJ2COJ_LIBRARIES} + ${LLINVENTORY_LIBRARIES} + ${LLMESSAGE_LIBRARIES} + ${LLPLUGIN_LIBRARIES} + ${LLPRIMITIVE_LIBRARIES} + ${LLRENDER_LIBRARIES} + ${FREETYPE_LIBRARIES} + ${LLUI_LIBRARIES} + ${LLVFS_LIBRARIES} + ${LLWINDOW_LIBRARIES} + ${LLXML_LIBRARIES} + ${LLXUIXML_LIBRARIES} + ${LSCRIPT_LIBRARIES} + ${LLMATH_LIBRARIES} + ${LLCOMMON_LIBRARIES} + ${NDOF_LIBRARY} + ${viewer_LIBRARIES} + ${BOOST_PROGRAM_OPTIONS_LIBRARY} + ${BOOST_REGEX_LIBRARY} + ${DBUSGLIB_LIBRARIES} + ${OPENGL_LIBRARIES} + ${FMODWRAPPER_LIBRARY} + ${OPENGL_LIBRARIES} + ${SDL_LIBRARY} + ${SMARTHEAP_LIBRARY} + ${UI_LIBRARIES} + ${WINDOWS_LIBRARIES} + ${XMLRPCEPI_LIBRARIES} + ${ELFIO_LIBRARIES} + ${LLLOGIN_LIBRARIES} + ${GOOGLE_PERFTOOLS_LIBRARIES} + ) + +build_version(viewer) + +set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH + "Path to artwork files.") + + +if (LINUX) + add_custom_command( + OUTPUT secondlife-stripped + COMMAND strip + ARGS --strip-debug -o secondlife-stripped ${VIEWER_BINARY_NAME} + DEPENDS ${VIEWER_BINARY_NAME} + ) + + set(product SecondLife-${ARCH}-${viewer_VERSION}) + + add_custom_command( + OUTPUT ${product}.tar.bz2 + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --grid=${GRID} + --channel=${VIEWER_CHANNEL} + --login_channel=${VIEWER_LOGIN_CHANNEL} + --installer_name=${product} + --arch=${ARCH} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged + --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched + DEPENDS secondlife-stripped ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ) + + add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_gstreamer010 media_plugin_webkit) + + if (NOT INSTALL) + add_custom_target(package ALL DEPENDS ${product}.tar.bz2) + add_dependencies(package linux-crash-logger-strip-target) + add_dependencies(package linux-updater-strip-target) + endif (NOT INSTALL) +endif (LINUX) + +if (DARWIN) + set(product "Second Life") + set_target_properties( + ${VIEWER_BINARY_NAME} + PROPERTIES + OUTPUT_NAME "${product}" + MACOSX_BUNDLE_INFO_STRING "info string - localize me" + MACOSX_BUNDLE_ICON_FILE "secondlife.icns" + MACOSX_BUNDLE_GUI_IDENTIFIER "Second Life" + MACOSX_BUNDLE_LONG_VERSION_STRING "ververver" + MACOSX_BUNDLE_BUNDLE_NAME "Second Life" + MACOSX_BUNDLE_SHORT_VERSION_STRING "asdf" + MACOSX_BUNDLE_BUNDLE_VERSION "asdf" + MACOSX_BUNDLE_COPYRIGHT "copyright linden lab 2007 - localize me and run me through a legal wringer" + ) + + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --grid=${GRID} + --actions=copy + --configuration=${CMAKE_CFG_INTDIR} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app + DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ) + + add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit) + + if (PACKAGE) + add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME}) + add_dependencies(package mac-updater mac-crash-logger) + + add_custom_command( + TARGET package POST_BUILD + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --grid=${GRID} + --configuration=${CMAKE_CFG_INTDIR} + --channel=${VIEWER_CHANNEL} + --login_channel=${VIEWER_LOGIN_CHANNEL} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app + --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ) + + + add_custom_command( + TARGET package POST_BUILD + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --grid=${GRID} + --configuration=${CMAKE_CFG_INTDIR} + --channel=${VIEWER_CHANNEL} + --login_channel=${VIEWER_LOGIN_CHANNEL} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --artwork=${ARTWORK_DIR} + --build=${CMAKE_CURRENT_BINARY_DIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app + --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ) + + endif (PACKAGE) +endif (DARWIN) + +if (INSTALL) + include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake) +endif (INSTALL) + +# To add a viewer unit test, just add the test .cpp file below +# This creates a separate test project per file listed. +include(LLAddBuildTest) +SET(viewer_TEST_SOURCE_FILES + llagentaccess.cpp + lldateutil.cpp + llmediadataclient.cpp + llviewerhelputil.cpp + lllogininstance.cpp + ) +set_source_files_properties( + ${viewer_TEST_SOURCE_FILES} + PROPERTIES + LL_TEST_ADDITIONAL_SOURCE_FILES llviewerprecompiledheaders.cpp + ) +LL_ADD_PROJECT_UNIT_TESTS(${VIEWER_BINARY_NAME} "${viewer_TEST_SOURCE_FILES}") + +#set(TEST_DEBUG on) +set(test_sources llcapabilitylistener.cpp llviewerprecompiledheaders.cpp) +set(test_libs + ${LLMESSAGE_LIBRARIES} + ${WINDOWS_LIBRARIES} + ${LLVFS_LIBRARIES} + ${LLMATH_LIBRARIES} + ${LLCOMMON_LIBRARIES} + ${GOOGLEMOCK_LIBRARIES} + ) + +LL_ADD_INTEGRATION_TEST(llcapabilitylistener + "${test_sources}" + "${test_libs}" + ${PYTHON_EXECUTABLE} + "${CMAKE_SOURCE_DIR}/llmessage/tests/test_llsdmessage_peer.py" + ) + +#ADD_VIEWER_BUILD_TEST(llmemoryview viewer) + + +# Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py +if (WINDOWS) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + make_directory + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin + COMMENT "Creating llplugin dir." + ) + + get_target_property(BUILT_SLPLUGIN SLPlugin LOCATION) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${BUILT_SLPLUGIN} + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} + COMMENT "Copying SLPlugin executable to the runtime folder." + ) + + get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${BUILT_WEBKIT_PLUGIN} + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin + COMMENT "Copying WebKit Plugin to the runtime folder." + ) + + get_target_property(BUILT_QUICKTIME_PLUGIN media_plugin_quicktime LOCATION) + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${BUILT_QUICKTIME_PLUGIN} + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin + COMMENT "Copying Quicktime Plugin to the runtime folder." + ) + + #******************************* + # Copy media plugin support dlls + # Debug config runtime files required for the plugins + set(plugins_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug") + set(plugins_debug_files + libeay32.dll + qtcored4.dll + qtguid4.dll + qtnetworkd4.dll + qtopengld4.dll + qtwebkitd4.dll + ssleay32.dll + ) + copy_if_different( + ${plugins_debug_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Debug/llplugin" + out_targets + ${plugins_debug_files} + ) + set(media_plugin_targets ${media_plugin_targets} ${out_targets}) + + # Release & ReleaseDebInfo config runtime files required for the plugins + set(plugins_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release") + set(plugins_release_files + libeay32.dll + qtcore4.dll + qtgui4.dll + qtnetwork4.dll + qtopengl4.dll + qtwebkit4.dll + ssleay32.dll + ) + copy_if_different( + ${plugins_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin" + out_targets + ${plugins_release_files} + ) + set(media_plugin_targets ${media_plugin_targets} ${out_targets}) + + copy_if_different( + ${plugins_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin" + out_targets + ${plugins_release_files} + ) + set(media_plugin_targets ${media_plugin_targets} ${out_targets}) + + add_custom_target(copy_media_plugin_libs ALL + DEPENDS + ${media_plugin_targets} + ) + + add_custom_command( + TARGET ${VIEWER_BINARY_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_directory + ${CMAKE_BINARY_DIR}/test_apps/llplugintest/${CMAKE_CFG_INTDIR}/imageformats + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin/imageformats + COMMENT "Copying llpluging imageformat libs." + ) + + add_dependencies(${VIEWER_BINARY_NAME} llmediaplugintest copy_media_plugin_libs) + +endif (WINDOWS) + diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index b9a0b4293dd..1d4a78f0258 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -39,6 +39,7 @@ #include "llfloaterinventory.h" #include "llinventorybridge.h" #include "llinventorymodel.h" +#include "llinventorypanel.h" #include "llnotify.h" #include "llviewerregion.h" #include "llvoavatarself.h" diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index cd3963050f6..5dbf57c9bef 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -41,6 +41,7 @@ #include "llfilepicker.h" #include "llnotify.h" #include "llinventorymodel.h" +#include "llinventorypanel.h" #include "llfloaterinventory.h" #include "llpermissionsflags.h" #include "llpreviewnotecard.h" diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index 9d07362edc8..3da06fa7b32 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -45,6 +45,7 @@ #include "llinventorymodel.h" // for gInventory #include "llfloaterreg.h" #include "llfloaterinventory.h" // for get_item_icon +#include "llinventoryfunctions.h" #include "llselectmgr.h" #include "llscrolllistctrl.h" #include "llviewerobject.h" diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index 3a4171c6bee..f3eaa0c9163 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -45,6 +45,7 @@ #include "llagent.h" // for agent id #include "llalertdialog.h" #include "llcheckboxctrl.h" +#include "llinventoryfunctions.h" #include "llinventorymodel.h" // for gInventory #include "llfloaterreg.h" #include "llfloaterinventory.h" // for get_item_icon @@ -280,7 +281,7 @@ void LLFloaterBuyContents::onClickBuy() // We may want to wear this item if (childGetValue("wear_check")) { - LLFloaterInventory::sWearNewClothing = TRUE; + LLInventoryState::sWearNewClothing = TRUE; } // Put the items where we put new folders. diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 1300103423c..c114eed4a24 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -44,6 +44,7 @@ #include "llcombobox.h" #include "llgesturemgr.h" #include "llinventorymodel.h" +#include "llinventorypanel.h" #include "llfloaterinventory.h" #include "llkeyboard.h" #include "lllineeditor.h" diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp index a47916b7d7b..89a9a317c27 100644 --- a/indra/newview/llfloaterinventory.cpp +++ b/indra/newview/llfloaterinventory.cpp @@ -1,1953 +1,155 @@ -/** - * @file llfloaterinventory.cpp - * @brief Implementation of the inventory view and associated stuff. - * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include <utility> // for std::pair<> - -#include "llfloaterinventory.h" - -// library includes -#include "llagent.h" -#include "llagentwearables.h" -#include "llcallingcard.h" -#include "llfloaterreg.h" -#include "llsdserialize.h" -#include "llfiltereditor.h" -#include "llspinctrl.h" -#include "llui.h" -#include "message.h" - -// newview includes -#include "llappearancemgr.h" -#include "llappviewer.h" -#include "llfirstuse.h" -#include "llfloaterchat.h" -#include "llfloatercustomize.h" -#include "llfocusmgr.h" -#include "llfolderview.h" -#include "llgesturemgr.h" -#include "lliconctrl.h" -#include "llimview.h" -#include "llinventorybridge.h" -#include "llinventoryclipboard.h" -#include "llinventorymodel.h" -#include "lllineeditor.h" -#include "llmenugl.h" -#include "llpreviewanim.h" -#include "llpreviewgesture.h" -#include "llpreviewnotecard.h" -#include "llpreviewscript.h" -#include "llpreviewsound.h" -#include "llpreviewtexture.h" -#include "llresmgr.h" -#include "llscrollbar.h" -#include "llscrollcontainer.h" -#include "llselectmgr.h" -#include "lltabcontainer.h" -#include "lltooldraganddrop.h" -#include "lluictrlfactory.h" -#include "llviewerinventory.h" -#include "llviewermessage.h" -#include "llviewerobjectlist.h" -#include "llviewerregion.h" -#include "llviewerwindow.h" -#include "llvoavatarself.h" -#include "llwearablelist.h" - -static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel"); - -//BOOL LLFloaterInventory::sOpenNextNewItem = FALSE; -BOOL LLFloaterInventory::sWearNewClothing = FALSE; -LLUUID LLFloaterInventory::sWearNewClothingTransactionID; - -///---------------------------------------------------------------------------- -/// LLFloaterInventoryFinder -///---------------------------------------------------------------------------- - -LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLFloaterInventory* inventory_view) -: LLFloater(LLSD()), - mFloaterInventory(inventory_view), - mFilter(inventory_view->mActivePanel->getFilter()) -{ - LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL); - updateElementsFromFilter(); -} - - -void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data) -{ - LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; - if (!self) return; - - bool since_logoff= self->childGetValue("check_since_logoff"); - - if (!since_logoff && - !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) ) - { - self->mSpinSinceHours->set(1.0f); - } -} -BOOL LLFloaterInventoryFinder::postBuild() -{ - const LLRect& viewrect = mFloaterInventory->getRect(); - setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight())); - - childSetAction("All", selectAllTypes, this); - childSetAction("None", selectNoTypes, this); - - mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago"); - childSetCommitCallback("spin_hours_ago", onTimeAgo, this); - - mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago"); - childSetCommitCallback("spin_days_ago", onTimeAgo, this); - - // mCheckSinceLogoff = getChild<LLSpinCtrl>("check_since_logoff"); - childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this); - - childSetAction("Close", onCloseBtn, this); - - updateElementsFromFilter(); - return TRUE; -} -void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data) -{ - LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; - if (!self) return; - - bool since_logoff=true; - if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) - { - since_logoff = false; - } - self->childSetValue("check_since_logoff", since_logoff); -} - -void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter) -{ - mFilter = filter; - updateElementsFromFilter(); -} - -void LLFloaterInventoryFinder::updateElementsFromFilter() -{ - if (!mFilter) - return; - - // Get data needed for filter display - U32 filter_types = mFilter->getFilterTypes(); - std::string filter_string = mFilter->getFilterSubString(); - LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState(); - U32 hours = mFilter->getHoursAgo(); - - // update the ui elements - LLFloater::setTitle(mFilter->getName()); - childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION)); - - childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD)); - childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE)); - childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE)); - childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK)); - childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD)); - childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT)); - childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL)); - childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND)); - childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE)); - childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT)); - childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS); - childSetValue("check_since_logoff", mFilter->isSinceLogoff()); - mSpinSinceHours->set((F32)(hours % 24)); - mSpinSinceDays->set((F32)(hours / 24)); -} - -void LLFloaterInventoryFinder::draw() -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW); - U32 filter = 0xffffffff; - BOOL filtered_by_all_types = TRUE; - - if (!childGetValue("check_animation")) - { - filter &= ~(0x1 << LLInventoryType::IT_ANIMATION); - filtered_by_all_types = FALSE; - } - - - if (!childGetValue("check_calling_card")) - { - filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_clothing")) - { - filter &= ~(0x1 << LLInventoryType::IT_WEARABLE); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_gesture")) - { - filter &= ~(0x1 << LLInventoryType::IT_GESTURE); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_landmark")) - - - { - filter &= ~(0x1 << LLInventoryType::IT_LANDMARK); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_notecard")) - { - filter &= ~(0x1 << LLInventoryType::IT_NOTECARD); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_object")) - { - filter &= ~(0x1 << LLInventoryType::IT_OBJECT); - filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_script")) - { - filter &= ~(0x1 << LLInventoryType::IT_LSL); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_sound")) - { - filter &= ~(0x1 << LLInventoryType::IT_SOUND); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_texture")) - { - filter &= ~(0x1 << LLInventoryType::IT_TEXTURE); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_snapshot")) - { - filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT); - filtered_by_all_types = FALSE; - } - - if (!filtered_by_all_types) - { - // don't include folders in filter, unless I've selected everything - filter &= ~(0x1 << LLInventoryType::IT_CATEGORY); - } - - // update the panel, panel will update the filter - mFloaterInventory->mActivePanel->setShowFolderState(getCheckShowEmpty() ? - LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - mFloaterInventory->mActivePanel->setFilterTypes(filter); - if (getCheckSinceLogoff()) - { - mSpinSinceDays->set(0); - mSpinSinceHours->set(0); - } - U32 days = (U32)mSpinSinceDays->get(); - U32 hours = (U32)mSpinSinceHours->get(); - if (hours > 24) - { - days += hours / 24; - hours = (U32)hours % 24; - mSpinSinceDays->set((F32)days); - mSpinSinceHours->set((F32)hours); - } - hours += days * 24; - mFloaterInventory->mActivePanel->setHoursAgo(hours); - mFloaterInventory->mActivePanel->setSinceLogoff(getCheckSinceLogoff()); - mFloaterInventory->setFilterTextFromFilter(); - - LLFloater::draw(); -} - -BOOL LLFloaterInventoryFinder::getCheckShowEmpty() -{ - return childGetValue("check_show_empty"); -} - -BOOL LLFloaterInventoryFinder::getCheckSinceLogoff() -{ - return childGetValue("check_since_logoff"); -} - -void LLFloaterInventoryFinder::onCloseBtn(void* user_data) -{ - LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data; - finderp->closeFloater(); -} - -// static -void LLFloaterInventoryFinder::selectAllTypes(void* user_data) -{ - LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; - if(!self) return; - - self->childSetValue("check_animation", TRUE); - self->childSetValue("check_calling_card", TRUE); - self->childSetValue("check_clothing", TRUE); - self->childSetValue("check_gesture", TRUE); - self->childSetValue("check_landmark", TRUE); - self->childSetValue("check_notecard", TRUE); - self->childSetValue("check_object", TRUE); - self->childSetValue("check_script", TRUE); - self->childSetValue("check_sound", TRUE); - self->childSetValue("check_texture", TRUE); - self->childSetValue("check_snapshot", TRUE); - -/* - self->mCheckCallingCard->set(TRUE); - self->mCheckClothing->set(TRUE); - self->mCheckGesture->set(TRUE); - self->mCheckLandmark->set(TRUE); - self->mCheckNotecard->set(TRUE); - self->mCheckObject->set(TRUE); - self->mCheckScript->set(TRUE); - self->mCheckSound->set(TRUE); - self->mCheckTexture->set(TRUE); - self->mCheckSnapshot->set(TRUE);*/ -} - -//static -void LLFloaterInventoryFinder::selectNoTypes(void* user_data) -{ - LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; - if(!self) return; - - /* - self->childSetValue("check_animation", FALSE); - self->mCheckCallingCard->set(FALSE); - self->mCheckClothing->set(FALSE); - self->mCheckGesture->set(FALSE); - self->mCheckLandmark->set(FALSE); - self->mCheckNotecard->set(FALSE); - self->mCheckObject->set(FALSE); - self->mCheckScript->set(FALSE); - self->mCheckSound->set(FALSE); - self->mCheckTexture->set(FALSE); - self->mCheckSnapshot->set(FALSE);*/ - - - self->childSetValue("check_animation", FALSE); - self->childSetValue("check_calling_card", FALSE); - self->childSetValue("check_clothing", FALSE); - self->childSetValue("check_gesture", FALSE); - self->childSetValue("check_landmark", FALSE); - self->childSetValue("check_notecard", FALSE); - self->childSetValue("check_object", FALSE); - self->childSetValue("check_script", FALSE); - self->childSetValue("check_sound", FALSE); - self->childSetValue("check_texture", FALSE); - self->childSetValue("check_snapshot", FALSE); -} - - -///---------------------------------------------------------------------------- -/// LLFloaterInventory -///---------------------------------------------------------------------------- -void LLSaveFolderState::setApply(BOOL apply) -{ - mApply = apply; - // before generating new list of open folders, clear the old one - if(!apply) - { - clearOpenFolders(); - } -} - -void LLSaveFolderState::doFolder(LLFolderViewFolder* folder) -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_DO_FOLDER); - if(mApply) - { - // we're applying the open state - LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener(); - if(!bridge) return; - LLUUID id(bridge->getUUID()); - if(mOpenFolders.find(id) != mOpenFolders.end()) - { - folder->setOpen(TRUE); - } - else - { - // keep selected filter in its current state, this is less jarring to user - if (!folder->isSelected()) - { - folder->setOpen(FALSE); - } - } - } - else - { - // we're recording state at this point - if(folder->isOpen()) - { - LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener(); - if(!bridge) return; - mOpenFolders.insert(bridge->getUUID()); - } - } -} - -LLFloaterInventory::LLFloaterInventory(const LLSD& key) - : LLFloater(key) -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT); - // Menu Callbacks (non contex menus) - mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLFloaterInventory::doToSelected, this, _2)); - mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLFloaterInventory::closeAllFolders, this)); - mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); - mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); - mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLFloaterInventory::doCreate, this, _2)); -// mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::newWindow, this)); - mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLFloaterInventory::toggleFindOptions, this)); - mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLFloaterInventory::resetFilters, this)); - mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLFloaterInventory::setSortBy, this, _2)); - - // Controls - // *TODO: Just use persistant settings for each of these - U32 sort_order = gSavedSettings.getU32("InventorySortOrder"); - BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE ); - BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME ); - BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ); - - gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE); - gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE); - gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE); - gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE); - - mSavedFolderState = new LLSaveFolderState(); - mSavedFolderState->setApply(FALSE); - - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory.xml"); -} - -BOOL LLFloaterInventory::postBuild() -{ - gInventory.addObserver(this); - - mFilterTabs = getChild<LLTabContainer>("inventory filter tabs"); - mFilterTabs->setCommitCallback(boost::bind(&LLFloaterInventory::onFilterSelected, this)); - - //panel->getFilter()->markDefault(); - - // Set up the default inv. panel/filter settings. - mActivePanel = getChild<LLInventoryPanel>("All Items"); - if (mActivePanel) - { - // "All Items" is the previous only view, so it gets the InventorySortOrder - mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder")); - mActivePanel->getFilter()->markDefault(); - mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); - mActivePanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mActivePanel, _1, _2)); - } - LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); - if (recent_items_panel) - { - recent_items_panel->setSinceLogoff(TRUE); - recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE); - recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - recent_items_panel->getFilter()->markDefault(); - recent_items_panel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, recent_items_panel, _1, _2)); - } - - // Now load the stored settings from disk, if available. - std::ostringstream filterSaveName; - filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); - llinfos << "LLFloaterInventory::init: reading from " << filterSaveName << llendl; - llifstream file(filterSaveName.str()); - LLSD savedFilterState; - if (file.is_open()) - { - LLSDSerialize::fromXML(savedFilterState, file); - file.close(); - - // Load the persistent "Recent Items" settings. - // Note that the "All Items" settings do not persist. - if(recent_items_panel) - { - if(savedFilterState.has(recent_items_panel->getFilter()->getName())) - { - LLSD recent_items = savedFilterState.get( - recent_items_panel->getFilter()->getName()); - recent_items_panel->getFilter()->fromLLSD(recent_items); - } - } - - } - - - mFilterEditor = getChild<LLFilterEditor>("inventory search editor"); - if (mFilterEditor) - { - mFilterEditor->setCommitCallback(boost::bind(&LLFloaterInventory::onFilterEdit, this, _2)); - } - - // *TODO:Get the cost info from the server - const std::string upload_cost("10"); - childSetLabelArg("Upload Image", "[COST]", upload_cost); - childSetLabelArg("Upload Sound", "[COST]", upload_cost); - childSetLabelArg("Upload Animation", "[COST]", upload_cost); - childSetLabelArg("Bulk Upload", "[COST]", upload_cost); - - return TRUE; -} - -// Destroys the object -LLFloaterInventory::~LLFloaterInventory( void ) -{ - // Save the filters state. - LLSD filterRoot; - LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items"); - if (all_items_panel) - { - LLInventoryFilter* filter = all_items_panel->getFilter(); - LLSD filterState; - filter->toLLSD(filterState); - filterRoot[filter->getName()] = filterState; - } - - LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); - if (recent_items_panel) - { - LLInventoryFilter* filter = recent_items_panel->getFilter(); - LLSD filterState; - filter->toLLSD(filterState); - filterRoot[filter->getName()] = filterState; - } - - std::ostringstream filterSaveName; - filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); - llofstream filtersFile(filterSaveName.str()); - if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile)) - { - llwarns << "Could not write to filters save file " << filterSaveName << llendl; - } - else - filtersFile.close(); - - gInventory.removeObserver(this); - delete mSavedFolderState; -} - -void LLFloaterInventory::draw() -{ - if (LLInventoryModel::isEverythingFetched()) - { - updateTitle(); - } - LLFloater::draw(); -} - -void LLOpenFilteredFolders::doItem(LLFolderViewItem *item) -{ - if (item->getFiltered()) - { - item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); - } -} - -void LLOpenFilteredFolders::doFolder(LLFolderViewFolder* folder) -{ - if (folder->getFiltered() && folder->getParentFolder()) - { - folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); - } - // if this folder didn't pass the filter, and none of its descendants did - else if (!folder->getFiltered() && !folder->hasFilteredDescendants()) - { - folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_NO); - } -} - -void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item) -{ - if (item->getFiltered() && !mItemSelected) - { - item->getRoot()->setSelection(item, FALSE, FALSE); - if (item->getParentFolder()) - { - item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); - } - item->getRoot()->scrollToShowSelection(); - mItemSelected = TRUE; - } -} - -void LLSelectFirstFilteredItem::doFolder(LLFolderViewFolder* folder) -{ - if (folder->getFiltered() && !mItemSelected) - { - folder->getRoot()->setSelection(folder, FALSE, FALSE); - if (folder->getParentFolder()) - { - folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); - } - folder->getRoot()->scrollToShowSelection(); - mItemSelected = TRUE; - } -} - -void LLOpenFoldersWithSelection::doItem(LLFolderViewItem *item) -{ - if (item->getParentFolder() && item->isSelected()) - { - item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); - } -} - -void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder) -{ - if (folder->getParentFolder() && folder->isSelected()) - { - folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); - } -} - -void LLFloaterInventory::startSearch() -{ - // this forces focus to line editor portion of search editor - if (mFilterEditor) - { - mFilterEditor->focusFirstItem(TRUE); - } -} - -void LLFloaterInventory::onOpen(const LLSD& key) -{ - LLFirstUse::useInventory(); -} - -BOOL LLFloaterInventory::handleKeyHere(KEY key, MASK mask) -{ - LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL; - if (root_folder) - { - // first check for user accepting current search results - if (mFilterEditor - && mFilterEditor->hasFocus() - && (key == KEY_RETURN - || key == KEY_DOWN) - && mask == MASK_NONE) - { - // move focus to inventory proper - mActivePanel->setFocus(TRUE); - root_folder->scrollToShowSelection(); - return TRUE; - } - - if (mActivePanel->hasFocus() && key == KEY_UP) - { - startSearch(); - } - } - - return LLFloater::handleKeyHere(key, mask); - -} - -void LLFloaterInventory::updateTitle() -{ - LLLocale locale(LLLocale::USER_LOCALE); - std::string item_count_string; - LLResMgr::getInstance()->getIntegerString(item_count_string, gInventory.getItemCount()); - - LLStringUtil::format_map_t string_args; - string_args["[ITEM_COUNT]"] = item_count_string; - string_args["[FILTER]"] = mFilterText; - - if (LLInventoryModel::backgroundFetchActive()) - { - setTitle(getString("TitleFetching", string_args)); - } - else - { - setTitle(getString("TitleCompleted", string_args)); - } -} - - -void LLFloaterInventory::changed(U32 mask) -{ - updateTitle(); -} - -//---------------------------------------------------------------------------- -// menu callbacks - -void LLFloaterInventory::doToSelected(const LLSD& userdata) -{ - getPanel()->getRootFolder()->doToSelected(&gInventory, userdata); -} - -void LLFloaterInventory::closeAllFolders() -{ - getPanel()->getRootFolder()->closeAllFolders(); -} - -void LLFloaterInventory::doCreate(const LLSD& userdata) -{ - menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata); -} - -void LLFloaterInventory::resetFilters() -{ - LLFloaterInventoryFinder *finder = getFinder(); - getActivePanel()->getFilter()->resetDefault(); - if (finder) - { - finder->updateElementsFromFilter(); - } - - setFilterTextFromFilter(); -} - -void LLFloaterInventory::setSortBy(const LLSD& userdata) -{ - std::string sort_field = userdata.asString(); - if (sort_field == "name") - { - U32 order = getActivePanel()->getSortOrder(); - getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE ); - - gSavedSettings.setBOOL("Inventory.SortByName", TRUE ); - gSavedSettings.setBOOL("Inventory.SortByDate", FALSE ); - } - else if (sort_field == "date") - { - U32 order = getActivePanel()->getSortOrder(); - getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE ); - - gSavedSettings.setBOOL("Inventory.SortByName", FALSE ); - gSavedSettings.setBOOL("Inventory.SortByDate", TRUE ); - } - else if (sort_field == "foldersalwaysbyname") - { - U32 order = getActivePanel()->getSortOrder(); - if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME ) - { - order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME; - - gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE ); - } - else - { - order |= LLInventoryFilter::SO_FOLDERS_BY_NAME; - - gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE ); - } - getActivePanel()->setSortOrder( order ); - } - else if (sort_field == "systemfolderstotop") - { - U32 order = getActivePanel()->getSortOrder(); - if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ) - { - order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; - - gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE ); - } - else - { - order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; - - gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE ); - } - getActivePanel()->setSortOrder( order ); - } -} - -//---------------------------------------------------------------------------- - -// static -LLFloaterInventory* LLFloaterInventory::showAgentInventory() -{ - LLFloaterInventory* iv = NULL; - if (!gAgent.cameraMouselook()) - { - iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD()); - } - return iv; -} - -// static -LLFloaterInventory* LLFloaterInventory::getActiveInventory() -{ - LLFloaterInventory* res = NULL; - LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory"); - S32 z_min = S32_MAX; - for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) - { - LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter); - if (iv) - { - S32 z_order = gFloaterView->getZOrder(iv); - if (z_order < z_min) - { - res = iv; - z_min = z_order; - } - } - } - return res; -} - -// static -void LLFloaterInventory::cleanup() -{ - LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory"); - for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end();) - { - LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter++); - if (iv) - { - iv->destroy(); - } - } -} - -void LLFloaterInventory::toggleFindOptions() -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE); - LLFloater *floater = getFinder(); - if (!floater) - { - LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this); - mFinderHandle = finder->getHandle(); - finder->openFloater(); - addDependentFloater(mFinderHandle); - - // start background fetch of folders - gInventory.startBackgroundFetch(); - } - else - { - floater->closeFloater(); - } -} - -// static -BOOL LLFloaterInventory::filtersVisible(void* user_data) -{ - LLFloaterInventory* self = (LLFloaterInventory*)user_data; - if(!self) return FALSE; - - return self->getFinder() != NULL; -} - -void LLFloaterInventory::onClearSearch() -{ - LLFloater *finder = getFinder(); - if (mActivePanel) - { - mActivePanel->setFilterSubString(LLStringUtil::null); - mActivePanel->setFilterTypes(0xffffffff); - } - - if (finder) - { - LLFloaterInventoryFinder::selectAllTypes(finder); - } - - // re-open folders that were initially open - if (mActivePanel) - { - mSavedFolderState->setApply(TRUE); - mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); - LLOpenFoldersWithSelection opener; - mActivePanel->getRootFolder()->applyFunctorRecursively(opener); - mActivePanel->getRootFolder()->scrollToShowSelection(); - } -} - -void LLFloaterInventory::onFilterEdit(const std::string& search_string ) -{ - if (search_string == "") - { - onClearSearch(); - } - if (!mActivePanel) - { - return; - } - - gInventory.startBackgroundFetch(); - - std::string uppercase_search_string = search_string; - LLStringUtil::toUpper(uppercase_search_string); - if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty()) - { - // current filter and new filter empty, do nothing - return; - } - - // save current folder open state if no filter currently applied - if (!mActivePanel->getRootFolder()->isFilterModified()) - { - mSavedFolderState->setApply(FALSE); - mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); - } - - // set new filter string - mActivePanel->setFilterSubString(uppercase_search_string); -} - - - //static - BOOL LLFloaterInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward) - { - LLFloaterInventory* active_view = NULL; - - LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory"); - for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) - { - LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter); - if (iv) - { - if (gFocusMgr.childHasKeyboardFocus(iv)) - { - active_view = iv; - break; - } - } - } - - if (!active_view) - { - return FALSE; - } - - std::string search_string(find_text); - - if (search_string.empty()) - { - return FALSE; - } - - if (active_view->mActivePanel && - active_view->mActivePanel->getRootFolder()->search(first_item, search_string, backward)) - { - return TRUE; - } - - return FALSE; - } - -void LLFloaterInventory::onFilterSelected() -{ - // Find my index - mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs"); - - if (!mActivePanel) - { - return; - } - LLInventoryFilter* filter = mActivePanel->getFilter(); - LLFloaterInventoryFinder *finder = getFinder(); - if (finder) - { - finder->changeFilter(filter); - } - if (filter->isActive()) - { - // If our filter is active we may be the first thing requiring a fetch so we better start it here. - gInventory.startBackgroundFetch(); - } - setFilterTextFromFilter(); -} - -BOOL LLFloaterInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg) -{ - // Check to see if we are auto scrolling from the last frame - LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel(); - BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y); - if(mFilterTabs) - { - if(needsToScroll) - { - mFilterTabs->startDragAndDropDelayTimer(); - } - } - - BOOL handled = LLFloater::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); - - return handled; -} -const std::string& get_item_icon_name(LLAssetType::EType asset_type, - LLInventoryType::EType inventory_type, - U32 attachment_point, - BOOL item_is_multi ) -{ - EInventoryIcon idx = OBJECT_ICON_NAME; - if ( item_is_multi ) - { - idx = OBJECT_MULTI_ICON_NAME; - } - - switch(asset_type) - { - case LLAssetType::AT_TEXTURE: - if(LLInventoryType::IT_SNAPSHOT == inventory_type) - { - idx = SNAPSHOT_ICON_NAME; - } - else - { - idx = TEXTURE_ICON_NAME; - } - break; - - case LLAssetType::AT_SOUND: - idx = SOUND_ICON_NAME; - break; - case LLAssetType::AT_CALLINGCARD: - if(attachment_point!= 0) - { - idx = CALLINGCARD_ONLINE_ICON_NAME; - } - else - { - idx = CALLINGCARD_OFFLINE_ICON_NAME; - } - break; - case LLAssetType::AT_LANDMARK: - if(attachment_point!= 0) - { - idx = LANDMARK_VISITED_ICON_NAME; - } - else - { - idx = LANDMARK_ICON_NAME; - } - break; - case LLAssetType::AT_SCRIPT: - case LLAssetType::AT_LSL_TEXT: - case LLAssetType::AT_LSL_BYTECODE: - idx = SCRIPT_ICON_NAME; - break; - case LLAssetType::AT_CLOTHING: - idx = CLOTHING_ICON_NAME; - case LLAssetType::AT_BODYPART : - if(LLAssetType::AT_BODYPART == asset_type) - { - idx = BODYPART_ICON_NAME; - } - switch(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point) - { - case WT_SHAPE: - idx = BODYPART_SHAPE_ICON_NAME; - break; - case WT_SKIN: - idx = BODYPART_SKIN_ICON_NAME; - break; - case WT_HAIR: - idx = BODYPART_HAIR_ICON_NAME; - break; - case WT_EYES: - idx = BODYPART_EYES_ICON_NAME; - break; - case WT_SHIRT: - idx = CLOTHING_SHIRT_ICON_NAME; - break; - case WT_PANTS: - idx = CLOTHING_PANTS_ICON_NAME; - break; - case WT_SHOES: - idx = CLOTHING_SHOES_ICON_NAME; - break; - case WT_SOCKS: - idx = CLOTHING_SOCKS_ICON_NAME; - break; - case WT_JACKET: - idx = CLOTHING_JACKET_ICON_NAME; - break; - case WT_GLOVES: - idx = CLOTHING_GLOVES_ICON_NAME; - break; - case WT_UNDERSHIRT: - idx = CLOTHING_UNDERSHIRT_ICON_NAME; - break; - case WT_UNDERPANTS: - idx = CLOTHING_UNDERPANTS_ICON_NAME; - break; - case WT_SKIRT: - idx = CLOTHING_SKIRT_ICON_NAME; - break; - case WT_ALPHA: - idx = CLOTHING_ALPHA_ICON_NAME; - break; - case WT_TATTOO: - idx = CLOTHING_TATTOO_ICON_NAME; - break; - default: - // no-op, go with choice above - break; - } - break; - case LLAssetType::AT_NOTECARD: - idx = NOTECARD_ICON_NAME; - break; - case LLAssetType::AT_ANIMATION: - idx = ANIMATION_ICON_NAME; - break; - case LLAssetType::AT_GESTURE: - idx = GESTURE_ICON_NAME; - break; - case LLAssetType::AT_FAVORITE: - //TODO - need bette idx - idx = LANDMARK_ICON_NAME; - break; - case LLAssetType::AT_LINK: - idx = LINKITEM_ICON_NAME; - break; - case LLAssetType::AT_LINK_FOLDER: - idx = LINKFOLDER_ICON_NAME; - break; - default: - break; - } - - return ICON_NAME[idx]; -} - -LLUIImagePtr get_item_icon(LLAssetType::EType asset_type, - LLInventoryType::EType inventory_type, - U32 attachment_point, - BOOL item_is_multi) -{ - const std::string& icon_name = get_item_icon_name(asset_type, inventory_type, attachment_point, item_is_multi ); - return LLUI::getUIImage(icon_name); -} - -const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder"); -const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder"); -const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string(""); -static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER; - -LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) -: LLPanel(p), - mInventoryObserver(NULL), - mFolders(NULL), - mScroller(NULL), - mSortOrderSetting(p.sort_order_setting), - mInventory(p.inventory), - mAllowMultiSelect(p.allow_multi_select), - mHasInventoryConnection(false), - mStartFolderString(p.start_folder) -, mBuildDefaultHierarchy(true) -, mInvFVBridgeBuilder(NULL) -{ - mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER; - - // contex menu callbacks - mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2)); - mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); - mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); - mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2)); - mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2)); - mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this)); - - setBackgroundColor(LLUIColorTable::instance().getColor("InventoryBackgroundColor")); - setBackgroundVisible(TRUE); - setBackgroundOpaque(TRUE); -} - -BOOL LLInventoryPanel::postBuild() -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD); - - mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves - - // create root folder - { - LLRect folder_rect(0, - 0, - getRect().getWidth(), - 0); - LLFolderView::Params p; - p.name = getName(); - p.rect = folder_rect; - p.parent_panel = this; - mFolders = LLUICtrlFactory::create<LLFolderView>(p); - mFolders->setAllowMultiSelect(mAllowMultiSelect); - } - - mCommitCallbackRegistrar.popScope(); - - mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); - - // scroller - { - LLRect scroller_view_rect = getRect(); - scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom); - LLScrollContainer::Params p; - p.name("Inventory Scroller"); - p.rect(scroller_view_rect); - p.follows.flags(FOLLOWS_ALL); - p.reserve_scroll_corner(true); - p.tab_stop(true); - mScroller = LLUICtrlFactory::create<LLScrollContainer>(p); - } - addChild(mScroller); - mScroller->addChild(mFolders); - - mFolders->setScrollContainer(mScroller); - - // set up the callbacks from the inventory we're viewing, and then - // build everything. - mInventoryObserver = new LLInventoryPanelObserver(this); - mInventory->addObserver(mInventoryObserver); - - // determine the root folder, if any, so inventory contents show just the children - // of that folder (i.e. not including the folder itself). - const LLAssetType::EType preferred_type = LLAssetType::lookupHumanReadable(mStartFolderString); - - if ("inventory" == mStartFolderString) - { - mStartFolderID = gInventory.getRootFolderID(); - } - else if ("library" == mStartFolderString) - { - mStartFolderID = gInventory.getLibraryRootFolderID(); - } - else - { - mStartFolderID = (preferred_type != LLAssetType::AT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); - } - - // build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback - if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection) - { - rebuildViewsFor(mStartFolderID); - mHasInventoryConnection = true; - } - - // bit of a hack to make sure the inventory is open. - mFolders->openFolder(preferred_type != LLAssetType::AT_NONE ? LLAssetType::lookupCategoryName(preferred_type) : "My Inventory"); - - if (mSortOrderSetting != INHERIT_SORT_ORDER) - { - setSortOrder(gSavedSettings.getU32(mSortOrderSetting)); - } - else - { - setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER)); - } - mFolders->setSortOrder(mFolders->getFilter()->getSortOrder()); - - return TRUE; -} - -LLInventoryPanel::~LLInventoryPanel() -{ - // should this be a global setting? - if (mFolders) - { - U32 sort_order = mFolders->getSortOrder(); - if (mSortOrderSetting != INHERIT_SORT_ORDER) - { - gSavedSettings.setU32(mSortOrderSetting, sort_order); - } - } - - // LLView destructor will take care of the sub-views. - mInventory->removeObserver(mInventoryObserver); - delete mInventoryObserver; - mScroller = NULL; -} - -LLMemType mt(LLMemType::MTYPE_INVENTORY_FROM_XML); // ! BUG ! Should this be removed? -void LLInventoryPanel::draw() -{ - // select the desired item (in case it wasn't loaded when the selection was requested) - mFolders->updateSelection(); - LLPanel::draw(); -} - -void LLInventoryPanel::setFilterTypes(U64 filter_types, BOOL filter_for_categories) -{ - mFolders->getFilter()->setFilterTypes(filter_types, filter_for_categories); -} - -void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask) -{ - mFolders->getFilter()->setFilterPermissions(filter_perm_mask); -} - -void LLInventoryPanel::setFilterSubString(const std::string& string) -{ - mFolders->getFilter()->setFilterSubString(string); -} - -void LLInventoryPanel::setSortOrder(U32 order) -{ - mFolders->getFilter()->setSortOrder(order); - if (mFolders->getFilter()->isModified()) - { - mFolders->setSortOrder(order); - // try to keep selection onscreen, even if it wasn't to start with - mFolders->scrollToShowSelection(); - } -} - -void LLInventoryPanel::setSinceLogoff(BOOL sl) -{ - mFolders->getFilter()->setDateRangeLastLogoff(sl); -} - -void LLInventoryPanel::setHoursAgo(U32 hours) -{ - mFolders->getFilter()->setHoursAgo(hours); -} - -void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show) -{ - mFolders->getFilter()->setShowFolderState(show); -} - -LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState() -{ - return mFolders->getFilter()->getShowFolderState(); -} - -static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh"); - -void LLInventoryPanel::modelChanged(U32 mask) -{ - LLFastTimer t2(FTM_REFRESH); - - bool handled = false; - - // inventory just initialized, do complete build - if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection) - { - rebuildViewsFor(mStartFolderID); - mHasInventoryConnection = true; - return; - } - - if(mask & LLInventoryObserver::LABEL) - { - handled = true; - // label change - empty out the display name for each object - // in this change set. - const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); - std::set<LLUUID>::const_iterator id_it = changed_items.begin(); - std::set<LLUUID>::const_iterator id_end = changed_items.end(); - LLFolderViewItem* view = NULL; - LLInvFVBridge* bridge = NULL; - for (;id_it != id_end; ++id_it) - { - view = mFolders->getItemByID(*id_it); - if(view) - { - // request refresh on this item (also flags for filtering) - bridge = (LLInvFVBridge*)view->getListener(); - if(bridge) - { // Clear the display name first, so it gets properly re-built during refresh() - bridge->clearDisplayName(); - } - view->refresh(); - } - } - } - if((mask & (LLInventoryObserver::STRUCTURE - | LLInventoryObserver::ADD - | LLInventoryObserver::REMOVE)) != 0) - { - handled = true; - // Record which folders are open by uuid. - LLInventoryModel* model = getModel(); - if (model) - { - const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); - - std::set<LLUUID>::const_iterator id_it = changed_items.begin(); - std::set<LLUUID>::const_iterator id_end = changed_items.end(); - for (;id_it != id_end; ++id_it) - { - // sync view with model - LLInventoryObject* model_item = model->getObject(*id_it); - LLFolderViewItem* view_item = mFolders->getItemByID(*id_it); - - if (model_item) - { - if (!view_item) - { - // this object was just created, need to build a view for it - if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD) - { - llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl; - } - buildNewViews(*id_it); - - // select any newly created object - // that has the auto rename at top of folder - // root set - if(mFolders->getRoot()->needsAutoRename()) - { - setSelection(*id_it, FALSE); - } - } - else - { - // this object was probably moved, check its parent - if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE) - { - llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << llendl; - } - - LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID()); - - // added check against NULL for cases when Inventory panel contains startFolder. - // in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself. - // this check is a fix for bug EXT-1859. - if (NULL != new_parent && view_item->getParentFolder() != new_parent) - { - view_item->getParentFolder()->extractItem(view_item); - view_item->addToFolder(new_parent, mFolders); - } - } - } - else - { - if (view_item) - { - if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE) - { - llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl; - } - // item in view but not model, need to delete view - view_item->destroyView(); - } - else - { - llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl; - } - } - } - } - } - - if (!handled) - { - // it's a small change that only requires a refresh. - // *TODO: figure out a more efficient way to do the refresh - // since it is expensive on large inventories - mFolders->refresh(); - } -} - - -void LLInventoryPanel::rebuildViewsFor(const LLUUID& id) -{ - LLFolderViewItem* old_view = NULL; - - // get old LLFolderViewItem - old_view = mFolders->getItemByID(id); - if (old_view && id.notNull()) - { - old_view->destroyView(); - } - - buildNewViews(id); -} - -void LLInventoryPanel::buildNewViews(const LLUUID& id) -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS); - LLFolderViewItem* itemp = NULL; - LLInventoryObject* objectp = NULL; - - // Don't add the start folder (the inventory panel will show contents - // beginning with the children of the starting folder, excluding the starting folder itself). - if (id != mStartFolderID) - { - objectp = gInventory.getObject(id); - if (objectp) - { - const LLUUID &parent_id = objectp->getParentUUID(); - // If this item's parent is the starting folder, then just add it to the top level (recall that - // the starting folder isn't actually represented in the view, parent_folder would be NULL in - // this case otherwise). - LLFolderViewFolder* parent_folder = (parent_id == mStartFolderID ? - mFolders : (LLFolderViewFolder*)mFolders->getItemByID(parent_id)); - - // This item exists outside the inventory's hierarchy, so don't add it. - if (!parent_folder) - { - return; - } - - if (objectp->getType() <= LLAssetType::AT_NONE || - objectp->getType() >= LLAssetType::AT_COUNT) - { - llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << - ((S32) objectp->getType()) << llendl; - return; - } - - if (objectp->getType() == LLAssetType::AT_CATEGORY && - objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) - { - LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(), - objectp->getType(), - LLInventoryType::IT_CATEGORY, - this, - objectp->getUUID()); - - if (new_listener) - { - LLFolderViewFolder::Params p; - p.name = new_listener->getDisplayName(); - p.icon = new_listener->getIcon(); - p.root = mFolders; - p.listener = new_listener; - LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p); - - folderp->setItemSortOrder(mFolders->getSortOrder()); - itemp = folderp; - } - } - else - { - // Build new view for item - LLInventoryItem* item = (LLInventoryItem*)objectp; - LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(), - item->getActualType(), - item->getInventoryType(), - this, - item->getUUID(), - item->getFlags()); - - if (new_listener) - { - LLFolderViewItem::Params params; - params.name(new_listener->getDisplayName()); - params.icon(new_listener->getIcon()); - params.creation_date(new_listener->getCreationDate()); - params.root(mFolders); - params.listener(new_listener); - params.rect(LLRect (0, 0, 0, 0)); - itemp = LLUICtrlFactory::create<LLFolderViewItem> (params); - } - } - - if (itemp) - { - itemp->addToFolder(parent_folder, mFolders); - } - } - } - - // If this is a folder, add the children of the folder and recursively add any - // child folders. - if ((id == mStartFolderID) || - (objectp && objectp->getType() == LLAssetType::AT_CATEGORY)) - { - LLViewerInventoryCategory::cat_array_t* categories; - LLViewerInventoryItem::item_array_t* items; - - mInventory->lockDirectDescendentArrays(id, categories, items); - if(categories) - { - S32 count = categories->count(); - for(S32 i = 0; i < count; ++i) - { - LLInventoryCategory* cat = categories->get(i); - buildNewViews(cat->getUUID()); - } - } - if(items) - { - S32 count = items->count(); - for(S32 i = 0; i < count; ++i) - { - LLInventoryItem* item = items->get(i); - buildNewViews(item->getUUID()); - } - } - mInventory->unlockDirectDescendentArrays(id); - } -} - -struct LLConfirmPurgeData -{ - LLUUID mID; - LLInventoryModel* mModel; -}; - -class LLIsNotWorn : public LLInventoryCollectFunctor -{ -public: - LLIsNotWorn() {} - virtual ~LLIsNotWorn() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item) - { - return !gAgentWearables.isWearingItem(item->getUUID()); - } -}; - -class LLOpenFolderByID : public LLFolderViewFunctor -{ -public: - LLOpenFolderByID(const LLUUID& id) : mID(id) {} - virtual ~LLOpenFolderByID() {} - virtual void doFolder(LLFolderViewFolder* folder) - { - if (folder->getListener() && folder->getListener()->getUUID() == mID) folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); - } - virtual void doItem(LLFolderViewItem* item) {} -protected: - const LLUUID& mID; -}; - - -void LLInventoryPanel::openSelected() -{ - LLFolderViewItem* folder_item = mFolders->getCurSelectedItem(); - if(!folder_item) return; - LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener(); - if(!bridge) return; - bridge->openItem(); -} - -BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask) -{ - BOOL handled = LLView::handleHover(x, y, mask); - if(handled) - { - ECursorType cursor = getWindow()->getCursor(); - if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW) - { - // replace arrow cursor with arrow and hourglass cursor - getWindow()->setCursor(UI_CURSOR_WORKING); - } - } - else - { - getWindow()->setCursor(UI_CURSOR_ARROW); - } - return TRUE; -} - -BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg) -{ - - BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); - - if (handled) - { - mFolders->setDragAndDropThisFrame(); - } - - return handled; -} - -void LLInventoryPanel::onFocusLost() -{ - // inventory no longer handles cut/copy/paste/delete - if (LLEditMenuHandler::gEditMenuHandler == mFolders) - { - LLEditMenuHandler::gEditMenuHandler = NULL; - } - - LLPanel::onFocusLost(); -} - -void LLInventoryPanel::onFocusReceived() -{ - // inventory now handles cut/copy/paste/delete - LLEditMenuHandler::gEditMenuHandler = mFolders; - - LLPanel::onFocusReceived(); -} - - -void LLInventoryPanel::openAllFolders() -{ - mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); - mFolders->arrangeAll(); -} - -void LLInventoryPanel::openDefaultFolderForType(LLAssetType::EType type) -{ - LLUUID category_id = mInventory->findCategoryUUIDForType(type); - LLOpenFolderByID opener(category_id); - mFolders->applyFunctorRecursively(opener); -} - -void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus) -{ - // Don't select objects in COF (e.g. to prevent refocus when items are worn). - const LLInventoryObject *obj = gInventory.getObject(obj_id); - if (obj && obj->getParentUUID() == LLAppearanceManager::getCOF()) - { - return; - } - mFolders->setSelectionByID(obj_id, take_keyboard_focus); -} - -void LLInventoryPanel::clearSelection() -{ - mFolders->clearSelection(); -} - -void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action) -{ - LLFolderView* fv = getRootFolder(); - if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename - { - fv->setNeedsAutoRename(FALSE); - if (items.size()) // new asset is visible and selected - { - fv->startRenamingSelectedItem(); - } - } - // Seraph - Put determineFolderType in here for ensemble typing? -} - -//---------------------------------------------------------------------------- - -void LLInventoryPanel::doToSelected(const LLSD& userdata) -{ - mFolders->doToSelected(&gInventory, userdata); -} - -void LLInventoryPanel::doCreate(const LLSD& userdata) -{ - menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata); -} - -bool LLInventoryPanel::beginIMSession() -{ - std::set<LLUUID> selected_items; - mFolders->getSelectionList(selected_items); - - std::string name; - static int session_num = 1; - - LLDynamicArray<LLUUID> members; - EInstantMessage type = IM_SESSION_CONFERENCE_START; - - std::set<LLUUID>::const_iterator iter; - for (iter = selected_items.begin(); iter != selected_items.end(); iter++) - { - - LLUUID item = *iter; - LLFolderViewItem* folder_item = mFolders->getItemByID(item); - - if(folder_item) - { - LLFolderViewEventListener* fve_listener = folder_item->getListener(); - if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY)) - { - - LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener(); - if(!bridge) return true; - LLViewerInventoryCategory* cat = bridge->getCategory(); - if(!cat) return true; - name = cat->getName(); - LLUniqueBuddyCollector is_buddy; - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - gInventory.collectDescendentsIf(bridge->getUUID(), - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_buddy); - S32 count = item_array.count(); - if(count > 0) - { - LLFloaterReg::showInstance("communicate"); - // create the session - LLAvatarTracker& at = LLAvatarTracker::instance(); - LLUUID id; - for(S32 i = 0; i < count; ++i) - { - id = item_array.get(i)->getCreatorUUID(); - if(at.isBuddyOnline(id)) - { - members.put(id); - } - } - } - } - else - { - LLFolderViewItem* folder_item = mFolders->getItemByID(item); - if(!folder_item) return true; - LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener(); - - if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD) - { - LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID()); - - if (inv_item) - { - LLAvatarTracker& at = LLAvatarTracker::instance(); - LLUUID id = inv_item->getCreatorUUID(); - - if(at.isBuddyOnline(id)) - { - members.put(id); - } - } - } //if IT_CALLINGCARD - } //if !IT_CATEGORY - } - } //for selected_items - - // the session_id is randomly generated UUID which will be replaced later - // with a server side generated number - - if (name.empty()) - { - name = llformat("Session %d", session_num++); - } - - gIMMgr->addSession(name, type, members[0], members); - - return true; -} - -bool LLInventoryPanel::attachObject(const LLSD& userdata) -{ - std::set<LLUUID> selected_items; - mFolders->getSelectionList(selected_items); - - std::string joint_name = userdata.asString(); - LLVOAvatar *avatarp = static_cast<LLVOAvatar*>(gAgent.getAvatarObject()); - LLViewerJointAttachment* attachmentp = NULL; - for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); - iter != avatarp->mAttachmentPoints.end(); ) - { - LLVOAvatar::attachment_map_t::iterator curiter = iter++; - LLViewerJointAttachment* attachment = curiter->second; - if (attachment->getName() == joint_name) - { - attachmentp = attachment; - break; - } - } - if (attachmentp == NULL) - { - return true; - } - - for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin(); - set_iter != selected_items.end(); - ++set_iter) - { - const LLUUID &id = *set_iter; - LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id); - if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID())) - { - rez_attachment(item, attachmentp); - } - else if(item && item->isComplete()) - { - // must be in library. copy it to our inventory and put it on. - LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp); - copy_inventory_item(gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - } - gFocusMgr.setKeyboardFocus(NULL); - - return true; -} - - -//---------------------------------------------------------------------------- - -// static DEBUG ONLY: -void LLInventoryPanel::dumpSelectionInformation(void* user_data) -{ - LLInventoryPanel* iv = (LLInventoryPanel*)user_data; - iv->mFolders->dumpSelectionInformation(); -} - -BOOL LLInventoryPanel::getSinceLogoff() -{ - return mFolders->getFilter()->isSinceLogoff(); -} - -void example_param_block_usage() -{ - LLInventoryPanel::Params param_block; - param_block.name(std::string("inventory")); - - param_block.sort_order_setting(LLInventoryPanel::RECENTITEMS_SORT_ORDER); - param_block.allow_multi_select(true); - param_block.filter(LLInventoryPanel::Filter() - .sort_order(1) - .types(0xffff0000)); - param_block.inventory(&gInventory); - param_block.has_border(true); - - LLUICtrlFactory::create<LLInventoryPanel>(param_block); - - param_block = LLInventoryPanel::Params(); - param_block.name(std::string("inventory")); - - //LLSD param_block_sd; - //param_block_sd["sort_order_setting"] = LLInventoryPanel::RECENTITEMS_SORT_ORDER; - //param_block_sd["allow_multi_select"] = true; - //param_block_sd["filter"]["sort_order"] = 1; - //param_block_sd["filter"]["types"] = (S32)0xffff0000; - //param_block_sd["has_border"] = true; - - //LLInitParam::LLSDParser(param_block_sd).parse(param_block); - - LLUICtrlFactory::create<LLInventoryPanel>(param_block); -} +/** + * @file llfloaterinventory.cpp + * @brief Implementation of the inventory view and associated stuff. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterinventory.h" + +#include "llagent.h" +#include "llfirstuse.h" +#include "llfloaterreg.h" +#include "llinventorymodel.h" +#include "llpanelmaininventory.h" +#include "llresmgr.h" + +///---------------------------------------------------------------------------- +/// LLFloaterInventory +///---------------------------------------------------------------------------- + +LLFloaterInventory::LLFloaterInventory(const LLSD& key) + : LLFloater(key) +{ +} + +LLFloaterInventory::~LLFloaterInventory() +{ +} + +BOOL LLFloaterInventory::postBuild() +{ + mPanelMainInventory = getChild<LLPanelMainInventory>("Inventory Panel"); + return TRUE; +} + + +void LLFloaterInventory::draw() +{ + if (LLInventoryModel::isEverythingFetched()) + { + updateTitle(); + } + LLFloater::draw(); +} + +void LLFloaterInventory::updateTitle() +{ + LLLocale locale(LLLocale::USER_LOCALE); + std::string item_count_string; + LLResMgr::getInstance()->getIntegerString(item_count_string, gInventory.getItemCount()); + + LLStringUtil::format_map_t string_args; + string_args["[ITEM_COUNT]"] = item_count_string; + string_args["[FILTER]"] = mPanelMainInventory->getFilterText(); + + if (LLInventoryModel::backgroundFetchActive()) + { + setTitle(getString("TitleFetching", string_args)); + } + else + { + setTitle(getString("TitleCompleted", string_args)); + } +} + +void LLFloaterInventory::changed(U32 mask) +{ + updateTitle(); +} + +LLInventoryPanel* LLFloaterInventory::getPanel() +{ + if (mPanelMainInventory) + return mPanelMainInventory->getPanel(); + return NULL; +} + +// static +LLFloaterInventory* LLFloaterInventory::showAgentInventory() +{ + LLFloaterInventory* iv = NULL; + if (!gAgent.cameraMouselook()) + { + iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD()); + } + return iv; +} + +// static +LLFloaterInventory* LLFloaterInventory::getActiveInventory() +{ + LLFloaterInventory* res = NULL; + LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory"); + S32 z_min = S32_MAX; + for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) + { + LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter); + if (iv) + { + S32 z_order = gFloaterView->getZOrder(iv); + if (z_order < z_min) + { + res = iv; + z_min = z_order; + } + } + } + return res; +} + +// static +void LLFloaterInventory::cleanup() +{ + LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory"); + for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end();) + { + LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter++); + if (iv) + { + iv->destroy(); + } + } +} + +void LLFloaterInventory::onOpen(const LLSD& key) +{ + LLFirstUse::useInventory(); +} diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h index 4c9ac5d4c68..f2f2963a333 100644 --- a/indra/newview/llfloaterinventory.h +++ b/indra/newview/llfloaterinventory.h @@ -31,366 +31,54 @@ * $/LicenseInfo$ */ -#ifndef LL_LLINVENTORYVIEW_H -#define LL_LLINVENTORYVIEW_H +#ifndef LL_LLFLOATERINVENTORY_H +#define LL_LLFLOATERINVENTORY_H -#include "llassetstorage.h" -#include "lldarray.h" #include "llfloater.h" -#include "llinventory.h" -#include "llinventoryfilter.h" -#include "llfolderview.h" -#include "llinventorymodel.h" -#include "lluictrlfactory.h" -#include <set> +class LLInventoryPanel; +class LLPanelMainInventory; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLFloaterInventory // -// This is the agent inventory _floater_. -// It deals with the buttons and views used to navigate as -// well as controls the behavior of the overall object. +// This deals with the buttons and views used to navigate as +// well as controlling the behavior of the overall object. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLFolderViewItem; -class LLInventoryFilter; -class LLInventoryModel; -class LLInvFVBridge; -class LLInventoryFVBridgeBuilder; -class LLMenuBarGL; -class LLCheckBoxCtrl; -class LLSpinCtrl; -class LLScrollContainer; -class LLTextBox; -class LLIconCtrl; -class LLSaveFolderState; -class LLFilterEditor; -class LLTabContainer; - -class LLInventoryPanel : public LLPanel +class LLFloaterInventory : public LLFloater { -public: - static const std::string DEFAULT_SORT_ORDER; - static const std::string RECENTITEMS_SORT_ORDER; - static const std::string INHERIT_SORT_ORDER; - - struct Filter : public LLInitParam::Block<Filter> - { - Optional<U32> sort_order; - Optional<U32> types; - Optional<std::string> search_string; - - Filter() - : sort_order("sort_order"), - types("types", 0xffffffff), - search_string("search_string") - {} - }; - - struct Params - : public LLInitParam::Block<Params, LLPanel::Params> - { - Optional<std::string> sort_order_setting; - Optional<LLInventoryModel*> inventory; - Optional<bool> allow_multi_select; - Optional<Filter> filter; - Optional<std::string> start_folder; - - Params() - : sort_order_setting("sort_order_setting"), - inventory("", &gInventory), - allow_multi_select("allow_multi_select", true), - filter("filter"), - start_folder("start_folder") - {} - }; - -protected: - LLInventoryPanel(const Params&); - friend class LLUICtrlFactory; - -public: - virtual ~LLInventoryPanel(); - - LLInventoryModel* getModel() { return mInventory; } - - BOOL postBuild(); - - // LLView methods - void draw(); - BOOL handleHover(S32 x, S32 y, MASK mask); - BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg); - // LLUICtrl methods - /*virtual*/ void onFocusLost(); - /*virtual*/ void onFocusReceived(); - - // Call this method to set the selection. - void openAllFolders(); - void openDefaultFolderForType(LLAssetType::EType); - void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus); - void setSelectCallback(const LLFolderView::signal_t::slot_type& cb) { if (mFolders) mFolders->setSelectCallback(cb); } - void clearSelection(); - LLInventoryFilter* getFilter() { return mFolders->getFilter(); } - void setFilterTypes(U64 filter, BOOL filter_for_categories = FALSE); // if filter_for_categories is true, operate on folder preferred asset type - U32 getFilterTypes() const { return mFolders->getFilterTypes(); } - void setFilterPermMask(PermissionMask filter_perm_mask); - U32 getFilterPermMask() const { return mFolders->getFilterPermissions(); } - void setFilterSubString(const std::string& string); - const std::string getFilterSubString() { return mFolders->getFilterSubString(); } - void setSortOrder(U32 order); - U32 getSortOrder() { return mFolders->getSortOrder(); } - void setSinceLogoff(BOOL sl); - void setHoursAgo(U32 hours); - BOOL getSinceLogoff(); - - void setShowFolderState(LLInventoryFilter::EFolderShow show); - LLInventoryFilter::EFolderShow getShowFolderState(); - void setAllowMultiSelect(BOOL allow) { mFolders->setAllowMultiSelect(allow); } - // This method is called when something has changed about the inventory. - void modelChanged(U32 mask); - LLFolderView* getRootFolder() { return mFolders; } - LLScrollContainer* getScrollableContainer() { return mScroller; } - - void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); - - // Callbacks - void doToSelected(const LLSD& userdata); - void doCreate(const LLSD& userdata); - bool beginIMSession(); - bool attachObject(const LLSD& userdata); - - // DEBUG ONLY: - static void dumpSelectionInformation(void* user_data); - - void openSelected(); - void unSelectAll() { mFolders->setSelection(NULL, FALSE, FALSE); } - -protected: - // Given the id and the parent, build all of the folder views. - void rebuildViewsFor(const LLUUID& id); - virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719 - -protected: - LLInventoryModel* mInventory; - LLInventoryObserver* mInventoryObserver; - BOOL mAllowMultiSelect; - std::string mSortOrderSetting; - -//private: // Can not make these private - needed by llinventorysubtreepanel - LLFolderView* mFolders; - std::string mStartFolderString; - - /** - * Contains UUID of Inventory item from which hierarchy should be built. - * Can be set with the "start_folder" xml property. - * Default is LLUUID::null that means total Inventory hierarchy. - */ - LLUUID mStartFolderID; - LLScrollContainer* mScroller; - bool mHasInventoryConnection; - - /** - * Flag specified if default inventory hierarchy should be created in postBuild() - */ - bool mBuildDefaultHierarchy; - - LLUUID mRootInventoryItemUUID; - - /** - * Pointer to LLInventoryFVBridgeBuilder. - * - * It is set in LLInventoryPanel's constructor and can be overridden in derived classes with - * another implementation. - * Take into account it will not be deleted by LLInventoryPanel itself. - */ - const LLInventoryFVBridgeBuilder* mInvFVBridgeBuilder; - -}; - -class LLFloaterInventory; - -class LLFloaterInventoryFinder : public LLFloater -{ -public: - LLFloaterInventoryFinder( LLFloaterInventory* inventory_view); - virtual void draw(); - /*virtual*/ BOOL postBuild(); - void changeFilter(LLInventoryFilter* filter); - void updateElementsFromFilter(); - BOOL getCheckShowEmpty(); - BOOL getCheckSinceLogoff(); - - static void onTimeAgo(LLUICtrl*, void *); - static void onCheckSinceLogoff(LLUICtrl*, void *); - static void onCloseBtn(void* user_data); - static void selectAllTypes(void* user_data); - static void selectNoTypes(void* user_data); - -protected: - LLFloaterInventory* mFloaterInventory; - LLSpinCtrl* mSpinSinceDays; - LLSpinCtrl* mSpinSinceHours; - LLInventoryFilter* mFilter; -}; - -class LLFloaterInventory : public LLFloater, LLInventoryObserver -{ -friend class LLFloaterInventoryFinder; - public: LLFloaterInventory(const LLSD& key); ~LLFloaterInventory(); - /*virtual*/ void changed(U32 mask); - - BOOL postBuild(); - - // - // Misc functions - // - void setFilterTextFromFilter() { mFilterText = mActivePanel->getFilter()->getFilterText(); } - void startSearch(); - - // This method makes sure that an inventory view exists, is - // visible, and has focus. The view chosen is returned. - static LLFloaterInventory* showAgentInventory(); + BOOL postBuild(); // Return the active inventory view if there is one. Active is // defined as the inventory that is the closest to the front, and // is visible. static LLFloaterInventory* getActiveInventory(); - // This method calls showAgentInventory() if no views are visible, - // or hides/destroyes them all if any are visible. - static void toggleVisibility(); - static void toggleVisibility(void*) { toggleVisibility(); } + // This method makes sure that an inventory view exists, is + // visible, and has focus. The view chosen is returned. + static LLFloaterInventory* showAgentInventory(); // Final cleanup, destroy all open inventory views. static void cleanup(); - // LLView & LLFloater functionality - virtual void onOpen(const LLSD& key); - virtual void draw(); - virtual BOOL handleKeyHere(KEY key, MASK mask); - - BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg); - - - LLInventoryPanel* getPanel() { return mActivePanel; } - LLInventoryPanel* getActivePanel() { return mActivePanel; } - - static BOOL filtersVisible(void* user_data); - void onClearSearch(); - static void onFoldersByName(void *user_data); - static BOOL checkFoldersByName(void *user_data); - void onFilterEdit(const std::string& search_string ); - static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward); - void onFilterSelected(); - - const std::string getFilterSubString() { return mActivePanel->getFilterSubString(); } - void setFilterSubString(const std::string& string) { mActivePanel->setFilterSubString(string); } - - // menu callbacks - void doToSelected(const LLSD& userdata); - void closeAllFolders(); - void doCreate(const LLSD& userdata); - void resetFilters(); - void setSortBy(const LLSD& userdata); - - // HACK: Until we can route this info through the instant message hierarchy - static BOOL sWearNewClothing; - static LLUUID sWearNewClothingTransactionID; // wear all clothing in this transaction - - void toggleFindOptions(); - - LLFloaterInventoryFinder* getFinder() { return (LLFloaterInventoryFinder*)mFinderHandle.get(); } + // Inherited functionality + /*virtual*/ void changed(U32 mask); + /*virtual*/ void draw(); + /*virtual*/ void onOpen(const LLSD& key); + LLInventoryPanel* getPanel(); protected: - LLFilterEditor* mFilterEditor; - LLTabContainer* mFilterTabs; - LLHandle<LLFloater> mFinderHandle; - LLInventoryPanel* mActivePanel; - LLSaveFolderState* mSavedFolderState; - - std::string mFilterText; - -private: void updateTitle(); +private: + LLPanelMainInventory* mPanelMainInventory; }; -class LLSelectFirstFilteredItem : public LLFolderViewFunctor -{ -public: - LLSelectFirstFilteredItem() : mItemSelected(FALSE) {} - virtual ~LLSelectFirstFilteredItem() {} - virtual void doFolder(LLFolderViewFolder* folder); - virtual void doItem(LLFolderViewItem* item); - BOOL wasItemSelected() { return mItemSelected; } -protected: - BOOL mItemSelected; -}; - -class LLOpenFilteredFolders : public LLFolderViewFunctor -{ -public: - LLOpenFilteredFolders() {} - virtual ~LLOpenFilteredFolders() {} - virtual void doFolder(LLFolderViewFolder* folder); - virtual void doItem(LLFolderViewItem* item); -}; - -class LLSaveFolderState : public LLFolderViewFunctor -{ -public: - LLSaveFolderState() : mApply(FALSE) {} - virtual ~LLSaveFolderState() {} - virtual void doFolder(LLFolderViewFolder* folder); - virtual void doItem(LLFolderViewItem* item) {} - void setApply(BOOL apply); - void clearOpenFolders() { mOpenFolders.clear(); } -protected: - std::set<LLUUID> mOpenFolders; - BOOL mApply; -}; - -class LLOpenFoldersWithSelection : public LLFolderViewFunctor -{ -public: - LLOpenFoldersWithSelection() {} - virtual ~LLOpenFoldersWithSelection() {} - virtual void doFolder(LLFolderViewFolder* folder); - virtual void doItem(LLFolderViewItem* item); -}; - -///---------------------------------------------------------------------------- -/// Function declarations, constants, enums, and typedefs -///---------------------------------------------------------------------------- - -// useful functions with the inventory view - -class LLInventoryCategory; -class LLInventoryItem; - -const std::string& get_item_icon_name(LLAssetType::EType asset_type, - LLInventoryType::EType inventory_type, - U32 attachment_point, - BOOL item_is_multi ); - -LLUIImagePtr get_item_icon(LLAssetType::EType asset_type, - LLInventoryType::EType inventory_type, - U32 attachment_point, - BOOL item_is_multi ); - -#endif // LL_LLINVENTORYVIEW_H +#endif // LL_LLFLOATERINVENTORY_H diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index aa82dc34b74..b6ec0868cfd 100644 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -32,7 +32,7 @@ /* * Shows the contents of an object. - * A floater wrapper for llpanelinventory + * A floater wrapper for LLPanelObjectInventory */ #include "llviewerprecompiledheaders.h" @@ -47,7 +47,8 @@ #include "llinventorybridge.h" #include "llfloaterinventory.h" #include "llinventorymodel.h" -#include "llpanelinventory.h" +#include "llinventorypanel.h" +#include "llpanelobjectinventory.h" #include "llfloaterreg.h" #include "llselectmgr.h" #include "lluiconstants.h" @@ -58,7 +59,7 @@ LLFloaterOpenObject::LLFloaterOpenObject(const LLSD& key) : LLFloater(key), - mPanelInventory(NULL), + mPanelInventoryObject(NULL), mDirty(TRUE) { // LLUICtrlFactory::getInstance()->buildFloater(this,"floater_openobject.xml"); @@ -74,7 +75,7 @@ LLFloaterOpenObject::~LLFloaterOpenObject() BOOL LLFloaterOpenObject::postBuild() { childSetTextArg("object_name", "[DESC]", std::string("Object") ); // *Note: probably do not want to translate this - mPanelInventory = getChild<LLPanelInventory>("object_contents"); + mPanelInventoryObject = getChild<LLPanelObjectInventory>("object_contents"); return TRUE; } @@ -96,7 +97,7 @@ void LLFloaterOpenObject::onOpen(const LLSD& key) } void LLFloaterOpenObject::refresh() { - mPanelInventory->refresh(); + mPanelInventoryObject->refresh(); std::string name; BOOL enabled; diff --git a/indra/newview/llfloateropenobject.h b/indra/newview/llfloateropenobject.h index a61cc04941f..10d96b7ea3a 100644 --- a/indra/newview/llfloateropenobject.h +++ b/indra/newview/llfloateropenobject.h @@ -41,7 +41,7 @@ #include "llfloater.h" class LLObjectSelection; -class LLPanelInventory; +class LLPanelObjectInventory; class LLFloaterOpenObject : public LLFloater @@ -77,7 +77,7 @@ class LLFloaterOpenObject protected: - LLPanelInventory* mPanelInventory; + LLPanelObjectInventory* mPanelInventoryObject; LLSafeHandle<LLObjectSelection> mObjectSelection; BOOL mDirty; }; diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 3bec6f9e734..9c13e90d2cb 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -53,7 +53,7 @@ #include "llpanelcontents.h" #include "llpanelface.h" #include "llpanelland.h" -#include "llpanelinventory.h" +#include "llpanelobjectinventory.h" #include "llpanelobject.h" #include "llpanelvolume.h" #include "llpanelpermissions.h" diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index de18e747528..a963c96da43 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -38,6 +38,7 @@ #include "llinventorybridge.h" #include "llinventoryclipboard.h" // *TODO: remove this once hack below gone. #include "llinventoryfilter.h" +#include "llinventoryfunctions.h" #include "llfoldertype.h" #include "llfloaterinventory.h"// hacked in for the bonus context menu items. #include "llkeyboard.h" diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 77ee90f6812..fdbbf2f189f 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -70,6 +70,7 @@ #include "llpanelimcontrolpanel.h" #include "llrecentpeople.h" #include "llresmgr.h" +#include "lltooldraganddrop.h" #include "lltrans.h" #include "lltabcontainer.h" #include "llviewertexteditor.h" diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 3aa35d98f83..55e102b8f34 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1,5139 +1,5149 @@ -/** - * @file llinventorybridge.cpp - * @brief Implementation of the Inventory-Folder-View-Bridge classes. - * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include <utility> // for std::pair<> - -#include "llfloaterinventory.h" -#include "llinventorybridge.h" - -#include "message.h" - -#include "llagent.h" -#include "llagentwearables.h" -#include "llcallingcard.h" -#include "llcheckboxctrl.h" // for radio buttons -#include "llfloaterreg.h" -#include "llradiogroup.h" -#include "llspinctrl.h" -#include "lltextbox.h" -#include "llui.h" - -#include "llviewercontrol.h" -#include "llfirstuse.h" -#include "llfoldertype.h" -#include "llfloaterchat.h" -#include "llfloatercustomize.h" -#include "llfloaterproperties.h" -#include "llfloaterworldmap.h" -#include "llfocusmgr.h" -#include "llfolderview.h" -#include "llfriendcard.h" -#include "llavataractions.h" -#include "llgesturemgr.h" -#include "lliconctrl.h" -#include "llinventorymodel.h" -#include "llinventoryclipboard.h" -#include "lllineeditor.h" -#include "llmenugl.h" -#include "llpreviewanim.h" -#include "llpreviewgesture.h" -#include "llpreviewnotecard.h" -#include "llpreviewscript.h" -#include "llpreviewsound.h" -#include "llpreviewtexture.h" -#include "llresmgr.h" -#include "llscrollcontainer.h" -#include "llimview.h" -#include "lltooldraganddrop.h" -#include "llviewertexturelist.h" -#include "llviewerinventory.h" -#include "llviewerobjectlist.h" -#include "llviewerwindow.h" -#include "llvoavatar.h" -#include "llwearable.h" -#include "llwearablelist.h" -#include "llviewermessage.h" -#include "llviewerregion.h" -#include "llvoavatarself.h" -#include "lltabcontainer.h" -#include "lluictrlfactory.h" -#include "llselectmgr.h" -#include "llsidetray.h" -#include "llfloateropenobject.h" -#include "lltrans.h" -#include "llappearancemgr.h" - -using namespace LLOldEvents; - -// Helpers -// bug in busy count inc/dec right now, logic is complex... do we really need it? -void inc_busy_count() -{ -// gViewerWindow->getWindow()->incBusyCount(); -// check balance of these calls if this code is changed to ever actually -// *do* something! -} -void dec_busy_count() -{ -// gViewerWindow->getWindow()->decBusyCount(); -// check balance of these calls if this code is changed to ever actually -// *do* something! -} - -// Function declarations -void wear_add_inventory_item_on_avatar(LLInventoryItem* item); -void remove_inventory_category_from_avatar(LLInventoryCategory* category); -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id); -bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*); -bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response); - -std::string ICON_NAME[ICON_NAME_COUNT] = -{ - "Inv_Texture", - "Inv_Sound", - "Inv_CallingCard", - "Inv_CallingCard", - "Inv_Landmark", - "Inv_Landmark", - "Inv_Script", - "Inv_Clothing", - "Inv_Object", - "Inv_Object", - "Inv_Notecard", - "Inv_Skin", - "Inv_Snapshot", - - "Inv_BodyShape", - "Inv_Skin", - "Inv_Hair", - "Inv_Eye", - "Inv_Shirt", - "Inv_Pants", - "Inv_Shoe", - "Inv_Socks", - "Inv_Jacket", - "Inv_Gloves", - "Inv_Undershirt", - "Inv_Underpants", - "Inv_Skirt", - "inv_item_alpha.tga", - "inv_item_tattoo.tga", - - "Inv_Animation", - "Inv_Gesture", - - "inv_item_linkitem.tga", - "inv_item_linkfolder.tga" -}; - - -// +=================================================+ -// | LLInventoryPanelObserver | -// +=================================================+ -void LLInventoryPanelObserver::changed(U32 mask) -{ - mIP->modelChanged(mask); -} - - -// +=================================================+ -// | LLInvFVBridge | -// +=================================================+ - -LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : -mUUID(uuid), mInvType(LLInventoryType::IT_NONE) -{ - mInventoryPanel = inventory->getHandle(); -} - -const std::string& LLInvFVBridge::getName() const -{ - LLInventoryObject* obj = getInventoryObject(); - if(obj) - { - return obj->getName(); - } - return LLStringUtil::null; -} - -const std::string& LLInvFVBridge::getDisplayName() const -{ - return getName(); -} - -// Folders have full perms -PermissionMask LLInvFVBridge::getPermissionMask() const -{ - - return PERM_ALL; -} - -// virtual -LLAssetType::EType LLInvFVBridge::getPreferredType() const -{ - return LLAssetType::AT_NONE; -} - - -// Folders don't have creation dates. -time_t LLInvFVBridge::getCreationDate() const -{ - return 0; -} - -// Can be destoryed (or moved to trash) -BOOL LLInvFVBridge::isItemRemovable() -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - if(model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) - { - return TRUE; - } - return FALSE; -} - -// Sends an update to all link items that point to the base item. -void LLInvFVBridge::renameLinkedItems(const LLUUID &item_id, const std::string& new_name) -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - - LLInventoryItem* itemp = model->getItem(mUUID); - if (!itemp) return; - - if (itemp->getIsLinkType()) - { - return; - } - - LLInventoryModel::item_array_t item_array = model->collectLinkedItems(item_id); - for (LLInventoryModel::item_array_t::iterator iter = item_array.begin(); - iter != item_array.end(); - iter++) - { - LLViewerInventoryItem *linked_item = (*iter); - if (linked_item->getUUID() == item_id) continue; - - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(linked_item); - new_item->rename(new_name); - new_item->updateServer(FALSE); - model->updateItem(new_item); - // model->addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID()); - } - model->notifyObservers(); -} - -// Can be moved to another folder -BOOL LLInvFVBridge::isItemMovable() const -{ - return TRUE; -} - -/*virtual*/ -/** - * @brief Adds this item into clipboard storage - */ -void LLInvFVBridge::cutToClipboard() -{ - if(isItemMovable()) - { - LLInventoryClipboard::instance().cut(mUUID); - } -} -// *TODO: make sure this does the right thing -void LLInvFVBridge::showProperties() -{ - LLFloaterReg::showInstance("properties", mUUID); -} - -void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) -{ - // Deactivate gestures when moving them into Trash - LLInvFVBridge* bridge; - LLInventoryModel* model = getInventoryModel(); - LLViewerInventoryItem* item = NULL; - LLViewerInventoryCategory* cat = NULL; - LLInventoryModel::cat_array_t descendent_categories; - LLInventoryModel::item_array_t descendent_items; - S32 count = batch.count(); - S32 i,j; - for(i = 0; i < count; ++i) - { - bridge = (LLInvFVBridge*)(batch.get(i)); - if(!bridge || !bridge->isItemRemovable()) continue; - item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); - if (item) - { - if(LLAssetType::AT_GESTURE == item->getType()) - { - LLGestureManager::instance().deactivateGesture(item->getUUID()); - } - } - } - for(i = 0; i < count; ++i) - { - bridge = (LLInvFVBridge*)(batch.get(i)); - if(!bridge || !bridge->isItemRemovable()) continue; - cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); - if (cat) - { - gInventory.collectDescendents( cat->getUUID(), descendent_categories, descendent_items, FALSE ); - for (j=0; j<descendent_items.count(); j++) - { - if(LLAssetType::AT_GESTURE == descendent_items[j]->getType()) - { - LLGestureManager::instance().deactivateGesture(descendent_items[j]->getUUID()); - } - } - } - } - removeBatchNoCheck(batch); -} - -void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch) -{ - // this method moves a bunch of items and folders to the trash. As - // per design guidelines for the inventory model, the message is - // built and the accounting is performed first. After all of that, - // we call LLInventoryModel::moveObject() to move everything - // around. - LLInvFVBridge* bridge; - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLMessageSystem* msg = gMessageSystem; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - LLViewerInventoryItem* item = NULL; - LLViewerInventoryCategory* cat = NULL; - std::vector<LLUUID> move_ids; - LLInventoryModel::update_map_t update; - bool start_new_message = true; - S32 count = batch.count(); - S32 i; - for(i = 0; i < count; ++i) - { - bridge = (LLInvFVBridge*)(batch.get(i)); - if(!bridge || !bridge->isItemRemovable()) continue; - item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); - if(item) - { - if(item->getParentUUID() == trash_id) continue; - move_ids.push_back(item->getUUID()); - LLPreview::hide(item->getUUID()); - --update[item->getParentUUID()]; - ++update[trash_id]; - if(start_new_message) - { - start_new_message = false; - msg->newMessageFast(_PREHASH_MoveInventoryItem); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addBOOLFast(_PREHASH_Stamp, TRUE); - } - msg->nextBlockFast(_PREHASH_InventoryData); - msg->addUUIDFast(_PREHASH_ItemID, item->getUUID()); - msg->addUUIDFast(_PREHASH_FolderID, trash_id); - msg->addString("NewName", NULL); - if(msg->isSendFullFast(_PREHASH_InventoryData)) - { - start_new_message = true; - gAgent.sendReliableMessage(); - gInventory.accountForUpdate(update); - update.clear(); - } - } - } - if(!start_new_message) - { - start_new_message = true; - gAgent.sendReliableMessage(); - gInventory.accountForUpdate(update); - update.clear(); - } - for(i = 0; i < count; ++i) - { - bridge = (LLInvFVBridge*)(batch.get(i)); - if(!bridge || !bridge->isItemRemovable()) continue; - cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); - if(cat) - { - if(cat->getParentUUID() == trash_id) continue; - move_ids.push_back(cat->getUUID()); - --update[cat->getParentUUID()]; - ++update[trash_id]; - if(start_new_message) - { - start_new_message = false; - msg->newMessageFast(_PREHASH_MoveInventoryFolder); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addBOOL("Stamp", TRUE); - } - msg->nextBlockFast(_PREHASH_InventoryData); - msg->addUUIDFast(_PREHASH_FolderID, cat->getUUID()); - msg->addUUIDFast(_PREHASH_ParentID, trash_id); - if(msg->isSendFullFast(_PREHASH_InventoryData)) - { - start_new_message = true; - gAgent.sendReliableMessage(); - gInventory.accountForUpdate(update); - update.clear(); - } - } - } - if(!start_new_message) - { - gAgent.sendReliableMessage(); - gInventory.accountForUpdate(update); - } - - // move everything. - std::vector<LLUUID>::iterator it = move_ids.begin(); - std::vector<LLUUID>::iterator end = move_ids.end(); - for(; it != end; ++it) - { - gInventory.moveObject((*it), trash_id); - } - - // notify inventory observers. - model->notifyObservers(); -} - -BOOL LLInvFVBridge::isClipboardPasteable() const -{ - if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) - { - return FALSE; - } - LLInventoryModel* model = getInventoryModel(); - if (!model) - { - return FALSE; - } - - const LLUUID &agent_id = gAgent.getID(); - - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - for(S32 i = 0; i < count; i++) - { - const LLUUID &item_id = objects.get(i); - - // Can't paste folders - const LLInventoryCategory *cat = model->getCategory(item_id); - if (cat) - { - return FALSE; - } - - const LLInventoryItem *item = model->getItem(item_id); - if (item) - { - if (!item->getPermissions().allowCopyBy(agent_id)) - { - return FALSE; - } - } - } - return TRUE; -} - -BOOL LLInvFVBridge::isClipboardPasteableAsLink() const -{ - if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) - { - return FALSE; - } - const LLInventoryModel* model = getInventoryModel(); - if (!model) - { - return FALSE; - } - - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - for(S32 i = 0; i < count; i++) - { - const LLInventoryItem *item = model->getItem(objects.get(i)); - if (item) - { - if (!LLAssetType::lookupCanLink(item->getActualType())) - { - return FALSE; - } - } - const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i)); - if (cat && !LLAssetType::lookupCanLink(cat->getPreferredType())) - { - return FALSE; - } - } - return TRUE; -} - -void hideContextEntries(LLMenuGL& menu, - const std::vector<std::string> &entries_to_show, - const std::vector<std::string> &disabled_entries) -{ - const LLView::child_list_t *list = menu.getChildList(); - - LLView::child_list_t::const_iterator itor; - for (itor = list->begin(); itor != list->end(); ++itor) - { - std::string name = (*itor)->getName(); - - // descend into split menus: - LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(*itor); - if ((name == "More") && branchp) - { - hideContextEntries(*branchp->getBranch(), entries_to_show, disabled_entries); - } - - - bool found = false; - std::vector<std::string>::const_iterator itor2; - for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2) - { - if (*itor2 == name) - { - found = true; - } - } - if (!found) - { - (*itor)->setVisible(FALSE); - } - else - { - for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2) - { - if (*itor2 == name) - { - (*itor)->setEnabled(FALSE); - } - } - } - } -} - -// Helper for commonly-used entries -void LLInvFVBridge::getClipboardEntries(bool show_asset_id, - std::vector<std::string> &items, - std::vector<std::string> &disabled_items, U32 flags) -{ - items.push_back(std::string("Rename")); - if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Rename")); - } - - if (show_asset_id) - { - items.push_back(std::string("Copy Asset UUID")); - if ( (! ( isItemPermissive() || gAgent.isGodlike() ) ) - || (flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Copy Asset UUID")); - } - } - - items.push_back(std::string("Copy Separator")); - - items.push_back(std::string("Copy")); - if (!isItemCopyable()) - { - disabled_items.push_back(std::string("Copy")); - } - - items.push_back(std::string("Paste")); - if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Paste")); - } - - items.push_back(std::string("Paste As Link")); - if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Paste As Link")); - } - items.push_back(std::string("Paste Separator")); - - items.push_back(std::string("Delete")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Delete")); - } -} - -void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("PurgeItem")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("PurgeItem")); - } - items.push_back(std::string("RestoreItem")); - } - else - { - items.push_back(std::string("Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - hideContextEntries(menu, items, disabled_items); -} - -// *TODO: remove this -BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const -{ - BOOL rv = FALSE; - - const LLInventoryObject* obj = getInventoryObject(); - - if(obj) - { - *type = LLAssetType::lookupDragAndDropType(obj->getActualType()); - if(*type == DAD_NONE) - { - return FALSE; - } - - *id = obj->getUUID(); - //object_ids.put(obj->getUUID()); - - if (*type == DAD_CATEGORY) - { - gInventory.startBackgroundFetch(obj->getUUID()); - } - - rv = TRUE; - } - - return rv; -} - -LLInventoryObject* LLInvFVBridge::getInventoryObject() const -{ - LLInventoryObject* obj = NULL; - LLInventoryModel* model = getInventoryModel(); - if(model) - { - obj = (LLInventoryObject*)model->getObject(mUUID); - } - return obj; -} - -LLInventoryModel* LLInvFVBridge::getInventoryModel() const -{ - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - return panel ? panel->getModel() : NULL; -} - -BOOL LLInvFVBridge::isInTrash() const -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - return model->isObjectDescendentOf(mUUID, trash_id); -} - -BOOL LLInvFVBridge::isLinkedObjectInTrash() const -{ - if (isInTrash()) return TRUE; - - const LLInventoryObject *obj = getInventoryObject(); - if (obj && obj->getIsLinkType()) - { - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id); - } - return FALSE; -} - -BOOL LLInvFVBridge::isAgentInventory() const -{ - const LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - if(gInventory.getRootFolderID() == mUUID) return TRUE; - return model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); -} - -BOOL LLInvFVBridge::isCOFFolder() const -{ - const LLInventoryModel* model = getInventoryModel(); - if(!model) return TRUE; - const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); - if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id)) - { - return TRUE; - } - return FALSE; -} - -BOOL LLInvFVBridge::isItemPermissive() const -{ - return FALSE; -} - -// static -void LLInvFVBridge::changeItemParent(LLInventoryModel* model, - LLViewerInventoryItem* item, - const LLUUID& new_parent, - BOOL restamp) -{ - if(item->getParentUUID() != new_parent) - { - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->setParent(new_parent); - new_item->updateParentOnServer(restamp); - model->updateItem(new_item); - model->notifyObservers(); - } -} - -// static -void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model, - LLViewerInventoryCategory* cat, - const LLUUID& new_parent, - BOOL restamp) -{ - if(cat->getParentUUID() != new_parent) - { - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - - LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); - new_cat->setParent(new_parent); - new_cat->updateParentOnServer(restamp); - model->updateCategory(new_cat); - model->notifyObservers(); - } -} - - -const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type) -{ - const std::string rv= LLInventoryType::lookup(inv_type); - if(rv.empty()) - { - return std::string("<invalid>"); - } - return rv; -} - -LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, - LLAssetType::EType actual_asset_type, - LLInventoryType::EType inv_type, - LLInventoryPanel* inventory, - const LLUUID& uuid, - U32 flags) -{ - LLInvFVBridge* new_listener = NULL; - switch(asset_type) - { - case LLAssetType::AT_TEXTURE: - if(!(inv_type == LLInventoryType::IT_TEXTURE || inv_type == LLInventoryType::IT_SNAPSHOT)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLTextureBridge(inventory, uuid, inv_type); - break; - - case LLAssetType::AT_SOUND: - if(!(inv_type == LLInventoryType::IT_SOUND)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLSoundBridge(inventory, uuid); - break; - - case LLAssetType::AT_LANDMARK: - if(!(inv_type == LLInventoryType::IT_LANDMARK)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLLandmarkBridge(inventory, uuid, flags); - break; - - case LLAssetType::AT_CALLINGCARD: - if(!(inv_type == LLInventoryType::IT_CALLINGCARD)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLCallingCardBridge(inventory, uuid); - break; - - case LLAssetType::AT_SCRIPT: - if(!(inv_type == LLInventoryType::IT_LSL)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLScriptBridge(inventory, uuid); - break; - - case LLAssetType::AT_OBJECT: - if(!(inv_type == LLInventoryType::IT_OBJECT || inv_type == LLInventoryType::IT_ATTACHMENT)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLObjectBridge(inventory, uuid, inv_type, flags); - break; - - case LLAssetType::AT_NOTECARD: - if(!(inv_type == LLInventoryType::IT_NOTECARD)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLNotecardBridge(inventory, uuid); - break; - - case LLAssetType::AT_ANIMATION: - if(!(inv_type == LLInventoryType::IT_ANIMATION)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLAnimationBridge(inventory, uuid); - break; - - case LLAssetType::AT_GESTURE: - if(!(inv_type == LLInventoryType::IT_GESTURE)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLGestureBridge(inventory, uuid); - break; - - case LLAssetType::AT_LSL_TEXT: - if(!(inv_type == LLInventoryType::IT_LSL)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLLSLTextBridge(inventory, uuid); - break; - - case LLAssetType::AT_CLOTHING: - case LLAssetType::AT_BODYPART: - if(!(inv_type == LLInventoryType::IT_WEARABLE)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags); - break; - case LLAssetType::AT_CATEGORY: - case LLAssetType::AT_ROOT_CATEGORY: - if (actual_asset_type == LLAssetType::AT_LINK_FOLDER) - { - // Create a link folder handler instead. - new_listener = new LLLinkFolderBridge(inventory, uuid); - break; - } - new_listener = new LLFolderBridge(inventory, uuid); - break; - case LLAssetType::AT_LINK: - // Only should happen for broken links. - new_listener = new LLLinkItemBridge(inventory, uuid); - break; - case LLAssetType::AT_LINK_FOLDER: - // Only should happen for broken links. - new_listener = new LLLinkItemBridge(inventory, uuid); - break; - default: - llinfos << "Unhandled asset type (llassetstorage.h): " - << (S32)asset_type << llendl; - break; - } - - if (new_listener) - { - new_listener->mInvType = inv_type; - } - - return new_listener; -} - -void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid) -{ - LLInventoryCategory* cat = model->getCategory(uuid); - if (cat) - { - model->purgeDescendentsOf(uuid); - model->notifyObservers(); - } - LLInventoryObject* obj = model->getObject(uuid); - if (obj) - { - model->purgeObject(uuid); - model->notifyObservers(); - } -} - -// +=================================================+ -// | InventoryFVBridgeBuilder | -// +=================================================+ -LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset_type, - LLAssetType::EType actual_asset_type, - LLInventoryType::EType inv_type, - LLInventoryPanel* inventory, - const LLUUID& uuid, - U32 flags /* = 0x00 */) const -{ - return LLInvFVBridge::createBridge(asset_type, - actual_asset_type, - inv_type, - inventory, - uuid, - flags); -} - -// +=================================================+ -// | LLItemBridge | -// +=================================================+ - -void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("goto" == action) - { - gotoItem(folder); - } - if ("open" == action) - { - openItem(); - return; - } - else if ("properties" == action) - { - showProperties(); - return; - } - else if ("purge" == action) - { - purgeItem(model, mUUID); - return; - } - else if ("restoreToWorld" == action) - { - restoreToWorld(); - return; - } - else if ("restore" == action) - { - restoreItem(); - return; - } - else if ("copy_uuid" == action) - { - // Single item only - LLInventoryItem* item = model->getItem(mUUID); - if(!item) return; - LLUUID asset_id = item->getAssetUUID(); - std::string buffer; - asset_id.toString(buffer); - - gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer)); - return; - } - else if ("copy" == action) - { - copyToClipboard(); - return; - } - else if ("paste" == action) - { - // Single item only - LLInventoryItem* itemp = model->getItem(mUUID); - if (!itemp) return; - - LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); - if (!folder_view_itemp) return; - - folder_view_itemp->getListener()->pasteFromClipboard(); - return; - } - else if ("paste_link" == action) - { - // Single item only - LLInventoryItem* itemp = model->getItem(mUUID); - if (!itemp) return; - - LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); - if (!folder_view_itemp) return; - - folder_view_itemp->getListener()->pasteLinkFromClipboard(); - return; - } -} - -void LLItemBridge::selectItem() -{ - LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); - if(item && !item->isComplete()) - { - item->fetchFromServer(); - } -} - -void LLItemBridge::restoreItem() -{ - LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); - if(item) - { - LLInventoryModel* model = getInventoryModel(); - const LLUUID new_parent = model->findCategoryUUIDForType(item->getType()); - // do not restamp on restore. - LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE); - } -} - -void LLItemBridge::restoreToWorld() -{ - LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem(); - if (itemp) - { - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("RezRestoreToWorld"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - - msg->nextBlockFast(_PREHASH_InventoryData); - itemp->packMessage(msg); - msg->sendReliable(gAgent.getRegion()->getHost()); - } - - //Similar functionality to the drag and drop rez logic - BOOL remove_from_inventory = FALSE; - - //remove local inventory copy, sim will deal with permissions and removing the item - //from the actual inventory if its a no-copy etc - if(!itemp->getPermissions().allowCopyBy(gAgent.getID())) - { - remove_from_inventory = TRUE; - } - - // Check if it's in the trash. (again similar to the normal rez logic) - const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); - if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id)) - { - remove_from_inventory = TRUE; - } - - if(remove_from_inventory) - { - gInventory.deleteObject(itemp->getUUID()); - gInventory.notifyObservers(); - } -} - -void LLItemBridge::gotoItem(LLFolderView *folder) -{ - LLInventoryObject *obj = getInventoryObject(); - if (obj && obj->getIsLinkType()) - { - LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); - if (active_panel) - { - active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO); - } - } -} - -LLUIImagePtr LLItemBridge::getIcon() const -{ - return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]); -} - -PermissionMask LLItemBridge::getPermissionMask() const -{ - LLViewerInventoryItem* item = getItem(); - PermissionMask perm_mask = 0; - if(item) - { - BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); - BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); - BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, - gAgent.getID()); - - if (copy) perm_mask |= PERM_COPY; - if (mod) perm_mask |= PERM_MODIFY; - if (xfer) perm_mask |= PERM_TRANSFER; - - } - return perm_mask; -} - -const std::string& LLItemBridge::getDisplayName() const -{ - if(mDisplayName.empty()) - { - buildDisplayName(getItem(), mDisplayName); - } - return mDisplayName; -} - -void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name) -{ - if(item) - { - name.assign(item->getName()); - } - else - { - name.assign(LLStringUtil::null); - } -} - -LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const -{ - U8 font = LLFontGL::NORMAL; - - if( gAgentWearables.isWearingItem( mUUID ) ) - { - // llinfos << "BOLD" << llendl; - font |= LLFontGL::BOLD; - } - - const LLViewerInventoryItem* item = getItem(); - if (item && item->getIsLinkType()) - { - font |= LLFontGL::ITALIC; - } - return (LLFontGL::StyleFlags)font; -} - -std::string LLItemBridge::getLabelSuffix() const -{ - // String table is loaded before login screen and inventory items are - // loaded after login, so LLTrans should be ready. - static std::string NO_COPY =LLTrans::getString("no_copy"); - static std::string NO_MOD = LLTrans::getString("no_modify"); - static std::string NO_XFER = LLTrans::getString("no_transfer"); - static std::string LINK = LLTrans::getString("link"); - static std::string BROKEN_LINK = LLTrans::getString("broken_link"); - std::string suffix; - LLInventoryItem* item = getItem(); - if(item) - { - // it's a bit confusing to put nocopy/nomod/etc on calling cards. - if(LLAssetType::AT_CALLINGCARD != item->getType() - && item->getPermissions().getOwner() == gAgent.getID()) - { - BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType()); - if (broken_link) return BROKEN_LINK; - - BOOL link = item->getIsLinkType(); - if (link) return LINK; - - BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); - if (!copy) - { - suffix += NO_COPY; - } - BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); - if (!mod) - { - suffix += NO_MOD; - } - BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, - gAgent.getID()); - if (!xfer) - { - suffix += NO_XFER; - } - } - } - return suffix; -} - -time_t LLItemBridge::getCreationDate() const -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - return item->getCreationDate(); - } - return 0; -} - - -BOOL LLItemBridge::isItemRenameable() const -{ - LLViewerInventoryItem* item = getItem(); - if(item) - { - // (For now) Don't allow calling card rename since that may confuse users as to - // what the calling card points to. - if (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD) - { - return FALSE; - } - return (item->getPermissions().allowModifyBy(gAgent.getID())); - } - return FALSE; -} - -BOOL LLItemBridge::renameItem(const std::string& new_name) -{ - if(!isItemRenameable()) - return FALSE; - LLPreview::dirty(mUUID); - LLInventoryModel* model = getInventoryModel(); - if(!model) - return FALSE; - LLViewerInventoryItem* item = getItem(); - if(item && (item->getName() != new_name)) - { - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->rename(new_name); - buildDisplayName(new_item, mDisplayName); - new_item->updateServer(FALSE); - model->updateItem(new_item); - - model->notifyObservers(); - } - // return FALSE because we either notified observers (& therefore - // rebuilt) or we didn't update. - return FALSE; -} - - -BOOL LLItemBridge::removeItem() -{ - if(!isItemRemovable()) - { - return FALSE; - } - // move it to the trash - LLPreview::hide(mUUID, TRUE); - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - LLViewerInventoryItem* item = getItem(); - - // if item is not already in trash - if(item && !model->isObjectDescendentOf(mUUID, trash_id)) - { - // move to trash, and restamp - LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE); - // delete was successful - return TRUE; - } - else - { - // tried to delete already item in trash (should purge?) - return FALSE; - } -} - -BOOL LLItemBridge::isItemCopyable() const -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - // can't copy worn objects. DEV-15183 - LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); - if( !avatarp ) - { - return FALSE; - } - - if(avatarp->isWearingAttachment(mUUID)) - { - return FALSE; - } - - // All items can be copied, not all can be pasted. - // The only time an item can't be copied is if it's a link - // return (item->getPermissions().allowCopyBy(gAgent.getID())); - if (item->getIsLinkType()) - { - return FALSE; - } - return TRUE; - } - return FALSE; -} -BOOL LLItemBridge::copyToClipboard() const -{ - if(isItemCopyable()) - { - LLInventoryClipboard::instance().add(mUUID); - return TRUE; - } - return FALSE; -} - -LLViewerInventoryItem* LLItemBridge::getItem() const -{ - LLViewerInventoryItem* item = NULL; - LLInventoryModel* model = getInventoryModel(); - if(model) - { - item = (LLViewerInventoryItem*)model->getItem(mUUID); - } - return item; -} - -BOOL LLItemBridge::isItemPermissive() const -{ - LLViewerInventoryItem* item = getItem(); - if(item) - { - U32 mask = item->getPermissions().getMaskBase(); - if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) - { - return TRUE; - } - } - return FALSE; -} - -// +=================================================+ -// | LLFolderBridge | -// +=================================================+ - -LLFolderBridge* LLFolderBridge::sSelf=NULL; - -// Can be moved to another folder -BOOL LLFolderBridge::isItemMovable() const -{ - LLInventoryObject* obj = getInventoryObject(); - if(obj) - { - return (!LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)obj)->getPreferredType())); - } - return FALSE; -} - -void LLFolderBridge::selectItem() -{ -} - - -// Can be destroyed (or moved to trash) -BOOL LLFolderBridge::isItemRemovable() -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) - { - return FALSE; - } - - if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) - { - return FALSE; - } - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( !avatar ) - { - return FALSE; - } - - LLInventoryCategory* category = model->getCategory(mUUID); - if( !category ) - { - return FALSE; - } - - if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) - { - return FALSE; - } - - LLInventoryModel::cat_array_t descendent_categories; - LLInventoryModel::item_array_t descendent_items; - gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); - - S32 i; - for( i = 0; i < descendent_categories.count(); i++ ) - { - LLInventoryCategory* category = descendent_categories[i]; - if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) - { - return FALSE; - } - } - - for( i = 0; i < descendent_items.count(); i++ ) - { - LLInventoryItem* item = descendent_items[i]; - if( (item->getType() == LLAssetType::AT_CLOTHING) || - (item->getType() == LLAssetType::AT_BODYPART) ) - { - if(gAgentWearables.isWearingItem(item->getUUID())) - { - return FALSE; - } - } - else - if( item->getType() == LLAssetType::AT_OBJECT ) - { - if(avatar->isWearingAttachment(item->getUUID())) - { - return FALSE; - } - } - } - - return TRUE; -} - -BOOL LLFolderBridge::isUpToDate() const -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); - if( !category ) - { - return FALSE; - } - - return category->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN; -} - -BOOL LLFolderBridge::isItemCopyable() const -{ - return TRUE; -} - -BOOL LLFolderBridge::copyToClipboard() const -{ - if(isItemCopyable()) - { - LLInventoryClipboard::instance().add(mUUID); - return TRUE; - } - return FALSE; -} - -BOOL LLFolderBridge::isClipboardPasteable() const -{ - if ( ! LLInvFVBridge::isClipboardPasteable() ) - return FALSE; - - // Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 - if ( LLFriendCardsManager::instance().isCategoryInFriendFolder( getCategory() ) ) - { - LLInventoryModel* model = getInventoryModel(); - if ( !model ) - { - return FALSE; - } - - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - const LLViewerInventoryCategory *current_cat = getCategory(); - - // Search for the direct descendent of current Friends subfolder among all pasted items, - // and return false if is found. - for(S32 i = objects.count() - 1; i >= 0; --i) - { - const LLUUID &obj_id = objects.get(i); - if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) - { - return FALSE; - } - } - - } - return TRUE; -} - -BOOL LLFolderBridge::isClipboardPasteableAsLink() const -{ - // Check normal paste-as-link permissions - if (!LLInvFVBridge::isClipboardPasteableAsLink()) - { - return FALSE; - } - - const LLInventoryModel* model = getInventoryModel(); - if (!model) - { - return FALSE; - } - - const LLViewerInventoryCategory *current_cat = getCategory(); - if (current_cat) - { - const BOOL is_in_friend_folder = LLFriendCardsManager::instance().isCategoryInFriendFolder( current_cat ); - const LLUUID ¤t_cat_id = current_cat->getUUID(); - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - for(S32 i = 0; i < count; i++) - { - const LLUUID &obj_id = objects.get(i); - const LLInventoryCategory *cat = model->getCategory(obj_id); - if (cat) - { - const LLUUID &cat_id = cat->getUUID(); - // Don't allow recursive pasting - if ((cat_id == current_cat_id) || - model->isObjectDescendentOf(current_cat_id, cat_id)) - { - return FALSE; - } - } - // Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 - if ( is_in_friend_folder ) - { - // If object is direct descendent of current Friends subfolder than return false. - // Note: We can't use 'const LLInventoryCategory *cat', because it may be null - // in case type of obj_id is LLInventoryItem. - if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) - { - return FALSE; - } - } - } - } - return TRUE; - -} - -BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, - BOOL drop) -{ - // This should never happen, but if an inventory item is incorrectly parented, - // the UI will get confused and pass in a NULL. - if(!inv_cat) return FALSE; - - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if(!avatar) return FALSE; - - // cannot drag categories into library - if(!isAgentInventory()) - { - return FALSE; - } - - // check to make sure source is agent inventory, and is represented there. - LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); - BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL) - && (LLToolDragAndDrop::SOURCE_AGENT == source); - - BOOL accept = FALSE; - S32 i; - LLInventoryModel::cat_array_t descendent_categories; - LLInventoryModel::item_array_t descendent_items; - if(is_agent_inventory) - { - const LLUUID& cat_id = inv_cat->getUUID(); - - // Is the destination the trash? - const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - BOOL move_is_into_trash = (mUUID == trash_id) - || model->isObjectDescendentOf(mUUID, trash_id); - BOOL is_movable = (!LLAssetType::lookupIsProtectedCategoryType(inv_cat->getPreferredType())); - LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); - BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); - BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); - if (move_is_into_current_outfit || move_is_into_outfit) - { - // BAP - restrictions? - is_movable = true; - } - - if (mUUID == gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE)) - { - is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604 - } - - if( is_movable ) - { - gInventory.collectDescendents( cat_id, descendent_categories, descendent_items, FALSE ); - - for( i = 0; i < descendent_categories.count(); i++ ) - { - LLInventoryCategory* category = descendent_categories[i]; - if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) - { - // ...can't move "special folders" like Textures - is_movable = FALSE; - break; - } - } - - if( is_movable ) - { - if( move_is_into_trash ) - { - for( i = 0; i < descendent_items.count(); i++ ) - { - LLInventoryItem* item = descendent_items[i]; - if( (item->getType() == LLAssetType::AT_CLOTHING) || - (item->getType() == LLAssetType::AT_BODYPART) ) - { - if( gAgentWearables.isWearingItem( item->getUUID() ) ) - { - is_movable = FALSE; // It's generally movable, but not into the trash! - break; - } - } - else - if( item->getType() == LLAssetType::AT_OBJECT ) - { - if( avatar->isWearingAttachment( item->getUUID() ) ) - { - is_movable = FALSE; // It's generally movable, but not into the trash! - break; - } - } - } - } - } - } - - - accept = is_movable - && (mUUID != cat_id) // Can't move a folder into itself - && (mUUID != inv_cat->getParentUUID()) // Avoid moves that would change nothing - && !(model->isObjectDescendentOf(mUUID, cat_id)); // Avoid circularity - if(accept && drop) - { - // Look for any gestures and deactivate them - if (move_is_into_trash) - { - for (i = 0; i < descendent_items.count(); i++) - { - LLInventoryItem* item = descendent_items[i]; - if (item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(item->getUUID())) - { - LLGestureManager::instance().deactivateGesture(item->getUUID()); - } - } - } - // if target is an outfit or current outfit folder we use link - if (move_is_into_current_outfit || move_is_into_outfit) - { -#if SUPPORT_ENSEMBLES - // BAP - should skip if dup. - if (move_is_into_current_outfit) - { - LLAppearanceManager::wearEnsemble(inv_cat); - } - else - { - LLPointer<LLInventoryCallback> cb = NULL; - link_inventory_item( - gAgent.getID(), - inv_cat->getUUID(), - mUUID, - inv_cat->getName(), - LLAssetType::AT_LINK_FOLDER, - cb); - } -#endif - } - else - { - - // Reparent the folder and restamp children if it's moving - // into trash. - LLInvFVBridge::changeCategoryParent( - model, - (LLViewerInventoryCategory*)inv_cat, - mUUID, - move_is_into_trash); - } - } - } - else if(LLToolDragAndDrop::SOURCE_WORLD == source) - { - // content category has same ID as object itself - LLUUID object_id = inv_cat->getUUID(); - LLUUID category_id = mUUID; - accept = move_inv_category_world_to_agent(object_id, category_id, drop); - } - return accept; -} - -void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv) -{ - const char* dialog = NULL; - if (object->flagScripted()) - { - dialog = "MoveInventoryFromScriptedObject"; - } - else - { - dialog = "MoveInventoryFromObject"; - } - LLNotifications::instance().add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv)); -} - -// Move/copy all inventory items from the Contents folder of an in-world -// object to the agent's inventory, inside a given category. -BOOL move_inv_category_world_to_agent(const LLUUID& object_id, - const LLUUID& category_id, - BOOL drop, - void (*callback)(S32, void*), - void* user_data) -{ - // Make sure the object exists. If we allowed dragging from - // anonymous objects, it would be possible to bypass - // permissions. - // content category has same ID as object itself - LLViewerObject* object = gObjectList.findObject(object_id); - if(!object) - { - llinfos << "Object not found for drop." << llendl; - return FALSE; - } - - // this folder is coming from an object, as there is only one folder in an object, the root, - // we need to collect the entire contents and handle them as a group - InventoryObjectList inventory_objects; - object->getInventoryContents(inventory_objects); - - if (inventory_objects.empty()) - { - llinfos << "Object contents not found for drop." << llendl; - return FALSE; - } - - BOOL accept = TRUE; - BOOL is_move = FALSE; - - // coming from a task. Need to figure out if the person can - // move/copy this item. - InventoryObjectList::iterator it = inventory_objects.begin(); - InventoryObjectList::iterator end = inventory_objects.end(); - for ( ; it != end; ++it) - { - // coming from a task. Need to figure out if the person can - // move/copy this item. - LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions()); - if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) - && perm.allowTransferTo(gAgent.getID()))) -// || gAgent.isGodlike()) - { - accept = TRUE; - } - else if(object->permYouOwner()) - { - // If the object cannot be copied, but the object the - // inventory is owned by the agent, then the item can be - // moved from the task to agent inventory. - is_move = TRUE; - accept = TRUE; - } - else - { - accept = FALSE; - break; - } - } - - if(drop && accept) - { - it = inventory_objects.begin(); - InventoryObjectList::iterator first_it = inventory_objects.begin(); - LLMoveInv* move_inv = new LLMoveInv; - move_inv->mObjectID = object_id; - move_inv->mCategoryID = category_id; - move_inv->mCallback = callback; - move_inv->mUserData = user_data; - - for ( ; it != end; ++it) - { - two_uuids_t two(category_id, (*it)->getUUID()); - move_inv->mMoveList.push_back(two); - } - - if(is_move) - { - // Callback called from within here. - warn_move_inventory(object, move_inv); - } - else - { - LLNotification::Params params("MoveInventoryFromObject"); - params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); - LLNotifications::instance().forceResponse(params, 0); - } - } - return accept; -} - -bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat, - LLInventoryItem* item) -{ - // Valid COF items are: - // - links to wearables (body parts or clothing) - // - links to attachments - // - links to gestures - // - links to ensemble folders - LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem(); // BAP - safe? - if (linked_item) - { - LLAssetType::EType type = linked_item->getType(); - return (type == LLAssetType::AT_CLOTHING || - type == LLAssetType::AT_BODYPART || - type == LLAssetType::AT_GESTURE || - type == LLAssetType::AT_OBJECT); - } - else - { - LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe? - // BAP remove AT_NONE support after ensembles are fully working? - return (linked_category && - ((linked_category->getPreferredType() == LLAssetType::AT_NONE) || - (LLAssetType::lookupIsEnsembleCategoryType(linked_category->getPreferredType())))); - } -} - - -bool LLFindWearables::operator()(LLInventoryCategory* cat, - LLInventoryItem* item) -{ - if(item) - { - if((item->getType() == LLAssetType::AT_CLOTHING) - || (item->getType() == LLAssetType::AT_BODYPART)) - { - return TRUE; - } - } - return FALSE; -} - - - -//Used by LLFolderBridge as callback for directory recursion. -class LLRightClickInventoryFetchObserver : public LLInventoryFetchObserver -{ -public: - LLRightClickInventoryFetchObserver() : - mCopyItems(false) - { }; - LLRightClickInventoryFetchObserver(const LLUUID& cat_id, bool copy_items) : - mCatID(cat_id), - mCopyItems(copy_items) - { }; - virtual void done() - { - // we've downloaded all the items, so repaint the dialog - LLFolderBridge::staticFolderOptionsMenu(); - - gInventory.removeObserver(this); - delete this; - } - - -protected: - LLUUID mCatID; - bool mCopyItems; - -}; - -//Used by LLFolderBridge as callback for directory recursion. -class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver -{ -public: - LLRightClickInventoryFetchDescendentsObserver(bool copy_items) : mCopyItems(copy_items) {} - ~LLRightClickInventoryFetchDescendentsObserver() {} - virtual void done(); -protected: - bool mCopyItems; -}; - -void LLRightClickInventoryFetchDescendentsObserver::done() -{ - // Avoid passing a NULL-ref as mCompleteFolders.front() down to - // gInventory.collectDescendents() - if( mCompleteFolders.empty() ) - { - llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl; - dec_busy_count(); - gInventory.removeObserver(this); - delete this; - return; - } - - // What we do here is get the complete information on the items in - // the library, and set up an observer that will wait for that to - // happen. - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - gInventory.collectDescendents(mCompleteFolders.front(), - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH); - S32 count = item_array.count(); -#if 0 // HACK/TODO: Why? - // This early causes a giant menu to get produced, and doesn't seem to be needed. - if(!count) - { - llwarns << "Nothing fetched in category " << mCompleteFolders.front() - << llendl; - dec_busy_count(); - gInventory.removeObserver(this); - delete this; - return; - } -#endif - - LLRightClickInventoryFetchObserver* outfit; - outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems); - LLInventoryFetchObserver::item_ref_t ids; - for(S32 i = 0; i < count; ++i) - { - ids.push_back(item_array.get(i)->getUUID()); - } - - // clean up, and remove this as an observer since the call to the - // outfit could notify observers and throw us into an infinite - // loop. - dec_busy_count(); - gInventory.removeObserver(this); - delete this; - - // increment busy count and either tell the inventory to check & - // call done, or add this object to the inventory for observation. - inc_busy_count(); - - // do the fetch - outfit->fetchItems(ids); - outfit->done(); //Not interested in waiting and this will be right 99% of the time. -//Uncomment the following code for laggy Inventory UI. -/* if(outfit->isEverythingComplete()) - { - // everything is already here - call done. - outfit->done(); - } - else - { - // it's all on it's way - add an observer, and the inventory - // will call done for us when everything is here. - gInventory.addObserver(outfit); - }*/ -} - - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryWearObserver -// -// Observer for "copy and wear" operation to support knowing -// when the all of the contents have been added to inventory. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLInventoryCopyAndWearObserver : public LLInventoryObserver -{ -public: - LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {} - virtual ~LLInventoryCopyAndWearObserver() {} - virtual void changed(U32 mask); - -protected: - LLUUID mCatID; - int mContentsCount; - BOOL mFolderAdded; -}; - - - -void LLInventoryCopyAndWearObserver::changed(U32 mask) -{ - if((mask & (LLInventoryObserver::ADD)) != 0) - { - if (!mFolderAdded) - { - const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); - - std::set<LLUUID>::const_iterator id_it = changed_items.begin(); - std::set<LLUUID>::const_iterator id_end = changed_items.end(); - for (;id_it != id_end; ++id_it) - { - if ((*id_it) == mCatID) - { - mFolderAdded = TRUE; - break; - } - } - } - - if (mFolderAdded) - { - LLViewerInventoryCategory* category = gInventory.getCategory(mCatID); - - if (NULL == category) - { - llwarns << "gInventory.getCategory(" << mCatID - << ") was NULL" << llendl; - } - else - { - if (category->getDescendentCount() == - mContentsCount) - { - gInventory.removeObserver(this); - LLAppearanceManager::wearInventoryCategory(category, FALSE, TRUE); - delete this; - } - } - } - - } -} - - - -void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("open" == action) - { - openItem(); - return; - } - else if ("paste" == action) - { - pasteFromClipboard(); - return; - } - else if ("paste_link" == action) - { - pasteLinkFromClipboard(); - return; - } - else if ("properties" == action) - { - showProperties(); - return; - } - else if ("replaceoutfit" == action) - { - modifyOutfit(FALSE); - return; - } -#if SUPPORT_ENSEMBLES - else if ("wearasensemble" == action) - { - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLViewerInventoryCategory* cat = getCategory(); - if(!cat) return; - LLAppearanceManager::wearEnsemble(cat,true); - return; - } -#endif - else if ("addtooutfit" == action) - { - modifyOutfit(TRUE); - return; - } - else if ("copy" == action) - { - copyToClipboard(); - return; - } - else if ("removefromoutfit" == action) - { - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLViewerInventoryCategory* cat = getCategory(); - if(!cat) return; - - remove_inventory_category_from_avatar ( cat ); - return; - } - else if ("purge" == action) - { - purgeItem(model, mUUID); - return; - } - else if ("restore" == action) - { - restoreItem(); - return; - } -} - -void LLFolderBridge::openItem() -{ - lldebugs << "LLFolderBridge::openItem()" << llendl; - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - bool fetching_inventory = model->fetchDescendentsOf(mUUID); - // Only change folder type if we have the folder contents. - if (!fetching_inventory) - { - // Disabling this for now, it's causing crash when new items are added to folders - // since folder type may change before new item item has finished processing. - // determineFolderType(); - } -} - -void LLFolderBridge::closeItem() -{ - determineFolderType(); -} - -void LLFolderBridge::determineFolderType() -{ - if (isUpToDate()) - { - LLInventoryModel* model = getInventoryModel(); - LLViewerInventoryCategory* category = model->getCategory(mUUID); - category->determineFolderType(); - } -} - -BOOL LLFolderBridge::isItemRenameable() const -{ - LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory(); - if(cat && !LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType()) - && (cat->getOwnerID() == gAgent.getID())) - { - return TRUE; - } - return FALSE; -} - -void LLFolderBridge::restoreItem() -{ - LLViewerInventoryCategory* cat; - cat = (LLViewerInventoryCategory*)getCategory(); - if(cat) - { - LLInventoryModel* model = getInventoryModel(); - LLUUID new_parent = model->findCategoryUUIDForType(cat->getType()); - // do not restamp children on restore - LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE); - } -} - -LLAssetType::EType LLFolderBridge::getPreferredType() const -{ - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; - LLViewerInventoryCategory* cat = getCategory(); - if(cat) - { - preferred_type = cat->getPreferredType(); - } - - return preferred_type; -} - -// Icons for folders are based on the preferred type -LLUIImagePtr LLFolderBridge::getIcon() const -{ - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; - LLViewerInventoryCategory* cat = getCategory(); - if(cat) - { - preferred_type = cat->getPreferredType(); - } - return getIcon(preferred_type); -} - -LLUIImagePtr LLFolderBridge::getIcon(LLAssetType::EType preferred_type) -{ - // we only have one folder image now - return LLUI::getUIImage("Inv_FolderClosed"); -} - -BOOL LLFolderBridge::renameItem(const std::string& new_name) -{ - if(!isItemRenameable()) - return FALSE; - LLInventoryModel* model = getInventoryModel(); - if(!model) - return FALSE; - LLViewerInventoryCategory* cat = getCategory(); - if(cat && (cat->getName() != new_name)) - { - LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); - new_cat->rename(new_name); - new_cat->updateServer(FALSE); - model->updateCategory(new_cat); - - model->notifyObservers(); - } - // return FALSE because we either notified observers (& therefore - // rebuilt) or we didn't update. - return FALSE; -} - -BOOL LLFolderBridge::removeItem() -{ - if(!isItemRemovable()) - { - return FALSE; - } - // move it to the trash - LLPreview::hide(mUUID); - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - - // Look for any gestures and deactivate them - LLInventoryModel::cat_array_t descendent_categories; - LLInventoryModel::item_array_t descendent_items; - gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); - - S32 i; - for (i = 0; i < descendent_items.count(); i++) - { - LLInventoryItem* item = descendent_items[i]; - if (item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(item->getUUID())) - { - LLGestureManager::instance().deactivateGesture(item->getUUID()); - } - } - - // go ahead and do the normal remove if no 'last calling - // cards' are being removed. - LLViewerInventoryCategory* cat = getCategory(); - if(cat) - { - LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE); - } - - return TRUE; -} - -void LLFolderBridge::pasteFromClipboard() -{ - LLInventoryModel* model = getInventoryModel(); - if(model && isClipboardPasteable()) - { - LLInventoryItem* item = NULL; - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - const LLUUID parent_id(mUUID); - for(S32 i = 0; i < count; i++) - { - item = model->getItem(objects.get(i)); - if (item) - { - if(LLInventoryClipboard::instance().isCutMode()) - { - // move_inventory_item() is not enough, - //we have to update inventory locally too - changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE); - } - else - { - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - parent_id, - std::string(), - LLPointer<LLInventoryCallback>(NULL)); - } - } - } - } -} - -void LLFolderBridge::pasteLinkFromClipboard() -{ - const LLInventoryModel* model = getInventoryModel(); - if(model) - { - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - LLUUID parent_id(mUUID); - for(S32 i = 0; i < count; i++) - { - const LLUUID &object_id = objects.get(i); -#if SUPPORT_ENSEMBLES - if (LLInventoryCategory *cat = model->getCategory(object_id)) - { - link_inventory_item( - gAgent.getID(), - cat->getUUID(), - parent_id, - cat->getName(), - LLAssetType::AT_LINK_FOLDER, - LLPointer<LLInventoryCallback>(NULL)); - } - else -#endif - if (LLInventoryItem *item = model->getItem(object_id)) - { - link_inventory_item( - gAgent.getID(), - item->getUUID(), - parent_id, - item->getName(), - LLAssetType::AT_LINK, - LLPointer<LLInventoryCallback>(NULL)); - } - } - } -} - -void LLFolderBridge::staticFolderOptionsMenu() -{ - if (!sSelf) return; - sSelf->folderOptionsMenu(); -} - -void LLFolderBridge::folderOptionsMenu() -{ - std::vector<std::string> disabled_items; - - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - - const LLInventoryCategory* category = model->getCategory(mUUID); - LLAssetType::EType type = category->getPreferredType(); - const bool is_default_folder = category && LLAssetType::lookupIsProtectedCategoryType(type); - // BAP change once we're no longer treating regular categories as ensembles. - const bool is_ensemble = category && (type == LLAssetType::AT_NONE || - LLAssetType::lookupIsEnsembleCategoryType(type)); - - // calling card related functionality for folders. - - // Only enable calling-card related options for non-default folders. - if (!is_default_folder) - { - LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); - if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard)) - { - mItems.push_back(std::string("Calling Card Separator")); - mItems.push_back(std::string("Conference Chat Folder")); - mItems.push_back(std::string("IM All Contacts In Folder")); - } - } - - // wearables related functionality for folders. - //is_wearable - LLFindWearables is_wearable; - LLIsType is_object( LLAssetType::AT_OBJECT ); - LLIsType is_gesture( LLAssetType::AT_GESTURE ); - - if (mWearables || - checkFolderForContentsOfType(model, is_wearable) || - checkFolderForContentsOfType(model, is_object) || - checkFolderForContentsOfType(model, is_gesture) ) - { - mItems.push_back(std::string("Folder Wearables Separator")); - - // Only enable add/replace outfit for non-default folders. - if (!is_default_folder) - { - mItems.push_back(std::string("Add To Outfit")); - mItems.push_back(std::string("Replace Outfit")); - } - if (is_ensemble) - { - mItems.push_back(std::string("Wear As Ensemble")); - } - mItems.push_back(std::string("Take Off Items")); - } - hideContextEntries(*mMenu, mItems, disabled_items); -} - -BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& is_type) -{ - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - model->collectDescendentsIf(mUUID, - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_type); - return ((item_array.count() > 0) ? TRUE : FALSE ); -} - -// Flags unused -void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - mItems.clear(); - mDisabledItems.clear(); - - lldebugs << "LLFolderBridge::buildContextMenu()" << llendl; -// std::vector<std::string> disabled_items; - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); - - mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point) - mDisabledItems.clear(); //adding code to clear out disabled members from previous - if (lost_and_found_id == mUUID) - { - // This is the lost+found folder. - mItems.push_back(std::string("Empty Lost And Found")); - } - - if(trash_id == mUUID) - { - // This is the trash. - mItems.push_back(std::string("Empty Trash")); - } - else if(model->isObjectDescendentOf(mUUID, trash_id)) - { - // This is a folder in the trash. - mItems.clear(); // clear any items that used to exist - mItems.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - mDisabledItems.push_back(std::string("Purge Item")); - } - - mItems.push_back(std::string("Restore Item")); - } - else if(isAgentInventory()) // do not allow creating in library - { - LLViewerInventoryCategory *cat = getCategory(); - - // BAP removed protected check to re-enable standard ops in untyped folders. - // Not sure what the right thing is to do here. - if (!isCOFFolder() && cat /*&& - LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/) - { - // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. - if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) - mItems.push_back(std::string("New Folder")); - mItems.push_back(std::string("New Script")); - mItems.push_back(std::string("New Note")); - mItems.push_back(std::string("New Gesture")); - mItems.push_back(std::string("New Clothes")); - mItems.push_back(std::string("New Body Parts")); - mItems.push_back(std::string("Change Type")); - - LLViewerInventoryCategory *cat = getCategory(); - if (cat && LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())) - { - mDisabledItems.push_back(std::string("Change Type")); - } - - getClipboardEntries(false, mItems, mDisabledItems, flags); - } - else - { - // Want some but not all of the items from getClipboardEntries for outfits. - if (cat && cat->getPreferredType()==LLAssetType::AT_OUTFIT) - { - mItems.push_back(std::string("Rename")); - mItems.push_back(std::string("Delete")); - } - } - - //Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06 - mCallingCards = mWearables = FALSE; - - LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); - if (checkFolderForContentsOfType(model, is_callingcard)) - { - mCallingCards=TRUE; - } - - LLFindWearables is_wearable; - LLIsType is_object( LLAssetType::AT_OBJECT ); - LLIsType is_gesture( LLAssetType::AT_GESTURE ); - - if (checkFolderForContentsOfType(model, is_wearable) || - checkFolderForContentsOfType(model, is_object) || - checkFolderForContentsOfType(model, is_gesture) ) - { - mWearables=TRUE; - } - - mMenu = &menu; - sSelf = this; - LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE); - - LLInventoryFetchDescendentsObserver::folder_ref_t folders; - LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); - if (category) - { - folders.push_back(category->getUUID()); - } - fetch->fetchDescendents(folders); - inc_busy_count(); - if(fetch->isEverythingComplete()) - { - // everything is already here - call done. - fetch->done(); - } - else - { - // it's all on it's way - add an observer, and the inventory - // will call done for us when everything is here. - gInventory.addObserver(fetch); - } - } - else - { - mItems.push_back(std::string("--no options--")); - mDisabledItems.push_back(std::string("--no options--")); - } - hideContextEntries(menu, mItems, mDisabledItems); -} - -BOOL LLFolderBridge::hasChildren() const -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - LLInventoryModel::EHasChildren has_children; - has_children = gInventory.categoryHasChildren(mUUID); - return has_children != LLInventoryModel::CHILDREN_NO; -} - -BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data) -{ - //llinfos << "LLFolderBridge::dragOrDrop()" << llendl; - BOOL accept = FALSE; - switch(cargo_type) - { - case DAD_TEXTURE: - case DAD_SOUND: - case DAD_CALLINGCARD: - case DAD_LANDMARK: - case DAD_SCRIPT: - case DAD_OBJECT: - case DAD_NOTECARD: - case DAD_CLOTHING: - case DAD_BODYPART: - case DAD_ANIMATION: - case DAD_GESTURE: - case DAD_LINK: - accept = dragItemIntoFolder((LLInventoryItem*)cargo_data, - drop); - break; - case DAD_CATEGORY: - if (LLFriendCardsManager::instance().isAnyFriendCategory(mUUID)) - { - accept = FALSE; - } - else - { - accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop); - } - break; - default: - break; - } - return accept; -} - -LLViewerInventoryCategory* LLFolderBridge::getCategory() const -{ - LLViewerInventoryCategory* cat = NULL; - LLInventoryModel* model = getInventoryModel(); - if(model) - { - cat = (LLViewerInventoryCategory*)model->getCategory(mUUID); - } - return cat; -} - - -// static -void LLFolderBridge::pasteClipboard(void* user_data) -{ - LLFolderBridge* self = (LLFolderBridge*)user_data; - if(self) self->pasteFromClipboard(); -} - -void LLFolderBridge::createNewCategory(void* user_data) -{ - LLFolderBridge* bridge = (LLFolderBridge*)user_data; - if(!bridge) return; - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get()); - if (!panel) return; - LLInventoryModel* model = panel->getModel(); - if(!model) return; - LLUUID id; - id = model->createNewCategory(bridge->getUUID(), - LLAssetType::AT_NONE, - LLStringUtil::null); - model->notifyObservers(); - - // At this point, the bridge has probably been deleted, but the - // view is still there. - panel->setSelection(id, TAKE_FOCUS_YES); -} - -void LLFolderBridge::createNewShirt(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHIRT); -} - -void LLFolderBridge::createNewPants(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PANTS); -} - -void LLFolderBridge::createNewShoes(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHOES); -} - -void LLFolderBridge::createNewSocks(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SOCKS); -} - -void LLFolderBridge::createNewJacket(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_JACKET); -} - -void LLFolderBridge::createNewSkirt(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIRT); -} - -void LLFolderBridge::createNewGloves(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_GLOVES); -} - -void LLFolderBridge::createNewUndershirt(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERSHIRT); -} - -void LLFolderBridge::createNewUnderpants(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS); -} - -void LLFolderBridge::createNewShape(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE); -} - -void LLFolderBridge::createNewSkin(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIN); -} - -void LLFolderBridge::createNewHair(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_HAIR); -} - -void LLFolderBridge::createNewEyes(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES); -} - -// static -void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type) -{ - if(!bridge) return; - LLUUID parent_id = bridge->getUUID(); - createWearable(parent_id, type); -} - -// Separate function so can be called by global menu as well as right-click -// menu. -// static -void LLFolderBridge::createWearable(LLUUID parent_id, EWearableType type) -{ - LLWearable* wearable = LLWearableList::instance().createNewWearable(type); - LLAssetType::EType asset_type = wearable->getAssetType(); - LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE; - create_inventory_item(gAgent.getID(), gAgent.getSessionID(), - parent_id, wearable->getTransactionID(), wearable->getName(), - wearable->getDescription(), asset_type, inv_type, wearable->getType(), - wearable->getPermissions().getMaskNextOwner(), - LLPointer<LLInventoryCallback>(NULL)); -} - -void LLFolderBridge::modifyOutfit(BOOL append) -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLViewerInventoryCategory* cat = getCategory(); - if(!cat) return; - - // BAP - was: - // wear_inventory_category_on_avatar( cat, append ); - LLAppearanceManager::wearInventoryCategory( cat, FALSE, append ); -} - -// helper stuff -bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv* move_inv) -{ - LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData; - LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID); - S32 option = LLNotification::getSelectedOption(notification, response); - - if(option == 0 && object) - { - if (cat_and_wear && cat_and_wear->mWear) - { - InventoryObjectList inventory_objects; - object->getInventoryContents(inventory_objects); - int contents_count = inventory_objects.size()-1; //subtract one for containing folder - - LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count); - gInventory.addObserver(inventoryObserver); - } - - two_uuids_list_t::iterator move_it; - for (move_it = move_inv->mMoveList.begin(); - move_it != move_inv->mMoveList.end(); - ++move_it) - { - object->moveInventory(move_it->first, move_it->second); - } - - // update the UI. - dialog_refresh_all(); - } - - if (move_inv->mCallback) - { - move_inv->mCallback(option, move_inv->mUserData); - } - - delete move_inv; - return false; -} - -/* -Next functions intended to reorder items in the inventory folder and save order on server -Is now used for Favorites folder. - -*TODO: refactoring is needed with Favorites Bar functionality. Probably should be moved in LLInventoryModel -*/ -void saveItemsOrder(LLInventoryModel::item_array_t& items) -{ - int sortField = 0; - - // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field - for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) - { - LLViewerInventoryItem* item = *i; - - item->setSortField(++sortField); - item->setComplete(TRUE); - item->updateServer(FALSE); - - gInventory.updateItem(item); - } - - gInventory.notifyObservers(); -} - -LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id) -{ - LLInventoryModel::item_array_t::iterator result = items.end(); - - for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) - { - if ((*i)->getUUID() == id) - { - result = i; - break; - } - } - - return result; -} - -void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId) -{ - LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId); - LLViewerInventoryItem* destItem = gInventory.getItem(destItemId); - - items.erase(findItemByUUID(items, srcItem->getUUID())); - items.insert(findItemByUUID(items, destItem->getUUID()), srcItem); -} - -BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, - BOOL drop) -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - - // cannot drag into library - if(!isAgentInventory()) - { - return FALSE; - } - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if(!avatar) return FALSE; - - LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); - BOOL accept = FALSE; - LLViewerObject* object = NULL; - if(LLToolDragAndDrop::SOURCE_AGENT == source) - { - - BOOL is_movable = TRUE; - switch( inv_item->getActualType() ) - { - case LLAssetType::AT_ROOT_CATEGORY: - is_movable = FALSE; - break; - - case LLAssetType::AT_CATEGORY: - is_movable = !LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)inv_item)->getPreferredType()); - break; - default: - break; - } - - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); - LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); - BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); - BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); - - if(is_movable && move_is_into_trash) - { - switch(inv_item->getType()) - { - case LLAssetType::AT_CLOTHING: - case LLAssetType::AT_BODYPART: - is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID()); - break; - - case LLAssetType::AT_OBJECT: - is_movable = !avatar->isWearingAttachment(inv_item->getUUID()); - break; - default: - break; - } - } - - if ( is_movable ) - { - // Don't allow creating duplicates in the Calling Card/Friends - // subfolders, see bug EXT-1599. Check is item direct descendent - // of target folder and forbid item's movement if it so. - // Note: isItemDirectDescendentOfCategory checks if - // passed category is in the Calling Card/Friends folder - is_movable = ! LLFriendCardsManager::instance() - .isObjDirectDescendentOfCategory (inv_item, getCategory()); - } - - LLUUID favorites_id = model->findCategoryUUIDForType(LLAssetType::AT_FAVORITE); - - // we can move item inside a folder only if this folder is Favorites. See EXT-719 - accept = is_movable && ((mUUID != inv_item->getParentUUID()) || (mUUID == favorites_id)); - if(accept && drop) - { - if (inv_item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash) - { - LLGestureManager::instance().deactivateGesture(inv_item->getUUID()); - } - // If an item is being dragged between windows, unselect - // everything in the active window so that we don't follow - // the selection to its new location (which is very - // annoying). - if (LLFloaterInventory::getActiveInventory()) - { - LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - if (active_panel && (panel != active_panel)) - { - active_panel->unSelectAll(); - } - } - - // if dragging from/into favorites folder only reorder items - if ((mUUID == inv_item->getParentUUID()) && (favorites_id == mUUID)) - { - LLInventoryModel::cat_array_t cats; - LLInventoryModel::item_array_t items; - LLIsType is_type(LLAssetType::AT_LANDMARK); - model->collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); - - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; - if (itemp) - { - LLUUID srcItemId = inv_item->getUUID(); - LLUUID destItemId = itemp->getListener()->getUUID(); - - // update order - updateItemsOrder(items, srcItemId, destItemId); - - saveItemsOrder(items); - } - } - else if (favorites_id == mUUID) // if target is the favorites folder we use copy - { - copy_inventory_item( - gAgent.getID(), - inv_item->getPermissions().getOwner(), - inv_item->getUUID(), - mUUID, - std::string(), - LLPointer<LLInventoryCallback>(NULL)); - } - else if (move_is_into_current_outfit || move_is_into_outfit) - { - // BAP - should skip if dup. - if (move_is_into_current_outfit) - { - LLAppearanceManager::wearItem(inv_item); - } - else - { - LLPointer<LLInventoryCallback> cb = NULL; - link_inventory_item( - gAgent.getID(), - inv_item->getUUID(), - mUUID, - std::string(), - LLAssetType::AT_LINK, - cb); - } - } - else - { - // restamp if the move is into the trash. - LLInvFVBridge::changeItemParent( - model, - (LLViewerInventoryItem*)inv_item, - mUUID, - move_is_into_trash); - } - } - } - else if(LLToolDragAndDrop::SOURCE_WORLD == source) - { - // Make sure the object exists. If we allowed dragging from - // anonymous objects, it would be possible to bypass - // permissions. - object = gObjectList.findObject(inv_item->getParentUUID()); - if(!object) - { - llinfos << "Object not found for drop." << llendl; - return FALSE; - } - - // coming from a task. Need to figure out if the person can - // move/copy this item. - LLPermissions perm(inv_item->getPermissions()); - BOOL is_move = FALSE; - if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) - && perm.allowTransferTo(gAgent.getID()))) -// || gAgent.isGodlike()) - - { - accept = TRUE; - } - else if(object->permYouOwner()) - { - // If the object cannot be copied, but the object the - // inventory is owned by the agent, then the item can be - // moved from the task to agent inventory. - is_move = TRUE; - accept = TRUE; - } - if(drop && accept) - { - LLMoveInv* move_inv = new LLMoveInv; - move_inv->mObjectID = inv_item->getParentUUID(); - two_uuids_t item_pair(mUUID, inv_item->getUUID()); - move_inv->mMoveList.push_back(item_pair); - move_inv->mCallback = NULL; - move_inv->mUserData = NULL; - if(is_move) - { - warn_move_inventory(object, move_inv); - } - else - { - LLNotification::Params params("MoveInventoryFromObject"); - params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); - LLNotifications::instance().forceResponse(params, 0); - } - } - - } - else if(LLToolDragAndDrop::SOURCE_NOTECARD == source) - { - accept = TRUE; - if(drop) - { - copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(), - LLToolDragAndDrop::getInstance()->getSourceID(), inv_item); - } - } - else if(LLToolDragAndDrop::SOURCE_LIBRARY == source) - { - LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item; - if(item && item->isComplete()) - { - accept = TRUE; - if(drop) - { - copy_inventory_item( - gAgent.getID(), - inv_item->getPermissions().getOwner(), - inv_item->getUUID(), - mUUID, - std::string(), - LLPointer<LLInventoryCallback>(NULL)); - } - } - } - else - { - llwarns << "unhandled drag source" << llendl; - } - return accept; -} - -// +=================================================+ -// | LLScriptBridge (DEPRECTED) | -// +=================================================+ - -LLUIImagePtr LLScriptBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); -} - -// +=================================================+ -// | LLTextureBridge | -// +=================================================+ - -LLUIImagePtr LLTextureBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_TEXTURE, mInvType, 0, FALSE); -} - -void LLTextureBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -} - -// +=================================================+ -// | LLSoundBridge | -// +=================================================+ - -LLUIImagePtr LLSoundBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE); -} - -void LLSoundBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* -// Changed this back to the way it USED to work: -// only open the preview dialog through the contextual right-click menu -// double-click just plays the sound - - LLViewerInventoryItem* item = getItem(); - if(item) - { - openSoundPreview((void*)this); - //send_uuid_sound_trigger(item->getAssetUUID(), 1.0); - } -*/ -} - -void LLSoundBridge::previewItem() -{ - LLViewerInventoryItem* item = getItem(); - if(item) - { - send_sound_trigger(item->getAssetUUID(), 1.0); - } -} - -void LLSoundBridge::openSoundPreview(void* which) -{ - LLSoundBridge *me = (LLSoundBridge *)which; - LLFloaterReg::showInstance("preview_sound", LLSD(me->mUUID), TAKE_FOCUS_YES); -} - -void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLTextureBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Sound Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - - items.push_back(std::string("Sound Separator")); - items.push_back(std::string("Sound Play")); - - hideContextEntries(menu, items, disabled_items); -} - -// +=================================================+ -// | LLLandmarkBridge | -// +=================================================+ - -LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags/* = 0x00*/) : -LLItemBridge(inventory, uuid) -{ - mVisited = FALSE; - if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED) - { - mVisited = TRUE; - } -} - -LLUIImagePtr LLLandmarkBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE); -} - -void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Landmark Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - - items.push_back(std::string("Landmark Separator")); - items.push_back(std::string("About Landmark")); - - // Disable "About Landmark" menu item for - // multiple landmarks selected. Only one landmark - // info panel can be shown at a time. - if ((flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("About Landmark")); - } - - hideContextEntries(menu, items, disabled_items); -} - -// Convenience function for the two functions below. -void teleport_via_landmark(const LLUUID& asset_id) -{ - gAgent.teleportViaLandmark( asset_id ); - - // we now automatically track the landmark you're teleporting to - // because you'll probably arrive at a telehub instead - LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance(); - if( floater_world_map ) - { - floater_world_map->trackLandmark( asset_id ); - } -} - -// virtual -void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("teleport" == action) - { - LLViewerInventoryItem* item = getItem(); - if(item) - { - teleport_via_landmark(item->getAssetUUID()); - } - } - else if ("about" == action) - { - LLViewerInventoryItem* item = getItem(); - if(item) - { - LLSD key; - key["type"] = "landmark"; - key["id"] = item->getUUID(); - - LLSideTray::getInstance()->showPanel("panel_places", key); - } - } - else - { - LLItemBridge::performAction(folder, model, action); - } -} - -static bool open_landmark_callback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - - LLUUID asset_id = notification["payload"]["asset_id"].asUUID(); - if (option == 0) - { - teleport_via_landmark(asset_id); - } - - return false; -} -static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportFromLandmark", open_landmark_callback); - - -void LLLandmarkBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* - LLViewerInventoryItem* item = getItem(); - if( item ) - { - // Opening (double-clicking) a landmark immediately teleports, - // but warns you the first time. - // open_landmark(item); - LLSD payload; - payload["asset_id"] = item->getAssetUUID(); - LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); - } -*/ -} - - -// +=================================================+ -// | LLCallingCardObserver | -// +=================================================+ -void LLCallingCardObserver::changed(U32 mask) -{ - mBridgep->refreshFolderViewItem(); -} - -// +=================================================+ -// | LLCallingCardBridge | -// +=================================================+ - -LLCallingCardBridge::LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) : - LLItemBridge(inventory, uuid) -{ - mObserver = new LLCallingCardObserver(this); - LLAvatarTracker::instance().addObserver(mObserver); -} - -LLCallingCardBridge::~LLCallingCardBridge() -{ - LLAvatarTracker::instance().removeObserver(mObserver); - delete mObserver; -} - -void LLCallingCardBridge::refreshFolderViewItem() -{ - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL; - if (itemp) - { - itemp->refresh(); - } -} - -// virtual -void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("begin_im" == action) - { - LLViewerInventoryItem *item = getItem(); - if (item && (item->getCreatorUUID() != gAgent.getID()) && - (!item->getCreatorUUID().isNull())) - { - std::string callingcard_name; - gCacheName->getFullName(item->getCreatorUUID(), callingcard_name); - gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID()); - } - } - else if ("lure" == action) - { - LLViewerInventoryItem *item = getItem(); - if (item && (item->getCreatorUUID() != gAgent.getID()) && - (!item->getCreatorUUID().isNull())) - { - LLAvatarActions::offerTeleport(item->getCreatorUUID()); - } - } - else LLItemBridge::performAction(folder, model, action); -} - -LLUIImagePtr LLCallingCardBridge::getIcon() const -{ - BOOL online = FALSE; - LLViewerInventoryItem* item = getItem(); - if(item) - { - online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()); - } - return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE); -} - -std::string LLCallingCardBridge::getLabelSuffix() const -{ - LLViewerInventoryItem* item = getItem(); - if( item && LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()) ) - { - return LLItemBridge::getLabelSuffix() + " (online)"; - } - else - { - return LLItemBridge::getLabelSuffix(); - } -} - -void LLCallingCardBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* - LLViewerInventoryItem* item = getItem(); - if(item && !item->getCreatorUUID().isNull()) - { - LLAvatarActions::showProfile(item->getCreatorUUID()); - } -*/ -} - -void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLCallingCardBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - LLInventoryItem* item = getItem(); - BOOL good_card = (item - && (LLUUID::null != item->getCreatorUUID()) - && (item->getCreatorUUID() != gAgent.getID())); - BOOL user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID())); - items.push_back(std::string("Send Instant Message Separator")); - items.push_back(std::string("Send Instant Message")); - items.push_back(std::string("Offer Teleport...")); - items.push_back(std::string("Conference Chat")); - - if (!good_card) - { - disabled_items.push_back(std::string("Send Instant Message")); - } - if (!good_card || !user_online) - { - disabled_items.push_back(std::string("Offer Teleport...")); - disabled_items.push_back(std::string("Conference Chat")); - } - } - hideContextEntries(menu, items, disabled_items); -} - -BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data) -{ - LLViewerInventoryItem* item = getItem(); - BOOL rv = FALSE; - if(item) - { - // check the type - switch(cargo_type) - { - case DAD_TEXTURE: - case DAD_SOUND: - case DAD_LANDMARK: - case DAD_SCRIPT: - case DAD_CLOTHING: - case DAD_OBJECT: - case DAD_NOTECARD: - case DAD_BODYPART: - case DAD_ANIMATION: - case DAD_GESTURE: - { - LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; - const LLPermissions& perm = inv_item->getPermissions(); - if(gInventory.getItem(inv_item->getUUID()) - && perm.allowOperationBy(PERM_TRANSFER, gAgent.getID())) - { - rv = TRUE; - if(drop) - { - LLToolDragAndDrop::giveInventory(item->getCreatorUUID(), - (LLInventoryItem*)cargo_data); - } - } - else - { - // It's not in the user's inventory (it's probably in - // an object's contents), so disallow dragging it here. - // You can't give something you don't yet have. - rv = FALSE; - } - break; - } - case DAD_CATEGORY: - { - LLInventoryCategory* inv_cat = (LLInventoryCategory*)cargo_data; - if( gInventory.getCategory( inv_cat->getUUID() ) ) - { - rv = TRUE; - if(drop) - { - LLToolDragAndDrop::giveInventoryCategory( - item->getCreatorUUID(), - inv_cat); - } - } - else - { - // It's not in the user's inventory (it's probably in - // an object's contents), so disallow dragging it here. - // You can't give something you don't yet have. - rv = FALSE; - } - break; - } - default: - break; - } - } - return rv; -} - -BOOL LLCallingCardBridge::removeItem() -{ - if (LLFriendCardsManager::instance().isItemInAnyFriendsList(getItem())) - { - LLAvatarActions::removeFriendDialog(getItem()->getCreatorUUID()); - return FALSE; - } - else - { - return LLItemBridge::removeItem(); - } -} -// +=================================================+ -// | LLNotecardBridge | -// +=================================================+ - -LLUIImagePtr LLNotecardBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE); -} - -void LLNotecardBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } - -/* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); - } -*/ -} - - -// +=================================================+ -// | LLGestureBridge | -// +=================================================+ - -LLUIImagePtr LLGestureBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE); -} - -LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const -{ - if( LLGestureManager::instance().isGestureActive(mUUID) ) - { - return LLFontGL::BOLD; - } - else - { - return LLFontGL::NORMAL; - } -} - -std::string LLGestureBridge::getLabelSuffix() const -{ - if( LLGestureManager::instance().isGestureActive(mUUID) ) - { - return LLItemBridge::getLabelSuffix() + " (active)"; - } - else - { - return LLItemBridge::getLabelSuffix(); - } -} - -// virtual -void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("activate" == action) - { - LLGestureManager::instance().activateGesture(mUUID); - - LLViewerInventoryItem* item = gInventory.getItem(mUUID); - if (!item) return; - - // Since we just changed the suffix to indicate (active) - // the server doesn't need to know, just the viewer. - gInventory.updateItem(item); - gInventory.notifyObservers(); - } - else if ("deactivate" == action) - { - LLGestureManager::instance().deactivateGesture(mUUID); - - LLViewerInventoryItem* item = gInventory.getItem(mUUID); - if (!item) return; - - // Since we just changed the suffix to indicate (active) - // the server doesn't need to know, just the viewer. - gInventory.updateItem(item); - gInventory.notifyObservers(); - } - else LLItemBridge::performAction(folder, model, action); -} - -void LLGestureBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); - preview->setFocus(TRUE); - } -*/ -} - -BOOL LLGestureBridge::removeItem() -{ - // Force close the preview window, if it exists - LLGestureManager::instance().deactivateGesture(mUUID); - return LLItemBridge::removeItem(); -} - -void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLGestureBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - items.push_back(std::string("Gesture Separator")); - items.push_back(std::string("Activate")); - items.push_back(std::string("Deactivate")); - } - hideContextEntries(menu, items, disabled_items); -} - -// +=================================================+ -// | LLAnimationBridge | -// +=================================================+ - -LLUIImagePtr LLAnimationBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); -} - -void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Animation Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - - items.push_back(std::string("Animation Separator")); - items.push_back(std::string("Animation Play")); - items.push_back(std::string("Animation Audition")); - - hideContextEntries(menu, items, disabled_items); - -} - -// virtual -void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ((action == "playworld") || (action == "playlocal")) - { - if (getItem()) - { - LLPreviewAnim::e_activation_type activate = LLPreviewAnim::NONE; - if ("playworld" == action) activate = LLPreviewAnim::PLAY; - if ("playlocal" == action) activate = LLPreviewAnim::AUDITION; - - LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID)); - if (preview) - { - preview->activate(activate); - } - } - } - else - { - LLItemBridge::performAction(folder, model, action); - } -} - -void LLAnimationBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); - } -*/ -} - -// +=================================================+ -// | LLObjectBridge | -// +=================================================+ - -// static -LLUUID LLObjectBridge::sContextMenuItemID; - -LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) : -LLItemBridge(inventory, uuid), mInvType(type) -{ - mAttachPt = (flags & 0xff); // low bye of inventory flags - - mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE; -} - -BOOL LLObjectBridge::isItemRemovable() -{ - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if(!avatar) return FALSE; - if(avatar->isWearingAttachment(mUUID)) return FALSE; - return LLInvFVBridge::isItemRemovable(); -} - -LLUIImagePtr LLObjectBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject ); -} - -LLInventoryObject* LLObjectBridge::getObject() const -{ - LLInventoryObject* object = NULL; - LLInventoryModel* model = getInventoryModel(); - if(model) - { - object = (LLInventoryObject*)model->getObject(mUUID); - } - return object; -} - -// virtual -void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("attach" == action) - { - LLUUID object_id = mUUID; - LLViewerInventoryItem* item; - item = (LLViewerInventoryItem*)gInventory.getItem(object_id); - if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID())) - { - rez_attachment(item, NULL); - } - else if(item && item->isComplete()) - { - // must be in library. copy it to our inventory and put it on. - LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - gFocusMgr.setKeyboardFocus(NULL); - } - else if ("detach" == action) - { - LLInventoryItem* item = gInventory.getItem(mUUID); - if(item) - { - gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID()); - gMessageSystem->sendReliable( gAgent.getRegion()->getHost()); - } - // this object might have been selected, so let the selection manager know it's gone now - LLViewerObject *found_obj = - gObjectList.findObject(item->getUUID()); - if (found_obj) - { - LLSelectMgr::getInstance()->remove(found_obj); - } - else - { - llwarns << "object not found - ignoring" << llendl; - } - } - else LLItemBridge::performAction(folder, model, action); -} - -void LLObjectBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } - - /* - LLFloaterReg::showInstance("properties", mUUID); - */ -} - -LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const -{ - U8 font = LLFontGL::NORMAL; - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar && avatar->isWearingAttachment( mUUID ) ) - { - font |= LLFontGL::BOLD; - } - - LLInventoryItem* item = getItem(); - if (item && item->getIsLinkType()) - { - font |= LLFontGL::ITALIC; - } - - return (LLFontGL::StyleFlags)font; -} - -std::string LLObjectBridge::getLabelSuffix() const -{ - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar && avatar->isWearingAttachment( mUUID ) ) - { - std::string attachment_point_name = avatar->getAttachedPointName(mUUID); - LLStringUtil::toLower(attachment_point_name); - - LLStringUtil::format_map_t args; - args["[ATTACHMENT_POINT]"] = attachment_point_name.c_str(); - return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args); - } - else - { - return LLItemBridge::getLabelSuffix(); - } -} - -void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment) -{ - LLSD payload; - payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link. - - S32 attach_pt = 0; - if (gAgent.getAvatarObject() && attachment) - { - for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin(); - iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter) - { - if (iter->second == attachment) - { - attach_pt = iter->first; - break; - } - } - } - - payload["attachment_point"] = attach_pt; - -#if !ENABLE_MULTIATTACHMENTS - if (attachment && attachment->getNumObjects() > 0) - { - LLNotifications::instance().add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez); - } - else -#endif - { - LLNotifications::instance().forceResponse(LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/); - } -} - -bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response) -{ - LLVOAvatar *avatarp = gAgent.getAvatarObject(); - - if (!avatarp->canAttachMoreObjects()) - { - LLSD args; - args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS); - LLNotifications::instance().add("MaxAttachmentsOnOutfit", args); - return false; - } - - S32 option = LLNotification::getSelectedOption(notification, response); - if (option == 0/*YES*/) - { - LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID()); - - if (itemp) - { - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_ObjectData); - msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID()); - msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner()); - U8 attachment_pt = notification["payload"]["attachment_point"].asInteger(); -#if ENABLE_MULTIATTACHMENTS - attachment_pt |= ATTACHMENT_ADD; -#endif - msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt); - pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions()); - msg->addStringFast(_PREHASH_Name, itemp->getName()); - msg->addStringFast(_PREHASH_Description, itemp->getDescription()); - msg->sendReliable(gAgent.getRegion()->getHost()); - } - } - return false; -} -static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("ReplaceAttachment", confirm_replace_attachment_rez); - -void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - LLInventoryItem* item = getItem(); - if (item && item->getIsLinkType()) - { - items.push_back(std::string("Goto Link")); - } - - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - LLObjectBridge::sContextMenuItemID = mUUID; - - if(item) - { - LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); - if( !avatarp ) - { - return; - } - - if( avatarp->isWearingAttachment( mUUID ) ) - { - items.push_back(std::string("Detach From Yourself")); - } - else - if( !isInTrash() && !isLinkedObjectInTrash() ) - { - items.push_back(std::string("Attach Separator")); - items.push_back(std::string("Object Wear")); - items.push_back(std::string("Attach To")); - items.push_back(std::string("Attach To HUD")); - // commented out for DEV-32347 - //items.push_back(std::string("Restore to Last Position")); - - if (!avatarp->canAttachMoreObjects()) - { - disabled_items.push_back(std::string("Object Wear")); - disabled_items.push_back(std::string("Attach To")); - disabled_items.push_back(std::string("Attach To HUD")); - } - LLMenuGL* attach_menu = menu.findChildMenuByName("Attach To", TRUE); - LLMenuGL* attach_hud_menu = menu.findChildMenuByName("Attach To HUD", TRUE); - LLVOAvatar *avatarp = gAgent.getAvatarObject(); - if (attach_menu - && (attach_menu->getChildCount() == 0) - && attach_hud_menu - && (attach_hud_menu->getChildCount() == 0) - && avatarp) - { - for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); - iter != avatarp->mAttachmentPoints.end(); ) - { - LLVOAvatar::attachment_map_t::iterator curiter = iter++; - LLViewerJointAttachment* attachment = curiter->second; - LLMenuItemCallGL::Params p; - std::string submenu_name = attachment->getName(); - if (LLTrans::getString(submenu_name) != "") - { - p.name = (" ")+LLTrans::getString(submenu_name)+" "; - } - else - { - p.name = submenu_name; - } - LLSD cbparams; - cbparams["index"] = curiter->first; - cbparams["label"] = attachment->getName(); - p.on_click.function_name = "Inventory.AttachObject"; - p.on_click.parameter = LLSD(attachment->getName()); - p.on_enable.function_name = "Attachment.Label"; - p.on_enable.parameter = cbparams; - LLView* parent = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu; - LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent); - } - } - } - } - } - hideContextEntries(menu, items, disabled_items); -} - -BOOL LLObjectBridge::renameItem(const std::string& new_name) -{ - if(!isItemRenameable()) - return FALSE; - LLPreview::dirty(mUUID); - LLInventoryModel* model = getInventoryModel(); - if(!model) - return FALSE; - LLViewerInventoryItem* item = getItem(); - if(item && (item->getName() != new_name)) - { - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->rename(new_name); - buildDisplayName(new_item, mDisplayName); - new_item->updateServer(FALSE); - model->updateItem(new_item); - - model->notifyObservers(); - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar ) - { - LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() ); - if( obj ) - { - LLSelectMgr::getInstance()->deselectAll(); - LLSelectMgr::getInstance()->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); - LLSelectMgr::getInstance()->selectionSetObjectName( new_name ); - LLSelectMgr::getInstance()->deselectAll(); - } - } - } - // return FALSE because we either notified observers (& therefore - // rebuilt) or we didn't update. - return FALSE; -} - -// +=================================================+ -// | LLLSLTextBridge | -// +=================================================+ - -LLUIImagePtr LLLSLTextBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); -} - -void LLLSLTextBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } - /* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); - } - */ -} - -// +=================================================+ -// | LLWearableBridge | -// +=================================================+ - -// *NOTE: hack to get from avatar inventory to avatar -void wear_inventory_item_on_avatar( LLInventoryItem* item ) -{ - if(item) - { - lldebugs << "wear_inventory_item_on_avatar( " << item->getName() - << " )" << llendl; - - LLAppearanceManager::wearItem(item); - } -} - -void wear_add_inventory_item_on_avatar( LLInventoryItem* item ) -{ - if(item) - { - lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName() - << " )" << llendl; - - LLWearableList::instance().getAsset(item->getAssetUUID(), - item->getName(), - item->getType(), - LLWearableBridge::onWearAddOnAvatarArrived, - new LLUUID(item->getUUID())); - } -} - -void remove_inventory_category_from_avatar( LLInventoryCategory* category ) -{ - if(!category) return; - lldebugs << "remove_inventory_category_from_avatar( " << category->getName() - << " )" << llendl; - - - if( gFloaterCustomize ) - { - gFloaterCustomize->askToSaveIfDirty( - boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID())); - } - else - { - remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); - } -} - -struct OnRemoveStruct -{ - LLUUID mUUID; - OnRemoveStruct(const LLUUID& uuid): - mUUID(uuid) - { - } -}; - -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id) -{ - - // Find all the wearables that are in the category's subtree. - lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl; - if(proceed) - { - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - LLFindWearables is_wearable; - gInventory.collectDescendentsIf(category_id, - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_wearable); - S32 i; - S32 wearable_count = item_array.count(); - - LLInventoryModel::cat_array_t obj_cat_array; - LLInventoryModel::item_array_t obj_item_array; - LLIsType is_object( LLAssetType::AT_OBJECT ); - gInventory.collectDescendentsIf(category_id, - obj_cat_array, - obj_item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_object); - S32 obj_count = obj_item_array.count(); - - // Find all gestures in this folder - LLInventoryModel::cat_array_t gest_cat_array; - LLInventoryModel::item_array_t gest_item_array; - LLIsType is_gesture( LLAssetType::AT_GESTURE ); - gInventory.collectDescendentsIf(category_id, - gest_cat_array, - gest_item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_gesture); - S32 gest_count = gest_item_array.count(); - - if (wearable_count > 0) //Loop through wearables. If worn, remove. - { - for(i = 0; i < wearable_count; ++i) - { - if( gAgentWearables.isWearingItem (item_array.get(i)->getUUID()) ) - { - LLWearableList::instance().getAsset(item_array.get(i)->getAssetUUID(), - item_array.get(i)->getName(), - item_array.get(i)->getType(), - LLWearableBridge::onRemoveFromAvatarArrived, - new OnRemoveStruct(item_array.get(i)->getUUID())); - - } - } - } - - - if (obj_count > 0) - { - for(i = 0; i < obj_count; ++i) - { - gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData ); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item_array.get(i)->getUUID() ); - - gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); - - // this object might have been selected, so let the selection manager know it's gone now - LLViewerObject *found_obj = gObjectList.findObject( obj_item_array.get(i)->getUUID()); - if (found_obj) - { - LLSelectMgr::getInstance()->remove(found_obj); - } - else - { - llwarns << "object not found, ignoring" << llendl; - } - } - } - - if (gest_count > 0) - { - for(i = 0; i < gest_count; ++i) - { - if ( LLGestureManager::instance().isGestureActive( gest_item_array.get(i)->getUUID()) ) - { - LLGestureManager::instance().deactivateGesture( gest_item_array.get(i)->getUUID() ); - gInventory.updateItem( gest_item_array.get(i) ); - gInventory.notifyObservers(); - } - - } - } - } -} - -BOOL LLWearableBridge::renameItem(const std::string& new_name) -{ - if( gAgentWearables.isWearingItem( mUUID ) ) - { - gAgentWearables.setWearableName( mUUID, new_name ); - } - return LLItemBridge::renameItem(new_name); -} - -BOOL LLWearableBridge::isItemRemovable() -{ - if (gAgentWearables.isWearingItem(mUUID)) return FALSE; - return LLInvFVBridge::isItemRemovable(); -} - -std::string LLWearableBridge::getLabelSuffix() const -{ - if( gAgentWearables.isWearingItem( mUUID ) ) - { - return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn"); - } - else - { - return LLItemBridge::getLabelSuffix(); - } -} - -LLUIImagePtr LLWearableBridge::getIcon() const -{ - return get_item_icon(mAssetType, mInvType, mWearableType, FALSE); -} - -// virtual -void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("wear" == action) - { - wearOnAvatar(); - } - else if ("wear_add" == action) - { - wearAddOnAvatar(); - } - else if ("edit" == action) - { - editOnAvatar(); - return; - } - else if ("take_off" == action) - { - if(gAgentWearables.isWearingItem(mUUID)) - { - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLWearableList::instance().getAsset(item->getAssetUUID(), - item->getName(), - item->getType(), - LLWearableBridge::onRemoveFromAvatarArrived, - new OnRemoveStruct(mUUID)); - } - } - } - else LLItemBridge::performAction(folder, model, action); -} - -void LLWearableBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } - /* - if( isInTrash() ) - { - LLNotifications::instance().add("CannotWearTrash"); - } - else if(isAgentInventory()) - { - if( !gAgentWearables.isWearingItem( mUUID ) ) - { - wearOnAvatar(); - } - } - else - { - // must be in the inventory library. copy it to our inventory - // and put it on right away. - LLViewerInventoryItem* item = getItem(); - if(item && item->isComplete()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else if(item) - { - // *TODO: We should fetch the item details, and then do - // the operation above. - LLNotifications::instance().add("CannotWearInfoNotComplete"); - } - } - */ -} - -void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLWearableBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { // FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere - BOOL no_open = ((flags & SUPPRESS_OPEN_ITEM) == SUPPRESS_OPEN_ITEM); - - // If we have clothing, don't add "Open" as it's the same action as "Wear" SL-18976 - LLViewerInventoryItem* item = getItem(); - if( !no_open && item ) - { - no_open = (item->getType() == LLAssetType::AT_CLOTHING) || - (item->getType() == LLAssetType::AT_BODYPART); - } - if (!no_open) - { - items.push_back(std::string("Open")); - } - - if (item && item->getIsLinkType()) - { - items.push_back(std::string("Goto Link")); - } - - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - items.push_back(std::string("Wearable Separator")); - - items.push_back(std::string("Wearable Wear")); - items.push_back(std::string("Wearable Add")); - items.push_back(std::string("Wearable Edit")); - - if ((flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Wearable Edit")); - } - // Don't allow items to be worn if their baseobj is in the trash. - if (isLinkedObjectInTrash()) - { - disabled_items.push_back(std::string("Wearable Wear")); - disabled_items.push_back(std::string("Wearable Add")); - disabled_items.push_back(std::string("Wearable Edit")); - } - - // Disable wear and take off based on whether the item is worn. - if(item) - { - switch (item->getType()) - { - case LLAssetType::AT_CLOTHING: - items.push_back(std::string("Take Off")); - case LLAssetType::AT_BODYPART: - if (gAgentWearables.isWearingItem(item->getUUID())) - { - disabled_items.push_back(std::string("Wearable Wear")); - disabled_items.push_back(std::string("Wearable Add")); - } - else - { - disabled_items.push_back(std::string("Take Off")); - } - break; - default: - break; - } - } - } - hideContextEntries(menu, items, disabled_items); -} - -// Called from menus -// static -BOOL LLWearableBridge::canWearOnAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return FALSE; - if(!self->isAgentInventory()) - { - LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem(); - if(!item || !item->isComplete()) return FALSE; - } - return (!gAgentWearables.isWearingItem(self->mUUID)); -} - -// Called from menus -// static -void LLWearableBridge::onWearOnAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return; - self->wearOnAvatar(); -} - -void LLWearableBridge::wearOnAvatar() -{ - // Don't wear anything until initial wearables are loaded, can - // destroy clothing items. - if (!gAgentWearables.areWearablesLoaded()) - { - LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); - return; - } - - LLViewerInventoryItem* item = getItem(); - if(item) - { - if(!isAgentInventory()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else - { - wear_inventory_item_on_avatar(item); - } - } -} - -void LLWearableBridge::wearAddOnAvatar() -{ - // Don't wear anything until initial wearables are loaded, can - // destroy clothing items. - if (!gAgentWearables.areWearablesLoaded()) - { - LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); - return; - } - - LLViewerInventoryItem* item = getItem(); - if(item) - { - if(!isAgentInventory()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else - { - wear_add_inventory_item_on_avatar(item); - } - } -} - -// static -void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata ) -{ - LLUUID* item_id = (LLUUID*) userdata; - if(wearable) - { - LLViewerInventoryItem* item = NULL; - item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); - if(item) - { - if(item->getAssetUUID() == wearable->getAssetID()) - { - gAgentWearables.setWearableItem(item, wearable); - gInventory.notifyObservers(); - //self->getFolderItem()->refreshFromRoot(); - } - else - { - llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; - } - } - } - delete item_id; -} - -// static -// BAP remove the "add" code path once everything is fully COF-ified. -void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata ) -{ - LLUUID* item_id = (LLUUID*) userdata; - if(wearable) - { - LLViewerInventoryItem* item = NULL; - item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); - if(item) - { - if(item->getAssetUUID() == wearable->getAssetID()) - { - bool do_append = true; - gAgentWearables.setWearableItem(item, wearable, do_append); - gInventory.notifyObservers(); - //self->getFolderItem()->refreshFromRoot(); - } - else - { - llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; - } - } - } - delete item_id; -} - -// static -BOOL LLWearableBridge::canEditOnAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return FALSE; - - return (gAgentWearables.isWearingItem(self->mUUID)); -} - -// static -void LLWearableBridge::onEditOnAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(self) - { - self->editOnAvatar(); - } -} - -void LLWearableBridge::editOnAvatar() -{ - const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID); - if( wearable ) - { - // Set the tab to the right wearable. - if (gFloaterCustomize) - gFloaterCustomize->setCurrentWearableType( wearable->getType() ); - - if( CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() ) - { - // Start Avatar Customization - gAgent.changeCameraToCustomizeAvatar(); - } - } -} - -// static -BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if( self && (LLAssetType::AT_BODYPART != self->mAssetType) ) - { - return gAgentWearables.isWearingItem( self->mUUID ); - } - return FALSE; -} - -// static -void LLWearableBridge::onRemoveFromAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return; - if(gAgentWearables.isWearingItem(self->mUUID)) - { - LLViewerInventoryItem* item = self->getItem(); - if (item) - { - LLUUID parent_id = item->getParentUUID(); - LLWearableList::instance().getAsset(item->getAssetUUID(), - item->getName(), - item->getType(), - onRemoveFromAvatarArrived, - new OnRemoveStruct(LLUUID(self->mUUID))); - } - } -} - -// static -void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable, - void* userdata) -{ - OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata; - const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID); - if(wearable) - { - if( gAgentWearables.isWearingItem( item_id ) ) - { - EWearableType type = wearable->getType(); - - if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES ) ) //&& - //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) ) - { - // MULTI_WEARABLE: FIXME HACK - always remove all - bool do_remove_all = false; - gAgentWearables.removeWearable( type, do_remove_all, 0 ); - } - } - } - - // Find and remove this item from the COF. - LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::getCOF()); - llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF. - for (LLInventoryModel::item_array_t::const_iterator iter = items.begin(); - iter != items.end(); - ++iter) - { - const LLViewerInventoryItem *linked_item = (*iter); - const LLUUID &item_id = linked_item->getUUID(); - gInventory.purgeObject(item_id); - } - gInventory.notifyObservers(); - - delete on_remove_struct; -} - -LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type, - const LLUUID& uuid,LLInventoryModel* model) -{ - LLInvFVBridgeAction* action = NULL; - switch(asset_type) - { - case LLAssetType::AT_TEXTURE: - action = new LLTextureBridgeAction(uuid,model); - break; - - case LLAssetType::AT_SOUND: - action = new LLSoundBridgeAction(uuid,model); - break; - - case LLAssetType::AT_LANDMARK: - action = new LLLandmarkBridgeAction(uuid,model); - break; - - case LLAssetType::AT_CALLINGCARD: - action = new LLCallingCardBridgeAction(uuid,model); - break; - - case LLAssetType::AT_OBJECT: - action = new LLObjectBridgeAction(uuid,model); - break; - - case LLAssetType::AT_NOTECARD: - action = new LLNotecardBridgeAction(uuid,model); - break; - - case LLAssetType::AT_ANIMATION: - action = new LLAnimationBridgeAction(uuid,model); - break; - - case LLAssetType::AT_GESTURE: - action = new LLGestureBridgeAction(uuid,model); - break; - - case LLAssetType::AT_LSL_TEXT: - action = new LLLSLTextBridgeAction(uuid,model); - break; - - case LLAssetType::AT_CLOTHING: - case LLAssetType::AT_BODYPART: - action = new LLWearableBridgeAction(uuid,model); - - break; - - default: - break; - } - return action; -} - -//static -void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type, - const LLUUID& uuid,LLInventoryModel* model) -{ - LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); - if(action) - { - action->doIt(); - delete action; - } -} - -//static -void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model) -{ - LLAssetType::EType asset_type = model->getItem(uuid)->getType(); - LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); - if(action) - { - action->doIt(); - delete action; - } -} - -LLViewerInventoryItem* LLInvFVBridgeAction::getItem() const -{ - if(mModel) - return (LLViewerInventoryItem*)mModel->getItem(mUUID); - return NULL; -} - -//virtual -void LLTextureBridgeAction::doIt() -{ - if (getItem()) - { - LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - -//virtual -void LLSoundBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if(item) - { - LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLLandmarkBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if( item ) - { - // Opening (double-clicking) a landmark immediately teleports, - // but warns you the first time. - LLSD payload; - payload["asset_id"] = item->getAssetUUID(); - LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); - } - - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLCallingCardBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if(item && item->getCreatorUUID().notNull()) - { - LLAvatarActions::showProfile(item->getCreatorUUID()); - } - - LLInvFVBridgeAction::doIt(); -} - -//virtual -void -LLNotecardBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - -//virtual -void LLGestureBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); - preview->setFocus(TRUE); - } - - LLInvFVBridgeAction::doIt(); -} - -//virtual -void LLAnimationBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLObjectBridgeAction::doIt() -{ - LLFloaterReg::showInstance("properties", mUUID); - - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLLSLTextBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - - -BOOL LLWearableBridgeAction::isInTrash() const -{ - if(!mModel) return FALSE; - LLUUID trash_id = mModel->findCategoryUUIDForType(LLAssetType::AT_TRASH); - return mModel->isObjectDescendentOf(mUUID, trash_id); -} - -BOOL LLWearableBridgeAction::isAgentInventory() const -{ - if(!mModel) return FALSE; - if(gInventory.getRootFolderID() == mUUID) return TRUE; - return mModel->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); -} - -void LLWearableBridgeAction::wearOnAvatar() -{ - // Don't wear anything until initial wearables are loaded, can - // destroy clothing items. - if (!gAgentWearables.areWearablesLoaded()) - { - LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); - return; - } - - LLViewerInventoryItem* item = getItem(); - if(item) - { - if(!isAgentInventory()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else - { - wear_inventory_item_on_avatar(item); - } - } -} - -//virtual -void LLWearableBridgeAction::doIt() -{ - if(isInTrash()) - { - LLNotifications::instance().add("CannotWearTrash"); - } - else if(isAgentInventory()) - { - if(!gAgentWearables.isWearingItem(mUUID)) - { - wearOnAvatar(); - } - } - else - { - // must be in the inventory library. copy it to our inventory - // and put it on right away. - LLViewerInventoryItem* item = getItem(); - if(item && item->isComplete()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else if(item) - { - // *TODO: We should fetch the item details, and then do - // the operation above. - LLNotifications::instance().add("CannotWearInfoNotComplete"); - } - } - - LLInvFVBridgeAction::doIt(); -} - -// +=================================================+ -// | LLLinkItemBridge | -// +=================================================+ -// For broken links - -std::string LLLinkItemBridge::sPrefix("Link: "); - - -LLUIImagePtr LLLinkItemBridge::getIcon() const -{ - if (LLViewerInventoryItem *item = getItem()) - { - return get_item_icon(item->getActualType(), LLInventoryType::IT_NONE, 0, FALSE); - } - return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE); -} - -void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - // *TODO: Translate - lldebugs << "LLLink::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Delete")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Delete")); - } - } - hideContextEntries(menu, items, disabled_items); -} - - -// +=================================================+ -// | LLLinkBridge | -// +=================================================+ -// For broken links. - -std::string LLLinkFolderBridge::sPrefix("Link: "); - - -LLUIImagePtr LLLinkFolderBridge::getIcon() const -{ - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; - if (LLViewerInventoryItem *item = getItem()) - { - if (const LLViewerInventoryCategory* cat = item->getLinkedCategory()) - { - preferred_type = cat->getPreferredType(); - } - } - return LLFolderBridge::getIcon(preferred_type); -} - -void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - // *TODO: Translate - lldebugs << "LLLink::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Goto Link")); - items.push_back(std::string("Delete")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Delete")); - } - } - hideContextEntries(menu, items, disabled_items); -} - -void LLLinkFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("goto" == action) - { - gotoItem(folder); - return; - } - LLItemBridge::performAction(folder,model,action); -} - -void LLLinkFolderBridge::gotoItem(LLFolderView *folder) -{ - const LLUUID &cat_uuid = getFolderID(); - if (!cat_uuid.isNull()) - { - if (LLFolderViewItem *base_folder = folder->getItemByID(cat_uuid)) - { - if (LLInventoryModel* model = getInventoryModel()) - { - model->fetchDescendentsOf(cat_uuid); - } - base_folder->setOpen(TRUE); - folder->setSelectionFromRoot(base_folder,TRUE); - folder->scrollToShowSelection(); - } - } -} - -const LLUUID &LLLinkFolderBridge::getFolderID() const -{ - if (LLViewerInventoryItem *link_item = getItem()) - { - if (const LLViewerInventoryCategory *cat = link_item->getLinkedCategory()) - { - const LLUUID& cat_uuid = cat->getUUID(); - return cat_uuid; - } - } - return LLUUID::null; -} +/** + * @file llinventorybridge.cpp + * @brief Implementation of the Inventory-Folder-View-Bridge classes. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include <utility> // for std::pair<> + +#include "llfloaterinventory.h" +#include "llinventorybridge.h" + +#include "message.h" + +#include "llagent.h" +#include "llagentwearables.h" +#include "llcallingcard.h" +#include "llcheckboxctrl.h" // for radio buttons +#include "llfloaterreg.h" +#include "llradiogroup.h" +#include "llspinctrl.h" +#include "lltextbox.h" +#include "llui.h" + +#include "llviewercontrol.h" +#include "llfirstuse.h" +#include "llfoldertype.h" +#include "llfloaterchat.h" +#include "llfloatercustomize.h" +#include "llfloaterproperties.h" +#include "llfloaterworldmap.h" +#include "llfocusmgr.h" +#include "llfolderview.h" +#include "llfriendcard.h" +#include "llavataractions.h" +#include "llgesturemgr.h" +#include "lliconctrl.h" +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "llinventorypanel.h" +#include "llinventoryclipboard.h" +#include "lllineeditor.h" +#include "llmenugl.h" +#include "llpreviewanim.h" +#include "llpreviewgesture.h" +#include "llpreviewnotecard.h" +#include "llpreviewscript.h" +#include "llpreviewsound.h" +#include "llpreviewtexture.h" +#include "llresmgr.h" +#include "llscrollcontainer.h" +#include "llimview.h" +#include "lltooldraganddrop.h" +#include "llviewertexturelist.h" +#include "llviewerinventory.h" +#include "llviewerobjectlist.h" +#include "llviewerwindow.h" +#include "llvoavatar.h" +#include "llwearable.h" +#include "llwearablelist.h" +#include "llviewermessage.h" +#include "llviewerregion.h" +#include "llvoavatarself.h" +#include "lltabcontainer.h" +#include "lluictrlfactory.h" +#include "llselectmgr.h" +#include "llsidetray.h" +#include "llfloateropenobject.h" +#include "lltrans.h" +#include "llappearancemgr.h" + +using namespace LLOldEvents; + +// Helpers +// bug in busy count inc/dec right now, logic is complex... do we really need it? +void inc_busy_count() +{ +// gViewerWindow->getWindow()->incBusyCount(); +// check balance of these calls if this code is changed to ever actually +// *do* something! +} +void dec_busy_count() +{ +// gViewerWindow->getWindow()->decBusyCount(); +// check balance of these calls if this code is changed to ever actually +// *do* something! +} + +// Function declarations +void wear_add_inventory_item_on_avatar(LLInventoryItem* item); +void remove_inventory_category_from_avatar(LLInventoryCategory* category); +void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id); +bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*); +bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response); + +std::string ICON_NAME[ICON_NAME_COUNT] = +{ + "Inv_Texture", + "Inv_Sound", + "Inv_CallingCard", + "Inv_CallingCard", + "Inv_Landmark", + "Inv_Landmark", + "Inv_Script", + "Inv_Clothing", + "Inv_Object", + "Inv_Object", + "Inv_Notecard", + "Inv_Skin", + "Inv_Snapshot", + + "Inv_BodyShape", + "Inv_Skin", + "Inv_Hair", + "Inv_Eye", + "Inv_Shirt", + "Inv_Pants", + "Inv_Shoe", + "Inv_Socks", + "Inv_Jacket", + "Inv_Gloves", + "Inv_Undershirt", + "Inv_Underpants", + "Inv_Skirt", + "inv_item_alpha.tga", + "inv_item_tattoo.tga", + + "Inv_Animation", + "Inv_Gesture", + + "inv_item_linkitem.tga", + "inv_item_linkfolder.tga" +}; + + +// +=================================================+ +// | LLInventoryPanelObserver | +// +=================================================+ +void LLInventoryPanelObserver::changed(U32 mask) +{ + mIP->modelChanged(mask); +} + + +// +=================================================+ +// | LLInvFVBridge | +// +=================================================+ + +LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : +mUUID(uuid), mInvType(LLInventoryType::IT_NONE) +{ + mInventoryPanel = inventory->getHandle(); +} + +const std::string& LLInvFVBridge::getName() const +{ + LLInventoryObject* obj = getInventoryObject(); + if(obj) + { + return obj->getName(); + } + return LLStringUtil::null; +} + +const std::string& LLInvFVBridge::getDisplayName() const +{ + return getName(); +} + +// Folders have full perms +PermissionMask LLInvFVBridge::getPermissionMask() const +{ + + return PERM_ALL; +} + +// virtual +LLAssetType::EType LLInvFVBridge::getPreferredType() const +{ + return LLAssetType::AT_NONE; +} + + +// Folders don't have creation dates. +time_t LLInvFVBridge::getCreationDate() const +{ + return 0; +} + +// Can be destoryed (or moved to trash) +BOOL LLInvFVBridge::isItemRemovable() +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + if(model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) + { + return TRUE; + } + return FALSE; +} + +// Sends an update to all link items that point to the base item. +void LLInvFVBridge::renameLinkedItems(const LLUUID &item_id, const std::string& new_name) +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + + LLInventoryItem* itemp = model->getItem(mUUID); + if (!itemp) return; + + if (itemp->getIsLinkType()) + { + return; + } + + LLInventoryModel::item_array_t item_array = model->collectLinkedItems(item_id); + for (LLInventoryModel::item_array_t::iterator iter = item_array.begin(); + iter != item_array.end(); + iter++) + { + LLViewerInventoryItem *linked_item = (*iter); + if (linked_item->getUUID() == item_id) continue; + + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(linked_item); + new_item->rename(new_name); + new_item->updateServer(FALSE); + model->updateItem(new_item); + // model->addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID()); + } + model->notifyObservers(); +} + +// Can be moved to another folder +BOOL LLInvFVBridge::isItemMovable() const +{ + return TRUE; +} + +/*virtual*/ +/** + * @brief Adds this item into clipboard storage + */ +void LLInvFVBridge::cutToClipboard() +{ + if(isItemMovable()) + { + LLInventoryClipboard::instance().cut(mUUID); + } +} +// *TODO: make sure this does the right thing +void LLInvFVBridge::showProperties() +{ + LLSD key; + key["id"] = mUUID; + LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); + + // LLFloaterReg::showInstance("properties", mUUID); +} + +void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) +{ + // Deactivate gestures when moving them into Trash + LLInvFVBridge* bridge; + LLInventoryModel* model = getInventoryModel(); + LLViewerInventoryItem* item = NULL; + LLViewerInventoryCategory* cat = NULL; + LLInventoryModel::cat_array_t descendent_categories; + LLInventoryModel::item_array_t descendent_items; + S32 count = batch.count(); + S32 i,j; + for(i = 0; i < count; ++i) + { + bridge = (LLInvFVBridge*)(batch.get(i)); + if(!bridge || !bridge->isItemRemovable()) continue; + item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); + if (item) + { + if(LLAssetType::AT_GESTURE == item->getType()) + { + LLGestureManager::instance().deactivateGesture(item->getUUID()); + } + } + } + for(i = 0; i < count; ++i) + { + bridge = (LLInvFVBridge*)(batch.get(i)); + if(!bridge || !bridge->isItemRemovable()) continue; + cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); + if (cat) + { + gInventory.collectDescendents( cat->getUUID(), descendent_categories, descendent_items, FALSE ); + for (j=0; j<descendent_items.count(); j++) + { + if(LLAssetType::AT_GESTURE == descendent_items[j]->getType()) + { + LLGestureManager::instance().deactivateGesture(descendent_items[j]->getUUID()); + } + } + } + } + removeBatchNoCheck(batch); +} + +void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch) +{ + // this method moves a bunch of items and folders to the trash. As + // per design guidelines for the inventory model, the message is + // built and the accounting is performed first. After all of that, + // we call LLInventoryModel::moveObject() to move everything + // around. + LLInvFVBridge* bridge; + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLMessageSystem* msg = gMessageSystem; + LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + LLViewerInventoryItem* item = NULL; + LLViewerInventoryCategory* cat = NULL; + std::vector<LLUUID> move_ids; + LLInventoryModel::update_map_t update; + bool start_new_message = true; + S32 count = batch.count(); + S32 i; + for(i = 0; i < count; ++i) + { + bridge = (LLInvFVBridge*)(batch.get(i)); + if(!bridge || !bridge->isItemRemovable()) continue; + item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); + if(item) + { + if(item->getParentUUID() == trash_id) continue; + move_ids.push_back(item->getUUID()); + LLPreview::hide(item->getUUID()); + --update[item->getParentUUID()]; + ++update[trash_id]; + if(start_new_message) + { + start_new_message = false; + msg->newMessageFast(_PREHASH_MoveInventoryItem); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addBOOLFast(_PREHASH_Stamp, TRUE); + } + msg->nextBlockFast(_PREHASH_InventoryData); + msg->addUUIDFast(_PREHASH_ItemID, item->getUUID()); + msg->addUUIDFast(_PREHASH_FolderID, trash_id); + msg->addString("NewName", NULL); + if(msg->isSendFullFast(_PREHASH_InventoryData)) + { + start_new_message = true; + gAgent.sendReliableMessage(); + gInventory.accountForUpdate(update); + update.clear(); + } + } + } + if(!start_new_message) + { + start_new_message = true; + gAgent.sendReliableMessage(); + gInventory.accountForUpdate(update); + update.clear(); + } + for(i = 0; i < count; ++i) + { + bridge = (LLInvFVBridge*)(batch.get(i)); + if(!bridge || !bridge->isItemRemovable()) continue; + cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); + if(cat) + { + if(cat->getParentUUID() == trash_id) continue; + move_ids.push_back(cat->getUUID()); + --update[cat->getParentUUID()]; + ++update[trash_id]; + if(start_new_message) + { + start_new_message = false; + msg->newMessageFast(_PREHASH_MoveInventoryFolder); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addBOOL("Stamp", TRUE); + } + msg->nextBlockFast(_PREHASH_InventoryData); + msg->addUUIDFast(_PREHASH_FolderID, cat->getUUID()); + msg->addUUIDFast(_PREHASH_ParentID, trash_id); + if(msg->isSendFullFast(_PREHASH_InventoryData)) + { + start_new_message = true; + gAgent.sendReliableMessage(); + gInventory.accountForUpdate(update); + update.clear(); + } + } + } + if(!start_new_message) + { + gAgent.sendReliableMessage(); + gInventory.accountForUpdate(update); + } + + // move everything. + std::vector<LLUUID>::iterator it = move_ids.begin(); + std::vector<LLUUID>::iterator end = move_ids.end(); + for(; it != end; ++it) + { + gInventory.moveObject((*it), trash_id); + } + + // notify inventory observers. + model->notifyObservers(); +} + +BOOL LLInvFVBridge::isClipboardPasteable() const +{ + if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) + { + return FALSE; + } + LLInventoryModel* model = getInventoryModel(); + if (!model) + { + return FALSE; + } + + const LLUUID &agent_id = gAgent.getID(); + + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + for(S32 i = 0; i < count; i++) + { + const LLUUID &item_id = objects.get(i); + + // Can't paste folders + const LLInventoryCategory *cat = model->getCategory(item_id); + if (cat) + { + return FALSE; + } + + const LLInventoryItem *item = model->getItem(item_id); + if (item) + { + if (!item->getPermissions().allowCopyBy(agent_id)) + { + return FALSE; + } + } + } + return TRUE; +} + +BOOL LLInvFVBridge::isClipboardPasteableAsLink() const +{ + if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) + { + return FALSE; + } + const LLInventoryModel* model = getInventoryModel(); + if (!model) + { + return FALSE; + } + + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + for(S32 i = 0; i < count; i++) + { + const LLInventoryItem *item = model->getItem(objects.get(i)); + if (item) + { + if (!LLAssetType::lookupCanLink(item->getActualType())) + { + return FALSE; + } + } + const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i)); + if (cat && !LLAssetType::lookupCanLink(cat->getPreferredType())) + { + return FALSE; + } + } + return TRUE; +} + +void hide_context_entries(LLMenuGL& menu, + const std::vector<std::string> &entries_to_show, + const std::vector<std::string> &disabled_entries) +{ + const LLView::child_list_t *list = menu.getChildList(); + + LLView::child_list_t::const_iterator itor; + for (itor = list->begin(); itor != list->end(); ++itor) + { + std::string name = (*itor)->getName(); + + // descend into split menus: + LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(*itor); + if ((name == "More") && branchp) + { + hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries); + } + + + bool found = false; + std::vector<std::string>::const_iterator itor2; + for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2) + { + if (*itor2 == name) + { + found = true; + } + } + if (!found) + { + (*itor)->setVisible(FALSE); + } + else + { + for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2) + { + if (*itor2 == name) + { + (*itor)->setEnabled(FALSE); + } + } + } + } +} + +// Helper for commonly-used entries +void LLInvFVBridge::getClipboardEntries(bool show_asset_id, + std::vector<std::string> &items, + std::vector<std::string> &disabled_items, U32 flags) +{ + items.push_back(std::string("Rename")); + if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Rename")); + } + + if (show_asset_id) + { + items.push_back(std::string("Copy Asset UUID")); + if ( (! ( isItemPermissive() || gAgent.isGodlike() ) ) + || (flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Copy Asset UUID")); + } + } + + items.push_back(std::string("Copy Separator")); + + items.push_back(std::string("Copy")); + if (!isItemCopyable()) + { + disabled_items.push_back(std::string("Copy")); + } + + items.push_back(std::string("Paste")); + if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Paste")); + } + + items.push_back(std::string("Paste As Link")); + if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Paste As Link")); + } + items.push_back(std::string("Paste Separator")); + + items.push_back(std::string("Delete")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Delete")); + } +} + +void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("PurgeItem")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("PurgeItem")); + } + items.push_back(std::string("RestoreItem")); + } + else + { + items.push_back(std::string("Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + hide_context_entries(menu, items, disabled_items); +} + +// *TODO: remove this +BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const +{ + BOOL rv = FALSE; + + const LLInventoryObject* obj = getInventoryObject(); + + if(obj) + { + *type = LLAssetType::lookupDragAndDropType(obj->getActualType()); + if(*type == DAD_NONE) + { + return FALSE; + } + + *id = obj->getUUID(); + //object_ids.put(obj->getUUID()); + + if (*type == DAD_CATEGORY) + { + gInventory.startBackgroundFetch(obj->getUUID()); + } + + rv = TRUE; + } + + return rv; +} + +LLInventoryObject* LLInvFVBridge::getInventoryObject() const +{ + LLInventoryObject* obj = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + obj = (LLInventoryObject*)model->getObject(mUUID); + } + return obj; +} + +LLInventoryModel* LLInvFVBridge::getInventoryModel() const +{ + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + return panel ? panel->getModel() : NULL; +} + +BOOL LLInvFVBridge::isInTrash() const +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + return model->isObjectDescendentOf(mUUID, trash_id); +} + +BOOL LLInvFVBridge::isLinkedObjectInTrash() const +{ + if (isInTrash()) return TRUE; + + const LLInventoryObject *obj = getInventoryObject(); + if (obj && obj->getIsLinkType()) + { + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id); + } + return FALSE; +} + +BOOL LLInvFVBridge::isAgentInventory() const +{ + const LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + if(gInventory.getRootFolderID() == mUUID) return TRUE; + return model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); +} + +BOOL LLInvFVBridge::isCOFFolder() const +{ + const LLInventoryModel* model = getInventoryModel(); + if(!model) return TRUE; + const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id)) + { + return TRUE; + } + return FALSE; +} + +BOOL LLInvFVBridge::isItemPermissive() const +{ + return FALSE; +} + +// static +void LLInvFVBridge::changeItemParent(LLInventoryModel* model, + LLViewerInventoryItem* item, + const LLUUID& new_parent, + BOOL restamp) +{ + if(item->getParentUUID() != new_parent) + { + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); + update.push_back(new_folder); + gInventory.accountForUpdate(update); + + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->setParent(new_parent); + new_item->updateParentOnServer(restamp); + model->updateItem(new_item); + model->notifyObservers(); + } +} + +// static +void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model, + LLViewerInventoryCategory* cat, + const LLUUID& new_parent, + BOOL restamp) +{ + if(cat->getParentUUID() != new_parent) + { + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); + update.push_back(new_folder); + gInventory.accountForUpdate(update); + + LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); + new_cat->setParent(new_parent); + new_cat->updateParentOnServer(restamp); + model->updateCategory(new_cat); + model->notifyObservers(); + } +} + + +const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type) +{ + const std::string rv= LLInventoryType::lookup(inv_type); + if(rv.empty()) + { + return std::string("<invalid>"); + } + return rv; +} + +LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, + LLAssetType::EType actual_asset_type, + LLInventoryType::EType inv_type, + LLInventoryPanel* inventory, + const LLUUID& uuid, + U32 flags) +{ + LLInvFVBridge* new_listener = NULL; + switch(asset_type) + { + case LLAssetType::AT_TEXTURE: + if(!(inv_type == LLInventoryType::IT_TEXTURE || inv_type == LLInventoryType::IT_SNAPSHOT)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLTextureBridge(inventory, uuid, inv_type); + break; + + case LLAssetType::AT_SOUND: + if(!(inv_type == LLInventoryType::IT_SOUND)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLSoundBridge(inventory, uuid); + break; + + case LLAssetType::AT_LANDMARK: + if(!(inv_type == LLInventoryType::IT_LANDMARK)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLLandmarkBridge(inventory, uuid, flags); + break; + + case LLAssetType::AT_CALLINGCARD: + if(!(inv_type == LLInventoryType::IT_CALLINGCARD)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLCallingCardBridge(inventory, uuid); + break; + + case LLAssetType::AT_SCRIPT: + if(!(inv_type == LLInventoryType::IT_LSL)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLScriptBridge(inventory, uuid); + break; + + case LLAssetType::AT_OBJECT: + if(!(inv_type == LLInventoryType::IT_OBJECT || inv_type == LLInventoryType::IT_ATTACHMENT)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLObjectBridge(inventory, uuid, inv_type, flags); + break; + + case LLAssetType::AT_NOTECARD: + if(!(inv_type == LLInventoryType::IT_NOTECARD)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLNotecardBridge(inventory, uuid); + break; + + case LLAssetType::AT_ANIMATION: + if(!(inv_type == LLInventoryType::IT_ANIMATION)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLAnimationBridge(inventory, uuid); + break; + + case LLAssetType::AT_GESTURE: + if(!(inv_type == LLInventoryType::IT_GESTURE)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLGestureBridge(inventory, uuid); + break; + + case LLAssetType::AT_LSL_TEXT: + if(!(inv_type == LLInventoryType::IT_LSL)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLLSLTextBridge(inventory, uuid); + break; + + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_BODYPART: + if(!(inv_type == LLInventoryType::IT_WEARABLE)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags); + break; + case LLAssetType::AT_CATEGORY: + case LLAssetType::AT_ROOT_CATEGORY: + if (actual_asset_type == LLAssetType::AT_LINK_FOLDER) + { + // Create a link folder handler instead. + new_listener = new LLLinkFolderBridge(inventory, uuid); + break; + } + new_listener = new LLFolderBridge(inventory, uuid); + break; + case LLAssetType::AT_LINK: + // Only should happen for broken links. + new_listener = new LLLinkItemBridge(inventory, uuid); + break; + case LLAssetType::AT_LINK_FOLDER: + // Only should happen for broken links. + new_listener = new LLLinkItemBridge(inventory, uuid); + break; + default: + llinfos << "Unhandled asset type (llassetstorage.h): " + << (S32)asset_type << llendl; + break; + } + + if (new_listener) + { + new_listener->mInvType = inv_type; + } + + return new_listener; +} + +void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid) +{ + LLInventoryCategory* cat = model->getCategory(uuid); + if (cat) + { + model->purgeDescendentsOf(uuid); + model->notifyObservers(); + } + LLInventoryObject* obj = model->getObject(uuid); + if (obj) + { + model->purgeObject(uuid); + model->notifyObservers(); + } +} + +// +=================================================+ +// | InventoryFVBridgeBuilder | +// +=================================================+ +LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset_type, + LLAssetType::EType actual_asset_type, + LLInventoryType::EType inv_type, + LLInventoryPanel* inventory, + const LLUUID& uuid, + U32 flags /* = 0x00 */) const +{ + return LLInvFVBridge::createBridge(asset_type, + actual_asset_type, + inv_type, + inventory, + uuid, + flags); +} + +// +=================================================+ +// | LLItemBridge | +// +=================================================+ + +void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("goto" == action) + { + gotoItem(folder); + } + if ("open" == action) + { + openItem(); + return; + } + else if ("properties" == action) + { + showProperties(); + return; + } + else if ("purge" == action) + { + purgeItem(model, mUUID); + return; + } + else if ("restoreToWorld" == action) + { + restoreToWorld(); + return; + } + else if ("restore" == action) + { + restoreItem(); + return; + } + else if ("copy_uuid" == action) + { + // Single item only + LLInventoryItem* item = model->getItem(mUUID); + if(!item) return; + LLUUID asset_id = item->getAssetUUID(); + std::string buffer; + asset_id.toString(buffer); + + gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer)); + return; + } + else if ("copy" == action) + { + copyToClipboard(); + return; + } + else if ("paste" == action) + { + // Single item only + LLInventoryItem* itemp = model->getItem(mUUID); + if (!itemp) return; + + LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); + if (!folder_view_itemp) return; + + folder_view_itemp->getListener()->pasteFromClipboard(); + return; + } + else if ("paste_link" == action) + { + // Single item only + LLInventoryItem* itemp = model->getItem(mUUID); + if (!itemp) return; + + LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); + if (!folder_view_itemp) return; + + folder_view_itemp->getListener()->pasteLinkFromClipboard(); + return; + } +} + +void LLItemBridge::selectItem() +{ + LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); + if(item && !item->isComplete()) + { + item->fetchFromServer(); + } +} + +void LLItemBridge::restoreItem() +{ + LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); + if(item) + { + LLInventoryModel* model = getInventoryModel(); + const LLUUID new_parent = model->findCategoryUUIDForType(item->getType()); + // do not restamp on restore. + LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE); + } +} + +void LLItemBridge::restoreToWorld() +{ + LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem(); + if (itemp) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("RezRestoreToWorld"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + + msg->nextBlockFast(_PREHASH_InventoryData); + itemp->packMessage(msg); + msg->sendReliable(gAgent.getRegion()->getHost()); + } + + //Similar functionality to the drag and drop rez logic + BOOL remove_from_inventory = FALSE; + + //remove local inventory copy, sim will deal with permissions and removing the item + //from the actual inventory if its a no-copy etc + if(!itemp->getPermissions().allowCopyBy(gAgent.getID())) + { + remove_from_inventory = TRUE; + } + + // Check if it's in the trash. (again similar to the normal rez logic) + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id)) + { + remove_from_inventory = TRUE; + } + + if(remove_from_inventory) + { + gInventory.deleteObject(itemp->getUUID()); + gInventory.notifyObservers(); + } +} + +void LLItemBridge::gotoItem(LLFolderView *folder) +{ + LLInventoryObject *obj = getInventoryObject(); + if (obj && obj->getIsLinkType()) + { + LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); + if (active_panel) + { + active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO); + } + } +} + +LLUIImagePtr LLItemBridge::getIcon() const +{ + return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]); +} + +PermissionMask LLItemBridge::getPermissionMask() const +{ + LLViewerInventoryItem* item = getItem(); + PermissionMask perm_mask = 0; + if(item) + { + BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); + BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); + BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, + gAgent.getID()); + + if (copy) perm_mask |= PERM_COPY; + if (mod) perm_mask |= PERM_MODIFY; + if (xfer) perm_mask |= PERM_TRANSFER; + + } + return perm_mask; +} + +const std::string& LLItemBridge::getDisplayName() const +{ + if(mDisplayName.empty()) + { + buildDisplayName(getItem(), mDisplayName); + } + return mDisplayName; +} + +void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name) +{ + if(item) + { + name.assign(item->getName()); + } + else + { + name.assign(LLStringUtil::null); + } +} + +LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const +{ + U8 font = LLFontGL::NORMAL; + + if( gAgentWearables.isWearingItem( mUUID ) ) + { + // llinfos << "BOLD" << llendl; + font |= LLFontGL::BOLD; + } + + const LLViewerInventoryItem* item = getItem(); + if (item && item->getIsLinkType()) + { + font |= LLFontGL::ITALIC; + } + return (LLFontGL::StyleFlags)font; +} + +std::string LLItemBridge::getLabelSuffix() const +{ + // String table is loaded before login screen and inventory items are + // loaded after login, so LLTrans should be ready. + static std::string NO_COPY =LLTrans::getString("no_copy"); + static std::string NO_MOD = LLTrans::getString("no_modify"); + static std::string NO_XFER = LLTrans::getString("no_transfer"); + static std::string LINK = LLTrans::getString("link"); + static std::string BROKEN_LINK = LLTrans::getString("broken_link"); + std::string suffix; + LLInventoryItem* item = getItem(); + if(item) + { + // it's a bit confusing to put nocopy/nomod/etc on calling cards. + if(LLAssetType::AT_CALLINGCARD != item->getType() + && item->getPermissions().getOwner() == gAgent.getID()) + { + BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType()); + if (broken_link) return BROKEN_LINK; + + BOOL link = item->getIsLinkType(); + if (link) return LINK; + + BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); + if (!copy) + { + suffix += NO_COPY; + } + BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); + if (!mod) + { + suffix += NO_MOD; + } + BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, + gAgent.getID()); + if (!xfer) + { + suffix += NO_XFER; + } + } + } + return suffix; +} + +time_t LLItemBridge::getCreationDate() const +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + return item->getCreationDate(); + } + return 0; +} + + +BOOL LLItemBridge::isItemRenameable() const +{ + LLViewerInventoryItem* item = getItem(); + if(item) + { + // (For now) Don't allow calling card rename since that may confuse users as to + // what the calling card points to. + if (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD) + { + return FALSE; + } + return (item->getPermissions().allowModifyBy(gAgent.getID())); + } + return FALSE; +} + +BOOL LLItemBridge::renameItem(const std::string& new_name) +{ + if(!isItemRenameable()) + return FALSE; + LLPreview::dirty(mUUID); + LLInventoryModel* model = getInventoryModel(); + if(!model) + return FALSE; + LLViewerInventoryItem* item = getItem(); + if(item && (item->getName() != new_name)) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->rename(new_name); + buildDisplayName(new_item, mDisplayName); + new_item->updateServer(FALSE); + model->updateItem(new_item); + + model->notifyObservers(); + } + // return FALSE because we either notified observers (& therefore + // rebuilt) or we didn't update. + return FALSE; +} + + +BOOL LLItemBridge::removeItem() +{ + if(!isItemRemovable()) + { + return FALSE; + } + // move it to the trash + LLPreview::hide(mUUID, TRUE); + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + LLViewerInventoryItem* item = getItem(); + + // if item is not already in trash + if(item && !model->isObjectDescendentOf(mUUID, trash_id)) + { + // move to trash, and restamp + LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE); + // delete was successful + return TRUE; + } + else + { + // tried to delete already item in trash (should purge?) + return FALSE; + } +} + +BOOL LLItemBridge::isItemCopyable() const +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + // can't copy worn objects. DEV-15183 + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + if( !avatarp ) + { + return FALSE; + } + + if(avatarp->isWearingAttachment(mUUID)) + { + return FALSE; + } + + // All items can be copied, not all can be pasted. + // The only time an item can't be copied is if it's a link + // return (item->getPermissions().allowCopyBy(gAgent.getID())); + if (item->getIsLinkType()) + { + return FALSE; + } + return TRUE; + } + return FALSE; +} +BOOL LLItemBridge::copyToClipboard() const +{ + if(isItemCopyable()) + { + LLInventoryClipboard::instance().add(mUUID); + return TRUE; + } + return FALSE; +} + +LLViewerInventoryItem* LLItemBridge::getItem() const +{ + LLViewerInventoryItem* item = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + item = (LLViewerInventoryItem*)model->getItem(mUUID); + } + return item; +} + +BOOL LLItemBridge::isItemPermissive() const +{ + LLViewerInventoryItem* item = getItem(); + if(item) + { + U32 mask = item->getPermissions().getMaskBase(); + if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) + { + return TRUE; + } + } + return FALSE; +} + +// +=================================================+ +// | LLFolderBridge | +// +=================================================+ + +LLFolderBridge* LLFolderBridge::sSelf=NULL; + +// Can be moved to another folder +BOOL LLFolderBridge::isItemMovable() const +{ + LLInventoryObject* obj = getInventoryObject(); + if(obj) + { + return (!LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)obj)->getPreferredType())); + } + return FALSE; +} + +void LLFolderBridge::selectItem() +{ +} + + +// Can be destroyed (or moved to trash) +BOOL LLFolderBridge::isItemRemovable() +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) + { + return FALSE; + } + + if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) + { + return FALSE; + } + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if( !avatar ) + { + return FALSE; + } + + LLInventoryCategory* category = model->getCategory(mUUID); + if( !category ) + { + return FALSE; + } + + if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) + { + return FALSE; + } + + LLInventoryModel::cat_array_t descendent_categories; + LLInventoryModel::item_array_t descendent_items; + gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); + + S32 i; + for( i = 0; i < descendent_categories.count(); i++ ) + { + LLInventoryCategory* category = descendent_categories[i]; + if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) + { + return FALSE; + } + } + + for( i = 0; i < descendent_items.count(); i++ ) + { + LLInventoryItem* item = descendent_items[i]; + if( (item->getType() == LLAssetType::AT_CLOTHING) || + (item->getType() == LLAssetType::AT_BODYPART) ) + { + if(gAgentWearables.isWearingItem(item->getUUID())) + { + return FALSE; + } + } + else + if( item->getType() == LLAssetType::AT_OBJECT ) + { + if(avatar->isWearingAttachment(item->getUUID())) + { + return FALSE; + } + } + } + + return TRUE; +} + +BOOL LLFolderBridge::isUpToDate() const +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); + if( !category ) + { + return FALSE; + } + + return category->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN; +} + +BOOL LLFolderBridge::isItemCopyable() const +{ + return TRUE; +} + +BOOL LLFolderBridge::copyToClipboard() const +{ + if(isItemCopyable()) + { + LLInventoryClipboard::instance().add(mUUID); + return TRUE; + } + return FALSE; +} + +BOOL LLFolderBridge::isClipboardPasteable() const +{ + if ( ! LLInvFVBridge::isClipboardPasteable() ) + return FALSE; + + // Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 + if ( LLFriendCardsManager::instance().isCategoryInFriendFolder( getCategory() ) ) + { + LLInventoryModel* model = getInventoryModel(); + if ( !model ) + { + return FALSE; + } + + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + const LLViewerInventoryCategory *current_cat = getCategory(); + + // Search for the direct descendent of current Friends subfolder among all pasted items, + // and return false if is found. + for(S32 i = objects.count() - 1; i >= 0; --i) + { + const LLUUID &obj_id = objects.get(i); + if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) + { + return FALSE; + } + } + + } + return TRUE; +} + +BOOL LLFolderBridge::isClipboardPasteableAsLink() const +{ + // Check normal paste-as-link permissions + if (!LLInvFVBridge::isClipboardPasteableAsLink()) + { + return FALSE; + } + + const LLInventoryModel* model = getInventoryModel(); + if (!model) + { + return FALSE; + } + + const LLViewerInventoryCategory *current_cat = getCategory(); + if (current_cat) + { + const BOOL is_in_friend_folder = LLFriendCardsManager::instance().isCategoryInFriendFolder( current_cat ); + const LLUUID ¤t_cat_id = current_cat->getUUID(); + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + for(S32 i = 0; i < count; i++) + { + const LLUUID &obj_id = objects.get(i); + const LLInventoryCategory *cat = model->getCategory(obj_id); + if (cat) + { + const LLUUID &cat_id = cat->getUUID(); + // Don't allow recursive pasting + if ((cat_id == current_cat_id) || + model->isObjectDescendentOf(current_cat_id, cat_id)) + { + return FALSE; + } + } + // Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 + if ( is_in_friend_folder ) + { + // If object is direct descendent of current Friends subfolder than return false. + // Note: We can't use 'const LLInventoryCategory *cat', because it may be null + // in case type of obj_id is LLInventoryItem. + if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) + { + return FALSE; + } + } + } + } + return TRUE; + +} + +BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, + BOOL drop) +{ + // This should never happen, but if an inventory item is incorrectly parented, + // the UI will get confused and pass in a NULL. + if(!inv_cat) return FALSE; + + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if(!avatar) return FALSE; + + // cannot drag categories into library + if(!isAgentInventory()) + { + return FALSE; + } + + // check to make sure source is agent inventory, and is represented there. + LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); + BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL) + && (LLToolDragAndDrop::SOURCE_AGENT == source); + + BOOL accept = FALSE; + S32 i; + LLInventoryModel::cat_array_t descendent_categories; + LLInventoryModel::item_array_t descendent_items; + if(is_agent_inventory) + { + const LLUUID& cat_id = inv_cat->getUUID(); + + // Is the destination the trash? + const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + BOOL move_is_into_trash = (mUUID == trash_id) + || model->isObjectDescendentOf(mUUID, trash_id); + BOOL is_movable = (!LLAssetType::lookupIsProtectedCategoryType(inv_cat->getPreferredType())); + LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); + BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); + if (move_is_into_current_outfit || move_is_into_outfit) + { + // BAP - restrictions? + is_movable = true; + } + + if (mUUID == gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE)) + { + is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604 + } + + if( is_movable ) + { + gInventory.collectDescendents( cat_id, descendent_categories, descendent_items, FALSE ); + + for( i = 0; i < descendent_categories.count(); i++ ) + { + LLInventoryCategory* category = descendent_categories[i]; + if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) + { + // ...can't move "special folders" like Textures + is_movable = FALSE; + break; + } + } + + if( is_movable ) + { + if( move_is_into_trash ) + { + for( i = 0; i < descendent_items.count(); i++ ) + { + LLInventoryItem* item = descendent_items[i]; + if( (item->getType() == LLAssetType::AT_CLOTHING) || + (item->getType() == LLAssetType::AT_BODYPART) ) + { + if( gAgentWearables.isWearingItem( item->getUUID() ) ) + { + is_movable = FALSE; // It's generally movable, but not into the trash! + break; + } + } + else + if( item->getType() == LLAssetType::AT_OBJECT ) + { + if( avatar->isWearingAttachment( item->getUUID() ) ) + { + is_movable = FALSE; // It's generally movable, but not into the trash! + break; + } + } + } + } + } + } + + + accept = is_movable + && (mUUID != cat_id) // Can't move a folder into itself + && (mUUID != inv_cat->getParentUUID()) // Avoid moves that would change nothing + && !(model->isObjectDescendentOf(mUUID, cat_id)); // Avoid circularity + if(accept && drop) + { + // Look for any gestures and deactivate them + if (move_is_into_trash) + { + for (i = 0; i < descendent_items.count(); i++) + { + LLInventoryItem* item = descendent_items[i]; + if (item->getType() == LLAssetType::AT_GESTURE + && LLGestureManager::instance().isGestureActive(item->getUUID())) + { + LLGestureManager::instance().deactivateGesture(item->getUUID()); + } + } + } + // if target is an outfit or current outfit folder we use link + if (move_is_into_current_outfit || move_is_into_outfit) + { +#if SUPPORT_ENSEMBLES + // BAP - should skip if dup. + if (move_is_into_current_outfit) + { + LLAppearanceManager::wearEnsemble(inv_cat); + } + else + { + LLPointer<LLInventoryCallback> cb = NULL; + link_inventory_item( + gAgent.getID(), + inv_cat->getUUID(), + mUUID, + inv_cat->getName(), + LLAssetType::AT_LINK_FOLDER, + cb); + } +#endif + } + else + { + + // Reparent the folder and restamp children if it's moving + // into trash. + LLInvFVBridge::changeCategoryParent( + model, + (LLViewerInventoryCategory*)inv_cat, + mUUID, + move_is_into_trash); + } + } + } + else if(LLToolDragAndDrop::SOURCE_WORLD == source) + { + // content category has same ID as object itself + LLUUID object_id = inv_cat->getUUID(); + LLUUID category_id = mUUID; + accept = move_inv_category_world_to_agent(object_id, category_id, drop); + } + return accept; +} + +void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv) +{ + const char* dialog = NULL; + if (object->flagScripted()) + { + dialog = "MoveInventoryFromScriptedObject"; + } + else + { + dialog = "MoveInventoryFromObject"; + } + LLNotifications::instance().add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv)); +} + +// Move/copy all inventory items from the Contents folder of an in-world +// object to the agent's inventory, inside a given category. +BOOL move_inv_category_world_to_agent(const LLUUID& object_id, + const LLUUID& category_id, + BOOL drop, + void (*callback)(S32, void*), + void* user_data) +{ + // Make sure the object exists. If we allowed dragging from + // anonymous objects, it would be possible to bypass + // permissions. + // content category has same ID as object itself + LLViewerObject* object = gObjectList.findObject(object_id); + if(!object) + { + llinfos << "Object not found for drop." << llendl; + return FALSE; + } + + // this folder is coming from an object, as there is only one folder in an object, the root, + // we need to collect the entire contents and handle them as a group + InventoryObjectList inventory_objects; + object->getInventoryContents(inventory_objects); + + if (inventory_objects.empty()) + { + llinfos << "Object contents not found for drop." << llendl; + return FALSE; + } + + BOOL accept = TRUE; + BOOL is_move = FALSE; + + // coming from a task. Need to figure out if the person can + // move/copy this item. + InventoryObjectList::iterator it = inventory_objects.begin(); + InventoryObjectList::iterator end = inventory_objects.end(); + for ( ; it != end; ++it) + { + // coming from a task. Need to figure out if the person can + // move/copy this item. + LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions()); + if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) + && perm.allowTransferTo(gAgent.getID()))) +// || gAgent.isGodlike()) + { + accept = TRUE; + } + else if(object->permYouOwner()) + { + // If the object cannot be copied, but the object the + // inventory is owned by the agent, then the item can be + // moved from the task to agent inventory. + is_move = TRUE; + accept = TRUE; + } + else + { + accept = FALSE; + break; + } + } + + if(drop && accept) + { + it = inventory_objects.begin(); + InventoryObjectList::iterator first_it = inventory_objects.begin(); + LLMoveInv* move_inv = new LLMoveInv; + move_inv->mObjectID = object_id; + move_inv->mCategoryID = category_id; + move_inv->mCallback = callback; + move_inv->mUserData = user_data; + + for ( ; it != end; ++it) + { + two_uuids_t two(category_id, (*it)->getUUID()); + move_inv->mMoveList.push_back(two); + } + + if(is_move) + { + // Callback called from within here. + warn_move_inventory(object, move_inv); + } + else + { + LLNotification::Params params("MoveInventoryFromObject"); + params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); + LLNotifications::instance().forceResponse(params, 0); + } + } + return accept; +} + +bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + // Valid COF items are: + // - links to wearables (body parts or clothing) + // - links to attachments + // - links to gestures + // - links to ensemble folders + LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem(); // BAP - safe? + if (linked_item) + { + LLAssetType::EType type = linked_item->getType(); + return (type == LLAssetType::AT_CLOTHING || + type == LLAssetType::AT_BODYPART || + type == LLAssetType::AT_GESTURE || + type == LLAssetType::AT_OBJECT); + } + else + { + LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe? + // BAP remove AT_NONE support after ensembles are fully working? + return (linked_category && + ((linked_category->getPreferredType() == LLAssetType::AT_NONE) || + (LLAssetType::lookupIsEnsembleCategoryType(linked_category->getPreferredType())))); + } +} + + +bool LLFindWearables::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + if(item) + { + if((item->getType() == LLAssetType::AT_CLOTHING) + || (item->getType() == LLAssetType::AT_BODYPART)) + { + return TRUE; + } + } + return FALSE; +} + + + +//Used by LLFolderBridge as callback for directory recursion. +class LLRightClickInventoryFetchObserver : public LLInventoryFetchObserver +{ +public: + LLRightClickInventoryFetchObserver() : + mCopyItems(false) + { }; + LLRightClickInventoryFetchObserver(const LLUUID& cat_id, bool copy_items) : + mCatID(cat_id), + mCopyItems(copy_items) + { }; + virtual void done() + { + // we've downloaded all the items, so repaint the dialog + LLFolderBridge::staticFolderOptionsMenu(); + + gInventory.removeObserver(this); + delete this; + } + + +protected: + LLUUID mCatID; + bool mCopyItems; + +}; + +//Used by LLFolderBridge as callback for directory recursion. +class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver +{ +public: + LLRightClickInventoryFetchDescendentsObserver(bool copy_items) : mCopyItems(copy_items) {} + ~LLRightClickInventoryFetchDescendentsObserver() {} + virtual void done(); +protected: + bool mCopyItems; +}; + +void LLRightClickInventoryFetchDescendentsObserver::done() +{ + // Avoid passing a NULL-ref as mCompleteFolders.front() down to + // gInventory.collectDescendents() + if( mCompleteFolders.empty() ) + { + llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl; + dec_busy_count(); + gInventory.removeObserver(this); + delete this; + return; + } + + // What we do here is get the complete information on the items in + // the library, and set up an observer that will wait for that to + // happen. + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + gInventory.collectDescendents(mCompleteFolders.front(), + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH); + S32 count = item_array.count(); +#if 0 // HACK/TODO: Why? + // This early causes a giant menu to get produced, and doesn't seem to be needed. + if(!count) + { + llwarns << "Nothing fetched in category " << mCompleteFolders.front() + << llendl; + dec_busy_count(); + gInventory.removeObserver(this); + delete this; + return; + } +#endif + + LLRightClickInventoryFetchObserver* outfit; + outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems); + LLInventoryFetchObserver::item_ref_t ids; + for(S32 i = 0; i < count; ++i) + { + ids.push_back(item_array.get(i)->getUUID()); + } + + // clean up, and remove this as an observer since the call to the + // outfit could notify observers and throw us into an infinite + // loop. + dec_busy_count(); + gInventory.removeObserver(this); + delete this; + + // increment busy count and either tell the inventory to check & + // call done, or add this object to the inventory for observation. + inc_busy_count(); + + // do the fetch + outfit->fetchItems(ids); + outfit->done(); //Not interested in waiting and this will be right 99% of the time. +//Uncomment the following code for laggy Inventory UI. +/* if(outfit->isEverythingComplete()) + { + // everything is already here - call done. + outfit->done(); + } + else + { + // it's all on it's way - add an observer, and the inventory + // will call done for us when everything is here. + gInventory.addObserver(outfit); + }*/ +} + + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryWearObserver +// +// Observer for "copy and wear" operation to support knowing +// when the all of the contents have been added to inventory. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryCopyAndWearObserver : public LLInventoryObserver +{ +public: + LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {} + virtual ~LLInventoryCopyAndWearObserver() {} + virtual void changed(U32 mask); + +protected: + LLUUID mCatID; + int mContentsCount; + BOOL mFolderAdded; +}; + + + +void LLInventoryCopyAndWearObserver::changed(U32 mask) +{ + if((mask & (LLInventoryObserver::ADD)) != 0) + { + if (!mFolderAdded) + { + const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); + + std::set<LLUUID>::const_iterator id_it = changed_items.begin(); + std::set<LLUUID>::const_iterator id_end = changed_items.end(); + for (;id_it != id_end; ++id_it) + { + if ((*id_it) == mCatID) + { + mFolderAdded = TRUE; + break; + } + } + } + + if (mFolderAdded) + { + LLViewerInventoryCategory* category = gInventory.getCategory(mCatID); + + if (NULL == category) + { + llwarns << "gInventory.getCategory(" << mCatID + << ") was NULL" << llendl; + } + else + { + if (category->getDescendentCount() == + mContentsCount) + { + gInventory.removeObserver(this); + LLAppearanceManager::wearInventoryCategory(category, FALSE, TRUE); + delete this; + } + } + } + + } +} + + + +void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("open" == action) + { + openItem(); + return; + } + else if ("paste" == action) + { + pasteFromClipboard(); + return; + } + else if ("paste_link" == action) + { + pasteLinkFromClipboard(); + return; + } + else if ("properties" == action) + { + showProperties(); + return; + } + else if ("replaceoutfit" == action) + { + modifyOutfit(FALSE); + return; + } +#if SUPPORT_ENSEMBLES + else if ("wearasensemble" == action) + { + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLViewerInventoryCategory* cat = getCategory(); + if(!cat) return; + LLAppearanceManager::wearEnsemble(cat,true); + return; + } +#endif + else if ("addtooutfit" == action) + { + modifyOutfit(TRUE); + return; + } + else if ("copy" == action) + { + copyToClipboard(); + return; + } + else if ("removefromoutfit" == action) + { + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLViewerInventoryCategory* cat = getCategory(); + if(!cat) return; + + remove_inventory_category_from_avatar ( cat ); + return; + } + else if ("purge" == action) + { + purgeItem(model, mUUID); + return; + } + else if ("restore" == action) + { + restoreItem(); + return; + } +} + +void LLFolderBridge::openItem() +{ + lldebugs << "LLFolderBridge::openItem()" << llendl; + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + bool fetching_inventory = model->fetchDescendentsOf(mUUID); + // Only change folder type if we have the folder contents. + if (!fetching_inventory) + { + // Disabling this for now, it's causing crash when new items are added to folders + // since folder type may change before new item item has finished processing. + // determineFolderType(); + } +} + +void LLFolderBridge::closeItem() +{ + determineFolderType(); +} + +void LLFolderBridge::determineFolderType() +{ + if (isUpToDate()) + { + LLInventoryModel* model = getInventoryModel(); + LLViewerInventoryCategory* category = model->getCategory(mUUID); + category->determineFolderType(); + } +} + +BOOL LLFolderBridge::isItemRenameable() const +{ + LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory(); + if(cat && !LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType()) + && (cat->getOwnerID() == gAgent.getID())) + { + return TRUE; + } + return FALSE; +} + +void LLFolderBridge::restoreItem() +{ + LLViewerInventoryCategory* cat; + cat = (LLViewerInventoryCategory*)getCategory(); + if(cat) + { + LLInventoryModel* model = getInventoryModel(); + LLUUID new_parent = model->findCategoryUUIDForType(cat->getType()); + // do not restamp children on restore + LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE); + } +} + +LLAssetType::EType LLFolderBridge::getPreferredType() const +{ + LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + LLViewerInventoryCategory* cat = getCategory(); + if(cat) + { + preferred_type = cat->getPreferredType(); + } + + return preferred_type; +} + +// Icons for folders are based on the preferred type +LLUIImagePtr LLFolderBridge::getIcon() const +{ + LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + LLViewerInventoryCategory* cat = getCategory(); + if(cat) + { + preferred_type = cat->getPreferredType(); + } + return getIcon(preferred_type); +} + +LLUIImagePtr LLFolderBridge::getIcon(LLAssetType::EType preferred_type) +{ + // we only have one folder image now + return LLUI::getUIImage("Inv_FolderClosed"); +} + +BOOL LLFolderBridge::renameItem(const std::string& new_name) +{ + if(!isItemRenameable()) + return FALSE; + LLInventoryModel* model = getInventoryModel(); + if(!model) + return FALSE; + LLViewerInventoryCategory* cat = getCategory(); + if(cat && (cat->getName() != new_name)) + { + LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); + new_cat->rename(new_name); + new_cat->updateServer(FALSE); + model->updateCategory(new_cat); + + model->notifyObservers(); + } + // return FALSE because we either notified observers (& therefore + // rebuilt) or we didn't update. + return FALSE; +} + +BOOL LLFolderBridge::removeItem() +{ + if(!isItemRemovable()) + { + return FALSE; + } + // move it to the trash + LLPreview::hide(mUUID); + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + + LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + + // Look for any gestures and deactivate them + LLInventoryModel::cat_array_t descendent_categories; + LLInventoryModel::item_array_t descendent_items; + gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); + + S32 i; + for (i = 0; i < descendent_items.count(); i++) + { + LLInventoryItem* item = descendent_items[i]; + if (item->getType() == LLAssetType::AT_GESTURE + && LLGestureManager::instance().isGestureActive(item->getUUID())) + { + LLGestureManager::instance().deactivateGesture(item->getUUID()); + } + } + + // go ahead and do the normal remove if no 'last calling + // cards' are being removed. + LLViewerInventoryCategory* cat = getCategory(); + if(cat) + { + LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE); + } + + return TRUE; +} + +void LLFolderBridge::pasteFromClipboard() +{ + LLInventoryModel* model = getInventoryModel(); + if(model && isClipboardPasteable()) + { + LLInventoryItem* item = NULL; + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + const LLUUID parent_id(mUUID); + for(S32 i = 0; i < count; i++) + { + item = model->getItem(objects.get(i)); + if (item) + { + if(LLInventoryClipboard::instance().isCutMode()) + { + // move_inventory_item() is not enough, + //we have to update inventory locally too + changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE); + } + else + { + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + parent_id, + std::string(), + LLPointer<LLInventoryCallback>(NULL)); + } + } + } + } +} + +void LLFolderBridge::pasteLinkFromClipboard() +{ + const LLInventoryModel* model = getInventoryModel(); + if(model) + { + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + LLUUID parent_id(mUUID); + for(S32 i = 0; i < count; i++) + { + const LLUUID &object_id = objects.get(i); +#if SUPPORT_ENSEMBLES + if (LLInventoryCategory *cat = model->getCategory(object_id)) + { + link_inventory_item( + gAgent.getID(), + cat->getUUID(), + parent_id, + cat->getName(), + LLAssetType::AT_LINK_FOLDER, + LLPointer<LLInventoryCallback>(NULL)); + } + else +#endif + if (LLInventoryItem *item = model->getItem(object_id)) + { + link_inventory_item( + gAgent.getID(), + item->getUUID(), + parent_id, + item->getName(), + LLAssetType::AT_LINK, + LLPointer<LLInventoryCallback>(NULL)); + } + } + } +} + +void LLFolderBridge::staticFolderOptionsMenu() +{ + if (!sSelf) return; + sSelf->folderOptionsMenu(); +} + +void LLFolderBridge::folderOptionsMenu() +{ + std::vector<std::string> disabled_items; + + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + + const LLInventoryCategory* category = model->getCategory(mUUID); + LLAssetType::EType type = category->getPreferredType(); + const bool is_default_folder = category && LLAssetType::lookupIsProtectedCategoryType(type); + // BAP change once we're no longer treating regular categories as ensembles. + const bool is_ensemble = category && (type == LLAssetType::AT_NONE || + LLAssetType::lookupIsEnsembleCategoryType(type)); + + // calling card related functionality for folders. + + // Only enable calling-card related options for non-default folders. + if (!is_default_folder) + { + LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); + if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard)) + { + mItems.push_back(std::string("Calling Card Separator")); + mItems.push_back(std::string("Conference Chat Folder")); + mItems.push_back(std::string("IM All Contacts In Folder")); + } + } + + // wearables related functionality for folders. + //is_wearable + LLFindWearables is_wearable; + LLIsType is_object( LLAssetType::AT_OBJECT ); + LLIsType is_gesture( LLAssetType::AT_GESTURE ); + + if (mWearables || + checkFolderForContentsOfType(model, is_wearable) || + checkFolderForContentsOfType(model, is_object) || + checkFolderForContentsOfType(model, is_gesture) ) + { + mItems.push_back(std::string("Folder Wearables Separator")); + + // Only enable add/replace outfit for non-default folders. + if (!is_default_folder) + { + mItems.push_back(std::string("Add To Outfit")); + mItems.push_back(std::string("Replace Outfit")); + } + if (is_ensemble) + { + mItems.push_back(std::string("Wear As Ensemble")); + } + mItems.push_back(std::string("Take Off Items")); + } + hide_context_entries(*mMenu, mItems, disabled_items); +} + +BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& is_type) +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + model->collectDescendentsIf(mUUID, + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_type); + return ((item_array.count() > 0) ? TRUE : FALSE ); +} + +// Flags unused +void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + mItems.clear(); + mDisabledItems.clear(); + + lldebugs << "LLFolderBridge::buildContextMenu()" << llendl; +// std::vector<std::string> disabled_items; + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + + mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point) + mDisabledItems.clear(); //adding code to clear out disabled members from previous + if (lost_and_found_id == mUUID) + { + // This is the lost+found folder. + mItems.push_back(std::string("Empty Lost And Found")); + } + + if(trash_id == mUUID) + { + // This is the trash. + mItems.push_back(std::string("Empty Trash")); + } + else if(model->isObjectDescendentOf(mUUID, trash_id)) + { + // This is a folder in the trash. + mItems.clear(); // clear any items that used to exist + mItems.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + mDisabledItems.push_back(std::string("Purge Item")); + } + + mItems.push_back(std::string("Restore Item")); + } + else if(isAgentInventory()) // do not allow creating in library + { + LLViewerInventoryCategory *cat = getCategory(); + + // BAP removed protected check to re-enable standard ops in untyped folders. + // Not sure what the right thing is to do here. + if (!isCOFFolder() && cat /*&& + LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/) + { + // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. + if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) + mItems.push_back(std::string("New Folder")); + mItems.push_back(std::string("New Script")); + mItems.push_back(std::string("New Note")); + mItems.push_back(std::string("New Gesture")); + mItems.push_back(std::string("New Clothes")); + mItems.push_back(std::string("New Body Parts")); + mItems.push_back(std::string("Change Type")); + + LLViewerInventoryCategory *cat = getCategory(); + if (cat && LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())) + { + mDisabledItems.push_back(std::string("Change Type")); + } + + getClipboardEntries(false, mItems, mDisabledItems, flags); + } + else + { + // Want some but not all of the items from getClipboardEntries for outfits. + if (cat && cat->getPreferredType()==LLAssetType::AT_OUTFIT) + { + mItems.push_back(std::string("Rename")); + mItems.push_back(std::string("Delete")); + } + } + + //Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06 + mCallingCards = mWearables = FALSE; + + LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); + if (checkFolderForContentsOfType(model, is_callingcard)) + { + mCallingCards=TRUE; + } + + LLFindWearables is_wearable; + LLIsType is_object( LLAssetType::AT_OBJECT ); + LLIsType is_gesture( LLAssetType::AT_GESTURE ); + + if (checkFolderForContentsOfType(model, is_wearable) || + checkFolderForContentsOfType(model, is_object) || + checkFolderForContentsOfType(model, is_gesture) ) + { + mWearables=TRUE; + } + + mMenu = &menu; + sSelf = this; + LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE); + + LLInventoryFetchDescendentsObserver::folder_ref_t folders; + LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); + if (category) + { + folders.push_back(category->getUUID()); + } + fetch->fetchDescendents(folders); + inc_busy_count(); + if(fetch->isEverythingComplete()) + { + // everything is already here - call done. + fetch->done(); + } + else + { + // it's all on it's way - add an observer, and the inventory + // will call done for us when everything is here. + gInventory.addObserver(fetch); + } + } + else + { + mItems.push_back(std::string("--no options--")); + mDisabledItems.push_back(std::string("--no options--")); + } + hide_context_entries(menu, mItems, mDisabledItems); +} + +BOOL LLFolderBridge::hasChildren() const +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + LLInventoryModel::EHasChildren has_children; + has_children = gInventory.categoryHasChildren(mUUID); + return has_children != LLInventoryModel::CHILDREN_NO; +} + +BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data) +{ + //llinfos << "LLFolderBridge::dragOrDrop()" << llendl; + BOOL accept = FALSE; + switch(cargo_type) + { + case DAD_TEXTURE: + case DAD_SOUND: + case DAD_CALLINGCARD: + case DAD_LANDMARK: + case DAD_SCRIPT: + case DAD_OBJECT: + case DAD_NOTECARD: + case DAD_CLOTHING: + case DAD_BODYPART: + case DAD_ANIMATION: + case DAD_GESTURE: + case DAD_LINK: + accept = dragItemIntoFolder((LLInventoryItem*)cargo_data, + drop); + break; + case DAD_CATEGORY: + if (LLFriendCardsManager::instance().isAnyFriendCategory(mUUID)) + { + accept = FALSE; + } + else + { + accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop); + } + break; + default: + break; + } + return accept; +} + +LLViewerInventoryCategory* LLFolderBridge::getCategory() const +{ + LLViewerInventoryCategory* cat = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + cat = (LLViewerInventoryCategory*)model->getCategory(mUUID); + } + return cat; +} + + +// static +void LLFolderBridge::pasteClipboard(void* user_data) +{ + LLFolderBridge* self = (LLFolderBridge*)user_data; + if(self) self->pasteFromClipboard(); +} + +void LLFolderBridge::createNewCategory(void* user_data) +{ + LLFolderBridge* bridge = (LLFolderBridge*)user_data; + if(!bridge) return; + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get()); + if (!panel) return; + LLInventoryModel* model = panel->getModel(); + if(!model) return; + LLUUID id; + id = model->createNewCategory(bridge->getUUID(), + LLAssetType::AT_NONE, + LLStringUtil::null); + model->notifyObservers(); + + // At this point, the bridge has probably been deleted, but the + // view is still there. + panel->setSelection(id, TAKE_FOCUS_YES); +} + +void LLFolderBridge::createNewShirt(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHIRT); +} + +void LLFolderBridge::createNewPants(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PANTS); +} + +void LLFolderBridge::createNewShoes(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHOES); +} + +void LLFolderBridge::createNewSocks(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SOCKS); +} + +void LLFolderBridge::createNewJacket(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_JACKET); +} + +void LLFolderBridge::createNewSkirt(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIRT); +} + +void LLFolderBridge::createNewGloves(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_GLOVES); +} + +void LLFolderBridge::createNewUndershirt(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERSHIRT); +} + +void LLFolderBridge::createNewUnderpants(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS); +} + +void LLFolderBridge::createNewShape(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE); +} + +void LLFolderBridge::createNewSkin(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIN); +} + +void LLFolderBridge::createNewHair(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_HAIR); +} + +void LLFolderBridge::createNewEyes(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES); +} + +// static +void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type) +{ + if(!bridge) return; + LLUUID parent_id = bridge->getUUID(); + createWearable(parent_id, type); +} + +// Separate function so can be called by global menu as well as right-click +// menu. +// static +void LLFolderBridge::createWearable(LLUUID parent_id, EWearableType type) +{ + LLWearable* wearable = LLWearableList::instance().createNewWearable(type); + LLAssetType::EType asset_type = wearable->getAssetType(); + LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE; + create_inventory_item(gAgent.getID(), gAgent.getSessionID(), + parent_id, wearable->getTransactionID(), wearable->getName(), + wearable->getDescription(), asset_type, inv_type, wearable->getType(), + wearable->getPermissions().getMaskNextOwner(), + LLPointer<LLInventoryCallback>(NULL)); +} + +void LLFolderBridge::modifyOutfit(BOOL append) +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLViewerInventoryCategory* cat = getCategory(); + if(!cat) return; + + // BAP - was: + // wear_inventory_category_on_avatar( cat, append ); + LLAppearanceManager::wearInventoryCategory( cat, FALSE, append ); +} + +// helper stuff +bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv* move_inv) +{ + LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData; + LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID); + S32 option = LLNotification::getSelectedOption(notification, response); + + if(option == 0 && object) + { + if (cat_and_wear && cat_and_wear->mWear) + { + InventoryObjectList inventory_objects; + object->getInventoryContents(inventory_objects); + int contents_count = inventory_objects.size()-1; //subtract one for containing folder + + LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count); + gInventory.addObserver(inventoryObserver); + } + + two_uuids_list_t::iterator move_it; + for (move_it = move_inv->mMoveList.begin(); + move_it != move_inv->mMoveList.end(); + ++move_it) + { + object->moveInventory(move_it->first, move_it->second); + } + + // update the UI. + dialog_refresh_all(); + } + + if (move_inv->mCallback) + { + move_inv->mCallback(option, move_inv->mUserData); + } + + delete move_inv; + return false; +} + +/* +Next functions intended to reorder items in the inventory folder and save order on server +Is now used for Favorites folder. + +*TODO: refactoring is needed with Favorites Bar functionality. Probably should be moved in LLInventoryModel +*/ +void saveItemsOrder(LLInventoryModel::item_array_t& items) +{ + int sortField = 0; + + // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field + for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) + { + LLViewerInventoryItem* item = *i; + + item->setSortField(++sortField); + item->setComplete(TRUE); + item->updateServer(FALSE); + + gInventory.updateItem(item); + } + + gInventory.notifyObservers(); +} + +LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id) +{ + LLInventoryModel::item_array_t::iterator result = items.end(); + + for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) + { + if ((*i)->getUUID() == id) + { + result = i; + break; + } + } + + return result; +} + +void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId) +{ + LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId); + LLViewerInventoryItem* destItem = gInventory.getItem(destItemId); + + items.erase(findItemByUUID(items, srcItem->getUUID())); + items.insert(findItemByUUID(items, destItem->getUUID()), srcItem); +} + +BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, + BOOL drop) +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + + // cannot drag into library + if(!isAgentInventory()) + { + return FALSE; + } + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if(!avatar) return FALSE; + + LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); + BOOL accept = FALSE; + LLViewerObject* object = NULL; + if(LLToolDragAndDrop::SOURCE_AGENT == source) + { + + BOOL is_movable = TRUE; + switch( inv_item->getActualType() ) + { + case LLAssetType::AT_ROOT_CATEGORY: + is_movable = FALSE; + break; + + case LLAssetType::AT_CATEGORY: + is_movable = !LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)inv_item)->getPreferredType()); + break; + default: + break; + } + + LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); + LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); + BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); + + if(is_movable && move_is_into_trash) + { + switch(inv_item->getType()) + { + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_BODYPART: + is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID()); + break; + + case LLAssetType::AT_OBJECT: + is_movable = !avatar->isWearingAttachment(inv_item->getUUID()); + break; + default: + break; + } + } + + if ( is_movable ) + { + // Don't allow creating duplicates in the Calling Card/Friends + // subfolders, see bug EXT-1599. Check is item direct descendent + // of target folder and forbid item's movement if it so. + // Note: isItemDirectDescendentOfCategory checks if + // passed category is in the Calling Card/Friends folder + is_movable = ! LLFriendCardsManager::instance() + .isObjDirectDescendentOfCategory (inv_item, getCategory()); + } + + LLUUID favorites_id = model->findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + + // we can move item inside a folder only if this folder is Favorites. See EXT-719 + accept = is_movable && ((mUUID != inv_item->getParentUUID()) || (mUUID == favorites_id)); + if(accept && drop) + { + if (inv_item->getType() == LLAssetType::AT_GESTURE + && LLGestureManager::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash) + { + LLGestureManager::instance().deactivateGesture(inv_item->getUUID()); + } + // If an item is being dragged between windows, unselect + // everything in the active window so that we don't follow + // the selection to its new location (which is very + // annoying). + if (LLFloaterInventory::getActiveInventory()) + { + LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + if (active_panel && (panel != active_panel)) + { + active_panel->unSelectAll(); + } + } + + // if dragging from/into favorites folder only reorder items + if ((mUUID == inv_item->getParentUUID()) && (favorites_id == mUUID)) + { + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLIsType is_type(LLAssetType::AT_LANDMARK); + model->collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); + + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; + if (itemp) + { + LLUUID srcItemId = inv_item->getUUID(); + LLUUID destItemId = itemp->getListener()->getUUID(); + + // update order + updateItemsOrder(items, srcItemId, destItemId); + + saveItemsOrder(items); + } + } + else if (favorites_id == mUUID) // if target is the favorites folder we use copy + { + copy_inventory_item( + gAgent.getID(), + inv_item->getPermissions().getOwner(), + inv_item->getUUID(), + mUUID, + std::string(), + LLPointer<LLInventoryCallback>(NULL)); + } + else if (move_is_into_current_outfit || move_is_into_outfit) + { + // BAP - should skip if dup. + if (move_is_into_current_outfit) + { + LLAppearanceManager::wearItem(inv_item); + } + else + { + LLPointer<LLInventoryCallback> cb = NULL; + link_inventory_item( + gAgent.getID(), + inv_item->getUUID(), + mUUID, + std::string(), + LLAssetType::AT_LINK, + cb); + } + } + else + { + // restamp if the move is into the trash. + LLInvFVBridge::changeItemParent( + model, + (LLViewerInventoryItem*)inv_item, + mUUID, + move_is_into_trash); + } + } + } + else if(LLToolDragAndDrop::SOURCE_WORLD == source) + { + // Make sure the object exists. If we allowed dragging from + // anonymous objects, it would be possible to bypass + // permissions. + object = gObjectList.findObject(inv_item->getParentUUID()); + if(!object) + { + llinfos << "Object not found for drop." << llendl; + return FALSE; + } + + // coming from a task. Need to figure out if the person can + // move/copy this item. + LLPermissions perm(inv_item->getPermissions()); + BOOL is_move = FALSE; + if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) + && perm.allowTransferTo(gAgent.getID()))) +// || gAgent.isGodlike()) + + { + accept = TRUE; + } + else if(object->permYouOwner()) + { + // If the object cannot be copied, but the object the + // inventory is owned by the agent, then the item can be + // moved from the task to agent inventory. + is_move = TRUE; + accept = TRUE; + } + if(drop && accept) + { + LLMoveInv* move_inv = new LLMoveInv; + move_inv->mObjectID = inv_item->getParentUUID(); + two_uuids_t item_pair(mUUID, inv_item->getUUID()); + move_inv->mMoveList.push_back(item_pair); + move_inv->mCallback = NULL; + move_inv->mUserData = NULL; + if(is_move) + { + warn_move_inventory(object, move_inv); + } + else + { + LLNotification::Params params("MoveInventoryFromObject"); + params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); + LLNotifications::instance().forceResponse(params, 0); + } + } + + } + else if(LLToolDragAndDrop::SOURCE_NOTECARD == source) + { + accept = TRUE; + if(drop) + { + copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(), + LLToolDragAndDrop::getInstance()->getSourceID(), inv_item); + } + } + else if(LLToolDragAndDrop::SOURCE_LIBRARY == source) + { + LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item; + if(item && item->isComplete()) + { + accept = TRUE; + if(drop) + { + copy_inventory_item( + gAgent.getID(), + inv_item->getPermissions().getOwner(), + inv_item->getUUID(), + mUUID, + std::string(), + LLPointer<LLInventoryCallback>(NULL)); + } + } + } + else + { + llwarns << "unhandled drag source" << llendl; + } + return accept; +} + +// +=================================================+ +// | LLScriptBridge (DEPRECTED) | +// +=================================================+ + +LLUIImagePtr LLScriptBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); +} + +// +=================================================+ +// | LLTextureBridge | +// +=================================================+ + +LLUIImagePtr LLTextureBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_TEXTURE, mInvType, 0, FALSE); +} + +void LLTextureBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +} + +// +=================================================+ +// | LLSoundBridge | +// +=================================================+ + +LLUIImagePtr LLSoundBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE); +} + +void LLSoundBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* +// Changed this back to the way it USED to work: +// only open the preview dialog through the contextual right-click menu +// double-click just plays the sound + + LLViewerInventoryItem* item = getItem(); + if(item) + { + openSoundPreview((void*)this); + //send_uuid_sound_trigger(item->getAssetUUID(), 1.0); + } +*/ +} + +void LLSoundBridge::previewItem() +{ + LLViewerInventoryItem* item = getItem(); + if(item) + { + send_sound_trigger(item->getAssetUUID(), 1.0); + } +} + +void LLSoundBridge::openSoundPreview(void* which) +{ + LLSoundBridge *me = (LLSoundBridge *)which; + LLFloaterReg::showInstance("preview_sound", LLSD(me->mUUID), TAKE_FOCUS_YES); +} + +void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLTextureBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Sound Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + + items.push_back(std::string("Sound Separator")); + items.push_back(std::string("Sound Play")); + + hide_context_entries(menu, items, disabled_items); +} + +// +=================================================+ +// | LLLandmarkBridge | +// +=================================================+ + +LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags/* = 0x00*/) : +LLItemBridge(inventory, uuid) +{ + mVisited = FALSE; + if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED) + { + mVisited = TRUE; + } +} + +LLUIImagePtr LLLandmarkBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE); +} + +void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Landmark Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + + items.push_back(std::string("Landmark Separator")); + items.push_back(std::string("About Landmark")); + + // Disable "About Landmark" menu item for + // multiple landmarks selected. Only one landmark + // info panel can be shown at a time. + if ((flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("About Landmark")); + } + + hide_context_entries(menu, items, disabled_items); +} + +// Convenience function for the two functions below. +void teleport_via_landmark(const LLUUID& asset_id) +{ + gAgent.teleportViaLandmark( asset_id ); + + // we now automatically track the landmark you're teleporting to + // because you'll probably arrive at a telehub instead + LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance(); + if( floater_world_map ) + { + floater_world_map->trackLandmark( asset_id ); + } +} + +// virtual +void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("teleport" == action) + { + LLViewerInventoryItem* item = getItem(); + if(item) + { + teleport_via_landmark(item->getAssetUUID()); + } + } + else if ("about" == action) + { + LLViewerInventoryItem* item = getItem(); + if(item) + { + LLSD key; + key["type"] = "landmark"; + key["id"] = item->getUUID(); + + LLSideTray::getInstance()->showPanel("panel_places", key); + } + } + else + { + LLItemBridge::performAction(folder, model, action); + } +} + +static bool open_landmark_callback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + + LLUUID asset_id = notification["payload"]["asset_id"].asUUID(); + if (option == 0) + { + teleport_via_landmark(asset_id); + } + + return false; +} +static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportFromLandmark", open_landmark_callback); + + +void LLLandmarkBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* + LLViewerInventoryItem* item = getItem(); + if( item ) + { + // Opening (double-clicking) a landmark immediately teleports, + // but warns you the first time. + // open_landmark(item); + LLSD payload; + payload["asset_id"] = item->getAssetUUID(); + LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); + } +*/ +} + + +// +=================================================+ +// | LLCallingCardObserver | +// +=================================================+ +void LLCallingCardObserver::changed(U32 mask) +{ + mBridgep->refreshFolderViewItem(); +} + +// +=================================================+ +// | LLCallingCardBridge | +// +=================================================+ + +LLCallingCardBridge::LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) : + LLItemBridge(inventory, uuid) +{ + mObserver = new LLCallingCardObserver(this); + LLAvatarTracker::instance().addObserver(mObserver); +} + +LLCallingCardBridge::~LLCallingCardBridge() +{ + LLAvatarTracker::instance().removeObserver(mObserver); + delete mObserver; +} + +void LLCallingCardBridge::refreshFolderViewItem() +{ + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL; + if (itemp) + { + itemp->refresh(); + } +} + +// virtual +void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("begin_im" == action) + { + LLViewerInventoryItem *item = getItem(); + if (item && (item->getCreatorUUID() != gAgent.getID()) && + (!item->getCreatorUUID().isNull())) + { + std::string callingcard_name; + gCacheName->getFullName(item->getCreatorUUID(), callingcard_name); + gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID()); + } + } + else if ("lure" == action) + { + LLViewerInventoryItem *item = getItem(); + if (item && (item->getCreatorUUID() != gAgent.getID()) && + (!item->getCreatorUUID().isNull())) + { + LLAvatarActions::offerTeleport(item->getCreatorUUID()); + } + } + else LLItemBridge::performAction(folder, model, action); +} + +LLUIImagePtr LLCallingCardBridge::getIcon() const +{ + BOOL online = FALSE; + LLViewerInventoryItem* item = getItem(); + if(item) + { + online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()); + } + return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE); +} + +std::string LLCallingCardBridge::getLabelSuffix() const +{ + LLViewerInventoryItem* item = getItem(); + if( item && LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()) ) + { + return LLItemBridge::getLabelSuffix() + " (online)"; + } + else + { + return LLItemBridge::getLabelSuffix(); + } +} + +void LLCallingCardBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* + LLViewerInventoryItem* item = getItem(); + if(item && !item->getCreatorUUID().isNull()) + { + LLAvatarActions::showProfile(item->getCreatorUUID()); + } +*/ +} + +void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLCallingCardBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + LLInventoryItem* item = getItem(); + BOOL good_card = (item + && (LLUUID::null != item->getCreatorUUID()) + && (item->getCreatorUUID() != gAgent.getID())); + BOOL user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID())); + items.push_back(std::string("Send Instant Message Separator")); + items.push_back(std::string("Send Instant Message")); + items.push_back(std::string("Offer Teleport...")); + items.push_back(std::string("Conference Chat")); + + if (!good_card) + { + disabled_items.push_back(std::string("Send Instant Message")); + } + if (!good_card || !user_online) + { + disabled_items.push_back(std::string("Offer Teleport...")); + disabled_items.push_back(std::string("Conference Chat")); + } + } + hide_context_entries(menu, items, disabled_items); +} + +BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data) +{ + LLViewerInventoryItem* item = getItem(); + BOOL rv = FALSE; + if(item) + { + // check the type + switch(cargo_type) + { + case DAD_TEXTURE: + case DAD_SOUND: + case DAD_LANDMARK: + case DAD_SCRIPT: + case DAD_CLOTHING: + case DAD_OBJECT: + case DAD_NOTECARD: + case DAD_BODYPART: + case DAD_ANIMATION: + case DAD_GESTURE: + { + LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; + const LLPermissions& perm = inv_item->getPermissions(); + if(gInventory.getItem(inv_item->getUUID()) + && perm.allowOperationBy(PERM_TRANSFER, gAgent.getID())) + { + rv = TRUE; + if(drop) + { + LLToolDragAndDrop::giveInventory(item->getCreatorUUID(), + (LLInventoryItem*)cargo_data); + } + } + else + { + // It's not in the user's inventory (it's probably in + // an object's contents), so disallow dragging it here. + // You can't give something you don't yet have. + rv = FALSE; + } + break; + } + case DAD_CATEGORY: + { + LLInventoryCategory* inv_cat = (LLInventoryCategory*)cargo_data; + if( gInventory.getCategory( inv_cat->getUUID() ) ) + { + rv = TRUE; + if(drop) + { + LLToolDragAndDrop::giveInventoryCategory( + item->getCreatorUUID(), + inv_cat); + } + } + else + { + // It's not in the user's inventory (it's probably in + // an object's contents), so disallow dragging it here. + // You can't give something you don't yet have. + rv = FALSE; + } + break; + } + default: + break; + } + } + return rv; +} + +BOOL LLCallingCardBridge::removeItem() +{ + if (LLFriendCardsManager::instance().isItemInAnyFriendsList(getItem())) + { + LLAvatarActions::removeFriendDialog(getItem()->getCreatorUUID()); + return FALSE; + } + else + { + return LLItemBridge::removeItem(); + } +} +// +=================================================+ +// | LLNotecardBridge | +// +=================================================+ + +LLUIImagePtr LLNotecardBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE); +} + +void LLNotecardBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } + +/* + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); + } +*/ +} + + +// +=================================================+ +// | LLGestureBridge | +// +=================================================+ + +LLUIImagePtr LLGestureBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE); +} + +LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const +{ + if( LLGestureManager::instance().isGestureActive(mUUID) ) + { + return LLFontGL::BOLD; + } + else + { + return LLFontGL::NORMAL; + } +} + +std::string LLGestureBridge::getLabelSuffix() const +{ + if( LLGestureManager::instance().isGestureActive(mUUID) ) + { + return LLItemBridge::getLabelSuffix() + " (active)"; + } + else + { + return LLItemBridge::getLabelSuffix(); + } +} + +// virtual +void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("activate" == action) + { + LLGestureManager::instance().activateGesture(mUUID); + + LLViewerInventoryItem* item = gInventory.getItem(mUUID); + if (!item) return; + + // Since we just changed the suffix to indicate (active) + // the server doesn't need to know, just the viewer. + gInventory.updateItem(item); + gInventory.notifyObservers(); + } + else if ("deactivate" == action) + { + LLGestureManager::instance().deactivateGesture(mUUID); + + LLViewerInventoryItem* item = gInventory.getItem(mUUID); + if (!item) return; + + // Since we just changed the suffix to indicate (active) + // the server doesn't need to know, just the viewer. + gInventory.updateItem(item); + gInventory.notifyObservers(); + } + else LLItemBridge::performAction(folder, model, action); +} + +void LLGestureBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); + preview->setFocus(TRUE); + } +*/ +} + +BOOL LLGestureBridge::removeItem() +{ + // Force close the preview window, if it exists + LLGestureManager::instance().deactivateGesture(mUUID); + return LLItemBridge::removeItem(); +} + +void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLGestureBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + items.push_back(std::string("Gesture Separator")); + items.push_back(std::string("Activate")); + items.push_back(std::string("Deactivate")); + } + hide_context_entries(menu, items, disabled_items); +} + +// +=================================================+ +// | LLAnimationBridge | +// +=================================================+ + +LLUIImagePtr LLAnimationBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); +} + +void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Animation Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + + items.push_back(std::string("Animation Separator")); + items.push_back(std::string("Animation Play")); + items.push_back(std::string("Animation Audition")); + + hide_context_entries(menu, items, disabled_items); + +} + +// virtual +void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ((action == "playworld") || (action == "playlocal")) + { + if (getItem()) + { + LLPreviewAnim::e_activation_type activate = LLPreviewAnim::NONE; + if ("playworld" == action) activate = LLPreviewAnim::PLAY; + if ("playlocal" == action) activate = LLPreviewAnim::AUDITION; + + LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID)); + if (preview) + { + preview->activate(activate); + } + } + } + else + { + LLItemBridge::performAction(folder, model, action); + } +} + +void LLAnimationBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); + } +*/ +} + +// +=================================================+ +// | LLObjectBridge | +// +=================================================+ + +// static +LLUUID LLObjectBridge::sContextMenuItemID; + +LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) : +LLItemBridge(inventory, uuid), mInvType(type) +{ + mAttachPt = (flags & 0xff); // low bye of inventory flags + + mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE; +} + +BOOL LLObjectBridge::isItemRemovable() +{ + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if(!avatar) return FALSE; + if(avatar->isWearingAttachment(mUUID)) return FALSE; + return LLInvFVBridge::isItemRemovable(); +} + +LLUIImagePtr LLObjectBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject ); +} + +LLInventoryObject* LLObjectBridge::getObject() const +{ + LLInventoryObject* object = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + object = (LLInventoryObject*)model->getObject(mUUID); + } + return object; +} + +// virtual +void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("attach" == action) + { + LLUUID object_id = mUUID; + LLViewerInventoryItem* item; + item = (LLViewerInventoryItem*)gInventory.getItem(object_id); + if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID())) + { + rez_attachment(item, NULL); + } + else if(item && item->isComplete()) + { + // must be in library. copy it to our inventory and put it on. + LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + gFocusMgr.setKeyboardFocus(NULL); + } + else if ("detach" == action) + { + LLInventoryItem* item = gInventory.getItem(mUUID); + if(item) + { + gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID()); + gMessageSystem->sendReliable( gAgent.getRegion()->getHost()); + } + // this object might have been selected, so let the selection manager know it's gone now + LLViewerObject *found_obj = + gObjectList.findObject(item->getUUID()); + if (found_obj) + { + LLSelectMgr::getInstance()->remove(found_obj); + } + else + { + llwarns << "object not found - ignoring" << llendl; + } + } + else LLItemBridge::performAction(folder, model, action); +} + +void LLObjectBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } + + LLSD key; + key["id"] = mUUID; + LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); + + /* + LLFloaterReg::showInstance("properties", mUUID); + */ +} + +LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const +{ + U8 font = LLFontGL::NORMAL; + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if( avatar && avatar->isWearingAttachment( mUUID ) ) + { + font |= LLFontGL::BOLD; + } + + LLInventoryItem* item = getItem(); + if (item && item->getIsLinkType()) + { + font |= LLFontGL::ITALIC; + } + + return (LLFontGL::StyleFlags)font; +} + +std::string LLObjectBridge::getLabelSuffix() const +{ + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if( avatar && avatar->isWearingAttachment( mUUID ) ) + { + std::string attachment_point_name = avatar->getAttachedPointName(mUUID); + LLStringUtil::toLower(attachment_point_name); + + LLStringUtil::format_map_t args; + args["[ATTACHMENT_POINT]"] = attachment_point_name.c_str(); + return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args); + } + else + { + return LLItemBridge::getLabelSuffix(); + } +} + +void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment) +{ + LLSD payload; + payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link. + + S32 attach_pt = 0; + if (gAgent.getAvatarObject() && attachment) + { + for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin(); + iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter) + { + if (iter->second == attachment) + { + attach_pt = iter->first; + break; + } + } + } + + payload["attachment_point"] = attach_pt; + +#if !ENABLE_MULTIATTACHMENTS + if (attachment && attachment->getNumObjects() > 0) + { + LLNotifications::instance().add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez); + } + else +#endif + { + LLNotifications::instance().forceResponse(LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/); + } +} + +bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response) +{ + LLVOAvatar *avatarp = gAgent.getAvatarObject(); + + if (!avatarp->canAttachMoreObjects()) + { + LLSD args; + args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS); + LLNotifications::instance().add("MaxAttachmentsOnOutfit", args); + return false; + } + + S32 option = LLNotification::getSelectedOption(notification, response); + if (option == 0/*YES*/) + { + LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID()); + + if (itemp) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ObjectData); + msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID()); + msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner()); + U8 attachment_pt = notification["payload"]["attachment_point"].asInteger(); +#if ENABLE_MULTIATTACHMENTS + attachment_pt |= ATTACHMENT_ADD; +#endif + msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt); + pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions()); + msg->addStringFast(_PREHASH_Name, itemp->getName()); + msg->addStringFast(_PREHASH_Description, itemp->getDescription()); + msg->sendReliable(gAgent.getRegion()->getHost()); + } + } + return false; +} +static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("ReplaceAttachment", confirm_replace_attachment_rez); + +void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + LLInventoryItem* item = getItem(); + if (item && item->getIsLinkType()) + { + items.push_back(std::string("Goto Link")); + } + + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + LLObjectBridge::sContextMenuItemID = mUUID; + + if(item) + { + LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); + if( !avatarp ) + { + return; + } + + if( avatarp->isWearingAttachment( mUUID ) ) + { + items.push_back(std::string("Detach From Yourself")); + } + else + if( !isInTrash() && !isLinkedObjectInTrash() ) + { + items.push_back(std::string("Attach Separator")); + items.push_back(std::string("Object Wear")); + items.push_back(std::string("Attach To")); + items.push_back(std::string("Attach To HUD")); + // commented out for DEV-32347 + //items.push_back(std::string("Restore to Last Position")); + + if (!avatarp->canAttachMoreObjects()) + { + disabled_items.push_back(std::string("Object Wear")); + disabled_items.push_back(std::string("Attach To")); + disabled_items.push_back(std::string("Attach To HUD")); + } + LLMenuGL* attach_menu = menu.findChildMenuByName("Attach To", TRUE); + LLMenuGL* attach_hud_menu = menu.findChildMenuByName("Attach To HUD", TRUE); + LLVOAvatar *avatarp = gAgent.getAvatarObject(); + if (attach_menu + && (attach_menu->getChildCount() == 0) + && attach_hud_menu + && (attach_hud_menu->getChildCount() == 0) + && avatarp) + { + for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); + iter != avatarp->mAttachmentPoints.end(); ) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter++; + LLViewerJointAttachment* attachment = curiter->second; + LLMenuItemCallGL::Params p; + std::string submenu_name = attachment->getName(); + if (LLTrans::getString(submenu_name) != "") + { + p.name = (" ")+LLTrans::getString(submenu_name)+" "; + } + else + { + p.name = submenu_name; + } + LLSD cbparams; + cbparams["index"] = curiter->first; + cbparams["label"] = attachment->getName(); + p.on_click.function_name = "Inventory.AttachObject"; + p.on_click.parameter = LLSD(attachment->getName()); + p.on_enable.function_name = "Attachment.Label"; + p.on_enable.parameter = cbparams; + LLView* parent = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu; + LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent); + } + } + } + } + } + hide_context_entries(menu, items, disabled_items); +} + +BOOL LLObjectBridge::renameItem(const std::string& new_name) +{ + if(!isItemRenameable()) + return FALSE; + LLPreview::dirty(mUUID); + LLInventoryModel* model = getInventoryModel(); + if(!model) + return FALSE; + LLViewerInventoryItem* item = getItem(); + if(item && (item->getName() != new_name)) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->rename(new_name); + buildDisplayName(new_item, mDisplayName); + new_item->updateServer(FALSE); + model->updateItem(new_item); + + model->notifyObservers(); + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if( avatar ) + { + LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() ); + if( obj ) + { + LLSelectMgr::getInstance()->deselectAll(); + LLSelectMgr::getInstance()->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); + LLSelectMgr::getInstance()->selectionSetObjectName( new_name ); + LLSelectMgr::getInstance()->deselectAll(); + } + } + } + // return FALSE because we either notified observers (& therefore + // rebuilt) or we didn't update. + return FALSE; +} + +// +=================================================+ +// | LLLSLTextBridge | +// +=================================================+ + +LLUIImagePtr LLLSLTextBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); +} + +void LLLSLTextBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } + /* + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); + } + */ +} + +// +=================================================+ +// | LLWearableBridge | +// +=================================================+ + +// *NOTE: hack to get from avatar inventory to avatar +void wear_inventory_item_on_avatar( LLInventoryItem* item ) +{ + if(item) + { + lldebugs << "wear_inventory_item_on_avatar( " << item->getName() + << " )" << llendl; + + LLAppearanceManager::wearItem(item); + } +} + +void wear_add_inventory_item_on_avatar( LLInventoryItem* item ) +{ + if(item) + { + lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName() + << " )" << llendl; + + LLWearableList::instance().getAsset(item->getAssetUUID(), + item->getName(), + item->getType(), + LLWearableBridge::onWearAddOnAvatarArrived, + new LLUUID(item->getUUID())); + } +} + +void remove_inventory_category_from_avatar( LLInventoryCategory* category ) +{ + if(!category) return; + lldebugs << "remove_inventory_category_from_avatar( " << category->getName() + << " )" << llendl; + + + if( gFloaterCustomize ) + { + gFloaterCustomize->askToSaveIfDirty( + boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID())); + } + else + { + remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); + } +} + +struct OnRemoveStruct +{ + LLUUID mUUID; + OnRemoveStruct(const LLUUID& uuid): + mUUID(uuid) + { + } +}; + +void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id) +{ + + // Find all the wearables that are in the category's subtree. + lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl; + if(proceed) + { + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + LLFindWearables is_wearable; + gInventory.collectDescendentsIf(category_id, + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_wearable); + S32 i; + S32 wearable_count = item_array.count(); + + LLInventoryModel::cat_array_t obj_cat_array; + LLInventoryModel::item_array_t obj_item_array; + LLIsType is_object( LLAssetType::AT_OBJECT ); + gInventory.collectDescendentsIf(category_id, + obj_cat_array, + obj_item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_object); + S32 obj_count = obj_item_array.count(); + + // Find all gestures in this folder + LLInventoryModel::cat_array_t gest_cat_array; + LLInventoryModel::item_array_t gest_item_array; + LLIsType is_gesture( LLAssetType::AT_GESTURE ); + gInventory.collectDescendentsIf(category_id, + gest_cat_array, + gest_item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_gesture); + S32 gest_count = gest_item_array.count(); + + if (wearable_count > 0) //Loop through wearables. If worn, remove. + { + for(i = 0; i < wearable_count; ++i) + { + if( gAgentWearables.isWearingItem (item_array.get(i)->getUUID()) ) + { + LLWearableList::instance().getAsset(item_array.get(i)->getAssetUUID(), + item_array.get(i)->getName(), + item_array.get(i)->getType(), + LLWearableBridge::onRemoveFromAvatarArrived, + new OnRemoveStruct(item_array.get(i)->getUUID())); + + } + } + } + + + if (obj_count > 0) + { + for(i = 0; i < obj_count; ++i) + { + gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); + gMessageSystem->nextBlockFast(_PREHASH_ObjectData ); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item_array.get(i)->getUUID() ); + + gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); + + // this object might have been selected, so let the selection manager know it's gone now + LLViewerObject *found_obj = gObjectList.findObject( obj_item_array.get(i)->getUUID()); + if (found_obj) + { + LLSelectMgr::getInstance()->remove(found_obj); + } + else + { + llwarns << "object not found, ignoring" << llendl; + } + } + } + + if (gest_count > 0) + { + for(i = 0; i < gest_count; ++i) + { + if ( LLGestureManager::instance().isGestureActive( gest_item_array.get(i)->getUUID()) ) + { + LLGestureManager::instance().deactivateGesture( gest_item_array.get(i)->getUUID() ); + gInventory.updateItem( gest_item_array.get(i) ); + gInventory.notifyObservers(); + } + + } + } + } +} + +BOOL LLWearableBridge::renameItem(const std::string& new_name) +{ + if( gAgentWearables.isWearingItem( mUUID ) ) + { + gAgentWearables.setWearableName( mUUID, new_name ); + } + return LLItemBridge::renameItem(new_name); +} + +BOOL LLWearableBridge::isItemRemovable() +{ + if (gAgentWearables.isWearingItem(mUUID)) return FALSE; + return LLInvFVBridge::isItemRemovable(); +} + +std::string LLWearableBridge::getLabelSuffix() const +{ + if( gAgentWearables.isWearingItem( mUUID ) ) + { + return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn"); + } + else + { + return LLItemBridge::getLabelSuffix(); + } +} + +LLUIImagePtr LLWearableBridge::getIcon() const +{ + return get_item_icon(mAssetType, mInvType, mWearableType, FALSE); +} + +// virtual +void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("wear" == action) + { + wearOnAvatar(); + } + else if ("wear_add" == action) + { + wearAddOnAvatar(); + } + else if ("edit" == action) + { + editOnAvatar(); + return; + } + else if ("take_off" == action) + { + if(gAgentWearables.isWearingItem(mUUID)) + { + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLWearableList::instance().getAsset(item->getAssetUUID(), + item->getName(), + item->getType(), + LLWearableBridge::onRemoveFromAvatarArrived, + new OnRemoveStruct(mUUID)); + } + } + } + else LLItemBridge::performAction(folder, model, action); +} + +void LLWearableBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } + /* + if( isInTrash() ) + { + LLNotifications::instance().add("CannotWearTrash"); + } + else if(isAgentInventory()) + { + if( !gAgentWearables.isWearingItem( mUUID ) ) + { + wearOnAvatar(); + } + } + else + { + // must be in the inventory library. copy it to our inventory + // and put it on right away. + LLViewerInventoryItem* item = getItem(); + if(item && item->isComplete()) + { + LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + else if(item) + { + // *TODO: We should fetch the item details, and then do + // the operation above. + LLNotifications::instance().add("CannotWearInfoNotComplete"); + } + } + */ +} + +void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLWearableBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { // FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere + BOOL no_open = ((flags & SUPPRESS_OPEN_ITEM) == SUPPRESS_OPEN_ITEM); + + // If we have clothing, don't add "Open" as it's the same action as "Wear" SL-18976 + LLViewerInventoryItem* item = getItem(); + if( !no_open && item ) + { + no_open = (item->getType() == LLAssetType::AT_CLOTHING) || + (item->getType() == LLAssetType::AT_BODYPART); + } + if (!no_open) + { + items.push_back(std::string("Open")); + } + + if (item && item->getIsLinkType()) + { + items.push_back(std::string("Goto Link")); + } + + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + items.push_back(std::string("Wearable Separator")); + + items.push_back(std::string("Wearable Wear")); + items.push_back(std::string("Wearable Add")); + items.push_back(std::string("Wearable Edit")); + + if ((flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Wearable Edit")); + } + // Don't allow items to be worn if their baseobj is in the trash. + if (isLinkedObjectInTrash()) + { + disabled_items.push_back(std::string("Wearable Wear")); + disabled_items.push_back(std::string("Wearable Add")); + disabled_items.push_back(std::string("Wearable Edit")); + } + + // Disable wear and take off based on whether the item is worn. + if(item) + { + switch (item->getType()) + { + case LLAssetType::AT_CLOTHING: + items.push_back(std::string("Take Off")); + case LLAssetType::AT_BODYPART: + if (gAgentWearables.isWearingItem(item->getUUID())) + { + disabled_items.push_back(std::string("Wearable Wear")); + disabled_items.push_back(std::string("Wearable Add")); + } + else + { + disabled_items.push_back(std::string("Take Off")); + } + break; + default: + break; + } + } + } + hide_context_entries(menu, items, disabled_items); +} + +// Called from menus +// static +BOOL LLWearableBridge::canWearOnAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(!self) return FALSE; + if(!self->isAgentInventory()) + { + LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem(); + if(!item || !item->isComplete()) return FALSE; + } + return (!gAgentWearables.isWearingItem(self->mUUID)); +} + +// Called from menus +// static +void LLWearableBridge::onWearOnAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(!self) return; + self->wearOnAvatar(); +} + +void LLWearableBridge::wearOnAvatar() +{ + // Don't wear anything until initial wearables are loaded, can + // destroy clothing items. + if (!gAgentWearables.areWearablesLoaded()) + { + LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); + return; + } + + LLViewerInventoryItem* item = getItem(); + if(item) + { + if(!isAgentInventory()) + { + LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + else + { + wear_inventory_item_on_avatar(item); + } + } +} + +void LLWearableBridge::wearAddOnAvatar() +{ + // Don't wear anything until initial wearables are loaded, can + // destroy clothing items. + if (!gAgentWearables.areWearablesLoaded()) + { + LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); + return; + } + + LLViewerInventoryItem* item = getItem(); + if(item) + { + if(!isAgentInventory()) + { + LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + else + { + wear_add_inventory_item_on_avatar(item); + } + } +} + +// static +void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata ) +{ + LLUUID* item_id = (LLUUID*) userdata; + if(wearable) + { + LLViewerInventoryItem* item = NULL; + item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); + if(item) + { + if(item->getAssetUUID() == wearable->getAssetID()) + { + gAgentWearables.setWearableItem(item, wearable); + gInventory.notifyObservers(); + //self->getFolderItem()->refreshFromRoot(); + } + else + { + llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; + } + } + } + delete item_id; +} + +// static +// BAP remove the "add" code path once everything is fully COF-ified. +void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata ) +{ + LLUUID* item_id = (LLUUID*) userdata; + if(wearable) + { + LLViewerInventoryItem* item = NULL; + item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); + if(item) + { + if(item->getAssetUUID() == wearable->getAssetID()) + { + bool do_append = true; + gAgentWearables.setWearableItem(item, wearable, do_append); + gInventory.notifyObservers(); + //self->getFolderItem()->refreshFromRoot(); + } + else + { + llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; + } + } + } + delete item_id; +} + +// static +BOOL LLWearableBridge::canEditOnAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(!self) return FALSE; + + return (gAgentWearables.isWearingItem(self->mUUID)); +} + +// static +void LLWearableBridge::onEditOnAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(self) + { + self->editOnAvatar(); + } +} + +void LLWearableBridge::editOnAvatar() +{ + const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID); + if( wearable ) + { + // Set the tab to the right wearable. + if (gFloaterCustomize) + gFloaterCustomize->setCurrentWearableType( wearable->getType() ); + + if( CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() ) + { + // Start Avatar Customization + gAgent.changeCameraToCustomizeAvatar(); + } + } +} + +// static +BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if( self && (LLAssetType::AT_BODYPART != self->mAssetType) ) + { + return gAgentWearables.isWearingItem( self->mUUID ); + } + return FALSE; +} + +// static +void LLWearableBridge::onRemoveFromAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(!self) return; + if(gAgentWearables.isWearingItem(self->mUUID)) + { + LLViewerInventoryItem* item = self->getItem(); + if (item) + { + LLUUID parent_id = item->getParentUUID(); + LLWearableList::instance().getAsset(item->getAssetUUID(), + item->getName(), + item->getType(), + onRemoveFromAvatarArrived, + new OnRemoveStruct(LLUUID(self->mUUID))); + } + } +} + +// static +void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable, + void* userdata) +{ + OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata; + const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID); + if(wearable) + { + if( gAgentWearables.isWearingItem( item_id ) ) + { + EWearableType type = wearable->getType(); + + if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES ) ) //&& + //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) ) + { + // MULTI_WEARABLE: FIXME HACK - always remove all + bool do_remove_all = false; + gAgentWearables.removeWearable( type, do_remove_all, 0 ); + } + } + } + + // Find and remove this item from the COF. + LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::getCOF()); + llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF. + for (LLInventoryModel::item_array_t::const_iterator iter = items.begin(); + iter != items.end(); + ++iter) + { + const LLViewerInventoryItem *linked_item = (*iter); + const LLUUID &item_id = linked_item->getUUID(); + gInventory.purgeObject(item_id); + } + gInventory.notifyObservers(); + + delete on_remove_struct; +} + +LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type, + const LLUUID& uuid,LLInventoryModel* model) +{ + LLInvFVBridgeAction* action = NULL; + switch(asset_type) + { + case LLAssetType::AT_TEXTURE: + action = new LLTextureBridgeAction(uuid,model); + break; + + case LLAssetType::AT_SOUND: + action = new LLSoundBridgeAction(uuid,model); + break; + + case LLAssetType::AT_LANDMARK: + action = new LLLandmarkBridgeAction(uuid,model); + break; + + case LLAssetType::AT_CALLINGCARD: + action = new LLCallingCardBridgeAction(uuid,model); + break; + + case LLAssetType::AT_OBJECT: + action = new LLObjectBridgeAction(uuid,model); + break; + + case LLAssetType::AT_NOTECARD: + action = new LLNotecardBridgeAction(uuid,model); + break; + + case LLAssetType::AT_ANIMATION: + action = new LLAnimationBridgeAction(uuid,model); + break; + + case LLAssetType::AT_GESTURE: + action = new LLGestureBridgeAction(uuid,model); + break; + + case LLAssetType::AT_LSL_TEXT: + action = new LLLSLTextBridgeAction(uuid,model); + break; + + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_BODYPART: + action = new LLWearableBridgeAction(uuid,model); + + break; + + default: + break; + } + return action; +} + +//static +void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type, + const LLUUID& uuid,LLInventoryModel* model) +{ + LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); + if(action) + { + action->doIt(); + delete action; + } +} + +//static +void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model) +{ + LLAssetType::EType asset_type = model->getItem(uuid)->getType(); + LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); + if(action) + { + action->doIt(); + delete action; + } +} + +LLViewerInventoryItem* LLInvFVBridgeAction::getItem() const +{ + if(mModel) + return (LLViewerInventoryItem*)mModel->getItem(mUUID); + return NULL; +} + +//virtual +void LLTextureBridgeAction::doIt() +{ + if (getItem()) + { + LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + +//virtual +void LLSoundBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if(item) + { + LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + + +//virtual +void LLLandmarkBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if( item ) + { + // Opening (double-clicking) a landmark immediately teleports, + // but warns you the first time. + LLSD payload; + payload["asset_id"] = item->getAssetUUID(); + LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); + } + + LLInvFVBridgeAction::doIt(); +} + + +//virtual +void LLCallingCardBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if(item && item->getCreatorUUID().notNull()) + { + LLAvatarActions::showProfile(item->getCreatorUUID()); + } + + LLInvFVBridgeAction::doIt(); +} + +//virtual +void +LLNotecardBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + +//virtual +void LLGestureBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); + preview->setFocus(TRUE); + } + + LLInvFVBridgeAction::doIt(); +} + +//virtual +void LLAnimationBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + + +//virtual +void LLObjectBridgeAction::doIt() +{ + LLFloaterReg::showInstance("properties", mUUID); + + LLInvFVBridgeAction::doIt(); +} + + +//virtual +void LLLSLTextBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + + +BOOL LLWearableBridgeAction::isInTrash() const +{ + if(!mModel) return FALSE; + LLUUID trash_id = mModel->findCategoryUUIDForType(LLAssetType::AT_TRASH); + return mModel->isObjectDescendentOf(mUUID, trash_id); +} + +BOOL LLWearableBridgeAction::isAgentInventory() const +{ + if(!mModel) return FALSE; + if(gInventory.getRootFolderID() == mUUID) return TRUE; + return mModel->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); +} + +void LLWearableBridgeAction::wearOnAvatar() +{ + // Don't wear anything until initial wearables are loaded, can + // destroy clothing items. + if (!gAgentWearables.areWearablesLoaded()) + { + LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); + return; + } + + LLViewerInventoryItem* item = getItem(); + if(item) + { + if(!isAgentInventory()) + { + LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + else + { + wear_inventory_item_on_avatar(item); + } + } +} + +//virtual +void LLWearableBridgeAction::doIt() +{ + if(isInTrash()) + { + LLNotifications::instance().add("CannotWearTrash"); + } + else if(isAgentInventory()) + { + if(!gAgentWearables.isWearingItem(mUUID)) + { + wearOnAvatar(); + } + } + else + { + // must be in the inventory library. copy it to our inventory + // and put it on right away. + LLViewerInventoryItem* item = getItem(); + if(item && item->isComplete()) + { + LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + else if(item) + { + // *TODO: We should fetch the item details, and then do + // the operation above. + LLNotifications::instance().add("CannotWearInfoNotComplete"); + } + } + + LLInvFVBridgeAction::doIt(); +} + +// +=================================================+ +// | LLLinkItemBridge | +// +=================================================+ +// For broken links + +std::string LLLinkItemBridge::sPrefix("Link: "); + + +LLUIImagePtr LLLinkItemBridge::getIcon() const +{ + if (LLViewerInventoryItem *item = getItem()) + { + return get_item_icon(item->getActualType(), LLInventoryType::IT_NONE, 0, FALSE); + } + return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE); +} + +void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + // *TODO: Translate + lldebugs << "LLLink::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Delete")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Delete")); + } + } + hide_context_entries(menu, items, disabled_items); +} + + +// +=================================================+ +// | LLLinkBridge | +// +=================================================+ +// For broken links. + +std::string LLLinkFolderBridge::sPrefix("Link: "); + + +LLUIImagePtr LLLinkFolderBridge::getIcon() const +{ + LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + if (LLViewerInventoryItem *item = getItem()) + { + if (const LLViewerInventoryCategory* cat = item->getLinkedCategory()) + { + preferred_type = cat->getPreferredType(); + } + } + return LLFolderBridge::getIcon(preferred_type); +} + +void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + // *TODO: Translate + lldebugs << "LLLink::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Goto Link")); + items.push_back(std::string("Delete")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Delete")); + } + } + hide_context_entries(menu, items, disabled_items); +} + +void LLLinkFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("goto" == action) + { + gotoItem(folder); + return; + } + LLItemBridge::performAction(folder,model,action); +} + +void LLLinkFolderBridge::gotoItem(LLFolderView *folder) +{ + const LLUUID &cat_uuid = getFolderID(); + if (!cat_uuid.isNull()) + { + if (LLFolderViewItem *base_folder = folder->getItemByID(cat_uuid)) + { + if (LLInventoryModel* model = getInventoryModel()) + { + model->fetchDescendentsOf(cat_uuid); + } + base_folder->setOpen(TRUE); + folder->setSelectionFromRoot(base_folder,TRUE); + folder->scrollToShowSelection(); + } + } +} + +const LLUUID &LLLinkFolderBridge::getFolderID() const +{ + if (LLViewerInventoryItem *link_item = getItem()) + { + if (const LLViewerInventoryCategory *cat = link_item->getLinkedCategory()) + { + const LLUUID& cat_uuid = cat->getUUID(); + return cat_uuid; + } + } + return LLUUID::null; +} diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 6b2a2d32dec..3f3513a665e 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -41,6 +41,7 @@ #include "llfoldervieweventlistener.h" class LLInventoryPanel; +class LLMenuGL; enum EInventoryIcon { @@ -121,7 +122,7 @@ class LLInventoryPanelObserver : public LLInventoryObserver }; const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type); -void hideContextEntries(LLMenuGL& menu, +void hide_context_entries(LLMenuGL& menu, const std::vector<std::string> &entries_to_show, const std::vector<std::string> &disabled_entries); @@ -807,5 +808,9 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id, void teleport_via_landmark(const LLUUID& asset_id); +// Utility function to hide all entries except those in the list +void hide_context_entries(LLMenuGL& menu, + const std::vector<std::string> &entries_to_show, + const std::vector<std::string> &disabled_entries); #endif // LL_LLINVENTORYBRIDGE_H diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp new file mode 100644 index 00000000000..694f7026544 --- /dev/null +++ b/indra/newview/llinventoryfunctions.cpp @@ -0,0 +1,344 @@ +/** + * @file llfloaterinventory.cpp + * @brief Implementation of the inventory view and associated stuff. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include <utility> // for std::pair<> + +#include "llinventoryfunctions.h" + +// library includes +#include "llagent.h" +#include "llagentwearables.h" +#include "llcallingcard.h" +#include "llfloaterreg.h" +#include "llsdserialize.h" +#include "llfiltereditor.h" +#include "llspinctrl.h" +#include "llui.h" +#include "message.h" + +// newview includes +#include "llappearancemgr.h" +#include "llappviewer.h" +#include "llfirstuse.h" +#include "llfloaterchat.h" +#include "llfloatercustomize.h" +#include "llfocusmgr.h" +#include "llfolderview.h" +#include "llgesturemgr.h" +#include "lliconctrl.h" +#include "llimview.h" +#include "llinventorybridge.h" +#include "llinventoryclipboard.h" +#include "llinventorymodel.h" +#include "llinventorypanel.h" +#include "lllineeditor.h" +#include "llmenugl.h" +#include "llpreviewanim.h" +#include "llpreviewgesture.h" +#include "llpreviewnotecard.h" +#include "llpreviewscript.h" +#include "llpreviewsound.h" +#include "llpreviewtexture.h" +#include "llresmgr.h" +#include "llscrollbar.h" +#include "llscrollcontainer.h" +#include "llselectmgr.h" +#include "lltabcontainer.h" +#include "lltooldraganddrop.h" +#include "lluictrlfactory.h" +#include "llviewerinventory.h" +#include "llviewermessage.h" +#include "llviewerobjectlist.h" +#include "llviewerregion.h" +#include "llviewerwindow.h" +#include "llvoavatarself.h" +#include "llwearablelist.h" + +BOOL LLInventoryState::sWearNewClothing = FALSE; +LLUUID LLInventoryState::sWearNewClothingTransactionID; + +void LLSaveFolderState::setApply(BOOL apply) +{ + mApply = apply; + // before generating new list of open folders, clear the old one + if(!apply) + { + clearOpenFolders(); + } +} + +void LLSaveFolderState::doFolder(LLFolderViewFolder* folder) +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_DO_FOLDER); + if(mApply) + { + // we're applying the open state + LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener(); + if(!bridge) return; + LLUUID id(bridge->getUUID()); + if(mOpenFolders.find(id) != mOpenFolders.end()) + { + folder->setOpen(TRUE); + } + else + { + // keep selected filter in its current state, this is less jarring to user + if (!folder->isSelected()) + { + folder->setOpen(FALSE); + } + } + } + else + { + // we're recording state at this point + if(folder->isOpen()) + { + LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener(); + if(!bridge) return; + mOpenFolders.insert(bridge->getUUID()); + } + } +} + +void LLOpenFilteredFolders::doItem(LLFolderViewItem *item) +{ + if (item->getFiltered()) + { + item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); + } +} + +void LLOpenFilteredFolders::doFolder(LLFolderViewFolder* folder) +{ + if (folder->getFiltered() && folder->getParentFolder()) + { + folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); + } + // if this folder didn't pass the filter, and none of its descendants did + else if (!folder->getFiltered() && !folder->hasFilteredDescendants()) + { + folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_NO); + } +} + +void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item) +{ + if (item->getFiltered() && !mItemSelected) + { + item->getRoot()->setSelection(item, FALSE, FALSE); + if (item->getParentFolder()) + { + item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); + } + item->getRoot()->scrollToShowSelection(); + mItemSelected = TRUE; + } +} + +void LLSelectFirstFilteredItem::doFolder(LLFolderViewFolder* folder) +{ + if (folder->getFiltered() && !mItemSelected) + { + folder->getRoot()->setSelection(folder, FALSE, FALSE); + if (folder->getParentFolder()) + { + folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); + } + folder->getRoot()->scrollToShowSelection(); + mItemSelected = TRUE; + } +} + +void LLOpenFoldersWithSelection::doItem(LLFolderViewItem *item) +{ + if (item->getParentFolder() && item->isSelected()) + { + item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); + } +} + +void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder) +{ + if (folder->getParentFolder() && folder->isSelected()) + { + folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); + } +} + +const std::string& get_item_icon_name(LLAssetType::EType asset_type, + LLInventoryType::EType inventory_type, + U32 attachment_point, + BOOL item_is_multi ) +{ + EInventoryIcon idx = OBJECT_ICON_NAME; + if ( item_is_multi ) + { + idx = OBJECT_MULTI_ICON_NAME; + } + + switch(asset_type) + { + case LLAssetType::AT_TEXTURE: + if(LLInventoryType::IT_SNAPSHOT == inventory_type) + { + idx = SNAPSHOT_ICON_NAME; + } + else + { + idx = TEXTURE_ICON_NAME; + } + break; + + case LLAssetType::AT_SOUND: + idx = SOUND_ICON_NAME; + break; + case LLAssetType::AT_CALLINGCARD: + if(attachment_point!= 0) + { + idx = CALLINGCARD_ONLINE_ICON_NAME; + } + else + { + idx = CALLINGCARD_OFFLINE_ICON_NAME; + } + break; + case LLAssetType::AT_LANDMARK: + if(attachment_point!= 0) + { + idx = LANDMARK_VISITED_ICON_NAME; + } + else + { + idx = LANDMARK_ICON_NAME; + } + break; + case LLAssetType::AT_SCRIPT: + case LLAssetType::AT_LSL_TEXT: + case LLAssetType::AT_LSL_BYTECODE: + idx = SCRIPT_ICON_NAME; + break; + case LLAssetType::AT_CLOTHING: + idx = CLOTHING_ICON_NAME; + case LLAssetType::AT_BODYPART : + if(LLAssetType::AT_BODYPART == asset_type) + { + idx = BODYPART_ICON_NAME; + } + switch(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point) + { + case WT_SHAPE: + idx = BODYPART_SHAPE_ICON_NAME; + break; + case WT_SKIN: + idx = BODYPART_SKIN_ICON_NAME; + break; + case WT_HAIR: + idx = BODYPART_HAIR_ICON_NAME; + break; + case WT_EYES: + idx = BODYPART_EYES_ICON_NAME; + break; + case WT_SHIRT: + idx = CLOTHING_SHIRT_ICON_NAME; + break; + case WT_PANTS: + idx = CLOTHING_PANTS_ICON_NAME; + break; + case WT_SHOES: + idx = CLOTHING_SHOES_ICON_NAME; + break; + case WT_SOCKS: + idx = CLOTHING_SOCKS_ICON_NAME; + break; + case WT_JACKET: + idx = CLOTHING_JACKET_ICON_NAME; + break; + case WT_GLOVES: + idx = CLOTHING_GLOVES_ICON_NAME; + break; + case WT_UNDERSHIRT: + idx = CLOTHING_UNDERSHIRT_ICON_NAME; + break; + case WT_UNDERPANTS: + idx = CLOTHING_UNDERPANTS_ICON_NAME; + break; + case WT_SKIRT: + idx = CLOTHING_SKIRT_ICON_NAME; + break; + case WT_ALPHA: + idx = CLOTHING_ALPHA_ICON_NAME; + break; + case WT_TATTOO: + idx = CLOTHING_TATTOO_ICON_NAME; + break; + default: + // no-op, go with choice above + break; + } + break; + case LLAssetType::AT_NOTECARD: + idx = NOTECARD_ICON_NAME; + break; + case LLAssetType::AT_ANIMATION: + idx = ANIMATION_ICON_NAME; + break; + case LLAssetType::AT_GESTURE: + idx = GESTURE_ICON_NAME; + break; + case LLAssetType::AT_FAVORITE: + //TODO - need bette idx + idx = LANDMARK_ICON_NAME; + break; + case LLAssetType::AT_LINK: + idx = LINKITEM_ICON_NAME; + break; + case LLAssetType::AT_LINK_FOLDER: + idx = LINKFOLDER_ICON_NAME; + break; + default: + break; + } + + return ICON_NAME[idx]; +} + +LLUIImagePtr get_item_icon(LLAssetType::EType asset_type, + LLInventoryType::EType inventory_type, + U32 attachment_point, + BOOL item_is_multi) +{ + const std::string& icon_name = get_item_icon_name(asset_type, inventory_type, attachment_point, item_is_multi ); + return LLUI::getUIImage(icon_name); +} diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h new file mode 100644 index 00000000000..efd40576a76 --- /dev/null +++ b/indra/newview/llinventoryfunctions.h @@ -0,0 +1,136 @@ +/** + * @file llinventoryfunctions.h + * @brief Miscellaneous inventory-related functions and classes + * class definition + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLINVENTORYFUNCTIONS_H +#define LL_LLINVENTORYFUNCTIONS_H + +#include "llassetstorage.h" +#include "lldarray.h" +#include "llfloater.h" +#include "llinventory.h" +#include "llinventoryfilter.h" +#include "llfolderview.h" +#include "llinventorymodel.h" +#include "lluictrlfactory.h" +#include <set> + + +class LLFolderViewItem; +class LLInventoryFilter; +class LLInventoryModel; +class LLInventoryPanel; +class LLInvFVBridge; +class LLInventoryFVBridgeBuilder; +class LLMenuBarGL; +class LLCheckBoxCtrl; +class LLSpinCtrl; +class LLScrollContainer; +class LLTextBox; +class LLIconCtrl; +class LLSaveFolderState; +class LLFilterEditor; +class LLTabContainer; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// This is a collection of miscellaneous functions and classes +// that don't fit cleanly into any other class header. +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLInventoryState +{ +public: + // HACK: Until we can route this info through the instant message hierarchy + static BOOL sWearNewClothing; + static LLUUID sWearNewClothingTransactionID; // wear all clothing in this transaction +}; + +class LLSelectFirstFilteredItem : public LLFolderViewFunctor +{ +public: + LLSelectFirstFilteredItem() : mItemSelected(FALSE) {} + virtual ~LLSelectFirstFilteredItem() {} + virtual void doFolder(LLFolderViewFolder* folder); + virtual void doItem(LLFolderViewItem* item); + BOOL wasItemSelected() { return mItemSelected; } +protected: + BOOL mItemSelected; +}; + +class LLOpenFilteredFolders : public LLFolderViewFunctor +{ +public: + LLOpenFilteredFolders() {} + virtual ~LLOpenFilteredFolders() {} + virtual void doFolder(LLFolderViewFolder* folder); + virtual void doItem(LLFolderViewItem* item); +}; + +class LLSaveFolderState : public LLFolderViewFunctor +{ +public: + LLSaveFolderState() : mApply(FALSE) {} + virtual ~LLSaveFolderState() {} + virtual void doFolder(LLFolderViewFolder* folder); + virtual void doItem(LLFolderViewItem* item) {} + void setApply(BOOL apply); + void clearOpenFolders() { mOpenFolders.clear(); } +protected: + std::set<LLUUID> mOpenFolders; + BOOL mApply; +}; + +class LLOpenFoldersWithSelection : public LLFolderViewFunctor +{ +public: + LLOpenFoldersWithSelection() {} + virtual ~LLOpenFoldersWithSelection() {} + virtual void doFolder(LLFolderViewFolder* folder); + virtual void doItem(LLFolderViewItem* item); +}; + +const std::string& get_item_icon_name(LLAssetType::EType asset_type, + LLInventoryType::EType inventory_type, + U32 attachment_point, + BOOL item_is_multi ); + +LLUIImagePtr get_item_icon(LLAssetType::EType asset_type, + LLInventoryType::EType inventory_type, + U32 attachment_point, + BOOL item_is_multi ); + +#endif // LL_LLINVENTORYFUNCTIONS_H + + + diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 1d7cbde0d56..23439191f3d 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -46,6 +46,8 @@ #include "llfloater.h" #include "llfocusmgr.h" #include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llinventorypanel.h" #include "llfloaterinventory.h" #include "llviewerinventory.h" #include "llviewermessage.h" @@ -3174,13 +3176,13 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**) // The incoming inventory could span more than one BulkInventoryUpdate packet, // so record the transaction ID for this purchase, then wear all clothing // that comes in as part of that transaction ID. JC - if (LLFloaterInventory::sWearNewClothing) + if (LLInventoryState::sWearNewClothing) { - LLFloaterInventory::sWearNewClothingTransactionID = tid; - LLFloaterInventory::sWearNewClothing = FALSE; + LLInventoryState::sWearNewClothingTransactionID = tid; + LLInventoryState::sWearNewClothing = FALSE; } - if (tid == LLFloaterInventory::sWearNewClothingTransactionID) + if (tid == LLInventoryState::sWearNewClothingTransactionID) { count = wearable_ids.size(); for (i = 0; i < count; ++i) diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index ea528a1df89..c28792a711d 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -51,7 +51,7 @@ // project includes #include "llagent.h" #include "llfloaterbulkpermission.h" -#include "llpanelinventory.h" +#include "llpanelobjectinventory.h" #include "llpreviewscript.h" #include "llresmgr.h" #include "llselectmgr.h" @@ -89,14 +89,14 @@ BOOL LLPanelContents::postBuild() childSetAction("button new script",&LLPanelContents::onClickNewScript, this); childSetAction("button permissions",&LLPanelContents::onClickPermissions, this); - mPanelInventory = getChild<LLPanelInventory>("contents_inventory"); + mPanelInventoryObject = getChild<LLPanelObjectInventory>("contents_inventory"); return TRUE; } LLPanelContents::LLPanelContents() : LLPanel(), - mPanelInventory(NULL) + mPanelInventoryObject(NULL) { } @@ -139,9 +139,9 @@ void LLPanelContents::refresh() LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(children_ok); getState(object); - if (mPanelInventory) + if (mPanelInventoryObject) { - mPanelInventory->refresh(); + mPanelInventoryObject->refresh(); } } diff --git a/indra/newview/llpanelcontents.h b/indra/newview/llpanelcontents.h index bab980b5246..14256845a6c 100644 --- a/indra/newview/llpanelcontents.h +++ b/indra/newview/llpanelcontents.h @@ -35,9 +35,14 @@ #include "v3math.h" #include "llpanel.h" +#include "llinventory.h" +#include "lluuid.h" +#include "llmap.h" +#include "llviewerobject.h" +#include "llvoinventorylistener.h" class LLButton; -class LLPanelInventory; +class LLPanelObjectInventory; class LLViewerObject; class LLCheckBoxCtrl; class LLSpinCtrl; @@ -70,7 +75,7 @@ class LLPanelContents : public LLPanel void getState(LLViewerObject *object); public: - LLPanelInventory* mPanelInventory; + LLPanelObjectInventory* mPanelInventoryObject; }; -#endif +#endif // LL_LLPANELCONTENTS_H diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 0ce85818dd6..22138a81eca 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -38,6 +38,7 @@ #include "llinventory.h" #include "llviewerinventory.h" +#include "llinventoryfunctions.h" #include "llinventorymodel.h" #include "llfloaterinventory.h" #include "llagent.h" diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 3d0db710453..7bc42b36f9c 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -1,954 +1,955 @@ -/** - * @file llpanellandmarks.cpp - * @brief Landmarks tab for Side Bar "Places" panel - * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llpanellandmarks.h" - -#include "llbutton.h" -#include "llfloaterreg.h" -#include "llsdutil.h" -#include "llsdutil_math.h" - -#include "llaccordionctrl.h" -#include "llaccordionctrltab.h" -#include "llagent.h" -#include "llagentpicksinfo.h" -#include "llagentui.h" -#include "llcallbacklist.h" -#include "lldndbutton.h" -#include "llfloaterworldmap.h" -#include "llfolderviewitem.h" -#include "llinventorysubtreepanel.h" -#include "lllandmarkactions.h" -#include "llplacesinventorybridge.h" -#include "llsidetray.h" -#include "llviewermenu.h" -#include "llviewerregion.h" - -// Not yet implemented; need to remove buildPanel() from constructor when we switch -//static LLRegisterPanelClassWrapper<LLLandmarksPanel> t_landmarks("panel_landmarks"); - -static const std::string OPTIONS_BUTTON_NAME = "options_gear_btn"; -static const std::string ADD_BUTTON_NAME = "add_btn"; -static const std::string ADD_FOLDER_BUTTON_NAME = "add_folder_btn"; -static const std::string TRASH_BUTTON_NAME = "trash_btn"; - - -// helper functions -static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string); - - -LLLandmarksPanel::LLLandmarksPanel() - : LLPanelPlacesTab() - , mFavoritesInventoryPanel(NULL) - , mLandmarksInventoryPanel(NULL) - , mMyInventoryPanel(NULL) - , mLibraryInventoryPanel(NULL) - , mCurrentSelectedList(NULL) - , mListCommands(NULL) - , mGearFolderMenu(NULL) - , mGearLandmarkMenu(NULL) - , mDirtyFilter(false) -{ - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_landmarks.xml"); -} - -LLLandmarksPanel::~LLLandmarksPanel() -{ -} - -BOOL LLLandmarksPanel::postBuild() -{ - if (!gInventory.isInventoryUsable()) - return FALSE; - - // mast be called before any other initXXX methods to init Gear menu - initListCommandsHandlers(); - - U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER); - mSortByDate = sort_order & LLInventoryFilter::SO_DATE; - initFavoritesInventroyPanel(); - initLandmarksInventroyPanel(); - initMyInventroyPanel(); - initLibraryInventroyPanel(); - - gIdleCallbacks.addFunction(LLLandmarksPanel::doIdle, this); - return TRUE; -} - -// virtual -void LLLandmarksPanel::onSearchEdit(const std::string& string) -{ - static std::string prev_string(""); - - if (prev_string == string) return; - - // show all folders in Landmarks Accordion for empty filter - mLandmarksInventoryPanel->setShowFolderState(string.empty() ? - LLInventoryFilter::SHOW_ALL_FOLDERS : - LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS - ); - - filter_list(mFavoritesInventoryPanel, string); - filter_list(mLandmarksInventoryPanel, string); - filter_list(mMyInventoryPanel, string); - filter_list(mLibraryInventoryPanel, string); - - prev_string = string; - mDirtyFilter = true; - - // give FolderView a chance to be refreshed. So, made all accordions visible - for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) - { - LLAccordionCtrlTab* tab = *iter; - tab->setVisible(true); - } -} - -// virtual -void LLLandmarksPanel::onShowOnMap() -{ - if (NULL == mCurrentSelectedList) - { - llwarns << "There are no selected list. No actions are performed." << llendl; - return; - } - LLLandmark* landmark = getCurSelectedLandmark(); - if (!landmark) - return; - - LLVector3d landmark_global_pos; - if (!landmark->getGlobalPos(landmark_global_pos)) - return; - - LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); - if (!landmark_global_pos.isExactlyZero() && worldmap_instance) - { - worldmap_instance->trackLocation(landmark_global_pos); - LLFloaterReg::showInstance("world_map", "center"); - } -} - -// virtual -void LLLandmarksPanel::onTeleport() -{ - LLFolderViewItem* current_item = getCurSelectedItem(); - if (!current_item) - { - llwarns << "There are no selected list. No actions are performed." << llendl; - return; - } - - LLFolderViewEventListener* listenerp = current_item->getListener(); - if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK) - { - listenerp->openItem(); - } -} - -// virtual -void LLLandmarksPanel::updateVerbs() -{ - if (!isTabVisible()) - return; - - BOOL enabled = isLandmarkSelected(); - mTeleportBtn->setEnabled(enabled); - mShowOnMapBtn->setEnabled(enabled); - - // TODO: mantipov: Uncomment when mShareBtn is supported - // Share button should be enabled when neither a folder nor a landmark is selected - //mShareBtn->setEnabled(NULL != current_item); - - updateListCommands(); -} - -void LLLandmarksPanel::onSelectionChange(LLInventorySubTreePanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action) -{ - if (user_action && (items.size() > 0)) - { - deselectOtherThan(inventory_list); - mCurrentSelectedList = inventory_list; - } - - LLFolderViewItem* current_item = inventory_list->getRootFolder()->getCurSelectedItem(); - if (!current_item) - return; - - updateVerbs(); -} - -void LLLandmarksPanel::onSelectorButtonClicked() -{ - // TODO: mantipov: update getting of selected item - // TODO: bind to "i" button - LLFolderViewItem* cur_item = mFavoritesInventoryPanel->getRootFolder()->getCurSelectedItem(); - - LLFolderViewEventListener* listenerp = cur_item->getListener(); - if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK) - { - LLSD key; - key["type"] = "landmark"; - key["id"] = listenerp->getUUID(); - - LLSideTray::getInstance()->showPanel("panel_places", key); - } -} - -////////////////////////////////////////////////////////////////////////// -// PROTECTED METHODS -////////////////////////////////////////////////////////////////////////// - -bool LLLandmarksPanel::isLandmarkSelected() const -{ - LLFolderViewItem* current_item = getCurSelectedItem(); - if(current_item && current_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK) - { - return true; - } - - return false; -} - -bool LLLandmarksPanel::isReceivedFolderSelected() const -{ - // Received Folder can be only in Landmarks accordion - if (mCurrentSelectedList != mLandmarksInventoryPanel) return false; - - // *TODO: it should be filled with logic when EXT-976 is done. - - llwarns << "Not implemented yet until EXT-976 is done." << llendl; - - return false; -} -LLLandmark* LLLandmarksPanel::getCurSelectedLandmark() const -{ - - LLFolderViewItem* cur_item = getCurSelectedItem(); - if(cur_item && cur_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK) - { - return LLLandmarkActions::getLandmark(cur_item->getListener()->getUUID()); - } - return NULL; -} - -LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem () const -{ - return mCurrentSelectedList ? mCurrentSelectedList->getRootFolder()->getCurSelectedItem() : NULL; -} - -void LLLandmarksPanel::updateSortOrder(LLInventoryPanel* panel, bool byDate) -{ - if(!panel) return; - - U32 order = panel->getSortOrder(); - if (byDate) - { - panel->setSortOrder( order | LLInventoryFilter::SO_DATE ); - } - else - { - panel->setSortOrder( order & ~LLInventoryFilter::SO_DATE ); - } -} - -// virtual -void LLLandmarksPanel::processParcelInfo(const LLParcelData& parcel_data) -{ - //this function will be called after user will try to create a pick for selected landmark. - // We have to make request to sever to get parcel_id and snaption_id. - if(isLandmarkSelected()) - { - LLLandmark* landmark = getCurSelectedLandmark(); - LLFolderViewItem* cur_item = getCurSelectedItem(); - LLUUID id = cur_item->getListener()->getUUID(); - LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id); - if(landmark) - { - LLPanelPickEdit* panel_pick = LLPanelPickEdit::create(); - LLVector3d landmark_global_pos; - landmark->getGlobalPos(landmark_global_pos); - - // let's toggle pick panel into panel places - LLPanel* panel_places = LLSideTray::getInstance()->getChild<LLPanel>("panel_places");//-> sidebar_places - panel_places->addChild(panel_pick); - LLRect paren_rect(panel_places->getRect()); - panel_pick->reshape(paren_rect.getWidth(),paren_rect.getHeight(), TRUE); - panel_pick->setRect(paren_rect); - panel_pick->onOpen(LLSD()); - - LLPickData data; - data.pos_global = landmark_global_pos; - data.name = cur_item->getName(); - data.desc = inv_item->getDescription(); - data.snapshot_id = parcel_data.snapshot_id; - data.parcel_id = parcel_data.parcel_id; - panel_pick->setPickData(&data); - - LLSD params; - params["parcel_id"] =parcel_data.parcel_id; - /* set exit callback to get back onto panel places - in callback we will make cleaning up( delete pick_panel instance, - remove landmark panel from observer list - */ - panel_pick->setExitCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this, - panel_pick, panel_places,params)); - panel_pick->setSaveCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this, - panel_pick, panel_places,params)); - panel_pick->setCancelCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this, - panel_pick, panel_places,params)); - } - } -} - -// virtual -void LLLandmarksPanel::setParcelID(const LLUUID& parcel_id) -{ - if (!parcel_id.isNull()) - { - LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this); - LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id); - } -} - -// virtual -void LLLandmarksPanel::setErrorStatus(U32 status, const std::string& reason) -{ - llerrs<< "Can't handle remote parcel request."<< " Http Status: "<< status << ". Reason : "<< reason<<llendl; -} - - -////////////////////////////////////////////////////////////////////////// -// PRIVATE METHODS -////////////////////////////////////////////////////////////////////////// - -void LLLandmarksPanel::initFavoritesInventroyPanel() -{ - mFavoritesInventoryPanel = getChild<LLInventorySubTreePanel>("favorites_list"); - - initLandmarksPanel(mFavoritesInventoryPanel); - - initAccordion("tab_favorites", mFavoritesInventoryPanel); -} - -void LLLandmarksPanel::initLandmarksInventroyPanel() -{ - mLandmarksInventoryPanel = getChild<LLInventorySubTreePanel>("landmarks_list"); - - initLandmarksPanel(mLandmarksInventoryPanel); - - mLandmarksInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); - - // subscribe to have auto-rename functionality while creating New Folder - mLandmarksInventoryPanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mLandmarksInventoryPanel, _1, _2)); - - initAccordion("tab_landmarks", mLandmarksInventoryPanel); -} - -void LLLandmarksPanel::initMyInventroyPanel() -{ - mMyInventoryPanel= getChild<LLInventorySubTreePanel>("my_inventory_list"); - - initLandmarksPanel(mMyInventoryPanel); - - initAccordion("tab_inventory", mMyInventoryPanel); -} - -void LLLandmarksPanel::initLibraryInventroyPanel() -{ - mLibraryInventoryPanel = getChild<LLInventorySubTreePanel>("library_list"); - - initLandmarksPanel(mLibraryInventoryPanel); - - initAccordion("tab_library", mLibraryInventoryPanel); -} - -void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_list) -{ - inventory_list->setFilterTypes(0x1 << LLInventoryType::IT_LANDMARK); - inventory_list->setSelectCallback(boost::bind(&LLLandmarksPanel::onSelectionChange, this, inventory_list, _1, _2)); - - inventory_list->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - updateSortOrder(inventory_list, mSortByDate); - - LLPlacesFolderView* root_folder = dynamic_cast<LLPlacesFolderView*>(inventory_list->getRootFolder()); - if (root_folder) - { - root_folder->setupMenuHandle(LLInventoryType::IT_CATEGORY, mGearFolderMenu->getHandle()); - root_folder->setupMenuHandle(LLInventoryType::IT_LANDMARK, mGearLandmarkMenu->getHandle()); - } - - // save initial folder state to avoid incorrect work while switching between Landmarks & Teleport History tabs - // See EXT-1609. - inventory_list->saveFolderState(); -} - -void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLInventorySubTreePanel* inventory_list) -{ - LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>(accordion_tab_name); - mAccordionTabs.push_back(accordion_tab); - accordion_tab->setDropDownStateChangedCallback( - boost::bind(&LLLandmarksPanel::onAccordionExpandedCollapsed, this, _2, inventory_list)); -} - -void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLInventorySubTreePanel* inventory_list) -{ - bool expanded = param.asBoolean(); - - if(!expanded && (mCurrentSelectedList == inventory_list)) - { - inventory_list->getRootFolder()->clearSelection(); - - mCurrentSelectedList = NULL; - updateVerbs(); - } -} - -void LLLandmarksPanel::deselectOtherThan(const LLInventorySubTreePanel* inventory_list) -{ - if (inventory_list != mFavoritesInventoryPanel) - { - mFavoritesInventoryPanel->getRootFolder()->clearSelection(); - } - - if (inventory_list != mLandmarksInventoryPanel) - { - mLandmarksInventoryPanel->getRootFolder()->clearSelection(); - } - if (inventory_list != mMyInventoryPanel) - { - mMyInventoryPanel->getRootFolder()->clearSelection(); - } - if (inventory_list != mLibraryInventoryPanel) - { - mLibraryInventoryPanel->getRootFolder()->clearSelection(); - } -} - -// List Commands Handlers -void LLLandmarksPanel::initListCommandsHandlers() -{ - mListCommands = getChild<LLPanel>("bottom_panel"); - - mListCommands->childSetAction(OPTIONS_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onActionsButtonClick, this)); - mListCommands->childSetAction(TRASH_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onTrashButtonClick, this)); - mListCommands->getChild<LLButton>(ADD_BUTTON_NAME)->setHeldDownCallback(boost::bind(&LLLandmarksPanel::onAddButtonHeldDown, this)); - static const LLSD add_landmark_command("add_landmark"); - mListCommands->childSetAction(ADD_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onAddAction, this, add_landmark_command)); - - LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>(TRASH_BUTTON_NAME); - trash_btn->setDragAndDropHandler(boost::bind(&LLLandmarksPanel::handleDragAndDropToTrash, this - , _4 // BOOL drop - , _5 // EDragAndDropType cargo_type - , _7 // EAcceptance* accept - )); - - mCommitCallbackRegistrar.add("Places.LandmarksGear.Add.Action", boost::bind(&LLLandmarksPanel::onAddAction, this, _2)); - mCommitCallbackRegistrar.add("Places.LandmarksGear.CopyPaste.Action", boost::bind(&LLLandmarksPanel::onClipboardAction, this, _2)); - mCommitCallbackRegistrar.add("Places.LandmarksGear.Custom.Action", boost::bind(&LLLandmarksPanel::onCustomAction, this, _2)); - mCommitCallbackRegistrar.add("Places.LandmarksGear.Folding.Action", boost::bind(&LLLandmarksPanel::onFoldingAction, this, _2)); - mEnableCallbackRegistrar.add("Places.LandmarksGear.Check", boost::bind(&LLLandmarksPanel::isActionChecked, this, _2)); - mEnableCallbackRegistrar.add("Places.LandmarksGear.Enable", boost::bind(&LLLandmarksPanel::isActionEnabled, this, _2)); - mGearLandmarkMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_landmark.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - mGearFolderMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_folder.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_place_add_button.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); -} - - -void LLLandmarksPanel::updateListCommands() -{ - bool add_folder_enabled = isActionEnabled("category"); - bool trash_enabled = isActionEnabled("delete"); - - // keep Options & Add Landmark buttons always enabled - mListCommands->childSetEnabled(ADD_FOLDER_BUTTON_NAME, add_folder_enabled); - mListCommands->childSetEnabled(TRASH_BUTTON_NAME, trash_enabled); -} - -void LLLandmarksPanel::onActionsButtonClick() -{ - LLFolderViewItem* cur_item = NULL; - if(mCurrentSelectedList) - cur_item = mCurrentSelectedList->getRootFolder()->getCurSelectedItem(); - - if(!cur_item) - return; - - LLFolderViewEventListener* listenerp = cur_item->getListener(); - - LLMenuGL* menu =NULL; - if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK) - { - menu = mGearLandmarkMenu; - } - else if (listenerp->getInventoryType() == LLInventoryType::IT_CATEGORY) - { - mGearFolderMenu->getChild<LLMenuItemCallGL>("expand")->setVisible(!cur_item->isOpen()); - mGearFolderMenu->getChild<LLMenuItemCallGL>("collapse")->setVisible(cur_item->isOpen()); - menu = mGearFolderMenu; - } - showActionMenu(menu,OPTIONS_BUTTON_NAME); -} - -void LLLandmarksPanel::onAddButtonHeldDown() -{ - showActionMenu(mMenuAdd,ADD_BUTTON_NAME); -} - -void LLLandmarksPanel::showActionMenu(LLMenuGL* menu, std::string spawning_view_name) -{ - if (menu) - { - menu->buildDrawLabels(); - menu->updateParent(LLMenuGL::sMenuContainer); - LLView* spawning_view = getChild<LLView> (spawning_view_name); - S32 menu_x, menu_y; - //show menu in co-ordinates of panel - spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this); - menu_y += menu->getRect().getHeight(); - LLMenuGL::showPopup(this, menu, menu_x, menu_y); - } -} - -void LLLandmarksPanel::onTrashButtonClick() const -{ - onClipboardAction("delete"); -} - -void LLLandmarksPanel::onAddAction(const LLSD& userdata) const -{ - std::string command_name = userdata.asString(); - if("add_landmark" == command_name) - { - if(LLLandmarkActions::landmarkAlreadyExists()) - { - std::string location; - LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_FULL); - llwarns<<" Landmark already exists at location: "<< location<<llendl; - return; - } - LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); - } - else if ("category" == command_name) - { - LLFolderViewItem* item = getCurSelectedItem(); - if (item && mCurrentSelectedList == mLandmarksInventoryPanel) - { - LLFolderViewEventListener* folder_bridge = NULL; - if (item-> getListener()->getInventoryType() - == LLInventoryType::IT_LANDMARK) - { - // for a landmark get parent folder bridge - folder_bridge = item->getParentFolder()->getListener(); - } - else if (item-> getListener()->getInventoryType() - == LLInventoryType::IT_CATEGORY) - { - // for a folder get its own bridge - folder_bridge = item->getListener(); - } - - menu_create_inventory_item(mCurrentSelectedList->getRootFolder(), - dynamic_cast<LLFolderBridge*> (folder_bridge), LLSD( - "category"), gInventory.findCategoryUUIDForType( - LLAssetType::AT_LANDMARK)); - } - } -} - -void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const -{ - if(!mCurrentSelectedList) - return; - std::string command_name = userdata.asString(); - if("copy_slurl" == command_name) - { - LLFolderViewItem* cur_item = getCurSelectedItem(); - if(cur_item) - LLLandmarkActions::copySLURLtoClipboard(cur_item->getListener()->getUUID()); - } - else if ( "paste" == command_name) - { - mCurrentSelectedList->getRootFolder()->paste(); - } - else if ( "cut" == command_name) - { - mCurrentSelectedList->getRootFolder()->cut(); - } - else - { - mCurrentSelectedList->getRootFolder()->doToSelected(mCurrentSelectedList->getModel(),command_name); - } -} - -void LLLandmarksPanel::onFoldingAction(const LLSD& userdata) -{ - if(!mCurrentSelectedList) return; - - LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); - std::string command_name = userdata.asString(); - - if ("expand_all" == command_name) - { - root_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); - root_folder->arrangeAll(); - } - else if ("collapse_all" == command_name) - { - root_folder->closeAllFolders(); - } - else if ( "sort_by_date" == command_name) - { - mSortByDate = !mSortByDate; - updateSortOrder(mLandmarksInventoryPanel, mSortByDate); - updateSortOrder(mMyInventoryPanel, mSortByDate); - updateSortOrder(mLibraryInventoryPanel, mSortByDate); - } - else - { - root_folder->doToSelected(&gInventory, userdata); - } -} - -bool LLLandmarksPanel::isActionChecked(const LLSD& userdata) const -{ - const std::string command_name = userdata.asString(); - - if ( "sort_by_date" == command_name) - { - return mSortByDate; - } - - return false; -} - -bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const -{ - std::string command_name = userdata.asString(); - - - LLPlacesFolderView* rootFolderView = mCurrentSelectedList ? - static_cast<LLPlacesFolderView*>(mCurrentSelectedList->getRootFolder()) : NULL; - - if (NULL == rootFolderView) return false; - - // disable some commands for multi-selection. EXT-1757 - if (rootFolderView->getSelectedCount() > 1) - { - if ( "teleport" == command_name - || "more_info" == command_name - || "rename" == command_name - || "show_on_map" == command_name - || "copy_slurl" == command_name - ) - { - return false; - } - - } - - // disable some commands for Favorites accordion. EXT-1758 - if (mCurrentSelectedList == mFavoritesInventoryPanel) - { - if ( "expand_all" == command_name - || "collapse_all" == command_name - || "sort_by_date" == command_name - ) - return false; - } - - - if("category" == command_name) - { - // we can add folder only in Landmarks Accordion - if (mCurrentSelectedList == mLandmarksInventoryPanel) - { - // ... but except Received folder - return !isReceivedFolderSelected(); - } - else return false; - } - else if("paste" == command_name || "rename" == command_name || "cut" == command_name || "delete" == command_name) - { - return canSelectedBeModified(command_name); - } - else if ( "sort_by_date" == command_name) - { - return mSortByDate; - } - else if("create_pick" == command_name) - { - return !LLAgentPicksInfo::getInstance()->isPickLimitReached(); - } - else - { - llwarns << "Unprocessed command has come: " << command_name << llendl; - } - - return true; -} - -void LLLandmarksPanel::onCustomAction(const LLSD& userdata) -{ - LLFolderViewItem* cur_item = getCurSelectedItem(); - if(!cur_item) - return ; - std::string command_name = userdata.asString(); - if("more_info" == command_name) - { - cur_item->getListener()->performAction(mCurrentSelectedList->getRootFolder(),mCurrentSelectedList->getModel(),"about"); - } - else if ("teleport" == command_name) - { - onTeleport(); - } - else if ("show_on_map" == command_name) - { - onShowOnMap(); - } - else if ("create_pick" == command_name) - { - LLLandmark* landmark = getCurSelectedLandmark(); - if(!landmark) return; - - LLViewerRegion* region = gAgent.getRegion(); - if (!region) return; - - LLGlobalVec pos_global; - LLUUID region_id; - landmark->getGlobalPos(pos_global); - landmark->getRegionID(region_id); - LLVector3 region_pos((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), - (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), - (F32)pos_global.mdV[VZ]); - - LLSD body; - std::string url = region->getCapability("RemoteParcelRequest"); - if (!url.empty()) - { - body["location"] = ll_sd_from_vector3(region_pos); - if (!region_id.isNull()) - { - body["region_id"] = region_id; - } - if (!pos_global.isExactlyZero()) - { - U64 region_handle = to_region_handle(pos_global); - body["region_handle"] = ll_sd_from_U64(region_handle); - } - LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle())); - } - else - { - llwarns << "Can't create pick for landmark for region" << region_id - << ". Region: " << region->getName() - << " does not support RemoteParcelRequest" << llendl; - } - } -} - -/* -Processes such actions: cut/rename/delete/paste actions - -Rules: - 1. We can't perform any action in Library - 2. For Landmarks we can: - - cut/rename/delete in any other accordions - - paste - only in Favorites, Landmarks accordions - 3. For Folders we can: perform any action in Landmarks accordion, except Received folder - 4. We can not paste folders from Clipboard (processed by LLFolderView::canPaste()) - 5. Check LLFolderView/Inventory Bridges rules - */ -bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) const -{ - // validate own rules first - - // nothing can be modified in Library - if (mLibraryInventoryPanel == mCurrentSelectedList) return false; - - bool can_be_modified = false; - - // landmarks can be modified in any other accordion... - if (isLandmarkSelected()) - { - can_be_modified = true; - - // we can modify landmarks anywhere except paste to My Inventory - if ("paste" == command_name) - { - can_be_modified = (mCurrentSelectedList != mMyInventoryPanel); - } - } - else - { - // ...folders only in the Landmarks accordion... - can_be_modified = mLandmarksInventoryPanel == mCurrentSelectedList; - - // ...except "Received" folder - can_be_modified &= !isReceivedFolderSelected(); - } - - // then ask LLFolderView permissions - if (can_be_modified) - { - if ("cut" == command_name) - { - can_be_modified = mCurrentSelectedList->getRootFolder()->canCut(); - } - else if ("rename" == command_name) - { - can_be_modified = getCurSelectedItem()->getListener()->isItemRenameable(); - } - else if ("delete" == command_name) - { - can_be_modified = getCurSelectedItem()->getListener()->isItemRemovable(); - } - else if("paste" == command_name) - { - return mCurrentSelectedList->getRootFolder()->canPaste(); - } - else - { - llwarns << "Unprocessed command has come: " << command_name << llendl; - } - } - - return can_be_modified; -} - -void LLLandmarksPanel::onPickPanelExit( LLPanelPickEdit* pick_panel, LLView* owner, const LLSD& params) -{ - pick_panel->setVisible(FALSE); - owner->removeChild(pick_panel); - //we need remove observer to avoid processParcelInfo in the future. - LLRemoteParcelInfoProcessor::getInstance()->removeObserver(params["parcel_id"].asUUID(), this); - - delete pick_panel; - pick_panel = NULL; -} - -bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept) -{ - *accept = ACCEPT_NO; - - switch (cargo_type) - { - - case DAD_LANDMARK: - case DAD_CATEGORY: - { - bool is_enabled = isActionEnabled("delete"); - - if (is_enabled) *accept = ACCEPT_YES_MULTI; - - if (is_enabled && drop) - { - onClipboardAction("delete"); - } - } - break; - default: - break; - } - - return true; -} - - -void LLLandmarksPanel::doIdle(void* landmarks_panel) -{ - LLLandmarksPanel* panel = (LLLandmarksPanel* ) landmarks_panel; - - if (panel->mDirtyFilter) - { - panel->updateFilteredAccordions(); - } - -} - -void LLLandmarksPanel::updateFilteredAccordions() -{ - LLInventoryPanel* inventory_list = NULL; - LLAccordionCtrlTab* accordion_tab = NULL; - for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) - { - accordion_tab = *iter; - inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView()); - if (NULL == inventory_list) continue; - LLFolderView* fv = inventory_list->getRootFolder(); - - bool has_visible_children = fv->hasVisibleChildren(); - - accordion_tab->setVisible(has_visible_children); - } - - // we have to arrange accordion tabs for cases when filter string is less restrictive but - // all items are still filtered. - static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion"); - accordion->arrange(); - - // now filter state is applied to accordion tabs - mDirtyFilter = false; -} - - -////////////////////////////////////////////////////////////////////////// -// HELPER FUNCTIONS -////////////////////////////////////////////////////////////////////////// -static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string) -{ - if (string == "") - { - inventory_list->setFilterSubString(LLStringUtil::null); - - // re-open folders that were initially open - inventory_list->restoreFolderState(); - } - - gInventory.startBackgroundFetch(); - - if (inventory_list->getFilterSubString().empty() && string.empty()) - { - // current filter and new filter empty, do nothing - return; - } - - // save current folder open state if no filter currently applied - if (inventory_list->getRootFolder()->getFilterSubString().empty()) - { - inventory_list->saveFolderState(); - } - - // set new filter string - inventory_list->setFilterSubString(string); -} -// EOF +/** + * @file llpanellandmarks.cpp + * @brief Landmarks tab for Side Bar "Places" panel + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpanellandmarks.h" + +#include "llbutton.h" +#include "llfloaterreg.h" +#include "llsdutil.h" +#include "llsdutil_math.h" + +#include "llaccordionctrl.h" +#include "llaccordionctrltab.h" +#include "llagent.h" +#include "llagentpicksinfo.h" +#include "llagentui.h" +#include "llcallbacklist.h" +#include "lldndbutton.h" +#include "llfloaterworldmap.h" +#include "llfolderviewitem.h" +#include "llinventorypanel.h" +#include "llinventorysubtreepanel.h" +#include "lllandmarkactions.h" +#include "llplacesinventorybridge.h" +#include "llsidetray.h" +#include "llviewermenu.h" +#include "llviewerregion.h" + +// Not yet implemented; need to remove buildPanel() from constructor when we switch +//static LLRegisterPanelClassWrapper<LLLandmarksPanel> t_landmarks("panel_landmarks"); + +static const std::string OPTIONS_BUTTON_NAME = "options_gear_btn"; +static const std::string ADD_BUTTON_NAME = "add_btn"; +static const std::string ADD_FOLDER_BUTTON_NAME = "add_folder_btn"; +static const std::string TRASH_BUTTON_NAME = "trash_btn"; + + +// helper functions +static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string); + + +LLLandmarksPanel::LLLandmarksPanel() + : LLPanelPlacesTab() + , mFavoritesInventoryPanel(NULL) + , mLandmarksInventoryPanel(NULL) + , mMyInventoryPanel(NULL) + , mLibraryInventoryPanel(NULL) + , mCurrentSelectedList(NULL) + , mListCommands(NULL) + , mGearFolderMenu(NULL) + , mGearLandmarkMenu(NULL) + , mDirtyFilter(false) +{ + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_landmarks.xml"); +} + +LLLandmarksPanel::~LLLandmarksPanel() +{ +} + +BOOL LLLandmarksPanel::postBuild() +{ + if (!gInventory.isInventoryUsable()) + return FALSE; + + // mast be called before any other initXXX methods to init Gear menu + initListCommandsHandlers(); + + U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER); + mSortByDate = sort_order & LLInventoryFilter::SO_DATE; + initFavoritesInventroyPanel(); + initLandmarksInventroyPanel(); + initMyInventroyPanel(); + initLibraryInventroyPanel(); + + gIdleCallbacks.addFunction(LLLandmarksPanel::doIdle, this); + return TRUE; +} + +// virtual +void LLLandmarksPanel::onSearchEdit(const std::string& string) +{ + static std::string prev_string(""); + + if (prev_string == string) return; + + // show all folders in Landmarks Accordion for empty filter + mLandmarksInventoryPanel->setShowFolderState(string.empty() ? + LLInventoryFilter::SHOW_ALL_FOLDERS : + LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS + ); + + filter_list(mFavoritesInventoryPanel, string); + filter_list(mLandmarksInventoryPanel, string); + filter_list(mMyInventoryPanel, string); + filter_list(mLibraryInventoryPanel, string); + + prev_string = string; + mDirtyFilter = true; + + // give FolderView a chance to be refreshed. So, made all accordions visible + for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) + { + LLAccordionCtrlTab* tab = *iter; + tab->setVisible(true); + } +} + +// virtual +void LLLandmarksPanel::onShowOnMap() +{ + if (NULL == mCurrentSelectedList) + { + llwarns << "There are no selected list. No actions are performed." << llendl; + return; + } + LLLandmark* landmark = getCurSelectedLandmark(); + if (!landmark) + return; + + LLVector3d landmark_global_pos; + if (!landmark->getGlobalPos(landmark_global_pos)) + return; + + LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); + if (!landmark_global_pos.isExactlyZero() && worldmap_instance) + { + worldmap_instance->trackLocation(landmark_global_pos); + LLFloaterReg::showInstance("world_map", "center"); + } +} + +// virtual +void LLLandmarksPanel::onTeleport() +{ + LLFolderViewItem* current_item = getCurSelectedItem(); + if (!current_item) + { + llwarns << "There are no selected list. No actions are performed." << llendl; + return; + } + + LLFolderViewEventListener* listenerp = current_item->getListener(); + if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK) + { + listenerp->openItem(); + } +} + +// virtual +void LLLandmarksPanel::updateVerbs() +{ + if (!isTabVisible()) + return; + + BOOL enabled = isLandmarkSelected(); + mTeleportBtn->setEnabled(enabled); + mShowOnMapBtn->setEnabled(enabled); + + // TODO: mantipov: Uncomment when mShareBtn is supported + // Share button should be enabled when neither a folder nor a landmark is selected + //mShareBtn->setEnabled(NULL != current_item); + + updateListCommands(); +} + +void LLLandmarksPanel::onSelectionChange(LLInventorySubTreePanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action) +{ + if (user_action && (items.size() > 0)) + { + deselectOtherThan(inventory_list); + mCurrentSelectedList = inventory_list; + } + + LLFolderViewItem* current_item = inventory_list->getRootFolder()->getCurSelectedItem(); + if (!current_item) + return; + + updateVerbs(); +} + +void LLLandmarksPanel::onSelectorButtonClicked() +{ + // TODO: mantipov: update getting of selected item + // TODO: bind to "i" button + LLFolderViewItem* cur_item = mFavoritesInventoryPanel->getRootFolder()->getCurSelectedItem(); + + LLFolderViewEventListener* listenerp = cur_item->getListener(); + if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK) + { + LLSD key; + key["type"] = "landmark"; + key["id"] = listenerp->getUUID(); + + LLSideTray::getInstance()->showPanel("panel_places", key); + } +} + +////////////////////////////////////////////////////////////////////////// +// PROTECTED METHODS +////////////////////////////////////////////////////////////////////////// + +bool LLLandmarksPanel::isLandmarkSelected() const +{ + LLFolderViewItem* current_item = getCurSelectedItem(); + if(current_item && current_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK) + { + return true; + } + + return false; +} + +bool LLLandmarksPanel::isReceivedFolderSelected() const +{ + // Received Folder can be only in Landmarks accordion + if (mCurrentSelectedList != mLandmarksInventoryPanel) return false; + + // *TODO: it should be filled with logic when EXT-976 is done. + + llwarns << "Not implemented yet until EXT-976 is done." << llendl; + + return false; +} +LLLandmark* LLLandmarksPanel::getCurSelectedLandmark() const +{ + + LLFolderViewItem* cur_item = getCurSelectedItem(); + if(cur_item && cur_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK) + { + return LLLandmarkActions::getLandmark(cur_item->getListener()->getUUID()); + } + return NULL; +} + +LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem () const +{ + return mCurrentSelectedList ? mCurrentSelectedList->getRootFolder()->getCurSelectedItem() : NULL; +} + +void LLLandmarksPanel::updateSortOrder(LLInventoryPanel* panel, bool byDate) +{ + if(!panel) return; + + U32 order = panel->getSortOrder(); + if (byDate) + { + panel->setSortOrder( order | LLInventoryFilter::SO_DATE ); + } + else + { + panel->setSortOrder( order & ~LLInventoryFilter::SO_DATE ); + } +} + +// virtual +void LLLandmarksPanel::processParcelInfo(const LLParcelData& parcel_data) +{ + //this function will be called after user will try to create a pick for selected landmark. + // We have to make request to sever to get parcel_id and snaption_id. + if(isLandmarkSelected()) + { + LLLandmark* landmark = getCurSelectedLandmark(); + LLFolderViewItem* cur_item = getCurSelectedItem(); + LLUUID id = cur_item->getListener()->getUUID(); + LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id); + if(landmark) + { + LLPanelPickEdit* panel_pick = LLPanelPickEdit::create(); + LLVector3d landmark_global_pos; + landmark->getGlobalPos(landmark_global_pos); + + // let's toggle pick panel into panel places + LLPanel* panel_places = LLSideTray::getInstance()->getChild<LLPanel>("panel_places");//-> sidebar_places + panel_places->addChild(panel_pick); + LLRect paren_rect(panel_places->getRect()); + panel_pick->reshape(paren_rect.getWidth(),paren_rect.getHeight(), TRUE); + panel_pick->setRect(paren_rect); + panel_pick->onOpen(LLSD()); + + LLPickData data; + data.pos_global = landmark_global_pos; + data.name = cur_item->getName(); + data.desc = inv_item->getDescription(); + data.snapshot_id = parcel_data.snapshot_id; + data.parcel_id = parcel_data.parcel_id; + panel_pick->setPickData(&data); + + LLSD params; + params["parcel_id"] =parcel_data.parcel_id; + /* set exit callback to get back onto panel places + in callback we will make cleaning up( delete pick_panel instance, + remove landmark panel from observer list + */ + panel_pick->setExitCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this, + panel_pick, panel_places,params)); + panel_pick->setSaveCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this, + panel_pick, panel_places,params)); + panel_pick->setCancelCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this, + panel_pick, panel_places,params)); + } + } +} + +// virtual +void LLLandmarksPanel::setParcelID(const LLUUID& parcel_id) +{ + if (!parcel_id.isNull()) + { + LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this); + LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id); + } +} + +// virtual +void LLLandmarksPanel::setErrorStatus(U32 status, const std::string& reason) +{ + llerrs<< "Can't handle remote parcel request."<< " Http Status: "<< status << ". Reason : "<< reason<<llendl; +} + + +////////////////////////////////////////////////////////////////////////// +// PRIVATE METHODS +////////////////////////////////////////////////////////////////////////// + +void LLLandmarksPanel::initFavoritesInventroyPanel() +{ + mFavoritesInventoryPanel = getChild<LLInventorySubTreePanel>("favorites_list"); + + initLandmarksPanel(mFavoritesInventoryPanel); + + initAccordion("tab_favorites", mFavoritesInventoryPanel); +} + +void LLLandmarksPanel::initLandmarksInventroyPanel() +{ + mLandmarksInventoryPanel = getChild<LLInventorySubTreePanel>("landmarks_list"); + + initLandmarksPanel(mLandmarksInventoryPanel); + + mLandmarksInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); + + // subscribe to have auto-rename functionality while creating New Folder + mLandmarksInventoryPanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mLandmarksInventoryPanel, _1, _2)); + + initAccordion("tab_landmarks", mLandmarksInventoryPanel); +} + +void LLLandmarksPanel::initMyInventroyPanel() +{ + mMyInventoryPanel= getChild<LLInventorySubTreePanel>("my_inventory_list"); + + initLandmarksPanel(mMyInventoryPanel); + + initAccordion("tab_inventory", mMyInventoryPanel); +} + +void LLLandmarksPanel::initLibraryInventroyPanel() +{ + mLibraryInventoryPanel = getChild<LLInventorySubTreePanel>("library_list"); + + initLandmarksPanel(mLibraryInventoryPanel); + + initAccordion("tab_library", mLibraryInventoryPanel); +} + +void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_list) +{ + inventory_list->setFilterTypes(0x1 << LLInventoryType::IT_LANDMARK); + inventory_list->setSelectCallback(boost::bind(&LLLandmarksPanel::onSelectionChange, this, inventory_list, _1, _2)); + + inventory_list->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + updateSortOrder(inventory_list, mSortByDate); + + LLPlacesFolderView* root_folder = dynamic_cast<LLPlacesFolderView*>(inventory_list->getRootFolder()); + if (root_folder) + { + root_folder->setupMenuHandle(LLInventoryType::IT_CATEGORY, mGearFolderMenu->getHandle()); + root_folder->setupMenuHandle(LLInventoryType::IT_LANDMARK, mGearLandmarkMenu->getHandle()); + } + + // save initial folder state to avoid incorrect work while switching between Landmarks & Teleport History tabs + // See EXT-1609. + inventory_list->saveFolderState(); +} + +void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLInventorySubTreePanel* inventory_list) +{ + LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>(accordion_tab_name); + mAccordionTabs.push_back(accordion_tab); + accordion_tab->setDropDownStateChangedCallback( + boost::bind(&LLLandmarksPanel::onAccordionExpandedCollapsed, this, _2, inventory_list)); +} + +void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLInventorySubTreePanel* inventory_list) +{ + bool expanded = param.asBoolean(); + + if(!expanded && (mCurrentSelectedList == inventory_list)) + { + inventory_list->getRootFolder()->clearSelection(); + + mCurrentSelectedList = NULL; + updateVerbs(); + } +} + +void LLLandmarksPanel::deselectOtherThan(const LLInventorySubTreePanel* inventory_list) +{ + if (inventory_list != mFavoritesInventoryPanel) + { + mFavoritesInventoryPanel->getRootFolder()->clearSelection(); + } + + if (inventory_list != mLandmarksInventoryPanel) + { + mLandmarksInventoryPanel->getRootFolder()->clearSelection(); + } + if (inventory_list != mMyInventoryPanel) + { + mMyInventoryPanel->getRootFolder()->clearSelection(); + } + if (inventory_list != mLibraryInventoryPanel) + { + mLibraryInventoryPanel->getRootFolder()->clearSelection(); + } +} + +// List Commands Handlers +void LLLandmarksPanel::initListCommandsHandlers() +{ + mListCommands = getChild<LLPanel>("bottom_panel"); + + mListCommands->childSetAction(OPTIONS_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onActionsButtonClick, this)); + mListCommands->childSetAction(TRASH_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onTrashButtonClick, this)); + mListCommands->getChild<LLButton>(ADD_BUTTON_NAME)->setHeldDownCallback(boost::bind(&LLLandmarksPanel::onAddButtonHeldDown, this)); + static const LLSD add_landmark_command("add_landmark"); + mListCommands->childSetAction(ADD_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onAddAction, this, add_landmark_command)); + + LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>(TRASH_BUTTON_NAME); + trash_btn->setDragAndDropHandler(boost::bind(&LLLandmarksPanel::handleDragAndDropToTrash, this + , _4 // BOOL drop + , _5 // EDragAndDropType cargo_type + , _7 // EAcceptance* accept + )); + + mCommitCallbackRegistrar.add("Places.LandmarksGear.Add.Action", boost::bind(&LLLandmarksPanel::onAddAction, this, _2)); + mCommitCallbackRegistrar.add("Places.LandmarksGear.CopyPaste.Action", boost::bind(&LLLandmarksPanel::onClipboardAction, this, _2)); + mCommitCallbackRegistrar.add("Places.LandmarksGear.Custom.Action", boost::bind(&LLLandmarksPanel::onCustomAction, this, _2)); + mCommitCallbackRegistrar.add("Places.LandmarksGear.Folding.Action", boost::bind(&LLLandmarksPanel::onFoldingAction, this, _2)); + mEnableCallbackRegistrar.add("Places.LandmarksGear.Check", boost::bind(&LLLandmarksPanel::isActionChecked, this, _2)); + mEnableCallbackRegistrar.add("Places.LandmarksGear.Enable", boost::bind(&LLLandmarksPanel::isActionEnabled, this, _2)); + mGearLandmarkMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_landmark.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + mGearFolderMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_folder.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_place_add_button.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +} + + +void LLLandmarksPanel::updateListCommands() +{ + bool add_folder_enabled = isActionEnabled("category"); + bool trash_enabled = isActionEnabled("delete"); + + // keep Options & Add Landmark buttons always enabled + mListCommands->childSetEnabled(ADD_FOLDER_BUTTON_NAME, add_folder_enabled); + mListCommands->childSetEnabled(TRASH_BUTTON_NAME, trash_enabled); +} + +void LLLandmarksPanel::onActionsButtonClick() +{ + LLFolderViewItem* cur_item = NULL; + if(mCurrentSelectedList) + cur_item = mCurrentSelectedList->getRootFolder()->getCurSelectedItem(); + + if(!cur_item) + return; + + LLFolderViewEventListener* listenerp = cur_item->getListener(); + + LLMenuGL* menu =NULL; + if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK) + { + menu = mGearLandmarkMenu; + } + else if (listenerp->getInventoryType() == LLInventoryType::IT_CATEGORY) + { + mGearFolderMenu->getChild<LLMenuItemCallGL>("expand")->setVisible(!cur_item->isOpen()); + mGearFolderMenu->getChild<LLMenuItemCallGL>("collapse")->setVisible(cur_item->isOpen()); + menu = mGearFolderMenu; + } + showActionMenu(menu,OPTIONS_BUTTON_NAME); +} + +void LLLandmarksPanel::onAddButtonHeldDown() +{ + showActionMenu(mMenuAdd,ADD_BUTTON_NAME); +} + +void LLLandmarksPanel::showActionMenu(LLMenuGL* menu, std::string spawning_view_name) +{ + if (menu) + { + menu->buildDrawLabels(); + menu->updateParent(LLMenuGL::sMenuContainer); + LLView* spawning_view = getChild<LLView> (spawning_view_name); + S32 menu_x, menu_y; + //show menu in co-ordinates of panel + spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this); + menu_y += menu->getRect().getHeight(); + LLMenuGL::showPopup(this, menu, menu_x, menu_y); + } +} + +void LLLandmarksPanel::onTrashButtonClick() const +{ + onClipboardAction("delete"); +} + +void LLLandmarksPanel::onAddAction(const LLSD& userdata) const +{ + std::string command_name = userdata.asString(); + if("add_landmark" == command_name) + { + if(LLLandmarkActions::landmarkAlreadyExists()) + { + std::string location; + LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_FULL); + llwarns<<" Landmark already exists at location: "<< location<<llendl; + return; + } + LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); + } + else if ("category" == command_name) + { + LLFolderViewItem* item = getCurSelectedItem(); + if (item && mCurrentSelectedList == mLandmarksInventoryPanel) + { + LLFolderViewEventListener* folder_bridge = NULL; + if (item-> getListener()->getInventoryType() + == LLInventoryType::IT_LANDMARK) + { + // for a landmark get parent folder bridge + folder_bridge = item->getParentFolder()->getListener(); + } + else if (item-> getListener()->getInventoryType() + == LLInventoryType::IT_CATEGORY) + { + // for a folder get its own bridge + folder_bridge = item->getListener(); + } + + menu_create_inventory_item(mCurrentSelectedList->getRootFolder(), + dynamic_cast<LLFolderBridge*> (folder_bridge), LLSD( + "category"), gInventory.findCategoryUUIDForType( + LLAssetType::AT_LANDMARK)); + } + } +} + +void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const +{ + if(!mCurrentSelectedList) + return; + std::string command_name = userdata.asString(); + if("copy_slurl" == command_name) + { + LLFolderViewItem* cur_item = getCurSelectedItem(); + if(cur_item) + LLLandmarkActions::copySLURLtoClipboard(cur_item->getListener()->getUUID()); + } + else if ( "paste" == command_name) + { + mCurrentSelectedList->getRootFolder()->paste(); + } + else if ( "cut" == command_name) + { + mCurrentSelectedList->getRootFolder()->cut(); + } + else + { + mCurrentSelectedList->getRootFolder()->doToSelected(mCurrentSelectedList->getModel(),command_name); + } +} + +void LLLandmarksPanel::onFoldingAction(const LLSD& userdata) +{ + if(!mCurrentSelectedList) return; + + LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); + std::string command_name = userdata.asString(); + + if ("expand_all" == command_name) + { + root_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); + root_folder->arrangeAll(); + } + else if ("collapse_all" == command_name) + { + root_folder->closeAllFolders(); + } + else if ( "sort_by_date" == command_name) + { + mSortByDate = !mSortByDate; + updateSortOrder(mLandmarksInventoryPanel, mSortByDate); + updateSortOrder(mMyInventoryPanel, mSortByDate); + updateSortOrder(mLibraryInventoryPanel, mSortByDate); + } + else + { + root_folder->doToSelected(&gInventory, userdata); + } +} + +bool LLLandmarksPanel::isActionChecked(const LLSD& userdata) const +{ + const std::string command_name = userdata.asString(); + + if ( "sort_by_date" == command_name) + { + return mSortByDate; + } + + return false; +} + +bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const +{ + std::string command_name = userdata.asString(); + + + LLPlacesFolderView* rootFolderView = mCurrentSelectedList ? + static_cast<LLPlacesFolderView*>(mCurrentSelectedList->getRootFolder()) : NULL; + + if (NULL == rootFolderView) return false; + + // disable some commands for multi-selection. EXT-1757 + if (rootFolderView->getSelectedCount() > 1) + { + if ( "teleport" == command_name + || "more_info" == command_name + || "rename" == command_name + || "show_on_map" == command_name + || "copy_slurl" == command_name + ) + { + return false; + } + + } + + // disable some commands for Favorites accordion. EXT-1758 + if (mCurrentSelectedList == mFavoritesInventoryPanel) + { + if ( "expand_all" == command_name + || "collapse_all" == command_name + || "sort_by_date" == command_name + ) + return false; + } + + + if("category" == command_name) + { + // we can add folder only in Landmarks Accordion + if (mCurrentSelectedList == mLandmarksInventoryPanel) + { + // ... but except Received folder + return !isReceivedFolderSelected(); + } + else return false; + } + else if("paste" == command_name || "rename" == command_name || "cut" == command_name || "delete" == command_name) + { + return canSelectedBeModified(command_name); + } + else if ( "sort_by_date" == command_name) + { + return mSortByDate; + } + else if("create_pick" == command_name) + { + return !LLAgentPicksInfo::getInstance()->isPickLimitReached(); + } + else + { + llwarns << "Unprocessed command has come: " << command_name << llendl; + } + + return true; +} + +void LLLandmarksPanel::onCustomAction(const LLSD& userdata) +{ + LLFolderViewItem* cur_item = getCurSelectedItem(); + if(!cur_item) + return ; + std::string command_name = userdata.asString(); + if("more_info" == command_name) + { + cur_item->getListener()->performAction(mCurrentSelectedList->getRootFolder(),mCurrentSelectedList->getModel(),"about"); + } + else if ("teleport" == command_name) + { + onTeleport(); + } + else if ("show_on_map" == command_name) + { + onShowOnMap(); + } + else if ("create_pick" == command_name) + { + LLLandmark* landmark = getCurSelectedLandmark(); + if(!landmark) return; + + LLViewerRegion* region = gAgent.getRegion(); + if (!region) return; + + LLGlobalVec pos_global; + LLUUID region_id; + landmark->getGlobalPos(pos_global); + landmark->getRegionID(region_id); + LLVector3 region_pos((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), + (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), + (F32)pos_global.mdV[VZ]); + + LLSD body; + std::string url = region->getCapability("RemoteParcelRequest"); + if (!url.empty()) + { + body["location"] = ll_sd_from_vector3(region_pos); + if (!region_id.isNull()) + { + body["region_id"] = region_id; + } + if (!pos_global.isExactlyZero()) + { + U64 region_handle = to_region_handle(pos_global); + body["region_handle"] = ll_sd_from_U64(region_handle); + } + LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle())); + } + else + { + llwarns << "Can't create pick for landmark for region" << region_id + << ". Region: " << region->getName() + << " does not support RemoteParcelRequest" << llendl; + } + } +} + +/* +Processes such actions: cut/rename/delete/paste actions + +Rules: + 1. We can't perform any action in Library + 2. For Landmarks we can: + - cut/rename/delete in any other accordions + - paste - only in Favorites, Landmarks accordions + 3. For Folders we can: perform any action in Landmarks accordion, except Received folder + 4. We can not paste folders from Clipboard (processed by LLFolderView::canPaste()) + 5. Check LLFolderView/Inventory Bridges rules + */ +bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) const +{ + // validate own rules first + + // nothing can be modified in Library + if (mLibraryInventoryPanel == mCurrentSelectedList) return false; + + bool can_be_modified = false; + + // landmarks can be modified in any other accordion... + if (isLandmarkSelected()) + { + can_be_modified = true; + + // we can modify landmarks anywhere except paste to My Inventory + if ("paste" == command_name) + { + can_be_modified = (mCurrentSelectedList != mMyInventoryPanel); + } + } + else + { + // ...folders only in the Landmarks accordion... + can_be_modified = mLandmarksInventoryPanel == mCurrentSelectedList; + + // ...except "Received" folder + can_be_modified &= !isReceivedFolderSelected(); + } + + // then ask LLFolderView permissions + if (can_be_modified) + { + if ("cut" == command_name) + { + can_be_modified = mCurrentSelectedList->getRootFolder()->canCut(); + } + else if ("rename" == command_name) + { + can_be_modified = getCurSelectedItem()->getListener()->isItemRenameable(); + } + else if ("delete" == command_name) + { + can_be_modified = getCurSelectedItem()->getListener()->isItemRemovable(); + } + else if("paste" == command_name) + { + return mCurrentSelectedList->getRootFolder()->canPaste(); + } + else + { + llwarns << "Unprocessed command has come: " << command_name << llendl; + } + } + + return can_be_modified; +} + +void LLLandmarksPanel::onPickPanelExit( LLPanelPickEdit* pick_panel, LLView* owner, const LLSD& params) +{ + pick_panel->setVisible(FALSE); + owner->removeChild(pick_panel); + //we need remove observer to avoid processParcelInfo in the future. + LLRemoteParcelInfoProcessor::getInstance()->removeObserver(params["parcel_id"].asUUID(), this); + + delete pick_panel; + pick_panel = NULL; +} + +bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept) +{ + *accept = ACCEPT_NO; + + switch (cargo_type) + { + + case DAD_LANDMARK: + case DAD_CATEGORY: + { + bool is_enabled = isActionEnabled("delete"); + + if (is_enabled) *accept = ACCEPT_YES_MULTI; + + if (is_enabled && drop) + { + onClipboardAction("delete"); + } + } + break; + default: + break; + } + + return true; +} + + +void LLLandmarksPanel::doIdle(void* landmarks_panel) +{ + LLLandmarksPanel* panel = (LLLandmarksPanel* ) landmarks_panel; + + if (panel->mDirtyFilter) + { + panel->updateFilteredAccordions(); + } + +} + +void LLLandmarksPanel::updateFilteredAccordions() +{ + LLInventoryPanel* inventory_list = NULL; + LLAccordionCtrlTab* accordion_tab = NULL; + for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter) + { + accordion_tab = *iter; + inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView()); + if (NULL == inventory_list) continue; + LLFolderView* fv = inventory_list->getRootFolder(); + + bool has_visible_children = fv->hasVisibleChildren(); + + accordion_tab->setVisible(has_visible_children); + } + + // we have to arrange accordion tabs for cases when filter string is less restrictive but + // all items are still filtered. + static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion"); + accordion->arrange(); + + // now filter state is applied to accordion tabs + mDirtyFilter = false; +} + + +////////////////////////////////////////////////////////////////////////// +// HELPER FUNCTIONS +////////////////////////////////////////////////////////////////////////// +static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string) +{ + if (string == "") + { + inventory_list->setFilterSubString(LLStringUtil::null); + + // re-open folders that were initially open + inventory_list->restoreFolderState(); + } + + gInventory.startBackgroundFetch(); + + if (inventory_list->getFilterSubString().empty() && string.empty()) + { + // current filter and new filter empty, do nothing + return; + } + + // save current folder open state if no filter currently applied + if (inventory_list->getRootFolder()->getFilterSubString().empty()) + { + inventory_list->saveFolderState(); + } + + // set new filter string + inventory_list->setFilterSubString(string); +} +// EOF diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp new file mode 100644 index 00000000000..ca567018e7a --- /dev/null +++ b/indra/newview/llpanelmaininventory.cpp @@ -0,0 +1,818 @@ +/** + * @file llsidepanelmaininventory.cpp + * @brief Implementation of llsidepanelmaininventory. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llpanelmaininventory.h" + +#include "llfloaterinventory.h" +#include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llinventorypanel.h" +#include "llfiltereditor.h" +#include "llfloaterreg.h" +#include "llscrollcontainer.h" +#include "llsdserialize.h" +#include "llspinctrl.h" +#include "lltooldraganddrop.h" + +static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); // Seraph is this redundant with constructor? + +///---------------------------------------------------------------------------- +/// LLFloaterInventoryFinder +///---------------------------------------------------------------------------- + +class LLFloaterInventoryFinder : public LLFloater +{ +public: + LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view); + virtual void draw(); + /*virtual*/ BOOL postBuild(); + void changeFilter(LLInventoryFilter* filter); + void updateElementsFromFilter(); + BOOL getCheckShowEmpty(); + BOOL getCheckSinceLogoff(); + + static void onTimeAgo(LLUICtrl*, void *); + static void onCheckSinceLogoff(LLUICtrl*, void *); + static void onCloseBtn(void* user_data); + static void selectAllTypes(void* user_data); + static void selectNoTypes(void* user_data); +private: + LLPanelMainInventory* mPanelInventoryDecorated; + LLSpinCtrl* mSpinSinceDays; + LLSpinCtrl* mSpinSinceHours; + LLInventoryFilter* mFilter; +}; + +///---------------------------------------------------------------------------- +/// LLPanelMainInventory +///---------------------------------------------------------------------------- + +LLPanelMainInventory::LLPanelMainInventory() + : LLPanel() +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT); + // Menu Callbacks (non contex menus) + mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2)); + mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); + mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2)); + mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this)); + mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this)); + mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this)); + mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2)); + + // Controls + // *TODO: Just use persistant settings for each of these + U32 sort_order = gSavedSettings.getU32("InventorySortOrder"); + BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE ); + BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME ); + BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ); + + gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE); + gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE); + gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE); + gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE); + + mSavedFolderState = new LLSaveFolderState(); + mSavedFolderState->setApply(FALSE); +} + +BOOL LLPanelMainInventory::postBuild() +{ + gInventory.addObserver(this); + + mFilterTabs = getChild<LLTabContainer>("inventory filter tabs"); + mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this)); + + //panel->getFilter()->markDefault(); + + // Set up the default inv. panel/filter settings. + mActivePanel = getChild<LLInventoryPanel>("All Items"); + if (mActivePanel) + { + // "All Items" is the previous only view, so it gets the InventorySortOrder + mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder")); + mActivePanel->getFilter()->markDefault(); + mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + mActivePanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mActivePanel, _1, _2)); + } + LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); + if (recent_items_panel) + { + recent_items_panel->setSinceLogoff(TRUE); + recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE); + recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + recent_items_panel->getFilter()->markDefault(); + recent_items_panel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, recent_items_panel, _1, _2)); + } + + // Now load the stored settings from disk, if available. + std::ostringstream filterSaveName; + filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); + llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName << llendl; + llifstream file(filterSaveName.str()); + LLSD savedFilterState; + if (file.is_open()) + { + LLSDSerialize::fromXML(savedFilterState, file); + file.close(); + + // Load the persistent "Recent Items" settings. + // Note that the "All Items" settings do not persist. + if(recent_items_panel) + { + if(savedFilterState.has(recent_items_panel->getFilter()->getName())) + { + LLSD recent_items = savedFilterState.get( + recent_items_panel->getFilter()->getName()); + recent_items_panel->getFilter()->fromLLSD(recent_items); + } + } + + } + + + mFilterEditor = getChild<LLFilterEditor>("inventory search editor"); + if (mFilterEditor) + { + mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2)); + } + + // *TODO:Get the cost info from the server + const std::string upload_cost("10"); + childSetLabelArg("Upload Image", "[COST]", upload_cost); + childSetLabelArg("Upload Sound", "[COST]", upload_cost); + childSetLabelArg("Upload Animation", "[COST]", upload_cost); + childSetLabelArg("Bulk Upload", "[COST]", upload_cost); + + return TRUE; +} + +// Destroys the object +LLPanelMainInventory::~LLPanelMainInventory( void ) +{ + // Save the filters state. + LLSD filterRoot; + LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items"); + if (all_items_panel) + { + LLInventoryFilter* filter = all_items_panel->getFilter(); + if (filter) + { + LLSD filterState; + filter->toLLSD(filterState); + filterRoot[filter->getName()] = filterState; + } + } + + LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); + if (recent_items_panel) + { + LLInventoryFilter* filter = recent_items_panel->getFilter(); + if (filter) + { + LLSD filterState; + filter->toLLSD(filterState); + filterRoot[filter->getName()] = filterState; + } + } + + std::ostringstream filterSaveName; + filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); + llofstream filtersFile(filterSaveName.str()); + if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile)) + { + llwarns << "Could not write to filters save file " << filterSaveName << llendl; + } + else + filtersFile.close(); + + gInventory.removeObserver(this); + delete mSavedFolderState; +} + +void LLPanelMainInventory::startSearch() +{ + // this forces focus to line editor portion of search editor + if (mFilterEditor) + { + mFilterEditor->focusFirstItem(TRUE); + } +} + +BOOL LLPanelMainInventory::handleKeyHere(KEY key, MASK mask) +{ + LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL; + if (root_folder) + { + // first check for user accepting current search results + if (mFilterEditor + && mFilterEditor->hasFocus() + && (key == KEY_RETURN + || key == KEY_DOWN) + && mask == MASK_NONE) + { + // move focus to inventory proper + mActivePanel->setFocus(TRUE); + root_folder->scrollToShowSelection(); + return TRUE; + } + + if (mActivePanel->hasFocus() && key == KEY_UP) + { + startSearch(); + } + } + + return LLPanel::handleKeyHere(key, mask); + +} + +//---------------------------------------------------------------------------- +// menu callbacks + +void LLPanelMainInventory::doToSelected(const LLSD& userdata) +{ + getPanel()->getRootFolder()->doToSelected(&gInventory, userdata); +} + +void LLPanelMainInventory::closeAllFolders() +{ + getPanel()->getRootFolder()->closeAllFolders(); +} + +void LLPanelMainInventory::newWindow() +{ + LLFloaterInventory::showAgentInventory(); +} + +void LLPanelMainInventory::doCreate(const LLSD& userdata) +{ + menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata); +} + +void LLPanelMainInventory::resetFilters() +{ + LLFloaterInventoryFinder *finder = getFinder(); + getActivePanel()->getFilter()->resetDefault(); + if (finder) + { + finder->updateElementsFromFilter(); + } + + setFilterTextFromFilter(); +} + +void LLPanelMainInventory::setSortBy(const LLSD& userdata) +{ + std::string sort_field = userdata.asString(); + if (sort_field == "name") + { + U32 order = getActivePanel()->getSortOrder(); + getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE ); + + gSavedSettings.setBOOL("Inventory.SortByName", TRUE ); + gSavedSettings.setBOOL("Inventory.SortByDate", FALSE ); + } + else if (sort_field == "date") + { + U32 order = getActivePanel()->getSortOrder(); + getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE ); + + gSavedSettings.setBOOL("Inventory.SortByName", FALSE ); + gSavedSettings.setBOOL("Inventory.SortByDate", TRUE ); + } + else if (sort_field == "foldersalwaysbyname") + { + U32 order = getActivePanel()->getSortOrder(); + if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME ) + { + order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME; + + gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE ); + } + else + { + order |= LLInventoryFilter::SO_FOLDERS_BY_NAME; + + gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE ); + } + getActivePanel()->setSortOrder( order ); + } + else if (sort_field == "systemfolderstotop") + { + U32 order = getActivePanel()->getSortOrder(); + if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ) + { + order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; + + gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE ); + } + else + { + order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; + + gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE ); + } + getActivePanel()->setSortOrder( order ); + } +} + +// static +BOOL LLPanelMainInventory::filtersVisible(void* user_data) +{ + LLPanelMainInventory* self = (LLPanelMainInventory*)user_data; + if(!self) return FALSE; + + return self->getFinder() != NULL; +} + +void LLPanelMainInventory::onClearSearch() +{ + LLFloater *finder = getFinder(); + if (mActivePanel) + { + mActivePanel->setFilterSubString(LLStringUtil::null); + mActivePanel->setFilterTypes(0xffffffff); + } + + if (finder) + { + LLFloaterInventoryFinder::selectAllTypes(finder); + } + + // re-open folders that were initially open + if (mActivePanel) + { + mSavedFolderState->setApply(TRUE); + mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + LLOpenFoldersWithSelection opener; + mActivePanel->getRootFolder()->applyFunctorRecursively(opener); + mActivePanel->getRootFolder()->scrollToShowSelection(); + } +} + +void LLPanelMainInventory::onFilterEdit(const std::string& search_string ) +{ + if (search_string == "") + { + onClearSearch(); + } + if (!mActivePanel) + { + return; + } + + gInventory.startBackgroundFetch(); + + std::string uppercase_search_string = search_string; + LLStringUtil::toUpper(uppercase_search_string); + if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty()) + { + // current filter and new filter empty, do nothing + return; + } + + // save current folder open state if no filter currently applied + if (!mActivePanel->getRootFolder()->isFilterModified()) + { + mSavedFolderState->setApply(FALSE); + mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + } + + // set new filter string + mActivePanel->setFilterSubString(uppercase_search_string); +} + + + //static + BOOL LLPanelMainInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward) + { + LLPanelMainInventory* active_view = NULL; + + LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory"); + for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) + { + LLPanelMainInventory* iv = dynamic_cast<LLPanelMainInventory*>(*iter); + if (iv) + { + if (gFocusMgr.childHasKeyboardFocus(iv)) + { + active_view = iv; + break; + } + } + } + + if (!active_view) + { + return FALSE; + } + + std::string search_string(find_text); + + if (search_string.empty()) + { + return FALSE; + } + + if (active_view->getPanel() && + active_view->getPanel()->getRootFolder()->search(first_item, search_string, backward)) + { + return TRUE; + } + + return FALSE; + } + +void LLPanelMainInventory::onFilterSelected() +{ + // Find my index + mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs"); + + if (!mActivePanel) + { + return; + } + LLInventoryFilter* filter = mActivePanel->getFilter(); + LLFloaterInventoryFinder *finder = getFinder(); + if (finder) + { + finder->changeFilter(filter); + } + if (filter->isActive()) + { + // If our filter is active we may be the first thing requiring a fetch so we better start it here. + gInventory.startBackgroundFetch(); + } + setFilterTextFromFilter(); +} + +const std::string LLPanelMainInventory::getFilterSubString() +{ + return mActivePanel->getFilterSubString(); +} + +void LLPanelMainInventory::setFilterSubString(const std::string& string) +{ + mActivePanel->setFilterSubString(string); +} + +BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg) +{ + // Check to see if we are auto scrolling from the last frame + LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel(); + BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y); + if(mFilterTabs) + { + if(needsToScroll) + { + mFilterTabs->startDragAndDropDelayTimer(); + } + } + + BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); + + return handled; +} + +void LLPanelMainInventory::changed(U32 mask) +{ +} + + +void LLPanelMainInventory::setFilterTextFromFilter() +{ + mFilterText = mActivePanel->getFilter()->getFilterText(); +} + +void LLPanelMainInventory::toggleFindOptions() +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE); + LLFloater *floater = getFinder(); + if (!floater) + { + LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this); + mFinderHandle = finder->getHandle(); + finder->openFloater(); + + LLFloater* parent_floater = gFloaterView->getParentFloater(this); + if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel + parent_floater->addDependentFloater(mFinderHandle); + // start background fetch of folders + gInventory.startBackgroundFetch(); + } + else + { + floater->closeFloater(); + } +} + +void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb) +{ + getChild<LLInventoryPanel>("All Items")->setSelectCallback(cb); + getChild<LLInventoryPanel>("Recent Items")->setSelectCallback(cb); +} + +///---------------------------------------------------------------------------- +/// LLFloaterInventoryFinder +///---------------------------------------------------------------------------- + +LLFloaterInventoryFinder* LLPanelMainInventory::getFinder() +{ + return (LLFloaterInventoryFinder*)mFinderHandle.get(); +} + + +LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) : + LLFloater(LLSD()), + mPanelInventoryDecorated(inventory_view), + mFilter(inventory_view->getPanel()->getFilter()) +{ + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL); + updateElementsFromFilter(); +} + + +void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data) +{ + LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; + if (!self) return; + + bool since_logoff= self->childGetValue("check_since_logoff"); + + if (!since_logoff && + !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) ) + { + self->mSpinSinceHours->set(1.0f); + } +} +BOOL LLFloaterInventoryFinder::postBuild() +{ + const LLRect& viewrect = mPanelInventoryDecorated->getRect(); + setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight())); + + childSetAction("All", selectAllTypes, this); + childSetAction("None", selectNoTypes, this); + + mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago"); + childSetCommitCallback("spin_hours_ago", onTimeAgo, this); + + mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago"); + childSetCommitCallback("spin_days_ago", onTimeAgo, this); + + // mCheckSinceLogoff = getChild<LLSpinCtrl>("check_since_logoff"); + childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this); + + childSetAction("Close", onCloseBtn, this); + + updateElementsFromFilter(); + return TRUE; +} +void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data) +{ + LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; + if (!self) return; + + bool since_logoff=true; + if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) + { + since_logoff = false; + } + self->childSetValue("check_since_logoff", since_logoff); +} + +void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter) +{ + mFilter = filter; + updateElementsFromFilter(); +} + +void LLFloaterInventoryFinder::updateElementsFromFilter() +{ + if (!mFilter) + return; + + // Get data needed for filter display + U32 filter_types = mFilter->getFilterTypes(); + std::string filter_string = mFilter->getFilterSubString(); + LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState(); + U32 hours = mFilter->getHoursAgo(); + + // update the ui elements + setTitle(mFilter->getName()); + + childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION)); + + childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD)); + childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE)); + childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE)); + childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK)); + childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD)); + childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT)); + childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL)); + childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND)); + childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE)); + childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT)); + childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS); + childSetValue("check_since_logoff", mFilter->isSinceLogoff()); + mSpinSinceHours->set((F32)(hours % 24)); + mSpinSinceDays->set((F32)(hours / 24)); +} + +void LLFloaterInventoryFinder::draw() +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW); + U32 filter = 0xffffffff; + BOOL filtered_by_all_types = TRUE; + + if (!childGetValue("check_animation")) + { + filter &= ~(0x1 << LLInventoryType::IT_ANIMATION); + filtered_by_all_types = FALSE; + } + + + if (!childGetValue("check_calling_card")) + { + filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_clothing")) + { + filter &= ~(0x1 << LLInventoryType::IT_WEARABLE); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_gesture")) + { + filter &= ~(0x1 << LLInventoryType::IT_GESTURE); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_landmark")) + + + { + filter &= ~(0x1 << LLInventoryType::IT_LANDMARK); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_notecard")) + { + filter &= ~(0x1 << LLInventoryType::IT_NOTECARD); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_object")) + { + filter &= ~(0x1 << LLInventoryType::IT_OBJECT); + filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_script")) + { + filter &= ~(0x1 << LLInventoryType::IT_LSL); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_sound")) + { + filter &= ~(0x1 << LLInventoryType::IT_SOUND); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_texture")) + { + filter &= ~(0x1 << LLInventoryType::IT_TEXTURE); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_snapshot")) + { + filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT); + filtered_by_all_types = FALSE; + } + + if (!filtered_by_all_types) + { + // don't include folders in filter, unless I've selected everything + filter &= ~(0x1 << LLInventoryType::IT_CATEGORY); + } + + // update the panel, panel will update the filter + mPanelInventoryDecorated->getPanel()->setShowFolderState(getCheckShowEmpty() ? + LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + mPanelInventoryDecorated->getPanel()->setFilterTypes(filter); + if (getCheckSinceLogoff()) + { + mSpinSinceDays->set(0); + mSpinSinceHours->set(0); + } + U32 days = (U32)mSpinSinceDays->get(); + U32 hours = (U32)mSpinSinceHours->get(); + if (hours > 24) + { + days += hours / 24; + hours = (U32)hours % 24; + mSpinSinceDays->set((F32)days); + mSpinSinceHours->set((F32)hours); + } + hours += days * 24; + mPanelInventoryDecorated->getPanel()->setHoursAgo(hours); + mPanelInventoryDecorated->getPanel()->setSinceLogoff(getCheckSinceLogoff()); + mPanelInventoryDecorated->setFilterTextFromFilter(); + + LLPanel::draw(); +} + +BOOL LLFloaterInventoryFinder::getCheckShowEmpty() +{ + return childGetValue("check_show_empty"); +} + +BOOL LLFloaterInventoryFinder::getCheckSinceLogoff() +{ + return childGetValue("check_since_logoff"); +} + +void LLFloaterInventoryFinder::onCloseBtn(void* user_data) +{ + LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data; + finderp->closeFloater(); +} + +// static +void LLFloaterInventoryFinder::selectAllTypes(void* user_data) +{ + LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; + if(!self) return; + + self->childSetValue("check_animation", TRUE); + self->childSetValue("check_calling_card", TRUE); + self->childSetValue("check_clothing", TRUE); + self->childSetValue("check_gesture", TRUE); + self->childSetValue("check_landmark", TRUE); + self->childSetValue("check_notecard", TRUE); + self->childSetValue("check_object", TRUE); + self->childSetValue("check_script", TRUE); + self->childSetValue("check_sound", TRUE); + self->childSetValue("check_texture", TRUE); + self->childSetValue("check_snapshot", TRUE); +} + +//static +void LLFloaterInventoryFinder::selectNoTypes(void* user_data) +{ + LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; + if(!self) return; + + self->childSetValue("check_animation", FALSE); + self->childSetValue("check_calling_card", FALSE); + self->childSetValue("check_clothing", FALSE); + self->childSetValue("check_gesture", FALSE); + self->childSetValue("check_landmark", FALSE); + self->childSetValue("check_notecard", FALSE); + self->childSetValue("check_object", FALSE); + self->childSetValue("check_script", FALSE); + self->childSetValue("check_sound", FALSE); + self->childSetValue("check_texture", FALSE); + self->childSetValue("check_snapshot", FALSE); +} diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h new file mode 100644 index 00000000000..75526a3c98f --- /dev/null +++ b/indra/newview/llpanelmaininventory.h @@ -0,0 +1,125 @@ +/** + * @file llpanelmaininventory.h + * @brief llpanelmaininventory.h + * class definition + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELMAININVENTORY_H +#define LL_LLPANELMAININVENTORY_H + +#include "llpanel.h" +#include "llinventorymodel.h" +#include "llfolderview.h" + +class LLFolderViewItem; +class LLInventoryPanel; +class LLSaveFolderState; +class LLFilterEditor; +class LLTabContainer; +class LLFloaterInventoryFinder; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLPanelMainInventory +// +// This is a panel used to view and control an agent's inventory, +// including all the fixin's (e.g. AllItems/RecentItems tabs, filter floaters). +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLPanelMainInventory : public LLPanel, LLInventoryObserver +{ +public: + friend class LLFloaterInventoryFinder; + + LLPanelMainInventory(); + ~LLPanelMainInventory(); + + BOOL postBuild(); + + virtual BOOL handleKeyHere(KEY key, MASK mask); + + // Inherited functionality + /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg); + /*virtual*/ void changed(U32 mask); + + LLInventoryPanel* getPanel() { return mActivePanel; } + LLInventoryPanel* getActivePanel() { return mActivePanel; } + + const std::string& getFilterText() const { return mFilterText; } + + void setSelectCallback(const LLFolderView::signal_t::slot_type& cb); + +protected: + // + // Misc functions + // + void setFilterTextFromFilter(); + void startSearch(); + + void toggleFindOptions(); + + static BOOL filtersVisible(void* user_data); + void onClearSearch(); + static void onFoldersByName(void *user_data); + static BOOL checkFoldersByName(void *user_data); + void onFilterEdit(const std::string& search_string ); + static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward); + void onFilterSelected(); + + const std::string getFilterSubString(); + void setFilterSubString(const std::string& string); + + // menu callbacks + void doToSelected(const LLSD& userdata); + void closeAllFolders(); + void newWindow(); + void doCreate(const LLSD& userdata); + void resetFilters(); + void setSortBy(const LLSD& userdata); + +private: + LLFloaterInventoryFinder* getFinder(); + + LLFilterEditor* mFilterEditor; + LLTabContainer* mFilterTabs; + LLHandle<LLFloater> mFinderHandle; + LLInventoryPanel* mActivePanel; + LLSaveFolderState* mSavedFolderState; + + std::string mFilterText; +}; + +#endif // LL_LLPANELMAININVENTORY_H + + + diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h index 1ab4ff581ee..58d9fe9b76e 100644 --- a/indra/newview/llpanelobject.h +++ b/indra/newview/llpanelobject.h @@ -45,7 +45,6 @@ class LLUICtrl; class LLButton; class LLViewerObject; class LLComboBox; -class LLPanelInventory; class LLColorSwatchCtrl; class LLTextureCtrl; class LLInventoryItem; diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp new file mode 100644 index 00000000000..365a6e632fa --- /dev/null +++ b/indra/newview/llpanelobjectinventory.cpp @@ -0,0 +1,1905 @@ +/** + * @file llsidepanelinventory.cpp + * @brief LLPanelObjectInventory class implementation + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +//***************************************************************************** +// +// Implementation of the panel inventory - used to view and control a +// task's inventory. +// +//***************************************************************************** + +#include "llviewerprecompiledheaders.h" + +#include "llpanelobjectinventory.h" + +#include "roles_constants.h" + +#include "llagent.h" +#include "llcallbacklist.h" +#include "llfloaterbuycurrency.h" +#include "llfloaterreg.h" +#include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llpreviewanim.h" +#include "llpreviewgesture.h" +#include "llpreviewnotecard.h" +#include "llpreviewscript.h" +#include "llpreviewsound.h" +#include "llpreviewtexture.h" +#include "llscrollcontainer.h" +#include "llselectmgr.h" +#include "llstatusbar.h" +#include "lltrans.h" +#include "llviewerregion.h" +#include "llviewerobjectlist.h" +#include "llviewermessage.h" + + +///---------------------------------------------------------------------------- +/// Class LLTaskInvFVBridge +///---------------------------------------------------------------------------- + +class LLTaskInvFVBridge : public LLFolderViewEventListener +{ +protected: + LLUUID mUUID; + std::string mName; + mutable std::string mDisplayName; + LLPanelObjectInventory* mPanel; + U32 mFlags; + + LLInventoryItem* findItem() const; + +public: + LLTaskInvFVBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + U32 flags=0); + virtual ~LLTaskInvFVBridge( void ) {} + + virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; } + virtual std::string getLabelSuffix() const { return LLStringUtil::null; } + + static LLTaskInvFVBridge* createObjectBridge(LLPanelObjectInventory* panel, + LLInventoryObject* object); + void showProperties(); + void buyItem(); + S32 getPrice(); + static bool commitBuyItem(const LLSD& notification, const LLSD& response); + + // LLFolderViewEventListener functionality + virtual const std::string& getName() const; + virtual const std::string& getDisplayName() const; + virtual PermissionMask getPermissionMask() const { return PERM_NONE; } + /*virtual*/ LLAssetType::EType getPreferredType() const { return LLAssetType::AT_NONE; } + virtual const LLUUID& getUUID() const { return mUUID; } + virtual time_t getCreationDate() const; + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); + virtual void closeItem() {} + virtual void previewItem(); + virtual void selectItem() {} + virtual BOOL isItemRenameable() const; + virtual BOOL renameItem(const std::string& new_name); + virtual BOOL isItemMovable() const; + virtual BOOL isItemRemovable(); + virtual BOOL removeItem(); + virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch); + virtual void move(LLFolderViewEventListener* parent_listener); + virtual BOOL isItemCopyable() const; + virtual BOOL copyToClipboard() const; + virtual void cutToClipboard(); + virtual BOOL isClipboardPasteable() const; + virtual void pasteFromClipboard(); + virtual void pasteLinkFromClipboard(); + virtual void buildContextMenu(LLMenuGL& menu, U32 flags); + virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + virtual BOOL isUpToDate() const { return TRUE; } + virtual BOOL hasChildren() const { return FALSE; } + virtual LLInventoryType::EType getInventoryType() const { return LLInventoryType::IT_NONE; } + // LLDragAndDropBridge functionality + virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; + virtual BOOL dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data); +}; + +LLTaskInvFVBridge::LLTaskInvFVBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + U32 flags): + mUUID(uuid), + mName(name), + mPanel(panel), + mFlags(flags) +{ + +} + +LLInventoryItem* LLTaskInvFVBridge::findItem() const +{ + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + return (LLInventoryItem*)(object->getInventoryObject(mUUID)); + } + return NULL; +} + +void LLTaskInvFVBridge::showProperties() +{ + LLFloaterProperties* floater = LLFloaterReg::showTypedInstance<LLFloaterProperties>("properties", mUUID); + if (floater) + { + floater->setObjectID(mPanel->getTaskUUID()); + } +} + +struct LLBuyInvItemData +{ + LLUUID mTaskID; + LLUUID mItemID; + LLAssetType::EType mType; + + LLBuyInvItemData(const LLUUID& task, + const LLUUID& item, + LLAssetType::EType type) : + mTaskID(task), mItemID(item), mType(type) + {} +}; + +void LLTaskInvFVBridge::buyItem() +{ + llinfos << "LLTaskInvFVBridge::buyItem()" << llendl; + LLInventoryItem* item = findItem(); + if(!item || !item->getSaleInfo().isForSale()) return; + LLBuyInvItemData* inv = new LLBuyInvItemData(mPanel->getTaskUUID(), + mUUID, + item->getType()); + + const LLSaleInfo& sale_info = item->getSaleInfo(); + const LLPermissions& perm = item->getPermissions(); + const std::string owner_name; // no owner name currently... FIXME? + + LLViewerObject* obj; + if( ( obj = gObjectList.findObject( mPanel->getTaskUUID() ) ) && obj->isAttachment() ) + { + LLNotifications::instance().add("Cannot_Purchase_an_Attachment"); + llinfos << "Attempt to purchase an attachment" << llendl; + delete inv; + } + else + { + LLSD args; + args["PRICE"] = llformat("%d",sale_info.getSalePrice()); + args["OWNER"] = owner_name; + if (sale_info.getSaleType() != LLSaleInfo::FS_CONTENTS) + { + U32 next_owner_mask = perm.getMaskNextOwner(); + args["MODIFYPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo"); + args["COPYPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo"); + args["RESELLPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo"); + } + + std::string alertdesc; + switch(sale_info.getSaleType()) + { + case LLSaleInfo::FS_ORIGINAL: + alertdesc = owner_name.empty() ? "BuyOriginalNoOwner" : "BuyOriginal"; + break; + case LLSaleInfo::FS_CONTENTS: + alertdesc = owner_name.empty() ? "BuyContentsNoOwner" : "BuyContents"; + break; + case LLSaleInfo::FS_COPY: + default: + alertdesc = owner_name.empty() ? "BuyCopyNoOwner" : "BuyCopy"; + break; + } + + LLSD payload; + payload["task_id"] = inv->mTaskID; + payload["item_id"] = inv->mItemID; + payload["type"] = inv->mType; + LLNotifications::instance().add(alertdesc, args, payload, LLTaskInvFVBridge::commitBuyItem); + } +} + +S32 LLTaskInvFVBridge::getPrice() +{ + LLInventoryItem* item = findItem(); + if(item) + { + return item->getSaleInfo().getSalePrice(); + } + else + { + return -1; + } +} + +// static +bool LLTaskInvFVBridge::commitBuyItem(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + if(0 == option) + { + LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID()); + if(!object || !object->getRegion()) return false; + + + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_BuyObjectInventory); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_Data); + msg->addUUIDFast(_PREHASH_ObjectID, notification["payload"]["task_id"].asUUID()); + msg->addUUIDFast(_PREHASH_ItemID, notification["payload"]["item_id"].asUUID()); + msg->addUUIDFast(_PREHASH_FolderID, + gInventory.findCategoryUUIDForType((LLAssetType::EType)notification["payload"]["type"].asInteger())); + msg->sendReliable(object->getRegion()->getHost()); + } + return false; +} + +const std::string& LLTaskInvFVBridge::getName() const +{ + return mName; +} + +const std::string& LLTaskInvFVBridge::getDisplayName() const +{ + LLInventoryItem* item = findItem(); + if(item) + { + mDisplayName.assign(item->getName()); + + const LLPermissions& perm(item->getPermissions()); + BOOL copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE); + BOOL mod = gAgent.allowOperation(PERM_MODIFY, perm, GP_OBJECT_MANIPULATE); + BOOL xfer = gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE); + + if(!copy) + { + mDisplayName.append(" (no copy)"); + } + if(!mod) + { + mDisplayName.append(" (no modify)"); + } + if(!xfer) + { + mDisplayName.append(" (no transfer)"); + } + } + + return mDisplayName; +} + +// BUG: No creation dates for task inventory +time_t LLTaskInvFVBridge::getCreationDate() const +{ + return 0; +} + +LLUIImagePtr LLTaskInvFVBridge::getIcon() const +{ + BOOL item_is_multi = FALSE; + if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) + { + item_is_multi = TRUE; + } + + return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi ); +} + +void LLTaskInvFVBridge::openItem() +{ + // no-op. + lldebugs << "LLTaskInvFVBridge::openItem()" << llendl; +} + +void LLTaskInvFVBridge::previewItem() +{ + openItem(); +} + +BOOL LLTaskInvFVBridge::isItemRenameable() const +{ + if(gAgent.isGodlike()) return TRUE; + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + LLInventoryItem* item; + item = (LLInventoryItem*)(object->getInventoryObject(mUUID)); + if(item && gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), + GP_OBJECT_MANIPULATE, GOD_LIKE)) + { + return TRUE; + } + } + return FALSE; +} + +BOOL LLTaskInvFVBridge::renameItem(const std::string& new_name) +{ + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + LLViewerInventoryItem* item = NULL; + item = (LLViewerInventoryItem*)object->getInventoryObject(mUUID); + if(item && (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), + GP_OBJECT_MANIPULATE, GOD_LIKE))) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->rename(new_name); + object->updateInventory( + new_item, + TASK_INVENTORY_ITEM_KEY, + false); + } + } + return TRUE; +} + +BOOL LLTaskInvFVBridge::isItemMovable() const +{ + //LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + //if(object && (object->permModify() || gAgent.isGodlike())) + //{ + // return TRUE; + //} + //return FALSE; + return TRUE; +} + +BOOL LLTaskInvFVBridge::isItemRemovable() +{ + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object + && (object->permModify() || object->permYouOwner())) + { + return TRUE; + } + return FALSE; +} + +bool remove_task_inventory_callback(const LLSD& notification, const LLSD& response, LLPanelObjectInventory* panel) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID()); + if(option == 0 && object) + { + // yes + LLSD::array_const_iterator list_end = notification["payload"]["inventory_ids"].endArray(); + for (LLSD::array_const_iterator list_it = notification["payload"]["inventory_ids"].beginArray(); + list_it != list_end; + ++list_it) + { + object->removeInventory(list_it->asUUID()); + } + + // refresh the UI. + panel->refresh(); + } + return false; +} + +// helper for remove +// ! REFACTOR ! two_uuids_list_t is also defined in llinevntorybridge.h, but differently. +typedef std::pair<LLUUID, std::list<LLUUID> > panel_two_uuids_list_t; +typedef std::pair<LLPanelObjectInventory*, panel_two_uuids_list_t> remove_data_t; +BOOL LLTaskInvFVBridge::removeItem() +{ + if(isItemRemovable() && mPanel) + { + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + if(object->permModify()) + { + // just do it. + object->removeInventory(mUUID); + return TRUE; + } + else + { + remove_data_t* data = new remove_data_t; + data->first = mPanel; + data->second.first = mPanel->getTaskUUID(); + data->second.second.push_back(mUUID); + LLSD payload; + payload["task_id"] = mPanel->getTaskUUID(); + payload["inventory_ids"].append(mUUID); + LLNotifications::instance().add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel)); + return FALSE; + } + } + } + return FALSE; +} + +void LLTaskInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) +{ + if (!mPanel) + { + return; + } + + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if (!object) + { + return; + } + + if (!object->permModify()) + { + LLSD payload; + payload["task_id"] = mPanel->getTaskUUID(); + for (S32 i = 0; i < (S32)batch.size(); i++) + { + LLTaskInvFVBridge* itemp = (LLTaskInvFVBridge*)batch[i]; + payload["inventory_ids"].append(itemp->getUUID()); + } + LLNotifications::instance().add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel)); + + } + else + { + for (S32 i = 0; i < (S32)batch.size(); i++) + { + LLTaskInvFVBridge* itemp = (LLTaskInvFVBridge*)batch[i]; + + if(itemp->isItemRemovable()) + { + // just do it. + object->removeInventory(itemp->getUUID()); + } + } + } +} + +void LLTaskInvFVBridge::move(LLFolderViewEventListener* parent_listener) +{ +} + +BOOL LLTaskInvFVBridge::isItemCopyable() const +{ + LLInventoryItem* item = findItem(); + if(!item) return FALSE; + return gAgent.allowOperation(PERM_COPY, item->getPermissions(), + GP_OBJECT_MANIPULATE); +} + +BOOL LLTaskInvFVBridge::copyToClipboard() const +{ + return FALSE; +} + +void LLTaskInvFVBridge::cutToClipboard() +{ +} + +BOOL LLTaskInvFVBridge::isClipboardPasteable() const +{ + return FALSE; +} + +void LLTaskInvFVBridge::pasteFromClipboard() +{ +} + +void LLTaskInvFVBridge::pasteLinkFromClipboard() +{ +} + +BOOL LLTaskInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const +{ + //llinfos << "LLTaskInvFVBridge::startDrag()" << llendl; + if(mPanel) + { + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + LLInventoryItem* inv = NULL; + if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) + { + const LLPermissions& perm = inv->getPermissions(); + bool can_copy = gAgent.allowOperation(PERM_COPY, perm, + GP_OBJECT_MANIPULATE); + if (object->isAttachment() && !can_copy) + { + //RN: no copy contents of attachments cannot be dragged out + // due to a race condition and possible exploit where + // attached objects do not update their inventory items + // when their contents are manipulated + return FALSE; + } + if((can_copy && perm.allowTransferTo(gAgent.getID())) + || object->permYouOwner()) +// || gAgent.isGodlike()) + + { + *type = LLAssetType::lookupDragAndDropType(inv->getType()); + + *id = inv->getUUID(); + return TRUE; + } + } + } + } + return FALSE; +} + +BOOL LLTaskInvFVBridge::dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data) +{ + //llinfos << "LLTaskInvFVBridge::dragOrDrop()" << llendl; + return FALSE; +} + +// virtual +void LLTaskInvFVBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if (action == "task_buy") + { + // Check the price of the item. + S32 price = getPrice(); + if (-1 == price) + { + llwarns << "label_buy_task_bridged_item: Invalid price" << llendl; + } + else + { + if (price > 0 && price > gStatusBar->getBalance()) + { + LLFloaterBuyCurrency::buyCurrency("This costs", price); + } + else + { + buyItem(); + } + } + } + else if (action == "task_open") + { + openItem(); + } + else if (action == "task_properties") + { + showProperties(); + } +} + +void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + LLInventoryItem* item = findItem(); + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if (!item) + { + hide_context_entries(menu, items, disabled_items); + return; + } + + if(gAgent.allowOperation(PERM_OWNER, item->getPermissions(), + GP_OBJECT_MANIPULATE) + && item->getSaleInfo().isForSale()) + { + items.push_back(std::string("Task Buy")); + + std::string label= LLTrans::getString("Buy"); + // Check the price of the item. + S32 price = getPrice(); + if (-1 == price) + { + llwarns << "label_buy_task_bridged_item: Invalid price" << llendl; + } + else + { + std::ostringstream info; + info << LLTrans::getString("BuyforL$") << price; + label.assign(info.str()); + } + + const LLView::child_list_t *list = menu.getChildList(); + LLView::child_list_t::const_iterator itor; + for (itor = list->begin(); itor != list->end(); ++itor) + { + std::string name = (*itor)->getName(); + LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor); + if (name == "Task Buy" && menu_itemp) + { + menu_itemp->setLabel(label); + } + } + } + else + { + items.push_back(std::string("Task Open")); + if (!isItemCopyable()) + { + disabled_items.push_back(std::string("Task Open")); + } + } + items.push_back(std::string("Task Properties")); + if(isItemRenameable()) + { + items.push_back(std::string("Task Rename")); + } + if(isItemRemovable()) + { + items.push_back(std::string("Task Remove")); + } + + hide_context_entries(menu, items, disabled_items); +} + + +///---------------------------------------------------------------------------- +/// Class LLTaskFolderBridge +///---------------------------------------------------------------------------- + +class LLTaskCategoryBridge : public LLTaskInvFVBridge +{ +public: + LLTaskCategoryBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + virtual const std::string& getDisplayName() const { return getName(); } + virtual BOOL isItemRenameable() const; + virtual BOOL renameItem(const std::string& new_name); + virtual BOOL isItemRemovable(); + virtual void buildContextMenu(LLMenuGL& menu, U32 flags); + virtual BOOL hasChildren() const; + virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; + virtual BOOL dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data); +}; + +LLTaskCategoryBridge::LLTaskCategoryBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskCategoryBridge::getIcon() const +{ + return LLUI::getUIImage("Inv_FolderClosed"); +} + +BOOL LLTaskCategoryBridge::isItemRenameable() const +{ + return FALSE; +} + +BOOL LLTaskCategoryBridge::renameItem(const std::string& new_name) +{ + return FALSE; +} + +BOOL LLTaskCategoryBridge::isItemRemovable() +{ + return FALSE; +} + +void LLTaskCategoryBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + std::vector<std::string> items; + std::vector<std::string> disabled_items; + items.push_back(std::string("Task Open")); + hide_context_entries(menu, items, disabled_items); +} + +BOOL LLTaskCategoryBridge::hasChildren() const +{ + // return TRUE if we have or do know know if we have children. + // *FIX: For now, return FALSE - we will know for sure soon enough. + return FALSE; +} + +BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const +{ + //llinfos << "LLTaskInvFVBridge::startDrag()" << llendl; + if(mPanel) + { + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + LLInventoryItem* inv = NULL; + if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) + { + const LLPermissions& perm = inv->getPermissions(); + bool can_copy = gAgent.allowOperation(PERM_COPY, perm, + GP_OBJECT_MANIPULATE); + if((can_copy && perm.allowTransferTo(gAgent.getID())) + || object->permYouOwner()) +// || gAgent.isGodlike()) + + { + *type = LLAssetType::lookupDragAndDropType(inv->getType()); + + *id = inv->getUUID(); + return TRUE; + } + } + } + } + return FALSE; +} + +BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data) +{ + //llinfos << "LLTaskCategoryBridge::dragOrDrop()" << llendl; + BOOL accept = FALSE; + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + switch(cargo_type) + { + case DAD_CATEGORY: + accept = LLToolDragAndDrop::getInstance()->dadUpdateInventoryCategory(object,drop); + break; + case DAD_TEXTURE: + case DAD_SOUND: + case DAD_LANDMARK: + case DAD_OBJECT: + case DAD_NOTECARD: + case DAD_CLOTHING: + case DAD_BODYPART: + case DAD_ANIMATION: + case DAD_GESTURE: + case DAD_CALLINGCARD: + accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data); + if(accept && drop) + { + LLToolDragAndDrop::dropInventory(object, + (LLViewerInventoryItem*)cargo_data, + LLToolDragAndDrop::getInstance()->getSource(), + LLToolDragAndDrop::getInstance()->getSourceID()); + } + break; + case DAD_SCRIPT: + // *HACK: In order to resolve SL-22177, we need to block + // drags from notecards and objects onto other + // objects. uncomment the simpler version when we have + // that right. + //accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data); + if(LLToolDragAndDrop::isInventoryDropAcceptable( + object, (LLViewerInventoryItem*)cargo_data) + && (LLToolDragAndDrop::SOURCE_WORLD != LLToolDragAndDrop::getInstance()->getSource()) + && (LLToolDragAndDrop::SOURCE_NOTECARD != LLToolDragAndDrop::getInstance()->getSource())) + { + accept = TRUE; + } + if(accept && drop) + { + LLViewerInventoryItem* item = (LLViewerInventoryItem*)cargo_data; + // rez in the script active by default, rez in + // inactive if the control key is being held down. + BOOL active = ((mask & MASK_CONTROL) == 0); + LLToolDragAndDrop::dropScript(object, item, active, + LLToolDragAndDrop::getInstance()->getSource(), + LLToolDragAndDrop::getInstance()->getSourceID()); + } + break; + default: + break; + } + } + return accept; +} + +///---------------------------------------------------------------------------- +/// Class LLTaskTextureBridge +///---------------------------------------------------------------------------- + +class LLTaskTextureBridge : public LLTaskInvFVBridge +{ +public: + LLTaskTextureBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + LLInventoryType::EType it); + + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); +protected: + LLInventoryType::EType mInventoryType; +}; + +LLTaskTextureBridge::LLTaskTextureBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + LLInventoryType::EType it) : + LLTaskInvFVBridge(panel, uuid, name), + mInventoryType(it) +{ +} + +LLUIImagePtr LLTaskTextureBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_TEXTURE, mInventoryType, 0, FALSE); +} + +void LLTaskTextureBridge::openItem() +{ + llinfos << "LLTaskTextureBridge::openItem()" << llendl; + LLPreviewTexture* preview = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); + if(preview) + { + preview->setObjectID(mPanel->getTaskUUID()); + } +} + + +///---------------------------------------------------------------------------- +/// Class LLTaskSoundBridge +///---------------------------------------------------------------------------- + +class LLTaskSoundBridge : public LLTaskInvFVBridge +{ +public: + LLTaskSoundBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); + virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + virtual void buildContextMenu(LLMenuGL& menu, U32 flags); + static void openSoundPreview(void* data); +}; + +LLTaskSoundBridge::LLTaskSoundBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskSoundBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE); +} + +void LLTaskSoundBridge::openItem() +{ + openSoundPreview((void*)this); +} + +void LLTaskSoundBridge::openSoundPreview(void* data) +{ + LLTaskSoundBridge* self = (LLTaskSoundBridge*)data; + if(!self) + return; + + LLPreviewSound* preview = LLFloaterReg::showTypedInstance<LLPreviewSound>("preview_sound", LLSD(self->mUUID), TAKE_FOCUS_YES); + if (preview) + { + preview->setObjectID(self->mPanel->getTaskUUID()); + } +} + +// virtual +void LLTaskSoundBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if (action == "task_play") + { + LLInventoryItem* item = findItem(); + if(item) + { + send_sound_trigger(item->getAssetUUID(), 1.0); + } + } + LLTaskInvFVBridge::performAction(folder, model, action); +} + +void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + LLInventoryItem* item = findItem(); + if(!item) return; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(item->getPermissions().getOwner() != gAgent.getID() + && item->getSaleInfo().isForSale()) + { + items.push_back(std::string("Task Buy")); + + std::string label= LLTrans::getString("Buy"); + // Check the price of the item. + S32 price = getPrice(); + if (-1 == price) + { + llwarns << "label_buy_task_bridged_item: Invalid price" << llendl; + } + else + { + std::ostringstream info; + info << LLTrans::getString("BuyforL$") << price; + label.assign(info.str()); + } + + const LLView::child_list_t *list = menu.getChildList(); + LLView::child_list_t::const_iterator itor; + for (itor = list->begin(); itor != list->end(); ++itor) + { + std::string name = (*itor)->getName(); + LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor); + if (name == "Task Buy" && menu_itemp) + { + menu_itemp->setLabel(label); + } + } + } + else + { + items.push_back(std::string("Task Open")); + if (!isItemCopyable()) + { + disabled_items.push_back(std::string("Task Open")); + } + } + items.push_back(std::string("Task Properties")); + if(isItemRenameable()) + { + items.push_back(std::string("Task Rename")); + } + if(isItemRemovable()) + { + items.push_back(std::string("Task Remove")); + } + + items.push_back(std::string("Task Play")); + + + hide_context_entries(menu, items, disabled_items); +} + +///---------------------------------------------------------------------------- +/// Class LLTaskLandmarkBridge +///---------------------------------------------------------------------------- + +class LLTaskLandmarkBridge : public LLTaskInvFVBridge +{ +public: + LLTaskLandmarkBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; +}; + +LLTaskLandmarkBridge::LLTaskLandmarkBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskLandmarkBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0, FALSE); +} + + +///---------------------------------------------------------------------------- +/// Class LLTaskCallingCardBridge +///---------------------------------------------------------------------------- + +class LLTaskCallingCardBridge : public LLTaskInvFVBridge +{ +public: + LLTaskCallingCardBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + virtual BOOL isItemRenameable() const; + virtual BOOL renameItem(const std::string& new_name); +}; + +LLTaskCallingCardBridge::LLTaskCallingCardBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskCallingCardBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0, FALSE); +} + +BOOL LLTaskCallingCardBridge::isItemRenameable() const +{ + return FALSE; +} + +BOOL LLTaskCallingCardBridge::renameItem(const std::string& new_name) +{ + return FALSE; +} + + +///---------------------------------------------------------------------------- +/// Class LLTaskScriptBridge +///---------------------------------------------------------------------------- + +class LLTaskScriptBridge : public LLTaskInvFVBridge +{ +public: + LLTaskScriptBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + //static BOOL enableIfCopyable( void* userdata ); +}; + +LLTaskScriptBridge::LLTaskScriptBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskScriptBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); +} + + +class LLTaskLSLBridge : public LLTaskScriptBridge +{ +public: + LLTaskLSLBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual void openItem(); + virtual BOOL removeItem(); + //virtual void buildContextMenu(LLMenuGL& menu); + + //static void copyToInventory(void* userdata); +}; + +LLTaskLSLBridge::LLTaskLSLBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskScriptBridge(panel, uuid, name) +{ +} + +void LLTaskLSLBridge::openItem() +{ + llinfos << "LLTaskLSLBridge::openItem() " << mUUID << llendl; + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(!object || object->isInventoryPending()) + { + return; + } + LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES); + if (preview && (object->permModify() || gAgent.isGodlike())) + { + preview->setObjectID(mPanel->getTaskUUID()); + } +} + +BOOL LLTaskLSLBridge::removeItem() +{ + LLFloaterReg::hideInstance("preview_scriptedit", LLSD(mUUID)); + return LLTaskInvFVBridge::removeItem(); +} + +///---------------------------------------------------------------------------- +/// Class LLTaskObjectBridge +///---------------------------------------------------------------------------- + +class LLTaskObjectBridge : public LLTaskInvFVBridge +{ +public: + LLTaskObjectBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; +}; + +LLTaskObjectBridge::LLTaskObjectBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskObjectBridge::getIcon() const +{ + BOOL item_is_multi = FALSE; + if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) + { + item_is_multi = TRUE; + } + + return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi); +} + +///---------------------------------------------------------------------------- +/// Class LLTaskNotecardBridge +///---------------------------------------------------------------------------- + +class LLTaskNotecardBridge : public LLTaskInvFVBridge +{ +public: + LLTaskNotecardBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); + virtual BOOL removeItem(); +}; + +LLTaskNotecardBridge::LLTaskNotecardBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskNotecardBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE); +} + +void LLTaskNotecardBridge::openItem() +{ + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(!object || object->isInventoryPending()) + { + return; + } + if(object->permModify() || gAgent.isGodlike()) + { + LLPreviewNotecard* preview = LLFloaterReg::showTypedInstance<LLPreviewNotecard>("preview_notecard", LLSD(mUUID), TAKE_FOCUS_YES); + if (preview) + { + preview->setObjectID(mPanel->getTaskUUID()); + } + } +} + +BOOL LLTaskNotecardBridge::removeItem() +{ + LLFloaterReg::hideInstance("preview_notecard", LLSD(mUUID)); + return LLTaskInvFVBridge::removeItem(); +} + +///---------------------------------------------------------------------------- +/// Class LLTaskGestureBridge +///---------------------------------------------------------------------------- + +class LLTaskGestureBridge : public LLTaskInvFVBridge +{ +public: + LLTaskGestureBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); + virtual BOOL removeItem(); +}; + +LLTaskGestureBridge::LLTaskGestureBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskGestureBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE); +} + +void LLTaskGestureBridge::openItem() +{ + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(!object || object->isInventoryPending()) + { + return; + } + LLPreviewGesture::show(mUUID, mPanel->getTaskUUID()); +} + +BOOL LLTaskGestureBridge::removeItem() +{ + // Don't need to deactivate gesture because gestures inside objects can never be active. + LLFloaterReg::hideInstance("preview_gesture", LLSD(mUUID)); + return LLTaskInvFVBridge::removeItem(); +} + +///---------------------------------------------------------------------------- +/// Class LLTaskAnimationBridge +///---------------------------------------------------------------------------- + +class LLTaskAnimationBridge : public LLTaskInvFVBridge +{ +public: + LLTaskAnimationBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); + virtual BOOL removeItem(); +}; + +LLTaskAnimationBridge::LLTaskAnimationBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskAnimationBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); +} + +void LLTaskAnimationBridge::openItem() +{ + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(!object || object->isInventoryPending()) + { + return; + } + + LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); + if (preview && (object->permModify() || gAgent.isGodlike())) + { + preview->setObjectID(mPanel->getTaskUUID()); + } +} + +BOOL LLTaskAnimationBridge::removeItem() +{ + LLFloaterReg::hideInstance("preview_anim", LLSD(mUUID)); + return LLTaskInvFVBridge::removeItem(); +} + +///---------------------------------------------------------------------------- +/// Class LLTaskWearableBridge +///---------------------------------------------------------------------------- + +class LLTaskWearableBridge : public LLTaskInvFVBridge +{ +public: + LLTaskWearableBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + LLAssetType::EType asset_type, + U32 flags); + + virtual LLUIImagePtr getIcon() const; + +protected: + LLAssetType::EType mAssetType; +}; + +LLTaskWearableBridge::LLTaskWearableBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + LLAssetType::EType asset_type, + U32 flags) : + LLTaskInvFVBridge(panel, uuid, name, flags), + mAssetType( asset_type ) +{ +} + +LLUIImagePtr LLTaskWearableBridge::getIcon() const +{ + return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE ); +} + + +///---------------------------------------------------------------------------- +/// LLTaskInvFVBridge impl +//---------------------------------------------------------------------------- + +LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory* panel, + LLInventoryObject* object) +{ + LLTaskInvFVBridge* new_bridge = NULL; + LLAssetType::EType type = object->getType(); + LLInventoryItem* item = NULL; + switch(type) + { + case LLAssetType::AT_TEXTURE: + item = (LLInventoryItem*)object; + new_bridge = new LLTaskTextureBridge(panel, + object->getUUID(), + object->getName(), + item->getInventoryType()); + break; + case LLAssetType::AT_SOUND: + new_bridge = new LLTaskSoundBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_LANDMARK: + new_bridge = new LLTaskLandmarkBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_CALLINGCARD: + new_bridge = new LLTaskCallingCardBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_SCRIPT: + // OLD SCRIPTS DEPRECATED - JC + llwarns << "Old script" << llendl; + //new_bridge = new LLTaskOldScriptBridge(panel, + // object->getUUID(), + // object->getName()); + break; + case LLAssetType::AT_OBJECT: + new_bridge = new LLTaskObjectBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_NOTECARD: + new_bridge = new LLTaskNotecardBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_ANIMATION: + new_bridge = new LLTaskAnimationBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_GESTURE: + new_bridge = new LLTaskGestureBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_BODYPART: + item = (LLInventoryItem*)object; + new_bridge = new LLTaskWearableBridge(panel, + object->getUUID(), + object->getName(), + type, + item->getFlags()); + break; + case LLAssetType::AT_CATEGORY: + case LLAssetType::AT_FAVORITE: + new_bridge = new LLTaskCategoryBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_LSL_TEXT: + new_bridge = new LLTaskLSLBridge(panel, + object->getUUID(), + object->getName()); + break; + + break; + default: + llinfos << "Unhandled inventory type (llassetstorage.h): " + << (S32)type << llendl; + break; + } + return new_bridge; +} + + +///---------------------------------------------------------------------------- +/// Class LLPanelObjectInventory +///---------------------------------------------------------------------------- + +static LLDefaultChildRegistry::Register<LLPanelObjectInventory> r("panel_inventory_object"); + +void do_nothing() +{ +} + +// Default constructor +LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Params& p) : + LLPanel(p), + mScroller(NULL), + mFolders(NULL), + mHaveInventory(FALSE), + mIsInventoryEmpty(TRUE), + mInventoryNeedsUpdate(FALSE) +{ + // Setup context menu callbacks + mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); + mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&do_nothing)); + mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing)); + mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing)); +} + +// Destroys the object +LLPanelObjectInventory::~LLPanelObjectInventory() +{ + if (!gIdleCallbacks.deleteFunction(idle, this)) + { + llwarns << "LLPanelObjectInventory::~LLPanelObjectInventory() failed to delete callback" << llendl; + } +} + +BOOL LLPanelObjectInventory::postBuild() +{ + // clear contents and initialize menus, sets up mFolders + reset(); + + // Register an idle update callback + gIdleCallbacks.addFunction(idle, this); + + return TRUE; +} + +void LLPanelObjectInventory::doToSelected(const LLSD& userdata) +{ + mFolders->doToSelected(&gInventory, userdata); +} + +void LLPanelObjectInventory::clearContents() +{ + mHaveInventory = FALSE; + mIsInventoryEmpty = TRUE; + if (LLToolDragAndDrop::getInstance() && LLToolDragAndDrop::getInstance()->getSource() == LLToolDragAndDrop::SOURCE_WORLD) + { + LLToolDragAndDrop::getInstance()->endDrag(); + } + + if( mScroller ) + { + // removes mFolders + removeChild( mScroller ); //*TODO: Really shouldn't do this during draw()/refresh() + mScroller->die(); + mScroller = NULL; + mFolders = NULL; + } +} + + +void LLPanelObjectInventory::reset() +{ + clearContents(); + + setBorderVisible(FALSE); + + mCommitCallbackRegistrar.pushScope(); // push local callbacks + + LLRect dummy_rect(0, 1, 1, 0); + LLFolderView::Params p; + p.name = "task inventory"; + p.task_id = getTaskUUID(); + p.parent_panel = this; + mFolders = LLUICtrlFactory::create<LLFolderView>(p); + // this ensures that we never say "searching..." or "no items found" + mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); + mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); + + LLRect scroller_rect(0, getRect().getHeight(), getRect().getWidth(), 0); + LLScrollContainer::Params scroll_p; + scroll_p.name("task inventory scroller"); + scroll_p.rect(scroller_rect); + scroll_p.follows.flags(FOLLOWS_ALL); + mScroller = LLUICtrlFactory::create<LLScrollContainer>(scroll_p); + addChild(mScroller); + mScroller->addChild(mFolders); + + mFolders->setScrollContainer( mScroller ); + + mCommitCallbackRegistrar.popScope(); +} + +void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object, + InventoryObjectList* inventory, + S32 serial_num, + void* data) +{ + if(!object) return; + + //llinfos << "invetnory arrived: \n" + // << " panel UUID: " << panel->mTaskUUID << "\n" + // << " task UUID: " << object->mID << llendl; + if(mTaskUUID == object->mID) + { + mInventoryNeedsUpdate = TRUE; + } + + // refresh any properties floaters that are hanging around. + if(inventory) + { + for (InventoryObjectList::const_iterator iter = inventory->begin(); + iter != inventory->end(); ) + { + LLInventoryObject* item = *iter++; + LLFloaterProperties* floater = LLFloaterReg::findTypedInstance<LLFloaterProperties>("properites", item->getUUID()); + if(floater) + { + floater->refresh(); + } + } + } +} + +void LLPanelObjectInventory::updateInventory() +{ + //llinfos << "inventory arrived: \n" + // << " panel UUID: " << panel->mTaskUUID << "\n" + // << " task UUID: " << object->mID << llendl; + // We're still interested in this task's inventory. + std::set<LLUUID> selected_items; + BOOL inventory_has_focus = FALSE; + if (mHaveInventory && mFolders->getNumSelectedDescendants()) + { + mFolders->getSelectionList(selected_items); + inventory_has_focus = gFocusMgr.childHasKeyboardFocus(mFolders); + } + + reset(); + + LLViewerObject* objectp = gObjectList.findObject(mTaskUUID); + if (objectp) + { + LLInventoryObject* inventory_root = objectp->getInventoryRoot(); + InventoryObjectList contents; + objectp->getInventoryContents(contents); + if (inventory_root) + { + createFolderViews(inventory_root, contents); + mHaveInventory = TRUE; + mIsInventoryEmpty = FALSE; + mFolders->setEnabled(TRUE); + } + else + { + // TODO: create an empty inventory + mIsInventoryEmpty = TRUE; + mHaveInventory = TRUE; + } + } + else + { + // TODO: create an empty inventory + mIsInventoryEmpty = TRUE; + mHaveInventory = TRUE; + } + + // restore previous selection + std::set<LLUUID>::iterator selection_it; + BOOL first_item = TRUE; + for (selection_it = selected_items.begin(); selection_it != selected_items.end(); ++selection_it) + { + LLFolderViewItem* selected_item = mFolders->getItemByID(*selection_it); + if (selected_item) + { + //HACK: "set" first item then "change" each other one to get keyboard focus right + if (first_item) + { + mFolders->setSelection(selected_item, TRUE, inventory_has_focus); + first_item = FALSE; + } + else + { + mFolders->changeSelection(selected_item, TRUE); + } + } + } + + mFolders->requestArrange(); + mInventoryNeedsUpdate = FALSE; +} + +// *FIX: This is currently a very expensive operation, because we have +// to iterate through the inventory one time for each category. This +// leads to an N^2 based on the category count. This could be greatly +// speeded with an efficient multimap implementation, but we don't +// have that in our current arsenal. +void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents) +{ + if (!inventory_root) + { + return; + } + // Create a visible root category. + LLTaskInvFVBridge* bridge = NULL; + bridge = LLTaskInvFVBridge::createObjectBridge(this, inventory_root); + if(bridge) + { + LLFolderViewFolder* new_folder = NULL; + LLFolderViewFolder::Params p; + p.name = inventory_root->getName(); + p.icon = LLUI::getUIImage("Inv_FolderClosed"); + p.icon_open = LLUI::getUIImage("Inv_FolderOpen"); + p.root = mFolders; + p.listener = bridge; + new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p); + new_folder->addToFolder(mFolders, mFolders); + new_folder->toggleOpen(); + + createViewsForCategory(&contents, inventory_root, new_folder); + } +} + +typedef std::pair<LLInventoryObject*, LLFolderViewFolder*> obj_folder_pair; + +void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* inventory, + LLInventoryObject* parent, + LLFolderViewFolder* folder) +{ + // Find all in the first pass + LLDynamicArray<obj_folder_pair*> child_categories; + LLTaskInvFVBridge* bridge; + LLFolderViewItem* view; + + InventoryObjectList::iterator it = inventory->begin(); + InventoryObjectList::iterator end = inventory->end(); + for( ; it != end; ++it) + { + LLInventoryObject* obj = *it; + + if(parent->getUUID() == obj->getParentUUID()) + { + bridge = LLTaskInvFVBridge::createObjectBridge(this, obj); + if(!bridge) + { + continue; + } + if(LLAssetType::AT_CATEGORY == obj->getType()) + { + LLFolderViewFolder::Params p; + p.name = obj->getName(); + p.icon = LLUI::getUIImage("Inv_FolderClosed"); + p.icon_open = LLUI::getUIImage("Inv_FolderOpen"); + p.root = mFolders; + p.listener = bridge; + view = LLUICtrlFactory::create<LLFolderViewFolder>(p); + child_categories.put(new obj_folder_pair(obj, + (LLFolderViewFolder*)view)); + } + else + { + LLFolderViewItem::Params params; + params.name(obj->getName()); + params.icon(bridge->getIcon()); + params.creation_date(bridge->getCreationDate()); + params.root(mFolders); + params.listener(bridge); + params.rect(LLRect()); + view = LLUICtrlFactory::create<LLFolderViewItem> (params); + } + view->addToFolder(folder, mFolders); + } + } + + // now, for each category, do the second pass + for(S32 i = 0; i < child_categories.count(); i++) + { + createViewsForCategory(inventory, child_categories[i]->first, + child_categories[i]->second ); + delete child_categories[i]; + } +} + +void LLPanelObjectInventory::refresh() +{ + //llinfos << "LLPanelObjectInventory::refresh()" << llendl; + BOOL has_inventory = FALSE; + const BOOL non_root_ok = TRUE; + LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(NULL, non_root_ok); + if(node) + { + LLViewerObject* object = node->getObject(); + if(object && ((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1) + || (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1))) + { + // determine if we need to make a request. Start with a + // default based on if we have inventory at all. + BOOL make_request = !mHaveInventory; + + // If the task id is different than what we've stored, + // then make the request. + if(mTaskUUID != object->mID) + { + mTaskUUID = object->mID; + make_request = TRUE; + + // This is a new object so pre-emptively clear the contents + // Otherwise we show the old stuff until the update comes in + clearContents(); + + // Register for updates from this object, + registerVOInventoryListener(object,NULL); + } + + // Based on the node information, we may need to dirty the + // object inventory and get it again. + if(node->mValid) + { + if(node->mInventorySerial != object->getInventorySerial() || object->isInventoryDirty()) + { + make_request = TRUE; + } + } + + // do the request if necessary. + if(make_request) + { + requestVOInventory(); + } + has_inventory = TRUE; + } + } + if(!has_inventory) + { + mTaskUUID = LLUUID::null; + removeVOInventoryListener(); + clearContents(); + } + //llinfos << "LLPanelObjectInventory::refresh() " << mTaskUUID << llendl; +} + +void LLPanelObjectInventory::removeSelectedItem() +{ + if(mFolders) + { + mFolders->removeSelectedItems(); + } +} + +void LLPanelObjectInventory::startRenamingSelectedItem() +{ + if(mFolders) + { + mFolders->startRenamingSelectedItem(); + } +} + +void LLPanelObjectInventory::draw() +{ + LLPanel::draw(); + + if(mIsInventoryEmpty) + { + if((LLUUID::null != mTaskUUID) && (!mHaveInventory)) + { + LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("LoadingContents"), 0, + (S32)(getRect().getWidth() * 0.5f), + 10, + LLColor4( 1, 1, 1, 1 ), + LLFontGL::HCENTER, + LLFontGL::BOTTOM); + } + else if(mHaveInventory) + { + LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("NoContents"), 0, + (S32)(getRect().getWidth() * 0.5f), + 10, + LLColor4( 1, 1, 1, 1 ), + LLFontGL::HCENTER, + LLFontGL::BOTTOM); + } + } +} + +void LLPanelObjectInventory::deleteAllChildren() +{ + mScroller = NULL; + mFolders = NULL; + LLView::deleteAllChildren(); +} + +BOOL LLPanelObjectInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg) +{ + if (mFolders && mHaveInventory) + { + LLFolderViewItem* folderp = mFolders->getNextFromChild(NULL); + if (!folderp) + { + return FALSE; + } + // Try to pass on unmodified mouse coordinates + S32 local_x = x - mFolders->getRect().mLeft; + S32 local_y = y - mFolders->getRect().mBottom; + + if (mFolders->pointInView(local_x, local_y)) + { + return mFolders->handleDragAndDrop(local_x, local_y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); + } + else + { + //force mouse coordinates to be inside folder rectangle + return mFolders->handleDragAndDrop(5, 1, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); + } + } + else + { + return FALSE; + } +} + +//static +void LLPanelObjectInventory::idle(void* user_data) +{ + LLPanelObjectInventory* self = (LLPanelObjectInventory*)user_data; + + + if (self->mInventoryNeedsUpdate) + { + self->updateInventory(); + } +} diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h new file mode 100644 index 00000000000..7a39d8fabc4 --- /dev/null +++ b/indra/newview/llpanelobjectinventory.h @@ -0,0 +1,102 @@ +/** + * @file llpanelobjectinventory.h + * @brief LLPanelObjectInventory class definition + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELOBJECTINVENTORY_H +#define LL_LLPANELOBJECTINVENTORY_H + +#include "llvoinventorylistener.h" +#include "llpanel.h" + +#include "llinventory.h" + +class LLScrollContainer; +class LLFolderView; +class LLFolderViewFolder; +class LLViewerObject; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLPanelObjectInventory +// +// This class represents the panel used to view and control a +// particular task's inventory. +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLPanelObjectInventory : public LLPanel, public LLVOInventoryListener +{ +public: + // dummy param block for template registration purposes + struct Params : public LLPanel::Params {}; + + LLPanelObjectInventory(const Params&); + virtual ~LLPanelObjectInventory(); + + virtual BOOL postBuild(); + + void doToSelected(const LLSD& userdata); + + void refresh(); + const LLUUID& getTaskUUID() { return mTaskUUID;} + void removeSelectedItem(); + void startRenamingSelectedItem(); + + LLFolderView* getRootFolder() const { return mFolders; } + + virtual void draw(); + virtual void deleteAllChildren(); + virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg); + + static void idle(void* user_data); + +protected: + void reset(); + /*virtual*/ void inventoryChanged(LLViewerObject* object, + InventoryObjectList* inventory, + S32 serial_num, + void* user_data); + void updateInventory(); + void createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents); + void createViewsForCategory(InventoryObjectList* inventory, + LLInventoryObject* parent, + LLFolderViewFolder* folder); + void clearContents(); + +private: + LLScrollContainer* mScroller; + LLFolderView* mFolders; + + LLUUID mTaskUUID; + BOOL mHaveInventory; + BOOL mIsInventoryEmpty; + BOOL mInventoryNeedsUpdate; +}; + +#endif // LL_LLPANELOBJECTINVENTORY_H diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 4ac109bf3d2..5a70842a733 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -57,7 +57,6 @@ #include "llfirstuse.h" #include "llfocusmgr.h" #include "llmanipscale.h" -#include "llpanelinventory.h" #include "llpreviewscript.h" #include "llresmgr.h" #include "llselectmgr.h" diff --git a/indra/newview/llpanelvolume.h b/indra/newview/llpanelvolume.h index 9d197aafa58..7bc935f986f 100644 --- a/indra/newview/llpanelvolume.h +++ b/indra/newview/llpanelvolume.h @@ -45,7 +45,6 @@ class LLUICtrl; class LLButton; class LLViewerObject; class LLComboBox; -class LLPanelInventory; class LLColorSwatchCtrl; class LLPanelVolume : public LLPanel diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp index b3b48577278..83443687c92 100644 --- a/indra/newview/llplacesinventorybridge.cpp +++ b/indra/newview/llplacesinventorybridge.cpp @@ -38,6 +38,7 @@ #include "llfloaterinventory.h" // for LLInventoryPanel #include "llfolderview.h" // for FIRST_SELECTED_ITEM +#include "llinventorypanel.h" static const std::string LANDMARKS_INVENTORY_LIST_NAME("landmarks_list"); @@ -83,7 +84,7 @@ void LLPlacesLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) // they should be synchronized with Places/My Landmarks/Gear menu. See EXT-1601 } - hideContextEntries(menu, items, disabled_items); + hide_context_entries(menu, items, disabled_items); } @@ -116,7 +117,7 @@ void LLPlacesFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) // repeat parent functionality sSelf = this; // necessary for "New Folder" functionality - hideContextEntries(menu, items, disabled_items); + hide_context_entries(menu, items, disabled_items); } } diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index ac7abf14485..a6f5465e1b4 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -89,7 +89,6 @@ #include "lltrans.h" #include "llviewercontrol.h" #include "llappviewer.h" -#include "llpanelinventory.h" const std::string HELLO_LSL = "default\n" diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp new file mode 100644 index 00000000000..8a1b97695d1 --- /dev/null +++ b/indra/newview/llsidepanelinventory.cpp @@ -0,0 +1,276 @@ +/** + * @file LLSidepanelInventory.cpp + * @brief Side Bar "Inventory" panel + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llsidepanelinventory.h" + +#include "llagent.h" +#include "llbutton.h" +#include "llinventorybridge.h" +#include "llinventorypanel.h" +#include "llpanelmaininventory.h" +#include "llsidepanelobjectinfo.h" +#include "lltabcontainer.h" + +static const S32 LANDMARK_FOLDERS_MENU_WIDTH = 250; +static const std::string AGENT_INFO_TYPE = "agent"; +static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark"; +static const std::string LANDMARK_INFO_TYPE = "landmark"; +static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place"; +static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history"; + +// Helper functions +static void setAllChildrenVisible(LLView* view, BOOL visible); + +static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); + +LLSidepanelInventory::LLSidepanelInventory() + : LLPanel(), + mSidepanelObjectInfo(NULL), + mItem(NULL) +{ + + //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() +} + +LLSidepanelInventory::~LLSidepanelInventory() +{ +} + +BOOL LLSidepanelInventory::postBuild() +{ + mInfoBtn = getChild<LLButton>("info_btn"); + mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this)); + + mShareBtn = getChild<LLButton>("share_btn"); + mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); + + mShareBtn = getChild<LLButton>("share_btn"); + mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); + + mWearBtn = getChild<LLButton>("wear_btn"); + mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this)); + + mPlayBtn = getChild<LLButton>("play_btn"); + mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this)); + + mTeleportBtn = getChild<LLButton>("teleport_btn"); + mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this)); + + mOverflowBtn = getChild<LLButton>("overflow_btn"); + mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this)); + + mTabContainer = getChild<LLTabContainer>("Inventory Tabs"); + mSidepanelObjectInfo = getChild<LLSidepanelObjectInfo>("sidepanel_object_info"); + + mPanelMainInventory = getChild<LLPanelMainInventory>("panel_main_inventory"); + mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); + + LLButton* back_btn = mSidepanelObjectInfo->getChild<LLButton>("back_btn"); + back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); + + return TRUE; +} + +void LLSidepanelInventory::onOpen(const LLSD& key) +{ + if(mSidepanelObjectInfo == NULL || key.size() == 0) + return; + + mItem = NULL; + + LLInventoryItem* item = gInventory.getItem(key["id"].asUUID()); + if (!item) + { + return; + } + setItem(item); + toggleObjectInfoPanel(TRUE); +} + +void LLSidepanelInventory::setItem(LLInventoryItem* item) +{ + if (!mSidepanelObjectInfo || !item) + return; + + mItem = item; + + LLAssetType::EType item_type = mItem->getActualType(); + if (item_type == LLAssetType::AT_LINK) + { + mItem = gInventory.getItem(mItem->getLinkedUUID()); + if (mItem.isNull()) + return; + } + + // Check if item is in agent's inventory and he has the permission to modify it. + BOOL is_object_editable = gInventory.isObjectDescendentOf(mItem->getUUID(), gInventory.getRootFolderID()) && + mItem->getPermissions().allowModifyBy(gAgent.getID()); + + mInfoBtn->setEnabled(is_object_editable); + // mSaveBtn->setEnabled(is_object_editable); + + mSidepanelObjectInfo->displayItemInfo(mItem); +} + +void LLSidepanelInventory::onInfoButtonClicked() +{ + LLInventoryItem *item = getSelectedItem(); + if (item) + { + setItem(item); + toggleObjectInfoPanel(TRUE); + } +} + +void LLSidepanelInventory::onShareButtonClicked() +{ +} + +void LLSidepanelInventory::performActionOnSelection(const std::string &action) +{ + LLInventoryPanel *panel = mPanelMainInventory->getActivePanel(); + LLFolderViewItem* current_item = panel->getRootFolder()->getCurSelectedItem(); + if (!current_item) + { + return; + } + current_item->getListener()->performAction(panel->getRootFolder(), panel->getModel(), action); +} + +void LLSidepanelInventory::onWearButtonClicked() +{ + performActionOnSelection("wear"); + performActionOnSelection("attach"); +} + +void LLSidepanelInventory::onPlayButtonClicked() +{ + performActionOnSelection("activate"); +} + +void LLSidepanelInventory::onTeleportButtonClicked() +{ + performActionOnSelection("teleport"); +} + +void LLSidepanelInventory::onOverflowButtonClicked() +{ +} + +void LLSidepanelInventory::onBackButtonClicked() +{ + if (!mSidepanelObjectInfo) + return; + + toggleObjectInfoPanel(FALSE); + + + updateVerbs(); +} + +void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) +{ + updateVerbs(); +} + +void LLSidepanelInventory::toggleObjectInfoPanel(BOOL visible) +{ + if (!mSidepanelObjectInfo) + return; + + mSidepanelObjectInfo->setVisible(visible); + mTabContainer->setVisible(!visible); + + if (visible) + { + mSidepanelObjectInfo->reset(); + mSidepanelObjectInfo->setEditMode(FALSE); + + LLRect rect = getRect(); + LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); + mSidepanelObjectInfo->reshape(new_rect.getWidth(),new_rect.getHeight()); + } +} + +void LLSidepanelInventory::updateVerbs() +{ + mInfoBtn->setEnabled(FALSE); + mShareBtn->setEnabled(FALSE); + + mWearBtn->setVisible(FALSE); + mWearBtn->setEnabled(FALSE); + mPlayBtn->setVisible(FALSE); + mPlayBtn->setEnabled(FALSE); + mTeleportBtn->setVisible(FALSE); + mTeleportBtn->setEnabled(FALSE); + + const LLInventoryItem *item = getSelectedItem(); + if (!item) + return; + + mInfoBtn->setEnabled(TRUE); + mShareBtn->setEnabled(TRUE); + + switch(item->getInventoryType()) + { + case LLInventoryType::IT_WEARABLE: + case LLInventoryType::IT_OBJECT: + case LLInventoryType::IT_ATTACHMENT: + mWearBtn->setVisible(TRUE); + mWearBtn->setEnabled(TRUE); + break; + case LLInventoryType::IT_SOUND: + case LLInventoryType::IT_GESTURE: + case LLInventoryType::IT_ANIMATION: + mPlayBtn->setVisible(TRUE); + mPlayBtn->setEnabled(TRUE); + break; + case LLInventoryType::IT_LANDMARK: + mTeleportBtn->setVisible(TRUE); + mTeleportBtn->setEnabled(TRUE); + break; + default: + break; + } +} + +LLInventoryItem *LLSidepanelInventory::getSelectedItem() +{ + LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); + if (!current_item) + { + return NULL; + } + const LLUUID &item_id = current_item->getListener()->getUUID(); + LLInventoryItem *item = gInventory.getItem(item_id); + return item; +} diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h new file mode 100644 index 00000000000..784f5e43b7c --- /dev/null +++ b/indra/newview/llsidepanelinventory.h @@ -0,0 +1,85 @@ +/** + * @file LLSidepanelInventory.h + * @brief Side Bar "Inventory" panel + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLSIDEPANELINVENTORY_H +#define LL_LLSIDEPANELINVENTORY_H + +#include "llpanel.h" + +class LLInventoryItem; +class LLSidepanelObjectInfo; +class LLTabContainer; +class LLPanelMainInventory; +class LLFolderViewItem; + +class LLSidepanelInventory : public LLPanel +{ +public: + LLSidepanelInventory(); + virtual ~LLSidepanelInventory(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + + void setItem(LLInventoryItem* item); + +protected: + LLInventoryItem *getSelectedItem(); + void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); + void onTabSelected(); + void toggleObjectInfoPanel(BOOL visible); + void updateVerbs(); + void performActionOnSelection(const std::string &action); + + LLTabContainer* mTabContainer; + LLSidepanelObjectInfo* mSidepanelObjectInfo; + LLPanelMainInventory* mPanelMainInventory; + + void onInfoButtonClicked(); + void onShareButtonClicked(); + void onWearButtonClicked(); + void onPlayButtonClicked(); + void onTeleportButtonClicked(); + void onOverflowButtonClicked(); + void onBackButtonClicked(); + + LLButton* mInfoBtn; + LLButton* mShareBtn; + LLButton* mWearBtn; + LLButton* mPlayBtn; + LLButton* mTeleportBtn; + LLButton* mOverflowBtn; + + // Pointer to a item + LLPointer<LLInventoryItem> mItem; +}; + +#endif //LL_LLSIDEPANELINVENTORY_H diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index b5aec1b80bc..9f0e2057125 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -47,7 +47,9 @@ #include "llfolderview.h" #include "llfoldervieweventlistener.h" #include "llinventory.h" +#include "llinventoryfunctions.h" #include "llinventorymodel.h" +#include "llinventorypanel.h" #include "llfloaterinventory.h" #include "lllineeditor.h" #include "llui.h" diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index e26a0776ff4..e78737fe0d5 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -38,6 +38,7 @@ #include "llbutton.h" #include "lliconctrl.h" +#include "llinventoryfunctions.h" #include "llnotify.h" #include "lltextbox.h" diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 366e5602bd8..470739baa90 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -38,6 +38,7 @@ #include "llagent.h" #include "llfoldertype.h" +#include "llfolderview.h" #include "llviewercontrol.h" #include "llconsole.h" #include "llinventorymodel.h" diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 864cf9d57bb..a2b0923df0c 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -50,6 +50,7 @@ #include "llfocusmgr.h" #include "llfontgl.h" #include "llinstantmessage.h" +#include "llinventorypanel.h" #include "llpermissionsflags.h" #include "llrect.h" #include "llsecondlifeurls.h" diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 320f0f83ff9..0a30b0069e1 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1,5722 +1,5723 @@ -/** - * @file llviewermessage.cpp - * @brief Dumping ground for viewer-side message system callbacks. - * - * $LicenseInfo:firstyear=2002&license=viewergpl$ - * - * Copyright (c) 2002-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llviewermessage.h" - -#include <deque> - -#include "llaudioengine.h" -#include "indra_constants.h" -#include "lscript_byteformat.h" -#include "mean_collision_data.h" -#include "llfloaterbump.h" -#include "llassetstorage.h" -#include "llcachename.h" -#include "llchat.h" -#include "lldbstrings.h" -#include "lleconomy.h" -#include "llfilepicker.h" -#include "llfloaterreg.h" -#include "llfocusmgr.h" -#include "llfollowcamparams.h" -#include "llinstantmessage.h" -#include "llquantize.h" -#include "llregionflags.h" -#include "llregionhandle.h" -#include "llsdserialize.h" -#include "llstring.h" -#include "llteleportflags.h" -#include "lltracker.h" -#include "lltransactionflags.h" -#include "llxfermanager.h" -#include "message.h" -#include "sound_ids.h" -#include "lltimer.h" -#include "llmd5.h" - -#include "llagent.h" -#include "llcallingcard.h" -#include "llconsole.h" -#include "llvieweraudio.h" -#include "llviewercontrol.h" -#include "lldrawpool.h" -#include "llfirstuse.h" -#include "llfloateranimpreview.h" -#include "llfloaterbuycurrency.h" -#include "llfloaterbuyland.h" -#include "llfloaterchat.h" -#include "llfloaterimagepreview.h" -#include "llfloaterland.h" -#include "llfloaterregioninfo.h" -#include "llfloaterlandholdings.h" -#include "llurldispatcher.h" -#include "llfloaterpostcard.h" -#include "llfloaterpreference.h" -#include "llfollowcam.h" -#include "llgroupnotify.h" -#include "llhudeffect.h" -#include "llhudeffecttrail.h" -#include "llhudmanager.h" -#include "llimpanel.h" -#include "llinventorymodel.h" -#include "llfloaterinventory.h" -#include "llmenugl.h" -#include "llmoveview.h" -#include "llmutelist.h" -#include "llnearbychat.h" -#include "llnotifications.h" -#include "llnotify.h" -#include "llpanelgrouplandmoney.h" -#include "llpanelplaces.h" -#include "llrecentpeople.h" -#include "llselectmgr.h" -#include "llsidetray.h" -#include "llstartup.h" -#include "llsky.h" -#include "llslurl.h" -#include "llstatenums.h" -#include "llstatusbar.h" -#include "llimview.h" -#include "lltool.h" -#include "lltoolbar.h" -#include "lltoolmgr.h" -#include "lltrans.h" -#include "llui.h" // for make_ui_sound -#include "lluploaddialog.h" -#include "llviewercamera.h" -#include "llviewergenericmessage.h" -#include "llviewerinventory.h" -#include "llviewermenu.h" -#include "llviewerobject.h" -#include "llviewerobjectlist.h" -#include "llviewerparcelmgr.h" -#include "llviewerpartsource.h" -#include "llviewerregion.h" -#include "llviewerstats.h" -#include "llviewertexteditor.h" -#include "llviewerthrottle.h" -#include "llviewerwindow.h" -#include "llvlmanager.h" -#include "llvoavatarself.h" -#include "llvotextbubble.h" -#include "llweb.h" -#include "llworld.h" -#include "pipeline.h" -#include "llappviewer.h" -#include "llfloaterworldmap.h" -#include "llviewerdisplay.h" -#include "llkeythrottle.h" -#include "llgroupactions.h" -#include "llagentui.h" -#include "llpanelblockedlist.h" -#include "llpanelplaceinfo.h" - -#include <boost/tokenizer.hpp> -#include <boost/algorithm/string/split.hpp> - -#if LL_WINDOWS // For Windows specific error handler -#include "llwindebug.h" // For the invalid message handler -#endif - -//#include "llnearbychathistory.h" -#include "llnotificationmanager.h" - -// -// Constants -// -const F32 BIRD_AUDIBLE_RADIUS = 32.0f; -const F32 SIT_DISTANCE_FROM_TARGET = 0.25f; -static const F32 LOGOUT_REPLY_TIME = 3.f; // Wait this long after LogoutReply before quitting. - -// Determine how quickly residents' scripts can issue question dialogs -// Allow bursts of up to 5 dialogs in 10 seconds. 10*2=20 seconds recovery if throttle kicks in -static const U32 LLREQUEST_PERMISSION_THROTTLE_LIMIT = 5; // requests -static const F32 LLREQUEST_PERMISSION_THROTTLE_INTERVAL = 10.0f; // seconds - -extern BOOL gDebugClicks; - -// function prototypes -void open_offer(const std::vector<LLUUID>& items, const std::string& from_name); -bool check_offer_throttle(const std::string& from_name, bool check_only); - -//inventory offer throttle globals -LLFrameTimer gThrottleTimer; -const U32 OFFER_THROTTLE_MAX_COUNT=5; //number of items per time period -const F32 OFFER_THROTTLE_TIME=10.f; //time period in seconds - -//script permissions -const std::string SCRIPT_QUESTIONS[SCRIPT_PERMISSION_EOF] = - { - "ScriptTakeMoney", - "ActOnControlInputs", - "RemapControlInputs", - "AnimateYourAvatar", - "AttachToYourAvatar", - "ReleaseOwnership", - "LinkAndDelink", - "AddAndRemoveJoints", - "ChangePermissions", - "TrackYourCamera", - "ControlYourCamera" - }; - -const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] = -{ - TRUE, // ScriptTakeMoney, - FALSE, // ActOnControlInputs - FALSE, // RemapControlInputs - FALSE, // AnimateYourAvatar - FALSE, // AttachToYourAvatar - FALSE, // ReleaseOwnership, - FALSE, // LinkAndDelink, - FALSE, // AddAndRemoveJoints - FALSE, // ChangePermissions - FALSE, // TrackYourCamera, - FALSE // ControlYourCamera -}; - -bool friendship_offer_callback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - LLUUID fid; - LLMessageSystem* msg = gMessageSystem; - const LLSD& payload = notification["payload"]; - - // add friend to recent people list - LLRecentPeople::instance().add(payload["from_id"]); - - switch(option) - { - case 0: - // accept - LLAvatarTracker::formFriendship(payload["from_id"]); - - fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); - - // This will also trigger an onlinenotification if the user is online - msg->newMessageFast(_PREHASH_AcceptFriendship); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_TransactionBlock); - msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]); - msg->nextBlockFast(_PREHASH_FolderData); - msg->addUUIDFast(_PREHASH_FolderID, fid); - msg->sendReliable(LLHost(payload["sender"].asString())); - break; - case 1: - // decline - // We no longer notify other viewers, but we DO still send - // the rejection to the simulator to delete the pending userop. - msg->newMessageFast(_PREHASH_DeclineFriendship); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_TransactionBlock); - msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]); - msg->sendReliable(LLHost(payload["sender"].asString())); - break; - default: - // close button probably, possibly timed out - break; - } - - return false; -} -static LLNotificationFunctorRegistration friendship_offer_callback_reg("OfferFriendship", friendship_offer_callback); -static LLNotificationFunctorRegistration friendship_offer_callback_reg_nm("OfferFriendshipNoMessage", friendship_offer_callback); - -//const char BUSY_AUTO_RESPONSE[] = "The Resident you messaged is in 'busy mode' which means they have " -// "requested not to be disturbed. Your message will still be shown in their IM " -// "panel for later viewing."; - -// -// Functions -// - -void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_group, - S32 trx_type, const std::string& desc) -{ - if(0 == amount || !region) return; - amount = abs(amount); - LL_INFOS("Messaging") << "give_money(" << uuid << "," << amount << ")"<< LL_ENDL; - if(can_afford_transaction(amount)) - { -// gStatusBar->debitBalance(amount); - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_MoneyTransferRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_MoneyData); - msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_DestID, uuid); - msg->addU8Fast(_PREHASH_Flags, pack_transaction_flags(FALSE, is_group)); - msg->addS32Fast(_PREHASH_Amount, amount); - msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY); - msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY); - msg->addS32Fast(_PREHASH_TransactionType, trx_type ); - msg->addStringFast(_PREHASH_Description, desc); - msg->sendReliable(region->getHost()); - } - else - { - LLFloaterBuyCurrency::buyCurrency("Giving", amount); - } -} - -void send_complete_agent_movement(const LLHost& sim_host) -{ - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_CompleteAgentMovement); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addU32Fast(_PREHASH_CircuitCode, msg->mOurCircuitCode); - msg->sendReliable(sim_host); -} - -void process_logout_reply(LLMessageSystem* msg, void**) -{ - // The server has told us it's ok to quit. - LL_DEBUGS("Messaging") << "process_logout_reply" << LL_ENDL; - - LLUUID agent_id; - msg->getUUID("AgentData", "AgentID", agent_id); - LLUUID session_id; - msg->getUUID("AgentData", "SessionID", session_id); - if((agent_id != gAgent.getID()) || (session_id != gAgent.getSessionID())) - { - LL_WARNS("Messaging") << "Bogus Logout Reply" << LL_ENDL; - } - - LLInventoryModel::update_map_t parents; - S32 count = msg->getNumberOfBlocksFast( _PREHASH_InventoryData ); - for(S32 i = 0; i < count; ++i) - { - LLUUID item_id; - msg->getUUIDFast(_PREHASH_InventoryData, _PREHASH_ItemID, item_id, i); - - if( (1 == count) && item_id.isNull() ) - { - // Detect dummy item. Indicates an empty list. - break; - } - - // We do not need to track the asset ids, just account for an - // updated inventory version. - LL_INFOS("Messaging") << "process_logout_reply itemID=" << item_id << LL_ENDL; - LLInventoryItem* item = gInventory.getItem( item_id ); - if( item ) - { - parents[item->getParentUUID()] = 0; - gInventory.addChangedMask(LLInventoryObserver::INTERNAL, item_id); - } - else - { - LL_INFOS("Messaging") << "process_logout_reply item not found: " << item_id << LL_ENDL; - } - } - LLAppViewer::instance()->forceQuit(); -} - -void process_layer_data(LLMessageSystem *mesgsys, void **user_data) -{ - LLViewerRegion *regionp = LLWorld::getInstance()->getRegion(mesgsys->getSender()); - - if (!regionp || gNoRender) - { - return; - } - - - S32 size; - S8 type; - - mesgsys->getS8Fast(_PREHASH_LayerID, _PREHASH_Type, type); - size = mesgsys->getSizeFast(_PREHASH_LayerData, _PREHASH_Data); - if (0 == size) - { - LL_WARNS("Messaging") << "Layer data has zero size." << LL_ENDL; - return; - } - if (size < 0) - { - // getSizeFast() is probably trying to tell us about an error - LL_WARNS("Messaging") << "getSizeFast() returned negative result: " - << size - << LL_ENDL; - return; - } - U8 *datap = new U8[size]; - mesgsys->getBinaryDataFast(_PREHASH_LayerData, _PREHASH_Data, datap, size); - LLVLData *vl_datap = new LLVLData(regionp, type, datap, size); - if (mesgsys->getReceiveCompressedSize()) - { - gVLManager.addLayerData(vl_datap, mesgsys->getReceiveCompressedSize()); - } - else - { - gVLManager.addLayerData(vl_datap, mesgsys->getReceiveSize()); - } -} - -// S32 exported_object_count = 0; -// S32 exported_image_count = 0; -// S32 current_object_count = 0; -// S32 current_image_count = 0; - -// extern LLNotifyBox *gExporterNotify; -// extern LLUUID gExporterRequestID; -// extern std::string gExportDirectory; - -// extern LLUploadDialog *gExportDialog; - -// std::string gExportedFile; - -// std::map<LLUUID, std::string> gImageChecksums; - -// void export_complete() -// { -// LLUploadDialog::modalUploadFinished(); -// gExporterRequestID.setNull(); -// gExportDirectory = ""; - -// LLFILE* fXML = LLFile::fopen(gExportedFile, "rb"); /* Flawfinder: ignore */ -// fseek(fXML, 0, SEEK_END); -// long length = ftell(fXML); -// fseek(fXML, 0, SEEK_SET); -// U8 *buffer = new U8[length + 1]; -// size_t nread = fread(buffer, 1, length, fXML); -// if (nread < (size_t) length) -// { -// LL_WARNS("Messaging") << "Short read" << LL_ENDL; -// } -// buffer[nread] = '\0'; -// fclose(fXML); - -// char *pos = (char *)buffer; -// while ((pos = strstr(pos+1, "<sl:image ")) != 0) -// { -// char *pos_check = strstr(pos, "checksum=\""); - -// if (pos_check) -// { -// char *pos_uuid = strstr(pos_check, "\">"); - -// if (pos_uuid) -// { -// char image_uuid_str[UUID_STR_SIZE]; /* Flawfinder: ignore */ -// memcpy(image_uuid_str, pos_uuid+2, UUID_STR_SIZE-1); /* Flawfinder: ignore */ -// image_uuid_str[UUID_STR_SIZE-1] = 0; - -// LLUUID image_uuid(image_uuid_str); - -// LL_INFOS("Messaging") << "Found UUID: " << image_uuid << LL_ENDL; - -// std::map<LLUUID, std::string>::iterator itor = gImageChecksums.find(image_uuid); -// if (itor != gImageChecksums.end()) -// { -// LL_INFOS("Messaging") << "Replacing with checksum: " << itor->second << LL_ENDL; -// if (!itor->second.empty()) -// { -// memcpy(&pos_check[10], itor->second.c_str(), 32); /* Flawfinder: ignore */ -// } -// } -// } -// } -// } - -// LLFILE* fXMLOut = LLFile::fopen(gExportedFile, "wb"); /* Flawfinder: ignore */ -// if (fwrite(buffer, 1, length, fXMLOut) != length) -// { -// LL_WARNS("Messaging") << "Short write" << LL_ENDL; -// } -// fclose(fXMLOut); - -// delete [] buffer; -// } - - -// void exported_item_complete(const LLTSCode status, void *user_data) -// { -// //std::string *filename = (std::string *)user_data; - -// if (status < LLTS_OK) -// { -// LL_WARNS("Messaging") << "Export failed!" << LL_ENDL; -// } -// else -// { -// ++current_object_count; -// if (current_image_count == exported_image_count && current_object_count == exported_object_count) -// { -// LL_INFOS("Messaging") << "*** Export complete ***" << LL_ENDL; - -// export_complete(); -// } -// else -// { -// gExportDialog->setMessage(llformat("Exported %d/%d object files, %d/%d textures.", current_object_count, exported_object_count, current_image_count, exported_image_count)); -// } -// } -// } - -// struct exported_image_info -// { -// LLUUID image_id; -// std::string filename; -// U32 image_num; -// }; - -// void exported_j2c_complete(const LLTSCode status, void *user_data) -// { -// exported_image_info *info = (exported_image_info *)user_data; -// LLUUID image_id = info->image_id; -// U32 image_num = info->image_num; -// std::string filename = info->filename; -// delete info; - -// if (status < LLTS_OK) -// { -// LL_WARNS("Messaging") << "Image download failed!" << LL_ENDL; -// } -// else -// { -// LLFILE* fIn = LLFile::fopen(filename, "rb"); /* Flawfinder: ignore */ -// if (fIn) -// { -// LLPointer<LLImageJ2C> ImageUtility = new LLImageJ2C; -// LLPointer<LLImageTGA> TargaUtility = new LLImageTGA; - -// fseek(fIn, 0, SEEK_END); -// S32 length = ftell(fIn); -// fseek(fIn, 0, SEEK_SET); -// U8 *buffer = ImageUtility->allocateData(length); -// if (fread(buffer, 1, length, fIn) != length) -// { -// LL_WARNS("Messaging") << "Short read" << LL_ENDL; -// } -// fclose(fIn); -// LLFile::remove(filename); - -// // Convert to TGA -// LLPointer<LLImageRaw> image = new LLImageRaw(); - -// ImageUtility->updateData(); -// ImageUtility->decode(image, 100000.0f); - -// TargaUtility->encode(image); -// U8 *data = TargaUtility->getData(); -// S32 data_size = TargaUtility->getDataSize(); - -// std::string file_path = gDirUtilp->getDirName(filename); - -// std::string output_file = llformat("%s/image-%03d.tga", file_path.c_str(), image_num);//filename; -// //S32 name_len = output_file.length(); -// //strcpy(&output_file[name_len-3], "tga"); -// LLFILE* fOut = LLFile::fopen(output_file, "wb"); /* Flawfinder: ignore */ -// char md5_hash_string[33]; /* Flawfinder: ignore */ -// strcpy(md5_hash_string, "00000000000000000000000000000000"); /* Flawfinder: ignore */ -// if (fOut) -// { -// if (fwrite(data, 1, data_size, fOut) != data_size) -// { -// LL_WARNS("Messaging") << "Short write" << LL_ENDL; -// } -// fseek(fOut, 0, SEEK_SET); -// fclose(fOut); -// fOut = LLFile::fopen(output_file, "rb"); /* Flawfinder: ignore */ -// LLMD5 my_md5_hash(fOut); -// my_md5_hash.hex_digest(md5_hash_string); -// } - -// gImageChecksums.insert(std::pair<LLUUID, std::string>(image_id, md5_hash_string)); -// } -// } - -// ++current_image_count; -// if (current_image_count == exported_image_count && current_object_count == exported_object_count) -// { -// LL_INFOS("Messaging") << "*** Export textures complete ***" << LL_ENDL; -// export_complete(); -// } -// else -// { -// gExportDialog->setMessage(llformat("Exported %d/%d object files, %d/%d textures.", current_object_count, exported_object_count, current_image_count, exported_image_count)); -// } -//} - -void process_derez_ack(LLMessageSystem*, void**) -{ - if(gViewerWindow) gViewerWindow->getWindow()->decBusyCount(); -} - -void process_places_reply(LLMessageSystem* msg, void** data) -{ - LLUUID query_id; - - msg->getUUID("AgentData", "QueryID", query_id); - if (query_id.isNull()) - { - LLFloaterLandHoldings::processPlacesReply(msg, data); - } - else if(gAgent.isInGroup(query_id)) - { - LLPanelGroupLandMoney::processPlacesReply(msg, data); - } - else - { - LL_WARNS("Messaging") << "Got invalid PlacesReply message" << LL_ENDL; - } -} - -void send_sound_trigger(const LLUUID& sound_id, F32 gain) -{ - if (sound_id.isNull() || gAgent.getRegion() == NULL) - { - // disconnected agent or zero guids don't get sent (no sound) - return; - } - - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_SoundTrigger); - msg->nextBlockFast(_PREHASH_SoundData); - msg->addUUIDFast(_PREHASH_SoundID, sound_id); - // Client untrusted, ids set on sim - msg->addUUIDFast(_PREHASH_OwnerID, LLUUID::null ); - msg->addUUIDFast(_PREHASH_ObjectID, LLUUID::null ); - msg->addUUIDFast(_PREHASH_ParentID, LLUUID::null ); - - msg->addU64Fast(_PREHASH_Handle, gAgent.getRegion()->getHandle()); - - LLVector3 position = gAgent.getPositionAgent(); - msg->addVector3Fast(_PREHASH_Position, position); - msg->addF32Fast(_PREHASH_Gain, gain); - - gAgent.sendMessage(); -} - -bool join_group_response(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - BOOL delete_context_data = TRUE; - bool accept_invite = false; - - LLUUID group_id = notification["payload"]["group_id"].asUUID(); - LLUUID transaction_id = notification["payload"]["transaction_id"].asUUID(); - std::string name = notification["payload"]["name"].asString(); - std::string message = notification["payload"]["message"].asString(); - S32 fee = notification["payload"]["fee"].asInteger(); - - if (option == 2 && !group_id.isNull()) - { - LLGroupActions::show(group_id); - LLSD args; - args["MESSAGE"] = message; - LLNotifications::instance().add("JoinGroup", args, notification["payload"]); - return false; - } - if(option == 0 && !group_id.isNull()) - { - // check for promotion or demotion. - S32 max_groups = MAX_AGENT_GROUPS; - if(gAgent.isInGroup(group_id)) ++max_groups; - - if(gAgent.mGroups.count() < max_groups) - { - accept_invite = true; - } - else - { - delete_context_data = FALSE; - LLSD args; - args["NAME"] = name; - args["INVITE"] = message; - LLNotifications::instance().add("JoinedTooManyGroupsMember", args, notification["payload"]); - } - } - - if (accept_invite) - { - // If there is a fee to join this group, make - // sure the user is sure they want to join. - if (fee > 0) - { - delete_context_data = FALSE; - LLSD args; - args["COST"] = llformat("%d", fee); - // Set the fee for next time to 0, so that we don't keep - // asking about a fee. - LLSD next_payload = notification["payload"]; - next_payload["fee"] = 0; - LLNotifications::instance().add("JoinGroupCanAfford", - args, - next_payload); - } - else - { - send_improved_im(group_id, - std::string("name"), - std::string("message"), - IM_ONLINE, - IM_GROUP_INVITATION_ACCEPT, - transaction_id); - } - } - else - { - send_improved_im(group_id, - std::string("name"), - std::string("message"), - IM_ONLINE, - IM_GROUP_INVITATION_DECLINE, - transaction_id); - } - - return false; -} -static LLNotificationFunctorRegistration jgr_1("JoinGroup", join_group_response); -static LLNotificationFunctorRegistration jgr_2("JoinedTooManyGroupsMember", join_group_response); -static LLNotificationFunctorRegistration jgr_3("JoinGroupCanAfford", join_group_response); - - -//----------------------------------------------------------------------------- -// Instant Message -//----------------------------------------------------------------------------- -class LLOpenAgentOffer : public LLInventoryFetchObserver -{ -public: - LLOpenAgentOffer(const std::string& from_name) : mFromName(from_name) {} - /*virtual*/ void done() - { - open_offer(mComplete, mFromName); - gInventory.removeObserver(this); - delete this; - } -private: - std::string mFromName; -}; - -//unlike the FetchObserver for AgentOffer, we only make one -//instance of the AddedObserver for TaskOffers -//and it never dies. We do this because we don't know the UUID of -//task offers until they are accepted, so we don't wouldn't -//know what to watch for, so instead we just watch for all additions. -class LLOpenTaskOffer : public LLInventoryAddedObserver -{ -protected: - /*virtual*/ void done() - { - open_offer(mAdded, ""); - mAdded.clear(); - } - }; - -//one global instance to bind them -LLOpenTaskOffer* gNewInventoryObserver=NULL; - -void start_new_inventory_observer() -{ - if (!gNewInventoryObserver) //task offer observer - { - // Observer is deleted by gInventory - gNewInventoryObserver = new LLOpenTaskOffer; - gInventory.addObserver(gNewInventoryObserver); - } -} - -class LLDiscardAgentOffer : public LLInventoryFetchComboObserver -{ -public: - LLDiscardAgentOffer(const LLUUID& folder_id, const LLUUID& object_id) : - mFolderID(folder_id), - mObjectID(object_id) {} - virtual ~LLDiscardAgentOffer() {} - virtual void done() - { - LL_DEBUGS("Messaging") << "LLDiscardAgentOffer::done()" << LL_ENDL; - LLUUID trash_id; - trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); - bool notify = false; - if(trash_id.notNull() && mObjectID.notNull()) - { - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(mFolderID, -1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(trash_id, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - gInventory.moveObject(mObjectID, trash_id); - LLInventoryObject* obj = gInventory.getObject(mObjectID); - if(obj) - { - // no need to restamp since this is already a freshly - // stamped item. - obj->updateParentOnServer(FALSE); - notify = true; - } - } - else - { - LL_WARNS("Messaging") << "DiscardAgentOffer unable to find: " - << (trash_id.isNull() ? "trash " : "") - << (mObjectID.isNull() ? "object" : "") << LL_ENDL; - } - gInventory.removeObserver(this); - if(notify) - { - gInventory.notifyObservers(); - } - delete this; - } -protected: - LLUUID mFolderID; - LLUUID mObjectID; -}; - - -//Returns TRUE if we are OK, FALSE if we are throttled -//Set check_only true if you want to know the throttle status -//without registering a hit -bool check_offer_throttle(const std::string& from_name, bool check_only) -{ - static U32 throttle_count; - static bool throttle_logged; - LLChat chat; - std::string log_message; - - if (!gSavedSettings.getBOOL("ShowNewInventory")) - return false; - - if (check_only) - { - return gThrottleTimer.hasExpired(); - } - - if(gThrottleTimer.checkExpirationAndReset(OFFER_THROTTLE_TIME)) - { - LL_DEBUGS("Messaging") << "Throttle Expired" << LL_ENDL; - throttle_count=1; - throttle_logged=false; - return true; - } - else //has not expired - { - LL_DEBUGS("Messaging") << "Throttle Not Expired, Count: " << throttle_count << LL_ENDL; - // When downloading the initial inventory we get a lot of new items - // coming in and can't tell that from spam. - if (LLStartUp::getStartupState() >= STATE_STARTED - && throttle_count >= OFFER_THROTTLE_MAX_COUNT) - { - if (!throttle_logged) - { - // Use the name of the last item giver, who is probably the person - // spamming you. - std::ostringstream message; - message << LLAppViewer::instance()->getSecondLifeTitle(); - if (!from_name.empty()) - { - message << ": Items coming in too fast from " << from_name; - } - else - { - message << ": Items coming in too fast"; - } - message << ", automatic preview disabled for " - << OFFER_THROTTLE_TIME << " seconds."; - chat.mText = message.str(); - //this is kinda important, so actually put it on screen - LLFloaterChat::addChat(chat, FALSE, FALSE); - throttle_logged=true; - } - return false; - } - else - { - throttle_count++; - return true; - } - } -} - -void open_offer(const std::vector<LLUUID>& items, const std::string& from_name) -{ - std::vector<LLUUID>::const_iterator it = items.begin(); - std::vector<LLUUID>::const_iterator end = items.end(); - LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH)); - LLInventoryItem* item; - for(; it != end; ++it) - { - const LLUUID& id = *it; - item = gInventory.getItem(id); - if(!item) - { - LL_WARNS("Messaging") << "Unable to show inventory item: " << id << LL_ENDL; - continue; - } - if(gInventory.isObjectDescendentOf(id, trash_id)) - { - continue; - } - LLAssetType::EType asset_type = item->getType(); - - //if we are throttled, don't display them - if (check_offer_throttle(from_name, false)) - { - // If we opened this ourselves, focus it - BOOL take_focus = from_name.empty() ? TAKE_FOCUS_YES : TAKE_FOCUS_NO; - switch(asset_type) - { - case LLAssetType::AT_NOTECARD: - LLFloaterReg::showInstance("preview_notecard", LLSD(id), take_focus); - break; - case LLAssetType::AT_LANDMARK: - { - LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID()); - LLSD args; - args["LANDMARK_NAME"] = item->getName(); - args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown"); - LLNotifications::instance().add("LandmarkCreated", args); - - // Created landmark is passed to Places panel to allow its editing. - LLPanelPlaces *panel = dynamic_cast<LLPanelPlaces*>(LLSideTray::getInstance()->showPanel("panel_places", LLSD())); - if (panel) - { - panel->setItem(item); - } - } - break; - case LLAssetType::AT_TEXTURE: - LLFloaterReg::showInstance("preview_texture", LLSD(id), take_focus); - break; - default: - break; - } - } - //highlight item, if it's not in the trash or lost+found - - // Don't auto-open the inventory floater - LLFloaterInventory* view = NULL; - if(gSavedSettings.getBOOL("ShowInInventory") && - asset_type != LLAssetType::AT_CALLINGCARD && - item->getInventoryType() != LLInventoryType::IT_ATTACHMENT && - !from_name.empty()) - { - view = LLFloaterInventory::showAgentInventory(); - } - else - { - view = LLFloaterInventory::getActiveInventory(); - } - if(!view) - { - return; - } - - //Trash Check - LLUUID trash_id; - trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); - if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) - { - return; - } - LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); - //BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view); - BOOL user_is_away = gAwayTimer.getStarted(); - - // don't select lost and found items if the user is active - if (gInventory.isObjectDescendentOf(item->getUUID(), lost_and_found_id) - && !user_is_away) - { - return; - } - - //Not sure about this check. Could make it easy to miss incoming items. - //don't dick with highlight while the user is working - //if(inventory_has_focus && !user_is_away) - // break; - LL_DEBUGS("Messaging") << "Highlighting" << item->getUUID() << LL_ENDL; - //highlight item - - if (view->getPanel()) - { - LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus(); - view->getPanel()->setSelection(item->getUUID(), TAKE_FOCUS_NO); - gFocusMgr.setKeyboardFocus(focus_ctrl); - } - } -} - -void inventory_offer_mute_callback(const LLUUID& blocked_id, - const std::string& first_name, - const std::string& last_name, - BOOL is_group) -{ - std::string from_name; - LLMute::EType type; - - if (is_group) - { - type = LLMute::GROUP; - from_name = first_name; - } - else - { - type = LLMute::AGENT; - from_name = first_name + " " + last_name; - } - - LLMute mute(blocked_id, from_name, type); - if (LLMuteList::getInstance()->add(mute)) - { - LLPanelBlockedList::showPanelAndSelect(blocked_id); - } - - // purge the message queue of any previously queued inventory offers from the same source. - class OfferMatcher : public LLNotifyBoxView::Matcher - { - public: - OfferMatcher(const LLUUID& to_block) : blocked_id(to_block) {} - BOOL matches(const LLNotificationPtr notification) const - { - if(notification->getName() == "ObjectGiveItem" - || notification->getName() == "ObjectGiveItemUnknownUser" - || notification->getName() == "UserGiveItem") - { - return (notification->getPayload()["from_id"].asUUID() == blocked_id); - } - return FALSE; - } - private: - const LLUUID& blocked_id; - }; - gNotifyBoxView->purgeMessagesMatching(OfferMatcher(blocked_id)); -} - -LLOfferInfo::LLOfferInfo(const LLSD& sd) -{ - mIM = (EInstantMessage)sd["im_type"].asInteger(); - mFromID = sd["from_id"].asUUID(); - mFromGroup = sd["from_group"].asBoolean(); - mFromObject = sd["from_object"].asBoolean(); - mTransactionID = sd["transaction_id"].asUUID(); - mFolderID = sd["folder_id"].asUUID(); - mObjectID = sd["object_id"].asUUID(); - mType = LLAssetType::lookup(sd["type"].asString().c_str()); - mFromName = sd["from_name"].asString(); - mDesc = sd["description"].asString(); - mHost = LLHost(sd["sender"].asString()); -} - -LLSD LLOfferInfo::asLLSD() -{ - LLSD sd; - sd["im_type"] = mIM; - sd["from_id"] = mFromID; - sd["from_group"] = mFromGroup; - sd["from_object"] = mFromObject; - sd["transaction_id"] = mTransactionID; - sd["folder_id"] = mFolderID; - sd["object_id"] = mObjectID; - sd["type"] = LLAssetType::lookup(mType); - sd["from_name"] = mFromName; - sd["description"] = mDesc; - sd["sender"] = mHost.getIPandPort(); - return sd; -} - -bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& response) - { - LLChat chat; - std::string log_message; - S32 button = LLNotification::getSelectedOption(notification, response); - - // For muting, we need to add the mute, then decline the offer. - // This must be done here because: - // * callback may be called immediately, - // * adding the mute sends a message, - // * we can't build two messages at once. - if (2 == button) - { - gCacheName->get(mFromID, mFromGroup, &inventory_offer_mute_callback); - } - - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_ImprovedInstantMessage); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_MessageBlock); - msg->addBOOLFast(_PREHASH_FromGroup, FALSE); - msg->addUUIDFast(_PREHASH_ToAgentID, mFromID); - msg->addU8Fast(_PREHASH_Offline, IM_ONLINE); - msg->addUUIDFast(_PREHASH_ID, mTransactionID); - msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary - std::string name; - LLAgentUI::buildFullname(name); - msg->addStringFast(_PREHASH_FromAgentName, name); - msg->addStringFast(_PREHASH_Message, ""); - msg->addU32Fast(_PREHASH_ParentEstateID, 0); - msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null); - msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent()); - LLInventoryObserver* opener = NULL; - LLViewerInventoryCategory* catp = NULL; - catp = (LLViewerInventoryCategory*)gInventory.getCategory(mObjectID); - LLViewerInventoryItem* itemp = NULL; - if(!catp) - { - itemp = (LLViewerInventoryItem*)gInventory.getItem(mObjectID); - } - - std::string from_string; // Used in the pop-up. - std::string chatHistory_string; // Used in chat history. - if (mFromObject == TRUE) - { - if (mFromGroup) - { - std::string group_name; - if (gCacheName->getGroupName(mFromID, group_name)) - { - from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'" - + mFromName + LLTrans::getString("'") +" " + LLTrans::getString("InvOfferOwnedByGroup") - + " "+ "'" + group_name + "'"; - - chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByGroup") - + " " + group_name + "'"; - } - else - { - from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'" - + mFromName +"'"+ " " + LLTrans::getString("InvOfferOwnedByUnknownGroup"); - chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownGroup"); - } - } - else - { - std::string first_name, last_name; - if (gCacheName->getName(mFromID, first_name, last_name)) - { - from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+ LLTrans::getString("'") + mFromName - + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedBy") + first_name + " " + last_name; - chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedBy") + " " + first_name + " " + last_name; - } - else - { - from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+LLTrans::getString("'") - + mFromName + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedByUnknownUser"); - chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownUser"); - } - } - } - else - { - from_string = chatHistory_string = mFromName; - } - - bool busy=FALSE; - - switch(button) - { - case IOR_ACCEPT: - // ACCEPT. The math for the dialog works, because the accept - // for inventory_offered, task_inventory_offer or - // group_notice_inventory is 1 greater than the offer integer value. - // Generates IM_INVENTORY_ACCEPTED, IM_TASK_INVENTORY_ACCEPTED, - // or IM_GROUP_NOTICE_INVENTORY_ACCEPTED - msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1)); - msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData), - sizeof(mFolderID.mData)); - // send the message - msg->sendReliable(mHost); - - //don't spam them if they are getting flooded - if (check_offer_throttle(mFromName, true)) - { - log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString("."); - chat.mText = log_message; - LLFloaterChat::addChatHistory(chat); - } - - // we will want to open this item when it comes back. - LL_DEBUGS("Messaging") << "Initializing an opener for tid: " << mTransactionID - << LL_ENDL; - switch (mIM) - { - case IM_INVENTORY_OFFERED: - { - // This is an offer from an agent. In this case, the back - // end has already copied the items into your inventory, - // so we can fetch it out of our inventory. - LLInventoryFetchObserver::item_ref_t items; - items.push_back(mObjectID); - LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(from_string); - open_agent_offer->fetchItems(items); - if(catp || (itemp && itemp->isComplete())) - { - open_agent_offer->done(); - } - else - { - opener = open_agent_offer; - } - } - break; - case IM_TASK_INVENTORY_OFFERED: - case IM_GROUP_NOTICE: - case IM_GROUP_NOTICE_REQUESTED: - { - // This is an offer from a task or group. - // We don't use a new instance of an opener - // We instead use the singular observer gOpenTaskOffer - // Since it already exists, we don't need to actually do anything - } - break; - default: - LL_WARNS("Messaging") << "inventory_offer_callback: unknown offer type" << LL_ENDL; - break; - } // end switch (mIM) - break; - - case IOR_BUSY: - //Busy falls through to decline. Says to make busy message. - busy=TRUE; - case IOR_MUTE: - // MUTE falls through to decline - case IOR_DECLINE: - // DECLINE. The math for the dialog works, because the decline - // for inventory_offered, task_inventory_offer or - // group_notice_inventory is 2 greater than the offer integer value. - // Generates IM_INVENTORY_DECLINED, IM_TASK_INVENTORY_DECLINED, - // or IM_GROUP_NOTICE_INVENTORY_DECLINED - default: - // close button probably (or any of the fall-throughs from above) - msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 2)); - msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE); - // send the message - msg->sendReliable(mHost); - - log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +"."; - chat.mText = log_message; - if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) ) // muting for SL-42269 - { - chat.mMuted = TRUE; - } - LLFloaterChat::addChatHistory(chat); - - // If it's from an agent, we have to fetch the item to throw - // it away. If it's from a task or group, just denying the - // request will suffice to discard the item. - if(IM_INVENTORY_OFFERED == mIM) - { - LLInventoryFetchComboObserver::folder_ref_t folders; - LLInventoryFetchComboObserver::item_ref_t items; - items.push_back(mObjectID); - LLDiscardAgentOffer* discard_agent_offer; - discard_agent_offer = new LLDiscardAgentOffer(mFolderID, mObjectID); - discard_agent_offer->fetch(folders, items); - if(catp || (itemp && itemp->isComplete())) - { - discard_agent_offer->done(); - } - else - { - opener = discard_agent_offer; - } - - } - if (busy && (!mFromGroup && !mFromObject)) - { - busy_message(msg,mFromID); - } - break; - } - - if(IM_INVENTORY_OFFERED == mIM) - { - // add buddy to recent people list - LLRecentPeople::instance().add(mFromID); - } - - if(opener) - { - gInventory.addObserver(opener); - } - - delete this; - return false; -} - - -void inventory_offer_handler(LLOfferInfo* info, BOOL from_task) -{ - //Until throttling is implmented, busy mode should reject inventory instead of silently - //accepting it. SEE SL-39554 - if (gAgent.getBusy()) - { - info->forceResponse(IOR_BUSY); - return; - } - - //If muted, don't even go through the messaging stuff. Just curtail the offer here. - if (LLMuteList::getInstance()->isMuted(info->mFromID, info->mFromName)) - { - info->forceResponse(IOR_MUTE); - return; - } - - // Avoid the Accept/Discard dialog if the user so desires. JC - if (gSavedSettings.getBOOL("AutoAcceptNewInventory") - && (info->mType == LLAssetType::AT_NOTECARD - || info->mType == LLAssetType::AT_LANDMARK - || info->mType == LLAssetType::AT_TEXTURE)) - { - // For certain types, just accept the items into the inventory, - // and possibly open them on receipt depending upon "ShowNewInventory". - info->forceResponse(IOR_ACCEPT); - return; - } - - // Strip any SLURL from the message display. (DEV-2754) - std::string msg = info->mDesc; - int indx = msg.find(" ( http://slurl.com/secondlife/"); - if(indx >= 0) - { - LLStringUtil::truncate(msg, indx); - } - - LLSD args; - args["[OBJECTNAME]"] = msg; - - LLSD payload; - - // must protect against a NULL return from lookupHumanReadable() - std::string typestr = ll_safe_string(LLAssetType::lookupHumanReadable(info->mType)); - if (!typestr.empty()) - { - args["OBJECTTYPE"] = typestr; - } - else - { - LL_WARNS("Messaging") << "LLAssetType::lookupHumanReadable() returned NULL - probably bad asset type: " << info->mType << LL_ENDL; - args["OBJECTTYPE"] = ""; - - // This seems safest, rather than propagating bogosity - LL_WARNS("Messaging") << "Forcing an inventory-decline for probably-bad asset type." << LL_ENDL; - info->forceResponse(IOR_DECLINE); - return; - } - - // Name cache callbacks don't store userdata, so can't save - // off the LLOfferInfo. Argh. - BOOL name_found = FALSE; - if (info->mFromGroup) - { - std::string group_name; - if (gCacheName->getGroupName(info->mFromID, group_name)) - { - args["FIRST"] = group_name; - args["LAST"] = ""; - name_found = TRUE; - } - } - else - { - std::string first_name, last_name; - if (gCacheName->getName(info->mFromID, first_name, last_name)) - { - args["FIRST"] = first_name; - args["LAST"] = last_name; - name_found = TRUE; - } - } - - payload["from_id"] = info->mFromID; - args["OBJECTFROMNAME"] = info->mFromName; - args["NAME"] = info->mFromName; - - LLNotification::Params p("ObjectGiveItem"); - p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2)); - - if (from_task) - { - p.name = name_found ? "ObjectGiveItem" : "ObjectGiveItemUnknownUser"; - } - else - { - p.name = "UserGiveItem"; - } - - LLNotifications::instance().add(p); -} - -bool lure_callback(const LLSD& notification, const LLSD& response) -{ - S32 option = 0; - if (response.isInteger()) - { - option = response.asInteger(); - } - else - { - option = LLNotification::getSelectedOption(notification, response); - } - - LLUUID from_id = notification["payload"]["from_id"].asUUID(); - LLUUID lure_id = notification["payload"]["lure_id"].asUUID(); - BOOL godlike = notification["payload"]["godlike"].asBoolean(); - - switch(option) - { - case 0: - { - // accept - gAgent.teleportViaLure(lure_id, godlike); - } - break; - case 1: - default: - // decline - send_simple_im(from_id, - LLStringUtil::null, - IM_LURE_DECLINED, - lure_id); - break; - } - return false; -} -static LLNotificationFunctorRegistration lure_callback_reg("TeleportOffered", lure_callback); - -bool goto_url_callback(const LLSD& notification, const LLSD& response) -{ - std::string url = notification["payload"]["url"].asString(); - S32 option = LLNotification::getSelectedOption(notification, response); - if(1 == option) - { - LLWeb::loadURL(url); - } - return false; -} -static LLNotificationFunctorRegistration goto_url_callback_reg("GotoURL", goto_url_callback); - -void process_improved_im(LLMessageSystem *msg, void **user_data) -{ - if (gNoRender) - { - return; - } - LLUUID from_id; - BOOL from_group; - LLUUID to_id; - U8 offline; - U8 d = 0; - LLUUID session_id; - U32 timestamp; - std::string name; - std::string message; - U32 parent_estate_id = 0; - LLUUID region_id; - LLVector3 position; - U8 binary_bucket[MTUBYTES]; - S32 binary_bucket_size; - LLChat chat; - std::string buffer; - - // *TODO: Translate - need to fix the full name to first/last (maybe) - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, from_id); - msg->getBOOLFast(_PREHASH_MessageBlock, _PREHASH_FromGroup, from_group); - msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ToAgentID, to_id); - msg->getU8Fast( _PREHASH_MessageBlock, _PREHASH_Offline, offline); - msg->getU8Fast( _PREHASH_MessageBlock, _PREHASH_Dialog, d); - msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ID, session_id); - msg->getU32Fast( _PREHASH_MessageBlock, _PREHASH_Timestamp, timestamp); - //msg->getData("MessageBlock", "Count", &count); - msg->getStringFast(_PREHASH_MessageBlock, _PREHASH_FromAgentName, name); - msg->getStringFast(_PREHASH_MessageBlock, _PREHASH_Message, message); - msg->getU32Fast(_PREHASH_MessageBlock, _PREHASH_ParentEstateID, parent_estate_id); - msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_RegionID, region_id); - msg->getVector3Fast(_PREHASH_MessageBlock, _PREHASH_Position, position); - msg->getBinaryDataFast( _PREHASH_MessageBlock, _PREHASH_BinaryBucket, binary_bucket, 0, 0, MTUBYTES); - binary_bucket_size = msg->getSizeFast(_PREHASH_MessageBlock, _PREHASH_BinaryBucket); - EInstantMessage dialog = (EInstantMessage)d; - - // make sure that we don't have an empty or all-whitespace name - LLStringUtil::trim(name); - if (name.empty()) - { - name = LLTrans::getString("Unnamed"); - } - - BOOL is_busy = gAgent.getBusy(); - BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat); - BOOL is_linden = LLMuteList::getInstance()->isLinden(name); - BOOL is_owned_by_me = FALSE; - BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true; - BOOL accept_im_from_only_friend = gSavedSettings.getBOOL("VoiceCallsFriendsOnly"); - - chat.mMuted = is_muted && !is_linden; - chat.mFromID = from_id; - chat.mFromName = name; - chat.mSourceType = (from_id.isNull() || (name == std::string(SYSTEM_FROM))) ? CHAT_SOURCE_SYSTEM : CHAT_SOURCE_AGENT; - - LLViewerObject *source = gObjectList.findObject(session_id); //Session ID is probably the wrong thing. - if (source) - { - is_owned_by_me = source->permYouOwner(); - } - - std::string separator_string(": "); - int message_offset = 0; - - //Handle IRC styled /me messages. - std::string prefix = message.substr(0, 4); - if (prefix == "/me " || prefix == "/me'") - { - separator_string = ""; - message_offset = 3; - } - - LLSD args; - switch(dialog) - { - case IM_CONSOLE_AND_CHAT_HISTORY: - // These are used for system messages, hence don't need the name, - // as it is always "Second Life". - // *TODO: Translate - args["MESSAGE"] = message; - - // Note: don't put the message in the IM history, even though was sent - // via the IM mechanism. - LLNotifications::instance().add("SystemMessageTip",args); - break; - - case IM_NOTHING_SPECIAL: - // Don't show dialog, just do IM - if (!gAgent.isGodlike() - && gAgent.getRegion()->isPrelude() - && to_id.isNull() ) - { - // do nothing -- don't distract newbies in - // Prelude with global IMs - } - else if (offline == IM_ONLINE && !is_linden && is_busy && name != SYSTEM_FROM) - { - // return a standard "busy" message, but only do it to online IM - // (i.e. not other auto responses and not store-and-forward IM) - if (!gIMMgr->hasSession(session_id)) - { - // if there is not a panel for this conversation (i.e. it is a new IM conversation - // initiated by the other party) then... - std::string my_name; - LLAgentUI::buildFullname(my_name); - std::string response = gSavedPerAccountSettings.getString("BusyModeResponse2"); - pack_instant_message( - gMessageSystem, - gAgent.getID(), - FALSE, - gAgent.getSessionID(), - from_id, - my_name, - response, - IM_ONLINE, - IM_BUSY_AUTO_RESPONSE, - session_id); - gAgent.sendReliableMessage(); - } - - // now store incoming IM in chat history - - buffer = message.substr(message_offset); - - LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL; - - // add to IM panel, but do not bother the user - gIMMgr->addMessage( - session_id, - from_id, - name, - buffer, - LLStringUtil::null, - dialog, - parent_estate_id, - region_id, - position, - true); - - // pretend this is chat generated by self, so it does not show up on screen - chat.mText = std::string("IM: ") + name + separator_string + message.substr(message_offset); - LLFloaterChat::addChat( chat, TRUE, TRUE ); - } - else if (from_id.isNull()) - { - // Messages from "Second Life" ID don't go to IM history - // messages which should be routed to IM window come from a user ID with name=SYSTEM_NAME - chat.mText = name + ": " + message; - LLFloaterChat::addChat(chat, FALSE, FALSE); - } - else if (to_id.isNull()) - { - // Message to everyone from GOD - args["NAME"] = name; - args["MESSAGE"] = message; - LLNotifications::instance().add("GodMessage", args); - - // Treat like a system message and put in chat history. - // Claim to be from a local agent so it doesn't go into - // console. - chat.mText = name + separator_string + message.substr(message_offset); - BOOL local_agent = TRUE; - LLFloaterChat::addChat(chat, FALSE, local_agent); - } - else - { - // standard message, not from system - std::string saved; - if(offline == IM_OFFLINE) - { - saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str()); - } - buffer = saved + message.substr(message_offset); - - LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL; - - bool mute_im = is_muted; - if(accept_im_from_only_friend&&!is_friend) - { - mute_im = true; - } - if (!mute_im || is_linden) - { - gIMMgr->addMessage( - session_id, - from_id, - name, - buffer, - LLStringUtil::null, - dialog, - parent_estate_id, - region_id, - position, - true); - chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset); - - BOOL local_agent = FALSE; - LLFloaterChat::addChat( chat, TRUE, local_agent ); - } - else - { - // muted user, so don't start an IM session, just record line in chat - // history. Pretend the chat is from a local agent, - // so it will go into the history but not be shown on screen. - chat.mText = buffer; - BOOL local_agent = TRUE; - LLFloaterChat::addChat( chat, TRUE, local_agent ); - } - } - break; - - case IM_TYPING_START: - { - LLPointer<LLIMInfo> im_info = new LLIMInfo(gMessageSystem); - gIMMgr->processIMTypingStart(im_info); - } - break; - - case IM_TYPING_STOP: - { - LLPointer<LLIMInfo> im_info = new LLIMInfo(gMessageSystem); - gIMMgr->processIMTypingStop(im_info); - } - break; - - case IM_MESSAGEBOX: - { - // This is a block, modeless dialog. - //*TODO: Translate - args["MESSAGE"] = message; - LLNotifications::instance().add("SystemMessage", args); - } - break; - case IM_GROUP_NOTICE: - case IM_GROUP_NOTICE_REQUESTED: - { - LL_INFOS("Messaging") << "Received IM_GROUP_NOTICE message." << LL_ENDL; - // Read the binary bucket for more information. - struct notice_bucket_header_t - { - U8 has_inventory; - U8 asset_type; - LLUUID group_id; - }; - struct notice_bucket_full_t - { - struct notice_bucket_header_t header; - U8 item_name[DB_INV_ITEM_NAME_BUF_SIZE]; - }* notice_bin_bucket; - - // Make sure the binary bucket is big enough to hold the header - // and a null terminated item name. - if ( (binary_bucket_size < (S32)((sizeof(notice_bucket_header_t) + sizeof(U8)))) - || (binary_bucket[binary_bucket_size - 1] != '\0') ) - { - LL_WARNS("Messaging") << "Malformed group notice binary bucket" << LL_ENDL; - break; - } - - notice_bin_bucket = (struct notice_bucket_full_t*) &binary_bucket[0]; - U8 has_inventory = notice_bin_bucket->header.has_inventory; - U8 asset_type = notice_bin_bucket->header.asset_type; - LLUUID group_id = notice_bin_bucket->header.group_id; - std::string item_name = ll_safe_string((const char*) notice_bin_bucket->item_name); - - // If there is inventory, give the user the inventory offer. - LLOfferInfo* info = NULL; - - if (has_inventory) - { - info = new LLOfferInfo; - - info->mIM = IM_GROUP_NOTICE; - info->mFromID = from_id; - info->mFromGroup = from_group; - info->mTransactionID = session_id; - info->mType = (LLAssetType::EType) asset_type; - info->mFolderID = gInventory.findCategoryUUIDForType(info->mType); - std::string from_name; - - from_name += "A group member named "; - from_name += name; - - info->mFromName = from_name; - info->mDesc = item_name; - info->mHost = msg->getSender(); - } - - std::string str(message); - - // Tokenize the string. - // TODO: Support escaped tokens ("||" -> "|") - typedef boost::tokenizer<boost::char_separator<char> > tokenizer; - boost::char_separator<char> sep("|","",boost::keep_empty_tokens); - tokenizer tokens(str, sep); - tokenizer::iterator iter = tokens.begin(); - - std::string subj(*iter++); - std::string mes(*iter++); - - // Send the notification down the new path. - // For requested notices, we don't want to send the popups. - if (dialog != IM_GROUP_NOTICE_REQUESTED) - { - LLSD payload; - payload["subject"] = subj; - payload["message"] = mes; - payload["sender_name"] = name; - payload["group_id"] = group_id; - payload["inventory_name"] = item_name; - payload["inventory_offer"] = info ? info->asLLSD() : LLSD(); - - LLSD args; - args["SUBJECT"] = subj; - args["MESSAGE"] = mes; - LLNotifications::instance().add(LLNotification::Params("GroupNotice").substitutions(args).payload(payload).time_stamp(timestamp)); - } - - // Also send down the old path for now. - if (IM_GROUP_NOTICE_REQUESTED == dialog) - { - - LLPanelGroup::showNotice(subj,mes,group_id,has_inventory,item_name,info); - } - } - break; - case IM_GROUP_INVITATION: - { - //if (!is_linden && (is_busy || is_muted)) - if ((is_busy || is_muted)) - { - LLMessageSystem *msg = gMessageSystem; - busy_message(msg,from_id); - } - else - { - LL_INFOS("Messaging") << "Received IM_GROUP_INVITATION message." << LL_ENDL; - // Read the binary bucket for more information. - struct invite_bucket_t - { - S32 membership_fee; - LLUUID role_id; - }* invite_bucket; - - // Make sure the binary bucket is the correct size. - if (binary_bucket_size != sizeof(invite_bucket_t)) - { - LL_WARNS("Messaging") << "Malformed group invite binary bucket" << LL_ENDL; - break; - } - - invite_bucket = (struct invite_bucket_t*) &binary_bucket[0]; - S32 membership_fee = ntohl(invite_bucket->membership_fee); - - LLSD payload; - payload["transaction_id"] = session_id; - payload["group_id"] = from_id; - payload["name"] = name; - payload["message"] = message; - payload["fee"] = membership_fee; - - LLSD args; - args["MESSAGE"] = message; - LLNotifications::instance().add("JoinGroup", args, payload, join_group_response); - } - } - break; - - case IM_INVENTORY_OFFERED: - case IM_TASK_INVENTORY_OFFERED: - // Someone has offered us some inventory. - { - LLOfferInfo* info = new LLOfferInfo; - bool mute_im = false; - if (IM_INVENTORY_OFFERED == dialog) - { - struct offer_agent_bucket_t - { - S8 asset_type; - LLUUID object_id; - }* bucketp; - - if (sizeof(offer_agent_bucket_t) != binary_bucket_size) - { - LL_WARNS("Messaging") << "Malformed inventory offer from agent" << LL_ENDL; - break; - } - bucketp = (struct offer_agent_bucket_t*) &binary_bucket[0]; - info->mType = (LLAssetType::EType) bucketp->asset_type; - info->mObjectID = bucketp->object_id; - - if(accept_im_from_only_friend&&!is_friend) - { - mute_im = true; - } - } - else - { - if (sizeof(S8) != binary_bucket_size) - { - LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL; - break; - } - info->mType = (LLAssetType::EType) binary_bucket[0]; - info->mObjectID = LLUUID::null; - } - - info->mIM = dialog; - info->mFromID = from_id; - info->mFromGroup = from_group; - info->mTransactionID = session_id; - info->mFolderID = gInventory.findCategoryUUIDForType(info->mType); - - if (dialog == IM_TASK_INVENTORY_OFFERED) - { - info->mFromObject = TRUE; - } - else - { - info->mFromObject = FALSE; - } - info->mFromName = name; - info->mDesc = message; - info->mHost = msg->getSender(); - //if (((is_busy && !is_owned_by_me) || is_muted)) - if ( is_muted || mute_im) - { - // Same as closing window - info->forceResponse(IOR_DECLINE); - } - else - { - inventory_offer_handler(info, dialog == IM_TASK_INVENTORY_OFFERED); - } - } - break; - - case IM_INVENTORY_ACCEPTED: - { - args["NAME"] = name; - LLNotifications::instance().add("InventoryAccepted", args); - break; - } - case IM_INVENTORY_DECLINED: - { - args["NAME"] = name; - LLNotifications::instance().add("InventoryDeclined", args); - break; - } - // TODO: _DEPRECATED suffix as part of vote removal - DEV-24856 - case IM_GROUP_VOTE: - { - LL_WARNS("Messaging") << "Received IM: IM_GROUP_VOTE_DEPRECATED" << LL_ENDL; - } - break; - - case IM_GROUP_ELECTION_DEPRECATED: - { - LL_WARNS("Messaging") << "Received IM: IM_GROUP_ELECTION_DEPRECATED" << LL_ENDL; - } - break; - - case IM_SESSION_SEND: - { - if (!is_linden && is_busy) - { - return; - } - - // Only show messages if we have a session open (which - // should happen after you get an "invitation" - if ( !gIMMgr->hasSession(session_id) ) - { - return; - } - - // standard message, not from system - std::string saved; - if(offline == IM_OFFLINE) - { - saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str()); - } - buffer = saved + message.substr(message_offset); - BOOL is_this_agent = FALSE; - if(from_id == gAgentID) - { - is_this_agent = TRUE; - } - gIMMgr->addMessage( - session_id, - from_id, - name, - buffer, - ll_safe_string((char*)binary_bucket), - IM_SESSION_INVITE, - parent_estate_id, - region_id, - position, - true); - - chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset); - LLFloaterChat::addChat(chat, TRUE, is_this_agent); - } - break; - - case IM_FROM_TASK: - { - if (is_busy && !is_owned_by_me) - { - return; - } - - LLSD substitutions; - substitutions["MSG"] = message.substr(message_offset); - LLNotifications::instance().add("ServerObjectMessage", substitutions); - } - break; - case IM_FROM_TASK_AS_ALERT: - if (is_busy && !is_owned_by_me) - { - return; - } - { - // Construct a viewer alert for this message. - args["NAME"] = name; - args["MESSAGE"] = message; - LLNotifications::instance().add("ObjectMessage", args); - } - break; - case IM_BUSY_AUTO_RESPONSE: - if (is_muted) - { - LL_DEBUGS("Messaging") << "Ignoring busy response from " << from_id << LL_ENDL; - return; - } - else - { - // TODO: after LLTrans hits release, get "busy response" into translatable file - buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.substr(message_offset).c_str()); - gIMMgr->addMessage(session_id, from_id, name, buffer); - } - break; - - case IM_LURE_USER: - { - if (is_muted) - { - return; - } - else if (is_busy) - { - busy_message(msg,from_id); - } - else - { - LLSD args; - // *TODO: Translate -> [FIRST] [LAST] (maybe) - args["NAME"] = name; - args["MESSAGE"] = message; - LLSD payload; - payload["from_id"] = from_id; - payload["lure_id"] = session_id; - payload["godlike"] = FALSE; - LLNotifications::instance().add("TeleportOffered", args, payload); - } - } - break; - - case IM_GODLIKE_LURE_USER: - { - LLSD payload; - payload["from_id"] = from_id; - payload["lure_id"] = session_id; - payload["godlike"] = TRUE; - // do not show a message box, because you're about to be - // teleported. - LLNotifications::instance().forceResponse(LLNotification::Params("TeleportOffered").payload(payload), 0); - } - break; - - case IM_GOTO_URL: - { - LLSD args; - // n.b. this is for URLs sent by the system, not for - // URLs sent by scripts (i.e. llLoadURL) - if (binary_bucket_size <= 0) - { - LL_WARNS("Messaging") << "bad binary_bucket_size: " - << binary_bucket_size - << " - aborting function." << LL_ENDL; - return; - } - - std::string url; - - url.assign((char*)binary_bucket, binary_bucket_size-1); - args["MESSAGE"] = message; - args["URL"] = url; - LLSD payload; - payload["url"] = url; - LLNotifications::instance().add("GotoURL", args, payload ); - } - break; - - case IM_FRIENDSHIP_OFFERED: - { - LLSD payload; - payload["from_id"] = from_id; - payload["session_id"] = session_id;; - payload["online"] = (offline == IM_ONLINE); - payload["sender"] = msg->getSender().getIPandPort(); - - if (is_busy) - { - busy_message(msg, from_id); - LLNotifications::instance().forceResponse(LLNotification::Params("OfferFriendship").payload(payload), 1); - } - else if (is_muted) - { - LLNotifications::instance().forceResponse(LLNotification::Params("OfferFriendship").payload(payload), 1); - } - else - { - args["[NAME]"] = name; - if(message.empty()) - { - //support for frienship offers from clients before July 2008 - LLNotifications::instance().add("OfferFriendshipNoMessage", args, payload); - } - else - { - args["[MESSAGE]"] = message; - LLNotifications::instance().add("OfferFriendship", args, payload); - } - } - } - break; - - case IM_FRIENDSHIP_ACCEPTED: - { - // In the case of an offline IM, the formFriendship() may be extraneous - // as the database should already include the relationship. But it - // doesn't hurt for dupes. - LLAvatarTracker::formFriendship(from_id); - - std::vector<std::string> strings; - strings.push_back(from_id.asString()); - send_generic_message("requestonlinenotification", strings); - - args["NAME"] = name; - LLNotifications::instance().add("FriendshipAccepted", args); - } - break; - - case IM_FRIENDSHIP_DECLINED_DEPRECATED: - default: - LL_WARNS("Messaging") << "Instant message calling for unknown dialog " - << (S32)dialog << LL_ENDL; - break; - } - - LLWindow* viewer_window = gViewerWindow->getWindow(); - if (viewer_window && viewer_window->getMinimized()) - { - viewer_window->flashIcon(5.f); - } -} - -void busy_message (LLMessageSystem* msg, LLUUID from_id) -{ - if (gAgent.getBusy()) - { - std::string my_name; - LLAgentUI::buildFullname(my_name); - std::string response = gSavedPerAccountSettings.getString("BusyModeResponse2"); - pack_instant_message( - gMessageSystem, - gAgent.getID(), - FALSE, - gAgent.getSessionID(), - from_id, - my_name, - response, - IM_ONLINE, - IM_BUSY_AUTO_RESPONSE); - gAgent.sendReliableMessage(); - } -} - -bool callingcard_offer_callback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - LLUUID fid; - LLUUID from_id; - LLMessageSystem* msg = gMessageSystem; - switch(option) - { - case 0: - // accept - msg->newMessageFast(_PREHASH_AcceptCallingCard); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_TransactionBlock); - msg->addUUIDFast(_PREHASH_TransactionID, notification["payload"]["transaction_id"].asUUID()); - fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); - msg->nextBlockFast(_PREHASH_FolderData); - msg->addUUIDFast(_PREHASH_FolderID, fid); - msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); - break; - case 1: - // decline - msg->newMessageFast(_PREHASH_DeclineCallingCard); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_TransactionBlock); - msg->addUUIDFast(_PREHASH_TransactionID, notification["payload"]["transaction_id"].asUUID()); - msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); - busy_message(msg, notification["payload"]["source_id"].asUUID()); - break; - default: - // close button probably, possibly timed out - break; - } - - return false; -} -static LLNotificationFunctorRegistration callingcard_offer_cb_reg("OfferCallingCard", callingcard_offer_callback); - -void process_offer_callingcard(LLMessageSystem* msg, void**) -{ - // someone has offered to form a friendship - LL_DEBUGS("Messaging") << "callingcard offer" << LL_ENDL; - - LLUUID source_id; - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, source_id); - LLUUID tid; - msg->getUUIDFast(_PREHASH_AgentBlock, _PREHASH_TransactionID, tid); - - LLSD payload; - payload["transaction_id"] = tid; - payload["source_id"] = source_id; - payload["sender"] = msg->getSender().getIPandPort(); - - LLViewerObject* source = gObjectList.findObject(source_id); - LLSD args; - std::string source_name; - if(source && source->isAvatar()) - { - LLNameValue* nvfirst = source->getNVPair("FirstName"); - LLNameValue* nvlast = source->getNVPair("LastName"); - if (nvfirst && nvlast) - { - args["FIRST"] = nvfirst->getString(); - args["LAST"] = nvlast->getString(); - source_name = std::string(nvfirst->getString()) + " " + nvlast->getString(); - } - } - - if(!source_name.empty()) - { - if (gAgent.getBusy() - || LLMuteList::getInstance()->isMuted(source_id, source_name, LLMute::flagTextChat)) - { - // automatically decline offer - LLNotifications::instance().forceResponse(LLNotification::Params("OfferCallingCard").payload(payload), 1); - } - else - { - LLNotifications::instance().add("OfferCallingCard", args, payload); - } - } - else - { - LL_WARNS("Messaging") << "Calling card offer from an unknown source." << LL_ENDL; - } -} - -void process_accept_callingcard(LLMessageSystem* msg, void**) -{ - LLNotifications::instance().add("CallingCardAccepted"); -} - -void process_decline_callingcard(LLMessageSystem* msg, void**) -{ - LLNotifications::instance().add("CallingCardDeclined"); -} - - -void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) -{ - LLChat chat; - std::string mesg; - std::string from_name; - U8 source_temp; - U8 type_temp; - U8 audible_temp; - LLColor4 color(1.0f, 1.0f, 1.0f, 1.0f); - LLUUID from_id; - LLUUID owner_id; - BOOL is_owned_by_me = FALSE; - LLViewerObject* chatter; - - msg->getString("ChatData", "FromName", from_name); - chat.mFromName = from_name; - - msg->getUUID("ChatData", "SourceID", from_id); - chat.mFromID = from_id; - - // Object owner for objects - msg->getUUID("ChatData", "OwnerID", owner_id); - - msg->getU8Fast(_PREHASH_ChatData, _PREHASH_SourceType, source_temp); - chat.mSourceType = (EChatSourceType)source_temp; - - msg->getU8("ChatData", "ChatType", type_temp); - chat.mChatType = (EChatType)type_temp; - - msg->getU8Fast(_PREHASH_ChatData, _PREHASH_Audible, audible_temp); - chat.mAudible = (EChatAudible)audible_temp; - - chat.mTime = LLFrameTimer::getElapsedSeconds(); - - BOOL is_busy = gAgent.getBusy(); - - BOOL is_muted = FALSE; - BOOL is_linden = FALSE; - is_muted = LLMuteList::getInstance()->isMuted( - from_id, - from_name, - LLMute::flagTextChat) - || LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagTextChat); - is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT && - LLMuteList::getInstance()->isLinden(from_name); - - BOOL is_audible = (CHAT_AUDIBLE_FULLY == chat.mAudible); - chatter = gObjectList.findObject(from_id); - if (chatter) - { - chat.mPosAgent = chatter->getPositionAgent(); - - // Make swirly things only for talking objects. (not script debug messages, though) - if (chat.mSourceType == CHAT_SOURCE_OBJECT - && chat.mChatType != CHAT_TYPE_DEBUG_MSG) - { - LLPointer<LLViewerPartSourceChat> psc = new LLViewerPartSourceChat(chatter->getPositionAgent()); - psc->setSourceObject(chatter); - psc->setColor(color); - //We set the particles to be owned by the object's owner, - //just in case they should be muted by the mute list - psc->setOwnerUUID(owner_id); - LLViewerPartSim::getInstance()->addPartSource(psc); - } - - // record last audible utterance - if (is_audible - && (is_linden || (!is_muted && !is_busy))) - { - if (chat.mChatType != CHAT_TYPE_START - && chat.mChatType != CHAT_TYPE_STOP) - { - gAgent.heardChat(chat.mFromID); - } - } - - is_owned_by_me = chatter->permYouOwner(); - } - - if (is_audible) - { - BOOL visible_in_chat_bubble = FALSE; - std::string verb; - - color.setVec(1.f,1.f,1.f,1.f); - msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg); - - BOOL ircstyle = FALSE; - - // Look for IRC-style emotes here so chatbubbles work - std::string prefix = mesg.substr(0, 4); - if (prefix == "/me " || prefix == "/me'") - { - chat.mText = from_name; - chat.mText += mesg.substr(3); - ircstyle = TRUE; - } - else - { - chat.mText = mesg; - } - - // Look for the start of typing so we can put "..." in the bubbles. - if (CHAT_TYPE_START == chat.mChatType) - { - LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, TRUE); - - // Might not have the avatar constructed yet, eg on login. - if (chatter && chatter->isAvatar()) - { - ((LLVOAvatar*)chatter)->startTyping(); - } - return; - } - else if (CHAT_TYPE_STOP == chat.mChatType) - { - LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE); - - // Might not have the avatar constructed yet, eg on login. - if (chatter && chatter->isAvatar()) - { - ((LLVOAvatar*)chatter)->stopTyping(); - } - return; - } - - // We have a real utterance now, so can stop showing "..." and proceed. - if (chatter && chatter->isAvatar()) - { - LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE); - ((LLVOAvatar*)chatter)->stopTyping(); - - if (!is_muted && !is_busy) - { - visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles"); - ((LLVOAvatar*)chatter)->addChat(chat); - } - } - - // Look for IRC-style emotes - if (ircstyle) - { - // set CHAT_STYLE_IRC to avoid adding Avatar Name as author of message. See EXT-656 - chat.mChatStyle = CHAT_STYLE_IRC; - - // Do nothing, ircstyle is fixed above for chat bubbles - } - else - { - switch(chat.mChatType) - { - case CHAT_TYPE_WHISPER: - verb = "(" + LLTrans::getString("whisper") + ")"; - break; - case CHAT_TYPE_DEBUG_MSG: - case CHAT_TYPE_OWNER: - case CHAT_TYPE_NORMAL: - verb = ""; - break; - case CHAT_TYPE_SHOUT: - verb = "(" + LLTrans::getString("shout") + ")"; - break; - case CHAT_TYPE_START: - case CHAT_TYPE_STOP: - LL_WARNS("Messaging") << "Got chat type start/stop in main chat processing." << LL_ENDL; - break; - default: - LL_WARNS("Messaging") << "Unknown type " << chat.mChatType << " in chat!" << LL_ENDL; - verb = ""; - break; - } - - - chat.mText = ""; - chat.mText += verb; - chat.mText += mesg; - } - - if (chatter) - { - chat.mPosAgent = chatter->getPositionAgent(); - } - - // truth table: - // LINDEN BUSY MUTED OWNED_BY_YOU TASK DISPLAY STORE IN HISTORY - // F F F F * Yes Yes - // F F F T * Yes Yes - // F F T F * No No - // F F T T * No No - // F T F F * No Yes - // F T F T * Yes Yes - // F T T F * No No - // F T T T * No No - // T * * * F Yes Yes - - chat.mMuted = is_muted && !is_linden; - - if (!visible_in_chat_bubble - && (is_linden || !is_busy || is_owned_by_me)) - { - // show on screen and add to history - LLNotificationsUI::LLNotificationManager::instance().onChat( - chat, LLNotificationsUI::NT_NEARBYCHAT); - - // adding temporarily so that communications window chat bar - // works until the new chat window is ready - chat.mText = from_name + ": " + chat.mText; - LLFloaterChat::addChat(chat, FALSE, FALSE); - } - else - { - LLNotificationsUI::LLNotificationManager::instance().onChat( - chat, LLNotificationsUI::NT_NEARBYCHAT); - // adding temporarily - LLFloaterChat::addChatHistory(chat); - } - } -} - - -// Simulator we're on is informing the viewer that the agent -// is starting to teleport (perhaps to another sim, perhaps to the -// same sim). If we initiated the teleport process by sending some kind -// of TeleportRequest, then this info is redundant, but if the sim -// initiated the teleport (via a script call, being killed, etc.) -// then this info is news to us. -void process_teleport_start(LLMessageSystem *msg, void**) -{ - U32 teleport_flags = 0x0; - msg->getU32("Info", "TeleportFlags", teleport_flags); - - if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL) - { - gViewerWindow->setProgressCancelButtonVisible(FALSE); - } - else - { - gViewerWindow->setProgressCancelButtonVisible(TRUE, LLTrans::getString("Cancel")); - } - - // Freeze the UI and show progress bar - // Note: could add data here to differentiate between normal teleport and death. - - if( gAgent.getTeleportState() == LLAgent::TELEPORT_NONE ) - { - gTeleportDisplay = TRUE; - gAgent.setTeleportState( LLAgent::TELEPORT_START ); - make_ui_sound("UISndTeleportOut"); - - // Don't call LLFirstUse::useTeleport here because this could be - // due to being killed, which would send you home, not to a Telehub - } -} - -void process_teleport_progress(LLMessageSystem* msg, void**) -{ - LLUUID agent_id; - msg->getUUID("AgentData", "AgentID", agent_id); - if((gAgent.getID() != agent_id) - || (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE)) - { - LL_WARNS("Messaging") << "Unexpected teleport progress message." << LL_ENDL; - return; - } - U32 teleport_flags = 0x0; - msg->getU32("Info", "TeleportFlags", teleport_flags); - if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL) - { - gViewerWindow->setProgressCancelButtonVisible(FALSE); - } - else - { - gViewerWindow->setProgressCancelButtonVisible(TRUE, LLTrans::getString("Cancel")); - } - std::string buffer; - msg->getString("Info", "Message", buffer); - LL_DEBUGS("Messaging") << "teleport progress: " << buffer << LL_ENDL; - - //Sorta hacky...default to using simulator raw messages - //if we don't find the coresponding mapping in our progress mappings - std::string message = buffer; - - if (LLAgent::sTeleportProgressMessages.find(buffer) != - LLAgent::sTeleportProgressMessages.end() ) - { - message = LLAgent::sTeleportProgressMessages[buffer]; - } - - gAgent.setTeleportMessage(LLAgent::sTeleportProgressMessages[message]); -} - -class LLFetchInWelcomeArea : public LLInventoryFetchDescendentsObserver -{ -public: - LLFetchInWelcomeArea() {} - virtual void done() - { - LLIsType is_landmark(LLAssetType::AT_LANDMARK); - LLIsType is_card(LLAssetType::AT_CALLINGCARD); - - LLInventoryModel::cat_array_t card_cats; - LLInventoryModel::item_array_t card_items; - LLInventoryModel::cat_array_t land_cats; - LLInventoryModel::item_array_t land_items; - - folder_ref_t::iterator it = mCompleteFolders.begin(); - folder_ref_t::iterator end = mCompleteFolders.end(); - for(; it != end; ++it) - { - gInventory.collectDescendentsIf( - (*it), - land_cats, - land_items, - LLInventoryModel::EXCLUDE_TRASH, - is_landmark); - gInventory.collectDescendentsIf( - (*it), - card_cats, - card_items, - LLInventoryModel::EXCLUDE_TRASH, - is_card); - } - LLSD args; - if ( land_items.count() > 0 ) - { // Show notification that they can now teleport to landmarks. Use a random landmark from the inventory - S32 random_land = ll_rand( land_items.count() - 1 ); - args["NAME"] = land_items[random_land]->getName(); - LLNotifications::instance().add("TeleportToLandmark",args); - } - if ( card_items.count() > 0 ) - { // Show notification that they can now contact people. Use a random calling card from the inventory - S32 random_card = ll_rand( card_items.count() - 1 ); - args["NAME"] = card_items[random_card]->getName(); - LLNotifications::instance().add("TeleportToPerson",args); - } - - gInventory.removeObserver(this); - delete this; - } -}; - - - -class LLPostTeleportNotifiers : public LLEventTimer -{ -public: - LLPostTeleportNotifiers(); - virtual ~LLPostTeleportNotifiers(); - - //function to be called at the supplied frequency - virtual BOOL tick(); -}; - -LLPostTeleportNotifiers::LLPostTeleportNotifiers() : LLEventTimer( 2.0 ) -{ -}; - -LLPostTeleportNotifiers::~LLPostTeleportNotifiers() -{ -} - -BOOL LLPostTeleportNotifiers::tick() -{ - BOOL all_done = FALSE; - if ( gAgent.getTeleportState() == LLAgent::TELEPORT_NONE ) - { - // get callingcards and landmarks available to the user arriving. - LLInventoryFetchDescendentsObserver::folder_ref_t folders; - LLUUID folder_id; - folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); - if(folder_id.notNull()) - folders.push_back(folder_id); - folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); - if(folder_id.notNull()) - folders.push_back(folder_id); - if(!folders.empty()) - { - LLFetchInWelcomeArea* fetcher = new LLFetchInWelcomeArea; - fetcher->fetchDescendents(folders); - if(fetcher->isEverythingComplete()) - { - fetcher->done(); - } - else - { - gInventory.addObserver(fetcher); - } - } - all_done = TRUE; - } - - return all_done; -} - - - -// Teleport notification from the simulator -// We're going to pretend to be a new agent -void process_teleport_finish(LLMessageSystem* msg, void**) -{ - LL_DEBUGS("Messaging") << "Got teleport location message" << LL_ENDL; - LLUUID agent_id; - msg->getUUIDFast(_PREHASH_Info, _PREHASH_AgentID, agent_id); - if (agent_id != gAgent.getID()) - { - LL_WARNS("Messaging") << "Got teleport notification for wrong agent!" << LL_ENDL; - return; - } - - // Do teleport effect for where you're leaving - // VEFFECT: TeleportStart - LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); - effectp->setPositionGlobal(gAgent.getPositionGlobal()); - effectp->setColor(LLColor4U(gAgent.getEffectColor())); - LLHUDManager::getInstance()->sendEffects(); - - U32 location_id; - U32 sim_ip; - U16 sim_port; - LLVector3 pos, look_at; - U64 region_handle; - msg->getU32Fast(_PREHASH_Info, _PREHASH_LocationID, location_id); - msg->getIPAddrFast(_PREHASH_Info, _PREHASH_SimIP, sim_ip); - msg->getIPPortFast(_PREHASH_Info, _PREHASH_SimPort, sim_port); - //msg->getVector3Fast(_PREHASH_Info, _PREHASH_Position, pos); - //msg->getVector3Fast(_PREHASH_Info, _PREHASH_LookAt, look_at); - msg->getU64Fast(_PREHASH_Info, _PREHASH_RegionHandle, region_handle); - U32 teleport_flags; - msg->getU32Fast(_PREHASH_Info, _PREHASH_TeleportFlags, teleport_flags); - - - std::string seedCap; - msg->getStringFast(_PREHASH_Info, _PREHASH_SeedCapability, seedCap); - - // update home location if we are teleporting out of prelude - specific to teleporting to welcome area - if((teleport_flags & TELEPORT_FLAGS_SET_HOME_TO_TARGET) - && (!gAgent.isGodlike())) - { - gAgent.setHomePosRegion(region_handle, pos); - - // Create a timer that will send notices when teleporting is all finished. Since this is - // based on the LLEventTimer class, it will be managed by that class and not orphaned or leaked. - new LLPostTeleportNotifiers(); - } - - LLHost sim_host(sim_ip, sim_port); - - // Viewer trusts the simulator. - gMessageSystem->enableCircuit(sim_host, TRUE); - LLViewerRegion* regionp = LLWorld::getInstance()->addRegion(region_handle, sim_host); - -/* - // send camera update to new region - gAgent.updateCamera(); - - // likewise make sure the camera is behind the avatar - gAgent.resetView(TRUE); - LLVector3 shift_vector = regionp->getPosRegionFromGlobal(gAgent.getRegion()->getOriginGlobal()); - gAgent.setRegion(regionp); - gObjectList.shiftObjects(shift_vector); - - if (gAgent.getAvatarObject()) - { - gAgent.getAvatarObject()->clearChatText(); - gAgent.slamLookAt(look_at); - } - gAgent.setPositionAgent(pos); - gAssetStorage->setUpstream(sim); - gCacheName->setUpstream(sim); -*/ - - // now, use the circuit info to tell simulator about us! - LL_INFOS("Messaging") << "process_teleport_finish() Enabling " - << sim_host << " with code " << msg->mOurCircuitCode << LL_ENDL; - msg->newMessageFast(_PREHASH_UseCircuitCode); - msg->nextBlockFast(_PREHASH_CircuitCode); - msg->addU32Fast(_PREHASH_Code, msg->getOurCircuitCode()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_ID, gAgent.getID()); - msg->sendReliable(sim_host); - - send_complete_agent_movement(sim_host); - gAgent.setTeleportState( LLAgent::TELEPORT_MOVING ); - gAgent.setTeleportMessage(LLAgent::sTeleportProgressMessages["contacting"]); - - regionp->setSeedCapability(seedCap); - - // Don't send camera updates to the new region until we're - // actually there... - - - // Now do teleport effect for where you're going. - // VEFFECT: TeleportEnd - effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); - effectp->setPositionGlobal(gAgent.getPositionGlobal()); - - effectp->setColor(LLColor4U(gAgent.getEffectColor())); - LLHUDManager::getInstance()->sendEffects(); - -// gTeleportDisplay = TRUE; -// gTeleportDisplayTimer.reset(); -// gViewerWindow->setShowProgress(TRUE); -} - -// stuff we have to do every time we get an AvatarInitComplete from a sim -/* -void process_avatar_init_complete(LLMessageSystem* msg, void**) -{ - LLVector3 agent_pos; - msg->getVector3Fast(_PREHASH_AvatarData, _PREHASH_Position, agent_pos); - agent_movement_complete(msg->getSender(), agent_pos); -} -*/ - -void process_agent_movement_complete(LLMessageSystem* msg, void**) -{ - gAgentMovementCompleted = true; - - LLUUID agent_id; - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); - LLUUID session_id; - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_SessionID, session_id); - if((gAgent.getID() != agent_id) || (gAgent.getSessionID() != session_id)) - { - LL_WARNS("Messaging") << "Incorrect id in process_agent_movement_complete()" - << LL_ENDL; - return; - } - - LL_DEBUGS("Messaging") << "process_agent_movement_complete()" << LL_ENDL; - - // *TODO: check timestamp to make sure the movement compleation - // makes sense. - LLVector3 agent_pos; - msg->getVector3Fast(_PREHASH_Data, _PREHASH_Position, agent_pos); - LLVector3 look_at; - msg->getVector3Fast(_PREHASH_Data, _PREHASH_LookAt, look_at); - U64 region_handle; - msg->getU64Fast(_PREHASH_Data, _PREHASH_RegionHandle, region_handle); - - std::string version_channel; - msg->getString("SimData", "ChannelVersion", version_channel); - - LLVOAvatar* avatarp = gAgent.getAvatarObject(); - if (!avatarp) - { - // Could happen if you were immediately god-teleported away on login, - // maybe other cases. Continue, but warn. - LL_WARNS("Messaging") << "agent_movement_complete() with NULL avatarp." << LL_ENDL; - } - - F32 x, y; - from_region_handle(region_handle, &x, &y); - LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromHandle(region_handle); - if (!regionp) - { - if (gAgent.getRegion()) - { - LL_WARNS("Messaging") << "current region " << gAgent.getRegion()->getOriginGlobal() << LL_ENDL; - } - - LL_WARNS("Messaging") << "Agent being sent to invalid home region: " - << x << ":" << y - << " current pos " << gAgent.getPositionGlobal() - << LL_ENDL; - LLAppViewer::instance()->forceDisconnect("You were sent to an invalid region."); - return; - - } - - LL_INFOS("Messaging") << "Changing home region to " << x << ":" << y << LL_ENDL; - - // set our upstream host the new simulator and shuffle things as - // appropriate. - LLVector3 shift_vector = regionp->getPosRegionFromGlobal( - gAgent.getRegion()->getOriginGlobal()); - gAgent.setRegion(regionp); - gObjectList.shiftObjects(shift_vector); - gAssetStorage->setUpstream(msg->getSender()); - gCacheName->setUpstream(msg->getSender()); - gViewerThrottle.sendToSim(); - gViewerWindow->sendShapeToSim(); - - bool is_teleport = gAgent.getTeleportState() == LLAgent::TELEPORT_MOVING; - - if( is_teleport ) - { - // Force the camera back onto the agent, don't animate. - gAgent.setFocusOnAvatar(TRUE, FALSE); - gAgent.slamLookAt(look_at); - gAgent.updateCamera(); - - gAgent.setTeleportState( LLAgent::TELEPORT_START_ARRIVAL ); - - // set the appearance on teleport since the new sim does not - // know what you look like. - gAgent.sendAgentSetAppearance(); - - if (avatarp) - { - // Chat the "back" SLURL. (DEV-4907) - LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL()); - chat.mSourceType = CHAT_SOURCE_SYSTEM; - LLFloaterChat::addChatHistory(chat); - - // Set the new position - avatarp->setPositionAgent(agent_pos); - avatarp->clearChat(); - avatarp->slamPosition(); - } - } - else - { - // This is likely just the initial logging in phase. - gAgent.setTeleportState( LLAgent::TELEPORT_NONE ); - } - - if ( LLTracker::isTracking(NULL) ) - { - // Check distance to beacon, if < 5m, remove beacon - LLVector3d beacon_pos = LLTracker::getTrackedPositionGlobal(); - LLVector3 beacon_dir(agent_pos.mV[VX] - (F32)fmod(beacon_pos.mdV[VX], 256.0), agent_pos.mV[VY] - (F32)fmod(beacon_pos.mdV[VY], 256.0), 0); - if (beacon_dir.magVecSquared() < 25.f) - { - LLTracker::stopTracking(NULL); - } - else if ( is_teleport ) - { - //look at the beacon - LLVector3 global_agent_pos = agent_pos; - global_agent_pos[0] += x; - global_agent_pos[1] += y; - look_at = (LLVector3)beacon_pos - global_agent_pos; - look_at.normVec(); - gAgent.slamLookAt(look_at); - } - } - - // TODO: Put back a check for flying status! DK 12/19/05 - // Sim tells us whether the new position is off the ground - /* - if (teleport_flags & TELEPORT_FLAGS_IS_FLYING) - { - gAgent.setFlying(TRUE); - } - else - { - gAgent.setFlying(FALSE); - } - */ - - send_agent_update(TRUE, TRUE); - - if (gAgent.getRegion()->getBlockFly()) - { - gAgent.setFlying(gAgent.canFly()); - } - - // force simulator to recognize busy state - if (gAgent.getBusy()) - { - gAgent.setBusy(); - } - else - { - gAgent.clearBusy(); - } - - if (avatarp) - { - avatarp->mFootPlane.clearVec(); - } - - // send walk-vs-run status - gAgent.sendWalkRun(gAgent.getRunning() || gAgent.getAlwaysRun()); - - // If the server version has changed, display an info box and offer - // to display the release notes, unless this is the initial log in. - if (gLastVersionChannel == version_channel) - { - return; - } - - if (!gLastVersionChannel.empty()) - { - LLSD payload; - payload["message"] = version_channel; - LLNotifications::instance().add("ServerVersionChanged", LLSD(), payload, server_version_changed_callback); - } - - gLastVersionChannel = version_channel; -} - -bool server_version_changed_callback(const LLSD& notification, const LLSD& response) -{ - if(notification["payload"]["message"].asString() =="") - return false; - std::string url ="http://wiki.secondlife.com/wiki/Release_Notes/"; - //parse the msg string - std::string server_version = notification["payload"]["message"].asString(); - std::vector<std::string> s_vect; - boost::algorithm::split(s_vect, server_version, isspace); - for(U32 i = 0; i < s_vect.size(); i++) - { - if (i != (s_vect.size() - 1)) - { - if(i != (s_vect.size() - 2)) - { - url += s_vect[i] + "_"; - } - else - { - url += s_vect[i] + "/"; - } - } - else - { - url += s_vect[i].substr(0,4); - } - } - - LLWeb::loadURL(url); - return false; -} - - -void process_crossed_region(LLMessageSystem* msg, void**) -{ - LLUUID agent_id; - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); - LLUUID session_id; - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_SessionID, session_id); - if((gAgent.getID() != agent_id) || (gAgent.getSessionID() != session_id)) - { - LL_WARNS("Messaging") << "Incorrect id in process_crossed_region()" - << LL_ENDL; - return; - } - LL_INFOS("Messaging") << "process_crossed_region()" << LL_ENDL; - - U32 sim_ip; - msg->getIPAddrFast(_PREHASH_RegionData, _PREHASH_SimIP, sim_ip); - U16 sim_port; - msg->getIPPortFast(_PREHASH_RegionData, _PREHASH_SimPort, sim_port); - LLHost sim_host(sim_ip, sim_port); - U64 region_handle; - msg->getU64Fast(_PREHASH_RegionData, _PREHASH_RegionHandle, region_handle); - - std::string seedCap; - msg->getStringFast(_PREHASH_RegionData, _PREHASH_SeedCapability, seedCap); - - send_complete_agent_movement(sim_host); - - LLViewerRegion* regionp = LLWorld::getInstance()->addRegion(region_handle, sim_host); - regionp->setSeedCapability(seedCap); -} - - - -// Sends avatar and camera information to simulator. -// Sent roughly once per frame, or 20 times per second, whichever is less often - -const F32 THRESHOLD_HEAD_ROT_QDOT = 0.9997f; // ~= 2.5 degrees -- if its less than this we need to update head_rot -const F32 MAX_HEAD_ROT_QDOT = 0.99999f; // ~= 0.5 degrees -- if its greater than this then no need to update head_rot - // between these values we delay the updates (but no more than one second) - - -void send_agent_update(BOOL force_send, BOOL send_reliable) -{ - if (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE) - { - // We don't care if they want to send an agent update, they're not allowed to until the simulator - // that's the target is ready to receive them (after avatar_init_complete is received) - return; - } - - // We have already requested to log out. Don't send agent updates. - if(LLAppViewer::instance()->logoutRequestSent()) - { - return; - } - - // no region to send update to - if(gAgent.getRegion() == NULL) - { - return; - } - - const F32 TRANSLATE_THRESHOLD = 0.01f; - - // NOTA BENE: This is (intentionally?) using the small angle sine approximation to test for rotation - // Plus, there is an extra 0.5 in the mix since the perpendicular between last_camera_at and getAtAxis() bisects cam_rot_change - // Thus, we're actually testing against 0.2 degrees - const F32 ROTATION_THRESHOLD = 0.1f * 2.f*F_PI/360.f; // Rotation thresh 0.2 deg, see note above - - const U8 DUP_MSGS = 1; // HACK! number of times to repeat data on motionless agent - - // Store data on last sent update so that if no changes, no send - static LLVector3 last_camera_pos_agent, - last_camera_at, - last_camera_left, - last_camera_up; - - static LLVector3 cam_center_chg, - cam_rot_chg; - - static LLQuaternion last_head_rot; - static U32 last_control_flags = 0; - static U8 last_render_state; - static U8 duplicate_count = 0; - static F32 head_rot_chg = 1.0; - static U8 last_flags; - - LLMessageSystem *msg = gMessageSystem; - LLVector3 camera_pos_agent; // local to avatar's region - U8 render_state; - - LLQuaternion body_rotation = gAgent.getFrameAgent().getQuaternion(); - LLQuaternion head_rotation = gAgent.getHeadRotation(); - - camera_pos_agent = gAgent.getCameraPositionAgent(); - - render_state = gAgent.getRenderState(); - - U32 control_flag_change = 0; - U8 flag_change = 0; - - cam_center_chg = last_camera_pos_agent - camera_pos_agent; - cam_rot_chg = last_camera_at - LLViewerCamera::getInstance()->getAtAxis(); - - // If a modifier key is held down, turn off - // LBUTTON and ML_LBUTTON so that using the camera (alt-key) doesn't - // trigger a control event. - U32 control_flags = gAgent.getControlFlags(); - MASK key_mask = gKeyboard->currentMask(TRUE); - if (key_mask & MASK_ALT || key_mask & MASK_CONTROL) - { - control_flags &= ~( AGENT_CONTROL_LBUTTON_DOWN | - AGENT_CONTROL_ML_LBUTTON_DOWN ); - control_flags |= AGENT_CONTROL_LBUTTON_UP | - AGENT_CONTROL_ML_LBUTTON_UP ; - } - - control_flag_change = last_control_flags ^ control_flags; - - U8 flags = AU_FLAGS_NONE; - if (gAgent.isGroupTitleHidden()) - { - flags |= AU_FLAGS_HIDETITLE; - } - if (gAgent.getAutoPilot()) - { - flags |= AU_FLAGS_CLIENT_AUTOPILOT; - } - - flag_change = last_flags ^ flags; - - head_rot_chg = dot(last_head_rot, head_rotation); - - if (force_send || - (cam_center_chg.magVec() > TRANSLATE_THRESHOLD) || - (head_rot_chg < THRESHOLD_HEAD_ROT_QDOT) || - (last_render_state != render_state) || - (cam_rot_chg.magVec() > ROTATION_THRESHOLD) || - control_flag_change != 0 || - flag_change != 0) - { -/* - if (head_rot_chg < THRESHOLD_HEAD_ROT_QDOT) - { - //LL_INFOS("Messaging") << "head rot " << head_rotation << LL_ENDL; - LL_INFOS("Messaging") << "head_rot_chg = " << head_rot_chg << LL_ENDL; - } - if (cam_rot_chg.magVec() > ROTATION_THRESHOLD) - { - LL_INFOS("Messaging") << "cam rot " << cam_rot_chg.magVec() << LL_ENDL; - } - if (cam_center_chg.magVec() > TRANSLATE_THRESHOLD) - { - LL_INFOS("Messaging") << "cam center " << cam_center_chg.magVec() << LL_ENDL; - } -// if (drag_delta_chg.magVec() > TRANSLATE_THRESHOLD) -// { -// LL_INFOS("Messaging") << "drag delta " << drag_delta_chg.magVec() << LL_ENDL; -// } - if (control_flag_change) - { - LL_INFOS("Messaging") << "dcf = " << control_flag_change << LL_ENDL; - } -*/ - - duplicate_count = 0; - } - else - { - duplicate_count++; - - if (head_rot_chg < MAX_HEAD_ROT_QDOT && duplicate_count < AGENT_UPDATES_PER_SECOND) - { - // The head_rotation is sent for updating things like attached guns. - // We only trigger a new update when head_rotation deviates beyond - // some threshold from the last update, however this can break fine - // adjustments when trying to aim an attached gun, so what we do here - // (where we would normally skip sending an update when nothing has changed) - // is gradually reduce the threshold to allow a better update to - // eventually get sent... should update to within 0.5 degrees in less - // than a second. - if (head_rot_chg < THRESHOLD_HEAD_ROT_QDOT + (MAX_HEAD_ROT_QDOT - THRESHOLD_HEAD_ROT_QDOT) * duplicate_count / AGENT_UPDATES_PER_SECOND) - { - duplicate_count = 0; - } - else - { - return; - } - } - else - { - return; - } - } - - if (duplicate_count < DUP_MSGS && !gDisconnected) - { - // Build the message - msg->newMessageFast(_PREHASH_AgentUpdate); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addQuatFast(_PREHASH_BodyRotation, body_rotation); - msg->addQuatFast(_PREHASH_HeadRotation, head_rotation); - msg->addU8Fast(_PREHASH_State, render_state); - msg->addU8Fast(_PREHASH_Flags, flags); - -// if (camera_pos_agent.mV[VY] > 255.f) -// { -// LL_INFOS("Messaging") << "Sending camera center " << camera_pos_agent << LL_ENDL; -// } - - msg->addVector3Fast(_PREHASH_CameraCenter, camera_pos_agent); - msg->addVector3Fast(_PREHASH_CameraAtAxis, LLViewerCamera::getInstance()->getAtAxis()); - msg->addVector3Fast(_PREHASH_CameraLeftAxis, LLViewerCamera::getInstance()->getLeftAxis()); - msg->addVector3Fast(_PREHASH_CameraUpAxis, LLViewerCamera::getInstance()->getUpAxis()); - msg->addF32Fast(_PREHASH_Far, gAgent.mDrawDistance); - - msg->addU32Fast(_PREHASH_ControlFlags, control_flags); - - if (gDebugClicks) - { - if (control_flags & AGENT_CONTROL_LBUTTON_DOWN) - { - LL_INFOS("Messaging") << "AgentUpdate left button down" << LL_ENDL; - } - - if (control_flags & AGENT_CONTROL_LBUTTON_UP) - { - LL_INFOS("Messaging") << "AgentUpdate left button up" << LL_ENDL; - } - } - - gAgent.enableControlFlagReset(); - - if (!send_reliable) - { - gAgent.sendMessage(); - } - else - { - gAgent.sendReliableMessage(); - } - -// LL_DEBUGS("Messaging") << "agent " << avatar_pos_agent << " cam " << camera_pos_agent << LL_ENDL; - - // Copy the old data - last_head_rot = head_rotation; - last_render_state = render_state; - last_camera_pos_agent = camera_pos_agent; - last_camera_at = LLViewerCamera::getInstance()->getAtAxis(); - last_camera_left = LLViewerCamera::getInstance()->getLeftAxis(); - last_camera_up = LLViewerCamera::getInstance()->getUpAxis(); - last_control_flags = control_flags; - last_flags = flags; - } -} - - - -// *TODO: Remove this dependency, or figure out a better way to handle -// this hack. -extern U32 gObjectBits; - -void process_object_update(LLMessageSystem *mesgsys, void **user_data) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - // Update the data counters - if (mesgsys->getReceiveCompressedSize()) - { - gObjectBits += mesgsys->getReceiveCompressedSize() * 8; - } - else - { - gObjectBits += mesgsys->getReceiveSize() * 8; - } - - // Update the object... - gObjectList.processObjectUpdate(mesgsys, user_data, OUT_FULL); -} - -void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - // Update the data counters - if (mesgsys->getReceiveCompressedSize()) - { - gObjectBits += mesgsys->getReceiveCompressedSize() * 8; - } - else - { - gObjectBits += mesgsys->getReceiveSize() * 8; - } - - // Update the object... - gObjectList.processCompressedObjectUpdate(mesgsys, user_data, OUT_FULL_COMPRESSED); -} - -void process_cached_object_update(LLMessageSystem *mesgsys, void **user_data) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - // Update the data counters - if (mesgsys->getReceiveCompressedSize()) - { - gObjectBits += mesgsys->getReceiveCompressedSize() * 8; - } - else - { - gObjectBits += mesgsys->getReceiveSize() * 8; - } - - // Update the object... - gObjectList.processCachedObjectUpdate(mesgsys, user_data, OUT_FULL_CACHED); -} - - -void process_terse_object_update_improved(LLMessageSystem *mesgsys, void **user_data) -{ - LLMemType mt(LLMemType::MTYPE_OBJECT); - if (mesgsys->getReceiveCompressedSize()) - { - gObjectBits += mesgsys->getReceiveCompressedSize() * 8; - } - else - { - gObjectBits += mesgsys->getReceiveSize() * 8; - } - - gObjectList.processCompressedObjectUpdate(mesgsys, user_data, OUT_TERSE_IMPROVED); -} - -static LLFastTimer::DeclareTimer FTM_PROCESS_OBJECTS("Process Objects"); - - -void process_kill_object(LLMessageSystem *mesgsys, void **user_data) -{ - LLFastTimer t(FTM_PROCESS_OBJECTS); - - LLUUID id; - U32 local_id; - S32 i; - S32 num_objects; - - num_objects = mesgsys->getNumberOfBlocksFast(_PREHASH_ObjectData); - - for (i = 0; i < num_objects; i++) - { - mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i); - - LLViewerObjectList::getUUIDFromLocal(id, - local_id, - gMessageSystem->getSenderIP(), - gMessageSystem->getSenderPort()); - if (id == LLUUID::null) - { - LL_DEBUGS("Messaging") << "Unknown kill for local " << local_id << LL_ENDL; - gObjectList.mNumUnknownKills++; - continue; - } - else - { - LL_DEBUGS("Messaging") << "Kill message for local " << local_id << LL_ENDL; - } - - LLSelectMgr::getInstance()->removeObjectFromSelections(id); - - // ...don't kill the avatar - if (!(id == gAgentID)) - { - LLViewerObject *objectp = gObjectList.findObject(id); - if (objectp) - { - // Display green bubble on kill - if ( gShowObjectUpdates ) - { - LLViewerObject* newobject; - newobject = gObjectList.createObjectViewer(LL_PCODE_LEGACY_TEXT_BUBBLE, objectp->getRegion()); - - LLVOTextBubble* bubble = (LLVOTextBubble*) newobject; - - bubble->mColor.setVec(0.f, 1.f, 0.f, 1.f); - bubble->setScale( 2.0f * bubble->getScale() ); - bubble->setPositionGlobal(objectp->getPositionGlobal()); - gPipeline.addObject(bubble); - } - - // Do the kill - gObjectList.killObject(objectp); - } - else - { - LL_WARNS("Messaging") << "Object in UUID lookup, but not on object list in kill!" << LL_ENDL; - gObjectList.mNumUnknownKills++; - } - } - } -} - -void process_time_synch(LLMessageSystem *mesgsys, void **user_data) -{ - LLVector3 sun_direction; - LLVector3 sun_ang_velocity; - F32 phase; - U64 space_time_usec; - - U32 seconds_per_day; - U32 seconds_per_year; - - // "SimulatorViewerTimeMessage" - mesgsys->getU64Fast(_PREHASH_TimeInfo, _PREHASH_UsecSinceStart, space_time_usec); - mesgsys->getU32Fast(_PREHASH_TimeInfo, _PREHASH_SecPerDay, seconds_per_day); - mesgsys->getU32Fast(_PREHASH_TimeInfo, _PREHASH_SecPerYear, seconds_per_year); - - // This should eventually be moved to an "UpdateHeavenlyBodies" message - mesgsys->getF32Fast(_PREHASH_TimeInfo, _PREHASH_SunPhase, phase); - mesgsys->getVector3Fast(_PREHASH_TimeInfo, _PREHASH_SunDirection, sun_direction); - mesgsys->getVector3Fast(_PREHASH_TimeInfo, _PREHASH_SunAngVelocity, sun_ang_velocity); - - LLWorld::getInstance()->setSpaceTimeUSec(space_time_usec); - - //LL_DEBUGS("Messaging") << "time_synch() - " << sun_direction << ", " << sun_ang_velocity - // << ", " << phase << LL_ENDL; - - gSky.setSunPhase(phase); - gSky.setSunTargetDirection(sun_direction, sun_ang_velocity); - if (!gNoRender && !(gSavedSettings.getBOOL("SkyOverrideSimSunPosition") || gSky.getOverrideSun())) - { - gSky.setSunDirection(sun_direction, sun_ang_velocity); - } -} - -void process_sound_trigger(LLMessageSystem *msg, void **) -{ - if (!gAudiop) return; - - U64 region_handle = 0; - F32 gain = 0; - LLUUID sound_id; - LLUUID owner_id; - LLUUID object_id; - LLUUID parent_id; - LLVector3 pos_local; - - msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_SoundID, sound_id); - msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_OwnerID, owner_id); - msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_ObjectID, object_id); - msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_ParentID, parent_id); - msg->getU64Fast(_PREHASH_SoundData, _PREHASH_Handle, region_handle); - msg->getVector3Fast(_PREHASH_SoundData, _PREHASH_Position, pos_local); - msg->getF32Fast(_PREHASH_SoundData, _PREHASH_Gain, gain); - - // adjust sound location to true global coords - LLVector3d pos_global = from_region_handle(region_handle); - pos_global.mdV[VX] += pos_local.mV[VX]; - pos_global.mdV[VY] += pos_local.mV[VY]; - pos_global.mdV[VZ] += pos_local.mV[VZ]; - - // Don't play a trigger sound if you can't hear it due - // to parcel "local audio only" settings. - if (!LLViewerParcelMgr::getInstance()->canHearSound(pos_global)) return; - - // Don't play sounds triggered by someone you muted. - if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return; - - // Don't play sounds from an object you muted - if (LLMuteList::getInstance()->isMuted(object_id)) return; - - // Don't play sounds from an object whose parent you muted - if (parent_id.notNull() - && LLMuteList::getInstance()->isMuted(parent_id)) - { - return; - } - - // Don't play sounds from a region with maturity above current agent maturity - if( !gAgent.canAccessMaturityInRegion( region_handle ) ) - { - return; - } - - gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global); -} - -void process_preload_sound(LLMessageSystem *msg, void **user_data) -{ - if (!gAudiop) - { - return; - } - - LLUUID sound_id; - LLUUID object_id; - LLUUID owner_id; - - msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_SoundID, sound_id); - msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_ObjectID, object_id); - msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_OwnerID, owner_id); - - LLViewerObject *objectp = gObjectList.findObject(object_id); - if (!objectp) return; - - if (LLMuteList::getInstance()->isMuted(object_id)) return; - if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return; - - LLAudioSource *sourcep = objectp->getAudioSource(owner_id); - if (!sourcep) return; - - LLAudioData *datap = gAudiop->getAudioData(sound_id); - - // Note that I don't actually do any loading of the - // audio data into a buffer at this point, as it won't actually - // help us out. - - // Don't play sounds from a region with maturity above current agent maturity - LLVector3d pos_global = objectp->getPositionGlobal(); - if( !gAgent.canAccessMaturityAtGlobal( pos_global ) ) - { - return; - } - - // Add audioData starts a transfer internally. - sourcep->addAudioData(datap, FALSE); -} - -void process_attached_sound(LLMessageSystem *msg, void **user_data) -{ - F32 gain = 0; - LLUUID sound_id; - LLUUID object_id; - LLUUID owner_id; - U8 flags; - - msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_SoundID, sound_id); - msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_ObjectID, object_id); - msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_OwnerID, owner_id); - msg->getF32Fast(_PREHASH_DataBlock, _PREHASH_Gain, gain); - msg->getU8Fast(_PREHASH_DataBlock, _PREHASH_Flags, flags); - - LLViewerObject *objectp = gObjectList.findObject(object_id); - if (!objectp) - { - // we don't know about this object, just bail - return; - } - - if (LLMuteList::getInstance()->isMuted(object_id)) return; - - if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return; - - - // Don't play sounds from a region with maturity above current agent maturity - LLVector3d pos = objectp->getPositionGlobal(); - if( !gAgent.canAccessMaturityAtGlobal(pos) ) - { - return; - } - - objectp->setAttachedSound(sound_id, owner_id, gain, flags); -} - - -void process_attached_sound_gain_change(LLMessageSystem *mesgsys, void **user_data) -{ - F32 gain = 0; - LLUUID object_guid; - LLViewerObject *objectp = NULL; - - mesgsys->getUUIDFast(_PREHASH_DataBlock, _PREHASH_ObjectID, object_guid); - - if (!((objectp = gObjectList.findObject(object_guid)))) - { - // we don't know about this object, just bail - return; - } - - mesgsys->getF32Fast(_PREHASH_DataBlock, _PREHASH_Gain, gain); - - objectp->adjustAudioGain(gain); -} - - -void process_health_message(LLMessageSystem *mesgsys, void **user_data) -{ - F32 health; - - mesgsys->getF32Fast(_PREHASH_HealthData, _PREHASH_Health, health); - - if (gStatusBar) - { - gStatusBar->setHealth((S32)health); - } -} - - -void process_sim_stats(LLMessageSystem *msg, void **user_data) -{ - S32 count = msg->getNumberOfBlocks("Stat"); - for (S32 i = 0; i < count; ++i) - { - U32 stat_id; - F32 stat_value; - msg->getU32("Stat", "StatID", stat_id, i); - msg->getF32("Stat", "StatValue", stat_value, i); - switch (stat_id) - { - case LL_SIM_STAT_TIME_DILATION: - LLViewerStats::getInstance()->mSimTimeDilation.addValue(stat_value); - break; - case LL_SIM_STAT_FPS: - LLViewerStats::getInstance()->mSimFPS.addValue(stat_value); - break; - case LL_SIM_STAT_PHYSFPS: - LLViewerStats::getInstance()->mSimPhysicsFPS.addValue(stat_value); - break; - case LL_SIM_STAT_AGENTUPS: - LLViewerStats::getInstance()->mSimAgentUPS.addValue(stat_value); - break; - case LL_SIM_STAT_FRAMEMS: - LLViewerStats::getInstance()->mSimFrameMsec.addValue(stat_value); - break; - case LL_SIM_STAT_NETMS: - LLViewerStats::getInstance()->mSimNetMsec.addValue(stat_value); - break; - case LL_SIM_STAT_SIMOTHERMS: - LLViewerStats::getInstance()->mSimSimOtherMsec.addValue(stat_value); - break; - case LL_SIM_STAT_SIMPHYSICSMS: - LLViewerStats::getInstance()->mSimSimPhysicsMsec.addValue(stat_value); - break; - case LL_SIM_STAT_AGENTMS: - LLViewerStats::getInstance()->mSimAgentMsec.addValue(stat_value); - break; - case LL_SIM_STAT_IMAGESMS: - LLViewerStats::getInstance()->mSimImagesMsec.addValue(stat_value); - break; - case LL_SIM_STAT_SCRIPTMS: - LLViewerStats::getInstance()->mSimScriptMsec.addValue(stat_value); - break; - case LL_SIM_STAT_NUMTASKS: - LLViewerStats::getInstance()->mSimObjects.addValue(stat_value); - break; - case LL_SIM_STAT_NUMTASKSACTIVE: - LLViewerStats::getInstance()->mSimActiveObjects.addValue(stat_value); - break; - case LL_SIM_STAT_NUMAGENTMAIN: - LLViewerStats::getInstance()->mSimMainAgents.addValue(stat_value); - break; - case LL_SIM_STAT_NUMAGENTCHILD: - LLViewerStats::getInstance()->mSimChildAgents.addValue(stat_value); - break; - case LL_SIM_STAT_NUMSCRIPTSACTIVE: - LLViewerStats::getInstance()->mSimActiveScripts.addValue(stat_value); - break; - case LL_SIM_STAT_SCRIPT_EPS: - LLViewerStats::getInstance()->mSimScriptEPS.addValue(stat_value); - break; - case LL_SIM_STAT_INPPS: - LLViewerStats::getInstance()->mSimInPPS.addValue(stat_value); - break; - case LL_SIM_STAT_OUTPPS: - LLViewerStats::getInstance()->mSimOutPPS.addValue(stat_value); - break; - case LL_SIM_STAT_PENDING_DOWNLOADS: - LLViewerStats::getInstance()->mSimPendingDownloads.addValue(stat_value); - break; - case LL_SIM_STAT_PENDING_UPLOADS: - LLViewerStats::getInstance()->mSimPendingUploads.addValue(stat_value); - break; - case LL_SIM_STAT_PENDING_LOCAL_UPLOADS: - LLViewerStats::getInstance()->mSimPendingLocalUploads.addValue(stat_value); - break; - case LL_SIM_STAT_TOTAL_UNACKED_BYTES: - LLViewerStats::getInstance()->mSimTotalUnackedBytes.addValue(stat_value / 1024.f); - break; - case LL_SIM_STAT_PHYSICS_PINNED_TASKS: - LLViewerStats::getInstance()->mPhysicsPinnedTasks.addValue(stat_value); - break; - case LL_SIM_STAT_PHYSICS_LOD_TASKS: - LLViewerStats::getInstance()->mPhysicsLODTasks.addValue(stat_value); - break; - case LL_SIM_STAT_SIMPHYSICSSTEPMS: - LLViewerStats::getInstance()->mSimSimPhysicsStepMsec.addValue(stat_value); - break; - case LL_SIM_STAT_SIMPHYSICSSHAPEMS: - LLViewerStats::getInstance()->mSimSimPhysicsShapeUpdateMsec.addValue(stat_value); - break; - case LL_SIM_STAT_SIMPHYSICSOTHERMS: - LLViewerStats::getInstance()->mSimSimPhysicsOtherMsec.addValue(stat_value); - break; - case LL_SIM_STAT_SIMPHYSICSMEMORY: - LLViewerStats::getInstance()->mPhysicsMemoryAllocated.addValue(stat_value); - break; - case LL_SIM_STAT_SIMSPARETIME: - LLViewerStats::getInstance()->mSimSpareMsec.addValue(stat_value); - break; - case LL_SIM_STAT_SIMSLEEPTIME: - LLViewerStats::getInstance()->mSimSleepMsec.addValue(stat_value); - break; - case LL_SIM_STAT_IOPUMPTIME: - LLViewerStats::getInstance()->mSimPumpIOMsec.addValue(stat_value); - break; - default: - // Used to be a commented out warning. - LL_DEBUGS("Messaging") << "Unknown stat id" << stat_id << LL_ENDL; - break; - } - } - - /* - msg->getF32Fast(_PREHASH_Statistics, _PREHASH_PhysicsTimeDilation, time_dilation); - LLViewerStats::getInstance()->mSimTDStat.addValue(time_dilation); - - // Process information - // { CpuUsage F32 } - // { SimMemTotal F32 } - // { SimMemRSS F32 } - // { ProcessUptime F32 } - F32 cpu_usage; - F32 sim_mem_total; - F32 sim_mem_rss; - F32 process_uptime; - msg->getF32Fast(_PREHASH_Statistics, _PREHASH_CpuUsage, cpu_usage); - msg->getF32Fast(_PREHASH_Statistics, _PREHASH_SimMemTotal, sim_mem_total); - msg->getF32Fast(_PREHASH_Statistics, _PREHASH_SimMemRSS, sim_mem_rss); - msg->getF32Fast(_PREHASH_Statistics, _PREHASH_ProcessUptime, process_uptime); - LLViewerStats::getInstance()->mSimCPUUsageStat.addValue(cpu_usage); - LLViewerStats::getInstance()->mSimMemTotalStat.addValue(sim_mem_total); - LLViewerStats::getInstance()->mSimMemRSSStat.addValue(sim_mem_rss); - */ - - // - // Various hacks that aren't statistics, but are being handled here. - // - U32 max_tasks_per_region; - U32 region_flags; - msg->getU32("Region", "ObjectCapacity", max_tasks_per_region); - msg->getU32("Region", "RegionFlags", region_flags); - - LLViewerRegion* regionp = gAgent.getRegion(); - if (regionp) - { - BOOL was_flying = gAgent.getFlying(); - regionp->setRegionFlags(region_flags); - regionp->setMaxTasks(max_tasks_per_region); - // HACK: This makes agents drop from the sky if the region is - // set to no fly while people are still in the sim. - if (was_flying && regionp->getBlockFly()) - { - gAgent.setFlying(gAgent.canFly()); - } - } -} - - - -void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data) -{ - LLUUID animation_id; - LLUUID uuid; - S32 anim_sequence_id; - LLVOAvatar *avatarp; - - mesgsys->getUUIDFast(_PREHASH_Sender, _PREHASH_ID, uuid); - - //clear animation flags - avatarp = (LLVOAvatar *)gObjectList.findObject(uuid); - - if (!avatarp) - { - // no agent by this ID...error? - LL_WARNS("Messaging") << "Received animation state for unknown avatar" << uuid << LL_ENDL; - return; - } - - S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_AnimationList); - S32 num_source_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_AnimationSourceList); - - avatarp->mSignaledAnimations.clear(); - - if (avatarp->isSelf()) - { - LLUUID object_id; - - for( S32 i = 0; i < num_blocks; i++ ) - { - mesgsys->getUUIDFast(_PREHASH_AnimationList, _PREHASH_AnimID, animation_id, i); - mesgsys->getS32Fast(_PREHASH_AnimationList, _PREHASH_AnimSequenceID, anim_sequence_id, i); - - LL_DEBUGS("Messaging") << "Anim sequence ID: " << anim_sequence_id << LL_ENDL; - - avatarp->mSignaledAnimations[animation_id] = anim_sequence_id; - - if (i < num_source_blocks) - { - mesgsys->getUUIDFast(_PREHASH_AnimationSourceList, _PREHASH_ObjectID, object_id, i); - - LLViewerObject* object = gObjectList.findObject(object_id); - if (object) - { - object->mFlags |= FLAGS_ANIM_SOURCE; - - BOOL anim_found = FALSE; - LLVOAvatar::AnimSourceIterator anim_it = avatarp->mAnimationSources.find(object_id); - for (;anim_it != avatarp->mAnimationSources.end(); ++anim_it) - { - if (anim_it->second == animation_id) - { - anim_found = TRUE; - break; - } - } - - if (!anim_found) - { - avatarp->mAnimationSources.insert(LLVOAvatar::AnimationSourceMap::value_type(object_id, animation_id)); - } - } - } - } - } - else - { - for( S32 i = 0; i < num_blocks; i++ ) - { - mesgsys->getUUIDFast(_PREHASH_AnimationList, _PREHASH_AnimID, animation_id, i); - mesgsys->getS32Fast(_PREHASH_AnimationList, _PREHASH_AnimSequenceID, anim_sequence_id, i); - avatarp->mSignaledAnimations[animation_id] = anim_sequence_id; - } - } - - if (num_blocks) - { - avatarp->processAnimationStateChanges(); - } -} - -void process_avatar_appearance(LLMessageSystem *mesgsys, void **user_data) -{ - LLUUID uuid; - mesgsys->getUUIDFast(_PREHASH_Sender, _PREHASH_ID, uuid); - - LLVOAvatar* avatarp = (LLVOAvatar *)gObjectList.findObject(uuid); - if( avatarp ) - { - avatarp->processAvatarAppearance( mesgsys ); - } - else - { - LL_WARNS("Messaging") << "avatar_appearance sent for unknown avatar " << uuid << LL_ENDL; - } -} - -void process_camera_constraint(LLMessageSystem *mesgsys, void **user_data) -{ - LLVector4 cameraCollidePlane; - mesgsys->getVector4Fast(_PREHASH_CameraCollidePlane, _PREHASH_Plane, cameraCollidePlane); - - gAgent.setCameraCollidePlane(cameraCollidePlane); -} - -void near_sit_object(BOOL success, void *data) -{ - if (success) - { - // Send message to sit on object - gMessageSystem->newMessageFast(_PREHASH_AgentSit); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gAgent.sendReliableMessage(); - } -} - -void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data) -{ - LLVector3 sitPosition; - LLQuaternion sitRotation; - LLUUID sitObjectID; - BOOL use_autopilot; - mesgsys->getUUIDFast(_PREHASH_SitObject, _PREHASH_ID, sitObjectID); - mesgsys->getBOOLFast(_PREHASH_SitTransform, _PREHASH_AutoPilot, use_autopilot); - mesgsys->getVector3Fast(_PREHASH_SitTransform, _PREHASH_SitPosition, sitPosition); - mesgsys->getQuatFast(_PREHASH_SitTransform, _PREHASH_SitRotation, sitRotation); - LLVector3 camera_eye; - mesgsys->getVector3Fast(_PREHASH_SitTransform, _PREHASH_CameraEyeOffset, camera_eye); - LLVector3 camera_at; - mesgsys->getVector3Fast(_PREHASH_SitTransform, _PREHASH_CameraAtOffset, camera_at); - BOOL force_mouselook; - mesgsys->getBOOLFast(_PREHASH_SitTransform, _PREHASH_ForceMouselook, force_mouselook); - - LLVOAvatar* avatar = gAgent.getAvatarObject(); - - if (avatar && dist_vec_squared(camera_eye, camera_at) > 0.0001f) - { - gAgent.setSitCamera(sitObjectID, camera_eye, camera_at); - } - - gAgent.setForceMouselook(force_mouselook); - - LLViewerObject* object = gObjectList.findObject(sitObjectID); - if (object) - { - LLVector3 sit_spot = object->getPositionAgent() + (sitPosition * object->getRotation()); - if (!use_autopilot || (avatar && avatar->isSitting() && avatar->getRoot() == object->getRoot())) - { - //we're already sitting on this object, so don't autopilot - } - else - { - gAgent.startAutoPilotGlobal(gAgent.getPosGlobalFromAgent(sit_spot), "Sit", &sitRotation, near_sit_object, NULL, 0.5f); - } - } - else - { - LL_WARNS("Messaging") << "Received sit approval for unknown object " << sitObjectID << LL_ENDL; - } -} - -void process_clear_follow_cam_properties(LLMessageSystem *mesgsys, void **user_data) -{ - LLUUID source_id; - - mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, source_id); - - LLFollowCamMgr::removeFollowCamParams(source_id); -} - -void process_set_follow_cam_properties(LLMessageSystem *mesgsys, void **user_data) -{ - S32 type; - F32 value; - bool settingPosition = false; - bool settingFocus = false; - bool settingFocusOffset = false; - LLVector3 position; - LLVector3 focus; - LLVector3 focus_offset; - - LLUUID source_id; - - mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, source_id); - - LLViewerObject* objectp = gObjectList.findObject(source_id); - if (objectp) - { - objectp->mFlags |= FLAGS_CAMERA_SOURCE; - } - - S32 num_objects = mesgsys->getNumberOfBlocks("CameraProperty"); - for (S32 block_index = 0; block_index < num_objects; block_index++) - { - mesgsys->getS32("CameraProperty", "Type", type, block_index); - mesgsys->getF32("CameraProperty", "Value", value, block_index); - switch(type) - { - case FOLLOWCAM_PITCH: - LLFollowCamMgr::setPitch(source_id, value); - break; - case FOLLOWCAM_FOCUS_OFFSET_X: - focus_offset.mV[VX] = value; - settingFocusOffset = true; - break; - case FOLLOWCAM_FOCUS_OFFSET_Y: - focus_offset.mV[VY] = value; - settingFocusOffset = true; - break; - case FOLLOWCAM_FOCUS_OFFSET_Z: - focus_offset.mV[VZ] = value; - settingFocusOffset = true; - break; - case FOLLOWCAM_POSITION_LAG: - LLFollowCamMgr::setPositionLag(source_id, value); - break; - case FOLLOWCAM_FOCUS_LAG: - LLFollowCamMgr::setFocusLag(source_id, value); - break; - case FOLLOWCAM_DISTANCE: - LLFollowCamMgr::setDistance(source_id, value); - break; - case FOLLOWCAM_BEHINDNESS_ANGLE: - LLFollowCamMgr::setBehindnessAngle(source_id, value); - break; - case FOLLOWCAM_BEHINDNESS_LAG: - LLFollowCamMgr::setBehindnessLag(source_id, value); - break; - case FOLLOWCAM_POSITION_THRESHOLD: - LLFollowCamMgr::setPositionThreshold(source_id, value); - break; - case FOLLOWCAM_FOCUS_THRESHOLD: - LLFollowCamMgr::setFocusThreshold(source_id, value); - break; - case FOLLOWCAM_ACTIVE: - //if 1, set using followcam,. - LLFollowCamMgr::setCameraActive(source_id, value != 0.f); - break; - case FOLLOWCAM_POSITION_X: - settingPosition = true; - position.mV[ 0 ] = value; - break; - case FOLLOWCAM_POSITION_Y: - settingPosition = true; - position.mV[ 1 ] = value; - break; - case FOLLOWCAM_POSITION_Z: - settingPosition = true; - position.mV[ 2 ] = value; - break; - case FOLLOWCAM_FOCUS_X: - settingFocus = true; - focus.mV[ 0 ] = value; - break; - case FOLLOWCAM_FOCUS_Y: - settingFocus = true; - focus.mV[ 1 ] = value; - break; - case FOLLOWCAM_FOCUS_Z: - settingFocus = true; - focus.mV[ 2 ] = value; - break; - case FOLLOWCAM_POSITION_LOCKED: - LLFollowCamMgr::setPositionLocked(source_id, value != 0.f); - break; - case FOLLOWCAM_FOCUS_LOCKED: - LLFollowCamMgr::setFocusLocked(source_id, value != 0.f); - break; - - default: - break; - } - } - - if ( settingPosition ) - { - LLFollowCamMgr::setPosition(source_id, position); - } - if ( settingFocus ) - { - LLFollowCamMgr::setFocus(source_id, focus); - } - if ( settingFocusOffset ) - { - LLFollowCamMgr::setFocusOffset(source_id, focus_offset); - } -} -//end Ventrella - - -// Culled from newsim lltask.cpp -void process_name_value(LLMessageSystem *mesgsys, void **user_data) -{ - std::string temp_str; - LLUUID id; - S32 i, num_blocks; - - mesgsys->getUUIDFast(_PREHASH_TaskData, _PREHASH_ID, id); - - LLViewerObject* object = gObjectList.findObject(id); - - if (object) - { - num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_NameValueData); - for (i = 0; i < num_blocks; i++) - { - mesgsys->getStringFast(_PREHASH_NameValueData, _PREHASH_NVPair, temp_str, i); - LL_INFOS("Messaging") << "Added to object Name Value: " << temp_str << LL_ENDL; - object->addNVPair(temp_str); - } - } - else - { - LL_INFOS("Messaging") << "Can't find object " << id << " to add name value pair" << LL_ENDL; - } -} - -void process_remove_name_value(LLMessageSystem *mesgsys, void **user_data) -{ - std::string temp_str; - LLUUID id; - S32 i, num_blocks; - - mesgsys->getUUIDFast(_PREHASH_TaskData, _PREHASH_ID, id); - - LLViewerObject* object = gObjectList.findObject(id); - - if (object) - { - num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_NameValueData); - for (i = 0; i < num_blocks; i++) - { - mesgsys->getStringFast(_PREHASH_NameValueData, _PREHASH_NVPair, temp_str, i); - LL_INFOS("Messaging") << "Removed from object Name Value: " << temp_str << LL_ENDL; - object->removeNVPair(temp_str); - } - } - else - { - LL_INFOS("Messaging") << "Can't find object " << id << " to remove name value pair" << LL_ENDL; - } -} - -void process_kick_user(LLMessageSystem *msg, void** /*user_data*/) -{ - std::string message; - - msg->getStringFast(_PREHASH_UserInfo, _PREHASH_Reason, message); - - LLAppViewer::instance()->forceDisconnect(message); -} - - -/* -void process_user_list_reply(LLMessageSystem *msg, void **user_data) -{ - LLUserList::processUserListReply(msg, user_data); - return; - char firstname[MAX_STRING+1]; - char lastname[MAX_STRING+1]; - U8 status; - S32 user_count; - - user_count = msg->getNumberOfBlocks("UserBlock"); - - for (S32 i = 0; i < user_count; i++) - { - msg->getData("UserBlock", i, "FirstName", firstname); - msg->getData("UserBlock", i, "LastName", lastname); - msg->getData("UserBlock", i, "Status", &status); - - if (status & 0x01) - { - dialog_friends_add_friend(buffer, TRUE); - } - else - { - dialog_friends_add_friend(buffer, FALSE); - } - } - - dialog_friends_done_adding(); -} -*/ - -// this is not handled in processUpdateMessage -/* -void process_time_dilation(LLMessageSystem *msg, void **user_data) -{ - // get the time_dilation - U16 foo; - msg->getData("TimeDilation", "TimeDilation", &foo); - F32 time_dilation = ((F32) foo) / 65535.f; - - // get the pointer to the right region - U32 ip = msg->getSenderIP(); - U32 port = msg->getSenderPort(); - LLViewerRegion *regionp = LLWorld::getInstance()->getRegion(ip, port); - if (regionp) - { - regionp->setTimeDilation(time_dilation); - } -} -*/ - - - -void process_money_balance_reply( LLMessageSystem* msg, void** ) -{ - S32 balance = 0; - S32 credit = 0; - S32 committed = 0; - std::string desc; - - msg->getS32("MoneyData", "MoneyBalance", balance); - msg->getS32("MoneyData", "SquareMetersCredit", credit); - msg->getS32("MoneyData", "SquareMetersCommitted", committed); - msg->getStringFast(_PREHASH_MoneyData, _PREHASH_Description, desc); - LL_INFOS("Messaging") << "L$, credit, committed: " << balance << " " << credit << " " - << committed << LL_ENDL; - - if (gStatusBar) - { - S32 old_balance = gStatusBar->getBalance(); - - // This is an update, not the first transmission of balance - if (old_balance != 0) - { - // this is actually an update - if (balance > old_balance) - { - LLFirstUse::useBalanceIncrease(balance - old_balance); - } - else if (balance < old_balance) - { - LLFirstUse::useBalanceDecrease(balance - old_balance); - } - } - - gStatusBar->setBalance(balance); - gStatusBar->setLandCredit(credit); - gStatusBar->setLandCommitted(committed); - } - - LLUUID tid; - msg->getUUID("MoneyData", "TransactionID", tid); - static std::deque<LLUUID> recent; - if(!desc.empty() && gSavedSettings.getBOOL("NotifyMoneyChange") - && (std::find(recent.rbegin(), recent.rend(), tid) == recent.rend())) - { - // Make the user confirm the transaction, since they might - // have missed something during an event. - // *TODO: Translate - LLSD args; - args["MESSAGE"] = desc; - LLNotifications::instance().add("SystemMessage", args); - - // Once the 'recent' container gets large enough, chop some - // off the beginning. - const U32 MAX_LOOKBACK = 30; - const S32 POP_FRONT_SIZE = 12; - if(recent.size() > MAX_LOOKBACK) - { - LL_DEBUGS("Messaging") << "Removing oldest transaction records" << LL_ENDL; - recent.erase(recent.begin(), recent.begin() + POP_FRONT_SIZE); - } - //LL_DEBUGS("Messaging") << "Pushing back transaction " << tid << LL_ENDL; - recent.push_back(tid); - } -} - -bool handle_special_notification_callback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - - if (0 == option) - { - // set the preference to the maturity of the region we're calling - int preferredMaturity = notification["payload"]["_region_access"].asInteger(); - gSavedSettings.setU32("PreferredMaturity", preferredMaturity); - gAgent.sendMaturityPreferenceToServer(preferredMaturity); - - } - - return false; -} - -// some of the server notifications need special handling. This is where we do that. -bool handle_special_notification(std::string notificationID, LLSD& llsdBlock) -{ - int regionAccess = llsdBlock["_region_access"].asInteger(); - llsdBlock["REGIONMATURITY"] = LLViewerRegion::accessToString(regionAccess); - - // we're going to throw the LLSD in there in case anyone ever wants to use it - LLNotifications::instance().add(notificationID+"_Notify", llsdBlock); - - if (regionAccess == SIM_ACCESS_MATURE) - { - if (gAgent.isTeen()) - { - LLNotifications::instance().add(notificationID+"_KB", llsdBlock); - return true; - } - else if (gAgent.prefersPG()) - { - LLNotifications::instance().add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback); - return true; - } - } - else if (regionAccess == SIM_ACCESS_ADULT) - { - if (!gAgent.isAdult()) - { - LLNotifications::instance().add(notificationID+"_KB", llsdBlock); - return true; - } - else if (gAgent.prefersPG() || gAgent.prefersMature()) - { - LLNotifications::instance().add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback); - return true; - } - } - return false; -} - -bool attempt_standard_notification(LLMessageSystem* msgsystem) -{ - // if we have additional alert data - if (msgsystem->has(_PREHASH_AlertInfo) && msgsystem->getNumberOfBlocksFast(_PREHASH_AlertInfo) > 0) - { - // notification was specified using the new mechanism, so we can just handle it here - std::string notificationID; - std::string llsdRaw; - LLSD llsdBlock; - msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID); - msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_ExtraParams, llsdRaw); - if (llsdRaw.length()) - { - std::istringstream llsdData(llsdRaw); - if (!LLSDSerialize::deserialize(llsdBlock, llsdData, llsdRaw.length())) - { - llwarns << "attempt_standard_notification: Attempted to read notification parameter data into LLSD but failed:" << llsdRaw << llendl; - } - } - - if ( - (notificationID == "RegionEntryAccessBlocked") || - (notificationID == "LandClaimAccessBlocked") || - (notificationID == "LandBuyAccessBlocked") - ) - { - /*--------------------------------------------------------------------- - (Commented so a grep will find the notification strings, since - we construct them on the fly; if you add additional notifications, - please update the comment.) - - Could throw any of the following notifications: - - RegionEntryAccessBlocked - RegionEntryAccessBlocked_Notify - RegionEntryAccessBlocked_Change - RegionEntryAccessBlocked_KB - LandClaimAccessBlocked - LandClaimAccessBlocked_Notify - LandClaimAccessBlocked_Change - LandClaimAccessBlocked_KB - LandBuyAccessBlocked - LandBuyAccessBlocked_Notify - LandBuyAccessBlocked_Change - LandBuyAccessBlocked_KB - - -----------------------------------------------------------------------*/ - if (handle_special_notification(notificationID, llsdBlock)) - { - return true; - } - } - - LLNotifications::instance().add(notificationID, llsdBlock); - return true; - } - return false; -} - - -void process_agent_alert_message(LLMessageSystem* msgsystem, void** user_data) -{ - // make sure the cursor is back to the usual default since the - // alert is probably due to some kind of error. - gViewerWindow->getWindow()->resetBusyCount(); - - if (!attempt_standard_notification(msgsystem)) - { - BOOL modal = FALSE; - msgsystem->getBOOL("AlertData", "Modal", modal); - std::string buffer; - msgsystem->getStringFast(_PREHASH_AlertData, _PREHASH_Message, buffer); - process_alert_core(buffer, modal); - } -} - -// The only difference between this routine and the previous is the fact that -// for this routine, the modal parameter is always false. Sadly, for the message -// handled by this routine, there is no "Modal" parameter on the message, and -// there's no API to tell if a message has the given parameter or not. -// So we can't handle the messages with the same handler. -void process_alert_message(LLMessageSystem *msgsystem, void **user_data) -{ - // make sure the cursor is back to the usual default since the - // alert is probably due to some kind of error. - gViewerWindow->getWindow()->resetBusyCount(); - - if (!attempt_standard_notification(msgsystem)) - { - BOOL modal = FALSE; - std::string buffer; - msgsystem->getStringFast(_PREHASH_AlertData, _PREHASH_Message, buffer); - process_alert_core(buffer, modal); - } -} - -void process_alert_core(const std::string& message, BOOL modal) -{ - // HACK -- handle callbacks for specific alerts - if ( message == "You died and have been teleported to your home location") - { - LLViewerStats::getInstance()->incStat(LLViewerStats::ST_KILLED_COUNT); - } - else if( message == "Home position set." ) - { - // save the home location image to disk - std::string snap_filename = gDirUtilp->getLindenUserDir(); - snap_filename += gDirUtilp->getDirDelimiter(); - snap_filename += SCREEN_HOME_FILENAME; - gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight(), FALSE, FALSE); - } - - const std::string ALERT_PREFIX("ALERT: "); - const std::string NOTIFY_PREFIX("NOTIFY: "); - if (message.find(ALERT_PREFIX) == 0) - { - // Allow the server to spawn a named alert so that server alerts can be - // translated out of English. - std::string alert_name(message.substr(ALERT_PREFIX.length())); - LLNotifications::instance().add(alert_name); - } - else if (message.find(NOTIFY_PREFIX) == 0) - { - // Allow the server to spawn a named notification so that server notifications can be - // translated out of English. - std::string notify_name(message.substr(NOTIFY_PREFIX.length())); - LLNotifications::instance().add(notify_name); - } - else if (message[0] == '/') - { - // System message is important, show in upper-right box not tip - std::string text(message.substr(1)); - LLSD args; - if (text.substr(0,17) == "RESTART_X_MINUTES") - { - S32 mins = 0; - LLStringUtil::convertToS32(text.substr(18), mins); - args["MINUTES"] = llformat("%d",mins); - LLNotifications::instance().add("RegionRestartMinutes", args); - } - else if (text.substr(0,17) == "RESTART_X_SECONDS") - { - S32 secs = 0; - LLStringUtil::convertToS32(text.substr(18), secs); - args["SECONDS"] = llformat("%d",secs); - LLNotifications::instance().add("RegionRestartSeconds", args); - } - else - { - std::string new_msg =LLNotifications::instance().getGlobalString(text); - args["MESSAGE"] = new_msg; - LLNotifications::instance().add("SystemMessage", args); - } - } - else if (modal) - { - LLSD args; - std::string new_msg =LLNotifications::instance().getGlobalString(message); - args["ERROR_MESSAGE"] = new_msg; - LLNotifications::instance().add("ErrorMessage", args); - } - else - { - LLSD args; - std::string new_msg =LLNotifications::instance().getGlobalString(message); - args["MESSAGE"] = new_msg; - LLNotifications::instance().add("SystemMessageTip", args); - } -} - -mean_collision_list_t gMeanCollisionList; -time_t gLastDisplayedTime = 0; - -void handle_show_mean_events(void *) -{ - if (gNoRender) - { - return; - } - LLFloaterReg::showInstance("bumps"); - //LLFloaterBump::showInstance(); -} - -void mean_name_callback(const LLUUID &id, const std::string& first, const std::string& last, BOOL always_false) -{ - if (gNoRender) - { - return; - } - - static const U32 max_collision_list_size = 20; - if (gMeanCollisionList.size() > max_collision_list_size) - { - mean_collision_list_t::iterator iter = gMeanCollisionList.begin(); - for (U32 i=0; i<max_collision_list_size; i++) iter++; - for_each(iter, gMeanCollisionList.end(), DeletePointer()); - gMeanCollisionList.erase(iter, gMeanCollisionList.end()); - } - - for (mean_collision_list_t::iterator iter = gMeanCollisionList.begin(); - iter != gMeanCollisionList.end(); ++iter) - { - LLMeanCollisionData *mcd = *iter; - if (mcd->mPerp == id) - { - mcd->mFirstName = first; - mcd->mLastName = last; - } - } -} - -void process_mean_collision_alert_message(LLMessageSystem *msgsystem, void **user_data) -{ - if (gAgent.inPrelude()) - { - // In prelude, bumping is OK. This dialog is rather confusing to - // newbies, so we don't show it. Drop the packet on the floor. - return; - } - - // make sure the cursor is back to the usual default since the - // alert is probably due to some kind of error. - gViewerWindow->getWindow()->resetBusyCount(); - - LLUUID perp; - U32 time; - U8 u8type; - EMeanCollisionType type; - F32 mag; - - S32 i, num = msgsystem->getNumberOfBlocks(_PREHASH_MeanCollision); - - for (i = 0; i < num; i++) - { - msgsystem->getUUIDFast(_PREHASH_MeanCollision, _PREHASH_Perp, perp); - msgsystem->getU32Fast(_PREHASH_MeanCollision, _PREHASH_Time, time); - msgsystem->getF32Fast(_PREHASH_MeanCollision, _PREHASH_Mag, mag); - msgsystem->getU8Fast(_PREHASH_MeanCollision, _PREHASH_Type, u8type); - - type = (EMeanCollisionType)u8type; - - BOOL b_found = FALSE; - - for (mean_collision_list_t::iterator iter = gMeanCollisionList.begin(); - iter != gMeanCollisionList.end(); ++iter) - { - LLMeanCollisionData *mcd = *iter; - if ((mcd->mPerp == perp) && (mcd->mType == type)) - { - mcd->mTime = time; - mcd->mMag = mag; - b_found = TRUE; - break; - } - } - - if (!b_found) - { - LLMeanCollisionData *mcd = new LLMeanCollisionData(gAgentID, perp, time, type, mag); - gMeanCollisionList.push_front(mcd); - const BOOL is_group = FALSE; - gCacheName->get(perp, is_group, &mean_name_callback); - } - } -} - -void process_frozen_message(LLMessageSystem *msgsystem, void **user_data) -{ - // make sure the cursor is back to the usual default since the - // alert is probably due to some kind of error. - gViewerWindow->getWindow()->resetBusyCount(); - BOOL b_frozen; - - msgsystem->getBOOL("FrozenData", "Data", b_frozen); - - // TODO: make being frozen change view - if (b_frozen) - { - } - else - { - } -} - -// do some extra stuff once we get our economy data -void process_economy_data(LLMessageSystem *msg, void** /*user_data*/) -{ - LLGlobalEconomy::processEconomyData(msg, LLGlobalEconomy::Singleton::getInstance()); - - S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); - - LL_INFOS_ONCE("Messaging") << "EconomyData message arrived; upload cost is L$" << upload_cost << LL_ENDL; - - gMenuHolder->childSetLabelArg("Upload Image", "[COST]", llformat("%d", upload_cost)); - gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", llformat("%d", upload_cost)); - gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", llformat("%d", upload_cost)); - gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", llformat("%d", upload_cost)); -} - -void notify_cautioned_script_question(const LLSD& notification, const LLSD& response, S32 orig_questions, BOOL granted) -{ - // only continue if at least some permissions were requested - if (orig_questions) - { - // check to see if the person we are asking - - // "'[OBJECTNAME]', an object owned by '[OWNERNAME]', - // located in [REGIONNAME] at [REGIONPOS], - // has been <granted|denied> permission to: [PERMISSIONS]." - - LLUIString notice(LLTrans::getString(granted ? "ScriptQuestionCautionChatGranted" : "ScriptQuestionCautionChatDenied")); - - // always include the object name and owner name - notice.setArg("[OBJECTNAME]", notification["payload"]["object_name"].asString()); - notice.setArg("[OWNERNAME]", notification["payload"]["owner_name"].asString()); - - // try to lookup viewerobject that corresponds to the object that - // requested permissions (here, taskid->requesting object id) - BOOL foundpos = FALSE; - LLViewerObject* viewobj = gObjectList.findObject(notification["payload"]["task_id"].asUUID()); - if (viewobj) - { - // found the viewerobject, get it's position in its region - LLVector3 objpos(viewobj->getPosition()); - - // try to lookup the name of the region the object is in - LLViewerRegion* viewregion = viewobj->getRegion(); - if (viewregion) - { - // got the region, so include the region and 3d coordinates of the object - notice.setArg("[REGIONNAME]", viewregion->getName()); - std::string formatpos = llformat("%.1f, %.1f,%.1f", objpos[VX], objpos[VY], objpos[VZ]); - notice.setArg("[REGIONPOS]", formatpos); - - foundpos = TRUE; - } - } - - if (!foundpos) - { - // unable to determine location of the object - notice.setArg("[REGIONNAME]", "(unknown region)"); - notice.setArg("[REGIONPOS]", "(unknown position)"); - } - - // check each permission that was requested, and list each - // permission that has been flagged as a caution permission - BOOL caution = FALSE; - S32 count = 0; - std::string perms; - for (S32 i = 0; i < SCRIPT_PERMISSION_EOF; i++) - { - if ((orig_questions & LSCRIPTRunTimePermissionBits[i]) && SCRIPT_QUESTION_IS_CAUTION[i]) - { - count++; - caution = TRUE; - - // add a comma before the permission description if it is not the first permission - // added to the list or the last permission to check - if ((count > 1) && (i < SCRIPT_PERMISSION_EOF)) - { - perms.append(", "); - } - - perms.append(LLTrans::getString(SCRIPT_QUESTIONS[i])); - } - } - - notice.setArg("[PERMISSIONS]", perms); - - // log a chat message as long as at least one requested permission - // is a caution permission - if (caution) - { - LLChat chat(notice.getString()); - LLFloaterChat::addChat(chat, FALSE, FALSE); - } - } -} - -bool script_question_cb(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - LLMessageSystem *msg = gMessageSystem; - S32 orig = notification["payload"]["questions"].asInteger(); - S32 new_questions = orig; - - // check whether permissions were granted or denied - BOOL allowed = TRUE; - // the "yes/accept" button is the first button in the template, making it button 0 - // if any other button was clicked, the permissions were denied - if (option != 0) - { - new_questions = 0; - allowed = FALSE; - } - - LLUUID task_id = notification["payload"]["task_id"].asUUID(); - LLUUID item_id = notification["payload"]["item_id"].asUUID(); - - // reply with the permissions granted or denied - msg->newMessageFast(_PREHASH_ScriptAnswerYes); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_Data); - msg->addUUIDFast(_PREHASH_TaskID, task_id); - msg->addUUIDFast(_PREHASH_ItemID, item_id); - msg->addS32Fast(_PREHASH_Questions, new_questions); - msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); - - // only log a chat message if caution prompts are enabled - if (gSavedSettings.getBOOL("PermissionsCautionEnabled")) - { - // log a chat message, if appropriate - notify_cautioned_script_question(notification, response, orig, allowed); - } - - if ( response["Mute"] ) // mute - { - LLMuteList::getInstance()->add(LLMute(item_id, notification["payload"]["object_name"].asString(), LLMute::OBJECT)); - - // purge the message queue of any previously queued requests from the same source. DEV-4879 - class OfferMatcher : public LLNotifyBoxView::Matcher - { - public: - OfferMatcher(const LLUUID& to_block) : blocked_id(to_block) {} - BOOL matches(const LLNotificationPtr notification) const - { - if (notification->getName() == "ScriptQuestionCaution" - || notification->getName() == "ScriptQuestion") - { - return (notification->getPayload()["item_id"].asUUID() == blocked_id); - } - return FALSE; - } - private: - const LLUUID& blocked_id; - }; - // should do this via the channel - gNotifyBoxView->purgeMessagesMatching(OfferMatcher(item_id)); - } - - if (response["Details"]) - { - // respawn notification... - LLNotifications::instance().add(notification["name"], notification["substitutions"], notification["payload"]); - - // ...with description on top - LLNotifications::instance().add("DebitPermissionDetails"); - } - return false; -} -static LLNotificationFunctorRegistration script_question_cb_reg_1("ScriptQuestion", script_question_cb); -static LLNotificationFunctorRegistration script_question_cb_reg_2("ScriptQuestionCaution", script_question_cb); - -void process_script_question(LLMessageSystem *msg, void **user_data) -{ - // *TODO: Translate owner name -> [FIRST] [LAST] - - LLHost sender = msg->getSender(); - - LLUUID taskid; - LLUUID itemid; - S32 questions; - std::string object_name; - std::string owner_name; - - // taskid -> object key of object requesting permissions - msg->getUUIDFast(_PREHASH_Data, _PREHASH_TaskID, taskid ); - // itemid -> script asset key of script requesting permissions - msg->getUUIDFast(_PREHASH_Data, _PREHASH_ItemID, itemid ); - msg->getStringFast(_PREHASH_Data, _PREHASH_ObjectName, object_name); - msg->getStringFast(_PREHASH_Data, _PREHASH_ObjectOwner, owner_name); - msg->getS32Fast(_PREHASH_Data, _PREHASH_Questions, questions ); - - // Special case. If the objects are owned by this agent, throttle per-object instead - // of per-owner. It's common for residents to reset a ton of scripts that re-request - // permissions, as with tier boxes. UUIDs can't be valid agent names and vice-versa, - // so we'll reuse the same namespace for both throttle types. - std::string throttle_name = owner_name; - std::string self_name; - LLAgentUI::buildName( self_name ); - if( owner_name == self_name ) - { - throttle_name = taskid.getString(); - } - - // don't display permission requests if this object is muted - if (LLMuteList::getInstance()->isMuted(taskid)) return; - - // throttle excessive requests from any specific user's scripts - typedef LLKeyThrottle<std::string> LLStringThrottle; - static LLStringThrottle question_throttle( LLREQUEST_PERMISSION_THROTTLE_LIMIT, LLREQUEST_PERMISSION_THROTTLE_INTERVAL ); - - switch (question_throttle.noteAction(throttle_name)) - { - case LLStringThrottle::THROTTLE_NEWLY_BLOCKED: - LL_INFOS("Messaging") << "process_script_question throttled" - << " owner_name:" << owner_name - << LL_ENDL; - // Fall through - - case LLStringThrottle::THROTTLE_BLOCKED: - // Escape altogether until we recover - return; - - case LLStringThrottle::THROTTLE_OK: - break; - } - - std::string script_question; - if (questions) - { - BOOL caution = FALSE; - S32 count = 0; - LLSD args; - args["OBJECTNAME"] = object_name; - args["NAME"] = owner_name; - - // check the received permission flags against each permission - for (S32 i = 0; i < SCRIPT_PERMISSION_EOF; i++) - { - if (questions & LSCRIPTRunTimePermissionBits[i]) - { - count++; - script_question += " " + LLTrans::getString(SCRIPT_QUESTIONS[i]) + "\n"; - - // check whether permission question should cause special caution dialog - caution |= (SCRIPT_QUESTION_IS_CAUTION[i]); - } - } - args["QUESTIONS"] = script_question; - - LLSD payload; - payload["task_id"] = taskid; - payload["item_id"] = itemid; - payload["sender"] = sender.getIPandPort(); - payload["questions"] = questions; - payload["object_name"] = object_name; - payload["owner_name"] = owner_name; - - // check whether cautions are even enabled or not - if (gSavedSettings.getBOOL("PermissionsCautionEnabled")) - { - // display the caution permissions prompt - LLNotifications::instance().add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload); - } - else - { - // fall back to default behavior if cautions are entirely disabled - LLNotifications::instance().add("ScriptQuestion", args, payload); - } - - } -} - - -void process_derez_container(LLMessageSystem *msg, void**) -{ - LL_WARNS("Messaging") << "call to deprecated process_derez_container" << LL_ENDL; -} - -void container_inventory_arrived(LLViewerObject* object, - InventoryObjectList* inventory, - S32 serial_num, - void* data) -{ - LL_DEBUGS("Messaging") << "container_inventory_arrived()" << LL_ENDL; - if( gAgent.cameraMouselook() ) - { - gAgent.changeCameraToDefault(); - } - - LLFloaterInventory* view = LLFloaterInventory::getActiveInventory(); - - if (inventory->size() > 2) - { - // create a new inventory category to put this in - LLUUID cat_id; - cat_id = gInventory.createNewCategory(gInventory.getRootFolderID(), - LLAssetType::AT_NONE, - LLTrans::getString("AcquiredItems")); - - InventoryObjectList::const_iterator it = inventory->begin(); - InventoryObjectList::const_iterator end = inventory->end(); - for ( ; it != end; ++it) - { - if ((*it)->getType() != LLAssetType::AT_CATEGORY && - (*it)->getType() != LLAssetType::AT_ROOT_CATEGORY) - { - LLInventoryObject* obj = (LLInventoryObject*)(*it); - LLInventoryItem* item = (LLInventoryItem*)(obj); - LLUUID item_id; - item_id.generate(); - time_t creation_date_utc = time_corrected(); - LLPointer<LLViewerInventoryItem> new_item - = new LLViewerInventoryItem(item_id, - cat_id, - item->getPermissions(), - item->getAssetUUID(), - item->getType(), - item->getInventoryType(), - item->getName(), - item->getDescription(), - LLSaleInfo::DEFAULT, - item->getFlags(), - creation_date_utc); - new_item->updateServer(TRUE); - gInventory.updateItem(new_item); - } - } - gInventory.notifyObservers(); - if(view) - { - view->getPanel()->setSelection(cat_id, TAKE_FOCUS_NO); - } - } - else if (inventory->size() == 2) - { - // we're going to get one fake root category as well as the - // one actual object - InventoryObjectList::iterator it = inventory->begin(); - - if ((*it)->getType() == LLAssetType::AT_CATEGORY || - (*it)->getType() == LLAssetType::AT_ROOT_CATEGORY) - { - ++it; - } - - LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it)); - LLUUID category = gInventory.findCategoryUUIDForType(item->getType()); - - LLUUID item_id; - item_id.generate(); - time_t creation_date_utc = time_corrected(); - LLPointer<LLViewerInventoryItem> new_item - = new LLViewerInventoryItem(item_id, category, - item->getPermissions(), - item->getAssetUUID(), - item->getType(), - item->getInventoryType(), - item->getName(), - item->getDescription(), - LLSaleInfo::DEFAULT, - item->getFlags(), - creation_date_utc); - new_item->updateServer(TRUE); - gInventory.updateItem(new_item); - gInventory.notifyObservers(); - if(view) - { - view->getPanel()->setSelection(item_id, TAKE_FOCUS_NO); - } - } - - // we've got the inventory, now delete this object if this was a take - BOOL delete_object = (BOOL)(intptr_t)data; - LLViewerRegion *region = gAgent.getRegion(); - if (delete_object && region) - { - gMessageSystem->newMessageFast(_PREHASH_ObjectDelete); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - const U8 NO_FORCE = 0; - gMessageSystem->addU8Fast(_PREHASH_Force, NO_FORCE); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID()); - gMessageSystem->sendReliable(region->getHost()); - } -} - -// method to format the time. -std::string formatted_time(const time_t& the_time) -{ - std::string dateStr = "["+LLTrans::getString("LTimeWeek")+"] [" - +LLTrans::getString("LTimeMonth")+"] [" - +LLTrans::getString("LTimeDay")+"] [" - +LLTrans::getString("LTimeHour")+"]:[" - +LLTrans::getString("LTimeMin")+"]:[" - +LLTrans::getString("LTimeSec")+"] [" - +LLTrans::getString("LTimeYear")+"]"; - - LLSD substitution; - substitution["datetime"] = (S32) the_time; - LLStringUtil::format (dateStr, substitution); - return dateStr; -} - - -void process_teleport_failed(LLMessageSystem *msg, void**) -{ - std::string reason; - std::string big_reason; - LLSD args; - - // if we have additional alert data - if (msg->has(_PREHASH_AlertInfo) && msg->getSizeFast(_PREHASH_AlertInfo, _PREHASH_Message) > 0) - { - // Get the message ID - msg->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, reason); - big_reason = LLAgent::sTeleportErrorMessages[reason]; - if ( big_reason.size() > 0 ) - { // Substitute verbose reason from the local map - args["REASON"] = big_reason; - } - else - { // Nothing found in the map - use what the server returned in the original message block - msg->getStringFast(_PREHASH_Info, _PREHASH_Reason, reason); - args["REASON"] = reason; - } - - LLSD llsd_block; - std::string llsd_raw; - msg->getStringFast(_PREHASH_AlertInfo, _PREHASH_ExtraParams, llsd_raw); - if (llsd_raw.length()) - { - std::istringstream llsd_data(llsd_raw); - if (!LLSDSerialize::deserialize(llsd_block, llsd_data, llsd_raw.length())) - { - llwarns << "process_teleport_failed: Attempted to read alert parameter data into LLSD but failed:" << llsd_raw << llendl; - } - else - { - // change notification name in this special case - if (handle_special_notification("RegionEntryAccessBlocked", llsd_block)) - { - if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE ) - { - gAgent.setTeleportState( LLAgent::TELEPORT_NONE ); - } - return; - } - } - } - - } - else - { - msg->getStringFast(_PREHASH_Info, _PREHASH_Reason, reason); - - big_reason = LLAgent::sTeleportErrorMessages[reason]; - if ( big_reason.size() > 0 ) - { // Substitute verbose reason from the local map - args["REASON"] = big_reason; - } - else - { // Nothing found in the map - use what the server returned - args["REASON"] = reason; - } - } - - LLNotifications::instance().add("CouldNotTeleportReason", args); - - // Let the interested parties know that teleport failed. - LLViewerParcelMgr::getInstance()->onTeleportFailed(); - - if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE ) - { - gAgent.setTeleportState( LLAgent::TELEPORT_NONE ); - } -} - -void process_teleport_local(LLMessageSystem *msg,void**) -{ - LLUUID agent_id; - msg->getUUIDFast(_PREHASH_Info, _PREHASH_AgentID, agent_id); - if (agent_id != gAgent.getID()) - { - LL_WARNS("Messaging") << "Got teleport notification for wrong agent!" << LL_ENDL; - return; - } - - U32 location_id; - LLVector3 pos, look_at; - U32 teleport_flags; - msg->getU32Fast(_PREHASH_Info, _PREHASH_LocationID, location_id); - msg->getVector3Fast(_PREHASH_Info, _PREHASH_Position, pos); - msg->getVector3Fast(_PREHASH_Info, _PREHASH_LookAt, look_at); - msg->getU32Fast(_PREHASH_Info, _PREHASH_TeleportFlags, teleport_flags); - - if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE ) - { - gAgent.setTeleportState( LLAgent::TELEPORT_NONE ); - } - - // Sim tells us whether the new position is off the ground - if (teleport_flags & TELEPORT_FLAGS_IS_FLYING) - { - gAgent.setFlying(TRUE); - } - else - { - gAgent.setFlying(FALSE); - } - - gAgent.setPositionAgent(pos); - gAgent.slamLookAt(look_at); - - // likewise make sure the camera is behind the avatar - gAgent.resetView(TRUE, TRUE); - - // send camera update to new region - gAgent.updateCamera(); - - send_agent_update(TRUE, TRUE); - - // Let the interested parties know we've teleported. - // Vadim *HACK: Agent position seems to get reset (to render position?) - // on each frame, so we have to pass the new position manually. - LLViewerParcelMgr::getInstance()->onTeleportFinished(true, gAgent.getPosGlobalFromAgent(pos)); -} - -void send_simple_im(const LLUUID& to_id, - const std::string& message, - EInstantMessage dialog, - const LLUUID& id) -{ - std::string my_name; - LLAgentUI::buildFullname(my_name); - send_improved_im(to_id, - my_name, - message, - IM_ONLINE, - dialog, - id, - NO_TIMESTAMP, - (U8*)EMPTY_BINARY_BUCKET, - EMPTY_BINARY_BUCKET_SIZE); -} - -void send_group_notice(const LLUUID& group_id, - const std::string& subject, - const std::string& message, - const LLInventoryItem* item) -{ - // Put this notice into an instant message form. - // This will mean converting the item to a binary bucket, - // and the subject/message into a single field. - std::string my_name; - LLAgentUI::buildFullname(my_name); - - // Combine subject + message into a single string. - std::ostringstream subject_and_message; - // TODO: turn all existing |'s into ||'s in subject and message. - subject_and_message << subject << "|" << message; - - // Create an empty binary bucket. - U8 bin_bucket[MAX_INVENTORY_BUFFER_SIZE]; - U8* bucket_to_send = bin_bucket; - bin_bucket[0] = '\0'; - S32 bin_bucket_size = EMPTY_BINARY_BUCKET_SIZE; - // If there is an item being sent, pack it into the binary bucket. - if (item) - { - LLSD item_def; - item_def["item_id"] = item->getUUID(); - item_def["owner_id"] = item->getPermissions().getOwner(); - std::ostringstream ostr; - LLSDSerialize::serialize(item_def, ostr, LLSDSerialize::LLSD_XML); - bin_bucket_size = ostr.str().copy( - (char*)bin_bucket, ostr.str().size()); - bin_bucket[bin_bucket_size] = '\0'; - } - else - { - bucket_to_send = (U8*) EMPTY_BINARY_BUCKET; - } - - - send_improved_im( - group_id, - my_name, - subject_and_message.str(), - IM_ONLINE, - IM_GROUP_NOTICE, - LLUUID::null, - NO_TIMESTAMP, - bucket_to_send, - bin_bucket_size); -} - -bool handle_lure_callback(const LLSD& notification, const LLSD& response) -{ - std::string text = response["message"].asString(); - S32 option = LLNotification::getSelectedOption(notification, response); - - if(0 == option) - { - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_StartLure); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_Info); - msg->addU8Fast(_PREHASH_LureType, (U8)0); // sim will fill this in. - msg->addStringFast(_PREHASH_Message, text); - for(LLSD::array_const_iterator it = notification["payload"]["ids"].beginArray(); - it != notification["payload"]["ids"].endArray(); - ++it) - { - msg->nextBlockFast(_PREHASH_TargetData); - msg->addUUIDFast(_PREHASH_TargetID, it->asUUID()); - } - gAgent.sendReliableMessage(); - } - - return false; -} - -void handle_lure(const LLUUID& invitee) -{ - LLDynamicArray<LLUUID> ids; - ids.push_back(invitee); - handle_lure(ids); -} - -// Prompt for a message to the invited user. -void handle_lure(const std::vector<LLUUID>& ids) -{ - LLSD edit_args; - edit_args["REGION"] = gAgent.getRegion()->getName(); - - LLSD payload; - for (LLDynamicArray<LLUUID>::const_iterator it = ids.begin(); - it != ids.end(); - ++it) - { - payload["ids"].append(*it); - } - if (gAgent.isGodlike()) - { - LLNotifications::instance().add("OfferTeleportFromGod", edit_args, payload, handle_lure_callback); - } - else - { - LLNotifications::instance().add("OfferTeleport", edit_args, payload, handle_lure_callback); - } -} - - -void send_improved_im(const LLUUID& to_id, - const std::string& name, - const std::string& message, - U8 offline, - EInstantMessage dialog, - const LLUUID& id, - U32 timestamp, - const U8* binary_bucket, - S32 binary_bucket_size) -{ - pack_instant_message( - gMessageSystem, - gAgent.getID(), - FALSE, - gAgent.getSessionID(), - to_id, - name, - message, - offline, - dialog, - id, - 0, - LLUUID::null, - gAgent.getPositionAgent(), - timestamp, - binary_bucket, - binary_bucket_size); - gAgent.sendReliableMessage(); -} - - -void send_places_query(const LLUUID& query_id, - const LLUUID& trans_id, - const std::string& query_text, - U32 query_flags, - S32 category, - const std::string& sim_name) -{ - LLMessageSystem* msg = gMessageSystem; - - msg->newMessage("PlacesQuery"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->addUUID("QueryID", query_id); - msg->nextBlock("TransactionData"); - msg->addUUID("TransactionID", trans_id); - msg->nextBlock("QueryData"); - msg->addString("QueryText", query_text); - msg->addU32("QueryFlags", query_flags); - msg->addS8("Category", (S8)category); - msg->addString("SimName", sim_name); - gAgent.sendReliableMessage(); -} - - -void process_user_info_reply(LLMessageSystem* msg, void**) -{ - LLUUID agent_id; - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); - if(agent_id != gAgent.getID()) - { - LL_WARNS("Messaging") << "process_user_info_reply - " - << "wrong agent id." << LL_ENDL; - } - - BOOL im_via_email; - msg->getBOOLFast(_PREHASH_UserData, _PREHASH_IMViaEMail, im_via_email); - std::string email; - msg->getStringFast(_PREHASH_UserData, _PREHASH_EMail, email); - std::string dir_visibility; - msg->getString( "UserData", "DirectoryVisibility", dir_visibility); - - LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email, email); - LLFloaterPostcard::updateUserInfo(email); -} - - -//--------------------------------------------------------------------------- -// Script Dialog -//--------------------------------------------------------------------------- - -const S32 SCRIPT_DIALOG_MAX_BUTTONS = 12; -const S32 SCRIPT_DIALOG_BUTTON_STR_SIZE = 24; -const S32 SCRIPT_DIALOG_MAX_MESSAGE_SIZE = 512; -const char* SCRIPT_DIALOG_HEADER = "Script Dialog:\n"; - -bool callback_script_dialog(const LLSD& notification, const LLSD& response) -{ - LLNotificationForm form(notification["form"]); - std::string button = LLNotification::getSelectedOptionName(response); - S32 button_idx = LLNotification::getSelectedOption(notification, response); - // Didn't click "Ignore" - if (button_idx != -1) - { - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("ScriptDialogReply"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->nextBlock("Data"); - msg->addUUID("ObjectID", notification["payload"]["object_id"].asUUID()); - msg->addS32("ChatChannel", notification["payload"]["chat_channel"].asInteger()); - msg->addS32("ButtonIndex", button_idx); - msg->addString("ButtonLabel", button); - msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); - } - - return false; -} -static LLNotificationFunctorRegistration callback_script_dialog_reg_1("ScriptDialog", callback_script_dialog); -static LLNotificationFunctorRegistration callback_script_dialog_reg_2("ScriptDialogGroup", callback_script_dialog); - -void process_script_dialog(LLMessageSystem* msg, void**) -{ - S32 i; - LLSD payload; - - LLUUID object_id; - msg->getUUID("Data", "ObjectID", object_id); - - if (LLMuteList::getInstance()->isMuted(object_id)) - { - return; - } - - std::string message; - std::string first_name; - std::string last_name; - std::string title; - - S32 chat_channel; - msg->getString("Data", "FirstName", first_name); - msg->getString("Data", "LastName", last_name); - msg->getString("Data", "ObjectName", title); - msg->getString("Data", "Message", message); - msg->getS32("Data", "ChatChannel", chat_channel); - - // unused for now - LLUUID image_id; - msg->getUUID("Data", "ImageID", image_id); - - payload["sender"] = msg->getSender().getIPandPort(); - payload["object_id"] = object_id; - payload["chat_channel"] = chat_channel; - - // build up custom form - S32 button_count = msg->getNumberOfBlocks("Buttons"); - if (button_count > SCRIPT_DIALOG_MAX_BUTTONS) - { - llwarns << "Too many script dialog buttons - omitting some" << llendl; - button_count = SCRIPT_DIALOG_MAX_BUTTONS; - } - - LLNotificationForm form; - for (i = 0; i < button_count; i++) - { - std::string tdesc; - msg->getString("Buttons", "ButtonLabel", tdesc, i); - form.addElement("button", std::string(tdesc)); - } - - LLSD args; - args["TITLE"] = title; - args["MESSAGE"] = message; - LLNotificationPtr notification; - if (!first_name.empty()) - { - args["FIRST"] = first_name; - args["LAST"] = last_name; - notification = LLNotifications::instance().add( - LLNotification::Params("ScriptDialog").substitutions(args).payload(payload).form_elements(form.asLLSD())); - } - else - { - args["GROUPNAME"] = last_name; - notification = LLNotifications::instance().add( - LLNotification::Params("ScriptDialogGroup").substitutions(args).payload(payload).form_elements(form.asLLSD())); - } -} - -//--------------------------------------------------------------------------- - - -std::vector<LLSD> gLoadUrlList; - -bool callback_load_url(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - - if (0 == option) - { - LLWeb::loadURL(notification["payload"]["url"].asString()); - } - - return false; -} -static LLNotificationFunctorRegistration callback_load_url_reg("LoadWebPage", callback_load_url); - - -// We've got the name of the person who owns the object hurling the url. -// Display confirmation dialog. -void callback_load_url_name(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) -{ - std::vector<LLSD>::iterator it; - for (it = gLoadUrlList.begin(); it != gLoadUrlList.end(); ) - { - LLSD load_url_info = *it; - if (load_url_info["owner_id"].asUUID() == id) - { - it = gLoadUrlList.erase(it); - - std::string owner_name; - if (is_group) - { - owner_name = first + LLTrans::getString("Group"); - } - else - { - owner_name = first + " " + last; - } - - // For legacy name-only mutes. - if (LLMuteList::getInstance()->isMuted(LLUUID::null, owner_name)) - { - continue; - } - LLSD args; - args["URL"] = load_url_info["url"].asString(); - args["MESSAGE"] = load_url_info["message"].asString();; - args["OBJECTNAME"] = load_url_info["object_name"].asString(); - args["NAME"] = owner_name; - - LLNotifications::instance().add("LoadWebPage", args, load_url_info); - } - else - { - ++it; - } - } -} - -void process_load_url(LLMessageSystem* msg, void**) -{ - LLUUID object_id; - LLUUID owner_id; - BOOL owner_is_group; - char object_name[256]; /* Flawfinder: ignore */ - char message[256]; /* Flawfinder: ignore */ - char url[256]; /* Flawfinder: ignore */ - - msg->getString("Data", "ObjectName", 256, object_name); - msg->getUUID( "Data", "ObjectID", object_id); - msg->getUUID( "Data", "OwnerID", owner_id); - msg->getBOOL( "Data", "OwnerIsGroup", owner_is_group); - msg->getString("Data", "Message", 256, message); - msg->getString("Data", "URL", 256, url); - - LLSD payload; - payload["object_id"] = object_id; - payload["owner_id"] = owner_id; - payload["owner_is_group"] = owner_is_group; - payload["object_name"] = object_name; - payload["message"] = message; - payload["url"] = url; - - // URL is safety checked in load_url above - - // Check if object or owner is muted - if (LLMuteList::getInstance()->isMuted(object_id, object_name) || - LLMuteList::getInstance()->isMuted(owner_id)) - { - LL_INFOS("Messaging")<<"Ignoring load_url from muted object/owner."<<LL_ENDL; - return; - } - - // Add to list of pending name lookups - gLoadUrlList.push_back(payload); - - gCacheName->get(owner_id, owner_is_group, &callback_load_url_name); -} - - -void callback_download_complete(void** data, S32 result, LLExtStat ext_status) -{ - std::string* filepath = (std::string*)data; - LLSD args; - args["DOWNLOAD_PATH"] = *filepath; - LLNotifications::instance().add("FinishedRawDownload", args); - delete filepath; -} - - -void process_initiate_download(LLMessageSystem* msg, void**) -{ - LLUUID agent_id; - msg->getUUID("AgentData", "AgentID", agent_id); - if (agent_id != gAgent.getID()) - { - LL_WARNS("Messaging") << "Initiate download for wrong agent" << LL_ENDL; - return; - } - - std::string sim_filename; - std::string viewer_filename; - msg->getString("FileData", "SimFilename", sim_filename); - msg->getString("FileData", "ViewerFilename", viewer_filename); - - if (!gXferManager->validateFileForRequest(viewer_filename)) - { - llwarns << "SECURITY: Unauthorized download to local file " << viewer_filename << llendl; - return; - } - gXferManager->requestFile(viewer_filename, - sim_filename, - LL_PATH_NONE, - msg->getSender(), - FALSE, // don't delete remote - callback_download_complete, - (void**)new std::string(viewer_filename)); -} - - -void process_script_teleport_request(LLMessageSystem* msg, void**) -{ - std::string object_name; - std::string sim_name; - LLVector3 pos; - LLVector3 look_at; - - msg->getString("Data", "ObjectName", object_name); - msg->getString("Data", "SimName", sim_name); - msg->getVector3("Data", "SimPosition", pos); - msg->getVector3("Data", "LookAt", look_at); - - LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance(); - if(instance) - { - instance->trackURL( - sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]); - LLFloaterReg::showInstance("world_map", "center"); - } - - // remove above two lines and replace with below line - // to re-enable parcel browser for llMapDestination() - // LLURLDispatcher::dispatch(LLSLURL::buildSLURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]), FALSE); - -} - -void process_covenant_reply(LLMessageSystem* msg, void**) -{ - LLUUID covenant_id, estate_owner_id; - std::string estate_name; - U32 covenant_timestamp; - msg->getUUID("Data", "CovenantID", covenant_id); - msg->getU32("Data", "CovenantTimestamp", covenant_timestamp); - msg->getString("Data", "EstateName", estate_name); - msg->getUUID("Data", "EstateOwnerID", estate_owner_id); - - LLPanelEstateCovenant::updateEstateName(estate_name); - LLPanelLandCovenant::updateEstateName(estate_name); - LLFloaterBuyLand::updateEstateName(estate_name); - - std::string owner_name = - LLSLURL::buildCommand("agent", estate_owner_id, "inspect"); - LLPanelEstateCovenant::updateEstateOwnerName(owner_name); - LLPanelLandCovenant::updateEstateOwnerName(owner_name); - LLFloaterBuyLand::updateEstateOwnerName(owner_name); - - LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info"); - if (panel) - { - panel->updateEstateName(estate_name); - panel->updateEstateOwnerName(owner_name); - } - - // standard message, not from system - std::string last_modified; - if (covenant_timestamp == 0) - { - last_modified = LLTrans::getString("covenant_last_modified")+LLTrans::getString("never_text"); - } - else - { - last_modified = LLTrans::getString("covenant_last_modified")+"[" - +LLTrans::getString("LTimeWeek")+"] [" - +LLTrans::getString("LTimeMonth")+"] [" - +LLTrans::getString("LTimeDay")+"] [" - +LLTrans::getString("LTimeHour")+"]:[" - +LLTrans::getString("LTimeMin")+"]:[" - +LLTrans::getString("LTimeSec")+"] [" - +LLTrans::getString("LTimeYear")+"]"; - LLSD substitution; - substitution["datetime"] = (S32) covenant_timestamp; - LLStringUtil::format (last_modified, substitution); - } - - LLPanelEstateCovenant::updateLastModified(last_modified); - LLPanelLandCovenant::updateLastModified(last_modified); - LLFloaterBuyLand::updateLastModified(last_modified); - - // load the actual covenant asset data - const BOOL high_priority = TRUE; - if (covenant_id.notNull()) - { - gAssetStorage->getEstateAsset(gAgent.getRegionHost(), - gAgent.getID(), - gAgent.getSessionID(), - covenant_id, - LLAssetType::AT_NOTECARD, - ET_Covenant, - onCovenantLoadComplete, - NULL, - high_priority); - } - else - { - std::string covenant_text; - if (estate_owner_id.isNull()) - { - // mainland - covenant_text = LLTrans::getString("RegionNoCovenant"); - } - else - { - covenant_text = LLTrans::getString("RegionNoCovenantOtherOwner"); - } - LLPanelEstateCovenant::updateCovenantText(covenant_text, covenant_id); - LLPanelLandCovenant::updateCovenantText(covenant_text); - LLFloaterBuyLand::updateCovenantText(covenant_text, covenant_id); - if (panel) - { - panel->updateCovenantText(covenant_text); - } - } -} - -void onCovenantLoadComplete(LLVFS *vfs, - const LLUUID& asset_uuid, - LLAssetType::EType type, - void* user_data, S32 status, LLExtStat ext_status) -{ - LL_DEBUGS("Messaging") << "onCovenantLoadComplete()" << LL_ENDL; - std::string covenant_text; - if(0 == status) - { - LLVFile file(vfs, asset_uuid, type, LLVFile::READ); - - S32 file_length = file.getSize(); - - std::vector<char> buffer(file_length+1); - file.read((U8*)&buffer[0], file_length); - // put a EOS at the end - buffer[file_length] = '\0'; - - if( (file_length > 19) && !strncmp( &buffer[0], "Linden text version", 19 ) ) - { - LLViewerTextEditor::Params params; - params.name("temp"); - params.max_text_length(file_length+1); - LLViewerTextEditor * editor = LLUICtrlFactory::create<LLViewerTextEditor> (params); - if( !editor->importBuffer( &buffer[0], file_length+1 ) ) - { - LL_WARNS("Messaging") << "Problem importing estate covenant." << LL_ENDL; - covenant_text = "Problem importing estate covenant."; - } - else - { - // Version 0 (just text, doesn't include version number) - covenant_text = editor->getText(); - } - delete editor; - } - else - { - LL_WARNS("Messaging") << "Problem importing estate covenant: Covenant file format error." << LL_ENDL; - covenant_text = "Problem importing estate covenant: Covenant file format error."; - } - } - else - { - LLViewerStats::getInstance()->incStat( LLViewerStats::ST_DOWNLOAD_FAILED ); - - if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status || - LL_ERR_FILE_EMPTY == status) - { - covenant_text = "Estate covenant notecard is missing from database."; - } - else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status) - { - covenant_text = "Insufficient permissions to view estate covenant."; - } - else - { - covenant_text = "Unable to load estate covenant at this time."; - } - - LL_WARNS("Messaging") << "Problem loading notecard: " << status << LL_ENDL; - } - LLPanelEstateCovenant::updateCovenantText(covenant_text, asset_uuid); - LLPanelLandCovenant::updateCovenantText(covenant_text); - LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid); - - LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info"); - if (panel) - { - panel->updateCovenantText(covenant_text); - } -} - - -void process_feature_disabled_message(LLMessageSystem* msg, void**) -{ - // Handle Blacklisted feature simulator response... - LLUUID agentID; - LLUUID transactionID; - std::string messageText; - msg->getStringFast(_PREHASH_FailureInfo,_PREHASH_ErrorMessage, messageText,0); - msg->getUUIDFast(_PREHASH_FailureInfo,_PREHASH_AgentID,agentID); - msg->getUUIDFast(_PREHASH_FailureInfo,_PREHASH_TransactionID,transactionID); - - LL_WARNS("Messaging") << "Blacklisted Feature Response:" << messageText << LL_ENDL; -} - -// ------------------------------------------------------------ -// Message system exception callbacks -// ------------------------------------------------------------ - -void invalid_message_callback(LLMessageSystem* msg, - void*, - EMessageException exception) -{ - LLAppViewer::instance()->badNetworkHandler(); -} - -// Please do not add more message handlers here. This file is huge. -// Put them in a file related to the functionality you are implementing. - -void LLOfferInfo::forceResponse(InventoryOfferResponse response) -{ - LLNotification::Params params("UserGiveItem"); - params.functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, this, _1, _2)); - LLNotifications::instance().forceResponse(params, response); -} +/** + * @file llviewermessage.cpp + * @brief Dumping ground for viewer-side message system callbacks. + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llviewermessage.h" + +#include <deque> + +#include "llaudioengine.h" +#include "indra_constants.h" +#include "lscript_byteformat.h" +#include "mean_collision_data.h" +#include "llfloaterbump.h" +#include "llassetstorage.h" +#include "llcachename.h" +#include "llchat.h" +#include "lldbstrings.h" +#include "lleconomy.h" +#include "llfilepicker.h" +#include "llfloaterreg.h" +#include "llfocusmgr.h" +#include "llfollowcamparams.h" +#include "llinstantmessage.h" +#include "llquantize.h" +#include "llregionflags.h" +#include "llregionhandle.h" +#include "llsdserialize.h" +#include "llstring.h" +#include "llteleportflags.h" +#include "lltracker.h" +#include "lltransactionflags.h" +#include "llxfermanager.h" +#include "message.h" +#include "sound_ids.h" +#include "lltimer.h" +#include "llmd5.h" + +#include "llagent.h" +#include "llcallingcard.h" +#include "llconsole.h" +#include "llvieweraudio.h" +#include "llviewercontrol.h" +#include "lldrawpool.h" +#include "llfirstuse.h" +#include "llfloateranimpreview.h" +#include "llfloaterbuycurrency.h" +#include "llfloaterbuyland.h" +#include "llfloaterchat.h" +#include "llfloaterimagepreview.h" +#include "llfloaterland.h" +#include "llfloaterregioninfo.h" +#include "llfloaterlandholdings.h" +#include "llurldispatcher.h" +#include "llfloaterpostcard.h" +#include "llfloaterpreference.h" +#include "llfollowcam.h" +#include "llgroupnotify.h" +#include "llhudeffect.h" +#include "llhudeffecttrail.h" +#include "llhudmanager.h" +#include "llimpanel.h" +#include "llinventorymodel.h" +#include "llinventorypanel.h" +#include "llfloaterinventory.h" +#include "llmenugl.h" +#include "llmoveview.h" +#include "llmutelist.h" +#include "llnearbychat.h" +#include "llnotifications.h" +#include "llnotify.h" +#include "llpanelgrouplandmoney.h" +#include "llpanelplaces.h" +#include "llrecentpeople.h" +#include "llselectmgr.h" +#include "llsidetray.h" +#include "llstartup.h" +#include "llsky.h" +#include "llslurl.h" +#include "llstatenums.h" +#include "llstatusbar.h" +#include "llimview.h" +#include "lltool.h" +#include "lltoolbar.h" +#include "lltoolmgr.h" +#include "lltrans.h" +#include "llui.h" // for make_ui_sound +#include "lluploaddialog.h" +#include "llviewercamera.h" +#include "llviewergenericmessage.h" +#include "llviewerinventory.h" +#include "llviewermenu.h" +#include "llviewerobject.h" +#include "llviewerobjectlist.h" +#include "llviewerparcelmgr.h" +#include "llviewerpartsource.h" +#include "llviewerregion.h" +#include "llviewerstats.h" +#include "llviewertexteditor.h" +#include "llviewerthrottle.h" +#include "llviewerwindow.h" +#include "llvlmanager.h" +#include "llvoavatarself.h" +#include "llvotextbubble.h" +#include "llweb.h" +#include "llworld.h" +#include "pipeline.h" +#include "llappviewer.h" +#include "llfloaterworldmap.h" +#include "llviewerdisplay.h" +#include "llkeythrottle.h" +#include "llgroupactions.h" +#include "llagentui.h" +#include "llpanelblockedlist.h" +#include "llpanelplaceinfo.h" + +#include <boost/tokenizer.hpp> +#include <boost/algorithm/string/split.hpp> + +#if LL_WINDOWS // For Windows specific error handler +#include "llwindebug.h" // For the invalid message handler +#endif + +//#include "llnearbychathistory.h" +#include "llnotificationmanager.h" + +// +// Constants +// +const F32 BIRD_AUDIBLE_RADIUS = 32.0f; +const F32 SIT_DISTANCE_FROM_TARGET = 0.25f; +static const F32 LOGOUT_REPLY_TIME = 3.f; // Wait this long after LogoutReply before quitting. + +// Determine how quickly residents' scripts can issue question dialogs +// Allow bursts of up to 5 dialogs in 10 seconds. 10*2=20 seconds recovery if throttle kicks in +static const U32 LLREQUEST_PERMISSION_THROTTLE_LIMIT = 5; // requests +static const F32 LLREQUEST_PERMISSION_THROTTLE_INTERVAL = 10.0f; // seconds + +extern BOOL gDebugClicks; + +// function prototypes +void open_offer(const std::vector<LLUUID>& items, const std::string& from_name); +bool check_offer_throttle(const std::string& from_name, bool check_only); + +//inventory offer throttle globals +LLFrameTimer gThrottleTimer; +const U32 OFFER_THROTTLE_MAX_COUNT=5; //number of items per time period +const F32 OFFER_THROTTLE_TIME=10.f; //time period in seconds + +//script permissions +const std::string SCRIPT_QUESTIONS[SCRIPT_PERMISSION_EOF] = + { + "ScriptTakeMoney", + "ActOnControlInputs", + "RemapControlInputs", + "AnimateYourAvatar", + "AttachToYourAvatar", + "ReleaseOwnership", + "LinkAndDelink", + "AddAndRemoveJoints", + "ChangePermissions", + "TrackYourCamera", + "ControlYourCamera" + }; + +const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] = +{ + TRUE, // ScriptTakeMoney, + FALSE, // ActOnControlInputs + FALSE, // RemapControlInputs + FALSE, // AnimateYourAvatar + FALSE, // AttachToYourAvatar + FALSE, // ReleaseOwnership, + FALSE, // LinkAndDelink, + FALSE, // AddAndRemoveJoints + FALSE, // ChangePermissions + FALSE, // TrackYourCamera, + FALSE // ControlYourCamera +}; + +bool friendship_offer_callback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + LLUUID fid; + LLMessageSystem* msg = gMessageSystem; + const LLSD& payload = notification["payload"]; + + // add friend to recent people list + LLRecentPeople::instance().add(payload["from_id"]); + + switch(option) + { + case 0: + // accept + LLAvatarTracker::formFriendship(payload["from_id"]); + + fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + + // This will also trigger an onlinenotification if the user is online + msg->newMessageFast(_PREHASH_AcceptFriendship); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_TransactionBlock); + msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]); + msg->nextBlockFast(_PREHASH_FolderData); + msg->addUUIDFast(_PREHASH_FolderID, fid); + msg->sendReliable(LLHost(payload["sender"].asString())); + break; + case 1: + // decline + // We no longer notify other viewers, but we DO still send + // the rejection to the simulator to delete the pending userop. + msg->newMessageFast(_PREHASH_DeclineFriendship); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_TransactionBlock); + msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]); + msg->sendReliable(LLHost(payload["sender"].asString())); + break; + default: + // close button probably, possibly timed out + break; + } + + return false; +} +static LLNotificationFunctorRegistration friendship_offer_callback_reg("OfferFriendship", friendship_offer_callback); +static LLNotificationFunctorRegistration friendship_offer_callback_reg_nm("OfferFriendshipNoMessage", friendship_offer_callback); + +//const char BUSY_AUTO_RESPONSE[] = "The Resident you messaged is in 'busy mode' which means they have " +// "requested not to be disturbed. Your message will still be shown in their IM " +// "panel for later viewing."; + +// +// Functions +// + +void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_group, + S32 trx_type, const std::string& desc) +{ + if(0 == amount || !region) return; + amount = abs(amount); + LL_INFOS("Messaging") << "give_money(" << uuid << "," << amount << ")"<< LL_ENDL; + if(can_afford_transaction(amount)) + { +// gStatusBar->debitBalance(amount); + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_MoneyTransferRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_MoneyData); + msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID() ); + msg->addUUIDFast(_PREHASH_DestID, uuid); + msg->addU8Fast(_PREHASH_Flags, pack_transaction_flags(FALSE, is_group)); + msg->addS32Fast(_PREHASH_Amount, amount); + msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY); + msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY); + msg->addS32Fast(_PREHASH_TransactionType, trx_type ); + msg->addStringFast(_PREHASH_Description, desc); + msg->sendReliable(region->getHost()); + } + else + { + LLFloaterBuyCurrency::buyCurrency("Giving", amount); + } +} + +void send_complete_agent_movement(const LLHost& sim_host) +{ + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_CompleteAgentMovement); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addU32Fast(_PREHASH_CircuitCode, msg->mOurCircuitCode); + msg->sendReliable(sim_host); +} + +void process_logout_reply(LLMessageSystem* msg, void**) +{ + // The server has told us it's ok to quit. + LL_DEBUGS("Messaging") << "process_logout_reply" << LL_ENDL; + + LLUUID agent_id; + msg->getUUID("AgentData", "AgentID", agent_id); + LLUUID session_id; + msg->getUUID("AgentData", "SessionID", session_id); + if((agent_id != gAgent.getID()) || (session_id != gAgent.getSessionID())) + { + LL_WARNS("Messaging") << "Bogus Logout Reply" << LL_ENDL; + } + + LLInventoryModel::update_map_t parents; + S32 count = msg->getNumberOfBlocksFast( _PREHASH_InventoryData ); + for(S32 i = 0; i < count; ++i) + { + LLUUID item_id; + msg->getUUIDFast(_PREHASH_InventoryData, _PREHASH_ItemID, item_id, i); + + if( (1 == count) && item_id.isNull() ) + { + // Detect dummy item. Indicates an empty list. + break; + } + + // We do not need to track the asset ids, just account for an + // updated inventory version. + LL_INFOS("Messaging") << "process_logout_reply itemID=" << item_id << LL_ENDL; + LLInventoryItem* item = gInventory.getItem( item_id ); + if( item ) + { + parents[item->getParentUUID()] = 0; + gInventory.addChangedMask(LLInventoryObserver::INTERNAL, item_id); + } + else + { + LL_INFOS("Messaging") << "process_logout_reply item not found: " << item_id << LL_ENDL; + } + } + LLAppViewer::instance()->forceQuit(); +} + +void process_layer_data(LLMessageSystem *mesgsys, void **user_data) +{ + LLViewerRegion *regionp = LLWorld::getInstance()->getRegion(mesgsys->getSender()); + + if (!regionp || gNoRender) + { + return; + } + + + S32 size; + S8 type; + + mesgsys->getS8Fast(_PREHASH_LayerID, _PREHASH_Type, type); + size = mesgsys->getSizeFast(_PREHASH_LayerData, _PREHASH_Data); + if (0 == size) + { + LL_WARNS("Messaging") << "Layer data has zero size." << LL_ENDL; + return; + } + if (size < 0) + { + // getSizeFast() is probably trying to tell us about an error + LL_WARNS("Messaging") << "getSizeFast() returned negative result: " + << size + << LL_ENDL; + return; + } + U8 *datap = new U8[size]; + mesgsys->getBinaryDataFast(_PREHASH_LayerData, _PREHASH_Data, datap, size); + LLVLData *vl_datap = new LLVLData(regionp, type, datap, size); + if (mesgsys->getReceiveCompressedSize()) + { + gVLManager.addLayerData(vl_datap, mesgsys->getReceiveCompressedSize()); + } + else + { + gVLManager.addLayerData(vl_datap, mesgsys->getReceiveSize()); + } +} + +// S32 exported_object_count = 0; +// S32 exported_image_count = 0; +// S32 current_object_count = 0; +// S32 current_image_count = 0; + +// extern LLNotifyBox *gExporterNotify; +// extern LLUUID gExporterRequestID; +// extern std::string gExportDirectory; + +// extern LLUploadDialog *gExportDialog; + +// std::string gExportedFile; + +// std::map<LLUUID, std::string> gImageChecksums; + +// void export_complete() +// { +// LLUploadDialog::modalUploadFinished(); +// gExporterRequestID.setNull(); +// gExportDirectory = ""; + +// LLFILE* fXML = LLFile::fopen(gExportedFile, "rb"); /* Flawfinder: ignore */ +// fseek(fXML, 0, SEEK_END); +// long length = ftell(fXML); +// fseek(fXML, 0, SEEK_SET); +// U8 *buffer = new U8[length + 1]; +// size_t nread = fread(buffer, 1, length, fXML); +// if (nread < (size_t) length) +// { +// LL_WARNS("Messaging") << "Short read" << LL_ENDL; +// } +// buffer[nread] = '\0'; +// fclose(fXML); + +// char *pos = (char *)buffer; +// while ((pos = strstr(pos+1, "<sl:image ")) != 0) +// { +// char *pos_check = strstr(pos, "checksum=\""); + +// if (pos_check) +// { +// char *pos_uuid = strstr(pos_check, "\">"); + +// if (pos_uuid) +// { +// char image_uuid_str[UUID_STR_SIZE]; /* Flawfinder: ignore */ +// memcpy(image_uuid_str, pos_uuid+2, UUID_STR_SIZE-1); /* Flawfinder: ignore */ +// image_uuid_str[UUID_STR_SIZE-1] = 0; + +// LLUUID image_uuid(image_uuid_str); + +// LL_INFOS("Messaging") << "Found UUID: " << image_uuid << LL_ENDL; + +// std::map<LLUUID, std::string>::iterator itor = gImageChecksums.find(image_uuid); +// if (itor != gImageChecksums.end()) +// { +// LL_INFOS("Messaging") << "Replacing with checksum: " << itor->second << LL_ENDL; +// if (!itor->second.empty()) +// { +// memcpy(&pos_check[10], itor->second.c_str(), 32); /* Flawfinder: ignore */ +// } +// } +// } +// } +// } + +// LLFILE* fXMLOut = LLFile::fopen(gExportedFile, "wb"); /* Flawfinder: ignore */ +// if (fwrite(buffer, 1, length, fXMLOut) != length) +// { +// LL_WARNS("Messaging") << "Short write" << LL_ENDL; +// } +// fclose(fXMLOut); + +// delete [] buffer; +// } + + +// void exported_item_complete(const LLTSCode status, void *user_data) +// { +// //std::string *filename = (std::string *)user_data; + +// if (status < LLTS_OK) +// { +// LL_WARNS("Messaging") << "Export failed!" << LL_ENDL; +// } +// else +// { +// ++current_object_count; +// if (current_image_count == exported_image_count && current_object_count == exported_object_count) +// { +// LL_INFOS("Messaging") << "*** Export complete ***" << LL_ENDL; + +// export_complete(); +// } +// else +// { +// gExportDialog->setMessage(llformat("Exported %d/%d object files, %d/%d textures.", current_object_count, exported_object_count, current_image_count, exported_image_count)); +// } +// } +// } + +// struct exported_image_info +// { +// LLUUID image_id; +// std::string filename; +// U32 image_num; +// }; + +// void exported_j2c_complete(const LLTSCode status, void *user_data) +// { +// exported_image_info *info = (exported_image_info *)user_data; +// LLUUID image_id = info->image_id; +// U32 image_num = info->image_num; +// std::string filename = info->filename; +// delete info; + +// if (status < LLTS_OK) +// { +// LL_WARNS("Messaging") << "Image download failed!" << LL_ENDL; +// } +// else +// { +// LLFILE* fIn = LLFile::fopen(filename, "rb"); /* Flawfinder: ignore */ +// if (fIn) +// { +// LLPointer<LLImageJ2C> ImageUtility = new LLImageJ2C; +// LLPointer<LLImageTGA> TargaUtility = new LLImageTGA; + +// fseek(fIn, 0, SEEK_END); +// S32 length = ftell(fIn); +// fseek(fIn, 0, SEEK_SET); +// U8 *buffer = ImageUtility->allocateData(length); +// if (fread(buffer, 1, length, fIn) != length) +// { +// LL_WARNS("Messaging") << "Short read" << LL_ENDL; +// } +// fclose(fIn); +// LLFile::remove(filename); + +// // Convert to TGA +// LLPointer<LLImageRaw> image = new LLImageRaw(); + +// ImageUtility->updateData(); +// ImageUtility->decode(image, 100000.0f); + +// TargaUtility->encode(image); +// U8 *data = TargaUtility->getData(); +// S32 data_size = TargaUtility->getDataSize(); + +// std::string file_path = gDirUtilp->getDirName(filename); + +// std::string output_file = llformat("%s/image-%03d.tga", file_path.c_str(), image_num);//filename; +// //S32 name_len = output_file.length(); +// //strcpy(&output_file[name_len-3], "tga"); +// LLFILE* fOut = LLFile::fopen(output_file, "wb"); /* Flawfinder: ignore */ +// char md5_hash_string[33]; /* Flawfinder: ignore */ +// strcpy(md5_hash_string, "00000000000000000000000000000000"); /* Flawfinder: ignore */ +// if (fOut) +// { +// if (fwrite(data, 1, data_size, fOut) != data_size) +// { +// LL_WARNS("Messaging") << "Short write" << LL_ENDL; +// } +// fseek(fOut, 0, SEEK_SET); +// fclose(fOut); +// fOut = LLFile::fopen(output_file, "rb"); /* Flawfinder: ignore */ +// LLMD5 my_md5_hash(fOut); +// my_md5_hash.hex_digest(md5_hash_string); +// } + +// gImageChecksums.insert(std::pair<LLUUID, std::string>(image_id, md5_hash_string)); +// } +// } + +// ++current_image_count; +// if (current_image_count == exported_image_count && current_object_count == exported_object_count) +// { +// LL_INFOS("Messaging") << "*** Export textures complete ***" << LL_ENDL; +// export_complete(); +// } +// else +// { +// gExportDialog->setMessage(llformat("Exported %d/%d object files, %d/%d textures.", current_object_count, exported_object_count, current_image_count, exported_image_count)); +// } +//} + +void process_derez_ack(LLMessageSystem*, void**) +{ + if(gViewerWindow) gViewerWindow->getWindow()->decBusyCount(); +} + +void process_places_reply(LLMessageSystem* msg, void** data) +{ + LLUUID query_id; + + msg->getUUID("AgentData", "QueryID", query_id); + if (query_id.isNull()) + { + LLFloaterLandHoldings::processPlacesReply(msg, data); + } + else if(gAgent.isInGroup(query_id)) + { + LLPanelGroupLandMoney::processPlacesReply(msg, data); + } + else + { + LL_WARNS("Messaging") << "Got invalid PlacesReply message" << LL_ENDL; + } +} + +void send_sound_trigger(const LLUUID& sound_id, F32 gain) +{ + if (sound_id.isNull() || gAgent.getRegion() == NULL) + { + // disconnected agent or zero guids don't get sent (no sound) + return; + } + + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_SoundTrigger); + msg->nextBlockFast(_PREHASH_SoundData); + msg->addUUIDFast(_PREHASH_SoundID, sound_id); + // Client untrusted, ids set on sim + msg->addUUIDFast(_PREHASH_OwnerID, LLUUID::null ); + msg->addUUIDFast(_PREHASH_ObjectID, LLUUID::null ); + msg->addUUIDFast(_PREHASH_ParentID, LLUUID::null ); + + msg->addU64Fast(_PREHASH_Handle, gAgent.getRegion()->getHandle()); + + LLVector3 position = gAgent.getPositionAgent(); + msg->addVector3Fast(_PREHASH_Position, position); + msg->addF32Fast(_PREHASH_Gain, gain); + + gAgent.sendMessage(); +} + +bool join_group_response(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + BOOL delete_context_data = TRUE; + bool accept_invite = false; + + LLUUID group_id = notification["payload"]["group_id"].asUUID(); + LLUUID transaction_id = notification["payload"]["transaction_id"].asUUID(); + std::string name = notification["payload"]["name"].asString(); + std::string message = notification["payload"]["message"].asString(); + S32 fee = notification["payload"]["fee"].asInteger(); + + if (option == 2 && !group_id.isNull()) + { + LLGroupActions::show(group_id); + LLSD args; + args["MESSAGE"] = message; + LLNotifications::instance().add("JoinGroup", args, notification["payload"]); + return false; + } + if(option == 0 && !group_id.isNull()) + { + // check for promotion or demotion. + S32 max_groups = MAX_AGENT_GROUPS; + if(gAgent.isInGroup(group_id)) ++max_groups; + + if(gAgent.mGroups.count() < max_groups) + { + accept_invite = true; + } + else + { + delete_context_data = FALSE; + LLSD args; + args["NAME"] = name; + args["INVITE"] = message; + LLNotifications::instance().add("JoinedTooManyGroupsMember", args, notification["payload"]); + } + } + + if (accept_invite) + { + // If there is a fee to join this group, make + // sure the user is sure they want to join. + if (fee > 0) + { + delete_context_data = FALSE; + LLSD args; + args["COST"] = llformat("%d", fee); + // Set the fee for next time to 0, so that we don't keep + // asking about a fee. + LLSD next_payload = notification["payload"]; + next_payload["fee"] = 0; + LLNotifications::instance().add("JoinGroupCanAfford", + args, + next_payload); + } + else + { + send_improved_im(group_id, + std::string("name"), + std::string("message"), + IM_ONLINE, + IM_GROUP_INVITATION_ACCEPT, + transaction_id); + } + } + else + { + send_improved_im(group_id, + std::string("name"), + std::string("message"), + IM_ONLINE, + IM_GROUP_INVITATION_DECLINE, + transaction_id); + } + + return false; +} +static LLNotificationFunctorRegistration jgr_1("JoinGroup", join_group_response); +static LLNotificationFunctorRegistration jgr_2("JoinedTooManyGroupsMember", join_group_response); +static LLNotificationFunctorRegistration jgr_3("JoinGroupCanAfford", join_group_response); + + +//----------------------------------------------------------------------------- +// Instant Message +//----------------------------------------------------------------------------- +class LLOpenAgentOffer : public LLInventoryFetchObserver +{ +public: + LLOpenAgentOffer(const std::string& from_name) : mFromName(from_name) {} + /*virtual*/ void done() + { + open_offer(mComplete, mFromName); + gInventory.removeObserver(this); + delete this; + } +private: + std::string mFromName; +}; + +//unlike the FetchObserver for AgentOffer, we only make one +//instance of the AddedObserver for TaskOffers +//and it never dies. We do this because we don't know the UUID of +//task offers until they are accepted, so we don't wouldn't +//know what to watch for, so instead we just watch for all additions. +class LLOpenTaskOffer : public LLInventoryAddedObserver +{ +protected: + /*virtual*/ void done() + { + open_offer(mAdded, ""); + mAdded.clear(); + } + }; + +//one global instance to bind them +LLOpenTaskOffer* gNewInventoryObserver=NULL; + +void start_new_inventory_observer() +{ + if (!gNewInventoryObserver) //task offer observer + { + // Observer is deleted by gInventory + gNewInventoryObserver = new LLOpenTaskOffer; + gInventory.addObserver(gNewInventoryObserver); + } +} + +class LLDiscardAgentOffer : public LLInventoryFetchComboObserver +{ +public: + LLDiscardAgentOffer(const LLUUID& folder_id, const LLUUID& object_id) : + mFolderID(folder_id), + mObjectID(object_id) {} + virtual ~LLDiscardAgentOffer() {} + virtual void done() + { + LL_DEBUGS("Messaging") << "LLDiscardAgentOffer::done()" << LL_ENDL; + LLUUID trash_id; + trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + bool notify = false; + if(trash_id.notNull() && mObjectID.notNull()) + { + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(mFolderID, -1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(trash_id, 1); + update.push_back(new_folder); + gInventory.accountForUpdate(update); + gInventory.moveObject(mObjectID, trash_id); + LLInventoryObject* obj = gInventory.getObject(mObjectID); + if(obj) + { + // no need to restamp since this is already a freshly + // stamped item. + obj->updateParentOnServer(FALSE); + notify = true; + } + } + else + { + LL_WARNS("Messaging") << "DiscardAgentOffer unable to find: " + << (trash_id.isNull() ? "trash " : "") + << (mObjectID.isNull() ? "object" : "") << LL_ENDL; + } + gInventory.removeObserver(this); + if(notify) + { + gInventory.notifyObservers(); + } + delete this; + } +protected: + LLUUID mFolderID; + LLUUID mObjectID; +}; + + +//Returns TRUE if we are OK, FALSE if we are throttled +//Set check_only true if you want to know the throttle status +//without registering a hit +bool check_offer_throttle(const std::string& from_name, bool check_only) +{ + static U32 throttle_count; + static bool throttle_logged; + LLChat chat; + std::string log_message; + + if (!gSavedSettings.getBOOL("ShowNewInventory")) + return false; + + if (check_only) + { + return gThrottleTimer.hasExpired(); + } + + if(gThrottleTimer.checkExpirationAndReset(OFFER_THROTTLE_TIME)) + { + LL_DEBUGS("Messaging") << "Throttle Expired" << LL_ENDL; + throttle_count=1; + throttle_logged=false; + return true; + } + else //has not expired + { + LL_DEBUGS("Messaging") << "Throttle Not Expired, Count: " << throttle_count << LL_ENDL; + // When downloading the initial inventory we get a lot of new items + // coming in and can't tell that from spam. + if (LLStartUp::getStartupState() >= STATE_STARTED + && throttle_count >= OFFER_THROTTLE_MAX_COUNT) + { + if (!throttle_logged) + { + // Use the name of the last item giver, who is probably the person + // spamming you. + std::ostringstream message; + message << LLAppViewer::instance()->getSecondLifeTitle(); + if (!from_name.empty()) + { + message << ": Items coming in too fast from " << from_name; + } + else + { + message << ": Items coming in too fast"; + } + message << ", automatic preview disabled for " + << OFFER_THROTTLE_TIME << " seconds."; + chat.mText = message.str(); + //this is kinda important, so actually put it on screen + LLFloaterChat::addChat(chat, FALSE, FALSE); + throttle_logged=true; + } + return false; + } + else + { + throttle_count++; + return true; + } + } +} + +void open_offer(const std::vector<LLUUID>& items, const std::string& from_name) +{ + std::vector<LLUUID>::const_iterator it = items.begin(); + std::vector<LLUUID>::const_iterator end = items.end(); + LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH)); + LLInventoryItem* item; + for(; it != end; ++it) + { + const LLUUID& id = *it; + item = gInventory.getItem(id); + if(!item) + { + LL_WARNS("Messaging") << "Unable to show inventory item: " << id << LL_ENDL; + continue; + } + if(gInventory.isObjectDescendentOf(id, trash_id)) + { + continue; + } + LLAssetType::EType asset_type = item->getType(); + + //if we are throttled, don't display them + if (check_offer_throttle(from_name, false)) + { + // If we opened this ourselves, focus it + BOOL take_focus = from_name.empty() ? TAKE_FOCUS_YES : TAKE_FOCUS_NO; + switch(asset_type) + { + case LLAssetType::AT_NOTECARD: + LLFloaterReg::showInstance("preview_notecard", LLSD(id), take_focus); + break; + case LLAssetType::AT_LANDMARK: + { + LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID()); + LLSD args; + args["LANDMARK_NAME"] = item->getName(); + args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown"); + LLNotifications::instance().add("LandmarkCreated", args); + + // Created landmark is passed to Places panel to allow its editing. + LLPanelPlaces *panel = dynamic_cast<LLPanelPlaces*>(LLSideTray::getInstance()->showPanel("panel_places", LLSD())); + if (panel) + { + panel->setItem(item); + } + } + break; + case LLAssetType::AT_TEXTURE: + LLFloaterReg::showInstance("preview_texture", LLSD(id), take_focus); + break; + default: + break; + } + } + //highlight item, if it's not in the trash or lost+found + + // Don't auto-open the inventory floater + LLFloaterInventory* view = NULL; + if(gSavedSettings.getBOOL("ShowInInventory") && + asset_type != LLAssetType::AT_CALLINGCARD && + item->getInventoryType() != LLInventoryType::IT_ATTACHMENT && + !from_name.empty()) + { + view = LLFloaterInventory::showAgentInventory(); + } + else + { + view = LLFloaterInventory::getActiveInventory(); + } + if(!view) + { + return; + } + + //Trash Check + LLUUID trash_id; + trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) + { + return; + } + LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + //BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view); + BOOL user_is_away = gAwayTimer.getStarted(); + + // don't select lost and found items if the user is active + if (gInventory.isObjectDescendentOf(item->getUUID(), lost_and_found_id) + && !user_is_away) + { + return; + } + + //Not sure about this check. Could make it easy to miss incoming items. + //don't dick with highlight while the user is working + //if(inventory_has_focus && !user_is_away) + // break; + LL_DEBUGS("Messaging") << "Highlighting" << item->getUUID() << LL_ENDL; + //highlight item + + if (view->getPanel()) + { + LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus(); + view->getPanel()->setSelection(item->getUUID(), TAKE_FOCUS_NO); + gFocusMgr.setKeyboardFocus(focus_ctrl); + } + } +} + +void inventory_offer_mute_callback(const LLUUID& blocked_id, + const std::string& first_name, + const std::string& last_name, + BOOL is_group) +{ + std::string from_name; + LLMute::EType type; + + if (is_group) + { + type = LLMute::GROUP; + from_name = first_name; + } + else + { + type = LLMute::AGENT; + from_name = first_name + " " + last_name; + } + + LLMute mute(blocked_id, from_name, type); + if (LLMuteList::getInstance()->add(mute)) + { + LLPanelBlockedList::showPanelAndSelect(blocked_id); + } + + // purge the message queue of any previously queued inventory offers from the same source. + class OfferMatcher : public LLNotifyBoxView::Matcher + { + public: + OfferMatcher(const LLUUID& to_block) : blocked_id(to_block) {} + BOOL matches(const LLNotificationPtr notification) const + { + if(notification->getName() == "ObjectGiveItem" + || notification->getName() == "ObjectGiveItemUnknownUser" + || notification->getName() == "UserGiveItem") + { + return (notification->getPayload()["from_id"].asUUID() == blocked_id); + } + return FALSE; + } + private: + const LLUUID& blocked_id; + }; + gNotifyBoxView->purgeMessagesMatching(OfferMatcher(blocked_id)); +} + +LLOfferInfo::LLOfferInfo(const LLSD& sd) +{ + mIM = (EInstantMessage)sd["im_type"].asInteger(); + mFromID = sd["from_id"].asUUID(); + mFromGroup = sd["from_group"].asBoolean(); + mFromObject = sd["from_object"].asBoolean(); + mTransactionID = sd["transaction_id"].asUUID(); + mFolderID = sd["folder_id"].asUUID(); + mObjectID = sd["object_id"].asUUID(); + mType = LLAssetType::lookup(sd["type"].asString().c_str()); + mFromName = sd["from_name"].asString(); + mDesc = sd["description"].asString(); + mHost = LLHost(sd["sender"].asString()); +} + +LLSD LLOfferInfo::asLLSD() +{ + LLSD sd; + sd["im_type"] = mIM; + sd["from_id"] = mFromID; + sd["from_group"] = mFromGroup; + sd["from_object"] = mFromObject; + sd["transaction_id"] = mTransactionID; + sd["folder_id"] = mFolderID; + sd["object_id"] = mObjectID; + sd["type"] = LLAssetType::lookup(mType); + sd["from_name"] = mFromName; + sd["description"] = mDesc; + sd["sender"] = mHost.getIPandPort(); + return sd; +} + +bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& response) + { + LLChat chat; + std::string log_message; + S32 button = LLNotification::getSelectedOption(notification, response); + + // For muting, we need to add the mute, then decline the offer. + // This must be done here because: + // * callback may be called immediately, + // * adding the mute sends a message, + // * we can't build two messages at once. + if (2 == button) + { + gCacheName->get(mFromID, mFromGroup, &inventory_offer_mute_callback); + } + + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_ImprovedInstantMessage); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_MessageBlock); + msg->addBOOLFast(_PREHASH_FromGroup, FALSE); + msg->addUUIDFast(_PREHASH_ToAgentID, mFromID); + msg->addU8Fast(_PREHASH_Offline, IM_ONLINE); + msg->addUUIDFast(_PREHASH_ID, mTransactionID); + msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary + std::string name; + LLAgentUI::buildFullname(name); + msg->addStringFast(_PREHASH_FromAgentName, name); + msg->addStringFast(_PREHASH_Message, ""); + msg->addU32Fast(_PREHASH_ParentEstateID, 0); + msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null); + msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent()); + LLInventoryObserver* opener = NULL; + LLViewerInventoryCategory* catp = NULL; + catp = (LLViewerInventoryCategory*)gInventory.getCategory(mObjectID); + LLViewerInventoryItem* itemp = NULL; + if(!catp) + { + itemp = (LLViewerInventoryItem*)gInventory.getItem(mObjectID); + } + + std::string from_string; // Used in the pop-up. + std::string chatHistory_string; // Used in chat history. + if (mFromObject == TRUE) + { + if (mFromGroup) + { + std::string group_name; + if (gCacheName->getGroupName(mFromID, group_name)) + { + from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'" + + mFromName + LLTrans::getString("'") +" " + LLTrans::getString("InvOfferOwnedByGroup") + + " "+ "'" + group_name + "'"; + + chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByGroup") + + " " + group_name + "'"; + } + else + { + from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+"'" + + mFromName +"'"+ " " + LLTrans::getString("InvOfferOwnedByUnknownGroup"); + chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownGroup"); + } + } + else + { + std::string first_name, last_name; + if (gCacheName->getName(mFromID, first_name, last_name)) + { + from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+ LLTrans::getString("'") + mFromName + + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedBy") + first_name + " " + last_name; + chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedBy") + " " + first_name + " " + last_name; + } + else + { + from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+LLTrans::getString("'") + + mFromName + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedByUnknownUser"); + chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedByUnknownUser"); + } + } + } + else + { + from_string = chatHistory_string = mFromName; + } + + bool busy=FALSE; + + switch(button) + { + case IOR_ACCEPT: + // ACCEPT. The math for the dialog works, because the accept + // for inventory_offered, task_inventory_offer or + // group_notice_inventory is 1 greater than the offer integer value. + // Generates IM_INVENTORY_ACCEPTED, IM_TASK_INVENTORY_ACCEPTED, + // or IM_GROUP_NOTICE_INVENTORY_ACCEPTED + msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1)); + msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData), + sizeof(mFolderID.mData)); + // send the message + msg->sendReliable(mHost); + + //don't spam them if they are getting flooded + if (check_offer_throttle(mFromName, true)) + { + log_message = chatHistory_string + " " + LLTrans::getString("InvOfferGaveYou") + " " + mDesc + LLTrans::getString("."); + chat.mText = log_message; + LLFloaterChat::addChatHistory(chat); + } + + // we will want to open this item when it comes back. + LL_DEBUGS("Messaging") << "Initializing an opener for tid: " << mTransactionID + << LL_ENDL; + switch (mIM) + { + case IM_INVENTORY_OFFERED: + { + // This is an offer from an agent. In this case, the back + // end has already copied the items into your inventory, + // so we can fetch it out of our inventory. + LLInventoryFetchObserver::item_ref_t items; + items.push_back(mObjectID); + LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(from_string); + open_agent_offer->fetchItems(items); + if(catp || (itemp && itemp->isComplete())) + { + open_agent_offer->done(); + } + else + { + opener = open_agent_offer; + } + } + break; + case IM_TASK_INVENTORY_OFFERED: + case IM_GROUP_NOTICE: + case IM_GROUP_NOTICE_REQUESTED: + { + // This is an offer from a task or group. + // We don't use a new instance of an opener + // We instead use the singular observer gOpenTaskOffer + // Since it already exists, we don't need to actually do anything + } + break; + default: + LL_WARNS("Messaging") << "inventory_offer_callback: unknown offer type" << LL_ENDL; + break; + } // end switch (mIM) + break; + + case IOR_BUSY: + //Busy falls through to decline. Says to make busy message. + busy=TRUE; + case IOR_MUTE: + // MUTE falls through to decline + case IOR_DECLINE: + // DECLINE. The math for the dialog works, because the decline + // for inventory_offered, task_inventory_offer or + // group_notice_inventory is 2 greater than the offer integer value. + // Generates IM_INVENTORY_DECLINED, IM_TASK_INVENTORY_DECLINED, + // or IM_GROUP_NOTICE_INVENTORY_DECLINED + default: + // close button probably (or any of the fall-throughs from above) + msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 2)); + msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE); + // send the message + msg->sendReliable(mHost); + + log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +"."; + chat.mText = log_message; + if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) ) // muting for SL-42269 + { + chat.mMuted = TRUE; + } + LLFloaterChat::addChatHistory(chat); + + // If it's from an agent, we have to fetch the item to throw + // it away. If it's from a task or group, just denying the + // request will suffice to discard the item. + if(IM_INVENTORY_OFFERED == mIM) + { + LLInventoryFetchComboObserver::folder_ref_t folders; + LLInventoryFetchComboObserver::item_ref_t items; + items.push_back(mObjectID); + LLDiscardAgentOffer* discard_agent_offer; + discard_agent_offer = new LLDiscardAgentOffer(mFolderID, mObjectID); + discard_agent_offer->fetch(folders, items); + if(catp || (itemp && itemp->isComplete())) + { + discard_agent_offer->done(); + } + else + { + opener = discard_agent_offer; + } + + } + if (busy && (!mFromGroup && !mFromObject)) + { + busy_message(msg,mFromID); + } + break; + } + + if(IM_INVENTORY_OFFERED == mIM) + { + // add buddy to recent people list + LLRecentPeople::instance().add(mFromID); + } + + if(opener) + { + gInventory.addObserver(opener); + } + + delete this; + return false; +} + + +void inventory_offer_handler(LLOfferInfo* info, BOOL from_task) +{ + //Until throttling is implmented, busy mode should reject inventory instead of silently + //accepting it. SEE SL-39554 + if (gAgent.getBusy()) + { + info->forceResponse(IOR_BUSY); + return; + } + + //If muted, don't even go through the messaging stuff. Just curtail the offer here. + if (LLMuteList::getInstance()->isMuted(info->mFromID, info->mFromName)) + { + info->forceResponse(IOR_MUTE); + return; + } + + // Avoid the Accept/Discard dialog if the user so desires. JC + if (gSavedSettings.getBOOL("AutoAcceptNewInventory") + && (info->mType == LLAssetType::AT_NOTECARD + || info->mType == LLAssetType::AT_LANDMARK + || info->mType == LLAssetType::AT_TEXTURE)) + { + // For certain types, just accept the items into the inventory, + // and possibly open them on receipt depending upon "ShowNewInventory". + info->forceResponse(IOR_ACCEPT); + return; + } + + // Strip any SLURL from the message display. (DEV-2754) + std::string msg = info->mDesc; + int indx = msg.find(" ( http://slurl.com/secondlife/"); + if(indx >= 0) + { + LLStringUtil::truncate(msg, indx); + } + + LLSD args; + args["[OBJECTNAME]"] = msg; + + LLSD payload; + + // must protect against a NULL return from lookupHumanReadable() + std::string typestr = ll_safe_string(LLAssetType::lookupHumanReadable(info->mType)); + if (!typestr.empty()) + { + args["OBJECTTYPE"] = typestr; + } + else + { + LL_WARNS("Messaging") << "LLAssetType::lookupHumanReadable() returned NULL - probably bad asset type: " << info->mType << LL_ENDL; + args["OBJECTTYPE"] = ""; + + // This seems safest, rather than propagating bogosity + LL_WARNS("Messaging") << "Forcing an inventory-decline for probably-bad asset type." << LL_ENDL; + info->forceResponse(IOR_DECLINE); + return; + } + + // Name cache callbacks don't store userdata, so can't save + // off the LLOfferInfo. Argh. + BOOL name_found = FALSE; + if (info->mFromGroup) + { + std::string group_name; + if (gCacheName->getGroupName(info->mFromID, group_name)) + { + args["FIRST"] = group_name; + args["LAST"] = ""; + name_found = TRUE; + } + } + else + { + std::string first_name, last_name; + if (gCacheName->getName(info->mFromID, first_name, last_name)) + { + args["FIRST"] = first_name; + args["LAST"] = last_name; + name_found = TRUE; + } + } + + payload["from_id"] = info->mFromID; + args["OBJECTFROMNAME"] = info->mFromName; + args["NAME"] = info->mFromName; + + LLNotification::Params p("ObjectGiveItem"); + p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2)); + + if (from_task) + { + p.name = name_found ? "ObjectGiveItem" : "ObjectGiveItemUnknownUser"; + } + else + { + p.name = "UserGiveItem"; + } + + LLNotifications::instance().add(p); +} + +bool lure_callback(const LLSD& notification, const LLSD& response) +{ + S32 option = 0; + if (response.isInteger()) + { + option = response.asInteger(); + } + else + { + option = LLNotification::getSelectedOption(notification, response); + } + + LLUUID from_id = notification["payload"]["from_id"].asUUID(); + LLUUID lure_id = notification["payload"]["lure_id"].asUUID(); + BOOL godlike = notification["payload"]["godlike"].asBoolean(); + + switch(option) + { + case 0: + { + // accept + gAgent.teleportViaLure(lure_id, godlike); + } + break; + case 1: + default: + // decline + send_simple_im(from_id, + LLStringUtil::null, + IM_LURE_DECLINED, + lure_id); + break; + } + return false; +} +static LLNotificationFunctorRegistration lure_callback_reg("TeleportOffered", lure_callback); + +bool goto_url_callback(const LLSD& notification, const LLSD& response) +{ + std::string url = notification["payload"]["url"].asString(); + S32 option = LLNotification::getSelectedOption(notification, response); + if(1 == option) + { + LLWeb::loadURL(url); + } + return false; +} +static LLNotificationFunctorRegistration goto_url_callback_reg("GotoURL", goto_url_callback); + +void process_improved_im(LLMessageSystem *msg, void **user_data) +{ + if (gNoRender) + { + return; + } + LLUUID from_id; + BOOL from_group; + LLUUID to_id; + U8 offline; + U8 d = 0; + LLUUID session_id; + U32 timestamp; + std::string name; + std::string message; + U32 parent_estate_id = 0; + LLUUID region_id; + LLVector3 position; + U8 binary_bucket[MTUBYTES]; + S32 binary_bucket_size; + LLChat chat; + std::string buffer; + + // *TODO: Translate - need to fix the full name to first/last (maybe) + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, from_id); + msg->getBOOLFast(_PREHASH_MessageBlock, _PREHASH_FromGroup, from_group); + msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ToAgentID, to_id); + msg->getU8Fast( _PREHASH_MessageBlock, _PREHASH_Offline, offline); + msg->getU8Fast( _PREHASH_MessageBlock, _PREHASH_Dialog, d); + msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_ID, session_id); + msg->getU32Fast( _PREHASH_MessageBlock, _PREHASH_Timestamp, timestamp); + //msg->getData("MessageBlock", "Count", &count); + msg->getStringFast(_PREHASH_MessageBlock, _PREHASH_FromAgentName, name); + msg->getStringFast(_PREHASH_MessageBlock, _PREHASH_Message, message); + msg->getU32Fast(_PREHASH_MessageBlock, _PREHASH_ParentEstateID, parent_estate_id); + msg->getUUIDFast(_PREHASH_MessageBlock, _PREHASH_RegionID, region_id); + msg->getVector3Fast(_PREHASH_MessageBlock, _PREHASH_Position, position); + msg->getBinaryDataFast( _PREHASH_MessageBlock, _PREHASH_BinaryBucket, binary_bucket, 0, 0, MTUBYTES); + binary_bucket_size = msg->getSizeFast(_PREHASH_MessageBlock, _PREHASH_BinaryBucket); + EInstantMessage dialog = (EInstantMessage)d; + + // make sure that we don't have an empty or all-whitespace name + LLStringUtil::trim(name); + if (name.empty()) + { + name = LLTrans::getString("Unnamed"); + } + + BOOL is_busy = gAgent.getBusy(); + BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat); + BOOL is_linden = LLMuteList::getInstance()->isLinden(name); + BOOL is_owned_by_me = FALSE; + BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true; + BOOL accept_im_from_only_friend = gSavedSettings.getBOOL("VoiceCallsFriendsOnly"); + + chat.mMuted = is_muted && !is_linden; + chat.mFromID = from_id; + chat.mFromName = name; + chat.mSourceType = (from_id.isNull() || (name == std::string(SYSTEM_FROM))) ? CHAT_SOURCE_SYSTEM : CHAT_SOURCE_AGENT; + + LLViewerObject *source = gObjectList.findObject(session_id); //Session ID is probably the wrong thing. + if (source) + { + is_owned_by_me = source->permYouOwner(); + } + + std::string separator_string(": "); + int message_offset = 0; + + //Handle IRC styled /me messages. + std::string prefix = message.substr(0, 4); + if (prefix == "/me " || prefix == "/me'") + { + separator_string = ""; + message_offset = 3; + } + + LLSD args; + switch(dialog) + { + case IM_CONSOLE_AND_CHAT_HISTORY: + // These are used for system messages, hence don't need the name, + // as it is always "Second Life". + // *TODO: Translate + args["MESSAGE"] = message; + + // Note: don't put the message in the IM history, even though was sent + // via the IM mechanism. + LLNotifications::instance().add("SystemMessageTip",args); + break; + + case IM_NOTHING_SPECIAL: + // Don't show dialog, just do IM + if (!gAgent.isGodlike() + && gAgent.getRegion()->isPrelude() + && to_id.isNull() ) + { + // do nothing -- don't distract newbies in + // Prelude with global IMs + } + else if (offline == IM_ONLINE && !is_linden && is_busy && name != SYSTEM_FROM) + { + // return a standard "busy" message, but only do it to online IM + // (i.e. not other auto responses and not store-and-forward IM) + if (!gIMMgr->hasSession(session_id)) + { + // if there is not a panel for this conversation (i.e. it is a new IM conversation + // initiated by the other party) then... + std::string my_name; + LLAgentUI::buildFullname(my_name); + std::string response = gSavedPerAccountSettings.getString("BusyModeResponse2"); + pack_instant_message( + gMessageSystem, + gAgent.getID(), + FALSE, + gAgent.getSessionID(), + from_id, + my_name, + response, + IM_ONLINE, + IM_BUSY_AUTO_RESPONSE, + session_id); + gAgent.sendReliableMessage(); + } + + // now store incoming IM in chat history + + buffer = message.substr(message_offset); + + LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL; + + // add to IM panel, but do not bother the user + gIMMgr->addMessage( + session_id, + from_id, + name, + buffer, + LLStringUtil::null, + dialog, + parent_estate_id, + region_id, + position, + true); + + // pretend this is chat generated by self, so it does not show up on screen + chat.mText = std::string("IM: ") + name + separator_string + message.substr(message_offset); + LLFloaterChat::addChat( chat, TRUE, TRUE ); + } + else if (from_id.isNull()) + { + // Messages from "Second Life" ID don't go to IM history + // messages which should be routed to IM window come from a user ID with name=SYSTEM_NAME + chat.mText = name + ": " + message; + LLFloaterChat::addChat(chat, FALSE, FALSE); + } + else if (to_id.isNull()) + { + // Message to everyone from GOD + args["NAME"] = name; + args["MESSAGE"] = message; + LLNotifications::instance().add("GodMessage", args); + + // Treat like a system message and put in chat history. + // Claim to be from a local agent so it doesn't go into + // console. + chat.mText = name + separator_string + message.substr(message_offset); + BOOL local_agent = TRUE; + LLFloaterChat::addChat(chat, FALSE, local_agent); + } + else + { + // standard message, not from system + std::string saved; + if(offline == IM_OFFLINE) + { + saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str()); + } + buffer = saved + message.substr(message_offset); + + LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL; + + bool mute_im = is_muted; + if(accept_im_from_only_friend&&!is_friend) + { + mute_im = true; + } + if (!mute_im || is_linden) + { + gIMMgr->addMessage( + session_id, + from_id, + name, + buffer, + LLStringUtil::null, + dialog, + parent_estate_id, + region_id, + position, + true); + chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset); + + BOOL local_agent = FALSE; + LLFloaterChat::addChat( chat, TRUE, local_agent ); + } + else + { + // muted user, so don't start an IM session, just record line in chat + // history. Pretend the chat is from a local agent, + // so it will go into the history but not be shown on screen. + chat.mText = buffer; + BOOL local_agent = TRUE; + LLFloaterChat::addChat( chat, TRUE, local_agent ); + } + } + break; + + case IM_TYPING_START: + { + LLPointer<LLIMInfo> im_info = new LLIMInfo(gMessageSystem); + gIMMgr->processIMTypingStart(im_info); + } + break; + + case IM_TYPING_STOP: + { + LLPointer<LLIMInfo> im_info = new LLIMInfo(gMessageSystem); + gIMMgr->processIMTypingStop(im_info); + } + break; + + case IM_MESSAGEBOX: + { + // This is a block, modeless dialog. + //*TODO: Translate + args["MESSAGE"] = message; + LLNotifications::instance().add("SystemMessage", args); + } + break; + case IM_GROUP_NOTICE: + case IM_GROUP_NOTICE_REQUESTED: + { + LL_INFOS("Messaging") << "Received IM_GROUP_NOTICE message." << LL_ENDL; + // Read the binary bucket for more information. + struct notice_bucket_header_t + { + U8 has_inventory; + U8 asset_type; + LLUUID group_id; + }; + struct notice_bucket_full_t + { + struct notice_bucket_header_t header; + U8 item_name[DB_INV_ITEM_NAME_BUF_SIZE]; + }* notice_bin_bucket; + + // Make sure the binary bucket is big enough to hold the header + // and a null terminated item name. + if ( (binary_bucket_size < (S32)((sizeof(notice_bucket_header_t) + sizeof(U8)))) + || (binary_bucket[binary_bucket_size - 1] != '\0') ) + { + LL_WARNS("Messaging") << "Malformed group notice binary bucket" << LL_ENDL; + break; + } + + notice_bin_bucket = (struct notice_bucket_full_t*) &binary_bucket[0]; + U8 has_inventory = notice_bin_bucket->header.has_inventory; + U8 asset_type = notice_bin_bucket->header.asset_type; + LLUUID group_id = notice_bin_bucket->header.group_id; + std::string item_name = ll_safe_string((const char*) notice_bin_bucket->item_name); + + // If there is inventory, give the user the inventory offer. + LLOfferInfo* info = NULL; + + if (has_inventory) + { + info = new LLOfferInfo; + + info->mIM = IM_GROUP_NOTICE; + info->mFromID = from_id; + info->mFromGroup = from_group; + info->mTransactionID = session_id; + info->mType = (LLAssetType::EType) asset_type; + info->mFolderID = gInventory.findCategoryUUIDForType(info->mType); + std::string from_name; + + from_name += "A group member named "; + from_name += name; + + info->mFromName = from_name; + info->mDesc = item_name; + info->mHost = msg->getSender(); + } + + std::string str(message); + + // Tokenize the string. + // TODO: Support escaped tokens ("||" -> "|") + typedef boost::tokenizer<boost::char_separator<char> > tokenizer; + boost::char_separator<char> sep("|","",boost::keep_empty_tokens); + tokenizer tokens(str, sep); + tokenizer::iterator iter = tokens.begin(); + + std::string subj(*iter++); + std::string mes(*iter++); + + // Send the notification down the new path. + // For requested notices, we don't want to send the popups. + if (dialog != IM_GROUP_NOTICE_REQUESTED) + { + LLSD payload; + payload["subject"] = subj; + payload["message"] = mes; + payload["sender_name"] = name; + payload["group_id"] = group_id; + payload["inventory_name"] = item_name; + payload["inventory_offer"] = info ? info->asLLSD() : LLSD(); + + LLSD args; + args["SUBJECT"] = subj; + args["MESSAGE"] = mes; + LLNotifications::instance().add(LLNotification::Params("GroupNotice").substitutions(args).payload(payload).time_stamp(timestamp)); + } + + // Also send down the old path for now. + if (IM_GROUP_NOTICE_REQUESTED == dialog) + { + + LLPanelGroup::showNotice(subj,mes,group_id,has_inventory,item_name,info); + } + } + break; + case IM_GROUP_INVITATION: + { + //if (!is_linden && (is_busy || is_muted)) + if ((is_busy || is_muted)) + { + LLMessageSystem *msg = gMessageSystem; + busy_message(msg,from_id); + } + else + { + LL_INFOS("Messaging") << "Received IM_GROUP_INVITATION message." << LL_ENDL; + // Read the binary bucket for more information. + struct invite_bucket_t + { + S32 membership_fee; + LLUUID role_id; + }* invite_bucket; + + // Make sure the binary bucket is the correct size. + if (binary_bucket_size != sizeof(invite_bucket_t)) + { + LL_WARNS("Messaging") << "Malformed group invite binary bucket" << LL_ENDL; + break; + } + + invite_bucket = (struct invite_bucket_t*) &binary_bucket[0]; + S32 membership_fee = ntohl(invite_bucket->membership_fee); + + LLSD payload; + payload["transaction_id"] = session_id; + payload["group_id"] = from_id; + payload["name"] = name; + payload["message"] = message; + payload["fee"] = membership_fee; + + LLSD args; + args["MESSAGE"] = message; + LLNotifications::instance().add("JoinGroup", args, payload, join_group_response); + } + } + break; + + case IM_INVENTORY_OFFERED: + case IM_TASK_INVENTORY_OFFERED: + // Someone has offered us some inventory. + { + LLOfferInfo* info = new LLOfferInfo; + bool mute_im = false; + if (IM_INVENTORY_OFFERED == dialog) + { + struct offer_agent_bucket_t + { + S8 asset_type; + LLUUID object_id; + }* bucketp; + + if (sizeof(offer_agent_bucket_t) != binary_bucket_size) + { + LL_WARNS("Messaging") << "Malformed inventory offer from agent" << LL_ENDL; + break; + } + bucketp = (struct offer_agent_bucket_t*) &binary_bucket[0]; + info->mType = (LLAssetType::EType) bucketp->asset_type; + info->mObjectID = bucketp->object_id; + + if(accept_im_from_only_friend&&!is_friend) + { + mute_im = true; + } + } + else + { + if (sizeof(S8) != binary_bucket_size) + { + LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL; + break; + } + info->mType = (LLAssetType::EType) binary_bucket[0]; + info->mObjectID = LLUUID::null; + } + + info->mIM = dialog; + info->mFromID = from_id; + info->mFromGroup = from_group; + info->mTransactionID = session_id; + info->mFolderID = gInventory.findCategoryUUIDForType(info->mType); + + if (dialog == IM_TASK_INVENTORY_OFFERED) + { + info->mFromObject = TRUE; + } + else + { + info->mFromObject = FALSE; + } + info->mFromName = name; + info->mDesc = message; + info->mHost = msg->getSender(); + //if (((is_busy && !is_owned_by_me) || is_muted)) + if ( is_muted || mute_im) + { + // Same as closing window + info->forceResponse(IOR_DECLINE); + } + else + { + inventory_offer_handler(info, dialog == IM_TASK_INVENTORY_OFFERED); + } + } + break; + + case IM_INVENTORY_ACCEPTED: + { + args["NAME"] = name; + LLNotifications::instance().add("InventoryAccepted", args); + break; + } + case IM_INVENTORY_DECLINED: + { + args["NAME"] = name; + LLNotifications::instance().add("InventoryDeclined", args); + break; + } + // TODO: _DEPRECATED suffix as part of vote removal - DEV-24856 + case IM_GROUP_VOTE: + { + LL_WARNS("Messaging") << "Received IM: IM_GROUP_VOTE_DEPRECATED" << LL_ENDL; + } + break; + + case IM_GROUP_ELECTION_DEPRECATED: + { + LL_WARNS("Messaging") << "Received IM: IM_GROUP_ELECTION_DEPRECATED" << LL_ENDL; + } + break; + + case IM_SESSION_SEND: + { + if (!is_linden && is_busy) + { + return; + } + + // Only show messages if we have a session open (which + // should happen after you get an "invitation" + if ( !gIMMgr->hasSession(session_id) ) + { + return; + } + + // standard message, not from system + std::string saved; + if(offline == IM_OFFLINE) + { + saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str()); + } + buffer = saved + message.substr(message_offset); + BOOL is_this_agent = FALSE; + if(from_id == gAgentID) + { + is_this_agent = TRUE; + } + gIMMgr->addMessage( + session_id, + from_id, + name, + buffer, + ll_safe_string((char*)binary_bucket), + IM_SESSION_INVITE, + parent_estate_id, + region_id, + position, + true); + + chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset); + LLFloaterChat::addChat(chat, TRUE, is_this_agent); + } + break; + + case IM_FROM_TASK: + { + if (is_busy && !is_owned_by_me) + { + return; + } + + LLSD substitutions; + substitutions["MSG"] = message.substr(message_offset); + LLNotifications::instance().add("ServerObjectMessage", substitutions); + } + break; + case IM_FROM_TASK_AS_ALERT: + if (is_busy && !is_owned_by_me) + { + return; + } + { + // Construct a viewer alert for this message. + args["NAME"] = name; + args["MESSAGE"] = message; + LLNotifications::instance().add("ObjectMessage", args); + } + break; + case IM_BUSY_AUTO_RESPONSE: + if (is_muted) + { + LL_DEBUGS("Messaging") << "Ignoring busy response from " << from_id << LL_ENDL; + return; + } + else + { + // TODO: after LLTrans hits release, get "busy response" into translatable file + buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.substr(message_offset).c_str()); + gIMMgr->addMessage(session_id, from_id, name, buffer); + } + break; + + case IM_LURE_USER: + { + if (is_muted) + { + return; + } + else if (is_busy) + { + busy_message(msg,from_id); + } + else + { + LLSD args; + // *TODO: Translate -> [FIRST] [LAST] (maybe) + args["NAME"] = name; + args["MESSAGE"] = message; + LLSD payload; + payload["from_id"] = from_id; + payload["lure_id"] = session_id; + payload["godlike"] = FALSE; + LLNotifications::instance().add("TeleportOffered", args, payload); + } + } + break; + + case IM_GODLIKE_LURE_USER: + { + LLSD payload; + payload["from_id"] = from_id; + payload["lure_id"] = session_id; + payload["godlike"] = TRUE; + // do not show a message box, because you're about to be + // teleported. + LLNotifications::instance().forceResponse(LLNotification::Params("TeleportOffered").payload(payload), 0); + } + break; + + case IM_GOTO_URL: + { + LLSD args; + // n.b. this is for URLs sent by the system, not for + // URLs sent by scripts (i.e. llLoadURL) + if (binary_bucket_size <= 0) + { + LL_WARNS("Messaging") << "bad binary_bucket_size: " + << binary_bucket_size + << " - aborting function." << LL_ENDL; + return; + } + + std::string url; + + url.assign((char*)binary_bucket, binary_bucket_size-1); + args["MESSAGE"] = message; + args["URL"] = url; + LLSD payload; + payload["url"] = url; + LLNotifications::instance().add("GotoURL", args, payload ); + } + break; + + case IM_FRIENDSHIP_OFFERED: + { + LLSD payload; + payload["from_id"] = from_id; + payload["session_id"] = session_id;; + payload["online"] = (offline == IM_ONLINE); + payload["sender"] = msg->getSender().getIPandPort(); + + if (is_busy) + { + busy_message(msg, from_id); + LLNotifications::instance().forceResponse(LLNotification::Params("OfferFriendship").payload(payload), 1); + } + else if (is_muted) + { + LLNotifications::instance().forceResponse(LLNotification::Params("OfferFriendship").payload(payload), 1); + } + else + { + args["[NAME]"] = name; + if(message.empty()) + { + //support for frienship offers from clients before July 2008 + LLNotifications::instance().add("OfferFriendshipNoMessage", args, payload); + } + else + { + args["[MESSAGE]"] = message; + LLNotifications::instance().add("OfferFriendship", args, payload); + } + } + } + break; + + case IM_FRIENDSHIP_ACCEPTED: + { + // In the case of an offline IM, the formFriendship() may be extraneous + // as the database should already include the relationship. But it + // doesn't hurt for dupes. + LLAvatarTracker::formFriendship(from_id); + + std::vector<std::string> strings; + strings.push_back(from_id.asString()); + send_generic_message("requestonlinenotification", strings); + + args["NAME"] = name; + LLNotifications::instance().add("FriendshipAccepted", args); + } + break; + + case IM_FRIENDSHIP_DECLINED_DEPRECATED: + default: + LL_WARNS("Messaging") << "Instant message calling for unknown dialog " + << (S32)dialog << LL_ENDL; + break; + } + + LLWindow* viewer_window = gViewerWindow->getWindow(); + if (viewer_window && viewer_window->getMinimized()) + { + viewer_window->flashIcon(5.f); + } +} + +void busy_message (LLMessageSystem* msg, LLUUID from_id) +{ + if (gAgent.getBusy()) + { + std::string my_name; + LLAgentUI::buildFullname(my_name); + std::string response = gSavedPerAccountSettings.getString("BusyModeResponse2"); + pack_instant_message( + gMessageSystem, + gAgent.getID(), + FALSE, + gAgent.getSessionID(), + from_id, + my_name, + response, + IM_ONLINE, + IM_BUSY_AUTO_RESPONSE); + gAgent.sendReliableMessage(); + } +} + +bool callingcard_offer_callback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + LLUUID fid; + LLUUID from_id; + LLMessageSystem* msg = gMessageSystem; + switch(option) + { + case 0: + // accept + msg->newMessageFast(_PREHASH_AcceptCallingCard); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_TransactionBlock); + msg->addUUIDFast(_PREHASH_TransactionID, notification["payload"]["transaction_id"].asUUID()); + fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + msg->nextBlockFast(_PREHASH_FolderData); + msg->addUUIDFast(_PREHASH_FolderID, fid); + msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); + break; + case 1: + // decline + msg->newMessageFast(_PREHASH_DeclineCallingCard); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_TransactionBlock); + msg->addUUIDFast(_PREHASH_TransactionID, notification["payload"]["transaction_id"].asUUID()); + msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); + busy_message(msg, notification["payload"]["source_id"].asUUID()); + break; + default: + // close button probably, possibly timed out + break; + } + + return false; +} +static LLNotificationFunctorRegistration callingcard_offer_cb_reg("OfferCallingCard", callingcard_offer_callback); + +void process_offer_callingcard(LLMessageSystem* msg, void**) +{ + // someone has offered to form a friendship + LL_DEBUGS("Messaging") << "callingcard offer" << LL_ENDL; + + LLUUID source_id; + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, source_id); + LLUUID tid; + msg->getUUIDFast(_PREHASH_AgentBlock, _PREHASH_TransactionID, tid); + + LLSD payload; + payload["transaction_id"] = tid; + payload["source_id"] = source_id; + payload["sender"] = msg->getSender().getIPandPort(); + + LLViewerObject* source = gObjectList.findObject(source_id); + LLSD args; + std::string source_name; + if(source && source->isAvatar()) + { + LLNameValue* nvfirst = source->getNVPair("FirstName"); + LLNameValue* nvlast = source->getNVPair("LastName"); + if (nvfirst && nvlast) + { + args["FIRST"] = nvfirst->getString(); + args["LAST"] = nvlast->getString(); + source_name = std::string(nvfirst->getString()) + " " + nvlast->getString(); + } + } + + if(!source_name.empty()) + { + if (gAgent.getBusy() + || LLMuteList::getInstance()->isMuted(source_id, source_name, LLMute::flagTextChat)) + { + // automatically decline offer + LLNotifications::instance().forceResponse(LLNotification::Params("OfferCallingCard").payload(payload), 1); + } + else + { + LLNotifications::instance().add("OfferCallingCard", args, payload); + } + } + else + { + LL_WARNS("Messaging") << "Calling card offer from an unknown source." << LL_ENDL; + } +} + +void process_accept_callingcard(LLMessageSystem* msg, void**) +{ + LLNotifications::instance().add("CallingCardAccepted"); +} + +void process_decline_callingcard(LLMessageSystem* msg, void**) +{ + LLNotifications::instance().add("CallingCardDeclined"); +} + + +void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) +{ + LLChat chat; + std::string mesg; + std::string from_name; + U8 source_temp; + U8 type_temp; + U8 audible_temp; + LLColor4 color(1.0f, 1.0f, 1.0f, 1.0f); + LLUUID from_id; + LLUUID owner_id; + BOOL is_owned_by_me = FALSE; + LLViewerObject* chatter; + + msg->getString("ChatData", "FromName", from_name); + chat.mFromName = from_name; + + msg->getUUID("ChatData", "SourceID", from_id); + chat.mFromID = from_id; + + // Object owner for objects + msg->getUUID("ChatData", "OwnerID", owner_id); + + msg->getU8Fast(_PREHASH_ChatData, _PREHASH_SourceType, source_temp); + chat.mSourceType = (EChatSourceType)source_temp; + + msg->getU8("ChatData", "ChatType", type_temp); + chat.mChatType = (EChatType)type_temp; + + msg->getU8Fast(_PREHASH_ChatData, _PREHASH_Audible, audible_temp); + chat.mAudible = (EChatAudible)audible_temp; + + chat.mTime = LLFrameTimer::getElapsedSeconds(); + + BOOL is_busy = gAgent.getBusy(); + + BOOL is_muted = FALSE; + BOOL is_linden = FALSE; + is_muted = LLMuteList::getInstance()->isMuted( + from_id, + from_name, + LLMute::flagTextChat) + || LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagTextChat); + is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT && + LLMuteList::getInstance()->isLinden(from_name); + + BOOL is_audible = (CHAT_AUDIBLE_FULLY == chat.mAudible); + chatter = gObjectList.findObject(from_id); + if (chatter) + { + chat.mPosAgent = chatter->getPositionAgent(); + + // Make swirly things only for talking objects. (not script debug messages, though) + if (chat.mSourceType == CHAT_SOURCE_OBJECT + && chat.mChatType != CHAT_TYPE_DEBUG_MSG) + { + LLPointer<LLViewerPartSourceChat> psc = new LLViewerPartSourceChat(chatter->getPositionAgent()); + psc->setSourceObject(chatter); + psc->setColor(color); + //We set the particles to be owned by the object's owner, + //just in case they should be muted by the mute list + psc->setOwnerUUID(owner_id); + LLViewerPartSim::getInstance()->addPartSource(psc); + } + + // record last audible utterance + if (is_audible + && (is_linden || (!is_muted && !is_busy))) + { + if (chat.mChatType != CHAT_TYPE_START + && chat.mChatType != CHAT_TYPE_STOP) + { + gAgent.heardChat(chat.mFromID); + } + } + + is_owned_by_me = chatter->permYouOwner(); + } + + if (is_audible) + { + BOOL visible_in_chat_bubble = FALSE; + std::string verb; + + color.setVec(1.f,1.f,1.f,1.f); + msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg); + + BOOL ircstyle = FALSE; + + // Look for IRC-style emotes here so chatbubbles work + std::string prefix = mesg.substr(0, 4); + if (prefix == "/me " || prefix == "/me'") + { + chat.mText = from_name; + chat.mText += mesg.substr(3); + ircstyle = TRUE; + } + else + { + chat.mText = mesg; + } + + // Look for the start of typing so we can put "..." in the bubbles. + if (CHAT_TYPE_START == chat.mChatType) + { + LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, TRUE); + + // Might not have the avatar constructed yet, eg on login. + if (chatter && chatter->isAvatar()) + { + ((LLVOAvatar*)chatter)->startTyping(); + } + return; + } + else if (CHAT_TYPE_STOP == chat.mChatType) + { + LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE); + + // Might not have the avatar constructed yet, eg on login. + if (chatter && chatter->isAvatar()) + { + ((LLVOAvatar*)chatter)->stopTyping(); + } + return; + } + + // We have a real utterance now, so can stop showing "..." and proceed. + if (chatter && chatter->isAvatar()) + { + LLLocalSpeakerMgr::getInstance()->setSpeakerTyping(from_id, FALSE); + ((LLVOAvatar*)chatter)->stopTyping(); + + if (!is_muted && !is_busy) + { + visible_in_chat_bubble = gSavedSettings.getBOOL("UseChatBubbles"); + ((LLVOAvatar*)chatter)->addChat(chat); + } + } + + // Look for IRC-style emotes + if (ircstyle) + { + // set CHAT_STYLE_IRC to avoid adding Avatar Name as author of message. See EXT-656 + chat.mChatStyle = CHAT_STYLE_IRC; + + // Do nothing, ircstyle is fixed above for chat bubbles + } + else + { + switch(chat.mChatType) + { + case CHAT_TYPE_WHISPER: + verb = "(" + LLTrans::getString("whisper") + ")"; + break; + case CHAT_TYPE_DEBUG_MSG: + case CHAT_TYPE_OWNER: + case CHAT_TYPE_NORMAL: + verb = ""; + break; + case CHAT_TYPE_SHOUT: + verb = "(" + LLTrans::getString("shout") + ")"; + break; + case CHAT_TYPE_START: + case CHAT_TYPE_STOP: + LL_WARNS("Messaging") << "Got chat type start/stop in main chat processing." << LL_ENDL; + break; + default: + LL_WARNS("Messaging") << "Unknown type " << chat.mChatType << " in chat!" << LL_ENDL; + verb = ""; + break; + } + + + chat.mText = ""; + chat.mText += verb; + chat.mText += mesg; + } + + if (chatter) + { + chat.mPosAgent = chatter->getPositionAgent(); + } + + // truth table: + // LINDEN BUSY MUTED OWNED_BY_YOU TASK DISPLAY STORE IN HISTORY + // F F F F * Yes Yes + // F F F T * Yes Yes + // F F T F * No No + // F F T T * No No + // F T F F * No Yes + // F T F T * Yes Yes + // F T T F * No No + // F T T T * No No + // T * * * F Yes Yes + + chat.mMuted = is_muted && !is_linden; + + if (!visible_in_chat_bubble + && (is_linden || !is_busy || is_owned_by_me)) + { + // show on screen and add to history + LLNotificationsUI::LLNotificationManager::instance().onChat( + chat, LLNotificationsUI::NT_NEARBYCHAT); + + // adding temporarily so that communications window chat bar + // works until the new chat window is ready + chat.mText = from_name + ": " + chat.mText; + LLFloaterChat::addChat(chat, FALSE, FALSE); + } + else + { + LLNotificationsUI::LLNotificationManager::instance().onChat( + chat, LLNotificationsUI::NT_NEARBYCHAT); + // adding temporarily + LLFloaterChat::addChatHistory(chat); + } + } +} + + +// Simulator we're on is informing the viewer that the agent +// is starting to teleport (perhaps to another sim, perhaps to the +// same sim). If we initiated the teleport process by sending some kind +// of TeleportRequest, then this info is redundant, but if the sim +// initiated the teleport (via a script call, being killed, etc.) +// then this info is news to us. +void process_teleport_start(LLMessageSystem *msg, void**) +{ + U32 teleport_flags = 0x0; + msg->getU32("Info", "TeleportFlags", teleport_flags); + + if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL) + { + gViewerWindow->setProgressCancelButtonVisible(FALSE); + } + else + { + gViewerWindow->setProgressCancelButtonVisible(TRUE, LLTrans::getString("Cancel")); + } + + // Freeze the UI and show progress bar + // Note: could add data here to differentiate between normal teleport and death. + + if( gAgent.getTeleportState() == LLAgent::TELEPORT_NONE ) + { + gTeleportDisplay = TRUE; + gAgent.setTeleportState( LLAgent::TELEPORT_START ); + make_ui_sound("UISndTeleportOut"); + + // Don't call LLFirstUse::useTeleport here because this could be + // due to being killed, which would send you home, not to a Telehub + } +} + +void process_teleport_progress(LLMessageSystem* msg, void**) +{ + LLUUID agent_id; + msg->getUUID("AgentData", "AgentID", agent_id); + if((gAgent.getID() != agent_id) + || (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE)) + { + LL_WARNS("Messaging") << "Unexpected teleport progress message." << LL_ENDL; + return; + } + U32 teleport_flags = 0x0; + msg->getU32("Info", "TeleportFlags", teleport_flags); + if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL) + { + gViewerWindow->setProgressCancelButtonVisible(FALSE); + } + else + { + gViewerWindow->setProgressCancelButtonVisible(TRUE, LLTrans::getString("Cancel")); + } + std::string buffer; + msg->getString("Info", "Message", buffer); + LL_DEBUGS("Messaging") << "teleport progress: " << buffer << LL_ENDL; + + //Sorta hacky...default to using simulator raw messages + //if we don't find the coresponding mapping in our progress mappings + std::string message = buffer; + + if (LLAgent::sTeleportProgressMessages.find(buffer) != + LLAgent::sTeleportProgressMessages.end() ) + { + message = LLAgent::sTeleportProgressMessages[buffer]; + } + + gAgent.setTeleportMessage(LLAgent::sTeleportProgressMessages[message]); +} + +class LLFetchInWelcomeArea : public LLInventoryFetchDescendentsObserver +{ +public: + LLFetchInWelcomeArea() {} + virtual void done() + { + LLIsType is_landmark(LLAssetType::AT_LANDMARK); + LLIsType is_card(LLAssetType::AT_CALLINGCARD); + + LLInventoryModel::cat_array_t card_cats; + LLInventoryModel::item_array_t card_items; + LLInventoryModel::cat_array_t land_cats; + LLInventoryModel::item_array_t land_items; + + folder_ref_t::iterator it = mCompleteFolders.begin(); + folder_ref_t::iterator end = mCompleteFolders.end(); + for(; it != end; ++it) + { + gInventory.collectDescendentsIf( + (*it), + land_cats, + land_items, + LLInventoryModel::EXCLUDE_TRASH, + is_landmark); + gInventory.collectDescendentsIf( + (*it), + card_cats, + card_items, + LLInventoryModel::EXCLUDE_TRASH, + is_card); + } + LLSD args; + if ( land_items.count() > 0 ) + { // Show notification that they can now teleport to landmarks. Use a random landmark from the inventory + S32 random_land = ll_rand( land_items.count() - 1 ); + args["NAME"] = land_items[random_land]->getName(); + LLNotifications::instance().add("TeleportToLandmark",args); + } + if ( card_items.count() > 0 ) + { // Show notification that they can now contact people. Use a random calling card from the inventory + S32 random_card = ll_rand( card_items.count() - 1 ); + args["NAME"] = card_items[random_card]->getName(); + LLNotifications::instance().add("TeleportToPerson",args); + } + + gInventory.removeObserver(this); + delete this; + } +}; + + + +class LLPostTeleportNotifiers : public LLEventTimer +{ +public: + LLPostTeleportNotifiers(); + virtual ~LLPostTeleportNotifiers(); + + //function to be called at the supplied frequency + virtual BOOL tick(); +}; + +LLPostTeleportNotifiers::LLPostTeleportNotifiers() : LLEventTimer( 2.0 ) +{ +}; + +LLPostTeleportNotifiers::~LLPostTeleportNotifiers() +{ +} + +BOOL LLPostTeleportNotifiers::tick() +{ + BOOL all_done = FALSE; + if ( gAgent.getTeleportState() == LLAgent::TELEPORT_NONE ) + { + // get callingcards and landmarks available to the user arriving. + LLInventoryFetchDescendentsObserver::folder_ref_t folders; + LLUUID folder_id; + folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + if(folder_id.notNull()) + folders.push_back(folder_id); + folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + if(folder_id.notNull()) + folders.push_back(folder_id); + if(!folders.empty()) + { + LLFetchInWelcomeArea* fetcher = new LLFetchInWelcomeArea; + fetcher->fetchDescendents(folders); + if(fetcher->isEverythingComplete()) + { + fetcher->done(); + } + else + { + gInventory.addObserver(fetcher); + } + } + all_done = TRUE; + } + + return all_done; +} + + + +// Teleport notification from the simulator +// We're going to pretend to be a new agent +void process_teleport_finish(LLMessageSystem* msg, void**) +{ + LL_DEBUGS("Messaging") << "Got teleport location message" << LL_ENDL; + LLUUID agent_id; + msg->getUUIDFast(_PREHASH_Info, _PREHASH_AgentID, agent_id); + if (agent_id != gAgent.getID()) + { + LL_WARNS("Messaging") << "Got teleport notification for wrong agent!" << LL_ENDL; + return; + } + + // Do teleport effect for where you're leaving + // VEFFECT: TeleportStart + LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); + effectp->setPositionGlobal(gAgent.getPositionGlobal()); + effectp->setColor(LLColor4U(gAgent.getEffectColor())); + LLHUDManager::getInstance()->sendEffects(); + + U32 location_id; + U32 sim_ip; + U16 sim_port; + LLVector3 pos, look_at; + U64 region_handle; + msg->getU32Fast(_PREHASH_Info, _PREHASH_LocationID, location_id); + msg->getIPAddrFast(_PREHASH_Info, _PREHASH_SimIP, sim_ip); + msg->getIPPortFast(_PREHASH_Info, _PREHASH_SimPort, sim_port); + //msg->getVector3Fast(_PREHASH_Info, _PREHASH_Position, pos); + //msg->getVector3Fast(_PREHASH_Info, _PREHASH_LookAt, look_at); + msg->getU64Fast(_PREHASH_Info, _PREHASH_RegionHandle, region_handle); + U32 teleport_flags; + msg->getU32Fast(_PREHASH_Info, _PREHASH_TeleportFlags, teleport_flags); + + + std::string seedCap; + msg->getStringFast(_PREHASH_Info, _PREHASH_SeedCapability, seedCap); + + // update home location if we are teleporting out of prelude - specific to teleporting to welcome area + if((teleport_flags & TELEPORT_FLAGS_SET_HOME_TO_TARGET) + && (!gAgent.isGodlike())) + { + gAgent.setHomePosRegion(region_handle, pos); + + // Create a timer that will send notices when teleporting is all finished. Since this is + // based on the LLEventTimer class, it will be managed by that class and not orphaned or leaked. + new LLPostTeleportNotifiers(); + } + + LLHost sim_host(sim_ip, sim_port); + + // Viewer trusts the simulator. + gMessageSystem->enableCircuit(sim_host, TRUE); + LLViewerRegion* regionp = LLWorld::getInstance()->addRegion(region_handle, sim_host); + +/* + // send camera update to new region + gAgent.updateCamera(); + + // likewise make sure the camera is behind the avatar + gAgent.resetView(TRUE); + LLVector3 shift_vector = regionp->getPosRegionFromGlobal(gAgent.getRegion()->getOriginGlobal()); + gAgent.setRegion(regionp); + gObjectList.shiftObjects(shift_vector); + + if (gAgent.getAvatarObject()) + { + gAgent.getAvatarObject()->clearChatText(); + gAgent.slamLookAt(look_at); + } + gAgent.setPositionAgent(pos); + gAssetStorage->setUpstream(sim); + gCacheName->setUpstream(sim); +*/ + + // now, use the circuit info to tell simulator about us! + LL_INFOS("Messaging") << "process_teleport_finish() Enabling " + << sim_host << " with code " << msg->mOurCircuitCode << LL_ENDL; + msg->newMessageFast(_PREHASH_UseCircuitCode); + msg->nextBlockFast(_PREHASH_CircuitCode); + msg->addU32Fast(_PREHASH_Code, msg->getOurCircuitCode()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addUUIDFast(_PREHASH_ID, gAgent.getID()); + msg->sendReliable(sim_host); + + send_complete_agent_movement(sim_host); + gAgent.setTeleportState( LLAgent::TELEPORT_MOVING ); + gAgent.setTeleportMessage(LLAgent::sTeleportProgressMessages["contacting"]); + + regionp->setSeedCapability(seedCap); + + // Don't send camera updates to the new region until we're + // actually there... + + + // Now do teleport effect for where you're going. + // VEFFECT: TeleportEnd + effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); + effectp->setPositionGlobal(gAgent.getPositionGlobal()); + + effectp->setColor(LLColor4U(gAgent.getEffectColor())); + LLHUDManager::getInstance()->sendEffects(); + +// gTeleportDisplay = TRUE; +// gTeleportDisplayTimer.reset(); +// gViewerWindow->setShowProgress(TRUE); +} + +// stuff we have to do every time we get an AvatarInitComplete from a sim +/* +void process_avatar_init_complete(LLMessageSystem* msg, void**) +{ + LLVector3 agent_pos; + msg->getVector3Fast(_PREHASH_AvatarData, _PREHASH_Position, agent_pos); + agent_movement_complete(msg->getSender(), agent_pos); +} +*/ + +void process_agent_movement_complete(LLMessageSystem* msg, void**) +{ + gAgentMovementCompleted = true; + + LLUUID agent_id; + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); + LLUUID session_id; + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_SessionID, session_id); + if((gAgent.getID() != agent_id) || (gAgent.getSessionID() != session_id)) + { + LL_WARNS("Messaging") << "Incorrect id in process_agent_movement_complete()" + << LL_ENDL; + return; + } + + LL_DEBUGS("Messaging") << "process_agent_movement_complete()" << LL_ENDL; + + // *TODO: check timestamp to make sure the movement compleation + // makes sense. + LLVector3 agent_pos; + msg->getVector3Fast(_PREHASH_Data, _PREHASH_Position, agent_pos); + LLVector3 look_at; + msg->getVector3Fast(_PREHASH_Data, _PREHASH_LookAt, look_at); + U64 region_handle; + msg->getU64Fast(_PREHASH_Data, _PREHASH_RegionHandle, region_handle); + + std::string version_channel; + msg->getString("SimData", "ChannelVersion", version_channel); + + LLVOAvatar* avatarp = gAgent.getAvatarObject(); + if (!avatarp) + { + // Could happen if you were immediately god-teleported away on login, + // maybe other cases. Continue, but warn. + LL_WARNS("Messaging") << "agent_movement_complete() with NULL avatarp." << LL_ENDL; + } + + F32 x, y; + from_region_handle(region_handle, &x, &y); + LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromHandle(region_handle); + if (!regionp) + { + if (gAgent.getRegion()) + { + LL_WARNS("Messaging") << "current region " << gAgent.getRegion()->getOriginGlobal() << LL_ENDL; + } + + LL_WARNS("Messaging") << "Agent being sent to invalid home region: " + << x << ":" << y + << " current pos " << gAgent.getPositionGlobal() + << LL_ENDL; + LLAppViewer::instance()->forceDisconnect("You were sent to an invalid region."); + return; + + } + + LL_INFOS("Messaging") << "Changing home region to " << x << ":" << y << LL_ENDL; + + // set our upstream host the new simulator and shuffle things as + // appropriate. + LLVector3 shift_vector = regionp->getPosRegionFromGlobal( + gAgent.getRegion()->getOriginGlobal()); + gAgent.setRegion(regionp); + gObjectList.shiftObjects(shift_vector); + gAssetStorage->setUpstream(msg->getSender()); + gCacheName->setUpstream(msg->getSender()); + gViewerThrottle.sendToSim(); + gViewerWindow->sendShapeToSim(); + + bool is_teleport = gAgent.getTeleportState() == LLAgent::TELEPORT_MOVING; + + if( is_teleport ) + { + // Force the camera back onto the agent, don't animate. + gAgent.setFocusOnAvatar(TRUE, FALSE); + gAgent.slamLookAt(look_at); + gAgent.updateCamera(); + + gAgent.setTeleportState( LLAgent::TELEPORT_START_ARRIVAL ); + + // set the appearance on teleport since the new sim does not + // know what you look like. + gAgent.sendAgentSetAppearance(); + + if (avatarp) + { + // Chat the "back" SLURL. (DEV-4907) + LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL()); + chat.mSourceType = CHAT_SOURCE_SYSTEM; + LLFloaterChat::addChatHistory(chat); + + // Set the new position + avatarp->setPositionAgent(agent_pos); + avatarp->clearChat(); + avatarp->slamPosition(); + } + } + else + { + // This is likely just the initial logging in phase. + gAgent.setTeleportState( LLAgent::TELEPORT_NONE ); + } + + if ( LLTracker::isTracking(NULL) ) + { + // Check distance to beacon, if < 5m, remove beacon + LLVector3d beacon_pos = LLTracker::getTrackedPositionGlobal(); + LLVector3 beacon_dir(agent_pos.mV[VX] - (F32)fmod(beacon_pos.mdV[VX], 256.0), agent_pos.mV[VY] - (F32)fmod(beacon_pos.mdV[VY], 256.0), 0); + if (beacon_dir.magVecSquared() < 25.f) + { + LLTracker::stopTracking(NULL); + } + else if ( is_teleport ) + { + //look at the beacon + LLVector3 global_agent_pos = agent_pos; + global_agent_pos[0] += x; + global_agent_pos[1] += y; + look_at = (LLVector3)beacon_pos - global_agent_pos; + look_at.normVec(); + gAgent.slamLookAt(look_at); + } + } + + // TODO: Put back a check for flying status! DK 12/19/05 + // Sim tells us whether the new position is off the ground + /* + if (teleport_flags & TELEPORT_FLAGS_IS_FLYING) + { + gAgent.setFlying(TRUE); + } + else + { + gAgent.setFlying(FALSE); + } + */ + + send_agent_update(TRUE, TRUE); + + if (gAgent.getRegion()->getBlockFly()) + { + gAgent.setFlying(gAgent.canFly()); + } + + // force simulator to recognize busy state + if (gAgent.getBusy()) + { + gAgent.setBusy(); + } + else + { + gAgent.clearBusy(); + } + + if (avatarp) + { + avatarp->mFootPlane.clearVec(); + } + + // send walk-vs-run status + gAgent.sendWalkRun(gAgent.getRunning() || gAgent.getAlwaysRun()); + + // If the server version has changed, display an info box and offer + // to display the release notes, unless this is the initial log in. + if (gLastVersionChannel == version_channel) + { + return; + } + + if (!gLastVersionChannel.empty()) + { + LLSD payload; + payload["message"] = version_channel; + LLNotifications::instance().add("ServerVersionChanged", LLSD(), payload, server_version_changed_callback); + } + + gLastVersionChannel = version_channel; +} + +bool server_version_changed_callback(const LLSD& notification, const LLSD& response) +{ + if(notification["payload"]["message"].asString() =="") + return false; + std::string url ="http://wiki.secondlife.com/wiki/Release_Notes/"; + //parse the msg string + std::string server_version = notification["payload"]["message"].asString(); + std::vector<std::string> s_vect; + boost::algorithm::split(s_vect, server_version, isspace); + for(U32 i = 0; i < s_vect.size(); i++) + { + if (i != (s_vect.size() - 1)) + { + if(i != (s_vect.size() - 2)) + { + url += s_vect[i] + "_"; + } + else + { + url += s_vect[i] + "/"; + } + } + else + { + url += s_vect[i].substr(0,4); + } + } + + LLWeb::loadURL(url); + return false; +} + + +void process_crossed_region(LLMessageSystem* msg, void**) +{ + LLUUID agent_id; + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); + LLUUID session_id; + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_SessionID, session_id); + if((gAgent.getID() != agent_id) || (gAgent.getSessionID() != session_id)) + { + LL_WARNS("Messaging") << "Incorrect id in process_crossed_region()" + << LL_ENDL; + return; + } + LL_INFOS("Messaging") << "process_crossed_region()" << LL_ENDL; + + U32 sim_ip; + msg->getIPAddrFast(_PREHASH_RegionData, _PREHASH_SimIP, sim_ip); + U16 sim_port; + msg->getIPPortFast(_PREHASH_RegionData, _PREHASH_SimPort, sim_port); + LLHost sim_host(sim_ip, sim_port); + U64 region_handle; + msg->getU64Fast(_PREHASH_RegionData, _PREHASH_RegionHandle, region_handle); + + std::string seedCap; + msg->getStringFast(_PREHASH_RegionData, _PREHASH_SeedCapability, seedCap); + + send_complete_agent_movement(sim_host); + + LLViewerRegion* regionp = LLWorld::getInstance()->addRegion(region_handle, sim_host); + regionp->setSeedCapability(seedCap); +} + + + +// Sends avatar and camera information to simulator. +// Sent roughly once per frame, or 20 times per second, whichever is less often + +const F32 THRESHOLD_HEAD_ROT_QDOT = 0.9997f; // ~= 2.5 degrees -- if its less than this we need to update head_rot +const F32 MAX_HEAD_ROT_QDOT = 0.99999f; // ~= 0.5 degrees -- if its greater than this then no need to update head_rot + // between these values we delay the updates (but no more than one second) + + +void send_agent_update(BOOL force_send, BOOL send_reliable) +{ + if (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE) + { + // We don't care if they want to send an agent update, they're not allowed to until the simulator + // that's the target is ready to receive them (after avatar_init_complete is received) + return; + } + + // We have already requested to log out. Don't send agent updates. + if(LLAppViewer::instance()->logoutRequestSent()) + { + return; + } + + // no region to send update to + if(gAgent.getRegion() == NULL) + { + return; + } + + const F32 TRANSLATE_THRESHOLD = 0.01f; + + // NOTA BENE: This is (intentionally?) using the small angle sine approximation to test for rotation + // Plus, there is an extra 0.5 in the mix since the perpendicular between last_camera_at and getAtAxis() bisects cam_rot_change + // Thus, we're actually testing against 0.2 degrees + const F32 ROTATION_THRESHOLD = 0.1f * 2.f*F_PI/360.f; // Rotation thresh 0.2 deg, see note above + + const U8 DUP_MSGS = 1; // HACK! number of times to repeat data on motionless agent + + // Store data on last sent update so that if no changes, no send + static LLVector3 last_camera_pos_agent, + last_camera_at, + last_camera_left, + last_camera_up; + + static LLVector3 cam_center_chg, + cam_rot_chg; + + static LLQuaternion last_head_rot; + static U32 last_control_flags = 0; + static U8 last_render_state; + static U8 duplicate_count = 0; + static F32 head_rot_chg = 1.0; + static U8 last_flags; + + LLMessageSystem *msg = gMessageSystem; + LLVector3 camera_pos_agent; // local to avatar's region + U8 render_state; + + LLQuaternion body_rotation = gAgent.getFrameAgent().getQuaternion(); + LLQuaternion head_rotation = gAgent.getHeadRotation(); + + camera_pos_agent = gAgent.getCameraPositionAgent(); + + render_state = gAgent.getRenderState(); + + U32 control_flag_change = 0; + U8 flag_change = 0; + + cam_center_chg = last_camera_pos_agent - camera_pos_agent; + cam_rot_chg = last_camera_at - LLViewerCamera::getInstance()->getAtAxis(); + + // If a modifier key is held down, turn off + // LBUTTON and ML_LBUTTON so that using the camera (alt-key) doesn't + // trigger a control event. + U32 control_flags = gAgent.getControlFlags(); + MASK key_mask = gKeyboard->currentMask(TRUE); + if (key_mask & MASK_ALT || key_mask & MASK_CONTROL) + { + control_flags &= ~( AGENT_CONTROL_LBUTTON_DOWN | + AGENT_CONTROL_ML_LBUTTON_DOWN ); + control_flags |= AGENT_CONTROL_LBUTTON_UP | + AGENT_CONTROL_ML_LBUTTON_UP ; + } + + control_flag_change = last_control_flags ^ control_flags; + + U8 flags = AU_FLAGS_NONE; + if (gAgent.isGroupTitleHidden()) + { + flags |= AU_FLAGS_HIDETITLE; + } + if (gAgent.getAutoPilot()) + { + flags |= AU_FLAGS_CLIENT_AUTOPILOT; + } + + flag_change = last_flags ^ flags; + + head_rot_chg = dot(last_head_rot, head_rotation); + + if (force_send || + (cam_center_chg.magVec() > TRANSLATE_THRESHOLD) || + (head_rot_chg < THRESHOLD_HEAD_ROT_QDOT) || + (last_render_state != render_state) || + (cam_rot_chg.magVec() > ROTATION_THRESHOLD) || + control_flag_change != 0 || + flag_change != 0) + { +/* + if (head_rot_chg < THRESHOLD_HEAD_ROT_QDOT) + { + //LL_INFOS("Messaging") << "head rot " << head_rotation << LL_ENDL; + LL_INFOS("Messaging") << "head_rot_chg = " << head_rot_chg << LL_ENDL; + } + if (cam_rot_chg.magVec() > ROTATION_THRESHOLD) + { + LL_INFOS("Messaging") << "cam rot " << cam_rot_chg.magVec() << LL_ENDL; + } + if (cam_center_chg.magVec() > TRANSLATE_THRESHOLD) + { + LL_INFOS("Messaging") << "cam center " << cam_center_chg.magVec() << LL_ENDL; + } +// if (drag_delta_chg.magVec() > TRANSLATE_THRESHOLD) +// { +// LL_INFOS("Messaging") << "drag delta " << drag_delta_chg.magVec() << LL_ENDL; +// } + if (control_flag_change) + { + LL_INFOS("Messaging") << "dcf = " << control_flag_change << LL_ENDL; + } +*/ + + duplicate_count = 0; + } + else + { + duplicate_count++; + + if (head_rot_chg < MAX_HEAD_ROT_QDOT && duplicate_count < AGENT_UPDATES_PER_SECOND) + { + // The head_rotation is sent for updating things like attached guns. + // We only trigger a new update when head_rotation deviates beyond + // some threshold from the last update, however this can break fine + // adjustments when trying to aim an attached gun, so what we do here + // (where we would normally skip sending an update when nothing has changed) + // is gradually reduce the threshold to allow a better update to + // eventually get sent... should update to within 0.5 degrees in less + // than a second. + if (head_rot_chg < THRESHOLD_HEAD_ROT_QDOT + (MAX_HEAD_ROT_QDOT - THRESHOLD_HEAD_ROT_QDOT) * duplicate_count / AGENT_UPDATES_PER_SECOND) + { + duplicate_count = 0; + } + else + { + return; + } + } + else + { + return; + } + } + + if (duplicate_count < DUP_MSGS && !gDisconnected) + { + // Build the message + msg->newMessageFast(_PREHASH_AgentUpdate); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addQuatFast(_PREHASH_BodyRotation, body_rotation); + msg->addQuatFast(_PREHASH_HeadRotation, head_rotation); + msg->addU8Fast(_PREHASH_State, render_state); + msg->addU8Fast(_PREHASH_Flags, flags); + +// if (camera_pos_agent.mV[VY] > 255.f) +// { +// LL_INFOS("Messaging") << "Sending camera center " << camera_pos_agent << LL_ENDL; +// } + + msg->addVector3Fast(_PREHASH_CameraCenter, camera_pos_agent); + msg->addVector3Fast(_PREHASH_CameraAtAxis, LLViewerCamera::getInstance()->getAtAxis()); + msg->addVector3Fast(_PREHASH_CameraLeftAxis, LLViewerCamera::getInstance()->getLeftAxis()); + msg->addVector3Fast(_PREHASH_CameraUpAxis, LLViewerCamera::getInstance()->getUpAxis()); + msg->addF32Fast(_PREHASH_Far, gAgent.mDrawDistance); + + msg->addU32Fast(_PREHASH_ControlFlags, control_flags); + + if (gDebugClicks) + { + if (control_flags & AGENT_CONTROL_LBUTTON_DOWN) + { + LL_INFOS("Messaging") << "AgentUpdate left button down" << LL_ENDL; + } + + if (control_flags & AGENT_CONTROL_LBUTTON_UP) + { + LL_INFOS("Messaging") << "AgentUpdate left button up" << LL_ENDL; + } + } + + gAgent.enableControlFlagReset(); + + if (!send_reliable) + { + gAgent.sendMessage(); + } + else + { + gAgent.sendReliableMessage(); + } + +// LL_DEBUGS("Messaging") << "agent " << avatar_pos_agent << " cam " << camera_pos_agent << LL_ENDL; + + // Copy the old data + last_head_rot = head_rotation; + last_render_state = render_state; + last_camera_pos_agent = camera_pos_agent; + last_camera_at = LLViewerCamera::getInstance()->getAtAxis(); + last_camera_left = LLViewerCamera::getInstance()->getLeftAxis(); + last_camera_up = LLViewerCamera::getInstance()->getUpAxis(); + last_control_flags = control_flags; + last_flags = flags; + } +} + + + +// *TODO: Remove this dependency, or figure out a better way to handle +// this hack. +extern U32 gObjectBits; + +void process_object_update(LLMessageSystem *mesgsys, void **user_data) +{ + LLMemType mt(LLMemType::MTYPE_OBJECT); + // Update the data counters + if (mesgsys->getReceiveCompressedSize()) + { + gObjectBits += mesgsys->getReceiveCompressedSize() * 8; + } + else + { + gObjectBits += mesgsys->getReceiveSize() * 8; + } + + // Update the object... + gObjectList.processObjectUpdate(mesgsys, user_data, OUT_FULL); +} + +void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data) +{ + LLMemType mt(LLMemType::MTYPE_OBJECT); + // Update the data counters + if (mesgsys->getReceiveCompressedSize()) + { + gObjectBits += mesgsys->getReceiveCompressedSize() * 8; + } + else + { + gObjectBits += mesgsys->getReceiveSize() * 8; + } + + // Update the object... + gObjectList.processCompressedObjectUpdate(mesgsys, user_data, OUT_FULL_COMPRESSED); +} + +void process_cached_object_update(LLMessageSystem *mesgsys, void **user_data) +{ + LLMemType mt(LLMemType::MTYPE_OBJECT); + // Update the data counters + if (mesgsys->getReceiveCompressedSize()) + { + gObjectBits += mesgsys->getReceiveCompressedSize() * 8; + } + else + { + gObjectBits += mesgsys->getReceiveSize() * 8; + } + + // Update the object... + gObjectList.processCachedObjectUpdate(mesgsys, user_data, OUT_FULL_CACHED); +} + + +void process_terse_object_update_improved(LLMessageSystem *mesgsys, void **user_data) +{ + LLMemType mt(LLMemType::MTYPE_OBJECT); + if (mesgsys->getReceiveCompressedSize()) + { + gObjectBits += mesgsys->getReceiveCompressedSize() * 8; + } + else + { + gObjectBits += mesgsys->getReceiveSize() * 8; + } + + gObjectList.processCompressedObjectUpdate(mesgsys, user_data, OUT_TERSE_IMPROVED); +} + +static LLFastTimer::DeclareTimer FTM_PROCESS_OBJECTS("Process Objects"); + + +void process_kill_object(LLMessageSystem *mesgsys, void **user_data) +{ + LLFastTimer t(FTM_PROCESS_OBJECTS); + + LLUUID id; + U32 local_id; + S32 i; + S32 num_objects; + + num_objects = mesgsys->getNumberOfBlocksFast(_PREHASH_ObjectData); + + for (i = 0; i < num_objects; i++) + { + mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i); + + LLViewerObjectList::getUUIDFromLocal(id, + local_id, + gMessageSystem->getSenderIP(), + gMessageSystem->getSenderPort()); + if (id == LLUUID::null) + { + LL_DEBUGS("Messaging") << "Unknown kill for local " << local_id << LL_ENDL; + gObjectList.mNumUnknownKills++; + continue; + } + else + { + LL_DEBUGS("Messaging") << "Kill message for local " << local_id << LL_ENDL; + } + + LLSelectMgr::getInstance()->removeObjectFromSelections(id); + + // ...don't kill the avatar + if (!(id == gAgentID)) + { + LLViewerObject *objectp = gObjectList.findObject(id); + if (objectp) + { + // Display green bubble on kill + if ( gShowObjectUpdates ) + { + LLViewerObject* newobject; + newobject = gObjectList.createObjectViewer(LL_PCODE_LEGACY_TEXT_BUBBLE, objectp->getRegion()); + + LLVOTextBubble* bubble = (LLVOTextBubble*) newobject; + + bubble->mColor.setVec(0.f, 1.f, 0.f, 1.f); + bubble->setScale( 2.0f * bubble->getScale() ); + bubble->setPositionGlobal(objectp->getPositionGlobal()); + gPipeline.addObject(bubble); + } + + // Do the kill + gObjectList.killObject(objectp); + } + else + { + LL_WARNS("Messaging") << "Object in UUID lookup, but not on object list in kill!" << LL_ENDL; + gObjectList.mNumUnknownKills++; + } + } + } +} + +void process_time_synch(LLMessageSystem *mesgsys, void **user_data) +{ + LLVector3 sun_direction; + LLVector3 sun_ang_velocity; + F32 phase; + U64 space_time_usec; + + U32 seconds_per_day; + U32 seconds_per_year; + + // "SimulatorViewerTimeMessage" + mesgsys->getU64Fast(_PREHASH_TimeInfo, _PREHASH_UsecSinceStart, space_time_usec); + mesgsys->getU32Fast(_PREHASH_TimeInfo, _PREHASH_SecPerDay, seconds_per_day); + mesgsys->getU32Fast(_PREHASH_TimeInfo, _PREHASH_SecPerYear, seconds_per_year); + + // This should eventually be moved to an "UpdateHeavenlyBodies" message + mesgsys->getF32Fast(_PREHASH_TimeInfo, _PREHASH_SunPhase, phase); + mesgsys->getVector3Fast(_PREHASH_TimeInfo, _PREHASH_SunDirection, sun_direction); + mesgsys->getVector3Fast(_PREHASH_TimeInfo, _PREHASH_SunAngVelocity, sun_ang_velocity); + + LLWorld::getInstance()->setSpaceTimeUSec(space_time_usec); + + //LL_DEBUGS("Messaging") << "time_synch() - " << sun_direction << ", " << sun_ang_velocity + // << ", " << phase << LL_ENDL; + + gSky.setSunPhase(phase); + gSky.setSunTargetDirection(sun_direction, sun_ang_velocity); + if (!gNoRender && !(gSavedSettings.getBOOL("SkyOverrideSimSunPosition") || gSky.getOverrideSun())) + { + gSky.setSunDirection(sun_direction, sun_ang_velocity); + } +} + +void process_sound_trigger(LLMessageSystem *msg, void **) +{ + if (!gAudiop) return; + + U64 region_handle = 0; + F32 gain = 0; + LLUUID sound_id; + LLUUID owner_id; + LLUUID object_id; + LLUUID parent_id; + LLVector3 pos_local; + + msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_SoundID, sound_id); + msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_OwnerID, owner_id); + msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_ObjectID, object_id); + msg->getUUIDFast(_PREHASH_SoundData, _PREHASH_ParentID, parent_id); + msg->getU64Fast(_PREHASH_SoundData, _PREHASH_Handle, region_handle); + msg->getVector3Fast(_PREHASH_SoundData, _PREHASH_Position, pos_local); + msg->getF32Fast(_PREHASH_SoundData, _PREHASH_Gain, gain); + + // adjust sound location to true global coords + LLVector3d pos_global = from_region_handle(region_handle); + pos_global.mdV[VX] += pos_local.mV[VX]; + pos_global.mdV[VY] += pos_local.mV[VY]; + pos_global.mdV[VZ] += pos_local.mV[VZ]; + + // Don't play a trigger sound if you can't hear it due + // to parcel "local audio only" settings. + if (!LLViewerParcelMgr::getInstance()->canHearSound(pos_global)) return; + + // Don't play sounds triggered by someone you muted. + if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return; + + // Don't play sounds from an object you muted + if (LLMuteList::getInstance()->isMuted(object_id)) return; + + // Don't play sounds from an object whose parent you muted + if (parent_id.notNull() + && LLMuteList::getInstance()->isMuted(parent_id)) + { + return; + } + + // Don't play sounds from a region with maturity above current agent maturity + if( !gAgent.canAccessMaturityInRegion( region_handle ) ) + { + return; + } + + gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global); +} + +void process_preload_sound(LLMessageSystem *msg, void **user_data) +{ + if (!gAudiop) + { + return; + } + + LLUUID sound_id; + LLUUID object_id; + LLUUID owner_id; + + msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_SoundID, sound_id); + msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_ObjectID, object_id); + msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_OwnerID, owner_id); + + LLViewerObject *objectp = gObjectList.findObject(object_id); + if (!objectp) return; + + if (LLMuteList::getInstance()->isMuted(object_id)) return; + if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return; + + LLAudioSource *sourcep = objectp->getAudioSource(owner_id); + if (!sourcep) return; + + LLAudioData *datap = gAudiop->getAudioData(sound_id); + + // Note that I don't actually do any loading of the + // audio data into a buffer at this point, as it won't actually + // help us out. + + // Don't play sounds from a region with maturity above current agent maturity + LLVector3d pos_global = objectp->getPositionGlobal(); + if( !gAgent.canAccessMaturityAtGlobal( pos_global ) ) + { + return; + } + + // Add audioData starts a transfer internally. + sourcep->addAudioData(datap, FALSE); +} + +void process_attached_sound(LLMessageSystem *msg, void **user_data) +{ + F32 gain = 0; + LLUUID sound_id; + LLUUID object_id; + LLUUID owner_id; + U8 flags; + + msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_SoundID, sound_id); + msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_ObjectID, object_id); + msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_OwnerID, owner_id); + msg->getF32Fast(_PREHASH_DataBlock, _PREHASH_Gain, gain); + msg->getU8Fast(_PREHASH_DataBlock, _PREHASH_Flags, flags); + + LLViewerObject *objectp = gObjectList.findObject(object_id); + if (!objectp) + { + // we don't know about this object, just bail + return; + } + + if (LLMuteList::getInstance()->isMuted(object_id)) return; + + if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return; + + + // Don't play sounds from a region with maturity above current agent maturity + LLVector3d pos = objectp->getPositionGlobal(); + if( !gAgent.canAccessMaturityAtGlobal(pos) ) + { + return; + } + + objectp->setAttachedSound(sound_id, owner_id, gain, flags); +} + + +void process_attached_sound_gain_change(LLMessageSystem *mesgsys, void **user_data) +{ + F32 gain = 0; + LLUUID object_guid; + LLViewerObject *objectp = NULL; + + mesgsys->getUUIDFast(_PREHASH_DataBlock, _PREHASH_ObjectID, object_guid); + + if (!((objectp = gObjectList.findObject(object_guid)))) + { + // we don't know about this object, just bail + return; + } + + mesgsys->getF32Fast(_PREHASH_DataBlock, _PREHASH_Gain, gain); + + objectp->adjustAudioGain(gain); +} + + +void process_health_message(LLMessageSystem *mesgsys, void **user_data) +{ + F32 health; + + mesgsys->getF32Fast(_PREHASH_HealthData, _PREHASH_Health, health); + + if (gStatusBar) + { + gStatusBar->setHealth((S32)health); + } +} + + +void process_sim_stats(LLMessageSystem *msg, void **user_data) +{ + S32 count = msg->getNumberOfBlocks("Stat"); + for (S32 i = 0; i < count; ++i) + { + U32 stat_id; + F32 stat_value; + msg->getU32("Stat", "StatID", stat_id, i); + msg->getF32("Stat", "StatValue", stat_value, i); + switch (stat_id) + { + case LL_SIM_STAT_TIME_DILATION: + LLViewerStats::getInstance()->mSimTimeDilation.addValue(stat_value); + break; + case LL_SIM_STAT_FPS: + LLViewerStats::getInstance()->mSimFPS.addValue(stat_value); + break; + case LL_SIM_STAT_PHYSFPS: + LLViewerStats::getInstance()->mSimPhysicsFPS.addValue(stat_value); + break; + case LL_SIM_STAT_AGENTUPS: + LLViewerStats::getInstance()->mSimAgentUPS.addValue(stat_value); + break; + case LL_SIM_STAT_FRAMEMS: + LLViewerStats::getInstance()->mSimFrameMsec.addValue(stat_value); + break; + case LL_SIM_STAT_NETMS: + LLViewerStats::getInstance()->mSimNetMsec.addValue(stat_value); + break; + case LL_SIM_STAT_SIMOTHERMS: + LLViewerStats::getInstance()->mSimSimOtherMsec.addValue(stat_value); + break; + case LL_SIM_STAT_SIMPHYSICSMS: + LLViewerStats::getInstance()->mSimSimPhysicsMsec.addValue(stat_value); + break; + case LL_SIM_STAT_AGENTMS: + LLViewerStats::getInstance()->mSimAgentMsec.addValue(stat_value); + break; + case LL_SIM_STAT_IMAGESMS: + LLViewerStats::getInstance()->mSimImagesMsec.addValue(stat_value); + break; + case LL_SIM_STAT_SCRIPTMS: + LLViewerStats::getInstance()->mSimScriptMsec.addValue(stat_value); + break; + case LL_SIM_STAT_NUMTASKS: + LLViewerStats::getInstance()->mSimObjects.addValue(stat_value); + break; + case LL_SIM_STAT_NUMTASKSACTIVE: + LLViewerStats::getInstance()->mSimActiveObjects.addValue(stat_value); + break; + case LL_SIM_STAT_NUMAGENTMAIN: + LLViewerStats::getInstance()->mSimMainAgents.addValue(stat_value); + break; + case LL_SIM_STAT_NUMAGENTCHILD: + LLViewerStats::getInstance()->mSimChildAgents.addValue(stat_value); + break; + case LL_SIM_STAT_NUMSCRIPTSACTIVE: + LLViewerStats::getInstance()->mSimActiveScripts.addValue(stat_value); + break; + case LL_SIM_STAT_SCRIPT_EPS: + LLViewerStats::getInstance()->mSimScriptEPS.addValue(stat_value); + break; + case LL_SIM_STAT_INPPS: + LLViewerStats::getInstance()->mSimInPPS.addValue(stat_value); + break; + case LL_SIM_STAT_OUTPPS: + LLViewerStats::getInstance()->mSimOutPPS.addValue(stat_value); + break; + case LL_SIM_STAT_PENDING_DOWNLOADS: + LLViewerStats::getInstance()->mSimPendingDownloads.addValue(stat_value); + break; + case LL_SIM_STAT_PENDING_UPLOADS: + LLViewerStats::getInstance()->mSimPendingUploads.addValue(stat_value); + break; + case LL_SIM_STAT_PENDING_LOCAL_UPLOADS: + LLViewerStats::getInstance()->mSimPendingLocalUploads.addValue(stat_value); + break; + case LL_SIM_STAT_TOTAL_UNACKED_BYTES: + LLViewerStats::getInstance()->mSimTotalUnackedBytes.addValue(stat_value / 1024.f); + break; + case LL_SIM_STAT_PHYSICS_PINNED_TASKS: + LLViewerStats::getInstance()->mPhysicsPinnedTasks.addValue(stat_value); + break; + case LL_SIM_STAT_PHYSICS_LOD_TASKS: + LLViewerStats::getInstance()->mPhysicsLODTasks.addValue(stat_value); + break; + case LL_SIM_STAT_SIMPHYSICSSTEPMS: + LLViewerStats::getInstance()->mSimSimPhysicsStepMsec.addValue(stat_value); + break; + case LL_SIM_STAT_SIMPHYSICSSHAPEMS: + LLViewerStats::getInstance()->mSimSimPhysicsShapeUpdateMsec.addValue(stat_value); + break; + case LL_SIM_STAT_SIMPHYSICSOTHERMS: + LLViewerStats::getInstance()->mSimSimPhysicsOtherMsec.addValue(stat_value); + break; + case LL_SIM_STAT_SIMPHYSICSMEMORY: + LLViewerStats::getInstance()->mPhysicsMemoryAllocated.addValue(stat_value); + break; + case LL_SIM_STAT_SIMSPARETIME: + LLViewerStats::getInstance()->mSimSpareMsec.addValue(stat_value); + break; + case LL_SIM_STAT_SIMSLEEPTIME: + LLViewerStats::getInstance()->mSimSleepMsec.addValue(stat_value); + break; + case LL_SIM_STAT_IOPUMPTIME: + LLViewerStats::getInstance()->mSimPumpIOMsec.addValue(stat_value); + break; + default: + // Used to be a commented out warning. + LL_DEBUGS("Messaging") << "Unknown stat id" << stat_id << LL_ENDL; + break; + } + } + + /* + msg->getF32Fast(_PREHASH_Statistics, _PREHASH_PhysicsTimeDilation, time_dilation); + LLViewerStats::getInstance()->mSimTDStat.addValue(time_dilation); + + // Process information + // { CpuUsage F32 } + // { SimMemTotal F32 } + // { SimMemRSS F32 } + // { ProcessUptime F32 } + F32 cpu_usage; + F32 sim_mem_total; + F32 sim_mem_rss; + F32 process_uptime; + msg->getF32Fast(_PREHASH_Statistics, _PREHASH_CpuUsage, cpu_usage); + msg->getF32Fast(_PREHASH_Statistics, _PREHASH_SimMemTotal, sim_mem_total); + msg->getF32Fast(_PREHASH_Statistics, _PREHASH_SimMemRSS, sim_mem_rss); + msg->getF32Fast(_PREHASH_Statistics, _PREHASH_ProcessUptime, process_uptime); + LLViewerStats::getInstance()->mSimCPUUsageStat.addValue(cpu_usage); + LLViewerStats::getInstance()->mSimMemTotalStat.addValue(sim_mem_total); + LLViewerStats::getInstance()->mSimMemRSSStat.addValue(sim_mem_rss); + */ + + // + // Various hacks that aren't statistics, but are being handled here. + // + U32 max_tasks_per_region; + U32 region_flags; + msg->getU32("Region", "ObjectCapacity", max_tasks_per_region); + msg->getU32("Region", "RegionFlags", region_flags); + + LLViewerRegion* regionp = gAgent.getRegion(); + if (regionp) + { + BOOL was_flying = gAgent.getFlying(); + regionp->setRegionFlags(region_flags); + regionp->setMaxTasks(max_tasks_per_region); + // HACK: This makes agents drop from the sky if the region is + // set to no fly while people are still in the sim. + if (was_flying && regionp->getBlockFly()) + { + gAgent.setFlying(gAgent.canFly()); + } + } +} + + + +void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data) +{ + LLUUID animation_id; + LLUUID uuid; + S32 anim_sequence_id; + LLVOAvatar *avatarp; + + mesgsys->getUUIDFast(_PREHASH_Sender, _PREHASH_ID, uuid); + + //clear animation flags + avatarp = (LLVOAvatar *)gObjectList.findObject(uuid); + + if (!avatarp) + { + // no agent by this ID...error? + LL_WARNS("Messaging") << "Received animation state for unknown avatar" << uuid << LL_ENDL; + return; + } + + S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_AnimationList); + S32 num_source_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_AnimationSourceList); + + avatarp->mSignaledAnimations.clear(); + + if (avatarp->isSelf()) + { + LLUUID object_id; + + for( S32 i = 0; i < num_blocks; i++ ) + { + mesgsys->getUUIDFast(_PREHASH_AnimationList, _PREHASH_AnimID, animation_id, i); + mesgsys->getS32Fast(_PREHASH_AnimationList, _PREHASH_AnimSequenceID, anim_sequence_id, i); + + LL_DEBUGS("Messaging") << "Anim sequence ID: " << anim_sequence_id << LL_ENDL; + + avatarp->mSignaledAnimations[animation_id] = anim_sequence_id; + + if (i < num_source_blocks) + { + mesgsys->getUUIDFast(_PREHASH_AnimationSourceList, _PREHASH_ObjectID, object_id, i); + + LLViewerObject* object = gObjectList.findObject(object_id); + if (object) + { + object->mFlags |= FLAGS_ANIM_SOURCE; + + BOOL anim_found = FALSE; + LLVOAvatar::AnimSourceIterator anim_it = avatarp->mAnimationSources.find(object_id); + for (;anim_it != avatarp->mAnimationSources.end(); ++anim_it) + { + if (anim_it->second == animation_id) + { + anim_found = TRUE; + break; + } + } + + if (!anim_found) + { + avatarp->mAnimationSources.insert(LLVOAvatar::AnimationSourceMap::value_type(object_id, animation_id)); + } + } + } + } + } + else + { + for( S32 i = 0; i < num_blocks; i++ ) + { + mesgsys->getUUIDFast(_PREHASH_AnimationList, _PREHASH_AnimID, animation_id, i); + mesgsys->getS32Fast(_PREHASH_AnimationList, _PREHASH_AnimSequenceID, anim_sequence_id, i); + avatarp->mSignaledAnimations[animation_id] = anim_sequence_id; + } + } + + if (num_blocks) + { + avatarp->processAnimationStateChanges(); + } +} + +void process_avatar_appearance(LLMessageSystem *mesgsys, void **user_data) +{ + LLUUID uuid; + mesgsys->getUUIDFast(_PREHASH_Sender, _PREHASH_ID, uuid); + + LLVOAvatar* avatarp = (LLVOAvatar *)gObjectList.findObject(uuid); + if( avatarp ) + { + avatarp->processAvatarAppearance( mesgsys ); + } + else + { + LL_WARNS("Messaging") << "avatar_appearance sent for unknown avatar " << uuid << LL_ENDL; + } +} + +void process_camera_constraint(LLMessageSystem *mesgsys, void **user_data) +{ + LLVector4 cameraCollidePlane; + mesgsys->getVector4Fast(_PREHASH_CameraCollidePlane, _PREHASH_Plane, cameraCollidePlane); + + gAgent.setCameraCollidePlane(cameraCollidePlane); +} + +void near_sit_object(BOOL success, void *data) +{ + if (success) + { + // Send message to sit on object + gMessageSystem->newMessageFast(_PREHASH_AgentSit); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + gAgent.sendReliableMessage(); + } +} + +void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data) +{ + LLVector3 sitPosition; + LLQuaternion sitRotation; + LLUUID sitObjectID; + BOOL use_autopilot; + mesgsys->getUUIDFast(_PREHASH_SitObject, _PREHASH_ID, sitObjectID); + mesgsys->getBOOLFast(_PREHASH_SitTransform, _PREHASH_AutoPilot, use_autopilot); + mesgsys->getVector3Fast(_PREHASH_SitTransform, _PREHASH_SitPosition, sitPosition); + mesgsys->getQuatFast(_PREHASH_SitTransform, _PREHASH_SitRotation, sitRotation); + LLVector3 camera_eye; + mesgsys->getVector3Fast(_PREHASH_SitTransform, _PREHASH_CameraEyeOffset, camera_eye); + LLVector3 camera_at; + mesgsys->getVector3Fast(_PREHASH_SitTransform, _PREHASH_CameraAtOffset, camera_at); + BOOL force_mouselook; + mesgsys->getBOOLFast(_PREHASH_SitTransform, _PREHASH_ForceMouselook, force_mouselook); + + LLVOAvatar* avatar = gAgent.getAvatarObject(); + + if (avatar && dist_vec_squared(camera_eye, camera_at) > 0.0001f) + { + gAgent.setSitCamera(sitObjectID, camera_eye, camera_at); + } + + gAgent.setForceMouselook(force_mouselook); + + LLViewerObject* object = gObjectList.findObject(sitObjectID); + if (object) + { + LLVector3 sit_spot = object->getPositionAgent() + (sitPosition * object->getRotation()); + if (!use_autopilot || (avatar && avatar->isSitting() && avatar->getRoot() == object->getRoot())) + { + //we're already sitting on this object, so don't autopilot + } + else + { + gAgent.startAutoPilotGlobal(gAgent.getPosGlobalFromAgent(sit_spot), "Sit", &sitRotation, near_sit_object, NULL, 0.5f); + } + } + else + { + LL_WARNS("Messaging") << "Received sit approval for unknown object " << sitObjectID << LL_ENDL; + } +} + +void process_clear_follow_cam_properties(LLMessageSystem *mesgsys, void **user_data) +{ + LLUUID source_id; + + mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, source_id); + + LLFollowCamMgr::removeFollowCamParams(source_id); +} + +void process_set_follow_cam_properties(LLMessageSystem *mesgsys, void **user_data) +{ + S32 type; + F32 value; + bool settingPosition = false; + bool settingFocus = false; + bool settingFocusOffset = false; + LLVector3 position; + LLVector3 focus; + LLVector3 focus_offset; + + LLUUID source_id; + + mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, source_id); + + LLViewerObject* objectp = gObjectList.findObject(source_id); + if (objectp) + { + objectp->mFlags |= FLAGS_CAMERA_SOURCE; + } + + S32 num_objects = mesgsys->getNumberOfBlocks("CameraProperty"); + for (S32 block_index = 0; block_index < num_objects; block_index++) + { + mesgsys->getS32("CameraProperty", "Type", type, block_index); + mesgsys->getF32("CameraProperty", "Value", value, block_index); + switch(type) + { + case FOLLOWCAM_PITCH: + LLFollowCamMgr::setPitch(source_id, value); + break; + case FOLLOWCAM_FOCUS_OFFSET_X: + focus_offset.mV[VX] = value; + settingFocusOffset = true; + break; + case FOLLOWCAM_FOCUS_OFFSET_Y: + focus_offset.mV[VY] = value; + settingFocusOffset = true; + break; + case FOLLOWCAM_FOCUS_OFFSET_Z: + focus_offset.mV[VZ] = value; + settingFocusOffset = true; + break; + case FOLLOWCAM_POSITION_LAG: + LLFollowCamMgr::setPositionLag(source_id, value); + break; + case FOLLOWCAM_FOCUS_LAG: + LLFollowCamMgr::setFocusLag(source_id, value); + break; + case FOLLOWCAM_DISTANCE: + LLFollowCamMgr::setDistance(source_id, value); + break; + case FOLLOWCAM_BEHINDNESS_ANGLE: + LLFollowCamMgr::setBehindnessAngle(source_id, value); + break; + case FOLLOWCAM_BEHINDNESS_LAG: + LLFollowCamMgr::setBehindnessLag(source_id, value); + break; + case FOLLOWCAM_POSITION_THRESHOLD: + LLFollowCamMgr::setPositionThreshold(source_id, value); + break; + case FOLLOWCAM_FOCUS_THRESHOLD: + LLFollowCamMgr::setFocusThreshold(source_id, value); + break; + case FOLLOWCAM_ACTIVE: + //if 1, set using followcam,. + LLFollowCamMgr::setCameraActive(source_id, value != 0.f); + break; + case FOLLOWCAM_POSITION_X: + settingPosition = true; + position.mV[ 0 ] = value; + break; + case FOLLOWCAM_POSITION_Y: + settingPosition = true; + position.mV[ 1 ] = value; + break; + case FOLLOWCAM_POSITION_Z: + settingPosition = true; + position.mV[ 2 ] = value; + break; + case FOLLOWCAM_FOCUS_X: + settingFocus = true; + focus.mV[ 0 ] = value; + break; + case FOLLOWCAM_FOCUS_Y: + settingFocus = true; + focus.mV[ 1 ] = value; + break; + case FOLLOWCAM_FOCUS_Z: + settingFocus = true; + focus.mV[ 2 ] = value; + break; + case FOLLOWCAM_POSITION_LOCKED: + LLFollowCamMgr::setPositionLocked(source_id, value != 0.f); + break; + case FOLLOWCAM_FOCUS_LOCKED: + LLFollowCamMgr::setFocusLocked(source_id, value != 0.f); + break; + + default: + break; + } + } + + if ( settingPosition ) + { + LLFollowCamMgr::setPosition(source_id, position); + } + if ( settingFocus ) + { + LLFollowCamMgr::setFocus(source_id, focus); + } + if ( settingFocusOffset ) + { + LLFollowCamMgr::setFocusOffset(source_id, focus_offset); + } +} +//end Ventrella + + +// Culled from newsim lltask.cpp +void process_name_value(LLMessageSystem *mesgsys, void **user_data) +{ + std::string temp_str; + LLUUID id; + S32 i, num_blocks; + + mesgsys->getUUIDFast(_PREHASH_TaskData, _PREHASH_ID, id); + + LLViewerObject* object = gObjectList.findObject(id); + + if (object) + { + num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_NameValueData); + for (i = 0; i < num_blocks; i++) + { + mesgsys->getStringFast(_PREHASH_NameValueData, _PREHASH_NVPair, temp_str, i); + LL_INFOS("Messaging") << "Added to object Name Value: " << temp_str << LL_ENDL; + object->addNVPair(temp_str); + } + } + else + { + LL_INFOS("Messaging") << "Can't find object " << id << " to add name value pair" << LL_ENDL; + } +} + +void process_remove_name_value(LLMessageSystem *mesgsys, void **user_data) +{ + std::string temp_str; + LLUUID id; + S32 i, num_blocks; + + mesgsys->getUUIDFast(_PREHASH_TaskData, _PREHASH_ID, id); + + LLViewerObject* object = gObjectList.findObject(id); + + if (object) + { + num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_NameValueData); + for (i = 0; i < num_blocks; i++) + { + mesgsys->getStringFast(_PREHASH_NameValueData, _PREHASH_NVPair, temp_str, i); + LL_INFOS("Messaging") << "Removed from object Name Value: " << temp_str << LL_ENDL; + object->removeNVPair(temp_str); + } + } + else + { + LL_INFOS("Messaging") << "Can't find object " << id << " to remove name value pair" << LL_ENDL; + } +} + +void process_kick_user(LLMessageSystem *msg, void** /*user_data*/) +{ + std::string message; + + msg->getStringFast(_PREHASH_UserInfo, _PREHASH_Reason, message); + + LLAppViewer::instance()->forceDisconnect(message); +} + + +/* +void process_user_list_reply(LLMessageSystem *msg, void **user_data) +{ + LLUserList::processUserListReply(msg, user_data); + return; + char firstname[MAX_STRING+1]; + char lastname[MAX_STRING+1]; + U8 status; + S32 user_count; + + user_count = msg->getNumberOfBlocks("UserBlock"); + + for (S32 i = 0; i < user_count; i++) + { + msg->getData("UserBlock", i, "FirstName", firstname); + msg->getData("UserBlock", i, "LastName", lastname); + msg->getData("UserBlock", i, "Status", &status); + + if (status & 0x01) + { + dialog_friends_add_friend(buffer, TRUE); + } + else + { + dialog_friends_add_friend(buffer, FALSE); + } + } + + dialog_friends_done_adding(); +} +*/ + +// this is not handled in processUpdateMessage +/* +void process_time_dilation(LLMessageSystem *msg, void **user_data) +{ + // get the time_dilation + U16 foo; + msg->getData("TimeDilation", "TimeDilation", &foo); + F32 time_dilation = ((F32) foo) / 65535.f; + + // get the pointer to the right region + U32 ip = msg->getSenderIP(); + U32 port = msg->getSenderPort(); + LLViewerRegion *regionp = LLWorld::getInstance()->getRegion(ip, port); + if (regionp) + { + regionp->setTimeDilation(time_dilation); + } +} +*/ + + + +void process_money_balance_reply( LLMessageSystem* msg, void** ) +{ + S32 balance = 0; + S32 credit = 0; + S32 committed = 0; + std::string desc; + + msg->getS32("MoneyData", "MoneyBalance", balance); + msg->getS32("MoneyData", "SquareMetersCredit", credit); + msg->getS32("MoneyData", "SquareMetersCommitted", committed); + msg->getStringFast(_PREHASH_MoneyData, _PREHASH_Description, desc); + LL_INFOS("Messaging") << "L$, credit, committed: " << balance << " " << credit << " " + << committed << LL_ENDL; + + if (gStatusBar) + { + S32 old_balance = gStatusBar->getBalance(); + + // This is an update, not the first transmission of balance + if (old_balance != 0) + { + // this is actually an update + if (balance > old_balance) + { + LLFirstUse::useBalanceIncrease(balance - old_balance); + } + else if (balance < old_balance) + { + LLFirstUse::useBalanceDecrease(balance - old_balance); + } + } + + gStatusBar->setBalance(balance); + gStatusBar->setLandCredit(credit); + gStatusBar->setLandCommitted(committed); + } + + LLUUID tid; + msg->getUUID("MoneyData", "TransactionID", tid); + static std::deque<LLUUID> recent; + if(!desc.empty() && gSavedSettings.getBOOL("NotifyMoneyChange") + && (std::find(recent.rbegin(), recent.rend(), tid) == recent.rend())) + { + // Make the user confirm the transaction, since they might + // have missed something during an event. + // *TODO: Translate + LLSD args; + args["MESSAGE"] = desc; + LLNotifications::instance().add("SystemMessage", args); + + // Once the 'recent' container gets large enough, chop some + // off the beginning. + const U32 MAX_LOOKBACK = 30; + const S32 POP_FRONT_SIZE = 12; + if(recent.size() > MAX_LOOKBACK) + { + LL_DEBUGS("Messaging") << "Removing oldest transaction records" << LL_ENDL; + recent.erase(recent.begin(), recent.begin() + POP_FRONT_SIZE); + } + //LL_DEBUGS("Messaging") << "Pushing back transaction " << tid << LL_ENDL; + recent.push_back(tid); + } +} + +bool handle_special_notification_callback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + + if (0 == option) + { + // set the preference to the maturity of the region we're calling + int preferredMaturity = notification["payload"]["_region_access"].asInteger(); + gSavedSettings.setU32("PreferredMaturity", preferredMaturity); + gAgent.sendMaturityPreferenceToServer(preferredMaturity); + + } + + return false; +} + +// some of the server notifications need special handling. This is where we do that. +bool handle_special_notification(std::string notificationID, LLSD& llsdBlock) +{ + int regionAccess = llsdBlock["_region_access"].asInteger(); + llsdBlock["REGIONMATURITY"] = LLViewerRegion::accessToString(regionAccess); + + // we're going to throw the LLSD in there in case anyone ever wants to use it + LLNotifications::instance().add(notificationID+"_Notify", llsdBlock); + + if (regionAccess == SIM_ACCESS_MATURE) + { + if (gAgent.isTeen()) + { + LLNotifications::instance().add(notificationID+"_KB", llsdBlock); + return true; + } + else if (gAgent.prefersPG()) + { + LLNotifications::instance().add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback); + return true; + } + } + else if (regionAccess == SIM_ACCESS_ADULT) + { + if (!gAgent.isAdult()) + { + LLNotifications::instance().add(notificationID+"_KB", llsdBlock); + return true; + } + else if (gAgent.prefersPG() || gAgent.prefersMature()) + { + LLNotifications::instance().add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback); + return true; + } + } + return false; +} + +bool attempt_standard_notification(LLMessageSystem* msgsystem) +{ + // if we have additional alert data + if (msgsystem->has(_PREHASH_AlertInfo) && msgsystem->getNumberOfBlocksFast(_PREHASH_AlertInfo) > 0) + { + // notification was specified using the new mechanism, so we can just handle it here + std::string notificationID; + std::string llsdRaw; + LLSD llsdBlock; + msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID); + msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_ExtraParams, llsdRaw); + if (llsdRaw.length()) + { + std::istringstream llsdData(llsdRaw); + if (!LLSDSerialize::deserialize(llsdBlock, llsdData, llsdRaw.length())) + { + llwarns << "attempt_standard_notification: Attempted to read notification parameter data into LLSD but failed:" << llsdRaw << llendl; + } + } + + if ( + (notificationID == "RegionEntryAccessBlocked") || + (notificationID == "LandClaimAccessBlocked") || + (notificationID == "LandBuyAccessBlocked") + ) + { + /*--------------------------------------------------------------------- + (Commented so a grep will find the notification strings, since + we construct them on the fly; if you add additional notifications, + please update the comment.) + + Could throw any of the following notifications: + + RegionEntryAccessBlocked + RegionEntryAccessBlocked_Notify + RegionEntryAccessBlocked_Change + RegionEntryAccessBlocked_KB + LandClaimAccessBlocked + LandClaimAccessBlocked_Notify + LandClaimAccessBlocked_Change + LandClaimAccessBlocked_KB + LandBuyAccessBlocked + LandBuyAccessBlocked_Notify + LandBuyAccessBlocked_Change + LandBuyAccessBlocked_KB + + -----------------------------------------------------------------------*/ + if (handle_special_notification(notificationID, llsdBlock)) + { + return true; + } + } + + LLNotifications::instance().add(notificationID, llsdBlock); + return true; + } + return false; +} + + +void process_agent_alert_message(LLMessageSystem* msgsystem, void** user_data) +{ + // make sure the cursor is back to the usual default since the + // alert is probably due to some kind of error. + gViewerWindow->getWindow()->resetBusyCount(); + + if (!attempt_standard_notification(msgsystem)) + { + BOOL modal = FALSE; + msgsystem->getBOOL("AlertData", "Modal", modal); + std::string buffer; + msgsystem->getStringFast(_PREHASH_AlertData, _PREHASH_Message, buffer); + process_alert_core(buffer, modal); + } +} + +// The only difference between this routine and the previous is the fact that +// for this routine, the modal parameter is always false. Sadly, for the message +// handled by this routine, there is no "Modal" parameter on the message, and +// there's no API to tell if a message has the given parameter or not. +// So we can't handle the messages with the same handler. +void process_alert_message(LLMessageSystem *msgsystem, void **user_data) +{ + // make sure the cursor is back to the usual default since the + // alert is probably due to some kind of error. + gViewerWindow->getWindow()->resetBusyCount(); + + if (!attempt_standard_notification(msgsystem)) + { + BOOL modal = FALSE; + std::string buffer; + msgsystem->getStringFast(_PREHASH_AlertData, _PREHASH_Message, buffer); + process_alert_core(buffer, modal); + } +} + +void process_alert_core(const std::string& message, BOOL modal) +{ + // HACK -- handle callbacks for specific alerts + if ( message == "You died and have been teleported to your home location") + { + LLViewerStats::getInstance()->incStat(LLViewerStats::ST_KILLED_COUNT); + } + else if( message == "Home position set." ) + { + // save the home location image to disk + std::string snap_filename = gDirUtilp->getLindenUserDir(); + snap_filename += gDirUtilp->getDirDelimiter(); + snap_filename += SCREEN_HOME_FILENAME; + gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight(), FALSE, FALSE); + } + + const std::string ALERT_PREFIX("ALERT: "); + const std::string NOTIFY_PREFIX("NOTIFY: "); + if (message.find(ALERT_PREFIX) == 0) + { + // Allow the server to spawn a named alert so that server alerts can be + // translated out of English. + std::string alert_name(message.substr(ALERT_PREFIX.length())); + LLNotifications::instance().add(alert_name); + } + else if (message.find(NOTIFY_PREFIX) == 0) + { + // Allow the server to spawn a named notification so that server notifications can be + // translated out of English. + std::string notify_name(message.substr(NOTIFY_PREFIX.length())); + LLNotifications::instance().add(notify_name); + } + else if (message[0] == '/') + { + // System message is important, show in upper-right box not tip + std::string text(message.substr(1)); + LLSD args; + if (text.substr(0,17) == "RESTART_X_MINUTES") + { + S32 mins = 0; + LLStringUtil::convertToS32(text.substr(18), mins); + args["MINUTES"] = llformat("%d",mins); + LLNotifications::instance().add("RegionRestartMinutes", args); + } + else if (text.substr(0,17) == "RESTART_X_SECONDS") + { + S32 secs = 0; + LLStringUtil::convertToS32(text.substr(18), secs); + args["SECONDS"] = llformat("%d",secs); + LLNotifications::instance().add("RegionRestartSeconds", args); + } + else + { + std::string new_msg =LLNotifications::instance().getGlobalString(text); + args["MESSAGE"] = new_msg; + LLNotifications::instance().add("SystemMessage", args); + } + } + else if (modal) + { + LLSD args; + std::string new_msg =LLNotifications::instance().getGlobalString(message); + args["ERROR_MESSAGE"] = new_msg; + LLNotifications::instance().add("ErrorMessage", args); + } + else + { + LLSD args; + std::string new_msg =LLNotifications::instance().getGlobalString(message); + args["MESSAGE"] = new_msg; + LLNotifications::instance().add("SystemMessageTip", args); + } +} + +mean_collision_list_t gMeanCollisionList; +time_t gLastDisplayedTime = 0; + +void handle_show_mean_events(void *) +{ + if (gNoRender) + { + return; + } + LLFloaterReg::showInstance("bumps"); + //LLFloaterBump::showInstance(); +} + +void mean_name_callback(const LLUUID &id, const std::string& first, const std::string& last, BOOL always_false) +{ + if (gNoRender) + { + return; + } + + static const U32 max_collision_list_size = 20; + if (gMeanCollisionList.size() > max_collision_list_size) + { + mean_collision_list_t::iterator iter = gMeanCollisionList.begin(); + for (U32 i=0; i<max_collision_list_size; i++) iter++; + for_each(iter, gMeanCollisionList.end(), DeletePointer()); + gMeanCollisionList.erase(iter, gMeanCollisionList.end()); + } + + for (mean_collision_list_t::iterator iter = gMeanCollisionList.begin(); + iter != gMeanCollisionList.end(); ++iter) + { + LLMeanCollisionData *mcd = *iter; + if (mcd->mPerp == id) + { + mcd->mFirstName = first; + mcd->mLastName = last; + } + } +} + +void process_mean_collision_alert_message(LLMessageSystem *msgsystem, void **user_data) +{ + if (gAgent.inPrelude()) + { + // In prelude, bumping is OK. This dialog is rather confusing to + // newbies, so we don't show it. Drop the packet on the floor. + return; + } + + // make sure the cursor is back to the usual default since the + // alert is probably due to some kind of error. + gViewerWindow->getWindow()->resetBusyCount(); + + LLUUID perp; + U32 time; + U8 u8type; + EMeanCollisionType type; + F32 mag; + + S32 i, num = msgsystem->getNumberOfBlocks(_PREHASH_MeanCollision); + + for (i = 0; i < num; i++) + { + msgsystem->getUUIDFast(_PREHASH_MeanCollision, _PREHASH_Perp, perp); + msgsystem->getU32Fast(_PREHASH_MeanCollision, _PREHASH_Time, time); + msgsystem->getF32Fast(_PREHASH_MeanCollision, _PREHASH_Mag, mag); + msgsystem->getU8Fast(_PREHASH_MeanCollision, _PREHASH_Type, u8type); + + type = (EMeanCollisionType)u8type; + + BOOL b_found = FALSE; + + for (mean_collision_list_t::iterator iter = gMeanCollisionList.begin(); + iter != gMeanCollisionList.end(); ++iter) + { + LLMeanCollisionData *mcd = *iter; + if ((mcd->mPerp == perp) && (mcd->mType == type)) + { + mcd->mTime = time; + mcd->mMag = mag; + b_found = TRUE; + break; + } + } + + if (!b_found) + { + LLMeanCollisionData *mcd = new LLMeanCollisionData(gAgentID, perp, time, type, mag); + gMeanCollisionList.push_front(mcd); + const BOOL is_group = FALSE; + gCacheName->get(perp, is_group, &mean_name_callback); + } + } +} + +void process_frozen_message(LLMessageSystem *msgsystem, void **user_data) +{ + // make sure the cursor is back to the usual default since the + // alert is probably due to some kind of error. + gViewerWindow->getWindow()->resetBusyCount(); + BOOL b_frozen; + + msgsystem->getBOOL("FrozenData", "Data", b_frozen); + + // TODO: make being frozen change view + if (b_frozen) + { + } + else + { + } +} + +// do some extra stuff once we get our economy data +void process_economy_data(LLMessageSystem *msg, void** /*user_data*/) +{ + LLGlobalEconomy::processEconomyData(msg, LLGlobalEconomy::Singleton::getInstance()); + + S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + + LL_INFOS_ONCE("Messaging") << "EconomyData message arrived; upload cost is L$" << upload_cost << LL_ENDL; + + gMenuHolder->childSetLabelArg("Upload Image", "[COST]", llformat("%d", upload_cost)); + gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", llformat("%d", upload_cost)); + gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", llformat("%d", upload_cost)); + gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", llformat("%d", upload_cost)); +} + +void notify_cautioned_script_question(const LLSD& notification, const LLSD& response, S32 orig_questions, BOOL granted) +{ + // only continue if at least some permissions were requested + if (orig_questions) + { + // check to see if the person we are asking + + // "'[OBJECTNAME]', an object owned by '[OWNERNAME]', + // located in [REGIONNAME] at [REGIONPOS], + // has been <granted|denied> permission to: [PERMISSIONS]." + + LLUIString notice(LLTrans::getString(granted ? "ScriptQuestionCautionChatGranted" : "ScriptQuestionCautionChatDenied")); + + // always include the object name and owner name + notice.setArg("[OBJECTNAME]", notification["payload"]["object_name"].asString()); + notice.setArg("[OWNERNAME]", notification["payload"]["owner_name"].asString()); + + // try to lookup viewerobject that corresponds to the object that + // requested permissions (here, taskid->requesting object id) + BOOL foundpos = FALSE; + LLViewerObject* viewobj = gObjectList.findObject(notification["payload"]["task_id"].asUUID()); + if (viewobj) + { + // found the viewerobject, get it's position in its region + LLVector3 objpos(viewobj->getPosition()); + + // try to lookup the name of the region the object is in + LLViewerRegion* viewregion = viewobj->getRegion(); + if (viewregion) + { + // got the region, so include the region and 3d coordinates of the object + notice.setArg("[REGIONNAME]", viewregion->getName()); + std::string formatpos = llformat("%.1f, %.1f,%.1f", objpos[VX], objpos[VY], objpos[VZ]); + notice.setArg("[REGIONPOS]", formatpos); + + foundpos = TRUE; + } + } + + if (!foundpos) + { + // unable to determine location of the object + notice.setArg("[REGIONNAME]", "(unknown region)"); + notice.setArg("[REGIONPOS]", "(unknown position)"); + } + + // check each permission that was requested, and list each + // permission that has been flagged as a caution permission + BOOL caution = FALSE; + S32 count = 0; + std::string perms; + for (S32 i = 0; i < SCRIPT_PERMISSION_EOF; i++) + { + if ((orig_questions & LSCRIPTRunTimePermissionBits[i]) && SCRIPT_QUESTION_IS_CAUTION[i]) + { + count++; + caution = TRUE; + + // add a comma before the permission description if it is not the first permission + // added to the list or the last permission to check + if ((count > 1) && (i < SCRIPT_PERMISSION_EOF)) + { + perms.append(", "); + } + + perms.append(LLTrans::getString(SCRIPT_QUESTIONS[i])); + } + } + + notice.setArg("[PERMISSIONS]", perms); + + // log a chat message as long as at least one requested permission + // is a caution permission + if (caution) + { + LLChat chat(notice.getString()); + LLFloaterChat::addChat(chat, FALSE, FALSE); + } + } +} + +bool script_question_cb(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + LLMessageSystem *msg = gMessageSystem; + S32 orig = notification["payload"]["questions"].asInteger(); + S32 new_questions = orig; + + // check whether permissions were granted or denied + BOOL allowed = TRUE; + // the "yes/accept" button is the first button in the template, making it button 0 + // if any other button was clicked, the permissions were denied + if (option != 0) + { + new_questions = 0; + allowed = FALSE; + } + + LLUUID task_id = notification["payload"]["task_id"].asUUID(); + LLUUID item_id = notification["payload"]["item_id"].asUUID(); + + // reply with the permissions granted or denied + msg->newMessageFast(_PREHASH_ScriptAnswerYes); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_Data); + msg->addUUIDFast(_PREHASH_TaskID, task_id); + msg->addUUIDFast(_PREHASH_ItemID, item_id); + msg->addS32Fast(_PREHASH_Questions, new_questions); + msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); + + // only log a chat message if caution prompts are enabled + if (gSavedSettings.getBOOL("PermissionsCautionEnabled")) + { + // log a chat message, if appropriate + notify_cautioned_script_question(notification, response, orig, allowed); + } + + if ( response["Mute"] ) // mute + { + LLMuteList::getInstance()->add(LLMute(item_id, notification["payload"]["object_name"].asString(), LLMute::OBJECT)); + + // purge the message queue of any previously queued requests from the same source. DEV-4879 + class OfferMatcher : public LLNotifyBoxView::Matcher + { + public: + OfferMatcher(const LLUUID& to_block) : blocked_id(to_block) {} + BOOL matches(const LLNotificationPtr notification) const + { + if (notification->getName() == "ScriptQuestionCaution" + || notification->getName() == "ScriptQuestion") + { + return (notification->getPayload()["item_id"].asUUID() == blocked_id); + } + return FALSE; + } + private: + const LLUUID& blocked_id; + }; + // should do this via the channel + gNotifyBoxView->purgeMessagesMatching(OfferMatcher(item_id)); + } + + if (response["Details"]) + { + // respawn notification... + LLNotifications::instance().add(notification["name"], notification["substitutions"], notification["payload"]); + + // ...with description on top + LLNotifications::instance().add("DebitPermissionDetails"); + } + return false; +} +static LLNotificationFunctorRegistration script_question_cb_reg_1("ScriptQuestion", script_question_cb); +static LLNotificationFunctorRegistration script_question_cb_reg_2("ScriptQuestionCaution", script_question_cb); + +void process_script_question(LLMessageSystem *msg, void **user_data) +{ + // *TODO: Translate owner name -> [FIRST] [LAST] + + LLHost sender = msg->getSender(); + + LLUUID taskid; + LLUUID itemid; + S32 questions; + std::string object_name; + std::string owner_name; + + // taskid -> object key of object requesting permissions + msg->getUUIDFast(_PREHASH_Data, _PREHASH_TaskID, taskid ); + // itemid -> script asset key of script requesting permissions + msg->getUUIDFast(_PREHASH_Data, _PREHASH_ItemID, itemid ); + msg->getStringFast(_PREHASH_Data, _PREHASH_ObjectName, object_name); + msg->getStringFast(_PREHASH_Data, _PREHASH_ObjectOwner, owner_name); + msg->getS32Fast(_PREHASH_Data, _PREHASH_Questions, questions ); + + // Special case. If the objects are owned by this agent, throttle per-object instead + // of per-owner. It's common for residents to reset a ton of scripts that re-request + // permissions, as with tier boxes. UUIDs can't be valid agent names and vice-versa, + // so we'll reuse the same namespace for both throttle types. + std::string throttle_name = owner_name; + std::string self_name; + LLAgentUI::buildName( self_name ); + if( owner_name == self_name ) + { + throttle_name = taskid.getString(); + } + + // don't display permission requests if this object is muted + if (LLMuteList::getInstance()->isMuted(taskid)) return; + + // throttle excessive requests from any specific user's scripts + typedef LLKeyThrottle<std::string> LLStringThrottle; + static LLStringThrottle question_throttle( LLREQUEST_PERMISSION_THROTTLE_LIMIT, LLREQUEST_PERMISSION_THROTTLE_INTERVAL ); + + switch (question_throttle.noteAction(throttle_name)) + { + case LLStringThrottle::THROTTLE_NEWLY_BLOCKED: + LL_INFOS("Messaging") << "process_script_question throttled" + << " owner_name:" << owner_name + << LL_ENDL; + // Fall through + + case LLStringThrottle::THROTTLE_BLOCKED: + // Escape altogether until we recover + return; + + case LLStringThrottle::THROTTLE_OK: + break; + } + + std::string script_question; + if (questions) + { + BOOL caution = FALSE; + S32 count = 0; + LLSD args; + args["OBJECTNAME"] = object_name; + args["NAME"] = owner_name; + + // check the received permission flags against each permission + for (S32 i = 0; i < SCRIPT_PERMISSION_EOF; i++) + { + if (questions & LSCRIPTRunTimePermissionBits[i]) + { + count++; + script_question += " " + LLTrans::getString(SCRIPT_QUESTIONS[i]) + "\n"; + + // check whether permission question should cause special caution dialog + caution |= (SCRIPT_QUESTION_IS_CAUTION[i]); + } + } + args["QUESTIONS"] = script_question; + + LLSD payload; + payload["task_id"] = taskid; + payload["item_id"] = itemid; + payload["sender"] = sender.getIPandPort(); + payload["questions"] = questions; + payload["object_name"] = object_name; + payload["owner_name"] = owner_name; + + // check whether cautions are even enabled or not + if (gSavedSettings.getBOOL("PermissionsCautionEnabled")) + { + // display the caution permissions prompt + LLNotifications::instance().add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload); + } + else + { + // fall back to default behavior if cautions are entirely disabled + LLNotifications::instance().add("ScriptQuestion", args, payload); + } + + } +} + + +void process_derez_container(LLMessageSystem *msg, void**) +{ + LL_WARNS("Messaging") << "call to deprecated process_derez_container" << LL_ENDL; +} + +void container_inventory_arrived(LLViewerObject* object, + InventoryObjectList* inventory, + S32 serial_num, + void* data) +{ + LL_DEBUGS("Messaging") << "container_inventory_arrived()" << LL_ENDL; + if( gAgent.cameraMouselook() ) + { + gAgent.changeCameraToDefault(); + } + + LLFloaterInventory* view = LLFloaterInventory::getActiveInventory(); + + if (inventory->size() > 2) + { + // create a new inventory category to put this in + LLUUID cat_id; + cat_id = gInventory.createNewCategory(gInventory.getRootFolderID(), + LLAssetType::AT_NONE, + LLTrans::getString("AcquiredItems")); + + InventoryObjectList::const_iterator it = inventory->begin(); + InventoryObjectList::const_iterator end = inventory->end(); + for ( ; it != end; ++it) + { + if ((*it)->getType() != LLAssetType::AT_CATEGORY && + (*it)->getType() != LLAssetType::AT_ROOT_CATEGORY) + { + LLInventoryObject* obj = (LLInventoryObject*)(*it); + LLInventoryItem* item = (LLInventoryItem*)(obj); + LLUUID item_id; + item_id.generate(); + time_t creation_date_utc = time_corrected(); + LLPointer<LLViewerInventoryItem> new_item + = new LLViewerInventoryItem(item_id, + cat_id, + item->getPermissions(), + item->getAssetUUID(), + item->getType(), + item->getInventoryType(), + item->getName(), + item->getDescription(), + LLSaleInfo::DEFAULT, + item->getFlags(), + creation_date_utc); + new_item->updateServer(TRUE); + gInventory.updateItem(new_item); + } + } + gInventory.notifyObservers(); + if(view) + { + view->getPanel()->setSelection(cat_id, TAKE_FOCUS_NO); + } + } + else if (inventory->size() == 2) + { + // we're going to get one fake root category as well as the + // one actual object + InventoryObjectList::iterator it = inventory->begin(); + + if ((*it)->getType() == LLAssetType::AT_CATEGORY || + (*it)->getType() == LLAssetType::AT_ROOT_CATEGORY) + { + ++it; + } + + LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it)); + LLUUID category = gInventory.findCategoryUUIDForType(item->getType()); + + LLUUID item_id; + item_id.generate(); + time_t creation_date_utc = time_corrected(); + LLPointer<LLViewerInventoryItem> new_item + = new LLViewerInventoryItem(item_id, category, + item->getPermissions(), + item->getAssetUUID(), + item->getType(), + item->getInventoryType(), + item->getName(), + item->getDescription(), + LLSaleInfo::DEFAULT, + item->getFlags(), + creation_date_utc); + new_item->updateServer(TRUE); + gInventory.updateItem(new_item); + gInventory.notifyObservers(); + if(view) + { + view->getPanel()->setSelection(item_id, TAKE_FOCUS_NO); + } + } + + // we've got the inventory, now delete this object if this was a take + BOOL delete_object = (BOOL)(intptr_t)data; + LLViewerRegion *region = gAgent.getRegion(); + if (delete_object && region) + { + gMessageSystem->newMessageFast(_PREHASH_ObjectDelete); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + const U8 NO_FORCE = 0; + gMessageSystem->addU8Fast(_PREHASH_Force, NO_FORCE); + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID()); + gMessageSystem->sendReliable(region->getHost()); + } +} + +// method to format the time. +std::string formatted_time(const time_t& the_time) +{ + std::string dateStr = "["+LLTrans::getString("LTimeWeek")+"] [" + +LLTrans::getString("LTimeMonth")+"] [" + +LLTrans::getString("LTimeDay")+"] [" + +LLTrans::getString("LTimeHour")+"]:[" + +LLTrans::getString("LTimeMin")+"]:[" + +LLTrans::getString("LTimeSec")+"] [" + +LLTrans::getString("LTimeYear")+"]"; + + LLSD substitution; + substitution["datetime"] = (S32) the_time; + LLStringUtil::format (dateStr, substitution); + return dateStr; +} + + +void process_teleport_failed(LLMessageSystem *msg, void**) +{ + std::string reason; + std::string big_reason; + LLSD args; + + // if we have additional alert data + if (msg->has(_PREHASH_AlertInfo) && msg->getSizeFast(_PREHASH_AlertInfo, _PREHASH_Message) > 0) + { + // Get the message ID + msg->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, reason); + big_reason = LLAgent::sTeleportErrorMessages[reason]; + if ( big_reason.size() > 0 ) + { // Substitute verbose reason from the local map + args["REASON"] = big_reason; + } + else + { // Nothing found in the map - use what the server returned in the original message block + msg->getStringFast(_PREHASH_Info, _PREHASH_Reason, reason); + args["REASON"] = reason; + } + + LLSD llsd_block; + std::string llsd_raw; + msg->getStringFast(_PREHASH_AlertInfo, _PREHASH_ExtraParams, llsd_raw); + if (llsd_raw.length()) + { + std::istringstream llsd_data(llsd_raw); + if (!LLSDSerialize::deserialize(llsd_block, llsd_data, llsd_raw.length())) + { + llwarns << "process_teleport_failed: Attempted to read alert parameter data into LLSD but failed:" << llsd_raw << llendl; + } + else + { + // change notification name in this special case + if (handle_special_notification("RegionEntryAccessBlocked", llsd_block)) + { + if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE ) + { + gAgent.setTeleportState( LLAgent::TELEPORT_NONE ); + } + return; + } + } + } + + } + else + { + msg->getStringFast(_PREHASH_Info, _PREHASH_Reason, reason); + + big_reason = LLAgent::sTeleportErrorMessages[reason]; + if ( big_reason.size() > 0 ) + { // Substitute verbose reason from the local map + args["REASON"] = big_reason; + } + else + { // Nothing found in the map - use what the server returned + args["REASON"] = reason; + } + } + + LLNotifications::instance().add("CouldNotTeleportReason", args); + + // Let the interested parties know that teleport failed. + LLViewerParcelMgr::getInstance()->onTeleportFailed(); + + if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE ) + { + gAgent.setTeleportState( LLAgent::TELEPORT_NONE ); + } +} + +void process_teleport_local(LLMessageSystem *msg,void**) +{ + LLUUID agent_id; + msg->getUUIDFast(_PREHASH_Info, _PREHASH_AgentID, agent_id); + if (agent_id != gAgent.getID()) + { + LL_WARNS("Messaging") << "Got teleport notification for wrong agent!" << LL_ENDL; + return; + } + + U32 location_id; + LLVector3 pos, look_at; + U32 teleport_flags; + msg->getU32Fast(_PREHASH_Info, _PREHASH_LocationID, location_id); + msg->getVector3Fast(_PREHASH_Info, _PREHASH_Position, pos); + msg->getVector3Fast(_PREHASH_Info, _PREHASH_LookAt, look_at); + msg->getU32Fast(_PREHASH_Info, _PREHASH_TeleportFlags, teleport_flags); + + if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE ) + { + gAgent.setTeleportState( LLAgent::TELEPORT_NONE ); + } + + // Sim tells us whether the new position is off the ground + if (teleport_flags & TELEPORT_FLAGS_IS_FLYING) + { + gAgent.setFlying(TRUE); + } + else + { + gAgent.setFlying(FALSE); + } + + gAgent.setPositionAgent(pos); + gAgent.slamLookAt(look_at); + + // likewise make sure the camera is behind the avatar + gAgent.resetView(TRUE, TRUE); + + // send camera update to new region + gAgent.updateCamera(); + + send_agent_update(TRUE, TRUE); + + // Let the interested parties know we've teleported. + // Vadim *HACK: Agent position seems to get reset (to render position?) + // on each frame, so we have to pass the new position manually. + LLViewerParcelMgr::getInstance()->onTeleportFinished(true, gAgent.getPosGlobalFromAgent(pos)); +} + +void send_simple_im(const LLUUID& to_id, + const std::string& message, + EInstantMessage dialog, + const LLUUID& id) +{ + std::string my_name; + LLAgentUI::buildFullname(my_name); + send_improved_im(to_id, + my_name, + message, + IM_ONLINE, + dialog, + id, + NO_TIMESTAMP, + (U8*)EMPTY_BINARY_BUCKET, + EMPTY_BINARY_BUCKET_SIZE); +} + +void send_group_notice(const LLUUID& group_id, + const std::string& subject, + const std::string& message, + const LLInventoryItem* item) +{ + // Put this notice into an instant message form. + // This will mean converting the item to a binary bucket, + // and the subject/message into a single field. + std::string my_name; + LLAgentUI::buildFullname(my_name); + + // Combine subject + message into a single string. + std::ostringstream subject_and_message; + // TODO: turn all existing |'s into ||'s in subject and message. + subject_and_message << subject << "|" << message; + + // Create an empty binary bucket. + U8 bin_bucket[MAX_INVENTORY_BUFFER_SIZE]; + U8* bucket_to_send = bin_bucket; + bin_bucket[0] = '\0'; + S32 bin_bucket_size = EMPTY_BINARY_BUCKET_SIZE; + // If there is an item being sent, pack it into the binary bucket. + if (item) + { + LLSD item_def; + item_def["item_id"] = item->getUUID(); + item_def["owner_id"] = item->getPermissions().getOwner(); + std::ostringstream ostr; + LLSDSerialize::serialize(item_def, ostr, LLSDSerialize::LLSD_XML); + bin_bucket_size = ostr.str().copy( + (char*)bin_bucket, ostr.str().size()); + bin_bucket[bin_bucket_size] = '\0'; + } + else + { + bucket_to_send = (U8*) EMPTY_BINARY_BUCKET; + } + + + send_improved_im( + group_id, + my_name, + subject_and_message.str(), + IM_ONLINE, + IM_GROUP_NOTICE, + LLUUID::null, + NO_TIMESTAMP, + bucket_to_send, + bin_bucket_size); +} + +bool handle_lure_callback(const LLSD& notification, const LLSD& response) +{ + std::string text = response["message"].asString(); + S32 option = LLNotification::getSelectedOption(notification, response); + + if(0 == option) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_StartLure); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_Info); + msg->addU8Fast(_PREHASH_LureType, (U8)0); // sim will fill this in. + msg->addStringFast(_PREHASH_Message, text); + for(LLSD::array_const_iterator it = notification["payload"]["ids"].beginArray(); + it != notification["payload"]["ids"].endArray(); + ++it) + { + msg->nextBlockFast(_PREHASH_TargetData); + msg->addUUIDFast(_PREHASH_TargetID, it->asUUID()); + } + gAgent.sendReliableMessage(); + } + + return false; +} + +void handle_lure(const LLUUID& invitee) +{ + LLDynamicArray<LLUUID> ids; + ids.push_back(invitee); + handle_lure(ids); +} + +// Prompt for a message to the invited user. +void handle_lure(const std::vector<LLUUID>& ids) +{ + LLSD edit_args; + edit_args["REGION"] = gAgent.getRegion()->getName(); + + LLSD payload; + for (LLDynamicArray<LLUUID>::const_iterator it = ids.begin(); + it != ids.end(); + ++it) + { + payload["ids"].append(*it); + } + if (gAgent.isGodlike()) + { + LLNotifications::instance().add("OfferTeleportFromGod", edit_args, payload, handle_lure_callback); + } + else + { + LLNotifications::instance().add("OfferTeleport", edit_args, payload, handle_lure_callback); + } +} + + +void send_improved_im(const LLUUID& to_id, + const std::string& name, + const std::string& message, + U8 offline, + EInstantMessage dialog, + const LLUUID& id, + U32 timestamp, + const U8* binary_bucket, + S32 binary_bucket_size) +{ + pack_instant_message( + gMessageSystem, + gAgent.getID(), + FALSE, + gAgent.getSessionID(), + to_id, + name, + message, + offline, + dialog, + id, + 0, + LLUUID::null, + gAgent.getPositionAgent(), + timestamp, + binary_bucket, + binary_bucket_size); + gAgent.sendReliableMessage(); +} + + +void send_places_query(const LLUUID& query_id, + const LLUUID& trans_id, + const std::string& query_text, + U32 query_flags, + S32 category, + const std::string& sim_name) +{ + LLMessageSystem* msg = gMessageSystem; + + msg->newMessage("PlacesQuery"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->addUUID("QueryID", query_id); + msg->nextBlock("TransactionData"); + msg->addUUID("TransactionID", trans_id); + msg->nextBlock("QueryData"); + msg->addString("QueryText", query_text); + msg->addU32("QueryFlags", query_flags); + msg->addS8("Category", (S8)category); + msg->addString("SimName", sim_name); + gAgent.sendReliableMessage(); +} + + +void process_user_info_reply(LLMessageSystem* msg, void**) +{ + LLUUID agent_id; + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); + if(agent_id != gAgent.getID()) + { + LL_WARNS("Messaging") << "process_user_info_reply - " + << "wrong agent id." << LL_ENDL; + } + + BOOL im_via_email; + msg->getBOOLFast(_PREHASH_UserData, _PREHASH_IMViaEMail, im_via_email); + std::string email; + msg->getStringFast(_PREHASH_UserData, _PREHASH_EMail, email); + std::string dir_visibility; + msg->getString( "UserData", "DirectoryVisibility", dir_visibility); + + LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email, email); + LLFloaterPostcard::updateUserInfo(email); +} + + +//--------------------------------------------------------------------------- +// Script Dialog +//--------------------------------------------------------------------------- + +const S32 SCRIPT_DIALOG_MAX_BUTTONS = 12; +const S32 SCRIPT_DIALOG_BUTTON_STR_SIZE = 24; +const S32 SCRIPT_DIALOG_MAX_MESSAGE_SIZE = 512; +const char* SCRIPT_DIALOG_HEADER = "Script Dialog:\n"; + +bool callback_script_dialog(const LLSD& notification, const LLSD& response) +{ + LLNotificationForm form(notification["form"]); + std::string button = LLNotification::getSelectedOptionName(response); + S32 button_idx = LLNotification::getSelectedOption(notification, response); + // Didn't click "Ignore" + if (button_idx != -1) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("ScriptDialogReply"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->nextBlock("Data"); + msg->addUUID("ObjectID", notification["payload"]["object_id"].asUUID()); + msg->addS32("ChatChannel", notification["payload"]["chat_channel"].asInteger()); + msg->addS32("ButtonIndex", button_idx); + msg->addString("ButtonLabel", button); + msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); + } + + return false; +} +static LLNotificationFunctorRegistration callback_script_dialog_reg_1("ScriptDialog", callback_script_dialog); +static LLNotificationFunctorRegistration callback_script_dialog_reg_2("ScriptDialogGroup", callback_script_dialog); + +void process_script_dialog(LLMessageSystem* msg, void**) +{ + S32 i; + LLSD payload; + + LLUUID object_id; + msg->getUUID("Data", "ObjectID", object_id); + + if (LLMuteList::getInstance()->isMuted(object_id)) + { + return; + } + + std::string message; + std::string first_name; + std::string last_name; + std::string title; + + S32 chat_channel; + msg->getString("Data", "FirstName", first_name); + msg->getString("Data", "LastName", last_name); + msg->getString("Data", "ObjectName", title); + msg->getString("Data", "Message", message); + msg->getS32("Data", "ChatChannel", chat_channel); + + // unused for now + LLUUID image_id; + msg->getUUID("Data", "ImageID", image_id); + + payload["sender"] = msg->getSender().getIPandPort(); + payload["object_id"] = object_id; + payload["chat_channel"] = chat_channel; + + // build up custom form + S32 button_count = msg->getNumberOfBlocks("Buttons"); + if (button_count > SCRIPT_DIALOG_MAX_BUTTONS) + { + llwarns << "Too many script dialog buttons - omitting some" << llendl; + button_count = SCRIPT_DIALOG_MAX_BUTTONS; + } + + LLNotificationForm form; + for (i = 0; i < button_count; i++) + { + std::string tdesc; + msg->getString("Buttons", "ButtonLabel", tdesc, i); + form.addElement("button", std::string(tdesc)); + } + + LLSD args; + args["TITLE"] = title; + args["MESSAGE"] = message; + LLNotificationPtr notification; + if (!first_name.empty()) + { + args["FIRST"] = first_name; + args["LAST"] = last_name; + notification = LLNotifications::instance().add( + LLNotification::Params("ScriptDialog").substitutions(args).payload(payload).form_elements(form.asLLSD())); + } + else + { + args["GROUPNAME"] = last_name; + notification = LLNotifications::instance().add( + LLNotification::Params("ScriptDialogGroup").substitutions(args).payload(payload).form_elements(form.asLLSD())); + } +} + +//--------------------------------------------------------------------------- + + +std::vector<LLSD> gLoadUrlList; + +bool callback_load_url(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + + if (0 == option) + { + LLWeb::loadURL(notification["payload"]["url"].asString()); + } + + return false; +} +static LLNotificationFunctorRegistration callback_load_url_reg("LoadWebPage", callback_load_url); + + +// We've got the name of the person who owns the object hurling the url. +// Display confirmation dialog. +void callback_load_url_name(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) +{ + std::vector<LLSD>::iterator it; + for (it = gLoadUrlList.begin(); it != gLoadUrlList.end(); ) + { + LLSD load_url_info = *it; + if (load_url_info["owner_id"].asUUID() == id) + { + it = gLoadUrlList.erase(it); + + std::string owner_name; + if (is_group) + { + owner_name = first + LLTrans::getString("Group"); + } + else + { + owner_name = first + " " + last; + } + + // For legacy name-only mutes. + if (LLMuteList::getInstance()->isMuted(LLUUID::null, owner_name)) + { + continue; + } + LLSD args; + args["URL"] = load_url_info["url"].asString(); + args["MESSAGE"] = load_url_info["message"].asString();; + args["OBJECTNAME"] = load_url_info["object_name"].asString(); + args["NAME"] = owner_name; + + LLNotifications::instance().add("LoadWebPage", args, load_url_info); + } + else + { + ++it; + } + } +} + +void process_load_url(LLMessageSystem* msg, void**) +{ + LLUUID object_id; + LLUUID owner_id; + BOOL owner_is_group; + char object_name[256]; /* Flawfinder: ignore */ + char message[256]; /* Flawfinder: ignore */ + char url[256]; /* Flawfinder: ignore */ + + msg->getString("Data", "ObjectName", 256, object_name); + msg->getUUID( "Data", "ObjectID", object_id); + msg->getUUID( "Data", "OwnerID", owner_id); + msg->getBOOL( "Data", "OwnerIsGroup", owner_is_group); + msg->getString("Data", "Message", 256, message); + msg->getString("Data", "URL", 256, url); + + LLSD payload; + payload["object_id"] = object_id; + payload["owner_id"] = owner_id; + payload["owner_is_group"] = owner_is_group; + payload["object_name"] = object_name; + payload["message"] = message; + payload["url"] = url; + + // URL is safety checked in load_url above + + // Check if object or owner is muted + if (LLMuteList::getInstance()->isMuted(object_id, object_name) || + LLMuteList::getInstance()->isMuted(owner_id)) + { + LL_INFOS("Messaging")<<"Ignoring load_url from muted object/owner."<<LL_ENDL; + return; + } + + // Add to list of pending name lookups + gLoadUrlList.push_back(payload); + + gCacheName->get(owner_id, owner_is_group, &callback_load_url_name); +} + + +void callback_download_complete(void** data, S32 result, LLExtStat ext_status) +{ + std::string* filepath = (std::string*)data; + LLSD args; + args["DOWNLOAD_PATH"] = *filepath; + LLNotifications::instance().add("FinishedRawDownload", args); + delete filepath; +} + + +void process_initiate_download(LLMessageSystem* msg, void**) +{ + LLUUID agent_id; + msg->getUUID("AgentData", "AgentID", agent_id); + if (agent_id != gAgent.getID()) + { + LL_WARNS("Messaging") << "Initiate download for wrong agent" << LL_ENDL; + return; + } + + std::string sim_filename; + std::string viewer_filename; + msg->getString("FileData", "SimFilename", sim_filename); + msg->getString("FileData", "ViewerFilename", viewer_filename); + + if (!gXferManager->validateFileForRequest(viewer_filename)) + { + llwarns << "SECURITY: Unauthorized download to local file " << viewer_filename << llendl; + return; + } + gXferManager->requestFile(viewer_filename, + sim_filename, + LL_PATH_NONE, + msg->getSender(), + FALSE, // don't delete remote + callback_download_complete, + (void**)new std::string(viewer_filename)); +} + + +void process_script_teleport_request(LLMessageSystem* msg, void**) +{ + std::string object_name; + std::string sim_name; + LLVector3 pos; + LLVector3 look_at; + + msg->getString("Data", "ObjectName", object_name); + msg->getString("Data", "SimName", sim_name); + msg->getVector3("Data", "SimPosition", pos); + msg->getVector3("Data", "LookAt", look_at); + + LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance(); + if(instance) + { + instance->trackURL( + sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]); + LLFloaterReg::showInstance("world_map", "center"); + } + + // remove above two lines and replace with below line + // to re-enable parcel browser for llMapDestination() + // LLURLDispatcher::dispatch(LLSLURL::buildSLURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]), FALSE); + +} + +void process_covenant_reply(LLMessageSystem* msg, void**) +{ + LLUUID covenant_id, estate_owner_id; + std::string estate_name; + U32 covenant_timestamp; + msg->getUUID("Data", "CovenantID", covenant_id); + msg->getU32("Data", "CovenantTimestamp", covenant_timestamp); + msg->getString("Data", "EstateName", estate_name); + msg->getUUID("Data", "EstateOwnerID", estate_owner_id); + + LLPanelEstateCovenant::updateEstateName(estate_name); + LLPanelLandCovenant::updateEstateName(estate_name); + LLFloaterBuyLand::updateEstateName(estate_name); + + std::string owner_name = + LLSLURL::buildCommand("agent", estate_owner_id, "inspect"); + LLPanelEstateCovenant::updateEstateOwnerName(owner_name); + LLPanelLandCovenant::updateEstateOwnerName(owner_name); + LLFloaterBuyLand::updateEstateOwnerName(owner_name); + + LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info"); + if (panel) + { + panel->updateEstateName(estate_name); + panel->updateEstateOwnerName(owner_name); + } + + // standard message, not from system + std::string last_modified; + if (covenant_timestamp == 0) + { + last_modified = LLTrans::getString("covenant_last_modified")+LLTrans::getString("never_text"); + } + else + { + last_modified = LLTrans::getString("covenant_last_modified")+"[" + +LLTrans::getString("LTimeWeek")+"] [" + +LLTrans::getString("LTimeMonth")+"] [" + +LLTrans::getString("LTimeDay")+"] [" + +LLTrans::getString("LTimeHour")+"]:[" + +LLTrans::getString("LTimeMin")+"]:[" + +LLTrans::getString("LTimeSec")+"] [" + +LLTrans::getString("LTimeYear")+"]"; + LLSD substitution; + substitution["datetime"] = (S32) covenant_timestamp; + LLStringUtil::format (last_modified, substitution); + } + + LLPanelEstateCovenant::updateLastModified(last_modified); + LLPanelLandCovenant::updateLastModified(last_modified); + LLFloaterBuyLand::updateLastModified(last_modified); + + // load the actual covenant asset data + const BOOL high_priority = TRUE; + if (covenant_id.notNull()) + { + gAssetStorage->getEstateAsset(gAgent.getRegionHost(), + gAgent.getID(), + gAgent.getSessionID(), + covenant_id, + LLAssetType::AT_NOTECARD, + ET_Covenant, + onCovenantLoadComplete, + NULL, + high_priority); + } + else + { + std::string covenant_text; + if (estate_owner_id.isNull()) + { + // mainland + covenant_text = LLTrans::getString("RegionNoCovenant"); + } + else + { + covenant_text = LLTrans::getString("RegionNoCovenantOtherOwner"); + } + LLPanelEstateCovenant::updateCovenantText(covenant_text, covenant_id); + LLPanelLandCovenant::updateCovenantText(covenant_text); + LLFloaterBuyLand::updateCovenantText(covenant_text, covenant_id); + if (panel) + { + panel->updateCovenantText(covenant_text); + } + } +} + +void onCovenantLoadComplete(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status) +{ + LL_DEBUGS("Messaging") << "onCovenantLoadComplete()" << LL_ENDL; + std::string covenant_text; + if(0 == status) + { + LLVFile file(vfs, asset_uuid, type, LLVFile::READ); + + S32 file_length = file.getSize(); + + std::vector<char> buffer(file_length+1); + file.read((U8*)&buffer[0], file_length); + // put a EOS at the end + buffer[file_length] = '\0'; + + if( (file_length > 19) && !strncmp( &buffer[0], "Linden text version", 19 ) ) + { + LLViewerTextEditor::Params params; + params.name("temp"); + params.max_text_length(file_length+1); + LLViewerTextEditor * editor = LLUICtrlFactory::create<LLViewerTextEditor> (params); + if( !editor->importBuffer( &buffer[0], file_length+1 ) ) + { + LL_WARNS("Messaging") << "Problem importing estate covenant." << LL_ENDL; + covenant_text = "Problem importing estate covenant."; + } + else + { + // Version 0 (just text, doesn't include version number) + covenant_text = editor->getText(); + } + delete editor; + } + else + { + LL_WARNS("Messaging") << "Problem importing estate covenant: Covenant file format error." << LL_ENDL; + covenant_text = "Problem importing estate covenant: Covenant file format error."; + } + } + else + { + LLViewerStats::getInstance()->incStat( LLViewerStats::ST_DOWNLOAD_FAILED ); + + if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status || + LL_ERR_FILE_EMPTY == status) + { + covenant_text = "Estate covenant notecard is missing from database."; + } + else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status) + { + covenant_text = "Insufficient permissions to view estate covenant."; + } + else + { + covenant_text = "Unable to load estate covenant at this time."; + } + + LL_WARNS("Messaging") << "Problem loading notecard: " << status << LL_ENDL; + } + LLPanelEstateCovenant::updateCovenantText(covenant_text, asset_uuid); + LLPanelLandCovenant::updateCovenantText(covenant_text); + LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid); + + LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info"); + if (panel) + { + panel->updateCovenantText(covenant_text); + } +} + + +void process_feature_disabled_message(LLMessageSystem* msg, void**) +{ + // Handle Blacklisted feature simulator response... + LLUUID agentID; + LLUUID transactionID; + std::string messageText; + msg->getStringFast(_PREHASH_FailureInfo,_PREHASH_ErrorMessage, messageText,0); + msg->getUUIDFast(_PREHASH_FailureInfo,_PREHASH_AgentID,agentID); + msg->getUUIDFast(_PREHASH_FailureInfo,_PREHASH_TransactionID,transactionID); + + LL_WARNS("Messaging") << "Blacklisted Feature Response:" << messageText << LL_ENDL; +} + +// ------------------------------------------------------------ +// Message system exception callbacks +// ------------------------------------------------------------ + +void invalid_message_callback(LLMessageSystem* msg, + void*, + EMessageException exception) +{ + LLAppViewer::instance()->badNetworkHandler(); +} + +// Please do not add more message handlers here. This file is huge. +// Put them in a file related to the functionality you are implementing. + +void LLOfferInfo::forceResponse(InventoryOfferResponse response) +{ + LLNotification::Params params("UserGiveItem"); + params.functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, this, _1, _2)); + LLNotifications::instance().forceResponse(params, response); +} diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index d3366cdcaa5..7f9d09a7d65 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -7,7 +7,7 @@ <texture name="Accordion_Off" file_name="containers/Accordion_Off.png" preload="false" /> <texture name="Accordion_Press" file_name="containers/Accordion_Press.png" preload="false" /> - <texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" /> +<texture name="Activate_Checkmark" file_name="taskpanel/Activate_Checkmark.png" preload="false" /> <texture name="AddItem_Disabled" file_name="icons/AddItem_Disabled.png" preload="false" /> <texture name="AddItem_Off" file_name="icons/AddItem_Off.png" preload="false" /> @@ -394,6 +394,10 @@ <texture name="TabIcon_Home_Off" file_name="taskpanel/TabIcon_Home_Off.png" preload="false" /> <texture name="TabIcon_Home_Over" file_name="taskpanel/TabIcon_Home_Over.png" preload="false" /> <texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" /> + <texture name="TabIcon_Inventory_Large" file_name="taskpanel/TabIcon_Inventory_Large.png" preload="false" /> + <texture name="TabIcon_Inventory_Off" file_name="taskpanel/TabIcon_Inventory_Off.png" preload="false" /> + <texture name="TabIcon_Inventory_Over" file_name="taskpanel/TabIcon_Inventory_Over.png" preload="false" /> + <texture name="TabIcon_Inventory_Selected" file_name="taskpanel/TabIcon_Inventory_Selected.png" preload="false" /> <texture name="TabIcon_Me_Large" file_name="taskpanel/TabIcon_Me_Large.png" preload="false" /> <texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" /> <texture name="TabIcon_Me_Over" file_name="taskpanel/TabIcon_Me_Over.png" preload="false" /> diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml index 0f06558dd1f..ace296b4392 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory.xml @@ -13,419 +13,24 @@ single_instance="true" title="Inventory" width="467"> - <floater.string - name="Title"> - Inventory - </floater.string> <floater.string name="TitleFetching"> - Inventory (Fetching [ITEM_COUNT] Items...) [FILTER] + Things (Fetching [ITEM_COUNT] Items...) [FILTER] </floater.string> <floater.string name="TitleCompleted"> - Inventory ([ITEM_COUNT] Items) [FILTER] - </floater.string> - <floater.string - name="Fetched"> - Fetched + Things ([ITEM_COUNT] Items) [FILTER] </floater.string> - <filter_editor - search_button_visible="false" - text_pad_left="12" - follows="left|top|right" - height="16" - label="Type here to search" - layout="topleft" - left="6" - name="inventory search editor" - top="34" - width="455" /> - <tab_container - follows="left|top|right|bottom" - height="508" - layout="topleft" - left_delta="-4" - name="inventory filter tabs" - tab_position="top" - top_pad="4" - width="463"> - <inventory_panel - follows="left|top|right|bottom" - height="491" - label="All Items" - layout="topleft" - left="1" - name="All Items" - top="16" - width="461" /> - <inventory_panel - follows="left|top|right|bottom" - height="491" - label="Recent Items" - layout="topleft" - left_delta="0" - name="Recent Items" - top_delta="0" - width="461" /> - </tab_container> - <menu_bar - bg_visible="false" - follows="left|top|right" - height="18" - layout="topleft" - left_delta="0" - mouse_opaque="false" - name="Inventory Menu" - top_delta="-38" - width="461"> - <menu - height="101" - label="File" - layout="topleft" - left="0" - mouse_opaque="false" - name="File" - tear_off="true" - top="-117" - width="128"> - <menu_item_call - label="Open" - layout="topleft" - name="Open"> - <menu_item_call.on_click - function="Inventory.DoToSelected" - parameter="open" /> - </menu_item_call> - <menu - create_jump_keys="true" - label="Upload" - layout="topleft" - name="upload" - tear_off="true"> - <menu_item_call - label="Image (L$[COST])..." - layout="topleft" - name="Upload Image" - shortcut="control|U"> - <menu_item_call.on_click - function="File.UploadImage" - parameter="" /> - <menu_item_call.on_enable - function="File.EnableUpload" /> - </menu_item_call> - <menu_item_call - label="Sound (L$[COST])..." - layout="topleft" - name="Upload Sound"> - <menu_item_call.on_click - function="File.UploadSound" - parameter="" /> - <menu_item_call.on_enable - function="File.EnableUpload" /> - </menu_item_call> - <menu_item_call - label="Animation (L$[COST])..." - layout="topleft" - name="Upload Animation"> - <menu_item_call.on_click - function="File.UploadAnim" - parameter="" /> - <menu_item_call.on_enable - function="File.EnableUpload" /> - </menu_item_call> - <menu_item_call - label="Bulk (L$[COST] per file)..." - layout="topleft" - name="Bulk Upload"> - <menu_item_call.on_click - function="File.UploadBulk" - parameter="" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - </menu> - <menu_item_separator - layout="topleft" /> - <menu_item_call - label="New Window" - layout="topleft" - name="New Window"> - <menu_item_call.on_click - function="Inventory.NewWindow" /> - </menu_item_call> - <menu_item_separator - layout="topleft" - name="separator2" /> - <menu_item_call - label="Show Filters" - layout="topleft" - name="Show Filters"> - <menu_item_call.on_click - function="Inventory.ShowFilters" /> - </menu_item_call> - <menu_item_call - label="Reset Filters" - layout="topleft" - name="Reset Current"> - <menu_item_call.on_click - function="Inventory.ResetFilter" /> - </menu_item_call> - <menu_item_call - label="Close All Folders" - layout="topleft" - name="Close All Folders"> - <menu_item_call.on_click - function="Inventory.CloseAllFolders" /> - </menu_item_call> - <menu_item_separator - layout="topleft" - name="separator3" /> - <menu_item_call - label="Empty Trash" - layout="topleft" - name="Empty Trash"> - <menu_item_call.on_click - function="Inventory.EmptyTrash" /> - </menu_item_call> - <menu_item_call - label="Empty Lost And Found" - layout="topleft" - name="Empty Lost And Found"> - <menu_item_call.on_click - function="Inventory.EmptyLostAndFound" /> - </menu_item_call> - </menu> - <menu - height="121" - label="Create" - layout="topleft" - left="0" - mouse_opaque="false" - name="Create" - tear_off="true" - top="-201" - width="121"> - <menu_item_call - label="New Folder" - layout="topleft" - name="New Folder"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="category" /> - </menu_item_call> - <menu_item_call - label="New Script" - layout="topleft" - name="New Script"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="lsl" /> - </menu_item_call> - <menu_item_call - label="New Note" - layout="topleft" - name="New Note"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="notecard" /> - </menu_item_call> - <menu_item_call - label="New Gesture" - layout="topleft" - name="New Gesture"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="gesture" /> - </menu_item_call> - <menu - height="175" - label="New Clothes" - layout="topleft" - left_delta="0" - mouse_opaque="false" - name="New Clothes" - top_pad="514" - width="125"> - <menu_item_call - label="New Shirt" - layout="topleft" - name="New Shirt"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="shirt" /> - </menu_item_call> - <menu_item_call - label="New Pants" - layout="topleft" - name="New Pants"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="pants" /> - </menu_item_call> - <menu_item_call - label="New Shoes" - layout="topleft" - name="New Shoes"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="shoes" /> - </menu_item_call> - <menu_item_call - label="New Socks" - layout="topleft" - name="New Socks"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="socks" /> - </menu_item_call> - <menu_item_call - label="New Jacket" - layout="topleft" - name="New Jacket"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="jacket" /> - </menu_item_call> - <menu_item_call - label="New Skirt" - layout="topleft" - name="New Skirt"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="skirt" /> - </menu_item_call> - <menu_item_call - label="New Gloves" - layout="topleft" - name="New Gloves"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="gloves" /> - </menu_item_call> - <menu_item_call - label="New Undershirt" - layout="topleft" - name="New Undershirt"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="undershirt" /> - </menu_item_call> - <menu_item_call - label="New Underpants" - layout="topleft" - name="New Underpants"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="underpants" /> - </menu_item_call> - <menu_item_call - label="New Alpha" - layout="topleft" - name="New Alpha"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="alpha" /> - </menu_item_call> - <menu_item_call - label="New Tattoo" - layout="topleft" - name="New Tattoo"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="tattoo" /> - </menu_item_call> - </menu> - <menu - height="85" - label="New Body Parts" - layout="topleft" - left_delta="0" - mouse_opaque="false" - name="New Body Parts" - top_pad="514" - width="118"> - <menu_item_call - label="New Shape" - layout="topleft" - name="New Shape"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="shape" /> - </menu_item_call> - <menu_item_call - label="New Skin" - layout="topleft" - name="New Skin"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="skin" /> - </menu_item_call> - <menu_item_call - label="New Hair" - layout="topleft" - name="New Hair"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="hair" /> - </menu_item_call> - <menu_item_call - label="New Eyes" - layout="topleft" - name="New Eyes"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="eyes" /> - </menu_item_call> - </menu> - </menu> - <menu - height="49" - label="Sort" - layout="topleft" - left="0" - mouse_opaque="false" - name="Sort" - tear_off="true" - top="-113" - width="118"> - <menu_item_check - control_name="Inventory.SortByName" - label="By Name" - layout="topleft" - name="By Name"> - <menu_item_check.on_click - function="Inventory.SetSortBy" - parameter="name" /> - </menu_item_check> - <menu_item_check - control_name="Inventory.SortByDate" - label="By Date" - layout="topleft" - name="By Date"> - <menu_item_check.on_click - function="Inventory.SetSortBy" - parameter="date" /> - </menu_item_check> - <menu_item_separator - layout="topleft" /> - <menu_item_check - control_name="Inventory.FoldersAlwaysByName" - label="Folders Always By Name" - layout="topleft" - name="Folders Always By Name"> - <menu_item_check.on_click - function="Inventory.SetSortBy" - parameter="foldersalwaysbyname" /> - </menu_item_check> - <menu_item_check - control_name="Inventory.SystemFoldersToTop" - label="System Folders To Top" - layout="topleft" - name="System Folders To Top"> - <menu_item_check.on_click - function="Inventory.SetSortBy" - parameter="systemfolderstotop" /> - </menu_item_check> - </menu> - </menu_bar> +<panel + bottom="560" + class="panel_main_inventory" + filename="panel_main_inventory.xml" + follows="all" + layout="topleft" + left="0" + label="Inventory Panel" + name="Inventory Panel" + top="15" + width="467"> +</panel> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_openobject.xml b/indra/newview/skins/default/xui/en/floater_openobject.xml index 17f7e9bf67b..1c9fc3893eb 100644 --- a/indra/newview/skins/default/xui/en/floater_openobject.xml +++ b/indra/newview/skins/default/xui/en/floater_openobject.xml @@ -25,7 +25,7 @@ width="284"> [DESC]: </text> - <panel_inventory + <panel_inventory_object background_visible="false" draw_border="false" follows="all" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 29fe046ed38..93b50f6b783 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -2778,7 +2778,7 @@ left_pad="8" name="button permissions" width="130" /> - <panel_inventory + <panel_inventory_object follows="left|top" height="210" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml new file mode 100644 index 00000000000..8cebabdcda5 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -0,0 +1,417 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="400" + label="Things" + layout="topleft" + min_height="350" + min_width="240" + name="inventory panel" + width="333"> + <panel.string + name="Title"> + Things + </panel.string> + <filter_editor + text_pad_left="12" + follows="left|top|right" + font="SanSerif" + height="20" + label="Filter" + layout="topleft" + left="15" + name="inventory search editor" + top="34" + width="300" /> + <tab_container + follows="left|top|right|bottom" + height="320" + layout="topleft" + left_delta="-4" + name="inventory filter tabs" + tab_position="top" + top_pad="4" + width="313"> + <inventory_panel + follows="left|top|right|bottom" + border="true" + height="310" + label="All Items" + layout="topleft" + left="10" + name="All Items" + top="16" + width="250" /> + <inventory_panel + follows="left|top|right|bottom" + border="true" + height="310" + label="Recent Items" + layout="topleft" + left_delta="0" + name="Recent Items" + top_delta="0" + width="250" /> + </tab_container> + <menu_bar + bg_visible="false" + follows="left|top|right" + height="18" + layout="topleft" + left_delta="0" + mouse_opaque="false" + name="Inventory Menu" + top_delta="-38" + width="461"> + <menu + height="101" + label="File" + layout="topleft" + left="0" + mouse_opaque="false" + name="File" + tear_off="true" + top="-117" + width="128"> + <menu_item_call + label="Open" + layout="topleft" + name="Open"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="open" /> + </menu_item_call> + <menu + create_jump_keys="true" + label="Upload" + layout="topleft" + name="upload" + tear_off="true"> + <menu_item_call + label="Image (L$[COST])..." + layout="topleft" + name="Upload Image" + shortcut="control|U"> + <menu_item_call.on_click + function="File.UploadImage" + parameter="" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + </menu_item_call> + <menu_item_call + label="Sound (L$[COST])..." + layout="topleft" + name="Upload Sound"> + <menu_item_call.on_click + function="File.UploadSound" + parameter="" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + </menu_item_call> + <menu_item_call + label="Animation (L$[COST])..." + layout="topleft" + name="Upload Animation"> + <menu_item_call.on_click + function="File.UploadAnim" + parameter="" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + </menu_item_call> + <menu_item_call + label="Bulk (L$[COST] per file)..." + layout="topleft" + name="Bulk Upload"> + <menu_item_call.on_click + function="File.UploadBulk" + parameter="" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + </menu> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="New Window" + layout="topleft" + name="New Window"> + <menu_item_call.on_click + function="Inventory.NewWindow" /> + </menu_item_call> + <menu_item_separator + layout="topleft" + name="separator2" /> + <menu_item_call + label="Show Filters" + layout="topleft" + name="Show Filters"> + <menu_item_call.on_click + function="Inventory.ShowFilters" /> + </menu_item_call> + <menu_item_call + label="Reset Filters" + layout="topleft" + name="Reset Current"> + <menu_item_call.on_click + function="Inventory.ResetFilters" /> + </menu_item_call> + <menu_item_call + label="Close All Folders" + layout="topleft" + name="Close All Folders"> + <menu_item_call.on_click + function="Inventory.CloseAllFolders" /> + </menu_item_call> + <menu_item_separator + layout="topleft" + name="separator3" /> + <menu_item_call + label="Empty Trash" + layout="topleft" + name="Empty Trash"> + <menu_item_call.on_click + function="Inventory.EmptyTrash" /> + </menu_item_call> + <menu_item_call + label="Empty Lost And Found" + layout="topleft" + name="Empty Lost And Found"> + <menu_item_call.on_click + function="Inventory.EmptyLostAndFound" /> + </menu_item_call> + </menu> + <menu + height="121" + label="Create" + layout="topleft" + left="0" + mouse_opaque="false" + name="Create" + tear_off="true" + top="-201" + width="121"> + <menu_item_call + label="New Folder" + layout="topleft" + name="New Folder"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="category" /> + </menu_item_call> + <menu_item_call + label="New Script" + layout="topleft" + name="New Script"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="lsl" /> + </menu_item_call> + <menu_item_call + label="New Note" + layout="topleft" + name="New Note"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="notecard" /> + </menu_item_call> + <menu_item_call + label="New Gesture" + layout="topleft" + name="New Gesture"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="gesture" /> + </menu_item_call> + <menu + height="175" + label="New Clothes" + layout="topleft" + left_delta="0" + mouse_opaque="false" + name="New Clothes" + top_pad="514" + width="125"> + <menu_item_call + label="New Shirt" + layout="topleft" + name="New Shirt"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="shirt" /> + </menu_item_call> + <menu_item_call + label="New Pants" + layout="topleft" + name="New Pants"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="pants" /> + </menu_item_call> + <menu_item_call + label="New Shoes" + layout="topleft" + name="New Shoes"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="shoes" /> + </menu_item_call> + <menu_item_call + label="New Socks" + layout="topleft" + name="New Socks"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="socks" /> + </menu_item_call> + <menu_item_call + label="New Jacket" + layout="topleft" + name="New Jacket"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="jacket" /> + </menu_item_call> + <menu_item_call + label="New Skirt" + layout="topleft" + name="New Skirt"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="skirt" /> + </menu_item_call> + <menu_item_call + label="New Gloves" + layout="topleft" + name="New Gloves"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="gloves" /> + </menu_item_call> + <menu_item_call + label="New Undershirt" + layout="topleft" + name="New Undershirt"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="undershirt" /> + </menu_item_call> + <menu_item_call + label="New Underpants" + layout="topleft" + name="New Underpants"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="underpants" /> + </menu_item_call> + <menu_item_call + label="New Alpha" + layout="topleft" + name="New Alpha"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="alpha" /> + </menu_item_call> + <menu_item_call + label="New Tattoo" + layout="topleft" + name="New Tattoo"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="tattoo" /> + </menu_item_call> + </menu> + <menu + height="85" + label="New Body Parts" + layout="topleft" + left_delta="0" + mouse_opaque="false" + name="New Body Parts" + top_pad="514" + width="118"> + <menu_item_call + label="New Shape" + layout="topleft" + name="New Shape"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="shape" /> + </menu_item_call> + <menu_item_call + label="New Skin" + layout="topleft" + name="New Skin"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="skin" /> + </menu_item_call> + <menu_item_call + label="New Hair" + layout="topleft" + name="New Hair"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="hair" /> + </menu_item_call> + <menu_item_call + label="New Eyes" + layout="topleft" + name="New Eyes"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="eyes" /> + </menu_item_call> + </menu> + </menu> + <menu + height="49" + label="Sort" + layout="topleft" + left="0" + mouse_opaque="false" + name="Sort" + tear_off="true" + top="-113" + width="118"> + <menu_item_check + control_name="Inventory.SortByName" + label="By Name" + layout="topleft" + name="By Name"> + <menu_item_check.on_click + function="Inventory.SetSortBy" + parameter="name" /> + </menu_item_check> + <menu_item_check + control_name="Inventory.SortByDate" + label="By Date" + layout="topleft" + name="By Date"> + <menu_item_check.on_click + function="Inventory.SetSortBy" + parameter="date" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> + <menu_item_check + control_name="Inventory.FoldersAlwaysByName" + label="Folders Always By Name" + layout="topleft" + name="Folders Always By Name"> + <menu_item_check.on_click + function="Inventory.SetSortBy" + parameter="foldersalwaysbyname" /> + </menu_item_check> + <menu_item_check + control_name="Inventory.SystemFoldersToTop" + label="System Folders To Top" + layout="topleft" + name="System Folders To Top"> + <menu_item_check.on_click + function="Inventory.SetSortBy" + parameter="systemfolderstotop" /> + </menu_item_check> + </menu> + </menu_bar> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml index 3f64c9c633f..190dbe2b0fe 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml @@ -1,131 +1,149 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<!-- Side tray cannot show background because it is always - partially on screen to hold tab buttons. --> -<side_tray - name="sidebar" - background_visible="false" - mouse_opaque="true" - width="333" - collapsed="true" -> - <!-- Individual tabs must show background to have seemless - appearance up to tray panel header word like "Home". - Embedded panels are inset by a pixel and so their - backgrounds will not block the world fully. --> - <sidetray_tab - name="sidebar_home" - help_topic="sidebar_home" - tab_title="Home" - description="Home." - image="TabIcon_Open_Off" - image_selected="TabIcon_Close_Off" - mouse_opaque="false" - background_visible="true" - > - <panel - name="panel_home" - filename="panel_sidetray_home_tab.xml" - label="home" - /> - </sidetray_tab> - - <sidetray_tab - name="sidebar_people" - help_topic="sidebar_people" - tab_title="People" - description="Find your friends, contacts and people nearby." - image="TabIcon_People_Off" - image_selected="TabIcon_People_Selected" - mouse_opaque="false" - background_visible="true" - > - <panel_container - name="panel_container" - width="333" - > - <panel - class="panel_people" - name="panel_people" - filename="panel_people.xml" - /> - <panel - class="panel_profile_view" - name="panel_profile_view" - filename="panel_profile_view.xml" - /> - <panel - class="panel_group_info_sidetray" - name="panel_group_info_sidetray" - filename="panel_group_info_sidetray.xml" - label="Group Info" - font="SansSerifBold" - /> - <panel - class="panel_block_list_sidetray" - name="panel_block_list_sidetray" - filename="panel_block_list_sidetray.xml" - label="Blocked Residents & Objects" - font="SansSerifBold" - /> - - </panel_container> - </sidetray_tab> - - <sidetray_tab - name="sidebar_places" - help_topic="sidebar_places" - tab_title="Places" - label="Places" - description="Find places to go and places you've visited before." - image="TabIcon_Places_Off" - image_selected="TabIcon_Places_Selected" - mouse_opaque="false" - background_visible="true" - > - <panel - class="panel_places" - name="panel_places" - filename="panel_places.xml" - label="Places" - font="SansSerifBold" - /> - </sidetray_tab> - - <sidetray_tab - name="sidebar_me" - help_topic="sidebar_me" - tab_title="Me" - description="Edit your public profile and Picks." - image="TabIcon_Me_Off" - image_selected="TabIcon_Me_Selected" - mouse_opaque="false" - background_visible="true" - > - <panel - class="panel_me_profile_view" - name="panel_me_profile" - filename="panel_me_profile.xml" - label="Me" - /> - </sidetray_tab> - - <sidetray_tab - name="sidebar_appearance" - help_topic="sidebar_appearance" - tab_title="Appearance" - description="Change your appearance and current look." - image="TabIcon_Appearance_Off" - image_selected="TabIcon_Appearance_Selected" - mouse_opaque="false" - background_visible="true" - > - <panel - class="panel_appearance" - name="panel_appearance" - filename="panel_appearance.xml" - label="Edit Appearance" - font="SansSerifBold" - /> - </sidetray_tab> - -</side_tray> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- Side tray cannot show background because it is always + partially on screen to hold tab buttons. --> +<side_tray + name="sidebar" + background_visible="false" + mouse_opaque="true" + width="333" + collapsed="true" +> + <!-- Individual tabs must show background to have seemless + appearance up to tray panel header word like "Home". + Embedded panels are inset by a pixel and so their + backgrounds will not block the world fully. --> + <sidetray_tab + name="sidebar_home" + help_topic="sidebar_home" + tab_title="Home" + description="Home." + image="TabIcon_Open_Off" + image_selected="TabIcon_Close_Off" + mouse_opaque="false" + background_visible="true" + > + <panel + name="panel_home" + filename="panel_sidetray_home_tab.xml" + label="home" + /> + </sidetray_tab> + + <sidetray_tab + name="sidebar_people" + help_topic="sidebar_people" + tab_title="People" + description="Find your friends, contacts and people nearby." + image="TabIcon_People_Off" + image_selected="TabIcon_People_Selected" + mouse_opaque="false" + background_visible="true" + > + <panel_container + name="panel_container" + width="333" + > + <panel + class="panel_people" + name="panel_people" + filename="panel_people.xml" + /> + <panel + class="panel_profile_view" + name="panel_profile_view" + filename="panel_profile_view.xml" + /> + <panel + class="panel_group_info_sidetray" + name="panel_group_info_sidetray" + filename="panel_group_info_sidetray.xml" + label="Group Info" + font="SansSerifBold" + /> + <panel + class="panel_block_list_sidetray" + name="panel_block_list_sidetray" + filename="panel_block_list_sidetray.xml" + label="Blocked Residents & Objects" + font="SansSerifBold" + /> + + </panel_container> + </sidetray_tab> + + <sidetray_tab + name="sidebar_places" + help_topic="sidebar_places" + tab_title="Places" + label="Places" + description="Find places to go and places you've visited before." + image="TabIcon_Places_Off" + image_selected="TabIcon_Places_Selected" + mouse_opaque="false" + background_visible="true" + > + <panel + class="panel_places" + name="panel_places" + filename="panel_places.xml" + label="Places" + font="SansSerifBold" + /> + </sidetray_tab> + + <sidetray_tab + name="sidebar_me" + help_topic="sidebar_me" + tab_title="Me" + description="Edit your public profile and Picks." + image="TabIcon_Me_Off" + image_selected="TabIcon_Me_Selected" + mouse_opaque="false" + background_visible="true" + > + <panel + class="panel_me_profile_view" + name="panel_me_profile" + filename="panel_me_profile.xml" + label="Me" + /> + </sidetray_tab> + + <sidetray_tab + name="sidebar_appearance" + help_topic="sidebar_appearance" + tab_title="Appearance" + description="Change your appearance and current look." + image="TabIcon_Appearance_Off" + image_selected="TabIcon_Appearance_Selected" + mouse_opaque="false" + background_visible="true" + > + <panel + class="panel_appearance" + name="panel_appearance" + filename="panel_appearance.xml" + label="Edit Appearance" + font="SansSerifBold" + /> + </sidetray_tab> + + <sidetray_tab + name="sidebar_inventory" + help_topic="sidebar_inventory" + tab_title="Inventory" + description="Browse your inventory." + image="TabIcon_Inventory_Off" + mouse_opaque="false" + background_visible="true" + > + <panel + class="sidepanel_inventory" + name="sidepanel_inventory" + filename="sidepanel_inventory.xml" + label="Edit Inventory" + font="SansSerifBold" + /> + </sidetray_tab> + +</side_tray> diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml index 247054772e1..9636e321870 100644 --- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml +++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml @@ -12,7 +12,7 @@ bg_alpha_color="DkGray2" class="panel_sidetray_home_info" follows="left|top|right" - height="120" + height="90" layout="topleft" left="15" top="17" @@ -42,7 +42,7 @@ width="20" /> <text follows="left|right|bottom" - height="120" + height="90" layout="topleft" left="10" mouse_opaque="false" @@ -59,7 +59,7 @@ bg_alpha_color="DkGray2" class="panel_sidetray_home_info" follows="left|top|right" - height="120" + height="90" layout="topleft" left="15" top_pad="15" @@ -89,7 +89,7 @@ image_name="TabIcon_Places_Selected"/> <text follows="all" - height="120" + height="90" layout="topleft" left="10" mouse_opaque="false" @@ -106,7 +106,7 @@ bg_alpha_color="DkGray2" class="panel_sidetray_home_info" follows="left|top|right" - height="120" + height="90" layout="topleft" left="15" top_pad="15" @@ -136,7 +136,7 @@ image_name="TabIcon_Me_Selected"/> <text follows="all" - height="120" + height="90" layout="topleft" left="10" mouse_opaque="false" @@ -153,7 +153,7 @@ bg_alpha_color="DkGray2" class="panel_sidetray_home_info" follows="left|top|right" - height="120" + height="90" layout="topleft" left="15" top_pad="15" @@ -183,7 +183,7 @@ image_name="TabIcon_Appearance_Selected"/> <text follows="all" - height="120" + height="90" layout="topleft" left="10" mouse_opaque="false" @@ -195,4 +195,51 @@ Change your appearance and current look. </text> </panel> + <panel + background_visible="true" + bg_alpha_color="DkGray2" + class="panel_sidetray_home_info" + follows="left|top|right" + height="90" + layout="topleft" + left="15" + top_pad="15" + name="sidebar_inventory" + width="303"> + <text + follows="left|right|top" + font="SansSerifBigBold" + height="30" + layout="topleft" + left="10" + mouse_opaque="false" + name="tab_name" + text_color="EmphasisColor" + top="10" + value="My Inventory" + width="200" + word_wrap="true" /> + <icon + follows="top|right" + height="20" + layout="topleft" + name="tab_icon" + right="-10" + top="10" + width="20" + image_name="TabIcon_Inventory_Selected"/> + <text + follows="all" + height="90" + layout="topleft" + left="10" + mouse_opaque="false" + name="tab_description" + right="-10" + text_color="white" + top="40" + word_wrap="true"> + Browse your inventory. + </text> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml new file mode 100644 index 00000000000..3b3fbcb936e --- /dev/null +++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml @@ -0,0 +1,122 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="400" + label="Places" + layout="topleft" + min_height="350" + min_width="240" + name="objects panel" + width="333"> + <tab_container + follows="all" + height="360" + layout="topleft" + left="9" + name="Inventory Tabs" + tab_position="top" + top="30" + width="313" + tab_height="0" + visible="true"> + <panel + class="panel_main_inventory" + filename="panel_main_inventory.xml" + follows="all" + layout="topleft" + left="0" + name="panel_main_inventory" + top="15" + label="" + height="300" + width="467"> + <panel + height="25" + layout="bottomright" + left="0" + help_topic="objects_button_tab" + name="button_panel" + bottom="5" + width="313"> + <button + enabled="true" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Info" + layout="topleft" + left="0" + name="info_btn" + top="0" + width="60" /> + <button + enabled="true" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Share" + layout="topleft" + left_pad="5" + name="share_btn" + top="0" + width="60" /> + <button + enabled="false" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Wear" + layout="topleft" + left="130" + name="wear_btn" + top="0" + width="60" /> + <button + enabled="false" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Play" + layout="topleft" + name="play_btn" + left="130" + top="0" + width="50" /> + <button + enabled="false" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Teleport" + layout="topleft" + left="130" + name="teleport_btn" + top="0" + width="77" /> + <button + follows="bottom|right" + font="SansSerifSmallBold" + height="25" + label="v" + layout="topleft" + name="overflow_btn" + right="-10" + top="0" + width="30" /> + </panel> + </panel> + </tab_container> + + <panel + class="sidepanel_object_info" + filename="sidepanel_object_info.xml" + follows="all" + height="360" + layout="topleft" + left="0" + help_topic="objects_info_tab" + name="sidepanel_object_info" + top="30" + visible="false" /> +</panel> -- GitLab From 0c196fd7690743c5f469d57002ffee8034c554ee Mon Sep 17 00:00:00 2001 From: Erica <erica@lindenlab.com> Date: Mon, 2 Nov 2009 12:45:56 -0800 Subject: [PATCH 014/306] Bottom bar - Change snapshot combo to button, increase width for il8n EXT-2079, Remove deleted art from textures.xml EXT-2080 --- .../textures/bottomtray/Snapshot_Off.png | Bin 332 -> 3204 bytes .../skins/default/textures/textures.xml | 93 ------------------ .../skins/default/xui/en/panel_bottomtray.xml | 81 +++++++-------- 3 files changed, 36 insertions(+), 138 deletions(-) diff --git a/indra/newview/skins/default/textures/bottomtray/Snapshot_Off.png b/indra/newview/skins/default/textures/bottomtray/Snapshot_Off.png index 6f2726c3e672a87918a50007e5dfe978051dbdd4..d7ec04237b53b2b2634210381b1a423a401375d6 100644 GIT binary patch literal 3204 zcmV-~414p5P)<h;3K|Lk000e1NJLTq001Na000sQ1^@s6Gb4N`00009a7bBm000XU z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-oy)XH-+^7Crag z^g>IBfRsybQWXdwQbLP>6p<z>Aqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uh<iVD~V z<RPMtgQJLw%KPDaqifc@_vX$1wbwr9tn;0-&j-K=43<bUQ8j=JsX`tR;Dg7+#^K~H zK!FM*Z~zbpvt%K2{UZSY_<lS*D<Z%Lz5oGu(+dayz)hRLFdT>f59&ghTmgWD0l;*T zI7<kC6aYYajzXpYKt=(8otP$50H6c_V9R4-;{Z@C0AMG7=F<Rxo%or10RUT+Ar%3j zkpLhQWr#!oXgdI`&sK^>09Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-<?i z0%4j!F2Z@488U%158(66005wo6%pWr^Zj_v4zAA5HjcIqUoGmt2LB>rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_<lS*MWK+n+1cgf z<k(8YLR(?VSAG6x!e78w{cQPuJpA|d;J)G{fihizM+Erb!p!tcr5w+a34~(Y=8s4G zw+sLL9n&JjNn*KJDiq^U5^;`1nvC-@r6P$!k}1U{(*I=Q-z@tBKHoI}uxdU5dyy@u zU1J0GOD7Ombim^G008p4Z^6_k2m^p<gW=D2|L;HjN1!DDfM!XOaR2~bL?kX$%CkSm z2mk;?pn)o|K^yeJ7%adB9Ki+L!3+FgHiSYX#KJ-lLJDMn9CBbOtb#%)hRv`YDqt_v zKpix|QD}yfa1JiQRk#j4a1Z)n2%f<xynzV>LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_Ifq<Ex{*7`05XF7hP+2Hl!3BQJ=6@fL%FCo z8iYoo3(#bAF`ADSpqtQgv>H8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ<AYmRsNLWl*PS{AOARHt#5!wki2?K;t z!Y3k=s7tgax)J%r7-BLphge7~Bi0g+6E6^Zh(p9TBoc{3GAFr^0!gu?RMHaCM$&Fl zBk3%un>0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 z<uv66WtcKSRim0x-Ke2d5jBrmLam{;Qm;{ms1r1GnmNsb7D-E`t)i9F8fX`2_i3-_ zbh;7Ul^#x)&{xvS=|||7=mYe33=M`AgU5(xC>fg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vF<Q0r40Q)j6=sE4X&sBct1q<&fbi3VB2Ov6t@q*0);U*o*SAPZv|vv@2aYYnT0 zb%8a+Cb7-ge0D0knEf5Qi#@8Tp*ce{N;6lpQuCB%KL_KOarm5cP6_8Ir<e17iry6O zDdH&`rZh~sF=bq9s+O0QSgS~@QL9Jmy*94xr=6y~MY~!1fet~(N+(<=M`w@D1)b+p z*;C!83a1uLJv#NSE~;y#8=<>IcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a<fJbF^|4I#xQ~n$Dc= zKYhjYmgz5NSkDm8*fZm{6U!;YX`NG>(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-k<Mujg;0Lz*3buG=3$G&ehepthlN*$KaOySSQ^nWmo<0M+(UEUMEXRQ zMBbZcF;6+KElM>iKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BK<z=<L*0kfKU@CX*zeqbYQT4(^U>T#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot<a{81DF0~rvGr5Xr~8u`lav1h z1DNytV>2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00056Nkl<Zc-rih!D<>&6o$V$PBczUvnbMq!mLWfKuV!4f-8N7E}WH8vM|s^S4m%? zkKiJ~RYiOTNdpoH*@OgfVO>;^25~kaq!XE$)6HZT$V?-_MGhS9UHtdn|8UO#UnL?e zQ)nz%EFB>|EKn(Rw|xt|0z4oATmXL_Iv;j4^a$j)0M+ewzn0784d51dS+CcBG#ZT~ z;KhA)04{I^oQEnrEc3}^a*$4^&3HT>1Hvjna~#LDZToj7lli<*Lcn3rqT7gLVE{Kk zY2ia%EEc~grAkVvQm51T39NgbC%*5W0N;R5z^?E6$DZfO|A<D9h<^vH0)K%tpwH*? zzNTsWi9});U~JcQZP#^EhG7&U%S=SV=Anoj2kTv)jYgxLe!ss`tJMIoEQ`TlureGD zw?*VkL{0*1sCORgL;h?wTdP*9Mzh%jpw((osZ>^{)9D)EKeaJBxm<43G|i7d3Wx)# zY&QELpU-arPSgt@t1<<6<MH@cyWKwR^?H|uLgBS#S?^8Le4~`ofn*ewMIrP(aOq@( qR>Xkoz|Hp-P3ZZze<pNa{2KrdHt5<CJPp490000<MNUMnLSTaH0r4dO literal 332 zcmV-S0ki&zP)<h;3K|Lk000e1NJLTq000sI000sQ1^@s6R?d!B0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy?ny*JRCwBA{Qv(y12q5>1C;>P3}OKh zjEsyhzCD`!K|%(=f`$dk*8^ffpkM>CBA^8g1k8C4#FxNoK_)(Z`gESOw6r3r-T~^n z57d_gHwXy!QxH6k$X)|^!x72fV1xhs`SXE=g=GVfc>pTq02B)ViV0v1Y#ag2@csMu zt$ciZ3z38te){x@m6w+{8fWx_0vd*4VppzQIfAYMn;5}#boA&^A!5YPy@mlSEiIiu zkpsl9p+cfiG13e&G&D3jaNq#*f&~k%g7^su3EDt0V{B?+(ccNgW@JSDDIhLKHfR{; eeySM+5MTiP>stxO-1&b10000<MNUMnLSTY+vVf}q diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index c322d2aebb2..e11e94778b6 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -532,15 +532,6 @@ <texture name="move_down_in.tga" preload="false" /> <texture name="move_down_out.tga" preload="false" /> - <texture name="tool_grab.tga" /> - <texture name="tool_grab_active.tga" /> - - <texture name="tool_face.tga" /> - <texture name="tool_face_active.tga" /> - - <texture name="tool_create.tga" /> - <texture name="tool_create_active.tga" /> - <texture name="up_arrow.tga" file_name="up_arrow.png" /> <texture name="down_arrow.tga" file_name="down_arrow.png" /> @@ -605,54 +596,6 @@ <texture name="icon_popular.tga" /> <texture name="icon_top_pick.tga" /> - <texture name="inv_folder_animation.tga" /> - <texture name="inv_folder_bodypart.tga" /> - <texture name="inv_folder_callingcard.tga" /> - <texture name="inv_folder_clothing.tga" /> - <texture name="inv_folder_current_outfit.tga" /> - <texture name="inv_folder_gesture.tga" /> - <texture name="inv_folder_landmark.tga" /> - <texture name="inv_folder_lostandfound.tga" /> - <texture name="inv_folder_my_outfits.tga" /> - <texture name="inv_folder_notecard.tga" /> - <texture name="inv_folder_object.tga" /> - <texture name="inv_folder_outfit.tga" /> - <texture name="inv_folder_plain_closed.tga" /> - <texture name="inv_folder_script.tga" /> - <texture name="inv_folder_snapshot.tga" /> - <texture name="inv_folder_sound.tga" /> - <texture name="inv_folder_texture.tga" /> - <texture name="inv_folder_trash.tga" /> - - <texture name="inv_item_animation.tga" /> - <texture name="inv_item_skin.tga" /> - <texture name="inv_item_callingcard_offline.tga" /> - <texture name="inv_item_callingcard_online.tga" /> - <texture name="inv_item_eyes.tga" /> - <texture name="inv_item_gesture.tga" /> - <texture name="inv_item_gloves.tga" /> - <texture name="inv_item_hair.tga" /> - <texture name="inv_item_jacket.tga" /> - <texture name="inv_item_landmark.tga" /> - <texture name="inv_item_landmark_visited.tga" /> - <texture name="inv_item_linkitem.tga" /> - <texture name="inv_item_linkfolder.tga" /> - <texture name="inv_item_notecard.tga" /> - <texture name="inv_item_object.tga" /> - <texture name="inv_item_object_multi.tga" /> - <texture name="inv_item_pants.tga" /> - <texture name="inv_item_script.tga" /> - <texture name="inv_item_shape.tga" /> - <texture name="inv_item_shirt.tga" /> - <texture name="inv_item_shoes.tga" /> - <texture name="inv_item_skirt.tga" /> - <texture name="inv_item_snapshot.tga" /> - <texture name="inv_item_socks.tga" /> - <texture name="inv_item_sound.tga" /> - <texture name="inv_item_texture.tga" /> - <texture name="inv_item_underpants.tga" /> - <texture name="inv_item_undershirt.tga" /> - <texture name="lag_status_critical.tga" /> <texture name="lag_status_good.tga" /> <texture name="lag_status_warning.tga" /> @@ -679,37 +622,6 @@ <texture name="notify_next.png" preload="true" /> <texture name="notify_box_icon.tga" /> - <texture name="object_cone.tga" /> - <texture name="object_cone_active.tga" /> - <texture name="object_cube.tga" /> - <texture name="object_cube_active.tga" /> - <texture name="object_cylinder.tga" /> - <texture name="object_cylinder_active.tga" /> - <texture name="object_grass.tga" /> - <texture name="object_grass_active.tga" /> - <texture name="object_hemi_cone.tga" /> - <texture name="object_hemi_cone_active.tga" /> - <texture name="object_hemi_cylinder.tga" /> - <texture name="object_hemi_cylinder_active.tga" /> - <texture name="object_hemi_sphere.tga" /> - <texture name="object_hemi_sphere_active.tga" /> - <texture name="object_prism.tga" /> - <texture name="object_prism_active.tga" /> - <texture name="object_pyramid.tga" /> - <texture name="object_pyramid_active.tga" /> - <texture name="object_ring.tga" /> - <texture name="object_ring_active.tga" /> - <texture name="object_sphere.tga" /> - <texture name="object_sphere_active.tga" /> - <texture name="object_tetrahedron.tga" /> - <texture name="object_tetrahedron_active.tga" /> - <texture name="object_torus.tga" /> - <texture name="object_torus_active.tga" /> - <texture name="object_tree.tga" /> - <texture name="object_tree_active.tga" /> - <texture name="object_tube.tga" /> - <texture name="object_tube_active.tga" /> - <texture name="pixiesmall.j2c" use_mips="true" /> <texture name="script_error.j2c" use_mips="true" /> <texture name="silhouette.j2c" use_mips="true" /> @@ -725,11 +637,6 @@ <texture name="status_no_push.tga" /> <texture name="status_no_scripts.tga" /> - <texture name="tool_dozer.tga" /> - <texture name="tool_dozer_active.tga" /> - <texture name="tool_zoom.tga" /> - <texture name="tool_zoom_active.tga" /> - <texture name="icn_active-speakers-dot-lvl0.tga" /> <texture name="icn_active-speakers-dot-lvl1.tga" /> <texture name="icn_active-speakers-dot-lvl2.tga" /> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 73a1bae1c65..179ef015f18 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -10,7 +10,7 @@ left="0" name="bottom_tray" top="28" - chrome="true" + chrome="true" border_visible="false" width="1000"> <layout_stack @@ -47,7 +47,7 @@ min_width="300" name="chat_bar" user_resize="false" - filename="panel_nearby_chat_bar.xml"/> + filename="panel_nearby_chat_bar.xml" /> <layout_panel mouse_opaque="false" auto_resize="false" @@ -55,23 +55,22 @@ height="28" layout="topleft" min_height="28" - width="96" + width="100" top_delta="0" min_width="96" name="speak_panel" user_resize="false"> - <chiclet_talk - follows="right" - height="23" - speak_button.font="SansSerifMedium" - speak_button.tab_stop="true" - show_button.tab_stop="true" - layout="topleft" - left="0" - name="talk" - top="3" - width="96" /> - </layout_panel> + <chiclet_talk + follows="right" + height="23" + speak_button.tab_stop="true" + show_button.tab_stop="true" + layout="topleft" + left="0" + name="talk" + top="3" + width="100" /> + </layout_panel> <icon auto_resize="false" follows="left|right" @@ -89,21 +88,21 @@ height="28" layout="topleft" min_height="28" - width="76" + width="80" top_delta="0" min_width="76" name="gesture_panel" user_resize="false"> - <button - follows="right" - height="23" - label="Gesture" - layout="topleft" - name="Gesture" - left="0" - top="3" - use_ellipses="true" - width="76" /> + <button + follows="right" + height="23" + label="Gesture" + layout="topleft" + name="Gesture" + left="0" + top="3" + use_ellipses="true" + width="80" /> </layout_panel> <icon auto_resize="false" @@ -124,7 +123,7 @@ layout="topleft" min_height="28" name="movement_panel" - width="76" + width="80" min_width="76"> <button follows="left|right" @@ -136,7 +135,7 @@ name="movement_btn" tool_tip="Show/hide movement controls" top="3" - width="76"> + width="80"> <button.init_callback function="Button.SetDockableFloaterToggle" parameter="moveview" /> @@ -175,7 +174,7 @@ tool_tip="Show/hide camera controls" top="3" name="camera_btn" - width="76"> + width="80"> <button.init_callback function="Button.SetDockableFloaterToggle" parameter="camera" /> @@ -199,28 +198,20 @@ height="28" layout="topleft" name="snapshot_panel" - width="35"> - <split_button + width="40"> + <button arrow_position="right" follows="left|right" height="23" left="0" + label="" layout="topleft" - name="snapshots" - width="46" - top="3"> - <split_button.item + width="36" + top="3" image_overlay="Snapshot_Off" name="snapshot" - tool_tip="Take snapshot" - /> - <split_button.arrow_button - name="snapshot_settings" - image_overlay="Widget_UpArrow" - tool_tip="Snapshot and Preset Views" - width="18" - /> - </split_button> + tool_tip="Take a snapshot" + /> </layout_panel> <layout_panel mouse_opaque="false" @@ -297,7 +288,7 @@ height="10" image_name="spacer24.tga" layout="topleft" - left="0" + right="-1" top="0" width="10"/> </layout_stack> -- GitLab From 5d12c6516e9eaf4084cc00f757061a9bd78d7ed9 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Mon, 2 Nov 2009 13:24:14 -0800 Subject: [PATCH 015/306] Fix legacy communicate window tabs being too low, trivial. --- indra/newview/skins/default/xui/en/floater_im.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/skins/default/xui/en/floater_im.xml b/indra/newview/skins/default/xui/en/floater_im.xml index b6cf05aefce..92a61117598 100644 --- a/indra/newview/skins/default/xui/en/floater_im.xml +++ b/indra/newview/skins/default/xui/en/floater_im.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <multi_floater + legacy_header_height="18" can_resize="true" follows="left|bottom" height="422" -- GitLab From 729c5730ca0ae86300fec3c2b5bd132e23f48211 Mon Sep 17 00:00:00 2001 From: Erica <erica@lindenlab.com> Date: Mon, 2 Nov 2009 13:56:23 -0800 Subject: [PATCH 016/306] Bottom bar - Change snapshot combo to button, increase width for il8n EXT-2079, Remove deleted art from textures.xml EXT-2080 --- .../textures/bottomtray/Snapshot_Off.png | Bin 332 -> 3204 bytes .../skins/default/textures/textures.xml | 93 ------------------ .../skins/default/xui/en/panel_bottomtray.xml | 31 +++--- 3 files changed, 11 insertions(+), 113 deletions(-) diff --git a/indra/newview/skins/default/textures/bottomtray/Snapshot_Off.png b/indra/newview/skins/default/textures/bottomtray/Snapshot_Off.png index 6f2726c3e672a87918a50007e5dfe978051dbdd4..d7ec04237b53b2b2634210381b1a423a401375d6 100644 GIT binary patch literal 3204 zcmV-~414p5P)<h;3K|Lk000e1NJLTq001Na000sQ1^@s6Gb4N`00009a7bBm000XU z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-oy)XH-+^7Crag z^g>IBfRsybQWXdwQbLP>6p<z>Aqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uh<iVD~V z<RPMtgQJLw%KPDaqifc@_vX$1wbwr9tn;0-&j-K=43<bUQ8j=JsX`tR;Dg7+#^K~H zK!FM*Z~zbpvt%K2{UZSY_<lS*D<Z%Lz5oGu(+dayz)hRLFdT>f59&ghTmgWD0l;*T zI7<kC6aYYajzXpYKt=(8otP$50H6c_V9R4-;{Z@C0AMG7=F<Rxo%or10RUT+Ar%3j zkpLhQWr#!oXgdI`&sK^>09Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-<?i z0%4j!F2Z@488U%158(66005wo6%pWr^Zj_v4zAA5HjcIqUoGmt2LB>rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_<lS*MWK+n+1cgf z<k(8YLR(?VSAG6x!e78w{cQPuJpA|d;J)G{fihizM+Erb!p!tcr5w+a34~(Y=8s4G zw+sLL9n&JjNn*KJDiq^U5^;`1nvC-@r6P$!k}1U{(*I=Q-z@tBKHoI}uxdU5dyy@u zU1J0GOD7Ombim^G008p4Z^6_k2m^p<gW=D2|L;HjN1!DDfM!XOaR2~bL?kX$%CkSm z2mk;?pn)o|K^yeJ7%adB9Ki+L!3+FgHiSYX#KJ-lLJDMn9CBbOtb#%)hRv`YDqt_v zKpix|QD}yfa1JiQRk#j4a1Z)n2%f<xynzV>LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_Ifq<Ex{*7`05XF7hP+2Hl!3BQJ=6@fL%FCo z8iYoo3(#bAF`ADSpqtQgv>H8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ<AYmRsNLWl*PS{AOARHt#5!wki2?K;t z!Y3k=s7tgax)J%r7-BLphge7~Bi0g+6E6^Zh(p9TBoc{3GAFr^0!gu?RMHaCM$&Fl zBk3%un>0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 z<uv66WtcKSRim0x-Ke2d5jBrmLam{;Qm;{ms1r1GnmNsb7D-E`t)i9F8fX`2_i3-_ zbh;7Ul^#x)&{xvS=|||7=mYe33=M`AgU5(xC>fg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vF<Q0r40Q)j6=sE4X&sBct1q<&fbi3VB2Ov6t@q*0);U*o*SAPZv|vv@2aYYnT0 zb%8a+Cb7-ge0D0knEf5Qi#@8Tp*ce{N;6lpQuCB%KL_KOarm5cP6_8Ir<e17iry6O zDdH&`rZh~sF=bq9s+O0QSgS~@QL9Jmy*94xr=6y~MY~!1fet~(N+(<=M`w@D1)b+p z*;C!83a1uLJv#NSE~;y#8=<>IcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a<fJbF^|4I#xQ~n$Dc= zKYhjYmgz5NSkDm8*fZm{6U!;YX`NG>(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-k<Mujg;0Lz*3buG=3$G&ehepthlN*$KaOySSQ^nWmo<0M+(UEUMEXRQ zMBbZcF;6+KElM>iKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BK<z=<L*0kfKU@CX*zeqbYQT4(^U>T#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot<a{81DF0~rvGr5Xr~8u`lav1h z1DNytV>2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00056Nkl<Zc-rih!D<>&6o$V$PBczUvnbMq!mLWfKuV!4f-8N7E}WH8vM|s^S4m%? zkKiJ~RYiOTNdpoH*@OgfVO>;^25~kaq!XE$)6HZT$V?-_MGhS9UHtdn|8UO#UnL?e zQ)nz%EFB>|EKn(Rw|xt|0z4oATmXL_Iv;j4^a$j)0M+ewzn0784d51dS+CcBG#ZT~ z;KhA)04{I^oQEnrEc3}^a*$4^&3HT>1Hvjna~#LDZToj7lli<*Lcn3rqT7gLVE{Kk zY2ia%EEc~grAkVvQm51T39NgbC%*5W0N;R5z^?E6$DZfO|A<D9h<^vH0)K%tpwH*? zzNTsWi9});U~JcQZP#^EhG7&U%S=SV=Anoj2kTv)jYgxLe!ss`tJMIoEQ`TlureGD zw?*VkL{0*1sCORgL;h?wTdP*9Mzh%jpw((osZ>^{)9D)EKeaJBxm<43G|i7d3Wx)# zY&QELpU-arPSgt@t1<<6<MH@cyWKwR^?H|uLgBS#S?^8Le4~`ofn*ewMIrP(aOq@( qR>Xkoz|Hp-P3ZZze<pNa{2KrdHt5<CJPp490000<MNUMnLSTaH0r4dO literal 332 zcmV-S0ki&zP)<h;3K|Lk000e1NJLTq000sI000sQ1^@s6R?d!B0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy?ny*JRCwBA{Qv(y12q5>1C;>P3}OKh zjEsyhzCD`!K|%(=f`$dk*8^ffpkM>CBA^8g1k8C4#FxNoK_)(Z`gESOw6r3r-T~^n z57d_gHwXy!QxH6k$X)|^!x72fV1xhs`SXE=g=GVfc>pTq02B)ViV0v1Y#ag2@csMu zt$ciZ3z38te){x@m6w+{8fWx_0vd*4VppzQIfAYMn;5}#boA&^A!5YPy@mlSEiIiu zkpsl9p+cfiG13e&G&D3jaNq#*f&~k%g7^su3EDt0V{B?+(ccNgW@JSDDIhLKHfR{; eeySM+5MTiP>stxO-1&b10000<MNUMnLSTY+vVf}q diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index f7b0bb4629f..a75d38d9671 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -535,15 +535,6 @@ <texture name="move_down_in.tga" preload="false" /> <texture name="move_down_out.tga" preload="false" /> - <texture name="tool_grab.tga" /> - <texture name="tool_grab_active.tga" /> - - <texture name="tool_face.tga" /> - <texture name="tool_face_active.tga" /> - - <texture name="tool_create.tga" /> - <texture name="tool_create_active.tga" /> - <texture name="up_arrow.tga" file_name="up_arrow.png" /> <texture name="down_arrow.tga" file_name="down_arrow.png" /> @@ -608,54 +599,6 @@ <texture name="icon_popular.tga" /> <texture name="icon_top_pick.tga" /> - <texture name="inv_folder_animation.tga" /> - <texture name="inv_folder_bodypart.tga" /> - <texture name="inv_folder_callingcard.tga" /> - <texture name="inv_folder_clothing.tga" /> - <texture name="inv_folder_current_outfit.tga" /> - <texture name="inv_folder_gesture.tga" /> - <texture name="inv_folder_landmark.tga" /> - <texture name="inv_folder_lostandfound.tga" /> - <texture name="inv_folder_my_outfits.tga" /> - <texture name="inv_folder_notecard.tga" /> - <texture name="inv_folder_object.tga" /> - <texture name="inv_folder_outfit.tga" /> - <texture name="inv_folder_plain_closed.tga" /> - <texture name="inv_folder_script.tga" /> - <texture name="inv_folder_snapshot.tga" /> - <texture name="inv_folder_sound.tga" /> - <texture name="inv_folder_texture.tga" /> - <texture name="inv_folder_trash.tga" /> - - <texture name="inv_item_animation.tga" /> - <texture name="inv_item_skin.tga" /> - <texture name="inv_item_callingcard_offline.tga" /> - <texture name="inv_item_callingcard_online.tga" /> - <texture name="inv_item_eyes.tga" /> - <texture name="inv_item_gesture.tga" /> - <texture name="inv_item_gloves.tga" /> - <texture name="inv_item_hair.tga" /> - <texture name="inv_item_jacket.tga" /> - <texture name="inv_item_landmark.tga" /> - <texture name="inv_item_landmark_visited.tga" /> - <texture name="inv_item_linkitem.tga" /> - <texture name="inv_item_linkfolder.tga" /> - <texture name="inv_item_notecard.tga" /> - <texture name="inv_item_object.tga" /> - <texture name="inv_item_object_multi.tga" /> - <texture name="inv_item_pants.tga" /> - <texture name="inv_item_script.tga" /> - <texture name="inv_item_shape.tga" /> - <texture name="inv_item_shirt.tga" /> - <texture name="inv_item_shoes.tga" /> - <texture name="inv_item_skirt.tga" /> - <texture name="inv_item_snapshot.tga" /> - <texture name="inv_item_socks.tga" /> - <texture name="inv_item_sound.tga" /> - <texture name="inv_item_texture.tga" /> - <texture name="inv_item_underpants.tga" /> - <texture name="inv_item_undershirt.tga" /> - <texture name="lag_status_critical.tga" /> <texture name="lag_status_good.tga" /> <texture name="lag_status_warning.tga" /> @@ -682,37 +625,6 @@ <texture name="notify_next.png" preload="true" /> <texture name="notify_box_icon.tga" /> - <texture name="object_cone.tga" /> - <texture name="object_cone_active.tga" /> - <texture name="object_cube.tga" /> - <texture name="object_cube_active.tga" /> - <texture name="object_cylinder.tga" /> - <texture name="object_cylinder_active.tga" /> - <texture name="object_grass.tga" /> - <texture name="object_grass_active.tga" /> - <texture name="object_hemi_cone.tga" /> - <texture name="object_hemi_cone_active.tga" /> - <texture name="object_hemi_cylinder.tga" /> - <texture name="object_hemi_cylinder_active.tga" /> - <texture name="object_hemi_sphere.tga" /> - <texture name="object_hemi_sphere_active.tga" /> - <texture name="object_prism.tga" /> - <texture name="object_prism_active.tga" /> - <texture name="object_pyramid.tga" /> - <texture name="object_pyramid_active.tga" /> - <texture name="object_ring.tga" /> - <texture name="object_ring_active.tga" /> - <texture name="object_sphere.tga" /> - <texture name="object_sphere_active.tga" /> - <texture name="object_tetrahedron.tga" /> - <texture name="object_tetrahedron_active.tga" /> - <texture name="object_torus.tga" /> - <texture name="object_torus_active.tga" /> - <texture name="object_tree.tga" /> - <texture name="object_tree_active.tga" /> - <texture name="object_tube.tga" /> - <texture name="object_tube_active.tga" /> - <texture name="pixiesmall.j2c" use_mips="true" /> <texture name="script_error.j2c" use_mips="true" /> <texture name="silhouette.j2c" use_mips="true" /> @@ -728,11 +640,6 @@ <texture name="status_no_push.tga" /> <texture name="status_no_scripts.tga" /> - <texture name="tool_dozer.tga" /> - <texture name="tool_dozer_active.tga" /> - <texture name="tool_zoom.tga" /> - <texture name="tool_zoom_active.tga" /> - <texture name="icn_active-speakers-dot-lvl0.tga" /> <texture name="icn_active-speakers-dot-lvl1.tga" /> <texture name="icn_active-speakers-dot-lvl2.tga" /> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 9bf3458d298..7b473ee2192 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -10,7 +10,7 @@ left="0" name="bottom_tray" top="28" - chrome="true" + chrome="true" border_visible="false" width="1000"> <layout_stack @@ -124,7 +124,7 @@ layout="topleft" min_height="28" name="movement_panel" - width="76" + width="80" min_width="76"> <button follows="left|right" @@ -136,7 +136,7 @@ name="movement_btn" tool_tip="Show/hide movement controls" top="3" - width="76"> + width="80"> <button.init_callback function="Button.SetDockableFloaterToggle" parameter="moveview" /> @@ -175,7 +175,7 @@ tool_tip="Show/hide camera controls" top="3" name="camera_btn" - width="76"> + width="80"> <button.init_callback function="Button.SetDockableFloaterToggle" parameter="camera" /> @@ -199,28 +199,19 @@ height="28" layout="topleft" name="snapshot_panel" - width="35"> - <split_button - arrow_position="right" + width="40"> + <button follows="left|right" height="23" left="0" + label="" layout="topleft" name="snapshots" - width="46" - top="3"> - <split_button.item - image_overlay="Snapshot_Off" - name="snapshot" - tool_tip="Take snapshot" - /> - <split_button.arrow_button - name="snapshot_settings" - image_overlay="Widget_UpArrow" - tool_tip="Snapshot and Preset Views" - width="18" + width="36" + top="3" + image_overlay="Snapshot_Off" + tool_tip="Take snapshot" /> - </split_button> </layout_panel> <layout_panel mouse_opaque="false" -- GitLab From 43c5ab0be2bf165c660439c3449247454d37e368 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Mon, 2 Nov 2009 14:11:07 -0800 Subject: [PATCH 017/306] EXT-1744 1-click Sit object not spawning an object inspector EXT-1810 Right clicking own avatar displayed semi-transparent menus EXT-1927 Hook up Push-to-talk in Preferences > Advanced reviewed by richard --- indra/newview/llfloaterpreference.cpp | 4 ++ indra/newview/llselectmgr.cpp | 7 +++ indra/newview/llselectmgr.h | 1 + indra/newview/lltoolpie.cpp | 8 ++- .../xui/en/panel_preferences_advanced.xml | 51 ++++++++++++------- 5 files changed, 51 insertions(+), 20 deletions(-) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 8b3391726a7..a199da3b00c 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -1043,11 +1043,15 @@ void LLFloaterPreference::onClickSetKey() void LLFloaterPreference::setKey(KEY key) { childSetValue("modifier_combo", LLKeyboard::stringFromKey(key)); + // update the control right away since we no longer wait for apply + getChild<LLUICtrl>("modifier_combo")->onCommit(); } void LLFloaterPreference::onClickSetMiddleMouse() { childSetValue("modifier_combo", "MiddleMouse"); + // update the control right away since we no longer wait for apply + getChild<LLUICtrl>("modifier_combo")->onCommit(); } void LLFloaterPreference::onClickSkipDialogs() diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index d68897b64f6..759c86f3a02 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -801,6 +801,8 @@ LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp, S32 return NULL; } + mHoverObjects->mPrimaryObject = objectp; + objectp = objectp->getRootEdit(); // is the requested object the same as the existing hover object root? @@ -834,6 +836,11 @@ LLSelectNode *LLSelectMgr::getHoverNode() return mHoverObjects->getFirstRootNode(); } +LLSelectNode *LLSelectMgr::getPrimaryHoverNode() +{ + return mHoverObjects->mSelectNodeMap[mHoverObjects->mPrimaryObject]; +} + void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp) { if (!objectp) diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 6e757ef976f..2050a73f267 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -404,6 +404,7 @@ class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr> LLObjectSelectionHandle setHoverObject(LLViewerObject *objectp, S32 face = -1); LLSelectNode *getHoverNode(); + LLSelectNode *getPrimaryHoverNode(); void highlightObjectOnly(LLViewerObject *objectp); void highlightObjectAndFamily(LLViewerObject *objectp); diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 7c17699bf98..b825bde912e 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -598,6 +598,9 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) static bool needs_tooltip(LLSelectNode* nodep) { + if (!nodep) + return false; + LLViewerObject* object = nodep->getObject(); LLViewerObject *parent = (LLViewerObject *)object->getParent(); if (object->flagHandleTouch() @@ -733,7 +736,10 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask) tooltip_msg.append( nodep->mName ); } - bool needs_tip = needs_tooltip(nodep); + // also check the primary node since sometimes it can have an action even though + // the root node doesn't + bool needs_tip = needs_tooltip(nodep) || + needs_tooltip(LLSelectMgr::getInstance()->getPrimaryHoverNode()); if (show_all_object_tips || needs_tip) { diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 91dcdce23bb..b8fc72b7549 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -240,8 +240,8 @@ Avatars: width="256" top_pad="5"/> <radio_group - enabled_control="ShowScriptErrors" - control_name="ShowScriptErrorsLocation" + enabled_control="ShowScriptErrors" + control_name="ShowScriptErrorsLocation" follows="top|left" draw_border="false" height="40" @@ -269,6 +269,8 @@ Avatars: </radio_group> <check_box follows="top|left" + enabled_control="EnableVoiceChat" + control_name="PushToTalkToggle" height="20" label="Use Push-to-talk in toggle mode" layout="topleft" @@ -279,6 +281,9 @@ Avatars: tool_tip="When in toggle mode, press and release the push-to-talk trigger to switch your microphone on and off. When not in toggle mode, the microphone is active only when the trigger is held down."/> <line_editor follows="top|left" + control_name="PushToTalkButton" + enabled="false" + enabled_control="EnableVoiceChat" height="19" left_delta="50" max_length="254" @@ -287,22 +292,30 @@ Avatars: top_pad="0" width="280" /> <button - follows="top|left" - height="20" - label="Set Key" - left_delta="0" - name="set_voice_hotkey_button" - width="115" - top_pad="5" /> + follows="top|left" + enabled_control="EnableVoiceChat" + height="20" + label="Set Key" + left_delta="0" + name="set_voice_hotkey_button" + width="115" + top_pad="5"> + <button.commit_callback + function="Pref.VoiceSetKey" /> + </button> <button - bottom_delta="0" - follows="left" - font="SansSerif" - halign="center" - height="20" - label="Middle Mouse Button" - left_delta="120" - mouse_opaque="true" - name="set_voice_middlemouse_button" - width="160" /> + bottom_delta="0" + enabled_control="EnableVoiceChat" + follows="left" + font="SansSerif" + halign="center" + height="20" + label="Middle Mouse Button" + left_delta="120" + mouse_opaque="true" + name="set_voice_middlemouse_button" + width="160"> + <button.commit_callback + function="Pref.VoiceSetMiddleMouse" /> + </button> </panel> -- GitLab From 2a79326ff63d26f6f7d51ae195dfc7ab4600b407 Mon Sep 17 00:00:00 2001 From: "Mark Palange (Mani)" <palange@lindenlab.com> Date: Mon, 2 Nov 2009 14:23:40 -0800 Subject: [PATCH 018/306] Removed tabs. Fixed errant 'else(APPLE)' --- indra/cmake/LLSharedLibs.cmake | 44 +++++++++++++++++----------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake index 3be22ab4012..a8c81609bb9 100644 --- a/indra/cmake/LLSharedLibs.cmake +++ b/indra/cmake/LLSharedLibs.cmake @@ -3,29 +3,29 @@ # search_dirs: a list of dirs to search for the dependencies # dst_path: path to copy deps to, relative to the output location of the target_exe macro(ll_deploy_sharedlibs_command target_exe search_dirs dst_path) - get_target_property(OUTPUT_LOCATION ${target_exe} LOCATION) + get_target_property(OUTPUT_LOCATION ${target_exe} LOCATION) - if(DARWIN) - get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE) - if(IS_BUNDLE) - get_filename_component(TARGET_FILE ${OUTPUT_LOCATION} NAME) - set(OUTPUT_PATH ${OUTPUT_LOCATION}.app/Contents/MacOS) - set(OUTPUT_LOCATION ${OUTPUT_PATH}/${TARGET_FILE}) - endif(IS_BUNDLE) - else(APPLE) - message(FATAL_ERROR "Only darwin currently supported!") - endif(DARWIN) - - add_custom_command( - TARGET ${target_exe} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - "-DBIN_NAME=\"${OUTPUT_LOCATION}\"" - "-DSEARCH_DIRS=\"${search_dirs}\"" - "-DDST_PATH=\"${OUTPUT_PATH}/${dst_path}\"" - "-P" - "${CMAKE_SOURCE_DIR}/cmake/DeploySharedLibs.cmake" - ) + if(DARWIN) + get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE) + if(IS_BUNDLE) + get_filename_component(TARGET_FILE ${OUTPUT_LOCATION} NAME) + set(OUTPUT_PATH ${OUTPUT_LOCATION}.app/Contents/MacOS) + set(OUTPUT_LOCATION ${OUTPUT_PATH}/${TARGET_FILE}) + endif(IS_BUNDLE) + else(DARWIN) + message(FATAL_ERROR "Only darwin currently supported!") + endif(DARWIN) + + add_custom_command( + TARGET ${target_exe} POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + "-DBIN_NAME=\"${OUTPUT_LOCATION}\"" + "-DSEARCH_DIRS=\"${search_dirs}\"" + "-DDST_PATH=\"${OUTPUT_PATH}/${dst_path}\"" + "-P" + "${CMAKE_SOURCE_DIR}/cmake/DeploySharedLibs.cmake" + ) endmacro(ll_deploy_sharedlibs_command) -- GitLab From 88ec0b0dca6c20d149e0cd5dc466d723964b02bd Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Mon, 2 Nov 2009 17:26:39 -0500 Subject: [PATCH 019/306] Main Inventory Panel layout fixes. --HG-- branch : avatar-pipeline --- .../default/xui/en/panel_main_inventory.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index b6218ad932e..fa73965fafe 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -8,7 +8,7 @@ min_height="350" min_width="240" name="inventory panel" - width="333"> + width="330"> <panel.string name="Title"> Things @@ -26,31 +26,31 @@ width="300" /> <tab_container follows="left|top|right|bottom" - height="508" + height="300" layout="topleft" left_delta="-4" name="inventory filter tabs" tab_position="top" top_pad="4" - width="463"> + width="305"> <inventory_panel follows="left|top|right|bottom" - height="491" + height="295" label="All Items" layout="topleft" left="1" name="All Items" top="16" - width="461" /> + width="290" /> <inventory_panel follows="left|top|right|bottom" - height="491" + height="295" label="Recent Items" layout="topleft" left_delta="0" name="Recent Items" top_delta="0" - width="461" /> + width="290" /> </tab_container> <menu_bar bg_visible="false" @@ -61,7 +61,7 @@ mouse_opaque="false" name="Inventory Menu" top_delta="-38" - width="461"> + width="290"> <menu height="101" label="File" -- GitLab From 03ff3dc57d4650c5451c2b304a2ee6fbee3ff74e Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Mon, 2 Nov 2009 14:58:24 -0800 Subject: [PATCH 020/306] Added hand-cursor to clickable text boxes, fixed hover_color warnings for login screen. Reviewed with Richard. --- indra/llui/lltextbox.cpp | 26 +++++++++++++++ indra/llui/lltextbox.h | 21 +++++------- .../skins/default/xui/en/panel_login.xml | 33 ------------------- 3 files changed, 34 insertions(+), 46 deletions(-) diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp index 20bceb46756..00f1d833a30 100644 --- a/indra/llui/lltextbox.cpp +++ b/indra/llui/lltextbox.cpp @@ -45,6 +45,9 @@ LLTextBox::LLTextBox(const LLTextBox::Params& p) mClickedCallback(NULL) {} +LLTextBox::~LLTextBox() +{} + BOOL LLTextBox::handleMouseDown(S32 x, S32 y, MASK mask) { BOOL handled = LLTextBase::handleMouseDown(x, y, mask); @@ -97,6 +100,18 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask) return handled; } +BOOL LLTextBox::handleHover(S32 x, S32 y, MASK mask) +{ + BOOL handled = LLTextBase::handleHover(x, y, mask); + if (!handled && mClickedCallback) + { + // Clickable text boxes change the cursor to a hand + LLUI::getWindow()->setCursor(UI_CURSOR_HAND); + return TRUE; + } + return handled; +} + void LLTextBox::setText(const LLStringExplicit& text) { // does string argument insertion @@ -105,6 +120,11 @@ void LLTextBox::setText(const LLStringExplicit& text) LLTextBase::setText(mText.getString()); } +void LLTextBox::setClickedCallback( boost::function<void (void*)> cb, void* userdata /*= NULL */ ) +{ + mClickedCallback = boost::bind(cb, userdata); +} + S32 LLTextBox::getTextPixelWidth() { return getContentsRect().getWidth(); @@ -115,6 +135,12 @@ S32 LLTextBox::getTextPixelHeight() return getContentsRect().getHeight(); } + +LLSD LLTextBox::getValue() const +{ + return LLSD(getText()); +} + BOOL LLTextBox::setTextArg( const std::string& key, const LLStringExplicit& text ) { mText.setArg(key, text); diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h index da0bcbe972d..73f8a7c299e 100644 --- a/indra/llui/lltextbox.h +++ b/indra/llui/lltextbox.h @@ -33,8 +33,6 @@ #ifndef LL_LLTEXTBOX_H #define LL_LLTEXTBOX_H -#include "v4color.h" -#include "llstring.h" #include "lluistring.h" #include "lltextbase.h" @@ -54,28 +52,25 @@ class LLTextBox : friend class LLUICtrlFactory; public: - virtual ~LLTextBox() {} + virtual ~LLTextBox(); - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); + /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); - /*virtual*/ void setText( const LLStringExplicit& text ); + /*virtual*/ void setText( const LLStringExplicit& text ); void setRightAlign() { mHAlign = LLFontGL::RIGHT; } void setHAlign( LLFontGL::HAlign align ) { mHAlign = align; } - void setClickedCallback( boost::function<void (void*)> cb, void* userdata = NULL ){ mClickedCallback = boost::bind(cb, userdata); } // mouse down and up within button - - //const LLFontGL* getFont() const { return mDefaultFont; } - //void setFont(const LLFontGL* font) { mDefaultFont = font; } + void setClickedCallback( boost::function<void (void*)> cb, void* userdata = NULL ); void reshapeToFitText(); - //const std::string& getText() const { return mText.getString(); } S32 getTextPixelWidth(); S32 getTextPixelHeight(); - virtual LLSD getValue() const { return LLSD(getText()); } - virtual BOOL setTextArg( const std::string& key, const LLStringExplicit& text ); + /*virtual*/ LLSD getValue() const; + /*virtual*/ BOOL setTextArg( const std::string& key, const LLStringExplicit& text ); protected: void onUrlLabelUpdated(const std::string &url, const std::string &label); diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index afe00271f7c..317c79e08f4 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -23,19 +23,15 @@ border_visible="false" bottom="600" follows="all" - layout="topleft" left="0" name="login_html" right="-1" start_url="" top="1" /> <text - type="string" - length="1" follows="left|bottom" font="SansSerif" height="16" - layout="topleft" left="32" name="first_name_text" top="530" @@ -46,7 +42,6 @@ follows="left|bottom" handle_edit_keys_directly="true" height="20" - layout="topleft" left_delta="0" max_length="31" name="first_name_edit" @@ -55,12 +50,9 @@ top_pad="2" width="120" /> <text - type="string" - length="1" follows="left|bottom" font="SansSerif" height="16" - layout="topleft" left="164" name="last_name_text" top="530" @@ -72,7 +64,6 @@ font="SansSerif" handle_edit_keys_directly="true" height="20" - layout="topleft" left_delta="0" max_length="31" name="last_name_edit" @@ -81,12 +72,9 @@ top_pad="2" width="120" /> <text - type="string" - length="1" follows="left|bottom" font="SansSerif" height="16" - layout="topleft" left="296" name="password_text" top="530" @@ -98,7 +86,6 @@ font="SansSerif" handle_edit_keys_directly="true" height="20" - layout="topleft" left_delta="0" max_length="16" name="password_edit" @@ -124,12 +111,9 @@ name="server_combo" width="100" /> <text - type="string" - length="1" follows="left|bottom" font="SansSerif" height="16" - layout="topleft" left="32" name="start_location_text" top="576" @@ -141,7 +125,6 @@ control_name="LoginLocation" follows="left|bottom" height="23" - layout="topleft" left_pad="0" max_chars="128" name="start_location_combo" @@ -165,20 +148,14 @@ follows="left|bottom" height="16" label="Remember password" - layout="topleft" left_pad="10" name="remember_check" top_delta="3" width="138" /> <text - type="string" - length="1" follows="right|bottom" halign="right" height="16" - hover="true" - hover_color="0.2 0.45 0.72 1" - layout="topleft" left="-210" name="create_new_account_text" top="539" @@ -186,14 +163,9 @@ Create a new account </text> <text - type="string" - length="1" follows="right|bottom" halign="right" height="16" - hover="true" - hover_color="0.2 0.45 0.72 1" - layout="topleft" left_delta="0" name="forgot_password_text" top_pad="4" @@ -201,14 +173,9 @@ Forgot your name or password? </text> <text - type="string" - length="1" follows="right|bottom" halign="right" height="16" - hover="true" - hover_color="0.2 0.45 0.72 1" - layout="topleft" left="-310" name="channel_text" top="579" -- GitLab From a6b6ca9a24cbc1bfe0b3e45602e1eda1e1e9c8f9 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Mon, 2 Nov 2009 14:58:39 -0800 Subject: [PATCH 021/306] made floater close/minimize buttons "chrome" so they don't take keyboard focus removed LLHudView::colorFromType which was unused reviewed by James --- indra/llui/llfloater.cpp | 1 + indra/newview/llhudview.cpp | 14 -------------- indra/newview/llhudview.h | 2 -- indra/newview/llviewermenu.cpp | 1 - 4 files changed, 1 insertion(+), 17 deletions(-) diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 8c72b079eee..26a8b6c48f8 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1839,6 +1839,7 @@ void LLFloater::buildButtons() p.follows.flags(FOLLOWS_TOP|FOLLOWS_RIGHT); p.tool_tip(sButtonToolTips[i]); p.scale_image(true); + p.chrome(true); LLButton* buttonp = LLUICtrlFactory::create<LLButton>(p); addChild(buttonp); diff --git a/indra/newview/llhudview.cpp b/indra/newview/llhudview.cpp index 027cd2ab077..261d9f1df78 100644 --- a/indra/newview/llhudview.cpp +++ b/indra/newview/llhudview.cpp @@ -71,20 +71,6 @@ void LLHUDView::draw() LLView::draw(); } - -// public -const LLColor4& LLHUDView::colorFromType(S32 type) -{ - switch (type) - { - case 0: - return LLColor4::green; - default: - return LLColor4::black; - } -} - - /*virtual*/ BOOL LLHUDView::handleMouseDown(S32 x, S32 y, MASK mask) { diff --git a/indra/newview/llhudview.h b/indra/newview/llhudview.h index 05ff9c8596b..0946e2c5c83 100644 --- a/indra/newview/llhudview.h +++ b/indra/newview/llhudview.h @@ -47,8 +47,6 @@ class LLHUDView virtual void draw(); - const LLColor4& colorFromType(S32 type); - protected: /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); }; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 864cf9d57bb..c801ffc01e9 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -145,7 +145,6 @@ #include "llmenucommands.h" #include "llmenugl.h" #include "llmimetypes.h" -#include "llmorphview.h" #include "llmoveview.h" #include "llmutelist.h" #include "llnotify.h" -- GitLab From da3f4c402dd95e52186309af925b41ee946ef3dc Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Mon, 2 Nov 2009 18:01:39 -0500 Subject: [PATCH 022/306] MainInventory aesthetic fixes. --HG-- branch : avatar-pipeline --- .../skins/default/xui/en/panel_main_inventory.xml | 2 +- indra/newview/skins/default/xui/en/panel_side_tray.xml | 1 + .../skins/default/xui/en/sidepanel_inventory.xml | 10 +++++----- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index fa73965fafe..c50278ff8cc 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -60,7 +60,7 @@ left_delta="0" mouse_opaque="false" name="Inventory Menu" - top_delta="-38" + top_delta="-45" width="290"> <menu height="101" diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml index 190dbe2b0fe..777d5b48fe8 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml @@ -134,6 +134,7 @@ tab_title="Inventory" description="Browse your inventory." image="TabIcon_Inventory_Off" + image_selected="TabIcon_Inventory_Selected" mouse_opaque="false" background_visible="true" > diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml index 3b3fbcb936e..79a1cc945d0 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml @@ -3,7 +3,7 @@ background_visible="true" follows="all" height="400" - label="Places" + label="Things" layout="topleft" min_height="350" min_width="240" @@ -11,12 +11,12 @@ width="333"> <tab_container follows="all" - height="360" + height="390" layout="topleft" left="9" name="Inventory Tabs" tab_position="top" - top="30" + top="0" width="313" tab_height="0" visible="true"> @@ -29,7 +29,7 @@ name="panel_main_inventory" top="15" label="" - height="300" + height="330" width="467"> <panel height="25" @@ -37,7 +37,7 @@ left="0" help_topic="objects_button_tab" name="button_panel" - bottom="5" + bottom="0" width="313"> <button enabled="true" -- GitLab From 44eea89d001ccb09343dda973af0dabecb1ec48d Mon Sep 17 00:00:00 2001 From: Rick Pasetto <rick@lindenlab.com> Date: Mon, 2 Nov 2009 15:10:08 -0800 Subject: [PATCH 023/306] Make the "default hover controls" be the "authored" controls (and I made a debug setting that can override this) --- indra/newview/app_settings/settings.xml | 12 +++++++++++- indra/newview/llpanelprimmediacontrols.cpp | 9 ++++++--- indra/newview/llviewermedia.h | 2 +- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c4722b772e1..768fdd41030 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5294,7 +5294,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>PluginInstancesCPULimit</key> <map> <key>Comment</key> @@ -5360,6 +5359,17 @@ <string>U32</string> <key>Value</key> <integer>13</integer> + </map> + <key>PrimMediaControlsUseHoverControlSet</key> + <map> + <key>Comment</key> + <string>Whether or not hovering over prim media uses minimal "hover" controls or the authored control set.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> </map> <key>PrimMediaMaxRetries</key> <map> diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index e4b32c4820d..58ca481b77b 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -228,7 +228,10 @@ void LLPanelPrimMediaControls::updateShape() bool can_navigate = parcel->getMediaAllowNavigate(); bool enabled = false; - bool has_focus = media_impl->hasFocus(); + // There is no such thing as "has_focus" being different from normal controls set + // anymore (as of user feedback from bri 10/09). So we cheat here and force 'has_focus' + // to 'true' (or, actually, we use a setting) + bool has_focus = (gSavedSettings.getBOOL("PrimMediaControlsUseHoverControlSet")) ? media_impl->hasFocus() : true; setVisible(enabled); if (objectp) @@ -310,8 +313,8 @@ void LLPanelPrimMediaControls::updateShape() fwd_ctrl->setEnabled(has_focus); media_address_ctrl->setVisible(false); media_address_ctrl->setEnabled(false); - media_play_slider_panel->setVisible(!mini_controls); - media_play_slider_panel->setEnabled(!mini_controls); + media_play_slider_panel->setVisible(has_focus && !mini_controls); + media_play_slider_panel->setEnabled(has_focus && !mini_controls); volume_ctrl->setVisible(has_focus); volume_up_ctrl->setVisible(has_focus); diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 517a76ce3dd..d6dde0c93e3 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -258,7 +258,7 @@ class LLViewerMediaImpl void calculateInterest(); F64 getInterest() const { return mInterest; }; F64 getApproximateTextureInterest(); - S32 getProximity() { return mProximity; }; + S32 getProximity() const { return mProximity; }; // Mark this object as being used in a UI panel instead of on a prim // This will be used as part of the interest sorting algorithm. -- GitLab From 8af4e3359cb01f62089787aba7a436b7856d6098 Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Mon, 2 Nov 2009 23:44:21 +0000 Subject: [PATCH 024/306] EXT-1588: Remove support for automatic hyperlinking of URLs in notecards until this issue can be addressed correctly. The best solution would be to implement support for alternative display strings for URL text segments. That way, the raw text will contain the original URL string, but we can show a display-only alternate label for the URL. Until I get round to doing this, I'm turning off URL hyperlinking in notecards to avoid the potential for data loss. --- indra/newview/skins/default/xui/en/floater_preview_notecard.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml index 37970550548..b44de8e1782 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml @@ -75,7 +75,7 @@ left="4" max_length="65536" name="Notecard Editor" - allow_html="true" + allow_html="false" handle_edit_keys_directly="true" tab_group="1" top="46" -- GitLab From f344c5b7ecf721329ef87044eeec06c6669618d8 Mon Sep 17 00:00:00 2001 From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com> Date: Mon, 2 Nov 2009 18:50:50 -0500 Subject: [PATCH 025/306] Fix for EXT-894: upload anim preview was using bad texture data instead of grey. Switched rendering of dummy mesh for previews (anim, etc) to use default image, instead of default avatar image. -Reviewed by nyx --- indra/newview/llviewerjointmesh.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index cd60a8d5606..5b8902dec48 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -582,7 +582,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy) } else { - gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR)); + gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT)); } if (gRenderForSelect) -- GitLab From a100a6e07f8b6ea16313e25e3249736228d9b03c Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Mon, 2 Nov 2009 19:05:20 -0500 Subject: [PATCH 026/306] EXT-1947 EXT-1945 EXT-1919 EXT-2088 appearance edit dummy param + animation fix Several fixes here: 1) minor rename in argument of setIsDummy 2) corrected parameter set_by_user to calls of setVisualParamWeight where we shouldn't be animating 3) ensured finally that mIsDummy is set properly for all wearable parameters 4) ensured that mIsDUmmy is set properly for non-wearable based parameters on your own avatar Code reviewed by Bigpapi --- indra/llcharacter/llvisualparam.h | 2 +- indra/newview/lldriverparam.cpp | 1 - indra/newview/llscrollingpanelparam.cpp | 8 ++++---- indra/newview/llvoavatarself.cpp | 5 ++++- indra/newview/llwearable.cpp | 19 ++++++------------- 5 files changed, 15 insertions(+), 20 deletions(-) diff --git a/indra/llcharacter/llvisualparam.h b/indra/llcharacter/llvisualparam.h index affc49debfe..eec56d78443 100644 --- a/indra/llcharacter/llvisualparam.h +++ b/indra/llcharacter/llvisualparam.h @@ -151,7 +151,7 @@ class LLVisualParam virtual void setAnimating(BOOL is_animating) { mIsAnimating = is_animating && !mIsDummy; } BOOL getAnimating() const { return mIsAnimating; } - void setIsDummy(BOOL is_self) { mIsDummy = is_self; } + void setIsDummy(BOOL is_dummy) { mIsDummy = is_dummy; } protected: F32 mCurWeight; // current weight diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp index 527656ab6b8..45f4b4fbd04 100644 --- a/indra/newview/lldriverparam.cpp +++ b/indra/newview/lldriverparam.cpp @@ -224,7 +224,6 @@ void LLDriverParam::setAvatar(LLVOAvatar *avatarp) } } *new_param = *this; - new_param->setIsDummy(FALSE); return new_param; } diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index 0a520ff65fb..1fbaeb94f53 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -209,7 +209,7 @@ void LLScrollingPanelParam::onSliderMoved(LLUICtrl* ctrl, void* userdata) F32 new_weight = self->percentToWeight( (F32)slider->getValue().asReal() ); if (current_weight != new_weight ) { - self->mWearable->setVisualParamWeight( param->getID(), new_weight, TRUE ); + self->mWearable->setVisualParamWeight( param->getID(), new_weight, FALSE ); gAgent.getAvatarObject()->updateVisualParams(); } } @@ -298,7 +298,7 @@ void LLScrollingPanelParam::onHintHeldDown( LLVisualParamHint* hint ) if (slider->getMinValue() < new_percent && new_percent < slider->getMaxValue()) { - mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight, TRUE); + mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight, FALSE); gAgent.getAvatarObject()->updateVisualParams(); slider->setValue( weightToPercent( new_weight ) ); @@ -330,7 +330,7 @@ void LLScrollingPanelParam::onHintMinMouseUp( void* userdata ) if (slider->getMinValue() < new_percent && new_percent < slider->getMaxValue()) { - self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, TRUE); + self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, FALSE); slider->setValue( self->weightToPercent( new_weight ) ); } } @@ -364,7 +364,7 @@ void LLScrollingPanelParam::onHintMaxMouseUp( void* userdata ) if (slider->getMinValue() < new_percent && new_percent < slider->getMaxValue()) { - self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, TRUE); + self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, FALSE); slider->setValue( self->weightToPercent( new_weight ) ); } } diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 758db538a28..34e6b0f89e4 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -205,7 +205,10 @@ void LLVOAvatarSelf::markDead() param; param = (LLViewerVisualParam*) getNextVisualParam()) { - param->setIsDummy(TRUE); + if (param->getWearableType() != WT_INVALID) + { + param->setIsDummy(TRUE); + } } return success; diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 4cd29bb8386..c32fc2bae15 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -60,7 +60,7 @@ static std::string asset_id_to_filename(const LLUUID &asset_id); LLWearable::LLWearable(const LLTransactionID& transaction_id) : mDefinitionVersion(LLWearable::sCurrentDefinitionVersion), - mType(WT_SHAPE) + mType(WT_INVALID) { mTransactionID = transaction_id; mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID()); @@ -68,7 +68,7 @@ LLWearable::LLWearable(const LLTransactionID& transaction_id) : LLWearable::LLWearable(const LLAssetID& asset_id) : mDefinitionVersion( LLWearable::sCurrentDefinitionVersion ), - mType(WT_SHAPE) + mType(WT_INVALID) { mAssetID = asset_id; mTransactionID.setNull(); @@ -181,13 +181,7 @@ void LLWearable::createVisualParams() { if (param->getWearableType() == mType) { - if (mVisualParamIndexMap[param->getID()]) - { - delete mVisualParamIndexMap[param->getID()]; - } - LLViewerVisualParam *new_param = param->cloneParam(this); - new_param->setIsDummy(FALSE); - mVisualParamIndexMap[param->getID()] = new_param; + addVisualParam(param->cloneParam(this)); } } @@ -750,7 +744,8 @@ void LLWearable::copyDataFrom(const LLWearable* src) mDescription = src->mDescription; mPermissions = src->mPermissions; mSaleInfo = src->mSaleInfo; - mType = src->mType; + + setType(src->mType); mSavedVisualParamMap.clear(); // Deep copy of mVisualParamMap (copies only those params that are current, filling in defaults where needed) @@ -763,9 +758,6 @@ void LLWearable::copyDataFrom(const LLWearable* src) S32 id = param->getID(); F32 weight = src->getVisualParamWeight(id); mSavedVisualParamMap[id] = weight; - - // Clones a visual param from src and adds it to this wearable. Value of param is taken from current value of source param, not saved. - addVisualParam(param->cloneParam(this)); } } @@ -860,6 +852,7 @@ void LLWearable::addVisualParam(LLVisualParam *param) { delete mVisualParamIndexMap[param->getID()]; } + param->setIsDummy(FALSE); mVisualParamIndexMap[param->getID()] = param; } -- GitLab From 2f2bdd83d6e078fb6cdcbb0ba0a9eaa38d45cc90 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Tue, 3 Nov 2009 00:47:23 +0000 Subject: [PATCH 027/306] For QAR-2014 : Sandbox for testing FolderTypes [VIEWER] svn merge -r136068:136089 svn+ssh://svn.lindenlab.com/svn/linden/branches/avatar-pipeline/folder-types__merge__viewer2.0.0-3-r135948 into svn+ssh://svn.lindenlab.com/svn/linden/branches/viewer/viewer-2.0.0-3 Infrastructure changes for cleaning up Asset/Folder types. Associated sim changes are only so that the sim still compiles. --- indra/llcommon/CMakeLists.txt | 2 + indra/llcommon/llassettype.cpp | 154 +++------- indra/llcommon/llassettype.h | 62 +---- indra/llcommon/llfoldertype.cpp | 165 +++++++++++ indra/llcommon/llfoldertype.h | 123 ++++++++ indra/llinventory/llinventory.cpp | 62 +---- indra/llinventory/llinventory.h | 13 +- indra/llinventory/llinventorytype.cpp | 34 --- indra/llinventory/llinventorytype.h | 3 +- .../llinventory/tests/inventorymisc_test.cpp | 4 +- indra/llmessage/lltransfersourceasset.cpp | 2 - indra/newview/CMakeLists.txt | 6 +- indra/newview/app_settings/foldertypes.xml | 25 +- indra/newview/llagentwearables.cpp | 17 +- indra/newview/llappearancemgr.cpp | 22 +- indra/newview/llassetuploadresponders.cpp | 2 +- indra/newview/llavataractions.cpp | 4 +- indra/newview/llfavoritesbar.cpp | 4 +- indra/newview/llfloateranimpreview.cpp | 2 +- indra/newview/llfloaterbulkpermission.cpp | 1 - indra/newview/llfloaterbuy.cpp | 2 +- indra/newview/llfloaterbuycontents.cpp | 2 +- indra/newview/llfloaterinventory.cpp | 27 +- indra/newview/llfloaterinventory.h | 5 +- indra/newview/llfloaternamedesc.cpp | 2 +- indra/newview/llfloateropenobject.cpp | 4 +- indra/newview/llfloaterreporter.cpp | 4 +- indra/newview/llfloatersnapshot.cpp | 2 +- indra/newview/llfloaterworldmap.cpp | 2 +- indra/newview/llfolderview.cpp | 5 +- indra/newview/llfolderview.h | 2 +- indra/newview/llfoldervieweventlistener.h | 3 +- indra/newview/llfolderviewitem.cpp | 10 +- indra/newview/llfriendcard.cpp | 8 +- indra/newview/llinventorybridge.cpp | 96 +++---- indra/newview/llinventorybridge.h | 8 +- indra/newview/llinventorymodel.cpp | 65 ++--- indra/newview/llinventorymodel.h | 13 +- indra/newview/lllandmarkactions.cpp | 8 +- indra/newview/llpanelcontents.cpp | 3 +- indra/newview/llpanellandmarks.cpp | 2 +- indra/newview/llpanelplaceinfo.cpp | 8 +- indra/newview/llpanelplaces.cpp | 4 +- indra/newview/llpreview.cpp | 5 +- indra/newview/llpreviewgesture.cpp | 4 +- indra/newview/llresourcedata.h | 3 +- indra/newview/llselectmgr.cpp | 2 +- indra/newview/llstartup.cpp | 6 +- indra/newview/lltexturectrl.cpp | 4 +- indra/newview/lltoastgroupnotifypanel.cpp | 1 - indra/newview/lltooldraganddrop.cpp | 21 +- indra/newview/llviewerassettype.cpp | 114 ++++++++ indra/newview/llviewerassettype.h | 54 ++++ indra/newview/llviewerfoldertype.cpp | 263 ++++++++++++++++++ indra/newview/llviewerfoldertype.h | 57 ++++ indra/newview/llviewerinventory.cpp | 112 ++++---- indra/newview/llviewerinventory.h | 4 +- indra/newview/llviewermenu.cpp | 13 +- indra/newview/llviewermenufile.cpp | 16 +- indra/newview/llviewermenufile.h | 6 +- indra/newview/llviewermessage.cpp | 36 +-- indra/newview/llviewertexteditor.cpp | 20 +- indra/newview/llvoavatarself.cpp | 35 +-- indra/newview/llwearable.cpp | 2 +- .../default/textures/inv_folder_inbox.tga | Bin 0 -> 2085 bytes .../skins/default/xui/en/panel_landmarks.xml | 18 +- 66 files changed, 1164 insertions(+), 624 deletions(-) create mode 100644 indra/llcommon/llfoldertype.cpp create mode 100644 indra/llcommon/llfoldertype.h create mode 100644 indra/newview/llviewerassettype.cpp create mode 100644 indra/newview/llviewerassettype.h create mode 100644 indra/newview/llviewerfoldertype.cpp create mode 100644 indra/newview/llviewerfoldertype.h create mode 100644 indra/newview/skins/default/textures/inv_folder_inbox.tga diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 7468e3dde46..910ba958f62 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -39,6 +39,7 @@ set(llcommon_SOURCE_FILES llfile.cpp llfindlocale.cpp llfixedbuffer.cpp + llfoldertype.cpp llformat.cpp llframetimer.cpp llheartbeat.cpp @@ -134,6 +135,7 @@ set(llcommon_HEADER_FILES llfile.h llfindlocale.h llfixedbuffer.h + llfoldertype.h llformat.h llframetimer.h llhash.h diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp index 0b016b81fbe..41f0a461153 100644 --- a/indra/llcommon/llassettype.cpp +++ b/indra/llcommon/llassettype.cpp @@ -43,30 +43,21 @@ struct AssetEntry : public LLDictionaryEntry { AssetEntry(const char *desc_name, - const char *type_name, // 8 character limit! - const char *human_name, // for decoding to human readable form; put any and as many printable characters you want in each one - const char *category_name, // used by llinventorymodel when creating new categories - EDragAndDropType dad_type, - bool can_link, // can you create a link to this type? - bool is_protected) // can the viewer change categories of this type? + const char *type_name, // 8 character limit! + const char *human_name, // for decoding to human readable form; put any and as many printable characters you want in each one + bool can_link) // can you create a link to this type? : LLDictionaryEntry(desc_name), mTypeName(type_name), mHumanName(human_name), - mCategoryName(category_name), - mDadType(dad_type), - mCanLink(can_link), - mIsProtected(is_protected) + mCanLink(can_link) { llassert(strlen(mTypeName) <= 8); } const char *mTypeName; const char *mHumanName; - const char *mCategoryName; - EDragAndDropType mDadType; bool mCanLink; - bool mIsProtected; }; class LLAssetDictionary : public LLSingleton<LLAssetDictionary>, @@ -78,48 +69,32 @@ class LLAssetDictionary : public LLSingleton<LLAssetDictionary>, LLAssetDictionary::LLAssetDictionary() { - // DESCRIPTION TYPE NAME HUMAN NAME CATEGORY NAME DRAG&DROP CAN LINK? PROTECTED? - // |--------------------|-----------|-------------------|-------------------|---------------|-----------|-----------| - addEntry(LLAssetType::AT_TEXTURE, new AssetEntry("TEXTURE", "texture", "texture", "Textures", DAD_TEXTURE, TRUE, TRUE)); - addEntry(LLAssetType::AT_SOUND, new AssetEntry("SOUND", "sound", "sound", "Sounds", DAD_SOUND, TRUE, TRUE)); - addEntry(LLAssetType::AT_CALLINGCARD, new AssetEntry("CALLINGCARD", "callcard", "calling card", "Calling Cards", DAD_CALLINGCARD, TRUE, TRUE)); - addEntry(LLAssetType::AT_LANDMARK, new AssetEntry("LANDMARK", "landmark", "landmark", "Landmarks", DAD_LANDMARK, TRUE, TRUE)); - addEntry(LLAssetType::AT_SCRIPT, new AssetEntry("SCRIPT", "script", "legacy script", "Scripts", DAD_NONE, TRUE, TRUE)); - addEntry(LLAssetType::AT_CLOTHING, new AssetEntry("CLOTHING", "clothing", "clothing", "Clothing", DAD_CLOTHING, TRUE, TRUE)); - addEntry(LLAssetType::AT_OBJECT, new AssetEntry("OBJECT", "object", "object", "Objects", DAD_OBJECT, TRUE, TRUE)); - addEntry(LLAssetType::AT_NOTECARD, new AssetEntry("NOTECARD", "notecard", "note card", "Notecards", DAD_NOTECARD, TRUE, TRUE)); - addEntry(LLAssetType::AT_CATEGORY, new AssetEntry("CATEGORY", "category", "folder", "New Folder", DAD_CATEGORY, TRUE, TRUE)); - addEntry(LLAssetType::AT_ROOT_CATEGORY, new AssetEntry("ROOT_CATEGORY", "root", "root", "Inventory", DAD_ROOT_CATEGORY, TRUE, TRUE)); - addEntry(LLAssetType::AT_LSL_TEXT, new AssetEntry("LSL_TEXT", "lsltext", "lsl2 script", "Scripts", DAD_SCRIPT, TRUE, TRUE)); - addEntry(LLAssetType::AT_LSL_BYTECODE, new AssetEntry("LSL_BYTECODE", "lslbyte", "lsl bytecode", "Scripts", DAD_NONE, TRUE, TRUE)); - addEntry(LLAssetType::AT_TEXTURE_TGA, new AssetEntry("TEXTURE_TGA", "txtr_tga", "tga texture", "Uncompressed Images", DAD_NONE, TRUE, TRUE)); - addEntry(LLAssetType::AT_BODYPART, new AssetEntry("BODYPART", "bodypart", "body part", "Body Parts", DAD_BODYPART, TRUE, TRUE)); - addEntry(LLAssetType::AT_TRASH, new AssetEntry("TRASH", "trash", "trash", "Trash", DAD_NONE, FALSE, TRUE)); - addEntry(LLAssetType::AT_SNAPSHOT_CATEGORY, new AssetEntry("SNAPSHOT_CATEGORY", "snapshot", "snapshot", "Photo Album", DAD_NONE, FALSE, TRUE)); - addEntry(LLAssetType::AT_LOST_AND_FOUND, new AssetEntry("LOST_AND_FOUND", "lstndfnd", "lost and found", "Lost And Found", DAD_NONE, FALSE, TRUE)); - addEntry(LLAssetType::AT_SOUND_WAV, new AssetEntry("SOUND_WAV", "snd_wav", "sound", "Uncompressed SoundS", DAD_NONE, TRUE, TRUE)); - addEntry(LLAssetType::AT_IMAGE_TGA, new AssetEntry("IMAGE_TGA", "img_tga", "targa image", "Uncompressed Images", DAD_NONE, TRUE, TRUE)); - addEntry(LLAssetType::AT_IMAGE_JPEG, new AssetEntry("IMAGE_JPEG", "jpeg", "jpeg image", "Uncompressed Images", DAD_NONE, TRUE, TRUE)); - addEntry(LLAssetType::AT_ANIMATION, new AssetEntry("ANIMATION", "animatn", "animation", "Animations", DAD_ANIMATION, TRUE, TRUE)); - addEntry(LLAssetType::AT_GESTURE, new AssetEntry("GESTURE", "gesture", "gesture", "Gestures", DAD_GESTURE, TRUE, TRUE)); - addEntry(LLAssetType::AT_SIMSTATE, new AssetEntry("SIMSTATE", "simstate", "simstate", "New Folder", DAD_NONE, FALSE, TRUE)); - addEntry(LLAssetType::AT_FAVORITE, new AssetEntry("FAVORITE", "favorite", "favorite", "favorite", DAD_NONE, FALSE, TRUE)); - - addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "symbolic link", "Link", DAD_LINK, FALSE, TRUE)); - addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "symbolic folder link", "New Folder", DAD_LINK, FALSE, TRUE)); - - for (S32 ensemble_num = S32(LLAssetType::AT_FOLDER_ENSEMBLE_START); - ensemble_num <= S32(LLAssetType::AT_FOLDER_ENSEMBLE_END); - ensemble_num++) - { - addEntry(LLAssetType::EType(ensemble_num), new AssetEntry("ENSEMBLE", "ensemble", "ensemble", "New Folder", DAD_CATEGORY, FALSE, FALSE)); - } - - addEntry(LLAssetType::AT_CURRENT_OUTFIT, new AssetEntry("CURRENT", "current", "current outfit", "Current Look", DAD_CATEGORY, FALSE, TRUE)); - addEntry(LLAssetType::AT_OUTFIT, new AssetEntry("OUTFIT", "outfit", "outfit", "New Look", DAD_CATEGORY, FALSE, FALSE)); - addEntry(LLAssetType::AT_MY_OUTFITS, new AssetEntry("MY_OUTFITS", "my_otfts", "my outfits", "My Looks", DAD_CATEGORY, FALSE, TRUE)); - - addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, "New Folder", DAD_NONE, FALSE, FALSE)); + // DESCRIPTION TYPE NAME HUMAN NAME CAN LINK? + // |--------------------|-----------|-------------------|-----------| + addEntry(LLAssetType::AT_TEXTURE, new AssetEntry("TEXTURE", "texture", "texture", FALSE)); + addEntry(LLAssetType::AT_SOUND, new AssetEntry("SOUND", "sound", "sound", FALSE)); + addEntry(LLAssetType::AT_CALLINGCARD, new AssetEntry("CALLINGCARD", "callcard", "calling card", FALSE)); + addEntry(LLAssetType::AT_LANDMARK, new AssetEntry("LANDMARK", "landmark", "landmark", FALSE)); + addEntry(LLAssetType::AT_SCRIPT, new AssetEntry("SCRIPT", "script", "legacy script", FALSE)); + addEntry(LLAssetType::AT_CLOTHING, new AssetEntry("CLOTHING", "clothing", "clothing", TRUE)); + addEntry(LLAssetType::AT_OBJECT, new AssetEntry("OBJECT", "object", "object", TRUE)); + addEntry(LLAssetType::AT_NOTECARD, new AssetEntry("NOTECARD", "notecard", "note card", FALSE)); + addEntry(LLAssetType::AT_CATEGORY, new AssetEntry("CATEGORY", "category", "folder", TRUE)); + addEntry(LLAssetType::AT_LSL_TEXT, new AssetEntry("LSL_TEXT", "lsltext", "lsl2 script", FALSE)); + addEntry(LLAssetType::AT_LSL_BYTECODE, new AssetEntry("LSL_BYTECODE", "lslbyte", "lsl bytecode", FALSE)); + addEntry(LLAssetType::AT_TEXTURE_TGA, new AssetEntry("TEXTURE_TGA", "txtr_tga", "tga texture", FALSE)); + addEntry(LLAssetType::AT_BODYPART, new AssetEntry("BODYPART", "bodypart", "body part", TRUE)); + addEntry(LLAssetType::AT_SOUND_WAV, new AssetEntry("SOUND_WAV", "snd_wav", "sound", FALSE)); + addEntry(LLAssetType::AT_IMAGE_TGA, new AssetEntry("IMAGE_TGA", "img_tga", "targa image", FALSE)); + addEntry(LLAssetType::AT_IMAGE_JPEG, new AssetEntry("IMAGE_JPEG", "jpeg", "jpeg image", FALSE)); + addEntry(LLAssetType::AT_ANIMATION, new AssetEntry("ANIMATION", "animatn", "animation", FALSE)); + addEntry(LLAssetType::AT_GESTURE, new AssetEntry("GESTURE", "gesture", "gesture", TRUE)); + addEntry(LLAssetType::AT_SIMSTATE, new AssetEntry("SIMSTATE", "simstate", "simstate", FALSE)); + + addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "symbolic link", FALSE)); + addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "symbolic folder link", FALSE)); + + addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, FALSE)); }; // static @@ -140,8 +115,7 @@ const std::string &LLAssetType::getDesc(LLAssetType::EType asset_type) } else { - static const std::string error_string = "BAD TYPE"; - return error_string; + return badLookup(); } } @@ -156,7 +130,7 @@ const char *LLAssetType::lookup(LLAssetType::EType asset_type) } else { - return "-1"; + return badLookup().c_str(); } } @@ -166,6 +140,7 @@ LLAssetType::EType LLAssetType::lookup(const char* name) return lookup(ll_safe_string(name)); } +// static LLAssetType::EType LLAssetType::lookup(const std::string& type_name) { const LLAssetDictionary *dict = LLAssetDictionary::getInstance(); @@ -193,7 +168,7 @@ const char *LLAssetType::lookupHumanReadable(LLAssetType::EType asset_type) } else { - return NULL; + return badLookup().c_str(); } } @@ -203,6 +178,7 @@ LLAssetType::EType LLAssetType::lookupHumanReadable(const char* name) return lookupHumanReadable(ll_safe_string(name)); } +// static LLAssetType::EType LLAssetType::lookupHumanReadable(const std::string& readable_name) { const LLAssetDictionary *dict = LLAssetDictionary::getInstance(); @@ -219,32 +195,6 @@ LLAssetType::EType LLAssetType::lookupHumanReadable(const std::string& readable_ return AT_NONE; } -// static -const char *LLAssetType::lookupCategoryName(LLAssetType::EType asset_type) -{ - const LLAssetDictionary *dict = LLAssetDictionary::getInstance(); - const AssetEntry *entry = dict->lookup(asset_type); - if (entry) - { - return entry->mCategoryName; - } - else - { - return "New Folder"; - } -} - -// static -EDragAndDropType LLAssetType::lookupDragAndDropType(EType asset_type) -{ - const LLAssetDictionary *dict = LLAssetDictionary::getInstance(); - const AssetEntry *entry = dict->lookup(asset_type); - if (entry) - return entry->mDadType; - else - return DAD_NONE; -} - // static bool LLAssetType::lookupCanLink(EType asset_type) { @@ -269,36 +219,8 @@ bool LLAssetType::lookupIsLinkType(EType asset_type) } // static -// Only ensembles and plain folders aren't protected. "Protected" means -// you can't change certain properties such as their type. -bool LLAssetType::lookupIsProtectedCategoryType(EType asset_type) -{ - const LLAssetDictionary *dict = LLAssetDictionary::getInstance(); - const AssetEntry *entry = dict->lookup(asset_type); - if (entry) - { - return entry->mIsProtected; - } - return true; -} - -// static -bool LLAssetType::lookupIsEnsembleCategoryType(EType asset_type) -{ - return (asset_type >= AT_FOLDER_ENSEMBLE_START && - asset_type <= AT_FOLDER_ENSEMBLE_END); -} - -// static. Generate a good default description -void LLAssetType::generateDescriptionFor(LLAssetType::EType asset_type, - std::string& description) +const std::string &LLAssetType::badLookup() { - const S32 BUF_SIZE = 30; - char time_str[BUF_SIZE]; /* Flawfinder: ignore */ - time_t now; - time(&now); - memset(time_str, '\0', BUF_SIZE); - strftime(time_str, BUF_SIZE - 1, "%Y-%m-%d %H:%M:%S ", localtime(&now)); - description.assign(time_str); - description.append(LLAssetType::lookupHumanReadable(asset_type)); + static const std::string sBadLookup = "llassettype_bad_lookup"; + return sBadLookup; } diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h index 5e511885416..10e21b4d1f5 100644 --- a/indra/llcommon/llassettype.h +++ b/indra/llcommon/llassettype.h @@ -94,18 +94,6 @@ class LLAssetType AT_BODYPART = 13, // A collection of textures and parameters that can be worn by an avatar. - AT_TRASH = 14, - // Only to be used as a marker for a category preferred type. - // Using this, we can throw things in the trash before completely deleting. - - AT_SNAPSHOT_CATEGORY = 15, - // A marker for a folder meant for snapshots. - // No actual assets will be snapshots, though if there were, you - // could interpret them as textures. - - AT_LOST_AND_FOUND = 16, - // Used to stuff lost&found items into. - AT_SOUND_WAV = 17, // Uncompressed sound. @@ -126,37 +114,21 @@ class LLAssetType AT_SIMSTATE = 22, // Simstate file. - AT_FAVORITE = 23, - // favorite items - AT_LINK = 24, // Inventory symbolic link AT_LINK_FOLDER = 25, // Inventory folder link - - AT_FOLDER_ENSEMBLE_START = 26, - AT_FOLDER_ENSEMBLE_END = 45, - // This range is reserved for special clothing folder types. - - AT_CURRENT_OUTFIT = 46, - // Current outfit - - AT_OUTFIT = 47, - // Predefined outfit ("look") - - AT_MY_OUTFITS = 48, - // Folder that holds your outfits. - - AT_COUNT = 49, + AT_COUNT = 26, // +*********************************************************+ // | TO ADD AN ELEMENT TO THIS ENUM: | // +*********************************************************+ // | 1. INSERT BEFORE AT_COUNT | // | 2. INCREMENT AT_COUNT BY 1 | - // | 3. ADD TO LLAssetDictionary in LLAssetType.cpp | - // | 3. ADD TO DEFAULT_ASSET_FOR_INV in LLInventoryType.cpp | + // | 3. ADD TO LLAssetType.cpp | + // | 4. ADD TO LLViewerAssetType.cpp | + // | 5. ADD TO DEFAULT_ASSET_FOR_INV in LLInventoryType.cpp | // +*********************************************************+ AT_NONE = -1 @@ -172,33 +144,17 @@ class LLAssetType static EType lookupHumanReadable(const std::string& readable_name); static const char* lookupHumanReadable(EType asset_type); - // Generate a good default description. You may want to add a verb - // or agent name after this depending on your application. - static void generateDescriptionFor(LLAssetType::EType asset_type, - std::string& description); - static EType getType(const std::string& desc_name); static const std::string& getDesc(EType asset_type); - static EDragAndDropType lookupDragAndDropType(EType asset_type); static bool lookupCanLink(EType asset_type); static bool lookupIsLinkType(EType asset_type); - static const char* lookupCategoryName(EType asset_type); - static bool lookupIsProtectedCategoryType(EType asset_type); - static bool lookupIsEnsembleCategoryType(EType asset_type); - - /* TODO: Change return types from "const char *" to "const std::string &". - This is fairly straightforward, but requires changing some calls to use .c_str(). - e.g.: - - fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); - + fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType).c_str()); - */ - -private: - // don't instantiate or derive one of these objects - LLAssetType( void ) {} - ~LLAssetType( void ) {} + static const std::string& badLookup(); // error string when a lookup fails + +protected: + LLAssetType() {} + ~LLAssetType() {} }; #endif // LL_LLASSETTYPE_H diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp new file mode 100644 index 00000000000..9107b11597e --- /dev/null +++ b/indra/llcommon/llfoldertype.cpp @@ -0,0 +1,165 @@ +/** + * @file llfoldertype.cpp + * @brief Implementatino of LLFolderType functionality. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "llfoldertype.h" +#include "lldictionary.h" +#include "llmemory.h" +#include "llsingleton.h" + +///---------------------------------------------------------------------------- +/// Class LLFolderType +///---------------------------------------------------------------------------- +struct FolderEntry : public LLDictionaryEntry +{ + FolderEntry(const std::string &type_name, // 8 character limit! + bool is_protected) // can the viewer change categories of this type? + : + LLDictionaryEntry(type_name), + mIsProtected(is_protected) + { + llassert(type_name.length() <= 8); + } + + const bool mIsProtected; +}; + +class LLFolderDictionary : public LLSingleton<LLFolderDictionary>, + public LLDictionary<LLFolderType::EType, FolderEntry> +{ +public: + LLFolderDictionary(); +}; + +LLFolderDictionary::LLFolderDictionary() +{ + // TYPE NAME PROTECTED + // |-----------|---------| + addEntry(LLFolderType::FT_TEXTURE, new FolderEntry("texture", TRUE)); + addEntry(LLFolderType::FT_SOUND, new FolderEntry("sound", TRUE)); + addEntry(LLFolderType::FT_CALLINGCARD, new FolderEntry("callcard", TRUE)); + addEntry(LLFolderType::FT_LANDMARK, new FolderEntry("landmark", TRUE)); + addEntry(LLFolderType::FT_CLOTHING, new FolderEntry("clothing", TRUE)); + addEntry(LLFolderType::FT_OBJECT, new FolderEntry("object", TRUE)); + addEntry(LLFolderType::FT_NOTECARD, new FolderEntry("notecard", TRUE)); + addEntry(LLFolderType::FT_CATEGORY, new FolderEntry("category", TRUE)); + addEntry(LLFolderType::FT_ROOT_CATEGORY, new FolderEntry("root", TRUE)); + addEntry(LLFolderType::FT_LSL_TEXT, new FolderEntry("lsltext", TRUE)); + addEntry(LLFolderType::FT_BODYPART, new FolderEntry("bodypart", TRUE)); + addEntry(LLFolderType::FT_TRASH, new FolderEntry("trash", TRUE)); + addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new FolderEntry("snapshot", TRUE)); + addEntry(LLFolderType::FT_LOST_AND_FOUND, new FolderEntry("lstndfnd", TRUE)); + addEntry(LLFolderType::FT_ANIMATION, new FolderEntry("animatn", TRUE)); + addEntry(LLFolderType::FT_GESTURE, new FolderEntry("gesture", TRUE)); + addEntry(LLFolderType::FT_FAVORITE, new FolderEntry("favorite", TRUE)); + + for (S32 ensemble_num = S32(LLFolderType::FT_ENSEMBLE_START); ensemble_num <= S32(LLFolderType::FT_ENSEMBLE_END); ensemble_num++) + { + addEntry(LLFolderType::EType(ensemble_num), new FolderEntry("ensemble", FALSE)); + } + + addEntry(LLFolderType::FT_CURRENT_OUTFIT, new FolderEntry("current", TRUE)); + addEntry(LLFolderType::FT_OUTFIT, new FolderEntry("outfit", FALSE)); + addEntry(LLFolderType::FT_MY_OUTFITS, new FolderEntry("my_otfts", TRUE)); + addEntry(LLFolderType::FT_INBOX, new FolderEntry("inbox", TRUE)); + + addEntry(LLFolderType::FT_NONE, new FolderEntry("-1", FALSE)); +}; + +// static +LLFolderType::EType LLFolderType::lookup(const std::string& name) +{ + return LLFolderDictionary::getInstance()->lookup(name); +} + +// static +const std::string &LLFolderType::lookup(LLFolderType::EType folder_type) +{ + const FolderEntry *entry = LLFolderDictionary::getInstance()->lookup(folder_type); + if (entry) + { + return entry->mName; + } + else + { + return badLookup(); + } +} + +// static +// Only ensembles and plain folders aren't protected. "Protected" means +// you can't change certain properties such as their type. +bool LLFolderType::lookupIsProtectedType(EType folder_type) +{ + const LLFolderDictionary *dict = LLFolderDictionary::getInstance(); + const FolderEntry *entry = dict->lookup(folder_type); + if (entry) + { + return entry->mIsProtected; + } + return true; +} + +// static +bool LLFolderType::lookupIsEnsembleType(EType folder_type) +{ + return (folder_type >= FT_ENSEMBLE_START && + folder_type <= FT_ENSEMBLE_END); +} + +// static +LLAssetType::EType LLFolderType::folderTypeToAssetType(LLFolderType::EType folder_type) +{ + if (LLAssetType::lookup(LLAssetType::EType(folder_type)) == LLAssetType::badLookup()) + { + llwarns << "Converting to unknown asset type " << folder_type << llendl; + } + return (LLAssetType::EType)folder_type; +} + +// static +LLFolderType::EType LLFolderType::assetTypeToFolderType(LLAssetType::EType asset_type) +{ + if (LLFolderType::lookup(LLFolderType::EType(asset_type)) == LLFolderType::badLookup()) + { + llwarns << "Converting to unknown folder type " << asset_type << llendl; + } + return (LLFolderType::EType)asset_type; +} + +// static +const std::string &LLFolderType::badLookup() +{ + static const std::string sBadLookup = "llfoldertype_bad_lookup"; + return sBadLookup; +} diff --git a/indra/llcommon/llfoldertype.h b/indra/llcommon/llfoldertype.h new file mode 100644 index 00000000000..ecb37d6ddec --- /dev/null +++ b/indra/llcommon/llfoldertype.h @@ -0,0 +1,123 @@ +/** + * @file llfoldertype.h + * @brief Declaration of LLFolderType. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLFOLDERTYPE_H +#define LL_LLFOLDERTYPE_H + +#include <string> +#include "llassettype.h" + +// This class handles folder types (similar to assettype, except for folders) +// and operations on those. +class LLFolderType +{ +public: + // ! BACKWARDS COMPATIBILITY ! Folder type enums must match asset type enums. + enum EType + { + FT_TEXTURE = 0, + + FT_SOUND = 1, + + FT_CALLINGCARD = 2, + + FT_LANDMARK = 3, + + // FT_SCRIPT = 4, + + FT_CLOTHING = 5, + + FT_OBJECT = 6, + + FT_NOTECARD = 7, + + FT_CATEGORY = 8, + + FT_ROOT_CATEGORY = 9, + + FT_LSL_TEXT = 10, + + // FT_LSL_BYTECODE = 11, + // FT_TEXTURE_TGA = 12, + + FT_BODYPART = 13, + + FT_TRASH = 14, + + FT_SNAPSHOT_CATEGORY = 15, + + FT_LOST_AND_FOUND = 16, + + // FT_SOUND_WAV = 17, + // FT_IMAGE_TGA = 18, + // FT_IMAGE_JPEG = 19, + + FT_ANIMATION = 20, + + FT_GESTURE = 21, + + // FT_SIMSTATE = 22, + + FT_FAVORITE = 23, + + FT_ENSEMBLE_START = 26, + FT_ENSEMBLE_END = 45, + // This range is reserved for special clothing folder types. + + FT_CURRENT_OUTFIT = 46, + FT_OUTFIT = 47, + FT_MY_OUTFITS = 48, + + FT_INBOX = 49, + + FT_COUNT = 50, + + FT_NONE = -1 + }; + + static EType lookup(const std::string& type_name); + static const std::string& lookup(EType folder_type); + + static bool lookupIsProtectedType(EType folder_type); + static bool lookupIsEnsembleType(EType folder_type); + + static LLAssetType::EType folderTypeToAssetType(LLFolderType::EType folder_type); + static LLFolderType::EType assetTypeToFolderType(LLAssetType::EType asset_type); + + static const std::string& badLookup(); // error string when a lookup fails + +protected: + LLFolderType() {} + ~LLFolderType() {} +}; + +#endif // LL_LLFOLDERTYPE_H diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp index e2a77f1d1e5..b800f239e16 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -1291,7 +1291,7 @@ BOOL item_date_sort( LLInventoryItem* a, LLInventoryItem* b ) LLInventoryCategory::LLInventoryCategory( const LLUUID& uuid, const LLUUID& parent_uuid, - LLAssetType::EType preferred_type, + LLFolderType::EType preferred_type, const std::string& name) : LLInventoryObject(uuid, parent_uuid, LLAssetType::AT_CATEGORY, name), mPreferredType(preferred_type) @@ -1299,7 +1299,7 @@ LLInventoryCategory::LLInventoryCategory( } LLInventoryCategory::LLInventoryCategory() : - mPreferredType(LLAssetType::AT_NONE) + mPreferredType(LLFolderType::FT_NONE) { mType = LLAssetType::AT_CATEGORY; } @@ -1321,12 +1321,12 @@ void LLInventoryCategory::copyCategory(const LLInventoryCategory* other) mPreferredType = other->mPreferredType; } -LLAssetType::EType LLInventoryCategory::getPreferredType() const +LLFolderType::EType LLInventoryCategory::getPreferredType() const { return mPreferredType; } -void LLInventoryCategory::setPreferredType(LLAssetType::EType type) +void LLInventoryCategory::setPreferredType(LLFolderType::EType type) { mPreferredType = type; } @@ -1372,13 +1372,13 @@ bool LLInventoryCategory::fromLLSD(const LLSD& sd) if (sd.has(w)) { S8 type = (U8)sd[w].asInteger(); - mPreferredType = static_cast<LLAssetType::EType>(type); + mPreferredType = static_cast<LLFolderType::EType>(type); } w = INV_ASSET_TYPE_LABEL_WS; if (sd.has(w)) { S8 type = (U8)sd[w].asInteger(); - mPreferredType = static_cast<LLAssetType::EType>(type); + mPreferredType = static_cast<LLFolderType::EType>(type); } w = INV_NAME_LABEL; @@ -1400,7 +1400,7 @@ void LLInventoryCategory::unpackMessage(LLMessageSystem* msg, msg->getUUIDFast(block, _PREHASH_ParentID, mParentUUID, block_num); S8 type; msg->getS8Fast(block, _PREHASH_Type, type, block_num); - mPreferredType = static_cast<LLAssetType::EType>(type); + mPreferredType = static_cast<LLFolderType::EType>(type); msg->getStringFast(block, _PREHASH_Name, mName, block_num); LLStringUtil::replaceNonstandardASCII(mName, ' '); } @@ -1449,7 +1449,7 @@ BOOL LLInventoryCategory::importFile(LLFILE* fp) } else if(0 == strcmp("pref_type", keyword)) { - mPreferredType = LLAssetType::lookup(valuestr); + mPreferredType = LLFolderType::lookup(valuestr); } else if(0 == strcmp("name", keyword)) { @@ -1481,7 +1481,7 @@ BOOL LLInventoryCategory::exportFile(LLFILE* fp, BOOL) const mParentUUID.toString(uuid_str); fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str()); fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); - fprintf(fp, "\t\tpref_type\t%s\n", LLAssetType::lookup(mPreferredType)); + fprintf(fp, "\t\tpref_type\t%s\n", LLFolderType::lookup(mPreferredType).c_str()); fprintf(fp, "\t\tname\t%s|\n", mName.c_str()); fprintf(fp,"\t}\n"); return TRUE; @@ -1528,7 +1528,7 @@ BOOL LLInventoryCategory::importLegacyStream(std::istream& input_stream) } else if(0 == strcmp("pref_type", keyword)) { - mPreferredType = LLAssetType::lookup(valuestr); + mPreferredType = LLFolderType::lookup(valuestr); } else if(0 == strcmp("name", keyword)) { @@ -1560,7 +1560,7 @@ BOOL LLInventoryCategory::exportLegacyStream(std::ostream& output_stream, BOOL) mParentUUID.toString(uuid_str); output_stream << "\t\tparent_id\t" << uuid_str << "\n"; output_stream << "\t\ttype\t" << LLAssetType::lookup(mType) << "\n"; - output_stream << "\t\tpref_type\t" << LLAssetType::lookup(mPreferredType) << "\n"; + output_stream << "\t\tpref_type\t" << LLFolderType::lookup(mPreferredType) << "\n"; output_stream << "\t\tname\t" << mName.c_str() << "|\n"; output_stream << "\t}\n"; return TRUE; @@ -1596,38 +1596,6 @@ LLSD ll_create_sd_from_inventory_item(LLPointer<LLInventoryItem> item) return rv; } -/* deprecated, use LLInventoryItem::fromLLSD() instead -LLPointer<LLInventoryItem> ll_create_item_from_sd(const LLSD& sd_item) -{ - LLPointer<LLInventoryItem> rv = new LLInventoryItem; - rv->setUUID(sd_item[INV_ITEM_ID_LABEL].asUUID()); - rv->setParent(sd_item[INV_PARENT_ID_LABEL].asUUID()); - rv->rename(sd_item[INV_NAME_LABEL].asString()); - rv->setType( - LLAssetType::lookup(sd_item[INV_ASSET_TYPE_LABEL].asString())); - if (sd_item.has("shadow_id")) - { - LLUUID asset_id = sd_item["shadow_id"]; - LLXORCipher cipher(MAGIC_ID.mData, UUID_BYTES); - cipher.decrypt(asset_id.mData, UUID_BYTES); - rv->setAssetUUID(asset_id); - } - if (sd_item.has(INV_ASSET_ID_LABEL)) - { - rv->setAssetUUID(sd_item[INV_ASSET_ID_LABEL].asUUID()); - } - rv->setDescription(sd_item[INV_DESC_LABEL].asString()); - rv->setSaleInfo(ll_sale_info_from_sd(sd_item[INV_SALE_INFO_LABEL])); - rv->setPermissions(ll_permissions_from_sd(sd_item[INV_PERMISSIONS_LABEL])); - rv->setInventoryType( - LLInventoryType::lookup( - sd_item[INV_INVENTORY_TYPE_LABEL].asString())); - rv->setFlags((U32)(sd_item[INV_FLAGS_LABEL].asInteger())); - rv->setCreationDate(sd_item[INV_CREATION_DATE_LABEL].asInteger()); - return rv; -} -*/ - LLSD ll_create_sd_from_inventory_category(LLPointer<LLInventoryCategory> cat) { LLSD rv; @@ -1642,10 +1610,10 @@ LLSD ll_create_sd_from_inventory_category(LLPointer<LLInventoryCategory> cat) rv[INV_PARENT_ID_LABEL] = cat->getParentUUID(); rv[INV_NAME_LABEL] = cat->getName(); rv[INV_ASSET_TYPE_LABEL] = LLAssetType::lookup(cat->getType()); - if(LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())) + if(LLFolderType::lookupIsProtectedType(cat->getPreferredType())) { rv[INV_PREFERRED_TYPE_LABEL] = - LLAssetType::lookup(cat->getPreferredType()); + LLFolderType::lookup(cat->getPreferredType()).c_str(); } return rv; } @@ -1659,7 +1627,7 @@ LLPointer<LLInventoryCategory> ll_create_category_from_sd(const LLSD& sd_cat) rv->setType( LLAssetType::lookup(sd_cat[INV_ASSET_TYPE_LABEL].asString())); rv->setPreferredType( - LLAssetType::lookup( - sd_cat[INV_PREFERRED_TYPE_LABEL].asString())); + LLFolderType::lookup( + sd_cat[INV_PREFERRED_TYPE_LABEL].asString())); return rv; } diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h index 64af6c94f5d..52bbd2001df 100644 --- a/indra/llinventory/llinventory.h +++ b/indra/llinventory/llinventory.h @@ -37,6 +37,7 @@ #include "llassetstorage.h" #include "lldarray.h" +#include "llfoldertype.h" #include "llinventorytype.h" #include "llmemtype.h" #include "llpermissions.h" @@ -318,15 +319,15 @@ class LLInventoryCategory : public LLInventoryObject public: MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY); LLInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid, - LLAssetType::EType preferred_type, + LLFolderType::EType preferred_type, const std::string& name); LLInventoryCategory(); LLInventoryCategory(const LLInventoryCategory* other); void copyCategory(const LLInventoryCategory* other); // LLRefCount requires custom copy // accessors and mutators - LLAssetType::EType getPreferredType() const; - void setPreferredType(LLAssetType::EType type); + LLFolderType::EType getPreferredType() const; + void setPreferredType(LLFolderType::EType type); // For messaging system support virtual void packMessage(LLMessageSystem* msg) const; virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0); @@ -342,10 +343,8 @@ class LLInventoryCategory : public LLInventoryObject virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const; protected: - // The type of asset that this category was "meant" to hold - // (although it may in fact hold any type). - LLAssetType::EType mPreferredType; - + // May be the type that this category was "meant" to hold (although it may hold any type). + LLFolderType::EType mPreferredType; }; diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp index a445466b26a..0e71c0d12d8 100644 --- a/indra/llinventory/llinventorytype.cpp +++ b/indra/llinventory/llinventorytype.cpp @@ -79,24 +79,16 @@ LLInventoryDictionary::LLInventoryDictionary() addEntry(LLInventoryType::IT_SOUND, new InventoryEntry("sound", "sound", 1, LLAssetType::AT_SOUND)); addEntry(LLInventoryType::IT_CALLINGCARD, new InventoryEntry("callcard", "calling card", 1, LLAssetType::AT_CALLINGCARD)); addEntry(LLInventoryType::IT_LANDMARK, new InventoryEntry("landmark", "landmark", 1, LLAssetType::AT_LANDMARK)); - //addEntry(LLInventoryType::IT_SCRIPT, new InventoryEntry(NULL,NULL)); - //addEntry(LLInventoryType::IT_CLOTHING, new InventoryEntry(NULL,NULL)); addEntry(LLInventoryType::IT_OBJECT, new InventoryEntry("object", "object", 1, LLAssetType::AT_OBJECT)); addEntry(LLInventoryType::IT_NOTECARD, new InventoryEntry("notecard", "note card", 1, LLAssetType::AT_NOTECARD)); addEntry(LLInventoryType::IT_CATEGORY, new InventoryEntry("category", "folder" )); addEntry(LLInventoryType::IT_ROOT_CATEGORY, new InventoryEntry("root", "root" )); addEntry(LLInventoryType::IT_LSL, new InventoryEntry("script", "script", 2, LLAssetType::AT_LSL_TEXT, LLAssetType::AT_LSL_BYTECODE)); - //addEntry(LLInventoryType::IT_LSL_BYTECODE, new InventoryEntry(NULL,NULL)); - //addEntry(LLInventoryType::IT_TEXTURE_TGA, new InventoryEntry(NULL,NULL)); - //addEntry(LLInventoryType::IT_BODYPART, new InventoryEntry(NULL,NULL)); - //addEntry(LLInventoryType::IT_TRASH, new InventoryEntry(NULL,NULL)); addEntry(LLInventoryType::IT_SNAPSHOT, new InventoryEntry("snapshot", "snapshot", 1, LLAssetType::AT_TEXTURE)); - //addEntry(LLInventoryType::IT_LOST_AND_FOUND, new InventoryEntry(NULL,NULL, )); addEntry(LLInventoryType::IT_ATTACHMENT, new InventoryEntry("attach", "attachment", 1, LLAssetType::AT_OBJECT)); addEntry(LLInventoryType::IT_WEARABLE, new InventoryEntry("wearable", "wearable", 2, LLAssetType::AT_CLOTHING, LLAssetType::AT_BODYPART)); addEntry(LLInventoryType::IT_ANIMATION, new InventoryEntry("animation", "animation", 1, LLAssetType::AT_ANIMATION)); addEntry(LLInventoryType::IT_GESTURE, new InventoryEntry("gesture", "gesture", 1, LLAssetType::AT_GESTURE)); - addEntry(LLInventoryType::IT_FAVORITE, new InventoryEntry("favorite", "favorite", 1, LLAssetType::AT_FAVORITE)); } @@ -128,35 +120,9 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] = LLInventoryType::IT_ANIMATION, // AT_ANIMATION LLInventoryType::IT_GESTURE, // AT_GESTURE LLInventoryType::IT_NONE, // AT_SIMSTATE - LLInventoryType::IT_FAVORITE, // AT_FAVORITE LLInventoryType::IT_NONE, // AT_LINK LLInventoryType::IT_NONE, // AT_LINK_FOLDER - - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - - LLInventoryType::IT_CATEGORY, // AT_CURRENT_OUTFIT - LLInventoryType::IT_CATEGORY, // AT_OUTFIT - LLInventoryType::IT_CATEGORY, // AT_MY_OUTFITS }; // static diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h index 14b28bfe4b8..e515b8a304b 100644 --- a/indra/llinventory/llinventorytype.h +++ b/indra/llinventory/llinventorytype.h @@ -67,8 +67,7 @@ class LLInventoryType IT_WEARABLE = 18, IT_ANIMATION = 19, IT_GESTURE = 20, - IT_FAVORITE = 21, - IT_COUNT = 22, + IT_COUNT = 21, IT_NONE = -1 }; diff --git a/indra/llinventory/tests/inventorymisc_test.cpp b/indra/llinventory/tests/inventorymisc_test.cpp index 770594dc9df..c797a70c506 100644 --- a/indra/llinventory/tests/inventorymisc_test.cpp +++ b/indra/llinventory/tests/inventorymisc_test.cpp @@ -94,7 +94,7 @@ LLPointer<LLInventoryCategory> create_random_inventory_cat() LLPointer<LLInventoryCategory> cat = new LLInventoryCategory( item_id, parent_id, - LLAssetType::AT_NONE, + LLFolderType::FT_NONE, std::string("Sample category")); return cat; } @@ -452,7 +452,7 @@ namespace tut ensure_equals("4.type::getType() failed", dst->getType(), src->getType()); ensure_equals("5.preferred type::getPreferredType() failed", dst->getPreferredType(), src->getPreferredType()); - src->setPreferredType( LLAssetType::AT_TEXTURE); + src->setPreferredType( LLFolderType::FT_TEXTURE); sd = ll_create_sd_from_inventory_category(src); dst = ll_create_category_from_sd(sd); ensure_equals("6.preferred type::getPreferredType() failed", dst->getPreferredType(), src->getPreferredType()); diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp index 5a1cd95ffcd..7332f5c9540 100644 --- a/indra/llmessage/lltransfersourceasset.cpp +++ b/indra/llmessage/lltransfersourceasset.cpp @@ -270,7 +270,6 @@ bool is_asset_fetch_by_id_allowed(LLAssetType::EType type) case LLAssetType::AT_BODYPART: case LLAssetType::AT_ANIMATION: case LLAssetType::AT_GESTURE: - case LLAssetType::AT_FAVORITE: rv = true; break; default: @@ -293,7 +292,6 @@ bool is_asset_id_knowable(LLAssetType::EType type) case LLAssetType::AT_BODYPART: case LLAssetType::AT_ANIMATION: case LLAssetType::AT_GESTURE: - case LLAssetType::AT_FAVORITE: case LLAssetType::AT_LINK: case LLAssetType::AT_LINK_FOLDER: rv = true; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 26170d17137..f27d949faf4 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -214,7 +214,6 @@ set(viewer_SOURCE_FILES llfloaterwhitelistentry.cpp llfloaterwindlight.cpp llfloaterworldmap.cpp - llfoldertype.cpp llfolderview.cpp llfolderviewitem.cpp llfollowcam.cpp @@ -427,11 +426,13 @@ set(viewer_SOURCE_FILES llvectorperfoptions.cpp llviewchildren.cpp llviewerassetstorage.cpp + llviewerassettype.cpp llvieweraudio.cpp llviewercamera.cpp llviewercontrol.cpp llviewerdisplay.cpp llviewerfloaterreg.cpp + llviewerfoldertype.cpp llviewergenericmessage.cpp llviewergesture.cpp llviewerhelp.cpp @@ -686,7 +687,6 @@ set(viewer_HEADER_FILES llfloaterwhitelistentry.h llfloaterwindlight.h llfloaterworldmap.h - llfoldertype.h llfolderview.h llfoldervieweventlistener.h llfolderviewitem.h @@ -899,12 +899,14 @@ set(viewer_HEADER_FILES llvectorperfoptions.h llviewchildren.h llviewerassetstorage.h + llviewerassettype.h llvieweraudio.h llviewerbuild.h llviewercamera.h llviewercontrol.h llviewerdisplay.h llviewerfloaterreg.h + llviewerfoldertype.h llviewergenericmessage.h llviewergesture.h llviewerhelp.h diff --git a/indra/newview/app_settings/foldertypes.xml b/indra/newview/app_settings/foldertypes.xml index 2038779c4f5..0d539177f38 100644 --- a/indra/newview/app_settings/foldertypes.xml +++ b/indra/newview/app_settings/foldertypes.xml @@ -1,66 +1,61 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <ensemble_defs> <ensemble - asset_num="-1" - xui_name="default" - icon_name="inv_plain_closed.tga" - /> - <ensemble - asset_num="27" + foldertype_num="27" xui_name="head" icon_name="inv_folder_outfit_head.tga" allowed="hair,eyes" /> <ensemble - asset_num="28" + foldertype_num="28" xui_name="gloves" icon_name="inv_folder_outfit_gloves.tga" allowed="gloves" /> <ensemble - asset_num="29" + foldertype_num="29" xui_name="jacket" icon_name="inv_folder_outfit_jacket.tga" allowed="jacket" /> <ensemble - asset_num="30" + foldertype_num="30" xui_name="pants" icon_name="inv_folder_outfit_pants.tga" allowed="pants,underpants" /> <ensemble - asset_num="31" + foldertype_num="31" xui_name="shape" icon_name="inv_folder_outfit_shape.tga" allowed="shape,skin,hair,eyes" /> <ensemble - asset_num="32" + foldertype_num="32" xui_name="shoes" icon_name="inv_folder_outfit_shoes.tga" allowed="shoes,socks" /> <ensemble - asset_num="33" + foldertype_num="33" xui_name="shirt" icon_name="inv_folder_outfit_shirt.tga" allowed="shirt,undershirt" /> <ensemble - asset_num="34" + foldertype_num="34" xui_name="skirt" icon_name="inv_folder_outfit_skirt.tga" allowed="" /> <ensemble - asset_num="35" + foldertype_num="35" xui_name="underpants" icon_name="inv_folder_outfit_underpants.tga" allowed="underpants" /> <ensemble - asset_num="36" + foldertype_num="36" xui_name="undershirt" icon_name="inv_folder_outfit_undershirt.tga" allowed="undershirt" diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index b9a0b4293dd..953769de085 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -433,7 +433,7 @@ void LLAgentWearables::saveWearableAs(const EWearableType type, if (save_in_lost_and_found) { category_id = gInventory.findCategoryUUIDForType( - LLAssetType::AT_LOST_AND_FOUND); + LLFolderType::FT_LOST_AND_FOUND); } else { @@ -839,7 +839,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs } // Get the UUID of the current outfit folder (will be created if it doesn't exist) - LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); LLInitialWearablesFetch* outfit = new LLInitialWearablesFetch(); @@ -980,8 +980,7 @@ void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 inde // Add a new one in the lost and found folder. // (We used to overwrite the "not found" one, but that could potentially // destory content.) JC - LLUUID lost_and_found_id = - gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); LLPointer<LLInventoryCallback> cb = new addWearableToAgentInventoryCallback( LLPointer<LLRefCount>(NULL), @@ -1122,8 +1121,8 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name, // First, make a folder in the Clothes directory. LLUUID folder_id = gInventory.createNewCategory( - gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING), - LLAssetType::AT_NONE, + gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING), + LLFolderType::FT_NONE, new_folder_name); bool found_first_item = false; @@ -1256,10 +1255,10 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name) } // First, make a folder in the My Outfits directory. - LLUUID parent_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_MY_OUTFITS); + const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); LLUUID folder_id = gInventory.createNewCategory( parent_id, - LLAssetType::AT_OUTFIT, + LLFolderType::FT_OUTFIT, new_folder_name); LLAppearanceManager::shallowCopyCategory(LLAppearanceManager::getCOF(),folder_id, NULL); @@ -2019,7 +2018,7 @@ void LLInitialWearablesFetch::processWearablesMessage() { if (!mAgentInitialWearables.empty()) // We have an empty current outfit folder, use the message data instead. { - LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); for (U8 i = 0; i < mAgentInitialWearables.size(); ++i) { // Populate the current outfit folder with links to the wearables passed in the message diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 4e022aeb299..cc118a6690b 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -130,11 +130,11 @@ void LLOutfitObserver::done() { if(LLInventoryType::IT_GESTURE == item->getInventoryType()) { - pid = gInventory.findCategoryUUIDForType(LLAssetType::AT_GESTURE); + pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE); } else { - pid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); } break; } @@ -146,7 +146,7 @@ void LLOutfitObserver::done() LLUUID cat_id = gInventory.createNewCategory( pid, - LLAssetType::AT_NONE, + LLFolderType::FT_NONE, name); mCatID = cat_id; LLPointer<LLInventoryCallback> cb = new LLWearInventoryCategoryCallback(mCatID, mAppend); @@ -353,7 +353,7 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory /* static */ LLUUID LLAppearanceManager::getCOF() { - return gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); } // Update appearance from outfit folder. @@ -370,12 +370,12 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo else { LLViewerInventoryCategory* catp = gInventory.getCategory(category); - if (catp->getPreferredType() == LLAssetType::AT_NONE || - LLAssetType::lookupIsEnsembleCategoryType(catp->getPreferredType())) + if (catp->getPreferredType() == LLFolderType::FT_NONE || + LLFolderType::lookupIsEnsembleType(catp->getPreferredType())) { updateCOFFromCategory(category, append); // append is false - rebuild COF. } - else if (catp->getPreferredType() == LLAssetType::AT_OUTFIT) + else if (catp->getPreferredType() == LLFolderType::FT_OUTFIT) { rebuildCOFFromOutfit(category); } @@ -401,7 +401,7 @@ void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool app return; } - const LLUUID ¤t_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); // Processes that take time should show the busy cursor //inc_busy_count(); @@ -499,7 +499,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID { LLViewerInventoryCategory *catp = item->getLinkedCategory(); // Skip copying outfit links. - if (catp && catp->getPreferredType() != LLAssetType::AT_OUTFIT) + if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT) { link_inventory_item(gAgent.getID(), item->getLinkedUUID(), @@ -604,7 +604,7 @@ void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category) LLNotifications::instance().add("CouldNotPutOnOutfit"); return; } - + // Processes that take time should show the busy cursor //inc_busy_count(); @@ -622,7 +622,7 @@ void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category) // Create a link to the outfit that we wore. LLViewerInventoryCategory* catp = gInventory.getCategory(category); - if (catp && catp->getPreferredType() == LLAssetType::AT_OUTFIT) + if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) { link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(), LLAssetType::AT_LINK_FOLDER, link_waiter); diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index cd3963050f6..ea3809d58d6 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -333,7 +333,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) LLAssetStorage::LLStoreAssetCallback callback = NULL; void *userdata = NULL; upload_new_resource(next_file, asset_name, asset_name, - 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, + 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, next_owner_perms, group_perms, everyone_perms, display_name, callback, expected_upload_cost, userdata); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 2f674013017..97e0aa5f461 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -343,7 +343,7 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re // Servers older than 1.25 require the text of the message to be the // calling card folder ID for the offering user. JC LLUUID calling_card_folder_id = - gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); std::string message = calling_card_folder_id.asString(); requestFriendship(notification["payload"]["id"].asUUID(), notification["payload"]["name"].asString(), @@ -355,7 +355,7 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re // static void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message) { - LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + const LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); send_improved_im(target_id, target_name, message, diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 3b5b7f570ee..6a82550ce61 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -437,7 +437,7 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, } else { - LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); if (item->getParentUUID() == favorites_id) { llwarns << "Attemt to copy a favorite item into the same folder." << llendl; @@ -550,7 +550,7 @@ void LLFavoritesBarCtrl::changed(U32 mask) { if (mFavoriteFolderId.isNull()) { - mFavoriteFolderId = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + mFavoriteFolderId = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); if (mFavoriteFolderId.notNull()) { diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 55b7ed0c99c..095fe0a220f 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -989,7 +989,7 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata) name, desc, 0, - LLAssetType::AT_NONE, + LLFolderType::FT_NONE, LLInventoryType::IT_ANIMATION, LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), name, diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index a73ebf4e06f..1cc0fbef221 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -272,7 +272,6 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, Invent ( asstype == LLAssetType::AT_BODYPART && gSavedSettings.getBOOL("BulkChangeIncludeBodyParts" )) || ( asstype == LLAssetType::AT_CLOTHING && gSavedSettings.getBOOL("BulkChangeIncludeClothing" )) || ( asstype == LLAssetType::AT_GESTURE && gSavedSettings.getBOOL("BulkChangeIncludeGestures" )) || - ( asstype == LLAssetType::AT_FAVORITE && gSavedSettings.getBOOL("BulkChangeIncludeFavourite" )) || ( asstype == LLAssetType::AT_NOTECARD && gSavedSettings.getBOOL("BulkChangeIncludeNotecards" )) || ( asstype == LLAssetType::AT_OBJECT && gSavedSettings.getBOOL("BulkChangeIncludeObjects" )) || ( asstype == LLAssetType::AT_LSL_TEXT && gSavedSettings.getBOOL("BulkChangeIncludeScripts" )) || diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index 9d07362edc8..896a7bfabbd 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -292,7 +292,7 @@ void LLFloaterBuy::onClickBuy() { // Put the items where we put new folders. LLUUID category_id; - category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); + category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); // *NOTE: doesn't work for multiple object buy, which UI does not // currently support sale info is used for verification only, if diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index 3a4171c6bee..15229e9be3d 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -285,7 +285,7 @@ void LLFloaterBuyContents::onClickBuy() // Put the items where we put new folders. LLUUID category_id; - category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CATEGORY); + category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CATEGORY); // *NOTE: doesn't work for multiple object buy, which UI does not // currently support sale info is used for verification only, if diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp index c890f9f1226..8cfa0a8a572 100644 --- a/indra/newview/llfloaterinventory.cpp +++ b/indra/newview/llfloaterinventory.cpp @@ -76,6 +76,7 @@ #include "lltabcontainer.h" #include "lltooldraganddrop.h" #include "lluictrlfactory.h" +#include "llviewerfoldertype.h" #include "llviewerinventory.h" #include "llviewermessage.h" #include "llviewerobjectlist.h" @@ -432,8 +433,8 @@ LLFloaterInventory::LLFloaterInventory(const LLSD& key) // Menu Callbacks (non contex menus) mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLFloaterInventory::doToSelected, this, _2)); mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLFloaterInventory::closeAllFolders, this)); - mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); - mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND)); mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLFloaterInventory::doCreate, this, _2)); // mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::newWindow, this)); mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLFloaterInventory::toggleFindOptions, this)); @@ -1133,10 +1134,6 @@ const std::string& get_item_icon_name(LLAssetType::EType asset_type, case LLAssetType::AT_GESTURE: idx = GESTURE_ICON_NAME; break; - case LLAssetType::AT_FAVORITE: - //TODO - need bette idx - idx = LANDMARK_ICON_NAME; - break; case LLAssetType::AT_LINK: idx = LINKITEM_ICON_NAME; break; @@ -1181,8 +1178,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) // contex menu callbacks mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2)); - mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); - mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND)); mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2)); mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2)); mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this)); @@ -1240,19 +1237,19 @@ BOOL LLInventoryPanel::postBuild() // determine the root folder, if any, so inventory contents show just the children // of that folder (i.e. not including the folder itself). - const LLAssetType::EType preferred_type = LLAssetType::lookupHumanReadable(mStartFolderString); + const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString); - if ("inventory" == mStartFolderString) + if ("INVENTORY" == mStartFolderString) { mStartFolderID = gInventory.getRootFolderID(); } - else if ("library" == mStartFolderString) + else if ("LIBRARY" == mStartFolderString) { mStartFolderID = gInventory.getLibraryRootFolderID(); } else { - mStartFolderID = (preferred_type != LLAssetType::AT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); + mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); } // build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback @@ -1263,7 +1260,7 @@ BOOL LLInventoryPanel::postBuild() } // bit of a hack to make sure the inventory is open. - mFolders->openFolder(preferred_type != LLAssetType::AT_NONE ? LLAssetType::lookupCategoryName(preferred_type) : "My Inventory"); + mFolders->openFolder(preferred_type != LLFolderType::FT_NONE ? LLViewerFolderType::lookupNewCategoryName(preferred_type) : "My Inventory"); if (mSortOrderSetting != INHERIT_SORT_ORDER) { @@ -1711,9 +1708,9 @@ void LLInventoryPanel::openAllFolders() mFolders->arrangeAll(); } -void LLInventoryPanel::openDefaultFolderForType(LLAssetType::EType type) +void LLInventoryPanel::openDefaultFolderForType(LLFolderType::EType type) { - LLUUID category_id = mInventory->findCategoryUUIDForType(type); + const LLUUID category_id = mInventory->findCategoryUUIDForType(type); LLOpenFolderByID opener(category_id); mFolders->applyFunctorRecursively(opener); } diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h index 4c9ac5d4c68..3fed765bba2 100644 --- a/indra/newview/llfloaterinventory.h +++ b/indra/newview/llfloaterinventory.h @@ -37,6 +37,7 @@ #include "llassetstorage.h" #include "lldarray.h" #include "llfloater.h" +#include "llfoldertype.h" #include "llinventory.h" #include "llinventoryfilter.h" #include "llfolderview.h" @@ -131,12 +132,12 @@ class LLInventoryPanel : public LLPanel // Call this method to set the selection. void openAllFolders(); - void openDefaultFolderForType(LLAssetType::EType); + void openDefaultFolderForType(LLFolderType::EType type); void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus); void setSelectCallback(const LLFolderView::signal_t::slot_type& cb) { if (mFolders) mFolders->setSelectCallback(cb); } void clearSelection(); LLInventoryFilter* getFilter() { return mFolders->getFilter(); } - void setFilterTypes(U64 filter, BOOL filter_for_categories = FALSE); // if filter_for_categories is true, operate on folder preferred asset type + void setFilterTypes(U64 filter, BOOL filter_for_categories = FALSE); // if filter_for_categories is true, operate on folder preferred type U32 getFilterTypes() const { return mFolders->getFilterTypes(); } void setFilterPermMask(PermissionMask filter_perm_mask); U32 getFilterPermMask() const { return mFolders->getFilterPermissions(); } diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index ed7d2c71eaa..b7296518d46 100644 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -176,7 +176,7 @@ void LLFloaterNameDesc::onBtnOK( ) upload_new_resource(mFilenameAndPath, // file childGetValue("name_form").asString(), childGetValue("description_form").asString(), - 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, + 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), display_name, callback, expected_upload_cost, nruserdata); closeFloater(false); diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index aa82dc34b74..f14a3361771 100644 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -157,14 +157,14 @@ void LLFloaterOpenObject::moveToInventory(bool wear) if (wear) { parent_category_id = gInventory.findCategoryUUIDForType( - LLAssetType::AT_CLOTHING); + LLFolderType::FT_CLOTHING); } else { parent_category_id = gInventory.getRootFolderID(); } LLUUID category_id = gInventory.createNewCategory(parent_category_id, - LLAssetType::AT_NONE, + LLFolderType::FT_NONE, name); LLCatAndWear* data = new LLCatAndWear; diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 70a3ad5252d..b146ed9b389 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -770,7 +770,7 @@ void LLFloaterReporter::takeScreenshot() if (COMPLAINT_REPORT == mReportType) { mResourceDatap->mAssetInfo.mType = LLAssetType::AT_TEXTURE; - mResourceDatap->mPreferredLocation = LLAssetType::EType(-2); + mResourceDatap->mPreferredLocation = LLFolderType::EType(LLResourceData::INVALID_LOCATION); } else { @@ -838,7 +838,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data, } EReportType report_type = UNKNOWN_REPORT; - if (data->mPreferredLocation == -2) + if (data->mPreferredLocation == LLResourceData::INVALID_LOCATION) { report_type = COMPLAINT_REPORT; } diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 235e8192186..541e2a26648 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -980,7 +980,7 @@ void LLSnapshotLivePreview::saveTexture() "Snapshot : " + pos_string, "Taken by " + who_took_it + " at " + pos_string, 0, - LLAssetType::AT_SNAPSHOT_CATEGORY, + LLFolderType::FT_SNAPSHOT_CATEGORY, LLInventoryType::IT_SNAPSHOT, PERM_ALL, // Note: Snapshots to inventory is a special case of content upload PERM_NONE, // that ignores the user's premissions preferences and continues to diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index b7e8835fb88..fbaf10d4553 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -297,7 +297,7 @@ void LLFloaterWorldMap::onOpen(const LLSD& key) LLFirstUse::useMap(); // Start speculative download of landmarks - LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); gInventory.startBackgroundFetch(landmark_folder_id); childSetFocus("location", TRUE); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index de18e747528..37c175d03f7 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -54,6 +54,7 @@ #include "llviewermenu.h" #include "lluictrlfactory.h" #include "llviewercontrol.h" +#include "llviewerfoldertype.h" #include "llviewerwindow.h" #include "llvoavatar.h" #include "llfloaterproperties.h" @@ -1107,7 +1108,7 @@ void LLFolderView::propertiesSelectedItems( void ) } } -void LLFolderView::changeType(LLInventoryModel *model, LLAssetType::EType new_folder_type) +void LLFolderView::changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type) { LLFolderBridge *folder_bridge = LLFolderBridge::sSelf; @@ -1957,7 +1958,7 @@ bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata) if (action.length() > change_folder_string.length() && (action.compare(0,change_folder_string.length(),"change_folder_type_") == 0)) { - LLAssetType::EType new_folder_type = LLFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length())); + LLFolderType::EType new_folder_type = LLViewerFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length())); changeType(model, new_folder_type); return true; } diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index ebfb4efde2d..0bd65b5f909 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -192,7 +192,7 @@ class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler void propertiesSelectedItems( void ); // change the folder type - void changeType(LLInventoryModel *model, LLAssetType::EType new_folder_type); + void changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type); void autoOpenItem(LLFolderViewFolder* item); void closeAutoOpenedFolders(); diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index ff38da279a5..60ece75cead 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -32,6 +32,7 @@ #define LLFOLDERVIEWEVENTLISTENER_H #include "lldarray.h" // JAMESDEBUG convert to std::vector +#include "llfoldertype.h" #include "llfontgl.h" // just for StyleFlags enum #include "llpointer.h" @@ -57,7 +58,7 @@ class LLFolderViewEventListener virtual const LLUUID& getUUID() const = 0; virtual time_t getCreationDate() const = 0; // UTC seconds virtual PermissionMask getPermissionMask() const = 0; - virtual LLAssetType::EType getPreferredType() const = 0; + virtual LLFolderType::EType getPreferredType() const = 0; virtual LLPointer<LLUIImage> getIcon() const = 0; virtual LLFontGL::StyleFlags getLabelStyle() const = 0; virtual std::string getLabelSuffix() const = 0; diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 3591daf92d3..d747260e8a5 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -244,13 +244,13 @@ void LLFolderViewItem::refreshFromListener() if(mListener) { mLabel = mListener->getDisplayName(); - LLAssetType::EType preferred_type = mListener->getPreferredType(); + LLFolderType::EType preferred_type = mListener->getPreferredType(); // *TODO: to be removed when database supports multi language. This is a // temporary attempt to display the inventory folder in the user locale. // mantipov: *NOTE: be sure this code is synchronized with LLFriendCardsManager::findChildFolderUUID // it uses the same way to find localized string - if (LLAssetType::lookupIsProtectedCategoryType(preferred_type)) + if (LLFolderType::lookupIsProtectedType(preferred_type)) { LLTrans::findString(mLabel, "InvFolder " + mLabel); }; @@ -1749,7 +1749,7 @@ bool LLFolderViewFolder::isTrash() const { if (mAmTrash == LLFolderViewFolder::UNKNOWN) { - mAmTrash = mListener->getUUID() == gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH, false) ? LLFolderViewFolder::TRASH : LLFolderViewFolder::NOT_TRASH; + mAmTrash = mListener->getUUID() == gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH, false) ? LLFolderViewFolder::TRASH : LLFolderViewFolder::NOT_TRASH; } return mAmTrash == LLFolderViewFolder::TRASH; } @@ -2163,7 +2163,7 @@ BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask ) { const LLUUID &cat_uuid = getListener()->getUUID(); const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_uuid); - if (cat && cat->getPreferredType() == LLAssetType::AT_OUTFIT) + if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT) { getListener()->performAction(NULL, NULL,"replaceoutfit"); return TRUE; @@ -2486,7 +2486,7 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde && b->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK) { - static LLUUID favorites_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); LLUUID a_uuid = a->getParentFolder()->getListener()->getUUID(); LLUUID b_uuid = b->getParentFolder()->getListener()->getUUID(); diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index fbcaeee01f2..5f79fe8b201 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -135,14 +135,14 @@ const LLUUID LLFriendCardsManager::extractAvatarID(const LLUUID& avatarID) // and this method must be called before any actions with friend list void LLFriendCardsManager::ensureFriendFoldersExist() { - LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); LLUUID friendFolderUUID = findFriendFolderUUIDImpl(); if (friendFolderUUID.isNull()) { friendFolderUUID = gInventory.createNewCategory(callingCardsFolderID, - LLAssetType::AT_CALLINGCARD, get_friend_folder_name()); + LLFolderType::FT_CALLINGCARD, get_friend_folder_name()); } LLUUID friendAllSubfolderUUID = findFriendAllSubfolderUUIDImpl(); @@ -150,7 +150,7 @@ void LLFriendCardsManager::ensureFriendFoldersExist() if (friendAllSubfolderUUID.isNull()) { friendAllSubfolderUUID = gInventory.createNewCategory(friendFolderUUID, - LLAssetType::AT_CALLINGCARD, get_friend_all_subfolder_name()); + LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name()); } } @@ -351,7 +351,7 @@ void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBud /************************************************************************/ const LLUUID& LLFriendCardsManager::findFriendFolderUUIDImpl() const { - LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); std::string friendFolderName = get_friend_folder_name(); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index ca9ebf8dc14..74f6d847096 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -76,6 +76,7 @@ #include "llscrollcontainer.h" #include "llimview.h" #include "lltooldraganddrop.h" +#include "llviewerfoldertype.h" #include "llviewertexturelist.h" #include "llviewerinventory.h" #include "llviewerobjectlist.h" @@ -83,6 +84,7 @@ #include "llvoavatar.h" #include "llwearable.h" #include "llwearablelist.h" +#include "llviewerassettype.h" #include "llviewermessage.h" #include "llviewerregion.h" #include "llvoavatarself.h" @@ -200,9 +202,9 @@ PermissionMask LLInvFVBridge::getPermissionMask() const } // virtual -LLAssetType::EType LLInvFVBridge::getPreferredType() const +LLFolderType::EType LLInvFVBridge::getPreferredType() const { - return LLAssetType::AT_NONE; + return LLFolderType::FT_NONE; } @@ -333,7 +335,7 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener* LLInventoryModel* model = getInventoryModel(); if(!model) return; LLMessageSystem* msg = gMessageSystem; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); LLViewerInventoryItem* item = NULL; LLViewerInventoryCategory* cat = NULL; std::vector<LLUUID> move_ids; @@ -498,7 +500,7 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const } } const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i)); - if (cat && !LLAssetType::lookupCanLink(cat->getPreferredType())) + if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())) { return FALSE; } @@ -633,7 +635,7 @@ BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const if(obj) { - *type = LLAssetType::lookupDragAndDropType(obj->getActualType()); + *type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType()); if(*type == DAD_NONE) { return FALSE; @@ -674,7 +676,7 @@ BOOL LLInvFVBridge::isInTrash() const { LLInventoryModel* model = getInventoryModel(); if(!model) return FALSE; - const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); return model->isObjectDescendentOf(mUUID, trash_id); } @@ -687,7 +689,7 @@ BOOL LLInvFVBridge::isLinkedObjectInTrash() const { LLInventoryModel* model = getInventoryModel(); if(!model) return FALSE; - const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id); } return FALSE; @@ -705,7 +707,7 @@ BOOL LLInvFVBridge::isCOFFolder() const { const LLInventoryModel* model = getInventoryModel(); if(!model) return TRUE; - const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id)) { return TRUE; @@ -1032,7 +1034,7 @@ void LLItemBridge::restoreItem() if(item) { LLInventoryModel* model = getInventoryModel(); - const LLUUID new_parent = model->findCategoryUUIDForType(item->getType()); + const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType())); // do not restamp on restore. LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE); } @@ -1065,7 +1067,7 @@ void LLItemBridge::restoreToWorld() } // Check if it's in the trash. (again similar to the normal rez logic) - const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id)) { remove_from_inventory = TRUE; @@ -1260,7 +1262,7 @@ BOOL LLItemBridge::removeItem() LLPreview::hide(mUUID, TRUE); LLInventoryModel* model = getInventoryModel(); if(!model) return FALSE; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); LLViewerInventoryItem* item = getItem(); // if item is not already in trash @@ -1353,7 +1355,7 @@ BOOL LLFolderBridge::isItemMovable() const LLInventoryObject* obj = getInventoryObject(); if(obj) { - return (!LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)obj)->getPreferredType())); + return (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType())); } return FALSE; } @@ -1389,7 +1391,7 @@ BOOL LLFolderBridge::isItemRemovable() return FALSE; } - if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) + if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) { return FALSE; } @@ -1402,7 +1404,7 @@ BOOL LLFolderBridge::isItemRemovable() for( i = 0; i < descendent_categories.count(); i++ ) { LLInventoryCategory* category = descendent_categories[i]; - if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) + if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) { return FALSE; } @@ -1579,20 +1581,20 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, const LLUUID& cat_id = inv_cat->getUUID(); // Is the destination the trash? - const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); - BOOL is_movable = (!LLAssetType::lookupIsProtectedCategoryType(inv_cat->getPreferredType())); - LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + BOOL is_movable = (!LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType())); + const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); - BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); + BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); if (move_is_into_current_outfit || move_is_into_outfit) { // BAP - restrictions? is_movable = true; } - if (mUUID == gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE)) + if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE)) { is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604 } @@ -1604,7 +1606,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, for( i = 0; i < descendent_categories.count(); i++ ) { LLInventoryCategory* category = descendent_categories[i]; - if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) + if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) { // ...can't move "special folders" like Textures is_movable = FALSE; @@ -1837,8 +1839,8 @@ bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat, LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe? // BAP remove AT_NONE support after ensembles are fully working? return (linked_category && - ((linked_category->getPreferredType() == LLAssetType::AT_NONE) || - (LLAssetType::lookupIsEnsembleCategoryType(linked_category->getPreferredType())))); + ((linked_category->getPreferredType() == LLFolderType::FT_NONE) || + (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType())))); } } @@ -2140,7 +2142,7 @@ void LLFolderBridge::determineFolderType() BOOL LLFolderBridge::isItemRenameable() const { LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory(); - if(cat && !LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType()) + if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()) && (cat->getOwnerID() == gAgent.getID())) { return TRUE; @@ -2155,15 +2157,15 @@ void LLFolderBridge::restoreItem() if(cat) { LLInventoryModel* model = getInventoryModel(); - LLUUID new_parent = model->findCategoryUUIDForType(cat->getType()); + const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(cat->getType())); // do not restamp children on restore LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE); } } -LLAssetType::EType LLFolderBridge::getPreferredType() const +LLFolderType::EType LLFolderBridge::getPreferredType() const { - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + LLFolderType::EType preferred_type = LLFolderType::FT_NONE; LLViewerInventoryCategory* cat = getCategory(); if(cat) { @@ -2176,7 +2178,7 @@ LLAssetType::EType LLFolderBridge::getPreferredType() const // Icons for folders are based on the preferred type LLUIImagePtr LLFolderBridge::getIcon() const { - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + LLFolderType::EType preferred_type = LLFolderType::FT_NONE; LLViewerInventoryCategory* cat = getCategory(); if(cat) { @@ -2185,7 +2187,7 @@ LLUIImagePtr LLFolderBridge::getIcon() const return getIcon(preferred_type); } -LLUIImagePtr LLFolderBridge::getIcon(LLAssetType::EType preferred_type) +LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type) { // we only have one folder image now return LLUI::getUIImage("Inv_FolderClosed"); @@ -2224,7 +2226,7 @@ BOOL LLFolderBridge::removeItem() LLInventoryModel* model = getInventoryModel(); if(!model) return FALSE; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); // Look for any gestures and deactivate them LLInventoryModel::cat_array_t descendent_categories; @@ -2342,12 +2344,11 @@ void LLFolderBridge::folderOptionsMenu() if(!model) return; const LLInventoryCategory* category = model->getCategory(mUUID); - LLAssetType::EType type = category->getPreferredType(); - const bool is_default_folder = category && LLAssetType::lookupIsProtectedCategoryType(type); + LLFolderType::EType type = category->getPreferredType(); + const bool is_default_folder = category && LLFolderType::lookupIsProtectedType(type); // BAP change once we're no longer treating regular categories as ensembles. - const bool is_ensemble = category && (type == LLAssetType::AT_NONE || - LLAssetType::lookupIsEnsembleCategoryType(type)); - + const bool is_ensemble = category && (type == LLFolderType::FT_NONE || + LLFolderType::lookupIsEnsembleType(type)); // calling card related functionality for folders. // Only enable calling-card related options for non-default folders. @@ -2412,8 +2413,8 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) // std::vector<std::string> disabled_items; LLInventoryModel* model = getInventoryModel(); if(!model) return; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); + const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point) mDisabledItems.clear(); //adding code to clear out disabled members from previous @@ -2443,7 +2444,6 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) else if(isAgentInventory()) // do not allow creating in library { LLViewerInventoryCategory *cat = getCategory(); - // BAP removed protected check to re-enable standard ops in untyped folders. // Not sure what the right thing is to do here. if (!isCOFFolder() && cat /*&& @@ -2460,7 +2460,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) mItems.push_back(std::string("Change Type")); LLViewerInventoryCategory *cat = getCategory(); - if (cat && LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())) + if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType())) { mDisabledItems.push_back(std::string("Change Type")); } @@ -2470,7 +2470,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) else { // Want some but not all of the items from getClipboardEntries for outfits. - if (cat && cat->getPreferredType()==LLAssetType::AT_OUTFIT) + if (cat && cat->getPreferredType()==LLFolderType::FT_OUTFIT) { mItems.push_back(std::string("Rename")); mItems.push_back(std::string("Delete")); @@ -2606,7 +2606,7 @@ void LLFolderBridge::createNewCategory(void* user_data) if(!model) return; LLUUID id; id = model->createNewCategory(bridge->getUUID(), - LLAssetType::AT_NONE, + LLFolderType::FT_NONE, LLStringUtil::null); model->notifyObservers(); @@ -2691,7 +2691,7 @@ void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type) // Separate function so can be called by global menu as well as right-click // menu. // static -void LLFolderBridge::createWearable(LLUUID parent_id, EWearableType type) +void LLFolderBridge::createWearable(const LLUUID &parent_id, EWearableType type) { LLWearable* wearable = LLWearableList::instance().createNewWearable(type); LLAssetType::EType asset_type = wearable->getAssetType(); @@ -2834,17 +2834,17 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, break; case LLAssetType::AT_CATEGORY: - is_movable = !LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)inv_item)->getPreferredType()); + is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType()); break; default: break; } - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); - LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); - BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); + BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); if(is_movable && move_is_into_trash) { @@ -2874,7 +2874,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, .isObjDirectDescendentOfCategory (inv_item, getCategory()); } - LLUUID favorites_id = model->findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE); // we can move item inside a folder only if this folder is Favorites. See EXT-719 accept = is_movable && ((mUUID != inv_item->getParentUUID()) || (mUUID == favorites_id)); @@ -4915,7 +4915,7 @@ void LLLSLTextBridgeAction::doIt() BOOL LLWearableBridgeAction::isInTrash() const { if(!mModel) return FALSE; - LLUUID trash_id = mModel->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH); return mModel->isObjectDescendentOf(mUUID, trash_id); } @@ -5054,7 +5054,7 @@ std::string LLLinkFolderBridge::sPrefix("Link: "); LLUIImagePtr LLLinkFolderBridge::getIcon() const { - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + LLFolderType::EType preferred_type = LLFolderType::FT_NONE; if (LLViewerInventoryItem *item = getItem()) { if (const LLViewerInventoryCategory* cat = item->getLinkedCategory()) diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 6b2a2d32dec..abf9905b73e 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -158,7 +158,7 @@ class LLInvFVBridge : public LLFolderViewEventListener virtual const std::string& getName() const; virtual const std::string& getDisplayName() const; virtual PermissionMask getPermissionMask() const; - virtual LLAssetType::EType getPreferredType() const; + virtual LLFolderType::EType getPreferredType() const; virtual time_t getCreationDate() const; virtual LLFontGL::StyleFlags getLabelStyle() const { @@ -297,9 +297,9 @@ class LLFolderBridge : public LLInvFVBridge virtual void selectItem(); virtual void restoreItem(); - virtual LLAssetType::EType getPreferredType() const; + virtual LLFolderType::EType getPreferredType() const; virtual LLUIImagePtr getIcon() const; - static LLUIImagePtr getIcon(LLAssetType::EType asset_type); + static LLUIImagePtr getIcon(LLFolderType::EType preferred_type); virtual BOOL renameItem(const std::string& new_name); virtual BOOL removeItem(); @@ -320,7 +320,7 @@ class LLFolderBridge : public LLInvFVBridge virtual BOOL copyToClipboard() const; static void createWearable(LLFolderBridge* bridge, EWearableType type); - static void createWearable(LLUUID parent_folder_id, EWearableType type); + static void createWearable(const LLUUID &parent_folder_id, EWearableType type); LLViewerInventoryCategory* getCategory() const; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 6009e8e6100..091a7c8f4fa 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -47,6 +47,7 @@ #include "llfocusmgr.h" #include "llinventorybridge.h" #include "llfloaterinventory.h" +#include "llviewerfoldertype.h" #include "llviewerinventory.h" #include "llviewermessage.h" #include "llviewerwindow.h" @@ -305,7 +306,7 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id) // specifies 'type' as what it defaults to containing. The category is // not necessarily only for that type. *NOTE: This will create a new // inventory category on the fly if one does not exist. -LLUUID LLInventoryModel::findCategoryUUIDForType(LLAssetType::EType t, bool create_folder) +const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder) { const LLUUID &rv = findCatUUID(t); if(rv.isNull() && isInventoryUsable() && create_folder) @@ -321,10 +322,10 @@ LLUUID LLInventoryModel::findCategoryUUIDForType(LLAssetType::EType t, bool crea // Internal method which looks for a category with the specified // preferred type. Returns LLUUID::null if not found. -const LLUUID &LLInventoryModel::findCatUUID(LLAssetType::EType preferred_type) const +const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type) const { const LLUUID &root_id = gInventory.getRootFolderID(); - if(LLAssetType::AT_CATEGORY == preferred_type) + if(LLFolderType::FT_CATEGORY == preferred_type) { return root_id; } @@ -352,7 +353,7 @@ const LLUUID &LLInventoryModel::findCatUUID(LLAssetType::EType preferred_type) c // version will take care of details like what the name should be // based on preferred type. Returns the UUID of the new category. LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, - LLAssetType::EType preferred_type, + LLFolderType::EType preferred_type, const std::string& pname) { LLUUID id; @@ -362,9 +363,9 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, return id; } - if(preferred_type == LLAssetType::AT_SIMSTATE) + if(LLFolderType::lookup(preferred_type) == LLFolderType::badLookup()) { - lldebugs << "Attempt to create simstate category." << llendl; + lldebugs << "Attempt to create undefined category." << llendl; return id; } @@ -376,7 +377,7 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, } else { - name.assign(LLAssetType::lookupCategoryName(preferred_type)); + name.assign(LLViewerFolderType::lookupNewCategoryName(preferred_type)); } // Add the category to the internal representation @@ -440,7 +441,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id, // Start with categories if(!include_trash) { - const LLUUID trash_id = findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = findCategoryUUIDForType(LLFolderType::FT_TRASH); if(trash_id.notNull() && (trash_id == id)) return; } @@ -474,7 +475,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id, if (item->getActualType() == LLAssetType::AT_LINK_FOLDER) { LLViewerInventoryCategory *linked_cat = item->getLinkedCategory(); - if (linked_cat && linked_cat->getPreferredType() != LLAssetType::AT_OUTFIT) + if (linked_cat && linked_cat->getPreferredType() != LLFolderType::FT_OUTFIT) // BAP - was // LLAssetType::lookupIsEnsembleCategoryType(linked_cat->getPreferredType())) // Change back once ensemble typing is in place. @@ -654,7 +655,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item) if(item->getParentUUID().isNull()) { - LLUUID category_id = findCategoryUUIDForType(new_item->getType()); + const LLUUID category_id = findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(new_item->getType())); new_item->setParent(category_id); item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, category_id); if( item_array ) @@ -678,7 +679,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item) LLUUID parent_id = item->getParentUUID(); if(parent_id == CATEGORIZE_LOST_AND_FOUND_ID) { - parent_id = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + parent_id = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); new_item->setParent(parent_id); } item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, parent_id); @@ -691,7 +692,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item) // Whoops! No such parent, make one. llinfos << "Lost item: " << new_item->getUUID() << " - " << new_item->getName() << llendl; - parent_id = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + parent_id = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); new_item->setParent(parent_id); item_array = get_ptr_in_map(mParentChildItemTree, parent_id); if(item_array) @@ -1173,7 +1174,7 @@ void LLInventoryModel::mock(const LLUUID& root_id) root_id, LLUUID::null, LLAssetType::AT_CATEGORY, - LLAssetType::lookupCategoryName(LLAssetType::AT_ROOT_CATEGORY), + LLFolderType::lookupNewCategoryName(LLFolderType::FT_ROOT_CATEGORY), gAgent.getID()); addCategory(cat); gInventory.buildParentChildMap(); @@ -1331,7 +1332,7 @@ void fetchDescendentsResponder::result(const LLSD& content) item_it != folder_sd["items"].endArray(); ++item_it) { - LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + const LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); if (lost_uuid.notNull()) { LLSD item = *item_it; @@ -2021,7 +2022,7 @@ bool LLInventoryModel::loadSkeleton( update_map_t child_counts; LLUUID id; - LLAssetType::EType preferred_type; + LLFolderType::EType preferred_type; bool rv = true; for(options_t::const_iterator it = options.begin(); it < options.end(); ++it) { @@ -2044,12 +2045,12 @@ bool LLInventoryModel::loadSkeleton( skel = (*it).find("type_default"); if(skel == no_response) { - preferred_type = LLAssetType::AT_NONE; + preferred_type = LLFolderType::FT_NONE; } else { S32 t = atoi((*skel).second.c_str()); - preferred_type = (LLAssetType::EType)t; + preferred_type = (LLFolderType::EType)t; } cat->setPreferredType(preferred_type); skel = (*it).find("version"); @@ -2397,12 +2398,12 @@ void LLInventoryModel::buildParentChildMap() << cat->getName() << llendl; ++lost; // plop it into the lost & found. - LLAssetType::EType pref = cat->getPreferredType(); - if(LLAssetType::AT_NONE == pref) + LLFolderType::EType pref = cat->getPreferredType(); + if(LLFolderType::FT_NONE == pref) { - cat->setParent(findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND)); + cat->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND)); } - else if(LLAssetType::AT_CATEGORY == pref) + else if(LLFolderType::FT_CATEGORY == pref) { // it's the root cat->setParent(LLUUID::null); @@ -2461,7 +2462,7 @@ void LLInventoryModel::buildParentChildMap() ++lost; // plop it into the lost & found. // - item->setParent(findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND)); + item->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND)); // move it later using a special message to move items. If // we update server here, the client might crash. //item->updateServer(); @@ -2482,7 +2483,7 @@ void LLInventoryModel::buildParentChildMap() llwarns << "Found " << lost << " lost items." << llendl; LLMessageSystem* msg = gMessageSystem; BOOL start_new_message = TRUE; - LLUUID lnf = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + const LLUUID lnf = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); for(std::vector<LLUUID>::iterator it = lost_item_ids.begin() ; it < lost_item_ids.end(); ++it) { if(start_new_message) @@ -2935,7 +2936,7 @@ void LLInventoryModel::processUpdateInventoryFolder(LLMessageSystem* msg, lastfolder = tfolder; tfolder->unpackMessage(msg, _PREHASH_FolderData, i); // make sure it's not a protected folder - tfolder->setPreferredType(LLAssetType::AT_NONE); + tfolder->setPreferredType(LLFolderType::FT_NONE); folders.push_back(tfolder); // examine update for changes. LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID()); @@ -3322,31 +3323,31 @@ void LLInventoryModel::processMoveInventoryItem(LLMessageSystem* msg, void**) //---------------------------------------------------------------------------- -// Trash: LLAssetType::AT_TRASH, "ConfirmEmptyTrash" -// Lost&Found: LLAssetType::AT_LOST_AND_FOUND, "ConfirmEmptyLostAndFound" +// Trash: LLFolderType::FT_TRASH, "ConfirmEmptyTrash" +// Lost&Found: LLFolderType::FT_LOST_AND_FOUND, "ConfirmEmptyLostAndFound" -bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLAssetType::EType folder_type) +bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type) { S32 option = LLNotification::getSelectedOption(notification, response); if (option == 0) // YES { - LLUUID folder_id = findCategoryUUIDForType(folder_type); + const LLUUID folder_id = findCategoryUUIDForType(preferred_type); purgeDescendentsOf(folder_id); notifyObservers(); } return false; } -void LLInventoryModel::emptyFolderType(const std::string notification, LLAssetType::EType folder_type) +void LLInventoryModel::emptyFolderType(const std::string notification, LLFolderType::EType preferred_type) { if (!notification.empty()) { LLNotifications::instance().add(notification, LLSD(), LLSD(), - boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, folder_type)); + boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, preferred_type)); } else { - LLUUID folder_id = findCategoryUUIDForType(folder_type); + const LLUUID folder_id = findCategoryUUIDForType(preferred_type); purgeDescendentsOf(folder_id); notifyObservers(); } @@ -3357,7 +3358,7 @@ void LLInventoryModel::emptyFolderType(const std::string notification, LLAssetTy void LLInventoryModel::removeItem(const LLUUID& item_id) { LLViewerInventoryItem* item = getItem(item_id); - const LLUUID new_parent = findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID new_parent = findCategoryUUIDForType(LLFolderType::FT_TRASH); if (item && item->getParentUUID() != new_parent) { LLInventoryModel::update_list_t update; diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index c2d8717b709..ed7ba5db8b3 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -34,6 +34,7 @@ #define LL_LLINVENTORYMODEL_H #include "llassettype.h" +#include "llfoldertype.h" #include "lldarray.h" #include "llframetimer.h" #include "llhttpclient.h" @@ -278,7 +279,7 @@ class LLInventoryModel // SDK: Added flag to specify whether the folder should be created if not found. This fixes the horrible // multiple trash can bug. - LLUUID findCategoryUUIDForType(LLAssetType::EType preferred_type, bool create_folder = true); + const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true); // Call this method when it's time to update everyone on a new // state, by default, the inventory model will not update @@ -327,7 +328,7 @@ class LLInventoryModel // category. If you want to use the default name based on type, // pass in a NULL to the 'name parameter. LLUUID createNewCategory(const LLUUID& parent_id, - LLAssetType::EType preferred_type, + LLFolderType::EType preferred_type, const std::string& name); // methods to load up inventory skeleton & meat. These are used @@ -385,9 +386,9 @@ class LLInventoryModel bool isCategoryComplete(const LLUUID& cat_id) const; // callbacks - // Trigger a notification and empty the folder type (AT_TRASH or AT_LOST_AND_FOUND) if confirmed - void emptyFolderType(const std::string notification, LLAssetType::EType folder_type); - bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLAssetType::EType folder_type); + // Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed + void emptyFolderType(const std::string notification, LLFolderType::EType folder_type); + bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type); // Utility Functions void removeItem(const LLUUID& item_id); @@ -431,7 +432,7 @@ class LLInventoryModel // // Internal method which looks for a category with the specified // preferred type. Returns LLUUID::null if not found - const LLUUID &findCatUUID(LLAssetType::EType preferred_type) const; + const LLUUID &findCatUUID(LLFolderType::EType preferred_type) const; // Empty the entire contents void empty(); diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp index b36b7cf50ed..a341720aec3 100644 --- a/indra/newview/lllandmarkactions.cpp +++ b/indra/newview/lllandmarkactions.cpp @@ -138,8 +138,7 @@ static void fetch_landmarks(LLInventoryModel::cat_array_t& cats, LLInventoryCollectFunctor& add) { // Look in "My Favorites" - LLUUID favorites_folder_id = - gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + const LLUUID favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); gInventory.collectDescendentsIf(favorites_folder_id, cats, items, @@ -147,8 +146,7 @@ static void fetch_landmarks(LLInventoryModel::cat_array_t& cats, add); // Look in "Landmarks" - LLUUID landmarks_folder_id = - gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + const LLUUID landmarks_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); gInventory.collectDescendentsIf(landmarks_folder_id, cats, items, @@ -250,7 +248,7 @@ void LLLandmarkActions::createLandmarkHere() LLAgentUI::buildLocationString(landmark_name, LLAgentUI::LOCATION_FORMAT_LANDMARK); LLAgentUI::buildLocationString(landmark_desc, LLAgentUI::LOCATION_FORMAT_FULL); - LLUUID folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); createLandmarkHere(landmark_name, landmark_desc, folder_id); } diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index ea528a1df89..a4ff78ee9b1 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -59,6 +59,7 @@ #include "lltoolcomp.h" #include "lltoolmgr.h" #include "lltrans.h" +#include "llviewerassettype.h" #include "llviewerobject.h" #include "llviewerregion.h" #include "llviewerwindow.h" @@ -167,7 +168,7 @@ void LLPanelContents::onClickNewScript(void *userdata) PERM_NONE, PERM_MOVE | PERM_TRANSFER); std::string desc; - LLAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc); + LLViewerAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc); LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem( LLUUID::null, diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index faa938c772a..e0c92fd4ab1 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -531,7 +531,7 @@ void LLLandmarksPanel::onAddFolderButtonClick() const menu_create_inventory_item(mCurrentSelectedList->getRootFolder() , dynamic_cast<LLFolderBridge*>(folder_bridge) , LLSD("category") - , gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK) + , gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK) ); } } diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index 609b2059209..38ec9612a6a 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -912,7 +912,7 @@ void LLPanelPlaceInfo::createLandmark(const LLUUID& folder_id) LLStringUtil::replaceChar(desc, '\n', ' '); // If no folder chosen use the "Landmarks" folder. LLLandmarkActions::createLandmarkHere(name, desc, - folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK)); + folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK)); } void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel) @@ -960,7 +960,7 @@ void LLPanelPlaceInfo::populateFoldersList() mFolderCombo->removeall(); // Put the "Landmarks" folder first in list. - LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + const LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id); if (!cat) { @@ -1058,7 +1058,7 @@ static std::string getFullFolderName(const LLViewerInventoryCategory* cat) static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats) { - LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + const LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); // Add descendent folders of the "Landmarks" category. LLInventoryModel::item_array_t items; // unused @@ -1071,7 +1071,7 @@ static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats) is_category); // Add the "My Favorites" category. - LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id); if (!favorites_cat) { diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 5ab823b6e53..aa9b698b374 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -588,7 +588,7 @@ void LLPanelPlaces::onOverflowButtonClicked() if (mItem.notNull()) { const LLUUID& item_id = mItem->getUUID(); - const LLUUID& trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); is_landmark_removable = gInventory.isObjectDescendentOf(item_id, gInventory.getRootFolderID()) && !gInventory.isObjectDescendentOf(item_id, trash_id); } @@ -668,7 +668,7 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param) { if ( mItem.notNull() ) { - LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + const LLUUID& favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); if ( favorites_id.notNull() ) { copy_inventory_item(gAgent.getID(), diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index b06e70c00af..34e78b5c469 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -45,6 +45,7 @@ #include "lltooldraganddrop.h" #include "llradiogroup.h" #include "llassetstorage.h" +#include "llviewerassettype.h" #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "lldbstrings.h" @@ -317,7 +318,7 @@ BOOL LLPreview::handleHover(S32 x, S32 y, MASK mask) && LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y)) { EDragAndDropType type; - type = LLAssetType::lookupDragAndDropType(item->getType()); + type = LLViewerAssetType::lookupDragAndDropType(item->getType()); LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_LIBRARY; if(!mObjectUUID.isNull()) { @@ -406,7 +407,7 @@ void LLPreview::onDiscardBtn(void* data) */ // Move the item to the trash - LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if (item->getParentUUID() != trash_id) { LLInventoryModel::update_list_t update; diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index ab2afb80560..7b3a20d1020 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -130,10 +130,10 @@ LLPreviewGesture* LLPreviewGesture::show(const LLUUID& item_id, const LLUUID& ob preview->setObjectID(object_id); // Start speculative download of sounds and animations - LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_ANIMATION); + const LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ANIMATION); gInventory.startBackgroundFetch(animation_folder_id); - LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_SOUND); + const LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_SOUND); gInventory.startBackgroundFetch(sound_folder_id); // this will call refresh when we have everything. diff --git a/indra/newview/llresourcedata.h b/indra/newview/llresourcedata.h index 46b79150bbf..b4b90426895 100644 --- a/indra/newview/llresourcedata.h +++ b/indra/newview/llresourcedata.h @@ -39,11 +39,12 @@ struct LLResourceData { LLAssetInfo mAssetInfo; - LLAssetType::EType mPreferredLocation; + LLFolderType::EType mPreferredLocation; LLInventoryType::EType mInventoryType; U32 mNextOwnerPerm; S32 mExpectedUploadCost; void *mUserData; + static const S8 INVALID_LOCATION = -2; }; #endif diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index a7f0ce16d38..1e5ee29529a 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -2820,7 +2820,7 @@ bool LLSelectMgr::confirmDelete(const LLSD& notification, const LLSD& response, case 0: { // TODO: Make sure you have delete permissions on all of them. - LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); // attempt to derez into the trash. LLDeRezInfo* info = new LLDeRezInfo(DRD_TRASH, trash_id); LLSelectMgr::getInstance()->sendListToRegions("DeRezObject", diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 8793d226464..51b651d58ee 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -330,7 +330,7 @@ void populate_favorites_bar() S32 count = lib_cats->count(); for(S32 i = 0; i < count; ++i) { - if(lib_cats->get(i)->getPreferredType() == LLAssetType::AT_LANDMARK) + if(lib_cats->get(i)->getPreferredType() == LLFolderType::FT_LANDMARK) { lib_landmarks = lib_cats->get(i)->getUUID(); break; @@ -347,7 +347,7 @@ void populate_favorites_bar() gInventory.getDirectDescendentsOf(lib_landmarks, lm_cats, lm_items); if (!lm_items) return; - LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); if (favorites_id.isNull()) { llerror("My Inventory is missing My Favorites", 0); @@ -2178,7 +2178,7 @@ bool idle_startup() gInventory.buildParentChildMap(); //all categories loaded. lets create "My Favorites" category - gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE,true); + gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true); // lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" and fill it with buddies LLFriendCardsManager::instance().syncFriendsFolder(); diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index b5aec1b80bc..0fcbb60c724 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -424,7 +424,7 @@ BOOL LLFloaterTexturePicker::postBuild() mInventoryPanel->getRootFolder()->getFilter()->markDefault(); // Commented out to stop opening all folders with textures - // mInventoryPanel->openDefaultFolderForType(LLAssetType::AT_TEXTURE); + // mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_TEXTURE); // don't put keyboard focus on selected item, because the selection callback // will assume that this was user input @@ -1071,7 +1071,7 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask) { showPicker(FALSE); //grab textures first... - gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLAssetType::AT_TEXTURE)); + gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE)); //...then start full inventory fetch. gInventory.startBackgroundFetch(); handled = TRUE; diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index e26a0776ff4..2529ac9cf6e 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -219,7 +219,6 @@ bool LLToastGroupNotifyPanel::isAttachmentOpenable(LLAssetType::EType type) switch(type) { case LLAssetType::AT_LANDMARK: - case LLAssetType::AT_FAVORITE: case LLAssetType::AT_NOTECARD: case LLAssetType::AT_IMAGE_JPEG: case LLAssetType::AT_IMAGE_TGA: diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 9a63f07a7e5..959cb3f1822 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -92,7 +92,7 @@ class LLNoPreferredType : public LLInventoryCollectFunctor virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) { - if(cat && (cat->getPreferredType() == LLAssetType::AT_NONE)) + if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE)) { return true; } @@ -109,7 +109,7 @@ class LLNoPreferredTypeOrItem : public LLInventoryCollectFunctor LLInventoryItem* item) { if(item) return true; - if(cat && (cat->getPreferredType() == LLAssetType::AT_NONE)) + if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE)) { return true; } @@ -1317,8 +1317,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target, // Check if it's in the trash. bool is_in_trash = false; - LLUUID trash_id; - trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { is_in_trash = true; @@ -2088,7 +2087,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv( if(!item || !item->isComplete()) return ACCEPT_NO; // must not be in the trash - LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH)); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) ) { return ACCEPT_NO; @@ -2170,8 +2169,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand( } // Check if it's in the trash. - LLUUID trash_id; - trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { accept = ACCEPT_YES_SINGLE; @@ -2249,8 +2247,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject( } // Check if it's in the trash. - LLUUID trash_id; - trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { accept = ACCEPT_YES_SINGLE; @@ -2388,7 +2385,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem( if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY) { // it's in the agent inventory - LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) ) { return ACCEPT_NO; @@ -2443,7 +2440,7 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture( if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY) { // it's in the agent inventory - LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) ) { return ACCEPT_NO; @@ -2502,7 +2499,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory( if(mSource == SOURCE_AGENT) { - LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH)); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if( gInventory.isObjectDescendentOf( category->getUUID(), trash_id ) ) { return ACCEPT_NO; diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp new file mode 100644 index 00000000000..c974171c2c2 --- /dev/null +++ b/indra/newview/llviewerassettype.cpp @@ -0,0 +1,114 @@ +/** + * @file llassettype.cpp + * @brief Implementatino of LLViewerAssetType functionality. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llviewerassettype.h" +#include "lldictionary.h" +#include "llmemory.h" +#include "llsingleton.h" + +static const std::string empty_string; + +struct ViewerAssetEntry : public LLDictionaryEntry +{ + ViewerAssetEntry(EDragAndDropType dad_type // drag and drop type + ) + : + LLDictionaryEntry(empty_string), // no reverse lookup needed for now, so just leave this blank + mDadType(dad_type) + { + } + EDragAndDropType mDadType; +}; + +class LLViewerAssetDictionary : public LLSingleton<LLViewerAssetDictionary>, + public LLDictionary<LLViewerAssetType::EType, ViewerAssetEntry> +{ +public: + LLViewerAssetDictionary(); +}; + +LLViewerAssetDictionary::LLViewerAssetDictionary() +{ + // DRAG&DROP TYPE + // |--------------------| + addEntry(LLViewerAssetType::AT_TEXTURE, new ViewerAssetEntry(DAD_TEXTURE)); + addEntry(LLViewerAssetType::AT_SOUND, new ViewerAssetEntry(DAD_SOUND)); + addEntry(LLViewerAssetType::AT_CALLINGCARD, new ViewerAssetEntry(DAD_CALLINGCARD)); + addEntry(LLViewerAssetType::AT_LANDMARK, new ViewerAssetEntry(DAD_LANDMARK)); + addEntry(LLViewerAssetType::AT_SCRIPT, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_CLOTHING, new ViewerAssetEntry(DAD_CLOTHING)); + addEntry(LLViewerAssetType::AT_OBJECT, new ViewerAssetEntry(DAD_OBJECT)); + addEntry(LLViewerAssetType::AT_NOTECARD, new ViewerAssetEntry(DAD_NOTECARD)); + addEntry(LLViewerAssetType::AT_CATEGORY, new ViewerAssetEntry(DAD_CATEGORY)); + addEntry(LLViewerAssetType::AT_ROOT_CATEGORY, new ViewerAssetEntry(DAD_ROOT_CATEGORY)); + addEntry(LLViewerAssetType::AT_LSL_TEXT, new ViewerAssetEntry(DAD_SCRIPT)); + addEntry(LLViewerAssetType::AT_LSL_BYTECODE, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_TEXTURE_TGA, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_BODYPART, new ViewerAssetEntry(DAD_BODYPART)); + addEntry(LLViewerAssetType::AT_SOUND_WAV, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_IMAGE_TGA, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_IMAGE_JPEG, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_ANIMATION, new ViewerAssetEntry(DAD_ANIMATION)); + addEntry(LLViewerAssetType::AT_GESTURE, new ViewerAssetEntry(DAD_GESTURE)); + addEntry(LLViewerAssetType::AT_SIMSTATE, new ViewerAssetEntry(DAD_NONE)); + + addEntry(LLViewerAssetType::AT_LINK, new ViewerAssetEntry(DAD_LINK)); + addEntry(LLViewerAssetType::AT_LINK_FOLDER, new ViewerAssetEntry(DAD_LINK)); + + addEntry(LLViewerAssetType::AT_NONE, new ViewerAssetEntry(DAD_NONE)); +}; + +EDragAndDropType LLViewerAssetType::lookupDragAndDropType(EType asset_type) +{ + const LLViewerAssetDictionary *dict = LLViewerAssetDictionary::getInstance(); + const ViewerAssetEntry *entry = dict->lookup(asset_type); + if (entry) + return entry->mDadType; + else + return DAD_NONE; +} + +// Generate a good default description +void LLViewerAssetType::generateDescriptionFor(LLViewerAssetType::EType asset_type, + std::string& description) +{ + const S32 BUF_SIZE = 30; + char time_str[BUF_SIZE]; /* Flawfinder: ignore */ + time_t now; + time(&now); + memset(time_str, '\0', BUF_SIZE); + strftime(time_str, BUF_SIZE - 1, "%Y-%m-%d %H:%M:%S ", localtime(&now)); + description.assign(time_str); + description.append(LLAssetType::lookupHumanReadable(asset_type)); +} diff --git a/indra/newview/llviewerassettype.h b/indra/newview/llviewerassettype.h new file mode 100644 index 00000000000..01158885cec --- /dev/null +++ b/indra/newview/llviewerassettype.h @@ -0,0 +1,54 @@ +/** + * @file llviewerassettype.h + * @brief Declaration of LLViewerViewerAssetType. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLVIEWERASSETTYPE_H +#define LL_LLVIEWERASSETTYPE_H + +#include <string> +#include "llassettype.h" + +// This class is similar to llassettype, but contains methods +// only used by the viewer. +class LLViewerAssetType : public LLAssetType +{ +public: + // Generate a good default description. You may want to add a verb + // or agent name after this depending on your application. + static void generateDescriptionFor(LLViewerAssetType::EType asset_type, + std::string& description); + static EDragAndDropType lookupDragAndDropType(EType asset_type); +protected: + LLViewerAssetType() {} + ~LLViewerAssetType() {} +}; + +#endif // LL_LLVIEWERASSETTYPE_H diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp new file mode 100644 index 00000000000..384538364f0 --- /dev/null +++ b/indra/newview/llviewerfoldertype.cpp @@ -0,0 +1,263 @@ +/** + * @file llfoldertype.cpp + * @brief Implementation of LLViewerFolderType functionality. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llviewerfoldertype.h" +#include "lldictionary.h" +#include "llmemory.h" +#include "llvisualparam.h" + +static const std::string empty_string; + +struct ViewerFolderEntry : public LLDictionaryEntry +{ + // Constructor for non-ensembles + ViewerFolderEntry(const std::string &new_category_name, // default name when creating a new category of this type + const std::string &icon_name // name of the folder icon + ) + : + LLDictionaryEntry(empty_string), // no reverse lookup needed on non-ensembles, so just leave this blank + mIconName(icon_name), + mNewCategoryName(new_category_name) + { + mAllowedNames.clear(); + } + + // Constructor for ensembles + ViewerFolderEntry(const std::string &xui_name, // name of the xui menu item + const std::string &new_category_name, // default name when creating a new category of this type + const std::string &icon_name, // name of the folder icon + const std::string allowed_names // allowed item typenames for this folder type + ) + : + LLDictionaryEntry(xui_name), + mIconName(icon_name), + mNewCategoryName(new_category_name) + { + const std::string delims (","); + LLStringUtilBase<char>::getTokens(allowed_names, mAllowedNames, delims); + } + + bool getIsAllowedName(const std::string &name) const + { + if (mAllowedNames.empty()) + return false; + for (name_vec_t::const_iterator iter = mAllowedNames.begin(); + iter != mAllowedNames.end(); + iter++) + { + if (name == (*iter)) + return true; + } + return false; + } + const std::string mIconName; + const std::string mNewCategoryName; + typedef std::vector<std::string> name_vec_t; + name_vec_t mAllowedNames; +}; + +class LLViewerFolderDictionary : public LLSingleton<LLViewerFolderDictionary>, + public LLDictionary<LLFolderType::EType, ViewerFolderEntry> +{ +public: + LLViewerFolderDictionary(); +protected: + bool initEnsemblesFromFile(); // Reads in ensemble information from foldertypes.xml +}; + +LLViewerFolderDictionary::LLViewerFolderDictionary() +{ + initEnsemblesFromFile(); + + // NEW CATEGORY NAME FOLDER ICON NAME + // |-------------------------|---------------------------| + addEntry(LLFolderType::FT_TEXTURE, new ViewerFolderEntry("Textures", "inv_folder_texture.tga")); + addEntry(LLFolderType::FT_SOUND, new ViewerFolderEntry("Sounds", "inv_folder_sound.tga")); + addEntry(LLFolderType::FT_CALLINGCARD, new ViewerFolderEntry("Calling Cards", "inv_folder_callingcard.tga")); + addEntry(LLFolderType::FT_LANDMARK, new ViewerFolderEntry("Landmarks", "inv_folder_landmark.tga")); + addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "inv_folder_clothing.tga")); + addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "inv_folder_object.tga")); + addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "inv_folder_notecard.tga")); + addEntry(LLFolderType::FT_CATEGORY, new ViewerFolderEntry("New Folder", "inv_folder_plain_closed.tga")); + addEntry(LLFolderType::FT_ROOT_CATEGORY, new ViewerFolderEntry("Inventory", "")); + addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "inv_folder_script.tga")); + addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "inv_folder_bodypart.tga")); + addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "inv_folder_trash.tga")); + addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new ViewerFolderEntry("Photo Album", "inv_folder_snapshot.tga")); + addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "inv_folder_lostandfound.tga")); + addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "inv_folder_animation.tga")); + addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "inv_folder_gesture.tga")); + addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorite", "inv_folder_plain_closed.tga")); + + addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "inv_folder_current_outfit.tga")); + addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "inv_folder_outfit.tga")); + addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "inv_folder_my_outfits.tga")); + addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "inv_folder_inbox.tga")); + + addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "inv_folder_plain_closed.tga")); +} + +bool LLViewerFolderDictionary::initEnsemblesFromFile() +{ + std::string xml_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"foldertypes.xml"); + LLXmlTree folder_def; + if (!folder_def.parseFile(xml_filename)) + { + llerrs << "Failed to parse folders file " << xml_filename << llendl; + return false; + } + + LLXmlTreeNode* rootp = folder_def.getRoot(); + for (LLXmlTreeNode* ensemble = rootp->getFirstChild(); + ensemble; + ensemble = rootp->getNextChild()) + { + if (!ensemble->hasName("ensemble")) + { + llwarns << "Invalid ensemble definition node " << ensemble->getName() << llendl; + continue; + } + + S32 ensemble_type; + static LLStdStringHandle ensemble_num_string = LLXmlTree::addAttributeString("foldertype_num"); + if (!ensemble->getFastAttributeS32(ensemble_num_string, ensemble_type)) + { + llwarns << "No ensemble type defined" << llendl; + continue; + } + + + if (ensemble_type < S32(LLFolderType::FT_ENSEMBLE_START) || ensemble_type > S32(LLFolderType::FT_ENSEMBLE_END)) + { + llwarns << "Exceeded maximum ensemble index" << LLFolderType::FT_ENSEMBLE_END << llendl; + break; + } + + std::string xui_name; + static LLStdStringHandle xui_name_string = LLXmlTree::addAttributeString("xui_name"); + if (!ensemble->getFastAttributeString(xui_name_string, xui_name)) + { + llwarns << "No xui name defined" << llendl; + continue; + } + + std::string icon_name; + static LLStdStringHandle icon_name_string = LLXmlTree::addAttributeString("icon_name"); + if (!ensemble->getFastAttributeString(icon_name_string, icon_name)) + { + llwarns << "No ensemble icon name defined" << llendl; + continue; + } + + std::string allowed_names; + static LLStdStringHandle allowed_names_string = LLXmlTree::addAttributeString("allowed"); + if (!ensemble->getFastAttributeString(allowed_names_string, allowed_names)) + { + } + + // Add the entry and increment the asset number. + const static std::string new_ensemble_name = "New Ensemble"; + addEntry(LLFolderType::EType(ensemble_type), new ViewerFolderEntry(xui_name, new_ensemble_name, icon_name, allowed_names)); + } + + return true; +} + + +const std::string &LLViewerFolderType::lookupXUIName(LLFolderType::EType folder_type) +{ + const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type); + if (entry) + { + return entry->mName; + } + return badLookup(); +} + +LLFolderType::EType LLViewerFolderType::lookupTypeFromXUIName(const std::string &name) +{ + return LLViewerFolderDictionary::getInstance()->lookup(name); +} + +const std::string &LLViewerFolderType::lookupIconName(LLFolderType::EType folder_type) +{ + const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type); + if (entry) + { + return entry->mIconName; + } + return badLookup(); +} + +const std::string &LLViewerFolderType::lookupNewCategoryName(LLFolderType::EType folder_type) +{ + const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type); + if (entry) + { + return entry->mNewCategoryName; + } + return badLookup(); +} + +LLFolderType::EType LLViewerFolderType::lookupTypeFromNewCategoryName(const std::string& name) +{ + for (LLViewerFolderDictionary::const_iterator iter = LLViewerFolderDictionary::getInstance()->begin(); + iter != LLViewerFolderDictionary::getInstance()->end(); + iter++) + { + const ViewerFolderEntry *entry = iter->second; + if (entry->mNewCategoryName == name) + { + return iter->first; + } + } + return FT_NONE; +} + + +U64 LLViewerFolderType::lookupValidFolderTypes(const std::string& item_name) +{ + U64 matching_folders = 0; + for (LLViewerFolderDictionary::const_iterator iter = LLViewerFolderDictionary::getInstance()->begin(); + iter != LLViewerFolderDictionary::getInstance()->end(); + iter++) + { + const ViewerFolderEntry *entry = iter->second; + if (entry->getIsAllowedName(item_name)) + { + matching_folders |= 1LL << iter->first; + } + } + return matching_folders; +} diff --git a/indra/newview/llviewerfoldertype.h b/indra/newview/llviewerfoldertype.h new file mode 100644 index 00000000000..a6aea62b2a3 --- /dev/null +++ b/indra/newview/llviewerfoldertype.h @@ -0,0 +1,57 @@ +/** + * @file llviewerfoldertype.h + * @brief Declaration of LLAssetType. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLVIEWERFOLDERTYPE_H +#define LL_LLVIEWERFOLDERTYPE_H + +#include <string> +#include "llfoldertype.h" + +// This class is similar to llfoldertype, but contains methods +// only used by the viewer. This also handles ensembles. +class LLViewerFolderType : public LLFolderType +{ +public: + static const std::string& lookupXUIName(EType folder_type); // name used by the UI + static LLFolderType::EType lookupTypeFromXUIName(const std::string& name); + + static const std::string& lookupIconName(EType asset_type); // folder icon name + static const std::string& lookupNewCategoryName(EType folder_type); // default name when creating new category + static LLFolderType::EType lookupTypeFromNewCategoryName(const std::string& name); // default name when creating new category + + static U64 lookupValidFolderTypes(const std::string& item_name); // which folders allow an item of this type? +protected: + LLViewerFolderType() {} + ~LLViewerFolderType() {} +}; + +#endif // LL_LLVIEWERFOLDERTYPE_H diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 57a4117d5d5..38ff5a20640 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -37,7 +37,7 @@ #include "indra_constants.h" #include "llagent.h" -#include "llfoldertype.h" +#include "llviewerfoldertype.h" #include "llviewercontrol.h" #include "llconsole.h" #include "llinventorymodel.h" @@ -48,6 +48,7 @@ #include "llinventorybridge.h" #include "llfloaterinventory.h" +#include "llviewerassettype.h" #include "llviewerregion.h" #include "llviewerobjectlist.h" #include "llpreviewgesture.h" @@ -359,7 +360,7 @@ void LLViewerInventoryItem::updateParentOnServer(BOOL restamp) const LLViewerInventoryCategory::LLViewerInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid, - LLAssetType::EType pref, + LLFolderType::EType pref, const std::string& name, const LLUUID& owner_id) : LLInventoryCategory(uuid, parent_uuid, pref, name), @@ -416,7 +417,7 @@ void LLViewerInventoryCategory::updateServer(BOOL is_new) const { // communicate that change with the server. - if (LLAssetType::lookupIsProtectedCategoryType(mPreferredType)) + if (LLFolderType::lookupIsProtectedType(mPreferredType)) { LLNotifications::instance().add("CannotModifyProtectedCategories"); return; @@ -440,7 +441,7 @@ void LLViewerInventoryCategory::removeFromServer( void ) llinfos << "Removing inventory category " << mUUID << " from server." << llendl; // communicate that change with the server. - if(LLAssetType::lookupIsProtectedCategoryType(mPreferredType)) + if(LLFolderType::lookupIsProtectedType(mPreferredType)) { LLNotifications::instance().add("CannotRemoveProtectedCategories"); return; @@ -543,7 +544,7 @@ bool LLViewerInventoryCategory::importFileLocal(LLFILE* fp) } else if(0 == strcmp("pref_type", keyword)) { - mPreferredType = LLAssetType::lookup(valuestr); + mPreferredType = LLFolderType::lookup(valuestr); } else if(0 == strcmp("name", keyword)) { @@ -581,7 +582,7 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const mParentUUID.toString(uuid_str); fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str()); fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); - fprintf(fp, "\t\tpref_type\t%s\n", LLAssetType::lookup(mPreferredType)); + fprintf(fp, "\t\tpref_type\t%s\n", LLFolderType::lookup(mPreferredType).c_str()); fprintf(fp, "\t\tname\t%s|\n", mName.c_str()); mOwnerID.toString(uuid_str); fprintf(fp, "\t\towner_id\t%s\n", uuid_str.c_str()); @@ -592,8 +593,8 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const void LLViewerInventoryCategory::determineFolderType() { - LLAssetType::EType original_type = getPreferredType(); - if (LLAssetType::lookupIsProtectedCategoryType(original_type)) + LLFolderType::EType original_type = getPreferredType(); + if (LLFolderType::lookupIsProtectedType(original_type)) return; U64 folder_valid = 0; @@ -616,28 +617,28 @@ void LLViewerInventoryCategory::determineFolderType() { const EWearableType wearable_type = item->getWearableType(); const std::string& wearable_name = LLWearableDictionary::getTypeName(wearable_type); - U64 valid_folder_types = LLFolderType::lookupValidFolderTypes(wearable_name); + U64 valid_folder_types = LLViewerFolderType::lookupValidFolderTypes(wearable_name); folder_valid |= valid_folder_types; folder_invalid |= ~valid_folder_types; } } - for (U8 i = LLAssetType::AT_FOLDER_ENSEMBLE_START; i <= LLAssetType::AT_FOLDER_ENSEMBLE_END; i++) + for (U8 i = LLFolderType::FT_ENSEMBLE_START; i <= LLFolderType::FT_ENSEMBLE_END; i++) { if ((folder_valid & (1LL << i)) && !(folder_invalid & (1LL << i))) { - changeType((LLAssetType::EType)i); + changeType((LLFolderType::EType)i); return; } } } - if (LLAssetType::lookupIsEnsembleCategoryType(original_type)) + if (LLFolderType::lookupIsEnsembleType(original_type)) { - changeType(LLAssetType::AT_NONE); + changeType(LLFolderType::FT_NONE); } } -void LLViewerInventoryCategory::changeType(LLAssetType::EType new_folder_type) +void LLViewerInventoryCategory::changeType(LLFolderType::EType new_folder_type) { const LLUUID &folder_id = getUUID(); const LLUUID &parent_id = getParentUUID(); @@ -948,7 +949,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecar body["notecard-id"] = notecard_inv_id; body["object-id"] = object_id; body["item-id"] = src->getUUID(); - body["folder-id"] = gInventory.findCategoryUUIDForType(src->getType()); + body["folder-id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType())); body["callback-id"] = (LLSD::Integer)callback_id; request["message"] = "CopyInventoryFromNotecard"; @@ -964,7 +965,7 @@ void create_new_item(const std::string& name, U32 next_owner_perm) { std::string desc; - LLAssetType::generateDescriptionFor(asset_type, desc); + LLViewerAssetType::generateDescriptionFor(asset_type, desc); next_owner_perm = (next_owner_perm) ? next_owner_perm : PERM_MOVE | PERM_TRANSFER; @@ -989,19 +990,14 @@ const std::string NEW_LSL_NAME = "New Script"; // *TODO:Translate? (probably not const std::string NEW_NOTECARD_NAME = "New Note"; // *TODO:Translate? (probably not) const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probably not) +// ! REFACTOR ! Really need to refactor this so that it's not a bunch of if-then statements... void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid) { - std::string type = userdata.asString(); + std::string type_name = userdata.asString(); - if (("category" == type) || ("current" == type) || ("outfit" == type) || ("my_otfts" == type) ) + if (("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name)) { - LLAssetType::EType a_type = LLAssetType::AT_NONE; - if ("current" == type) - a_type = LLAssetType::AT_CURRENT_OUTFIT; - if ("outfit" == type) - a_type = LLAssetType::AT_OUTFIT; - if ("my_otfts" == type) - a_type = LLAssetType::AT_MY_OUTFITS; + LLFolderType::EType preferred_type = LLFolderType::lookup(type_name); LLUUID parent_id; if (bridge) @@ -1017,100 +1013,100 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co parent_id = gInventory.getRootFolderID(); } - LLUUID category = gInventory.createNewCategory(parent_id, a_type, LLStringUtil::null); + LLUUID category = gInventory.createNewCategory(parent_id, preferred_type, LLStringUtil::null); gInventory.notifyObservers(); folder->setSelectionByID(category, TRUE); } - else if ("lsl" == type) + else if ("lsl" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_LSL_TEXT); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_LSL_TEXT); create_new_item(NEW_LSL_NAME, parent_id, LLAssetType::AT_LSL_TEXT, LLInventoryType::IT_LSL, PERM_MOVE | PERM_TRANSFER); } - else if ("notecard" == type) + else if ("notecard" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_NOTECARD); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_NOTECARD); create_new_item(NEW_NOTECARD_NAME, parent_id, LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, PERM_ALL); } - else if ("gesture" == type) + else if ("gesture" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_GESTURE); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE); create_new_item(NEW_GESTURE_NAME, parent_id, LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, PERM_ALL); } - else if ("shirt" == type) + else if ("shirt" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_SHIRT); } - else if ("pants" == type) + else if ("pants" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_PANTS); } - else if ("shoes" == type) + else if ("shoes" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_SHOES); } - else if ("socks" == type) + else if ("socks" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_SOCKS); } - else if ("jacket" == type) + else if ("jacket" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_JACKET); } - else if ("skirt" == type) + else if ("skirt" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_SKIRT); } - else if ("gloves" == type) + else if ("gloves" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_GLOVES); } - else if ("undershirt" == type) + else if ("undershirt" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_UNDERSHIRT); } - else if ("underpants" == type) + else if ("underpants" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_UNDERPANTS); } - else if ("shape" == type) + else if ("shape" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART); LLFolderBridge::createWearable(parent_id, WT_SHAPE); } - else if ("skin" == type) + else if ("skin" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART); LLFolderBridge::createWearable(parent_id, WT_SKIN); } - else if ("hair" == type) + else if ("hair" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART); LLFolderBridge::createWearable(parent_id, WT_HAIR); } - else if ("eyes" == type) + else if ("eyes" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART); LLFolderBridge::createWearable(parent_id, WT_EYES); } diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index d523bf28594..529425aa258 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -185,7 +185,7 @@ class LLViewerInventoryCategory : public LLInventoryCategory public: LLViewerInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid, - LLAssetType::EType preferred_type, + LLFolderType::EType preferred_type, const std::string& name, const LLUUID& owner_id); LLViewerInventoryCategory(const LLUUID& owner_id); @@ -221,7 +221,7 @@ class LLViewerInventoryCategory : public LLInventoryCategory bool exportFileLocal(LLFILE* fp) const; bool importFileLocal(LLFILE* fp); void determineFolderType(); - void changeType(LLAssetType::EType new_folder_type); + void changeType(LLFolderType::EType new_folder_type); protected: LLUUID mOwnerID; S32 mVersion; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index dc291d6c34c..e4643a15b58 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -4190,12 +4190,10 @@ void handle_take_copy() { if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return; - LLUUID category_id = - gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); + const LLUUID category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); derez_objects(DRD_ACQUIRE_TO_AGENT_INVENTORY, category_id); } - // You can return an object to its owner if it is on your land. class LLObjectReturn : public view_listener_t { @@ -4276,7 +4274,7 @@ class LLObjectEnableReturn : public view_listener_t void force_take_copy(void*) { if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return; - const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); + const LLUUID category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); derez_objects(DRD_FORCE_TO_GOD_INVENTORY, category_id); } @@ -4337,8 +4335,7 @@ void handle_take() if(category_id.notNull()) { // check trash - LLUUID trash; - trash = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if(category_id == trash || gInventory.isObjectDescendentOf(category_id, trash)) { category_id.setNull(); @@ -4354,7 +4351,7 @@ void handle_take() } if(category_id.isNull()) { - category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); + category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); } LLSD payload; payload["folder_id"] = category_id; @@ -6933,7 +6930,7 @@ void handle_grab_texture(void* data) LL_INFOS("texture") << "Adding baked texture " << asset_id << " to inventory." << llendl; LLAssetType::EType asset_type = LLAssetType::AT_TEXTURE; LLInventoryType::EType inv_type = LLInventoryType::IT_TEXTURE; - LLUUID folder_id(gInventory.findCategoryUUIDForType(asset_type)); + const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(asset_type)); if(folder_id.notNull()) { std::string name = "Unknown"; diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index d3a9e1cef8a..d17c7e486fe 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -319,7 +319,7 @@ class LLFileUploadBulk : public view_listener_t LLAssetStorage::LLStoreAssetCallback callback = NULL; S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); void *userdata = NULL; - upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, + upload_new_resource(filename, asset_name, asset_name, 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), display_name, callback, expected_upload_cost, userdata); @@ -493,7 +493,7 @@ void handle_compress_image(void*) void upload_new_resource(const std::string& src_filename, std::string name, std::string desc, S32 compression_info, - LLAssetType::EType destination_folder_type, + LLFolderType::EType destination_folder_type, LLInventoryType::EType inv_type, U32 next_owner_perms, U32 group_perms, @@ -810,7 +810,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt if(result >= 0) { - LLAssetType::EType dest_loc = (data->mPreferredLocation == LLAssetType::AT_NONE) ? data->mAssetInfo.mType : data->mPreferredLocation; + LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation; if (LLAssetType::AT_SOUND == data->mAssetInfo.mType || LLAssetType::AT_TEXTURE == data->mAssetInfo.mType || @@ -856,7 +856,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt { // Actually add the upload to inventory llinfos << "Adding " << uuid << " to inventory." << llendl; - LLUUID folder_id(gInventory.findCategoryUUIDForType(dest_loc)); + const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc); if(folder_id.notNull()) { U32 next_owner_perms = data->mNextOwnerPerm; @@ -903,7 +903,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt LLAssetStorage::LLStoreAssetCallback callback = NULL; void *userdata = NULL; upload_new_resource(next_file, asset_name, asset_name, // file - 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, + 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, PERM_NONE, PERM_NONE, PERM_NONE, display_name, callback, @@ -915,7 +915,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type, std::string name, std::string desc, S32 compression_info, - LLAssetType::EType destination_folder_type, + LLFolderType::EType destination_folder_type, LLInventoryType::EType inv_type, U32 next_owner_perms, U32 group_perms, @@ -973,14 +973,14 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty llinfos << "Name: " << name << llendl; llinfos << "Desc: " << desc << llendl; llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl; - lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type) << llendl; + lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << llendl; lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl; std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory"); if (!url.empty()) { llinfos << "New Agent Inventory via capability" << llendl; LLSD body; - body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type); + body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type); body["asset_type"] = LLAssetType::lookup(asset_type); body["inventory_type"] = LLInventoryType::lookup(inv_type); body["name"] = name; diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index bf21292082b..da78537a295 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -33,7 +33,7 @@ #ifndef LLVIEWERMENUFILE_H #define LLVIEWERMENUFILE_H -#include "llassettype.h" +#include "llfoldertype.h" #include "llinventorytype.h" class LLTransactionID; @@ -45,7 +45,7 @@ void upload_new_resource(const std::string& src_filename, std::string name, std::string desc, S32 compression_info, - LLAssetType::EType destination_folder_type, + LLFolderType::EType destination_folder_type, LLInventoryType::EType inv_type, U32 next_owner_perms, U32 group_perms, @@ -60,7 +60,7 @@ void upload_new_resource(const LLTransactionID &tid, std::string name, std::string desc, S32 compression_info, - LLAssetType::EType destination_folder_type, + LLFolderType::EType destination_folder_type, LLInventoryType::EType inv_type, U32 next_owner_perms, U32 group_perms, diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 791ec073491..966ddad5580 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -210,7 +210,6 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] = bool friendship_offer_callback(const LLSD& notification, const LLSD& response) { S32 option = LLNotification::getSelectedOption(notification, response); - LLUUID fid; LLMessageSystem* msg = gMessageSystem; const LLSD& payload = notification["payload"]; @@ -220,10 +219,11 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response) switch(option) { case 0: + { // accept LLAvatarTracker::formFriendship(payload["from_id"]); - fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + const LLUUID fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); // This will also trigger an onlinenotification if the user is online msg->newMessageFast(_PREHASH_AcceptFriendship); @@ -236,7 +236,9 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response) msg->addUUIDFast(_PREHASH_FolderID, fid); msg->sendReliable(LLHost(payload["sender"].asString())); break; + } case 1: + { // decline // We no longer notify other viewers, but we DO still send // the rejection to the simulator to delete the pending userop. @@ -248,6 +250,7 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response) msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]); msg->sendReliable(LLHost(payload["sender"].asString())); break; + } default: // close button probably, possibly timed out break; @@ -768,8 +771,7 @@ class LLDiscardAgentOffer : public LLInventoryFetchComboObserver virtual void done() { LL_DEBUGS("Messaging") << "LLDiscardAgentOffer::done()" << LL_ENDL; - LLUUID trash_id; - trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); bool notify = false; if(trash_id.notNull() && mObjectID.notNull()) { @@ -876,7 +878,7 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name) { std::vector<LLUUID>::const_iterator it = items.begin(); std::vector<LLUUID>::const_iterator end = items.end(); - LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH)); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); LLInventoryItem* item; for(; it != end; ++it) { @@ -947,13 +949,12 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name) } //Trash Check - LLUUID trash_id; - trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { return; } - LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); //BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view); BOOL user_is_away = gAwayTimer.getStarted(); @@ -1713,7 +1714,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) info->mFromGroup = from_group; info->mTransactionID = session_id; info->mType = (LLAssetType::EType) asset_type; - info->mFolderID = gInventory.findCategoryUUIDForType(info->mType); + info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType)); std::string from_name; from_name += "A group member named "; @@ -1847,7 +1848,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) info->mFromID = from_id; info->mFromGroup = from_group; info->mTransactionID = session_id; - info->mFolderID = gInventory.findCategoryUUIDForType(info->mType); + info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType)); if (dialog == IM_TASK_INVENTORY_OFFERED) { @@ -2141,7 +2142,7 @@ bool callingcard_offer_callback(const LLSD& notification, const LLSD& response) msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); msg->nextBlockFast(_PREHASH_TransactionBlock); msg->addUUIDFast(_PREHASH_TransactionID, notification["payload"]["transaction_id"].asUUID()); - fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); msg->nextBlockFast(_PREHASH_FolderData); msg->addUUIDFast(_PREHASH_FolderID, fid); msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); @@ -2594,11 +2595,10 @@ BOOL LLPostTeleportNotifiers::tick() { // get callingcards and landmarks available to the user arriving. LLInventoryFetchDescendentsObserver::folder_ref_t folders; - LLUUID folder_id; - folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); - if(folder_id.notNull()) - folders.push_back(folder_id); - folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + const LLUUID callingcard_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); + if(callingcard_id.notNull()) + folders.push_back(callingcard_id); + const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); if(folder_id.notNull()) folders.push_back(folder_id); if(!folders.empty()) @@ -4816,7 +4816,7 @@ void container_inventory_arrived(LLViewerObject* object, // create a new inventory category to put this in LLUUID cat_id; cat_id = gInventory.createNewCategory(gInventory.getRootFolderID(), - LLAssetType::AT_NONE, + LLFolderType::FT_NONE, LLTrans::getString("AcquiredItems")); InventoryObjectList::const_iterator it = inventory->begin(); @@ -4866,7 +4866,7 @@ void container_inventory_arrived(LLViewerObject* object, } LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it)); - LLUUID category = gInventory.findCategoryUUIDForType(item->getType()); + const LLUUID category = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType())); LLUUID item_id; item_id.generate(); diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 65994dfb308..4ce0e2476ba 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -59,6 +59,7 @@ #include "lltooltip.h" #include "lltrans.h" #include "lluictrlfactory.h" +#include "llviewerassettype.h" #include "llviewercontrol.h" #include "llviewerinventory.h" #include "llviewertexturelist.h" @@ -465,19 +466,17 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const } break; - case LLAssetType::AT_SOUND: img_name = "Inv_Sound"; break; + case LLAssetType::AT_SOUND: img_name = "Inv_Sound"; break; case LLAssetType::AT_CLOTHING: img_name = "Inv_Clothing"; break; - case LLAssetType::AT_OBJECT: img_name = "Inv_Object"; break; + case LLAssetType::AT_OBJECT: img_name = "Inv_Object"; break; case LLAssetType::AT_CALLINGCARD: img_name = "Inv_CallingCard"; break; - case LLAssetType::AT_LANDMARK: img_name = "Inv_Landmark"; break; + case LLAssetType::AT_LANDMARK: img_name = "Inv_Landmark"; break; case LLAssetType::AT_NOTECARD: img_name = "Inv_Notecard"; break; case LLAssetType::AT_LSL_TEXT: img_name = "Inv_Script"; break; - case LLAssetType::AT_BODYPART: img_name = "Inv_Skin"; break; - case LLAssetType::AT_ANIMATION: img_name = "Inv_Animation";break; - case LLAssetType::AT_GESTURE: img_name = "Inv_Gesture"; break; - //TODO need img_name - case LLAssetType::AT_FAVORITE: img_name = "Inv_Landmark"; break; - default: llassert(0); + case LLAssetType::AT_BODYPART: img_name = "Inv_Skin"; break; + case LLAssetType::AT_ANIMATION: img_name = "Inv_Animation"; break; + case LLAssetType::AT_GESTURE: img_name = "Inv_Gesture"; break; + default: llassert(0); } return LLUI::getUIImage(img_name); @@ -692,11 +691,10 @@ BOOL LLViewerTextEditor::handleHover(S32 x, S32 y, MASK mask) if( LLToolDragAndDrop::getInstance()->isOverThreshold( screen_x, screen_y ) ) { LLToolDragAndDrop::getInstance()->beginDrag( - LLAssetType::lookupDragAndDropType( mDragItem->getType() ), + LLViewerAssetType::lookupDragAndDropType( mDragItem->getType() ), mDragItem->getUUID(), LLToolDragAndDrop::SOURCE_NOTECARD, mPreviewID, mObjectID); - return LLToolDragAndDrop::getInstance()->handleHover( x, y, mask ); } getWindow()->setCursor(UI_CURSOR_HAND); diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 964b16df046..9a115ea4e6c 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -35,53 +35,22 @@ #include "llvoavatarself.h" #include "llvoavatar.h" -#include <stdio.h> -#include <ctype.h> - -#include "llaudioengine.h" -#include "noise.h" +#include "pipeline.h" -// TODO: Seraph - Remove unnecessary headers. These are copied from llvoavatar.h. #include "llagent.h" // Get state values from here #include "llagentwearables.h" -#include "llviewercontrol.h" -#include "lldrawpoolavatar.h" -#include "lldriverparam.h" -#include "lleditingmotion.h" -#include "llemote.h" -#include "llface.h" -#include "llfirstuse.h" -#include "llheadrotmotion.h" #include "llhudeffecttrail.h" #include "llhudmanager.h" -#include "llkeyframefallmotion.h" -#include "llkeyframestandmotion.h" -#include "llkeyframewalkmotion.h" -#include "llmutelist.h" #include "llselectmgr.h" -#include "llsprite.h" -#include "lltargetingmotion.h" -#include "lltexlayer.h" -#include "lltexglobalcolor.h" #include "lltoolgrab.h" // for needsRenderBeam #include "lltoolmgr.h" // for needsRenderBeam #include "lltoolmorph.h" #include "lltrans.h" #include "llviewercamera.h" -#include "llviewertexturelist.h" #include "llviewermenu.h" #include "llviewerobjectlist.h" -#include "llviewerparcelmgr.h" #include "llviewerstats.h" -#include "llvovolume.h" -#include "llworld.h" -#include "pipeline.h" -#include "llviewershadermgr.h" -#include "llsky.h" -#include "llanimstatelabels.h" -#include "llgesturemgr.h" //needed to trigger the voice gesticulations -#include "llvoiceclient.h" -#include "llvoicevisualizer.h" // Ventrella +#include "llviewerregion.h" #include "llappearancemgr.h" #include "boost/lexical_cast.hpp" diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 3fe02088c4c..94194b5c0b7 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -1123,7 +1123,7 @@ void LLWearable::saveNewAsset() const { llinfos << "Update Agent Inventory via capability" << llendl; LLSD body; - body["folder_id"] = gInventory.findCategoryUUIDForType(getAssetType()); + body["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetToFolderType(getAssetType())); body["asset_type"] = LLAssetType::lookup(getAssetType()); body["inventory_type"] = LLInventoryType::lookup(LLInventoryType::IT_WEARABLE); body["name"] = getName(); diff --git a/indra/newview/skins/default/textures/inv_folder_inbox.tga b/indra/newview/skins/default/textures/inv_folder_inbox.tga new file mode 100644 index 0000000000000000000000000000000000000000..04539c2cc4f002c9c1c4724215e5b7cf08cfb177 GIT binary patch literal 2085 zcmeHF!A`<J5M4AHk9>fKet>f010<nM6C<Rk@xY~Nuo|!!T2CB$X+NS#6Am0oNjUUJ z`U(7kM~>sZRfwUbA~8l2HhG<$H#7UTvr}RRY`My;%%l@WL_Y$4EbRj5voIthO}`E3 zE$dUh3Hc}d$|8pYdYO7&t0)TDwoScWF9Yz17u8#qMU%;dMxzmp$77n!X2QY;k9bkN zX__KGiXsYvfHX}L7Cz2H9RIlK{*L2N9LLmdx2amKlIMBC!UvCdk-jX;RIAm<_kBu| zgr?J}u<*enUZjtnx~@yZ;gGuBuIM2weDH{G(#IQagFOAB`N4eUfy=FCAMwRvvC@YI zAnHEm>~ntJK2KvgV|n?1fqO0S8}8RX=z#j9n;oU256+|u!+5d#_l~4mMkRCg`H__2 z)`@HFrhcoo)W+5MovdEgD{T8gXsjQ$_kXnmP5sewq}D_KS!xdYyGb9O9={i62jLCQ C7t+N5 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index c33f68eaf7a..1181493393b 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -31,7 +31,7 @@ left="0" mouse_opaque="true" name="favorites_list" - start_folder="favorite" + start_folder="Favorite" width="380"/> </accordion_tab> <accordion_tab @@ -47,7 +47,7 @@ left="0" mouse_opaque="true" name="landmarks_list" - start_folder="landmark" + start_folder="Landmarks" width="380"/> </accordion_tab> <accordion_tab @@ -63,13 +63,13 @@ left="0" mouse_opaque="true" name="my_inventory_list" - start_folder="inventory" + start_folder="INVENTORY" width="380"/> - </accordion_tab> - <accordion_tab - layout="topleft" - name="tab_library" - title="Library"> + </accordion_tab> + <accordion_tab + layout="topleft" + name="tab_library" + title="Library"> <inventory_subtree_panel allow_multi_select="true" border="true" @@ -79,7 +79,7 @@ left="0" mouse_opaque="true" name="library_list" - start_folder="library" + start_folder="LIBRARY" width="380"/> </accordion_tab> </accordion> -- GitLab From d220211b4dc7e5d39fc1c5f26b3b2bf528a90910 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Mon, 2 Nov 2009 17:32:36 -0800 Subject: [PATCH 028/306] EXT-1803 Fix group inspectors closing before you can see them if you can't join the group. Focus issue -- the inspector had no focusable widgets in that case. Reviewed with Richard. --- indra/newview/skins/default/xui/en/inspect_group.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml index db12daa6e04..42a492090d5 100644 --- a/indra/newview/skins/default/xui/en/inspect_group.xml +++ b/indra/newview/skins/default/xui/en/inspect_group.xml @@ -73,6 +73,8 @@ L$123 to join name="group_icon" top="24" width="38" /> + <!-- Must be tab_stop="true" so something can hold focus even when the + other buttons are disabled or invisible, otherwise inspector closes --> <button follows="top|left" height="18" @@ -84,7 +86,7 @@ L$123 to join right="-8" top="35" left_delta="110" - tab_stop="false" + tab_stop="true" width="18" commit_callback.function="InspectGroup.ViewProfile" /> <button -- GitLab From 3c1c0d7544805df7d77b7f2af4ab1f83ebf0839c Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Mon, 2 Nov 2009 17:58:10 -0800 Subject: [PATCH 029/306] Changed the operation of the "mute all" button in the nearby media floater to be closer to spec-compliant, per a design discussion this afternoon. --- indra/newview/llviewermediafocus.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index 2f7040aaa30..657c58364f6 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -86,6 +86,9 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac mFocusedObjectID = objectp->getID(); mFocusedObjectFace = face; mFocusedObjectNormal = pick_normal; + + // Focusing on a media face clears its disable flag. + media_impl->setDisabled(false); LLTextureEntry* tep = objectp->getTE(face); if(tep->hasMedia()) -- GitLab From 995c18b1c7eb8fd23c0a35d5f504c03b7f2b144f Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Mon, 2 Nov 2009 19:28:24 -0800 Subject: [PATCH 030/306] removed picture_style from LLButton::Params and allow empty labels --- indra/llui/llbutton.cpp | 32 +++---------------- indra/llui/llbutton.h | 5 +-- indra/llui/llfloater.cpp | 1 - indra/llui/llflyoutbutton.cpp | 1 + indra/llui/llmenugl.cpp | 2 -- indra/llui/llscrollbar.cpp | 2 ++ indra/llui/lltabcontainer.cpp | 4 ++- indra/newview/llchiclet.cpp | 3 -- indra/newview/lldebugmessagebox.cpp | 1 + indra/newview/llfavoritesbar.cpp | 1 + .../xui/en/floater_animation_preview.xml | 2 -- .../default/xui/en/floater_avatar_picker.xml | 2 -- .../skins/default/xui/en/floater_camera.xml | 7 ---- .../default/xui/en/floater_color_picker.xml | 1 - .../skins/default/xui/en/floater_gesture.xml | 3 -- .../skins/default/xui/en/floater_lagmeter.xml | 3 -- .../default/xui/en/floater_media_browser.xml | 2 -- .../skins/default/xui/en/floater_moveview.xml | 6 ---- .../default/xui/en/floater_report_abuse.xml | 1 - .../default/xui/en/floater_test_button.xml | 2 -- .../default/xui/en/floater_texture_ctrl.xml | 1 - .../skins/default/xui/en/floater_tools.xml | 27 ---------------- .../skins/default/xui/en/inspect_avatar.xml | 4 --- .../skins/default/xui/en/inspect_group.xml | 1 - .../skins/default/xui/en/inspect_object.xml | 2 -- .../default/xui/en/panel_avatar_list_item.xml | 2 -- .../skins/default/xui/en/panel_bottomtray.xml | 1 - .../skins/default/xui/en/panel_edit_pick.xml | 1 - .../default/xui/en/panel_edit_wearable.xml | 1 - .../xui/en/panel_group_info_sidetray.xml | 2 -- .../default/xui/en/panel_group_list_item.xml | 2 -- .../skins/default/xui/en/panel_landmarks.xml | 3 -- .../default/xui/en/panel_navigation_bar.xml | 4 --- .../xui/en/panel_notifications_channel.xml | 1 - .../skins/default/xui/en/panel_people.xml | 11 ------- .../skins/default/xui/en/panel_pick_info.xml | 1 - .../default/xui/en/panel_pick_list_item.xml | 1 - .../skins/default/xui/en/panel_picks.xml | 3 -- .../skins/default/xui/en/panel_places.xml | 1 - .../xui/en/panel_preferences_alerts.xml | 2 -- .../xui/en/panel_preferences_sound.xml | 7 ---- .../xui/en/panel_prim_media_controls.xml | 18 ----------- .../default/xui/en/panel_profile_view.xml | 1 - .../skins/default/xui/en/panel_progress.xml | 1 - .../default/xui/en/panel_scrolling_param.xml | 2 -- .../default/xui/en/panel_teleport_history.xml | 1 - .../xui/en/panel_teleport_history_item.xml | 2 -- .../default/xui/en/widgets/combo_box.xml | 2 -- .../default/xui/en/widgets/location_input.xml | 2 -- .../default/xui/en/widgets/search_editor.xml | 4 +-- .../default/xui/es/floater_script_debug.xml | 2 +- .../default/xui/it/floater_script_debug.xml | 2 +- .../default/xui/nl/floater_script_debug.xml | 2 +- .../default/xui/pt/floater_script_debug.xml | 2 +- 54 files changed, 19 insertions(+), 181 deletions(-) diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index a7946cacf54..8daceb9485d 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -95,8 +95,7 @@ LLButton::Params::Params() is_toggle("is_toggle", false), scale_image("scale_image", true), hover_glow_amount("hover_glow_amount"), - commit_on_return("commit_on_return", true), - picture_style("picture_style", false) + commit_on_return("commit_on_return", true) { addSynonym(is_toggle, "toggle"); held_down_delay.seconds = 0.5f; @@ -153,17 +152,9 @@ LLButton::LLButton(const LLButton::Params& p) static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0); static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>()); - //if we aren't a picture_style button set label as name if not provided - if (!p.picture_style.isProvided() || !p.picture_style) + if (!p.label_selected.isProvided()) { - if (!p.label.isProvided()) - { - mUnselectedLabel = p.name(); - } - if (!p.label_selected.isProvided()) - { - mSelectedLabel = mUnselectedLabel.getString(); - } + mSelectedLabel = mUnselectedLabel; } // Hack to make sure there is space for at least one character @@ -1099,19 +1090,4 @@ void LLButton::resetMouseDownTimer() { mMouseDownTimer.stop(); mMouseDownTimer.reset(); -} - - -// *TODO: Remove this function after the initial XUI XML re-export pass. -// static -void LLButton::setupParamsForExport(Params& p, LLView* parent) -{ - std::string label = p.label; - if (label.empty()) - { - //if our label is empty this is a picture style button - p.picture_style = true; - } - - LLUICtrl::setupParamsForExport(p, parent); -} +} \ No newline at end of file diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 85580a98bf2..08f289092f2 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -115,8 +115,7 @@ class LLButton // misc Optional<bool> is_toggle, scale_image, - commit_on_return, - picture_style; //if true, don't display label + commit_on_return; Optional<F32> hover_glow_amount; Optional<TimeIntervalParam> held_down_delay; @@ -247,8 +246,6 @@ class LLButton LLFrameTimer mMouseDownTimer; - // If the label is empty, set the picture_style attribute - static void setupParamsForExport(Params& p, LLView* parent); private: void drawBorder(LLUIImage* imagep, const LLColor4& color, S32 size); void resetMouseDownTimer(); diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 26a8b6c48f8..90ba2dc41ff 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1826,7 +1826,6 @@ void LLFloater::buildButtons() LLButton::Params p; p.name(sButtonNames[i]); p.rect(btn_rect); - p.label(""); p.image_unselected.name(sButtonActiveImageNames[i]); // Selected, no matter if hovered or not, is "pressed" p.image_selected.name(sButtonPressedImageNames[i]); diff --git a/indra/llui/llflyoutbutton.cpp b/indra/llui/llflyoutbutton.cpp index 3483bac7820..abb0b869eb8 100644 --- a/indra/llui/llflyoutbutton.cpp +++ b/indra/llui/llflyoutbutton.cpp @@ -48,6 +48,7 @@ LLFlyoutButton::LLFlyoutButton(const Params& p) // Text label button LLButton::Params bp(p.action_button); bp.name(p.label); + bp.label(p.label); bp.rect.left(0).bottom(0).width(getRect().getWidth() - FLYOUT_BUTTON_ARROW_WIDTH).height(getRect().getHeight()); bp.click_callback.function(boost::bind(&LLFlyoutButton::onActionButtonClick, this, _2)); bp.follows.flags(FOLLOWS_ALL); diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 91e7e46195d..7847cc17902 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1555,8 +1555,6 @@ LLMenuScrollItem::LLMenuScrollItem(const Params& p) } LLButton::Params bparams; - bparams.label(""); - bparams.label_selected(""); bparams.mouse_opaque(true); bparams.scale_image(false); bparams.click_callback(p.scroll_callback); diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp index dfd315d4516..b450ecbbf91 100644 --- a/indra/llui/llscrollbar.cpp +++ b/indra/llui/llscrollbar.cpp @@ -115,6 +115,7 @@ LLScrollbar::LLScrollbar(const Params & p) LLButton::Params up_btn(mOrientation == VERTICAL ? p.up_button : p.left_button); up_btn.name(std::string("Line Up")); + up_btn.label(std::string("Line Up")); up_btn.rect(line_up_rect); up_btn.click_callback.function(boost::bind(&LLScrollbar::onLineUpBtnPressed, this, _2)); up_btn.mouse_held_callback.function(boost::bind(&LLScrollbar::onLineUpBtnPressed, this, _2)); @@ -125,6 +126,7 @@ LLScrollbar::LLScrollbar(const Params & p) LLButton::Params down_btn(mOrientation == VERTICAL ? p.down_button : p.right_button); down_btn.name(std::string("Line Down")); + down_btn.label(std::string("Line Down")); down_btn.rect(line_down_rect); down_btn.follows.flags(FOLLOWS_RIGHT|FOLLOWS_BOTTOM); down_btn.click_callback.function(boost::bind(&LLScrollbar::onLineDownBtnPressed, this, _2)); diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index cde4c755184..6ca9c4ceda7 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -927,7 +927,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) textbox = LLUICtrlFactory::create<LLTextBox> (params); LLButton::Params p; - p.name(""); + p.name("placeholder"); btn = LLUICtrlFactory::create<LLButton>(p); } else @@ -1645,6 +1645,7 @@ void LLTabContainer::initButtons() LLButton::Params prev_btn_params; prev_btn_params.name(std::string("Up Arrow")); + prev_btn_params.label(std::string("Up Arrow")); prev_btn_params.rect(up_arrow_btn_rect); prev_btn_params.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT); prev_btn_params.image_unselected.name("scrollbutton_up_out_blue.tga"); @@ -1654,6 +1655,7 @@ void LLTabContainer::initButtons() LLButton::Params next_btn_params; next_btn_params.name(std::string("Down Arrow")); + next_btn_params.label(std::string("Down Arrow")); next_btn_params.rect(down_arrow_btn_rect); next_btn_params.follows.flags(FOLLOWS_BOTTOM | FOLLOWS_LEFT); next_btn_params.image_unselected.name("scrollbutton_down_out_blue.tga"); diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index bad61101c1b..7214ac2886f 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -1264,17 +1264,14 @@ LLTalkButton::Params::Params() speak_button.font(LLFontGL::getFontSansSerifSmall()); speak_button.tab_stop(false); speak_button.is_toggle(true); - speak_button.picture_style(true); // Use default button art. JC //speak_button.image_selected(LLUI::getUIImage("SegmentedBtn_Left_Selected")); //speak_button.image_unselected(LLUI::getUIImage("SegmentedBtn_Left_Off")); show_button.name("right"); - show_button.label(LLStringUtil::null); show_button.rect(LLRect(0, 0, 20, 0)); show_button.tab_stop(false); show_button.is_toggle(true); - show_button.picture_style(true); show_button.image_selected(LLUI::getUIImage("ComboButton_Selected")); show_button.image_unselected(LLUI::getUIImage("ComboButton_Off")); diff --git a/indra/newview/lldebugmessagebox.cpp b/indra/newview/lldebugmessagebox.cpp index 29e375c9faf..7814e94dfd6 100644 --- a/indra/newview/lldebugmessagebox.cpp +++ b/indra/newview/lldebugmessagebox.cpp @@ -124,6 +124,7 @@ LLDebugVarMessageBox::LLDebugVarMessageBox(const std::string& title, EDebugVarTy LLButton::Params p; p.name(std::string("Animate")); + p.label(std::string("Animate")); p.rect(LLRect(20, 45, 180, 25)); p.click_callback.function(boost::bind(&LLDebugVarMessageBox::onAnimateClicked, this, _2)); mAnimateButton = LLUICtrlFactory::create<LLButton>(p); diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index a6afbc05bec..04860b061c7 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -750,6 +750,7 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width) bparams.tab_stop(false); bparams.font(mFont); bparams.name(">>"); + bparams.label(">>"); bparams.tool_tip(mChevronButtonToolTip); bparams.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this)); diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml index ab3d5722f0a..ebce758d3d7 100644 --- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml @@ -455,7 +455,6 @@ Maximum animation length is [MAX_LENGTH] seconds. layout="topleft" left="10" name="play_btn" - picture_style="true" tool_tip="Play/pause your animation" top_pad="0" width="28" /> @@ -467,7 +466,6 @@ Maximum animation length is [MAX_LENGTH] seconds. layout="topleft" left_pad="4" name="stop_btn" - picture_style="true" tool_tip="Stop animation playback" top_delta="0" width="28" /> diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml index 3f4f8b197f6..8cfe5288fd3 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml @@ -116,7 +116,6 @@ height="20" width="20" name="RefreshFriends" - picture_style="true" image_overlay="Refresh_Off"> <button.commit_callback function="Refresh.FriendList"/> @@ -188,7 +187,6 @@ height="28" width="28" name="Refresh" - picture_style="true" image_overlay="Refresh_Off" /> <scroll_list follows="all" diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index 1b694180130..a569b62e967 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -42,7 +42,6 @@ layout="topleft" left="45" name="cam_track_stick" - picture_style="true" quadrant="left" scale_image="false" sound_flags="3" @@ -59,7 +58,6 @@ left="7" minus_image="ScrollThumb_Vert" name="zoom" - picture_style="true" plus_image="ScrollThumb_Vert" quadrant="left" scale_image="false" @@ -75,7 +73,6 @@ layout="topleft" left="45" name="cam_rotate_stick" - picture_style="true" quadrant="left" scale_image="false" sound_flags="3" @@ -98,7 +95,6 @@ layout="topleft" left="5" name="rear_view" - picture_style="true" tool_tip="Rear View" top="2" width="30"> @@ -113,7 +109,6 @@ layout="topleft" left_pad="5" name="group_view" - picture_style="true" tool_tip="Group View" top="2" width="30"> @@ -128,7 +123,6 @@ layout="topleft" left="5" name="front_view" - picture_style="true" tool_tip="Front View" top_pad="5" width="30"> @@ -143,7 +137,6 @@ layout="topleft" left_pad="5" name="mouselook_view" - picture_style="true" tool_tip="Mouselook View" top_pad="-30" width="30"> diff --git a/indra/newview/skins/default/xui/en/floater_color_picker.xml b/indra/newview/skins/default/xui/en/floater_color_picker.xml index 686b8dc40fb..7c6376d84a6 100644 --- a/indra/newview/skins/default/xui/en/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_color_picker.xml @@ -180,7 +180,6 @@ layout="topleft" left_pad="30" name="color_pipette" - picture_style="true" width="32" /> <button follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml index 128d518e12a..90b3339225e 100644 --- a/indra/newview/skins/default/xui/en/floater_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_gesture.xml @@ -68,7 +68,6 @@ layout="topleft" left="10" name="recent_viewsort_btn" - picture_style="true" top="5" width="18" /> <button @@ -81,7 +80,6 @@ layout="topleft" left_pad="5" name="new_gesture_btn" - picture_style="true" tool_tip="Make new gesture" top_delta="0" width="18" /> @@ -95,7 +93,6 @@ layout="topleft" left_pad="230" name="del_btn" - picture_style="true" tool_tip="Delete this gesture" top_delta="0" width="18" /> diff --git a/indra/newview/skins/default/xui/en/floater_lagmeter.xml b/indra/newview/skins/default/xui/en/floater_lagmeter.xml index d98fdc5118b..1ee6fd57e78 100644 --- a/indra/newview/skins/default/xui/en/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/en/floater_lagmeter.xml @@ -184,7 +184,6 @@ layout="topleft" left="8" name="client_lagmeter" - picture_style="true" tab_stop="false" tool_tip="Client lag status" top="24" @@ -233,7 +232,6 @@ layout="topleft" left="8" name="network_lagmeter" - picture_style="true" tab_stop="false" tool_tip="Network lag status" top="64" @@ -282,7 +280,6 @@ layout="topleft" left="8" name="server_lagmeter" - picture_style="true" tab_stop="false" tool_tip="Server lag status" top="104" diff --git a/indra/newview/skins/default/xui/en/floater_media_browser.xml b/indra/newview/skins/default/xui/en/floater_media_browser.xml index b11892be74c..bc590dc6120 100644 --- a/indra/newview/skins/default/xui/en/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/en/floater_media_browser.xml @@ -127,7 +127,6 @@ layout="topleft" left_delta="55" name="play" - picture_style="true" top_delta="0" width="55" /> <button @@ -138,7 +137,6 @@ layout="topleft" left_delta="0" name="pause" - picture_style="true" top_delta="0" width="55" /> <button diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml index 02cbef5987e..5a8ffcebea5 100644 --- a/indra/newview/skins/default/xui/en/floater_moveview.xml +++ b/indra/newview/skins/default/xui/en/floater_moveview.xml @@ -56,7 +56,6 @@ layout="topleft" left="17" name="turn left btn" - picture_style="true" scale_image="false" tool_tip="Turn left (press Left Arrow or A)" top="45" @@ -70,7 +69,6 @@ layout="topleft" left_pad="34" name="turn right btn" - picture_style="true" scale_image="false" tool_tip="Turn right (press Right Arrow or D)" top_delta="0" @@ -84,7 +82,6 @@ layout="topleft" left="10" name="move up btn" - picture_style="true" scale_image="false" tool_tip="Fly up, press "E"" top="14" @@ -98,7 +95,6 @@ layout="topleft" left_pad="45" name="move down btn" - picture_style="true" scale_image="false" tool_tip="Fly down, press "C"" top_delta="0" @@ -112,7 +108,6 @@ layout="topleft" left="46" name="forward btn" - picture_style="true" quadrant="up" scale_image="false" tool_tip="Walk forward (press up arrow or W)" @@ -127,7 +122,6 @@ layout="topleft" left_delta="0" name="backward btn" - picture_style="true" quadrant="down" scale_image="false" tool_tip="Walk backward (press down arrow or S)" diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml index 88f09b521cc..0b61dcef583 100644 --- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml @@ -126,7 +126,6 @@ layout="topleft" left_delta="0" name="pick_btn" - picture_style="true" image_overlay="Inv_Object" tool_tip="Object Picker - Identify an object as the subject of this report" top_pad="0" diff --git a/indra/newview/skins/default/xui/en/floater_test_button.xml b/indra/newview/skins/default/xui/en/floater_test_button.xml index 89a1ddda99e..2bd0d1a0fab 100644 --- a/indra/newview/skins/default/xui/en/floater_test_button.xml +++ b/indra/newview/skins/default/xui/en/floater_test_button.xml @@ -96,7 +96,6 @@ layout="topleft" left="200" name="image_button" - picture_style="true" top="20" width="16" /> <button @@ -107,7 +106,6 @@ layout="topleft" left_delta="0" name="image_color_button" - picture_style="true" top_pad="10" width="16" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml index 0a1f6e0e297..7b0baa5de22 100644 --- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml @@ -125,7 +125,6 @@ layout="topleft" left="139" name="Pipette" - picture_style="true" top="250" width="32" /> <button diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index ca125383023..0202e8b5828 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -75,7 +75,6 @@ layout="topleft" left="10" name="button focus" - picture_style="true" tool_tip="Focus" width="20"> <button.commit_callback @@ -92,7 +91,6 @@ layout="topleft" left_pad="20" name="button move" - picture_style="true" tool_tip="Move" width="20"> <button.commit_callback @@ -109,7 +107,6 @@ layout="topleft" left_pad="20" name="button edit" - picture_style="true" tool_tip="Edit" width="20"> <button.commit_callback @@ -126,7 +123,6 @@ layout="topleft" left_pad="20" name="button create" - picture_style="true" tool_tip="Create" width="20"> <button.commit_callback @@ -143,7 +139,6 @@ layout="topleft" left_pad="20" name="button land" - picture_style="true" tool_tip="Land" width="20"> <button.commit_callback @@ -320,8 +315,6 @@ image_disabled="ForwardArrow_Disabled" image_selected="ForwardArrow_Press" image_unselected="ForwardArrow_Off" - picture_style="true" - label_selected="Options" layout="topleft" name="Options..." tool_tip="Grid options" @@ -342,7 +335,6 @@ layout="topleft" left="4" name="ToolCube" - picture_style="true" tool_tip="Cube" top="51" width="20" /> @@ -356,7 +348,6 @@ layout="topleft" left_delta="26" name="ToolPrism" - picture_style="true" tool_tip="Prism" top_delta="0" width="20" /> @@ -370,7 +361,6 @@ layout="topleft" left_delta="26" name="ToolPyramid" - picture_style="true" tool_tip="Pyramid" top_delta="0" width="20" /> @@ -384,7 +374,6 @@ layout="topleft" left_delta="26" name="ToolTetrahedron" - picture_style="true" tool_tip="Tetrahedron" top_delta="0" width="20" /> @@ -398,7 +387,6 @@ layout="topleft" left_delta="26" name="ToolCylinder" - picture_style="true" tool_tip="Cylinder" top_delta="0" width="20" /> @@ -412,7 +400,6 @@ layout="topleft" left_delta="26" name="ToolHemiCylinder" - picture_style="true" tool_tip="Hemicylinder" top_delta="0" width="20" /> @@ -426,7 +413,6 @@ layout="topleft" left_delta="26" name="ToolCone" - picture_style="true" tool_tip="Cone" top_delta="0" width="20" /> @@ -440,7 +426,6 @@ layout="topleft" left_delta="26" name="ToolHemiCone" - picture_style="true" tool_tip="Hemicone" top_delta="0" width="20" /> @@ -454,7 +439,6 @@ layout="topleft" left_delta="26" name="ToolSphere" - picture_style="true" tool_tip="Sphere" top_delta="0" width="20" /> @@ -468,7 +452,6 @@ layout="topleft" left_delta="26" name="ToolHemiSphere" - picture_style="true" tool_tip="Hemisphere" top_delta="0" width="20" /> @@ -482,7 +465,6 @@ layout="topleft" left="4" name="ToolTorus" - picture_style="true" tool_tip="Torus" top="77" width="20" /> @@ -496,7 +478,6 @@ layout="topleft" left_delta="26" name="ToolTube" - picture_style="true" tool_tip="Tube" top_delta="0" width="20" /> @@ -510,7 +491,6 @@ layout="topleft" left_delta="26" name="ToolRing" - picture_style="true" tool_tip="Ring" top_delta="0" width="20" /> @@ -524,7 +504,6 @@ layout="topleft" left_delta="26" name="ToolTree" - picture_style="true" tool_tip="Tree" top_delta="0" width="20" /> @@ -538,7 +517,6 @@ layout="topleft" left_delta="26" name="ToolGrass" - picture_style="true" tool_tip="Grass" top_delta="0" width="20" /> @@ -927,7 +905,6 @@ left_pad="0" top_delta="0" name="button set group" - picture_style="true" tab_stop="false" tool_tip="Choose a group to share this object's permissions" width="10" /> @@ -2700,7 +2677,6 @@ layout="topleft" left_pad="0" name="add_media" - picture_style="true" tab_stop="false" top_delta="0" tool_tip="Add Media" @@ -2716,7 +2692,6 @@ layout="topleft" left_pad="5" name="delete_media" - picture_style="true" tool_tip="Delete this media texture" top_delta="0" width="18"> @@ -2733,7 +2708,6 @@ layout="topleft" left_pad="10" name="edit_media" - picture_style="true" top_delta="0" width="18"> <button.commit_callback @@ -2871,7 +2845,6 @@ <!--TODO: HOOK UP TO HELP VIEWER--> <!-- <button image_overlay="Arrow_Right_Off" - picture_style="true" left_pad="5" name="button show owners help" tool_tip="See an explanation of colors" diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml index 6b13e2f1c7c..920b2d4fbf9 100644 --- a/indra/newview/skins/default/xui/en/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml @@ -102,7 +102,6 @@ left_pad="0" top_delta="4" name="mute_btn" - picture_style="true" width="16" /> <avatar_icon follows="all" @@ -122,7 +121,6 @@ image_unselected="ForwardArrow_Off" layout="topleft" name="view_profile_btn" - picture_style="true" right="-8" top="35" left_delta="110" @@ -144,7 +142,6 @@ image_unselected="OptionsMenu_Off" menu_filename="menu_inspect_avatar_gear.xml" name="gear_btn" - picture_style="true" right="-10" top="249" width="18" /> @@ -157,7 +154,6 @@ image_unselected="OptionsMenu_Off" menu_filename="menu_inspect_self_gear.xml" name="gear_self_btn" - picture_style="true" right="-10" top="249" width="18" /> diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml index db12daa6e04..bc9c9244d74 100644 --- a/indra/newview/skins/default/xui/en/inspect_group.xml +++ b/indra/newview/skins/default/xui/en/inspect_group.xml @@ -80,7 +80,6 @@ L$123 to join image_selected="ForwardArrow_Press" image_unselected="ForwardArrow_Off" name="view_profile_btn" - picture_style="true" right="-8" top="35" left_delta="110" diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml index fe492e0ae80..8bd4bb76c69 100644 --- a/indra/newview/skins/default/xui/en/inspect_object.xml +++ b/indra/newview/skins/default/xui/en/inspect_object.xml @@ -168,7 +168,6 @@ This is a really long description for an object being as how it is at least 80 c image_unselected="OptionsMenu_Off" menu_filename="menu_inspect_object_gear.xml" name="gear_btn" - picture_style="true" right="-10" top_delta="5" width="18" /> @@ -180,7 +179,6 @@ This is a really long description for an object being as how it is at least 80 c image_unselected="ForwardArrow_Off" layout="topleft" name="more_info_btn" - picture_style="true" right="-5" top="20" left_delta="110" diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml index 18761c3bb9a..0c426865310 100644 --- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml @@ -76,7 +76,6 @@ left_pad="3" right="-31" name="info_btn" - picture_style="true" top_delta="-2" width="16" /> <button @@ -87,7 +86,6 @@ left_pad="5" right="-3" name="profile_btn" - picture_style="true" top_delta="-2" width="20" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 73a1bae1c65..e08a282d570 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -281,7 +281,6 @@ follows="right" flash_color="EmphasisColor" name="Unread" - picture_style="true" image_overlay="Widget_UpArrow" /> <unread_notifications width="34" diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml index bac6f6e4d1b..282b3f3e554 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml @@ -17,7 +17,6 @@ image_overlay="BackArrow_Off" layout="topleft" name="back_btn" - picture_style="true" left="10" tab_stop="false" top="2" diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml index 77b887de9ba..f76a56bda49 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -137,7 +137,6 @@ left="0" image_overlay="BackArrow_Off" layout="topleft" name="back_btn" - picture_style="true" left="10" top="7" /> <text diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index d8d47c40084..f3304bf4e50 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -32,7 +32,6 @@ background_visible="true" image_overlay="BackArrow_Off" layout="topleft" name="back" - picture_style="true" left="10" tab_stop="false" top="2" @@ -194,7 +193,6 @@ background_visible="true" image_overlay="Refresh_Off" layout="topleft" name="btn_refresh" - picture_style="true" left="5" width="20" /> <button diff --git a/indra/newview/skins/default/xui/en/panel_group_list_item.xml b/indra/newview/skins/default/xui/en/panel_group_list_item.xml index ffa485051c7..5f6b911620f 100644 --- a/indra/newview/skins/default/xui/en/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_group_list_item.xml @@ -54,7 +54,6 @@ left_pad="3" right="-31" name="info_btn" - picture_style="true" top_delta="-2" width="16" /> <!--*TODO: Should only appear on rollover--> @@ -66,7 +65,6 @@ left_pad="5" right="-3" name="profile_btn" - picture_style="true" top_delta="-2" width="20" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index 5293043ba7d..a2ddc7a43b4 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -103,7 +103,6 @@ layout="topleft" left="10" name="options_gear_btn" - picture_style="true" top="6" width="18" /> <button @@ -115,7 +114,6 @@ layout="topleft" left_pad="5" name="add_btn" - picture_style="true" tool_tip="Add new landmark" width="18" /> <dnd_button @@ -126,7 +124,6 @@ layout="topleft" right="-5" name="trash_btn" - picture_style="true" tool_tip="Remove selected landmark" top="6" width="18" /> diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 4175d21639b..ddfa6e72a39 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -51,7 +51,6 @@ layout="topleft" left="10" name="back_btn" - picture_style="true" tool_tip="Go back to previous location" top="3" width="31" /> @@ -69,7 +68,6 @@ layout="topleft" left_pad="0" name="forward_btn" - picture_style="true" tool_tip="Go forward one location" top_delta="0" width="31" /> @@ -86,7 +84,6 @@ layout="topleft" left_pad="7" name="home_btn" - picture_style="true" tool_tip="Teleport to my home location" top_delta="0" width="32" /> @@ -127,7 +124,6 @@ <!-- left_pad="5" --> <!-- mouse_opaque="false" --> <!-- name="search_bg" --> - <!-- picture_style="true" --> <!-- top_delta="0" --> <!-- width="168" /> --> diff --git a/indra/newview/skins/default/xui/en/panel_notifications_channel.xml b/indra/newview/skins/default/xui/en/panel_notifications_channel.xml index c67ae416773..7b6c0f33da8 100644 --- a/indra/newview/skins/default/xui/en/panel_notifications_channel.xml +++ b/indra/newview/skins/default/xui/en/panel_notifications_channel.xml @@ -71,7 +71,6 @@ layout="topleft" left_delta="0" name="header" - picture_style="true" top_delta="-20" width="100" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index e234a7b358e..c8194a286b8 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -95,7 +95,6 @@ background_visible="true" layout="topleft" left="10" name="nearby_view_sort_btn" - picture_style="true" top="5" width="18" /> <button @@ -107,7 +106,6 @@ background_visible="true" layout="topleft" left_pad="5" name="add_friend_btn" - picture_style="true" top_delta="0" tool_tip="Add selected resident to your friends List" width="18" /> @@ -183,7 +181,6 @@ background_visible="true" layout="topleft" left="10" name="friends_viewsort_btn" - picture_style="true" top="5" width="18" /> <button @@ -195,7 +192,6 @@ background_visible="true" layout="topleft" left_pad="5" name="add_btn" - picture_style="true" tool_tip="Offer friendship to a resident" top_delta="0" width="18" /> @@ -209,7 +205,6 @@ background_visible="true" left_pad="10" right="-10" name="del_btn" - picture_style="true" tool_tip="Remove selected person from your Friends list" top_delta="0" width="18" /> @@ -252,7 +247,6 @@ background_visible="true" layout="topleft" left="10" name="groups_viewsort_btn" - picture_style="true" top="7" width="18" /> <button @@ -264,7 +258,6 @@ background_visible="true" layout="topleft" left_pad="5" name="plus_btn" - picture_style="true" tool_tip="Join group/Create new group" top_delta="0" width="18" /> @@ -277,7 +270,6 @@ background_visible="true" layout="topleft" left_pad="24" name="activate_btn" - picture_style="true" tool_tip="Activate selected group" top_delta="5" width="10" /> @@ -290,7 +282,6 @@ background_visible="true" left_pad="10" right="-10" name="minus_btn" - picture_style="true" tool_tip="Leave selected group" top_delta="-5" width="18" /> @@ -336,7 +327,6 @@ background_visible="true" layout="topleft" left="10" name="recent_viewsort_btn" - picture_style="true" top="7" width="18" /> <button @@ -348,7 +338,6 @@ background_visible="true" layout="topleft" left_pad="5" name="add_friend_btn" - picture_style="true" top_delta="0" tool_tip="Add selected resident to your friends List" width="18" /> diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml index a67ae59b4a4..42a1363b1bd 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml @@ -15,7 +15,6 @@ image_overlay="BackArrow_Off" layout="topleft" name="back_btn" - picture_style="true" left="10" tab_stop="false" top="2" diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml index 38ea6b6196e..7ff227ecb60 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml @@ -75,7 +75,6 @@ image_unselected="BuyArrow_Press" layout="topleft" name="info_chevron" - picture_style="true" right="-7" tab_stop="false" top="27" diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index cbe1f11e3d7..ae61852f68d 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -41,7 +41,6 @@ layout="topleft" left="0" name="gear_menu_btn" - picture_style="true" top="5" width="18" /> <button @@ -53,7 +52,6 @@ layout="topleft" left_pad="15" name="new_btn" - picture_style="true" tool_tip="Create new pick at current location" top="5" width="18" /> @@ -65,7 +63,6 @@ image_unselected="TrashItem_Off" layout="topleft" name="trash_btn" - picture_style="true" right="-10" top="5" width="18" /> diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index 5aa53ab46b1..5887d05d7ca 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -106,7 +106,6 @@ background_visible="true" image_disabled="ForwardArrow_Disabled" image_selected="ForwardArrow_Press" image_unselected="ForwardArrow_Off" - picture_style="true" layout="topleft" name="overflow_btn" right="-10" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml index 159323538ca..a94df4150da 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml @@ -73,7 +73,6 @@ layout="topleft" left_delta="137" name="enable_this_popup" - picture_style="true" top_pad="10" width="43"> <button.commit_callback @@ -92,7 +91,6 @@ layout="topleft" left_pad="50" name="disable_this_popup" - picture_style="true" top_delta="0" width="43"> <button.commit_callback diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 832c9775ce2..705c7ee0af0 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -40,7 +40,6 @@ layout="topleft" left_pad="16" name="mute_audio" - picture_style="true" tab_stop="false" top_delta="-2" width="22" /> @@ -86,7 +85,6 @@ layout="topleft" left_pad="16" name="mute_wind" - picture_style="true" tab_stop="false" top_delta="-2" width="22" /> @@ -122,7 +120,6 @@ layout="topleft" left_pad="16" name="mute_ui" - picture_style="true" tab_stop="false" top_delta="-2" width="22" /> @@ -158,7 +155,6 @@ layout="topleft" left_pad="16" name="mute_media" - picture_style="true" tab_stop="false" top_delta="-2" width="22" /> @@ -194,7 +190,6 @@ layout="topleft" left_pad="16" name="mute_sfx" - picture_style="true" tab_stop="false" top_delta="-2" width="22" /> @@ -230,7 +225,6 @@ layout="topleft" left_pad="16" name="mute_music" - picture_style="true" tab_stop="false" top_delta="-2" width="22" /> @@ -278,7 +272,6 @@ layout="topleft" left_pad="16" name="mute_voice" - picture_style="true" tab_stop="false" top_delta="-2" width="22" /> diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index b21fbc1795f..7b34e2931ee 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -82,7 +82,6 @@ image_unselected="media_btn_back.png" layout="topleft" tool_tip="Step back" - picture_style="true" width="22" top_delta="4"> <button.commit_callback @@ -103,7 +102,6 @@ image_unselected="media_btn_forward.png" layout="topleft" tool_tip="Step forward" - picture_style="true" top_delta="0" min_width="17" width="17"> @@ -141,7 +139,6 @@ image_unselected="media_btn_home.png" layout="topleft" tool_tip="Home page" - picture_style="true" min_width="22" width="22"> <button.commit_callback @@ -162,7 +159,6 @@ image_unselected="button_anim_stop.tga" layout="topleft" tool_tip="Stop media" - picture_style="true" min_width="22" width="22"> <button.commit_callback @@ -199,7 +195,6 @@ image_unselected="media_btn_reload.png" layout="topleft" tool_tip="Reload" - picture_style="true" min_width="22" width="22"> <button.commit_callback @@ -219,7 +214,6 @@ image_selected="media_btn_stoploading.png" image_unselected="media_btn_stoploading.png" layout="topleft" - picture_style="true" tool_tip = "Stop loading" min_width="22" width="22"> @@ -241,7 +235,6 @@ image_unselected="button_anim_play.tga" layout="topleft" tool_tip = "Play media" - picture_style="true" min_width="22" width="22"> <button.commit_callback @@ -262,7 +255,6 @@ image_unselected="button_anim_pause.tga" layout="topleft" tool_tip = "Pause media" - picture_style="true"> <button.commit_callback function="MediaCtrl.Pause" /> </button> @@ -367,7 +359,6 @@ function="MediaCtrl.CommitURL" /> is_toggle="true" layout="topleft" scale_image="false" - picture_style="true" tool_tip="Mute This Media" top_delta="22" min_width="24" @@ -391,7 +382,6 @@ function="MediaCtrl.CommitURL" /> image_unselected="media_btn_scrollup.png" layout="topleft" tool_tip="Volume up" - picture_style="true" scale_image="true" min_width="20" width="20" > @@ -414,7 +404,6 @@ function="MediaCtrl.CommitURL" /> image_unselected="media_btn_scrolldown.png" layout="topleft" tool_tip="Volume down" - picture_style="true" scale_image="true" min_width="20" width="20"> @@ -446,7 +435,6 @@ function="MediaCtrl.CommitURL" /> image_unselected="media_btn_scrollup.png" layout="topleft" tool_tip="Scroll up" - picture_style="true" scale_image="false" left="12" top_delta="4" @@ -460,7 +448,6 @@ function="MediaCtrl.CommitURL" /> layout="topleft" left="3" tool_tip="Scroll left" - picture_style="true" scale_image="false" top="12" min_width="8" @@ -473,7 +460,6 @@ function="MediaCtrl.CommitURL" /> layout="topleft" left_pad="9" tool_tip="Scroll right" - picture_style="true" scale_image="false" top_delta="0" min_width="8" @@ -486,7 +472,6 @@ function="MediaCtrl.CommitURL" /> layout="topleft" left="12" tool_tip="Scroll down" - picture_style="true" scale_image="false" top="20" min_width="8" @@ -506,7 +491,6 @@ function="MediaCtrl.CommitURL" /> image_unselected="media_btn_optimalzoom.png" layout="topleft" tool_tip="Zoom" - picture_style="true" min_width="22" width="22"> <button.commit_callback @@ -542,7 +526,6 @@ function="MediaCtrl.CommitURL" /> image_unselected="media_btn_newwindow.png" layout="topleft" tool_tip = "Open URL in browser" - picture_style="true" top_delta="-3" min_width="24" width="24" > @@ -579,7 +562,6 @@ function="MediaCtrl.CommitURL" /> image_unselected="media_btn_done.png" layout="topleft" tool_tip ="Close media control" - picture_style="true" top_delta="-4" width="21" > <button.commit_callback diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml index 195b7315313..70e6a08e96b 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -21,7 +21,6 @@ image_overlay="BackArrow_Off" layout="topleft" name="back" - picture_style="true" left="10" tab_stop="false" top="2" diff --git a/indra/newview/skins/default/xui/en/panel_progress.xml b/indra/newview/skins/default/xui/en/panel_progress.xml index a312e4cf13f..18c22289062 100644 --- a/indra/newview/skins/default/xui/en/panel_progress.xml +++ b/indra/newview/skins/default/xui/en/panel_progress.xml @@ -129,7 +129,6 @@ layout="topleft" left="-106" name="cancel_btn" - picture_style="true" top="700" width="90" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml index 21ecd018397..44afadf65a6 100644 --- a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml +++ b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml @@ -56,7 +56,6 @@ layout="topleft" left="2" name="less" - picture_style="true" tab_stop="false" top="0" width="132" /> @@ -70,7 +69,6 @@ layout="topleft" left_pad="2" name="more" - picture_style="true" tab_stop="false" top_delta="0" width="132" /> diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml index 4169c6245b1..bbfffe7baba 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml @@ -176,7 +176,6 @@ layout="topleft" left="10" name="gear_btn" - picture_style="true" top="5" width="18" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml index 73a7d95ff47..289daee7c25 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml @@ -56,7 +56,6 @@ left_pad="3" right="-31" name="info_btn" - picture_style="true" top_delta="-2" width="16" /> <button @@ -67,7 +66,6 @@ left_pad="5" right="-3" name="profile_btn" - picture_style="true" top_delta="-2" width="20" /> </panel> diff --git a/indra/newview/skins/default/xui/en/widgets/combo_box.xml b/indra/newview/skins/default/xui/en/widgets/combo_box.xml index 9ed3749308b..fa3cb9275ec 100644 --- a/indra/newview/skins/default/xui/en/widgets/combo_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/combo_box.xml @@ -4,7 +4,6 @@ max_chars="20" follows="right|top"> <combo_box.combo_button name="Combobox Button" - label="" hover_glow_amount="0.15" font="SansSerifSmall" scale_image="false" @@ -12,7 +11,6 @@ image_selected="ComboButton_Selected" image_disabled="ComboButton_Disabled" /> <combo_box.drop_down_button name="Drop Down Button" - label="" hover_glow_amount="0.15" font="SansSerifSmall" scale_image="true" 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 f2e48c517d8..d88bcfab1d7 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -20,7 +20,6 @@ allow_new_values="true" > <info_button name="Place Information" - label="" width="16" height="16" follows="left|top" @@ -30,7 +29,6 @@ image_disabled_selected="Info_Off" image_disabled="Info_Off" /> <add_landmark_button name="Add Landmark" - label="" hover_glow_amount="0.15" image_hover_selected="Favorite_Star_Over" image_hover_unselected="Favorite_Star_Over" diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml index f482ff3b894..9a79243b033 100644 --- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml @@ -7,14 +7,14 @@ background_image="TextField_Search_Off" background_image_disabled="TextField_Search_Disabled" background_image_focused="TextField_Search_Active" > - <search_button label="" + <search_button top_pad="4" left_pad="4" width="13" height="13" image_unselected="Search" image_selected="Search" /> - <clear_button label="" + <clear_button image_unselected="Icon_Close_Foreground" image_selected="Icon_Close_Press" /> </search_editor> diff --git a/indra/newview/skins/default/xui/es/floater_script_debug.xml b/indra/newview/skins/default/xui/es/floater_script_debug.xml index e33ffb7d96e..e9b66c74d20 100644 --- a/indra/newview/skins/default/xui/es/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/es/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="script debug floater" title="Alerta/Error de los scripts"> <tab_container name="Preview Tabs"> - <floater label="Script" name="all_scripts" title="[Todos los scripts]"/> + <floater label="Script" name="all_scripts" title="[All scripts]"/> </tab_container> </multi_floater> diff --git a/indra/newview/skins/default/xui/it/floater_script_debug.xml b/indra/newview/skins/default/xui/it/floater_script_debug.xml index 39736dde673..66e0af264f0 100644 --- a/indra/newview/skins/default/xui/it/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/it/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="script debug floater" title="Avvisi/Errori Script"> <tab_container name="Preview Tabs"> - <floater label="Script" name="all_scripts" title="[Tutti gli script]"/> + <floater label="Script" name="all_scripts" title="[All scripts]"/> </tab_container> </multi_floater> diff --git a/indra/newview/skins/default/xui/nl/floater_script_debug.xml b/indra/newview/skins/default/xui/nl/floater_script_debug.xml index 306ad5d1a3d..df9531473e4 100644 --- a/indra/newview/skins/default/xui/nl/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/nl/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="script debug floater" title="Script waarschuwing/fout"> <tab_container name="Preview Tabs"> - <floater label="Script" name="all_scripts" title="[Alle scripts]"/> + <floater label="Script" name="all_scripts" title="[All scripts]"/> </tab_container> </multi_floater> diff --git a/indra/newview/skins/default/xui/pt/floater_script_debug.xml b/indra/newview/skins/default/xui/pt/floater_script_debug.xml index 48c73b93a3e..d7a9bc6f879 100644 --- a/indra/newview/skins/default/xui/pt/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/pt/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="script debug floater" title="Aviso de script/erro"> <tab_container name="Preview Tabs"> - <floater label="Script" name="all_scripts" title="[Todos os scripts]"/> + <floater label="Script" name="all_scripts" title="[All scripts]"/> </tab_container> </multi_floater> -- GitLab From b270a792abbfdef95b930cfc61b1e8f0e2aa4c6c Mon Sep 17 00:00:00 2001 From: angela <angela@lindenlab.com> Date: Tue, 3 Nov 2009 13:28:39 +0800 Subject: [PATCH 031/306] (i) in inspectors is squished, maybe rectangle too small --- indra/llui/lltooltip.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp index 23c87c7522c..4bc9a9c0426 100644 --- a/indra/llui/lltooltip.cpp +++ b/indra/llui/lltooltip.cpp @@ -198,6 +198,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p) { LLButton::Params icon_params; icon_params.name = "tooltip_info"; + icon_params.label(""); // provid label but set to empty so name does not overwrite it -angela LLRect icon_rect; LLUIImage* imagep = p.image; TOOLTIP_ICON_SIZE = (imagep ? imagep->getWidth() : 16); @@ -206,6 +207,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p) //icon_params.follows.flags = FOLLOWS_LEFT | FOLLOWS_BOTTOM; icon_params.image_unselected(imagep); icon_params.image_selected(imagep); + icon_params.scale_image(true); icon_params.flash_color(icon_params.highlight_color()); mInfoButton = LLUICtrlFactory::create<LLButton>(icon_params); @@ -223,6 +225,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p) { LLButton::Params p_button; p_button.name(std::string("play_media")); + p_button.label(""); // provid label but set to empty so name does not overwrite it -angela TOOLTIP_PLAYBUTTON_SIZE = 16; LLRect button_rect; button_rect.setOriginAndSize((mPadding +TOOLTIP_ICON_SIZE+ mPadding ), mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE); @@ -247,6 +250,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p) { LLButton::Params p_w_button; p_w_button.name(std::string("home_page")); + p_w_button.label(""); // provid label but set to empty so name does not overwrite it -angela TOOLTIP_PLAYBUTTON_SIZE = 16; LLRect button_rect; button_rect.setOriginAndSize((mPadding +TOOLTIP_ICON_SIZE+ mPadding ), mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE); -- GitLab From b4af6c3da8e5ef3e897cedfb2e1d677a3f37abe9 Mon Sep 17 00:00:00 2001 From: angela <angela@lindenlab.com> Date: Tue, 3 Nov 2009 14:14:39 +0800 Subject: [PATCH 032/306] display the current URL in object inspector for media without going through media plugin --- indra/newview/llinspectobject.cpp | 33 +++++++++++++++----------- indra/newview/lltoolpie.cpp | 39 +++++++++++++++---------------- 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp index 050a61c79b2..e3780f93ff6 100644 --- a/indra/newview/llinspectobject.cpp +++ b/indra/newview/llinspectobject.cpp @@ -112,6 +112,7 @@ class LLInspectObject : public LLInspect LLUUID mObjectID; S32 mObjectFace; viewer_media_t mMediaImpl; + LLMediaEntry* mMediaEntry; LLSafeHandle<LLObjectSelection> mObjectSelection; }; @@ -120,7 +121,8 @@ LLInspectObject::LLInspectObject(const LLSD& sd) mObjectID(NULL), // set in onOpen() mObjectFace(0), mObjectSelection(NULL), - mMediaImpl(NULL) + mMediaImpl(NULL), + mMediaEntry(NULL) { // can't make the properties request until the widgets are constructed // as it might return immediately, so do it in postBuild. @@ -231,11 +233,11 @@ void LLInspectObject::onOpen(const LLSD& data) if (!tep) return; - const LLMediaEntry* mep = tep->hasMedia() ? tep->getMediaData() : NULL; - if(!mep) + mMediaEntry = tep->hasMedia() ? tep->getMediaData() : NULL; + if(!mMediaEntry) return; - mMediaImpl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()); + mMediaImpl = LLViewerMedia::getMediaImplFromTextureID(mMediaEntry->getMediaID()); } } @@ -282,11 +284,11 @@ void LLInspectObject::update() if (!tep) return; - const LLMediaEntry* mep = tep->hasMedia() ? tep->getMediaData() : NULL; - if(!mep) + mMediaEntry = tep->hasMedia() ? tep->getMediaData() : NULL; + if(!mMediaEntry) return; - mMediaImpl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()); + mMediaImpl = LLViewerMedia::getMediaImplFromTextureID(mMediaEntry->getMediaID()); updateMediaCurrentURL(); updateSecureBrowsing(); @@ -430,14 +432,17 @@ void LLInspectObject::updateDescription(LLSelectNode* nodep) void LLInspectObject::updateMediaCurrentURL() { + if(!mMediaEntry) + return; LLTextBox* textbox = getChild<LLTextBox>("object_media_url"); std::string media_url = ""; textbox->setValue(media_url); textbox->setToolTip(media_url); + LLStringUtil::format_map_t args; if(mMediaImpl.notNull() && mMediaImpl->hasMedia()) { - LLStringUtil::format_map_t args; + LLPluginClassMedia* media_plugin = NULL; media_plugin = mMediaImpl->getMediaPlugin(); if(media_plugin) @@ -451,15 +456,17 @@ void LLInspectObject::updateMediaCurrentURL() args["[CurrentURL]"] = media_plugin->getLocation(); } media_url = LLTrans::getString("CurrentURL", args); - textbox->setText(media_url); - textbox->setToolTip(media_url); + } } - else + else if(mMediaEntry->getCurrentURL() != "") { - textbox->setText(media_url); - textbox->setToolTip(media_url); + args["[CurrentURL]"] = mMediaEntry->getCurrentURL(); + media_url = LLTrans::getString("CurrentURL", args); } + + textbox->setText(media_url); + textbox->setToolTip(media_url); } void LLInspectObject::updateCreator(LLSelectNode* nodep) diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 0a9e72506b4..24017202cc6 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -761,14 +761,14 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask) { is_time_based_media = true; is_web_based_media = false; - args["[CurrentURL]"] = media_impl->getMediaURL(); + //args["[CurrentURL]"] = media_impl->getMediaURL(); is_media_playing = media_impl->isMediaPlaying(); } else { is_time_based_media = false; is_web_based_media = true; - args["[CurrentURL]"] = media_plugin->getLocation(); + //args["[CurrentURL]"] = media_plugin->getLocation(); } //tooltip_msg.append(LLTrans::getString("CurrentURL", args)); } @@ -1039,31 +1039,28 @@ void LLToolPie::playCurrentMedia(const LLPickInfo& info) if(!mep) return; + //TODO: Can you Use it? + LLPluginClassMedia* media_plugin = NULL; -// if (gSavedSettings.getBOOL("MediaOnAPrimUI")) -// { - viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()); + viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()); - if(media_impl.notNull() && media_impl->hasMedia()) + if(media_impl.notNull() && media_impl->hasMedia()) + { + media_plugin = media_impl->getMediaPlugin(); + if (media_plugin && media_plugin->pluginSupportsMediaTime()) { - media_plugin = media_impl->getMediaPlugin(); - - if (media_plugin && media_plugin->pluginSupportsMediaTime()) + if(media_impl->isMediaPlaying()) { - if(media_impl->isMediaPlaying()) - { - media_impl->pause(); - } - else //if(media_impl->isMediaPaused()) - { - media_impl->play(); - } - + media_impl->pause(); + } + else + { + media_impl->play(); } - } -// } + } + } @@ -1094,6 +1091,8 @@ void LLToolPie::VisitHomePage(const LLPickInfo& info) if(!mep) return; + //TODO: Can you Use it? + LLPluginClassMedia* media_plugin = NULL; viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()); -- GitLab From d3bb2931abefc817af38e1db56fdc93197d01d12 Mon Sep 17 00:00:00 2001 From: CG Linden <cg@lindenlab.com> Date: Mon, 2 Nov 2009 22:21:36 -0800 Subject: [PATCH 033/306] Add missing eol at eof --- indra/llui/lliconctrl.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp index 82ffac9580f..b1bd2b89a95 100644 --- a/indra/llui/lliconctrl.cpp +++ b/indra/llui/lliconctrl.cpp @@ -123,4 +123,5 @@ void LLIconCtrl::setIconImageDrawSize() mImagep->getImage()->setKnownDrawSize(mDrawWidth, mDrawHeight) ; } } -} \ No newline at end of file +} + -- GitLab From 6508b4f13fd056e6a4ddf1b9845829452a7c3599 Mon Sep 17 00:00:00 2001 From: Dmitry Zaporozhan <dzaporozhan@productengine.com> Date: Tue, 3 Nov 2009 11:39:43 +0200 Subject: [PATCH 034/306] Fixed potencial bug in People Panel. --HG-- branch : product-engine --- indra/newview/llpanelpeople.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 4580eeb336a..0d16b0a041b 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -797,14 +797,15 @@ void LLPanelPeople::reSelectedCurrentTab() void LLPanelPeople::onFilterEdit(const std::string& search_string) { - if (mFilterSubString == search_string) - return; + std::string search_upper = search_string; + // Searches are case-insensitive + LLStringUtil::toUpper(search_upper); + LLStringUtil::trimHead(search_upper); - mFilterSubString = search_string; + if (mFilterSubString == search_upper) + return; - // Searches are case-insensitive - LLStringUtil::toUpper(mFilterSubString); - LLStringUtil::trimHead(mFilterSubString); + mFilterSubString = search_upper; // Apply new filter. mNearbyList->setNameFilter(mFilterSubString); -- GitLab From 077025fa1ed40c4b7876e753a71c0cfab25308d0 Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Tue, 3 Nov 2009 10:28:57 +0000 Subject: [PATCH 035/306] DEV-39999: Removed all legacy help buttons and notifications from the code. All help should now go through the new help server, via the Help Browser floater. There should no longer be any custom "?" buttons in the UI - all <button> and <notification> XUI references relating to custom help buttons have been expunged. (I previously extracted all of the help strings from notifications.xml and passed these to the doc team to include in the help server pages.) I have checked that none of the XUI elements that are removed here are still referenced by any C++ code. I've also confirmed that there are no new notifications removed that I have not already passed on to the doc team. And I've also done a pass through the UI to make sure that all of the floaters still look as they should. Finally, I've confirmed that the new help system for floaters and side panels still works. 2,276 lines deleted - 0 lines added. --- indra/newview/llfloaterbulkpermission.cpp | 8 - indra/newview/llfloaterbulkpermission.h | 1 - indra/newview/llfloaterdaycycle.cpp | 12 - indra/newview/llfloaterdaycycle.h | 3 - indra/newview/llfloaterenvsettings.cpp | 6 - indra/newview/llfloaterenvsettings.h | 3 - indra/newview/llfloaterhardwaresettings.cpp | 6 - indra/newview/llfloaterhardwaresettings.h | 3 - indra/newview/llfloaterland.cpp | 33 - indra/newview/llfloaterland.h | 2 - indra/newview/llfloaterpreference.cpp | 7 - indra/newview/llfloaterpreference.h | 1 - indra/newview/llfloaterregioninfo.cpp | 52 - indra/newview/llfloaterregioninfo.h | 4 - indra/newview/llfloaterwater.cpp | 27 - indra/newview/llfloaterwater.h | 4 - indra/newview/llfloaterwindlight.cpp | 40 - indra/newview/llfloaterwindlight.h | 4 - indra/newview/llnavigationbar.h | 1 - indra/newview/llpanelgroup.cpp | 17 - indra/newview/llpanelgroup.h | 9 - indra/newview/llpanelgrouproles.cpp | 14 - indra/newview/llpanelgrouproles.h | 1 - indra/newview/llpanelland.cpp | 6 - indra/newview/llpanelland.h | 1 - .../default/xui/en/floater_about_land.xml | 20 - .../xui/en/floater_day_cycle_options.xml | 10 - .../skins/default/xui/en/floater_lagmeter.xml | 9 - .../default/xui/en/floater_perm_prefs.xml | 14 - .../skins/default/xui/en/floater_tools.xml | 9 - .../skins/default/xui/en/floater_water.xml | 120 -- .../xui/en/floater_windlight_options.xml | 220 --- .../skins/default/xui/en/notifications.xml | 1174 +++-------------- .../default/xui/en/panel_group_land_money.xml | 11 - .../default/xui/en/panel_group_notices.xml | 12 +- .../default/xui/en/panel_group_roles.xml | 11 - .../default/xui/en/panel_region_covenant.xml | 11 - .../default/xui/en/panel_region_debug.xml | 60 - .../default/xui/en/panel_region_estate.xml | 100 -- .../default/xui/en/panel_region_general.xml | 100 -- .../xui/en/panel_region_general_layout.xml | 100 -- .../default/xui/en/panel_region_terrain.xml | 80 -- 42 files changed, 166 insertions(+), 2160 deletions(-) diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index a73ebf4e06f..7cb8987879a 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -72,8 +72,6 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed) BOOL LLFloaterBulkPermission::postBuild() { -// childSetAction("help", onHelpBtn, this); // this is not in use - return TRUE; } @@ -157,12 +155,6 @@ void LLFloaterBulkPermission::onApplyBtn() doApply(); } -// angela -- this is not in use -//void LLFloaterBulkPermission::onHelpBtn(void* user_data) -//{ -// LLNotifications::instance().add("HelpBulkPermission"); -//} - void LLFloaterBulkPermission::onCloseBtn() { closeFloater(); diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h index c34e4413ccc..31f4f5c3e16 100644 --- a/indra/newview/llfloaterbulkpermission.h +++ b/indra/newview/llfloaterbulkpermission.h @@ -79,7 +79,6 @@ class LLFloaterBulkPermission : public LLFloater, public LLVOInventoryListener U8 key, bool is_new); -// static void onHelpBtn(void* user_data); void onCloseBtn(); void onApplyBtn(); void onCommitCopy(); diff --git a/indra/newview/llfloaterdaycycle.cpp b/indra/newview/llfloaterdaycycle.cpp index 7f3b988dfe2..48d552022f9 100644 --- a/indra/newview/llfloaterdaycycle.cpp +++ b/indra/newview/llfloaterdaycycle.cpp @@ -105,20 +105,8 @@ LLFloaterDayCycle::~LLFloaterDayCycle() { } -void LLFloaterDayCycle::onClickHelp(std::string xml_alert) -{ - LLNotifications::instance().add(contextualNotification(xml_alert)); -} - -void LLFloaterDayCycle::initHelpBtn(const std::string& name, const std::string& xml_alert) -{ - getChild<LLButton>(name)->setClickedCallback(boost::bind(&LLFloaterDayCycle::onClickHelp, this, xml_alert)); -} - void LLFloaterDayCycle::initCallbacks(void) { - initHelpBtn("WLDayCycleHelp", "HelpDayCycle"); - // WL Day Cycle getChild<LLUICtrl>("WLTimeSlider")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onTimeSliderMoved, this, _1)); getChild<LLUICtrl>("WLDayCycleKeys")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onKeyTimeMoved, this, _1)); diff --git a/indra/newview/llfloaterdaycycle.h b/indra/newview/llfloaterdaycycle.h index 43c347d4f21..c250902b656 100644 --- a/indra/newview/llfloaterdaycycle.h +++ b/indra/newview/llfloaterdaycycle.h @@ -59,9 +59,6 @@ class LLFloaterDayCycle : public LLFloater LLFloaterDayCycle(const LLSD& key); virtual ~LLFloaterDayCycle(); /*virtual*/ BOOL postBuild(); - /// help button stuff - void onClickHelp(std::string xml_alert); - void initHelpBtn(const std::string& name, const std::string& xml_alert); /// initialize all void initCallbacks(void); diff --git a/indra/newview/llfloaterenvsettings.cpp b/indra/newview/llfloaterenvsettings.cpp index a520df36dec..2fffa6eece2 100644 --- a/indra/newview/llfloaterenvsettings.cpp +++ b/indra/newview/llfloaterenvsettings.cpp @@ -70,10 +70,6 @@ BOOL LLFloaterEnvSettings::postBuild() syncMenu(); return TRUE; } -void LLFloaterEnvSettings::onClickHelp() -{ - LLNotifications::instance().add(contextualNotification("EnvSettingsHelpButton")); -} void LLFloaterEnvSettings::initCallbacks(void) { @@ -89,10 +85,8 @@ void LLFloaterEnvSettings::initCallbacks(void) getChild<LLUICtrl>("EnvAdvancedSkyButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onOpenAdvancedSky, this)); getChild<LLUICtrl>("EnvAdvancedWaterButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onOpenAdvancedWater, this)); getChild<LLUICtrl>("EnvUseEstateTimeButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onUseEstateTime, this)); - getChild<LLUICtrl>("EnvSettingsHelpButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onClickHelp, this)); } - // menu maintenance functions void LLFloaterEnvSettings::syncMenu() diff --git a/indra/newview/llfloaterenvsettings.h b/indra/newview/llfloaterenvsettings.h index 083e3636d1b..02bc5021207 100644 --- a/indra/newview/llfloaterenvsettings.h +++ b/indra/newview/llfloaterenvsettings.h @@ -53,9 +53,6 @@ class LLFloaterEnvSettings : public LLFloater /// initialize all the callbacks for the menu void initCallbacks(void); - /// callback for the menus help button - void onClickHelp(); - /// handle if time of day is changed void onChangeDayTime(LLUICtrl* ctrl); diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp index 9947cdc2173..31b494b590d 100644 --- a/indra/newview/llfloaterhardwaresettings.cpp +++ b/indra/newview/llfloaterhardwaresettings.cpp @@ -59,12 +59,6 @@ LLFloaterHardwareSettings::~LLFloaterHardwareSettings() { } -void LLFloaterHardwareSettings::onClickHelp(void* data) -{ - const char* xml_alert = "HardwareSettingsHelpButton"; - LLNotifications::instance().add(xml_alert); -} - void LLFloaterHardwareSettings::initCallbacks(void) { } diff --git a/indra/newview/llfloaterhardwaresettings.h b/indra/newview/llfloaterhardwaresettings.h index 3f19d89cbbb..ef0b0c905e0 100644 --- a/indra/newview/llfloaterhardwaresettings.h +++ b/indra/newview/llfloaterhardwaresettings.h @@ -50,9 +50,6 @@ class LLFloaterHardwareSettings : public LLFloater /// initialize all the callbacks for the menu void initCallbacks(void); - /// callback for the menus help button - static void onClickHelp(void* data); - /// OK button static void onBtnOK( void* userdata ); diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index bdf9842b015..0711e650b2d 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -1743,7 +1743,6 @@ LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel) mClearBtn(NULL), mMatureCtrl(NULL), mPushRestrictionCtrl(NULL), - mPublishHelpButton(NULL), mParcel(parcel) { } @@ -1812,14 +1811,9 @@ BOOL LLPanelLandOptions::postBuild() mMatureCtrl = getChild<LLCheckBoxCtrl>( "MatureCheck"); childSetCommitCallback("MatureCheck", onCommitAny, this); - mPublishHelpButton = getChild<LLButton>("?"); - mPublishHelpButton->setClickedCallback(onClickPublishHelp, this); - if (gAgent.wantsPGOnly()) { // Disable these buttons if they are PG (Teen) users - mPublishHelpButton->setVisible(FALSE); - mPublishHelpButton->setEnabled(FALSE); mMatureCtrl->setVisible(FALSE); mMatureCtrl->setEnabled(FALSE); } @@ -1912,7 +1906,6 @@ void LLPanelLandOptions::refresh() mClearBtn->setEnabled(FALSE); mMatureCtrl->setEnabled(FALSE); - mPublishHelpButton->setEnabled(FALSE); } else { @@ -1988,13 +1981,9 @@ void LLPanelLandOptions::refresh() mSetBtn->setEnabled( can_change_landing_point ); mClearBtn->setEnabled( can_change_landing_point ); - mPublishHelpButton->setEnabled( can_change_identity ); - if (gAgent.wantsPGOnly()) { // Disable these buttons if they are PG (Teen) users - mPublishHelpButton->setVisible(FALSE); - mPublishHelpButton->setEnabled(FALSE); mMatureCtrl->setVisible(FALSE); mMatureCtrl->setEnabled(FALSE); } @@ -2247,28 +2236,6 @@ void LLPanelLandOptions::onClickClear(void* userdata) self->refresh(); } -// static -void LLPanelLandOptions::onClickPublishHelp(void*) -{ - LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); - LLParcel *parcel = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection()->getParcel(); - llassert(region); // Region should never be null. - - bool can_change_identity = region && parcel ? - LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_IDENTITY) && - ! (region->getRegionFlags() & REGION_FLAGS_BLOCK_PARCEL_SEARCH) : false; - - if(! can_change_identity) - { - LLNotifications::instance().add("ClickPublishHelpLandDisabled"); - } - else - { - LLNotifications::instance().add("ClickPublishHelpLand"); - } -} - - //--------------------------------------------------------------------------- // LLPanelLandAccess diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index 749c3951477..f7fb978c2a1 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -320,7 +320,6 @@ class LLPanelLandOptions static void onCommitAny(LLUICtrl* ctrl, void *userdata); static void onClickSet(void* userdata); static void onClickClear(void* userdata); - static void onClickPublishHelp(void*); private: LLCheckBoxCtrl* mCheckEditObjects; @@ -345,7 +344,6 @@ class LLPanelLandOptions LLCheckBoxCtrl *mMatureCtrl; LLCheckBoxCtrl *mPushRestrictionCtrl; - LLButton *mPublishHelpButton; LLSafeHandle<LLParcelSelection>& mParcel; }; diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 8b3391726a7..f65897fc33b 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -339,7 +339,6 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.ClickDisablePopup", boost::bind(&LLFloaterPreference::onClickDisablePopup, this)); mCommitCallbackRegistrar.add("Pref.LogPath", boost::bind(&LLFloaterPreference::onClickLogPath, this)); mCommitCallbackRegistrar.add("Pref.Logging", boost::bind(&LLFloaterPreference::onCommitLogging, this)); - mCommitCallbackRegistrar.add("Pref.OpenHelp", boost::bind(&LLFloaterPreference::onOpenHelp, this)); mCommitCallbackRegistrar.add("Pref.UpdateMeterText", boost::bind(&LLFloaterPreference::updateMeterText, this, _1)); mCommitCallbackRegistrar.add("Pref.HardwareSettings", boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this)); mCommitCallbackRegistrar.add("Pref.HardwareDefaults", boost::bind(&LLFloaterPreference::setHardwareDefaults, this)); @@ -608,12 +607,6 @@ void LLFloaterPreference::onBtnOK() LLPanelLogin::refreshLocation( false ); } -void LLFloaterPreference::onOpenHelp() -{ - const char* xml_alert = "GraphicsPreferencesHelp"; - LLNotifications::instance().add(this->contextualNotification(xml_alert)); -} - // static void LLFloaterPreference::onBtnApply( ) { diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 34723b8c7e3..b1ad0348c0d 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -84,7 +84,6 @@ class LLFloaterPreference : public LLFloater void onBtnOK(); void onBtnCancel(); void onBtnApply(); - void onOpenHelp(); // void onClickClearCache(); void onClickBrowserClearCache(); diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 11544f5b7b5..56646196fb2 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -544,16 +544,6 @@ void LLPanelRegionInfo::initCtrl(const std::string& name) getChild<LLUICtrl>(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onChangeAnything, this)); } -void LLPanelRegionInfo::initHelpBtn(const std::string& name, const std::string& xml_alert) -{ - getChild<LLUICtrl>(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onClickHelp, this, xml_alert)); -} - -void LLPanelRegionInfo::onClickHelp(std::string xml_alert) -{ - LLNotifications::instance().add(xml_alert); -} - ///////////////////////////////////////////////////////////////////////////// // LLPanelRegionGeneralInfo // @@ -589,17 +579,6 @@ BOOL LLPanelRegionGeneralInfo::postBuild() initCtrl("restrict_pushobject"); initCtrl("block_parcel_search_check"); - initHelpBtn("terraform_help", "HelpRegionBlockTerraform"); - initHelpBtn("fly_help", "HelpRegionBlockFly"); - initHelpBtn("damage_help", "HelpRegionAllowDamage"); - initHelpBtn("agent_limit_help", "HelpRegionAgentLimit"); - initHelpBtn("object_bonus_help", "HelpRegionObjectBonus"); - initHelpBtn("access_help", "HelpRegionMaturity"); - initHelpBtn("restrict_pushobject_help", "HelpRegionRestrictPushObject"); - initHelpBtn("land_resell_help", "HelpRegionLandResell"); - initHelpBtn("parcel_changes_help", "HelpParcelChanges"); - initHelpBtn("parcel_search_help", "HelpRegionSearch"); - childSetAction("kick_btn", onClickKick, this); childSetAction("kick_all_btn", onClickKickAll, this); childSetAction("im_btn", onClickMessage, this); @@ -809,13 +788,6 @@ BOOL LLPanelRegionDebugInfo::postBuild() initCtrl("disable_collisions_check"); initCtrl("disable_physics_check"); - initHelpBtn("disable_scripts_help", "HelpRegionDisableScripts"); - initHelpBtn("disable_collisions_help", "HelpRegionDisableCollisions"); - initHelpBtn("disable_physics_help", "HelpRegionDisablePhysics"); - initHelpBtn("top_colliders_help", "HelpRegionTopColliders"); - initHelpBtn("top_scripts_help", "HelpRegionTopScripts"); - initHelpBtn("restart_help", "HelpRegionRestart"); - childSetAction("choose_avatar_btn", onClickChooseAvatar, this); childSetAction("return_btn", onClickReturn, this); childSetAction("top_colliders_btn", onClickTopColliders, this); @@ -1182,15 +1154,6 @@ BOOL LLPanelRegionTerrainInfo::postBuild() { LLPanelRegionInfo::postBuild(); - initHelpBtn("water_height_help", "HelpRegionWaterHeight"); - initHelpBtn("terrain_raise_help", "HelpRegionTerrainRaise"); - initHelpBtn("terrain_lower_help", "HelpRegionTerrainLower"); - initHelpBtn("upload_raw_help", "HelpRegionUploadRaw"); - initHelpBtn("download_raw_help", "HelpRegionDownloadRaw"); - initHelpBtn("use_estate_sun_help", "HelpRegionUseEstateSun"); - initHelpBtn("fixed_sun_help", "HelpRegionFixedSun"); - initHelpBtn("bake_terrain_help", "HelpRegionBakeTerrain"); - initCtrl("water_height_spin"); initCtrl("terrain_raise_spin"); initCtrl("terrain_lower_spin"); @@ -2103,20 +2066,6 @@ BOOL LLPanelEstateInfo::postBuild() getChild<LLUICtrl>("abuse_email_address")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAnything, this)); getChild<LLLineEditor>("abuse_email_address")->setKeystrokeCallback(onChangeText, this); - initHelpBtn("estate_manager_help", "HelpEstateEstateManager"); - initHelpBtn("use_global_time_help", "HelpEstateUseGlobalTime"); - initHelpBtn("fixed_sun_help", "HelpEstateFixedSun"); - initHelpBtn("WLEditSkyHelp", "HelpEditSky"); - initHelpBtn("WLEditDayCycleHelp", "HelpEditDayCycle"); - - initHelpBtn("externally_visible_help", "HelpEstateExternallyVisible"); - initHelpBtn("allow_direct_teleport_help", "HelpEstateAllowDirectTeleport"); - initHelpBtn("allow_resident_help", "HelpEstateAllowResident"); - initHelpBtn("allow_group_help", "HelpEstateAllowGroup"); - initHelpBtn("ban_resident_help", "HelpEstateBanResident"); - initHelpBtn("abuse_email_address_help", "HelpEstateAbuseEmailAddress"); - initHelpBtn("voice_chat_help", "HelpEstateVoiceChat"); - // set up the use global time checkbox getChild<LLUICtrl>("use_global_time_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeUseGlobalTime, this)); getChild<LLUICtrl>("fixed_sun_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeFixedSun, this)); @@ -2694,7 +2643,6 @@ bool LLPanelEstateCovenant::estateUpdate(LLMessageSystem* msg) // virtual BOOL LLPanelEstateCovenant::postBuild() { - initHelpBtn("covenant_help", "HelpEstateCovenant"); mEstateNameText = getChild<LLTextBox>("estate_name_text"); mEstateOwnerText = getChild<LLTextBox>("estate_owner_text"); mLastModifiedText = getChild<LLTextBox>("covenant_timestamp_text"); diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index 95833af8a10..4958243d5bd 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -125,10 +125,6 @@ class LLPanelRegionInfo : public LLPanel protected: void initCtrl(const std::string& name); - void initHelpBtn(const std::string& name, const std::string& xml_alert); - - // Callback for all help buttons, data is name of XML alert to show. - void onClickHelp(std::string xml_alert); // Returns TRUE if update sent and apply button should be // disabled. diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp index 72c82c178b6..a0fe42bf617 100644 --- a/indra/newview/llfloaterwater.cpp +++ b/indra/newview/llfloaterwater.cpp @@ -110,23 +110,6 @@ BOOL LLFloaterWater::postBuild() } void LLFloaterWater::initCallbacks(void) { - // help buttons - initHelpBtn("WaterFogColorHelp", "HelpWaterFogColor"); - initHelpBtn("WaterFogDensityHelp", "HelpWaterFogDensity"); - initHelpBtn("WaterUnderWaterFogModHelp", "HelpUnderWaterFogMod"); - initHelpBtn("WaterGlowHelp", "HelpWaterGlow"); - initHelpBtn("WaterNormalScaleHelp", "HelpWaterNormalScale"); - initHelpBtn("WaterFresnelScaleHelp", "HelpWaterFresnelScale"); - initHelpBtn("WaterFresnelOffsetHelp", "HelpWaterFresnelOffset"); - - initHelpBtn("WaterBlurMultiplierHelp", "HelpWaterBlurMultiplier"); - initHelpBtn("WaterScaleBelowHelp", "HelpWaterScaleBelow"); - initHelpBtn("WaterScaleAboveHelp", "HelpWaterScaleAbove"); - - initHelpBtn("WaterNormalMapHelp", "HelpWaterNormalMap"); - initHelpBtn("WaterWave1Help", "HelpWaterWave1"); - initHelpBtn("WaterWave2Help", "HelpWaterWave2"); - LLWaterParamManager * param_mgr = LLWaterParamManager::instance(); getChild<LLUICtrl>("WaterFogColor")->setCommitCallback(boost::bind(&LLFloaterWater::onWaterFogColorMoved, this, _1, ¶m_mgr->mFogColor)); @@ -173,16 +156,6 @@ void LLFloaterWater::initCallbacks(void) { getChild<LLUICtrl>("WaterNormalMap")->setCommitCallback(boost::bind(&LLFloaterWater::onNormalMapPicked, this, _1)); } -void LLFloaterWater::onClickHelp(std::string xml_alert) -{ - LLNotifications::instance().add(contextualNotification(xml_alert)); -} - -void LLFloaterWater::initHelpBtn(const std::string& name, const std::string& xml_alert) -{ - getChild<LLButton>(name)->setClickedCallback(boost::bind(&LLFloaterWater::onClickHelp, this, xml_alert)); -} - bool LLFloaterWater::newPromptCallback(const LLSD& notification, const LLSD& response) { std::string text = response["message"].asString(); diff --git a/indra/newview/llfloaterwater.h b/indra/newview/llfloaterwater.h index 08c630c69e3..0ea2436dbea 100644 --- a/indra/newview/llfloaterwater.h +++ b/indra/newview/llfloaterwater.h @@ -59,10 +59,6 @@ class LLFloaterWater : public LLFloater /// initialize all void initCallbacks(void); - // help button stuff - void onClickHelp(std::string xml_alert); - void initHelpBtn(const std::string& name, const std::string& xml_alert); - bool newPromptCallback(const LLSD& notification, const LLSD& response); /// general purpose callbacks for dealing with color controllers diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp index 02979acdd72..60494f3cce4 100644 --- a/indra/newview/llfloaterwindlight.cpp +++ b/indra/newview/llfloaterwindlight.cpp @@ -119,36 +119,6 @@ BOOL LLFloaterWindLight::postBuild() } void LLFloaterWindLight::initCallbacks(void) { - // help buttons - initHelpBtn("WLBlueHorizonHelp", "HelpBlueHorizon"); - initHelpBtn("WLHazeHorizonHelp", "HelpHazeHorizon"); - initHelpBtn("WLBlueDensityHelp", "HelpBlueDensity"); - initHelpBtn("WLHazeDensityHelp", "HelpHazeDensity"); - - initHelpBtn("WLDensityMultHelp", "HelpDensityMult"); - initHelpBtn("WLDistanceMultHelp", "HelpDistanceMult"); - initHelpBtn("WLMaxAltitudeHelp", "HelpMaxAltitude"); - - initHelpBtn("WLSunlightColorHelp", "HelpSunlightColor"); - initHelpBtn("WLAmbientHelp", "HelpSunAmbient"); - initHelpBtn("WLSunGlowHelp", "HelpSunGlow"); - initHelpBtn("WLTimeOfDayHelp", "HelpTimeOfDay"); - initHelpBtn("WLEastAngleHelp", "HelpEastAngle"); - - initHelpBtn("WLSceneGammaHelp", "HelpSceneGamma"); - initHelpBtn("WLStarBrightnessHelp", "HelpStarBrightness"); - - initHelpBtn("WLCloudColorHelp", "HelpCloudColor"); - initHelpBtn("WLCloudDetailHelp", "HelpCloudDetail"); - initHelpBtn("WLCloudDensityHelp", "HelpCloudDensity"); - initHelpBtn("WLCloudCoverageHelp", "HelpCloudCoverage"); - - initHelpBtn("WLCloudScaleHelp", "HelpCloudScale"); - initHelpBtn("WLCloudScrollXHelp", "HelpCloudScrollX"); - initHelpBtn("WLCloudScrollYHelp", "HelpCloudScrollY"); - - initHelpBtn("WLClassicCloudsHelp", "HelpClassicClouds"); - LLWLParamManager * param_mgr = LLWLParamManager::instance(); // blue horizon @@ -237,16 +207,6 @@ void LLFloaterWindLight::initCallbacks(void) { getChild<LLUICtrl>("WLStarAlpha")->setCommitCallback(boost::bind(&LLFloaterWindLight::onStarAlphaMoved, this, _1)); } -void LLFloaterWindLight::onClickHelp(std::string xml_alert) -{ - LLNotifications::instance().add(contextualNotification(xml_alert)); -} - -void LLFloaterWindLight::initHelpBtn(const std::string& name, const std::string& xml_alert) -{ - getChild<LLButton>(name)->setClickedCallback(boost::bind(&LLFloaterWindLight::onClickHelp, this, xml_alert)); -} - bool LLFloaterWindLight::newPromptCallback(const LLSD& notification, const LLSD& response) { std::string text = response["message"].asString(); diff --git a/indra/newview/llfloaterwindlight.h b/indra/newview/llfloaterwindlight.h index 56c2c6623b1..ed9322c4509 100644 --- a/indra/newview/llfloaterwindlight.h +++ b/indra/newview/llfloaterwindlight.h @@ -57,10 +57,6 @@ class LLFloaterWindLight : public LLFloater /// initialize all void initCallbacks(void); - // help button stuff - void onClickHelp(std::string alert); - void initHelpBtn(const std::string& name, const std::string& xml_alert); - bool newPromptCallback(const LLSD& notification, const LLSD& response); /// general purpose callbacks for dealing with color controllers diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 8b625e7fa62..04707d8d48a 100644 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -77,7 +77,6 @@ class LLNavigationBar void onBackOrForwardButtonHeldDown(const LLSD& param); void onForwardButtonClicked(); void onHomeButtonClicked(); - void onHelpButtonClicked(); void onLocationSelection(); void onLocationPrearrange(const LLSD& data); void onSearchCommit(); diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index 4708d7ba364..10f015774af 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -86,23 +86,6 @@ BOOL LLPanelGroupTab::postBuild() return TRUE; } - - -void LLPanelGroupTab::handleClickHelp() -{ - // Display the help text. - std::string help_text( getHelpText() ); - if ( !help_text.empty() ) - { - LLSD args; - args["MESSAGE"] = help_text; - LLFloater* parent_floater = gFloaterView->getParentFloater(this); - LLNotification::Params params(parent_floater->contextualNotification("GenericAlert")); - params.substitutions(args); - LLNotifications::instance().add(params); - } -} - LLPanelGroup::LLPanelGroup() : LLPanel(), LLGroupMgrObserver( LLUUID() ), diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h index 5c7b0ddd060..306e6575fc7 100644 --- a/indra/newview/llpanelgroup.h +++ b/indra/newview/llpanelgroup.h @@ -148,12 +148,6 @@ class LLPanelGroupTab : public LLPanel // Triggered when group information changes in the group manager. virtual void update(LLGroupChange gc) { } - // This is the text to be displayed when a help button is pressed. - virtual std::string getHelpText() const { return mHelpText; } - - // Display anything returned by getHelpText - void handleClickHelp(); - // This just connects the help button callback. virtual BOOL postBuild(); @@ -171,11 +165,8 @@ class LLPanelGroupTab : public LLPanel protected: LLUUID mGroupID; - std::string mHelpText; - BOOL mAllowEdit; BOOL mHasModal; - }; #endif // LL_LLPANELGROUP_H diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 71486c908cc..88aad4923d6 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -361,20 +361,6 @@ void LLPanelGroupRoles::cancel() panelp->cancel(); } -// Pass all of these messages to the currently visible sub tab. -std::string LLPanelGroupRoles::getHelpText() const -{ - LLPanelGroupTab* panelp = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel(); - if (panelp) - { - return panelp->getHelpText(); - } - else - { - return mHelpText; - } -} - void LLPanelGroupRoles::update(LLGroupChange gc) { if (mGroupID.isNull()) return; diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index bd5fc1d2350..b6e2245e70d 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -78,7 +78,6 @@ class LLPanelGroupRoles : public LLPanelGroupTab bool onModalClose(const LLSD& notification, const LLSD& response); // Most of these messages are just passed on to the current sub-tab. - virtual std::string getHelpText() const; virtual void activate(); virtual void deactivate(); virtual bool needsApply(std::string& mesg); diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp index bce5525a406..417a8048347 100644 --- a/indra/newview/llpanelland.cpp +++ b/indra/newview/llpanelland.cpp @@ -70,7 +70,6 @@ BOOL LLPanelLandInfo::postBuild() childSetAction("button subdivide land",onClickDivide,this); childSetAction("button join land",onClickJoin,this); childSetAction("button about land",onClickAbout,this); - childSetAction("button show owners help", onShowOwnersHelp, this); mCheckShowOwners = getChild<LLCheckBoxCtrl>("checkbox show owners"); childSetValue("checkbox show owners", gSavedSettings.getBOOL("ShowParcelOwners")); @@ -265,8 +264,3 @@ void LLPanelLandInfo::onClickAbout(void*) LLFloaterReg::showInstance("about_land"); } - -void LLPanelLandInfo::onShowOwnersHelp(void* user_data) -{ - LLNotifications::instance().add("ShowOwnersHelp"); -} diff --git a/indra/newview/llpanelland.h b/indra/newview/llpanelland.h index 92fe3134052..02e7e7bf385 100644 --- a/indra/newview/llpanelland.h +++ b/indra/newview/llpanelland.h @@ -60,7 +60,6 @@ class LLPanelLandInfo static void onClickDivide(void*); static void onClickJoin(void*); static void onClickAbout(void*); - static void onShowOwnersHelp(void*); protected: //LLTextBox* mTextPriceLabel; 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 e13aa610e53..033e18a1395 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -1492,16 +1492,6 @@ Only large parcels can be listed in search. name="item12" value="other" /> </combo_box> - <button - follows="left|top" - height="18" - label="?" - label_selected="?" - layout="topleft" - left_pad="15" - name="?" - top_delta="0" - width="18" /> <check_box height="16" label="Mature Content" @@ -1916,16 +1906,6 @@ Only large parcels can be listed in search. name="check sound local" top_delta="0" width="292" /> - <button - follows="left|top" - height="18" - label="?" - label_selected="?" - layout="topleft" - left_delta="292" - name="?" - top_delta="-2" - width="18" /> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml index b8fa104352a..b0d636445d5 100644 --- a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml @@ -28,16 +28,6 @@ name="Day Cycle" top="0" width="642"> - <button - follows="left|top" - font="SansSerifSmall" - height="15" - label="?" - layout="topleft" - left="612" - name="WLDayCycleHelp" - top="3" - width="18" /> <multi_slider can_edit_text="true" control_name="WLTimeSlider" diff --git a/indra/newview/skins/default/xui/en/floater_lagmeter.xml b/indra/newview/skins/default/xui/en/floater_lagmeter.xml index d98fdc5118b..309475098f3 100644 --- a/indra/newview/skins/default/xui/en/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/en/floater_lagmeter.xml @@ -323,15 +323,6 @@ left="40" name="server_lag_cause" right="-32" /> - <!--button - bottom="145" - follows="left|top" - height="18" - label="?" - layout="topleft" - name="server_help" - right="-10" - width="18" /--> <button follows="left|top" height="20" diff --git a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml index eb0c22b9c49..0967706cc29 100644 --- a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml @@ -17,20 +17,6 @@ name="permissions" top="20" width="315"> - <button - follows="left" - height="18" - label="?" - label_selected="?" - layout="topleft" - left="260" - name="help" - top="7" - width="22"> - <button.commit_callback - function="Notification.Show" - parameter="ClickUploadHelpPermissions" /> - </button> <check_box control_name="ShareWithGroup" height="16" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index ca125383023..f566dbdb75f 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -2868,15 +2868,6 @@ tool_tip="Colorize the parcels according to the type of owner: Green = Your land Aqua = Your group's land Red = Owned by others Yellow = For sale Purple = For auction Grey = Public" top_pad="8" width="205" /> - <!--TODO: HOOK UP TO HELP VIEWER--> - <!-- <button - image_overlay="Arrow_Right_Off" - picture_style="true" - left_pad="5" - name="button show owners help" - tool_tip="See an explanation of colors" - width="26" - height="22" />--> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml index af3606fd1c0..012b69c3e3f 100644 --- a/indra/newview/skins/default/xui/en/floater_water.xml +++ b/indra/newview/skins/default/xui/en/floater_water.xml @@ -95,16 +95,6 @@ width="355"> Water Fog Color </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WaterFogColorHelp" - top_delta="-2" - width="18" /> <color_swatch border_color="0.45098 0.517647 0.607843 1" can_apply_immediately="true" @@ -130,16 +120,6 @@ width="355"> Fog Density Exponent </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WaterFogDensityHelp" - top_delta="-2" - width="18" /> <slider control_name="WaterFogDensity" decimal_digits="1" @@ -165,16 +145,6 @@ width="355"> Underwater Fog Modifier </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WaterUnderWaterFogModHelp" - top_delta="-2" - width="18" /> <slider decimal_digits="2" follows="left" @@ -200,16 +170,6 @@ width="355"> Reflection Wavelet Scale </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WaterNormalScaleHelp" - top_delta="-2" - width="18" /> <text type="string" length="1" @@ -298,16 +258,6 @@ width="355"> Fresnel Scale </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WaterFresnelScaleHelp" - top_delta="-2" - width="18" /> <slider control_name="WaterFresnelScale" decimal_digits="2" @@ -333,16 +283,6 @@ width="355"> Fresnel Offset </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WaterFresnelOffsetHelp" - top_delta="-2" - width="18" /> <slider control_name="WaterFresnelOffset" decimal_digits="2" @@ -368,16 +308,6 @@ width="355"> Refract Scale Above </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WaterScaleAboveHelp" - top_delta="-2" - width="18" /> <slider control_name="WaterScaleAbove" decimal_digits="2" @@ -403,16 +333,6 @@ width="355"> Refract Scale Below </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WaterScaleBelowHelp" - top_delta="-2" - width="18" /> <slider control_name="WaterScaleBelow" decimal_digits="2" @@ -438,16 +358,6 @@ width="355"> Blur Multiplier </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WaterBlurMultiplierHelp" - top_delta="-2" - width="18" /> <slider control_name="WaterBlurMult" follows="left" @@ -486,16 +396,6 @@ width="355"> Big Wave Direction </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="145" - name="WaterWave1Help" - top_delta="-2" - width="18" /> <text type="string" length="1" @@ -563,16 +463,6 @@ width="355"> Little Wave Direction </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="145" - name="WaterWave2Help" - top_delta="-2" - width="18" /> <text type="string" length="1" @@ -640,16 +530,6 @@ width="355"> Normal Map </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="125" - name="WaterNormalMapHelp" - top_delta="-2" - width="18" /> <texture_picker height="143" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_windlight_options.xml b/indra/newview/skins/default/xui/en/floater_windlight_options.xml index 2c09e82f087..fd905d7a14e 100644 --- a/indra/newview/skins/default/xui/en/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/en/floater_windlight_options.xml @@ -104,16 +104,6 @@ width="355"> Blue Horizon </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLBlueHorizonHelp" - top_delta="-2" - width="18" /> <text type="string" length="1" @@ -227,16 +217,6 @@ width="355"> Haze Horizon </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLHazeHorizonHelp" - top_delta="-2" - width="18" /> <slider control_name="WLHazeHorizon" decimal_digits="2" @@ -262,16 +242,6 @@ width="355"> Blue Density </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLBlueDensityHelp" - top_delta="-2" - width="18" /> <text type="string" length="1" @@ -385,16 +355,6 @@ width="355"> Haze Density </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLHazeDensityHelp" - top_delta="-2" - width="18" /> <slider control_name="WLHazeDensity" decimal_digits="2" @@ -421,16 +381,6 @@ width="355"> Density Multiplier </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLDensityMultHelp" - top_delta="-2" - width="18" /> <slider control_name="WLDensityMult" decimal_digits="2" @@ -457,16 +407,6 @@ width="355"> Distance Multiplier </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLDistanceMultHelp" - top_delta="-2" - width="18" /> <slider control_name="WLDistancMult" decimal_digits="1" @@ -492,16 +432,6 @@ width="355"> Max Altitude </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLMaxAltitudeHelp" - top_delta="-2" - width="18" /> <slider control_name="WLMaxAltitude" decimal_digits="0" @@ -540,16 +470,6 @@ width="355"> Sun/Moon Color </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLSunlightColorHelp" - top_delta="-2" - width="18" /> <text type="string" length="1" @@ -663,16 +583,6 @@ width="355"> Sun/Moon Position </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLTimeOfDayHelp" - top_delta="-2" - width="18" /> <icon height="20" image_name="icon_diurnal.tga" @@ -705,16 +615,6 @@ width="355"> Ambient </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLAmbientHelp" - top_delta="-2" - width="18" /> <text type="string" length="1" @@ -828,16 +728,6 @@ width="355"> East Angle </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLEastAngleHelp" - top_delta="-2" - width="18" /> <slider control_name="WLEastAngle" decimal_digits="2" @@ -863,16 +753,6 @@ width="355"> Sun Glow </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLSunGlowHelp" - top_delta="-2" - width="18" /> <slider control_name="WLGlowB" decimal_digits="2" @@ -915,16 +795,6 @@ width="200"> Scene Gamma </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLSceneGammaHelp" - top_delta="-2" - width="18" /> <slider control_name="WLGamma" decimal_digits="2" @@ -951,16 +821,6 @@ width="355"> Star Brightness </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLStarBrightnessHelp" - top_delta="-2" - width="18" /> <slider control_name="WLStarAlpha" decimal_digits="2" @@ -1000,16 +860,6 @@ width="355"> Cloud Color </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLCloudColorHelp" - top_delta="-2" - width="18" /> <text type="string" length="1" @@ -1123,16 +973,6 @@ width="355"> Cloud XY/Density </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLCloudDensityHelp" - top_delta="-2" - width="18" /> <text type="string" length="1" @@ -1221,16 +1061,6 @@ width="355"> Cloud Coverage </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLCloudCoverageHelp" - top_delta="-2" - width="18" /> <slider control_name="WLCloudCoverage" decimal_digits="2" @@ -1256,16 +1086,6 @@ width="355"> Cloud Scale </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLCloudScaleHelp" - top_delta="-2" - width="18" /> <slider control_name="WLCloudScale" decimal_digits="2" @@ -1292,16 +1112,6 @@ width="355"> Cloud Detail (XY/Density) </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="150" - name="WLCloudDetailHelp" - top_delta="-2" - width="18" /> <text type="string" length="1" @@ -1390,16 +1200,6 @@ width="355"> Cloud Scroll X </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="125" - name="WLCloudScrollXHelp" - top_delta="-2" - width="18" /> <check_box control_name="WLCloudLockX" follows="left" @@ -1436,16 +1236,6 @@ width="355"> Cloud Scroll Y </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="125" - name="WLCloudScrollYHelp" - top_delta="-2" - width="18" /> <check_box control_name="WLCloudLockY" follows="left" @@ -1479,16 +1269,6 @@ name="DrawClassicClouds" top="104" width="200" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left="608" - name="WLClassicCloudsHelp" - top="84" - width="18" /> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index d51cb130931..babed28f10e 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -370,99 +370,12 @@ Add this Ability to '[ROLE_NAME]'? </notification> <notification - icon="alertmodal.tga" - name="ClickPublishHelpLand" - type="alertmodal"> -Selecting the "Publish in Search" -Checking this box will show: -- this parcel in search results -- this parcel's public objects -- this parcel in web search - </notification> - - <notification - icon="alertmodal.tga" - name="ClickSoundHelpLand" - type="alertmodal">Media and Music can only be experienced within the parcel. Sound and Voice options can be restricted to the parcel or will be heard by residents outside the parcel depending on their maturity Rating. Go to Knowledge Base to learn more about how to set these options? - <url option="0" name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=5046 - </url> - <usetemplate - name="okcancelbuttons" - yestext="Go to Knowledge Base" - notext="Close" /> - </notification> - - <notification - icon="alertmodal.tga" - name="ClickSearchHelpAll" - type="alertmodal"> -Search results are organized based on the tab you are in, your maturity Rating, the category chosen, and other factors. For more details, please see the Knowledge Base. - <url option="0" name="url"> - https://support.secondlife.com/ics/support/default.asp?deptID=4417&task=knowledge&questionID=4722 - </url> - <usetemplate - name="okcancelbuttons" - yestext="Go to Knowledge Base" - notext="Close" /> - </notification> - - <notification - icon="alertmodal.tga" - name="ClickPublishHelpLandDisabled" - type="alertmodal"> -You can't make this parcel show in search because it is located in a region that forbids this. - </notification> - - <notification - icon="alertmodal.tga" - name="ClickPublishHelpAvatar" - type="alertmodal"> -Selecting "Show in Search" will show: -- my profile in search results -- a link to my profile in public group pages - </notification> - - <notification - icon="alertmodal.tga" - name="ClickPartnerHelpAvatar" - type="alertmodal"> -You can propose to another Resident or dissolve an existing partnership through the [SECOND_LIFE] website. - -Go to the [SECOND_LIFE] web site for more information on partnering? - <usetemplate - name="okcancelbuttons" - notext="Cancel" - yestext="Go to Page"/> - </notification> - - <notification - icon="alertmodal.tga" - name="ClickUploadHelpPermissions" - type="alertmodal"> -Your default permissions may not work in older regions. - </notification> - -<notification icon="alertmodal.tga" name="ClickUnimplemented" type="alertmodal"> Sorry, not implemented yet. </notification> - <notification - icon="alertmodal.tga" - name="ClickWebProfileHelpAvatar" - type="alertmodal"> -If this Resident has set a web profile URL then you can: - * Click 'Load' to see the page in this Web tab. - * Click Load > 'In external browser' to view the page in your default web browser. - * Click Load > 'Home URL' to return to this Resident's web profile if you've navigated away. - -When viewing your own profile, you can enter any URL as your web profile and click OK to set it. -Other residents can visit the URL you set when they look at your profile. - </notification> - <notification icon="alertmodal.tga" name="JoinGroupCanAfford" @@ -1957,21 +1870,6 @@ Join land? yestext="OK"/> </notification> - <notification - icon="alertmodal.tga" - name="ShowOwnersHelp" - type="alertmodal"> -Show owners: -Color parcels to show the owner type. - -Green = Your land -Aqua = Your Group's land -Red = Owned by others -Yellow = For sale -Purple = For auction -Grey = Public - </notification> - <notification icon="alertmodal.tga" name="ConfirmNotecardSave" @@ -2845,18 +2743,6 @@ Visit the [SECOND_LIFE] Public Issue Tracker, where you can report bugs and othe yestext="Go to page"/> </notification> - <notification - icon="alertmodal.tga" - name="WebLaunchPublicIssueHelp" - type="alertmodal"> -Visit the [SECOND_LIFE] Wiki for info on how to use the Public Issue Tracker. - <usetemplate - ignoretext="Launch my browser to view instructions for the Public Issue Tracker" - name="okcancelignore" - notext="Cancel" - yestext="Go to page"/> - </notification> - <notification icon="alertmodal.tga" name="WebLaunchSupportWiki" @@ -3634,669 +3520,272 @@ Type a short announcement which will be sent to everyone in this region. <notification icon="alertmodal.tga" - label="Block Terraform" - name="HelpRegionBlockTerraform" + label="Changed Region Maturity" + name="RegionMaturityChange" type="alertmodal"> -If this box is checked, land owners will not be able to terraform their land regardless of the per-parcel 'Edit Terrain' setting. - -Default: off +The maturity rating for this region has been updated. +It may take some time for the change to be reflected on the map. </notification> <notification icon="alertmodal.tga" - label="Block Fly" - name="HelpRegionBlockFly" + label="Voice Version Mismatch" + name="VoiceVersionMismatch" type="alertmodal"> -If this box is checked, people will not be able to fly in this region regardless of the per-parcel 'Fly' setting. - -Default: off +This version of [APP_NAME] is not compatible with the Voice Chat feature in this region. In order for Voice Chat to function correctly you will need to update [APP_NAME]. </notification> <notification icon="alertmodal.tga" - label="Bulk Change Content Permissions" - name="HelpBulkPermission" + label="Can't Buy Objects" + name="BuyObjectOneOwner" type="alertmodal"> -The Bulk Permissions tool helps you to quickly change the permissions on multiple items in the contents of the selected object(s). However, please note that you are only setting permissions on the items in the Contents of the selected objects -- not permissions on the container object(s) themselves. - -Also note, the permissions are not applied to the nested contents of any of the contained items. Your request only operates on items exactly one level deep. - -You can selectively choose which types of items to modify by using the checklist under 'Content Types' here. Snapshots are included when you select Textures. - -* This tool will only succeed at changing permissions on items you are allowed to change. -* You cannot grant any Next owner permissions which you do not already have. -* The Next owner permissions are merely requests. If any item cannot take all of the new permissions, none of its permissions will change. - -When you are ready to change the permissions in bulk, click 'Apply' and wait for the results to display. - -If you close the Bulk Permissions window while permissions are being changed, it will halt the operation. +Cannot buy objects from different owners at the same time. +Please select only one object and try again. </notification> <notification icon="alertmodal.tga" - label="Allow Damage" - name="HelpRegionAllowDamage" + label="Can't Buy Contents" + name="BuyContentsOneOnly" type="alertmodal"> -If this box is checked, the health system across all parcels regardless of individual parcel settings. If this box is left unchecked, individual parcel owners will still be able to activate the health system on their parcels. - -Default: off +Unable to buy the contents of more than one object at a time. +Please select only one object and try again. </notification> <notification icon="alertmodal.tga" - label="Agent Limit" - name="HelpRegionAgentLimit" + label="Can't Buy Contents" + name="BuyContentsOneOwner" type="alertmodal"> -Sets the maximum number of avatars allowed in this region. -Performance may vary depending on the number avatars present. - -Default: 40 +Cannot buy objects from different owners at the same time. +Please select only one object and try again. </notification> <notification icon="alertmodal.tga" - label="Object Bonus" - name="HelpRegionObjectBonus" + name="BuyOriginal" type="alertmodal"> -The Object Bonus is a multiplier for primitives allowed on any given parcel. The range allowed is 1 to 10. Set at '1', each 512m² parcel is allowed 117 objects. Set at '2', each 512m² parcel is allowed 234, or twice as many, and so on. The max number of objects allowed per region remains 15,000 no matter what the Object Bonus is. Once set, be aware that lowering the Object Bonus may cause objects to be returned or deleted. - -Default: 1.0 +Buy original object from [OWNER] for L$[PRICE]? +You will become the owner of this object. +You will be able to: + Modify: [MODIFYPERM] + Copy: [COPYPERM] + Resell or Give Away: [RESELLPERM] + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="OK"/> </notification> <notification icon="alertmodal.tga" - label="Maturity" - name="HelpRegionMaturity" + name="BuyOriginalNoOwner" type="alertmodal"> -Sets the maturity Rating of the Region, as shown in the menu bar at the top of any Resident's viewer, and in tooltips on the World Map when the cursor hovers over this Region. This setting also affects access to this Region and search results. Other Residents may only enter Regions or view search results with the same maturity Ratings they have chosen in their preferences. - -It may take some time for this change to be reflected on the map. +Buy original object for L$[PRICE]? +You will become the owner of this object. +You will be able to: + Modify: [MODIFYPERM] + Copy: [COPYPERM] + Resell or Give Away: [RESELLPERM] + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="OK"/> </notification> <notification icon="alertmodal.tga" - label="Restrict Pushing" - name="HelpRegionRestrictPushObject" + name="BuyCopy" type="alertmodal"> -This checkbox sets the full region to restricted push permissions. -When enabled, Residents may only be pushed by themselves or by the parcel's owner. -(Push refers to the llPushObject() LSL function.) - -Default: Off +Buy a copy from [OWNER] for L$[PRICE]? +The object will be copied to your inventory. +You will be able to: + Modify: [MODIFYPERM] + Copy: [COPYPERM] + Resell or Give Away: [RESELLPERM] + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="OK"/> </notification> <notification icon="alertmodal.tga" - label="Parcel Join/Subdivide" - name="HelpParcelChanges" + name="BuyCopyNoOwner" type="alertmodal"> -This checkbox sets whether or not parcels not owned by the estate owner can be joined or subdivided. -If this option is unchecked: - * Only estate owners or managers can join or subdivide parcels. - * They may only join or subdivide parcels belonging to the owner, or to a group where they have the appropriate group powers. -If this option is checked: - * All parcel owners can join or subdivide the parcels they own. - * For group owned parcels, those with appropriate group powers may join or subdivide parcels. - -Default: Checked +Buy a copy for L$[PRICE]? +The object will be copied to your inventory. +You will be able to: + Modify: [MODIFYPERM] + Copy: [COPYPERM] + Resell or Give Away: [RESELLPERM] + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="OK"/> </notification> <notification icon="alertmodal.tga" - label="Do Not Show In Search" - name="HelpRegionSearch" + name="BuyContents" type="alertmodal"> -Checking this box will block parcel owners from listing their parcels in search. - -Default: Off +Buy contents from [OWNER] for L$[PRICE]? +They will be copied to your inventory. + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="OK"/> </notification> <notification icon="alertmodal.tga" - label="Changed Region Maturity" - name="RegionMaturityChange" + name="BuyContentsNoOwner" type="alertmodal"> -The maturity rating for this region has been updated. -It may take some time for the change to be reflected on the map. +Buy contents for L$[PRICE]? +They will be copied to your inventory. + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="OK"/> </notification> <notification icon="alertmodal.tga" - label="Land Resale" - name="HelpRegionLandResell" + name="ConfirmPurchase" type="alertmodal"> -Estate owners and managers can sell any land owned by the estate owner. -If this option is left unchecked, buyers cannot resell their land in this region. -If this option is checked, buyers can resell their land in this region. +This transaction will: +[ACTION] -Default: Disallow +Are you sure you want to proceed with this purchase? + <usetemplate + name="okcancelbuttons" + notext="Cancel" + yestext="OK"/> </notification> <notification icon="alertmodal.tga" - label="Disable Scripts" - name="HelpRegionDisableScripts" - type="alertmodal"> -When sim performance is poor, a script may be to blame. Open the Statistics Bar (Ctrl+Shift+1). Look at the Simulator Physics FPS. -If it is lower than 45, open the Time panel located at the bottom of the Stats Bar. If Script Time reads 25 ms or higher, click the Get Top Scripts button. You will be given the name and location of scripts that may be causing poor performance. + name="ConfirmPurchasePassword" + type="password"> +This transaction will: +[ACTION] -Checking the Disable Scripts box and then pressing the Apply button will temporarily disable all scripts in this region. You may need to do this in order to travel to the location of a noted 'top script'. Once you have arrived at the location, investigate the script to determine if it is causing the problem. You may want to contact the owner of the script or delete or return the object. -Uncheck the Disable Script box and then Apply to reactivate the scripts in the region. +Are you sure you want to proceed with this purchase? +Please re-enter your password and click OK. + <form name="form"> + <input + name="message" + type="password"/> + <button + default="true" + index="0" + name="ConfirmPurchase" + text="OK"/> + <button + index="1" + name="Cancel" + text="Cancel"/> + </form> + </notification> -Default: off + <notification + icon="alert.tga" + name="SetPickLocation" + type="alert"> +Note: +You have updated the location of this pick but the other details will retain their original values. + <usetemplate + name="okbutton" + yestext="OK"/> </notification> <notification icon="alertmodal.tga" - label="Disable Collisions" - name="HelpRegionDisableCollisions" + name="MoveInventoryFromObject" type="alertmodal"> -When sim performance is poor, physical objects may be to blame. -Open the Statistics Bar (Ctrl+Shift+1). Look at the Simulator Physics FPS. If it is lower than 45, open the Time panel located at the bottom of the Stats Bar. If Sim Time (Physics) reads 20 ms or higher, click the Get Top Colliders button. -You will be given the name and location of physical objects that may be causing poor performance. - -Checking the Disable Collisions box and then pressing the Apply button will temporarily disable object-object collisions. You may need to do this in order to travel to the location of a noted 'top collider'. Once you have arrived at the location, investigate the object - is it constantly colliding with other objects? You may want to contact the owner of the object or delete or return the object. -Uncheck the Disable Collisions box and then Apply to reactivate collisions in the region. +You have selected 'no copy' inventory items. +These items will be moved to your inventory, not copied. -Default: off +Move the inventory item(s)? + <usetemplate + ignoretext="Warn me before I move 'no-copy' items from an object" + name="okcancelignore" + notext="Cancel" + yestext="OK"/> </notification> <notification icon="alertmodal.tga" - label="Disable Physics" - name="HelpRegionDisablePhysics" + name="MoveInventoryFromScriptedObject" type="alertmodal"> -Disable Physics is similar to Disable Collisions, except all physics simulation is disabled. This means that not only will objects stop colliding, but avatars will be unable to move. - -This should only be used when Disable Collisions does not give back enough performance to the region to investigate a physics problem or Top Collider. +You have selected 'no copy' inventory items. These items will be moved to your inventory, not copied. +Because this object is scripted, moving these items to your inventory may cause the script to malfunction. -Be sure to re-enable physics when you are done, or avatars will continue to be unable to move. +Move the inventory item(s)? + <usetemplate + ignoretext="Warn me before I move 'no-copy' items which might break a scripted object" + name="okcancelignore" + notext="Cancel" + yestext="OK"/> + </notification> -Default: off + <notification + icon="alert.tga" + name="ClickActionNotPayable" + type="alert"> +Warning: The 'Pay object' click action has been set, but it will only work if a script is added with a money() event. + <form name="form"> + <ignore name="ignore" + text="I set the action 'Pay object' when building an object without a money() script"/> + </form> </notification> <notification icon="alertmodal.tga" - label="Top Colliders" - name="HelpRegionTopColliders" + name="OpenObjectCannotCopy" type="alertmodal"> -Show a list of objects experiencing the greatest number of potential object-object collisions. These objects can slow performance. Select Advanced > Performance Tools > Statistics Bar and look under Simulator > Time > Physics Time to see if more than 20 ms is being spent in physics. +There are no items in this object that you are allowed to copy. </notification> <notification icon="alertmodal.tga" - label="Top Scripts" - name="HelpRegionTopScripts" + name="WebLaunchAccountHistory" type="alertmodal"> -Show a list of objects spending the most time running LSL scripts. These objects can slow performance. -Select Advanced > Performance Tools > Statistics Bar and look under Simulator > Time > Script Time to see if more than 25 ms is being spent in scripts. +Go to your [http://secondlife.com/account/ Dashboard] to see your account history? + <usetemplate + ignoretext="Launch my browser to see my account history" + name="okcancelignore" + notext="Cancel" + yestext="Go to page"/> </notification> <notification icon="alertmodal.tga" - label="Restart Region" - name="HelpRegionRestart" + name="ConfirmQuit" type="alertmodal"> -Restart the server process running this region after a two minute warning. All Residents in the region will be disconnected. The region will save its data, and should come back up within 90 seconds. - -Restarting the region will not fix most performance problems, and should usually be used only when directed. +Are you sure you want to quit? + <usetemplate + ignoretext="Confirm before I quit" + name="okcancelignore" + notext="Don't Quit" + yestext="Quit"/> + <unique/> </notification> <notification icon="alertmodal.tga" - label="Water Height" - name="HelpRegionWaterHeight" + name="HelpReportAbuseEmailLL" type="alertmodal"> -This is the height in meters where water appears. If this setting is anything other than 20 and you have water that is adjacent to the edge of world or 'void' water, there will be a visible gap. +Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards]. -Default: 20 +All reported abuses are investigated and resolved. You can view the resolution by reading the [http://secondlife.com/support/incidentreport.php Incident Report]. + <unique/> </notification> <notification icon="alertmodal.tga" - label="Terrain Raise" - name="HelpRegionTerrainRaise" - type="alertmodal"> -This is the distance in meters that parcel owners can raise their terrain above the 'baked' terrain default height. - -Default: 4 - </notification> - - <notification - icon="alertmodal.tga" - label="Terrain Lower" - name="HelpRegionTerrainLower" - type="alertmodal"> -This is the distance in meters that parcel owners can lower their terrain below the 'baked' terrain default height. - -Default: -4 - </notification> - - <notification - icon="alertmodal.tga" - label="Upload RAW Terrain" - name="HelpRegionUploadRaw" - type="alertmodal"> -This button uploads a .RAW file to the region you are in. -The file must have the correct dimensions (RGB, 256x256) and 13 channels. The best way to create a terrain file is to download the existing RAW file. A good first step is to modify the red channel (land height), and upload it. - -The upload can take up to 45 seconds. Note that uploading a terrain file *will not* move the objects that are on the land, only the terrain itself and the permissions associated with the parcels. This can result in objects going underground. - -For more information on editing region height fields, consult F1 Help. - </notification> - - <notification - icon="alertmodal.tga" - label="Download RAW Terrain" - name="HelpRegionDownloadRaw" - type="alertmodal"> -This button downloads a file containing the height field data, parcel dimensions, parcel for sale status and some parcel permissions for this region. When opening the file in a program such as Photoshop you must specify the document's dimensions which are: RGB, 256x256 with 13 channels. This terrain file cannot be opened in any other way. - -For more information on editing region height fields, consult F1 help. - </notification> - - <notification - icon="alertmodal.tga" - label="Use Estate Sun" - name="HelpRegionUseEstateSun" - type="alertmodal"> -This checkbox makes the sun position in this region the same as the sun position in the rest of the estate. - -Default: on - </notification> - - <notification - icon="alertmodal.tga" - label="Fixed Sun" - name="HelpRegionFixedSun" - type="alertmodal"> -This checkbox sets the sun position to the position in the Phase slider and stops the sun from moving. - -Default: off - </notification> - - <notification - icon="alertmodal.tga" - label="Bake Terrain" - name="HelpRegionBakeTerrain" - type="alertmodal"> -This button saves the current shape of the terrain as the new default for the region. Once baked, the land can revert to the saved shape whenever you or others use the Edit Terrain 'Revert' option. The baked terrain is also the middle point for the terrain raise and lower limits. - </notification> - - <notification - icon="alertmodal.tga" - label="Estate Managers" - name="HelpEstateEstateManager" - type="alertmodal"> -An estate manager is a Resident to whom you have delegated control of region and estate settings. An estate manager can change any setting in these panels, except for uploading, downloading, and baking terrain. In particular, they can allow or ban Residents from your estate. - -Estate managers can only be added or removed by the owner of the estate, not by each other. Please only choose Residents you trust as estate managers, as you will be ultimately responsible for their actions. - </notification> - - <notification - icon="alertmodal.tga" - label="Use Global Time" - name="HelpEstateUseGlobalTime" - type="alertmodal"> -This checkbox makes the sun in your estate follow the same position as on the Linden-owned 'mainland' estates. - -Default: on - </notification> - - <notification - icon="alertmodal.tga" - label="Fixed Sun" - name="HelpEstateFixedSun" - type="alertmodal"> -This checkbox sets the sun position to the position in the Phase slider and stops the sun from moving. - </notification> - - <notification - icon="alertmodal.tga" - label="Public Access" - name="HelpEstateExternallyVisible" - type="alertmodal"> -This checkbox sets whether Residents who are on other estates can enter this estate without being on an access list. - -Default: on - </notification> - - <notification - icon="alertmodal.tga" - label="Allow Direct Teleport" - name="HelpEstateAllowDirectTeleport" - type="alertmodal"> -When checked, allows Residents to directly teleport to any point in your estate. When unchecked, Residents teleport to the nearest telehub. - -Default: off - </notification> - - <notification - icon="alertmodal.tga" - label="Allow Access" - name="HelpEstateAllowResident" - type="alertmodal"> -Access to this estate will be limited to Residents listed here and any groups below. This setting is only available when Public Access is unchecked. - </notification> - - <notification - icon="alertmodal.tga" - label="Allow Group Access" - name="HelpEstateAllowGroup" - type="alertmodal"> -Access to this estate will be limited to groups listed here and any Residents above. This setting is only available when Public Access is unchecked. - </notification> - - <notification - icon="alertmodal.tga" - label="Abuse Email Address" - name="HelpEstateAbuseEmailAddress" - type="alertmodal"> -Setting this to a valid email address will cause abuse reports on this estate to be sent to that address. -Setting it blank will cause abuse reports to be sent only to Linden Lab. - </notification> - - <notification - icon="alertmodal.tga" - label="Deny Access" - name="HelpEstateBanResident" - type="alertmodal"> -Residents on this list are denied access to your estate, regardless of any other settings. - </notification> - - <notification - icon="alertmodal.tga" - label="Allow Voice Chat" - name="HelpEstateVoiceChat" - type="alertmodal"> -Parcels in this estate are allowed to have their own voice channels in which residents may hear and talk with others nearby. - -Default: off - </notification> - - <notification - icon="alertmodal.tga" - label="Voice Version Mismatch" - name="VoiceVersionMismatch" - type="alertmodal"> -This version of [APP_NAME] is not compatible with the Voice Chat feature in this region. In order for Voice Chat to function correctly you will need to update [APP_NAME]. - </notification> - - <notification - icon="alertmodal.tga" - label="Estate Covenant" - name="HelpEstateCovenant" - type="alertmodal"> -Setting an estate covenant enables you to sell parcels within that estate. If a covenant is not set, you cannot sell the land. The notecard for your covenant can be empty if you do not wish to apply any rules or advise buyers of anything in relation to the land before they buy it. - -A covenant can be used to communicate rules, guidelines, cultural information or simply your own expectations to the prospective buyer. This can include zoning, building regulations, payment options or any other information you feel it is important for the new owner to have seen and to have agreed to before they purchase. - -The buyer must agree to the covenant by ticking the check box before they will be able to finish the purchase. Estate covenants are always visible in the About Land dialog for any parcels that have one set. - </notification> - - <notification - icon="alertmodal.tga" - label="Can't Buy Objects" - name="BuyObjectOneOwner" - type="alertmodal"> -Cannot buy objects from different owners at the same time. -Please select only one object and try again. - </notification> - - <notification - icon="alertmodal.tga" - label="Can't Buy Contents" - name="BuyContentsOneOnly" - type="alertmodal"> -Unable to buy the contents of more than one object at a time. -Please select only one object and try again. - </notification> - - <notification - icon="alertmodal.tga" - label="Can't Buy Contents" - name="BuyContentsOneOwner" - type="alertmodal"> -Cannot buy objects from different owners at the same time. -Please select only one object and try again. - </notification> - - <notification - icon="alertmodal.tga" - name="BuyOriginal" - type="alertmodal"> -Buy original object from [OWNER] for L$[PRICE]? -You will become the owner of this object. -You will be able to: - Modify: [MODIFYPERM] - Copy: [COPYPERM] - Resell or Give Away: [RESELLPERM] - <usetemplate - name="okcancelbuttons" - notext="Cancel" - yestext="OK"/> - </notification> - - <notification - icon="alertmodal.tga" - name="BuyOriginalNoOwner" - type="alertmodal"> -Buy original object for L$[PRICE]? -You will become the owner of this object. -You will be able to: - Modify: [MODIFYPERM] - Copy: [COPYPERM] - Resell or Give Away: [RESELLPERM] - <usetemplate - name="okcancelbuttons" - notext="Cancel" - yestext="OK"/> - </notification> - - <notification - icon="alertmodal.tga" - name="BuyCopy" - type="alertmodal"> -Buy a copy from [OWNER] for L$[PRICE]? -The object will be copied to your inventory. -You will be able to: - Modify: [MODIFYPERM] - Copy: [COPYPERM] - Resell or Give Away: [RESELLPERM] - <usetemplate - name="okcancelbuttons" - notext="Cancel" - yestext="OK"/> - </notification> - - <notification - icon="alertmodal.tga" - name="BuyCopyNoOwner" - type="alertmodal"> -Buy a copy for L$[PRICE]? -The object will be copied to your inventory. -You will be able to: - Modify: [MODIFYPERM] - Copy: [COPYPERM] - Resell or Give Away: [RESELLPERM] - <usetemplate - name="okcancelbuttons" - notext="Cancel" - yestext="OK"/> - </notification> - - <notification - icon="alertmodal.tga" - name="BuyContents" - type="alertmodal"> -Buy contents from [OWNER] for L$[PRICE]? -They will be copied to your inventory. - <usetemplate - name="okcancelbuttons" - notext="Cancel" - yestext="OK"/> - </notification> - - <notification - icon="alertmodal.tga" - name="BuyContentsNoOwner" - type="alertmodal"> -Buy contents for L$[PRICE]? -They will be copied to your inventory. - <usetemplate - name="okcancelbuttons" - notext="Cancel" - yestext="OK"/> - </notification> - - <notification - icon="alertmodal.tga" - name="ConfirmPurchase" - type="alertmodal"> -This transaction will: -[ACTION] - -Are you sure you want to proceed with this purchase? - <usetemplate - name="okcancelbuttons" - notext="Cancel" - yestext="OK"/> - </notification> - - <notification - icon="alertmodal.tga" - name="ConfirmPurchasePassword" - type="password"> -This transaction will: -[ACTION] - -Are you sure you want to proceed with this purchase? -Please re-enter your password and click OK. - <form name="form"> - <input - name="message" - type="password"/> - <button - default="true" - index="0" - name="ConfirmPurchase" - text="OK"/> - <button - index="1" - name="Cancel" - text="Cancel"/> - </form> - </notification> - - <notification - icon="alert.tga" - name="SetPickLocation" - type="alert"> -Note: -You have updated the location of this pick but the other details will retain their original values. - <usetemplate - name="okbutton" - yestext="OK"/> - </notification> - - <notification - icon="alertmodal.tga" - name="MoveInventoryFromObject" - type="alertmodal"> -You have selected 'no copy' inventory items. -These items will be moved to your inventory, not copied. - -Move the inventory item(s)? - <usetemplate - ignoretext="Warn me before I move 'no-copy' items from an object" - name="okcancelignore" - notext="Cancel" - yestext="OK"/> - </notification> - - <notification - icon="alertmodal.tga" - name="MoveInventoryFromScriptedObject" - type="alertmodal"> -You have selected 'no copy' inventory items. These items will be moved to your inventory, not copied. -Because this object is scripted, moving these items to your inventory may cause the script to malfunction. - -Move the inventory item(s)? - <usetemplate - ignoretext="Warn me before I move 'no-copy' items which might break a scripted object" - name="okcancelignore" - notext="Cancel" - yestext="OK"/> - </notification> - - <notification - icon="alert.tga" - name="ClickActionNotPayable" - type="alert"> -Warning: The 'Pay object' click action has been set, but it will only work if a script is added with a money() event. - <form name="form"> - <ignore name="ignore" - text="I set the action 'Pay object' when building an object without a money() script"/> - </form> - </notification> - - <notification - icon="alertmodal.tga" - name="OpenObjectCannotCopy" - type="alertmodal"> -There are no items in this object that you are allowed to copy. - </notification> - - <notification - icon="alertmodal.tga" - name="WebLaunchAccountHistory" - type="alertmodal"> -Go to your [http://secondlife.com/account/ Dashboard] to see your account history? - <usetemplate - ignoretext="Launch my browser to see my account history" - name="okcancelignore" - notext="Cancel" - yestext="Go to page"/> - </notification> - - <notification - icon="alertmodal.tga" - name="ClickOpenF1Help" - type="alertmodal"> -Do you want to visit [SECOND_LIFE] help? - <usetemplate - ignoretext="Launch my browser to view Help/Support" - name="okcancelignore" - notext="Cancel" - yestext="Go"/> - </notification> - - <notification - icon="alertmodal.tga" - name="ConfirmQuit" - type="alertmodal"> -Are you sure you want to quit? - <usetemplate - ignoretext="Confirm before I quit" - name="okcancelignore" - notext="Don't Quit" - yestext="Quit"/> - <unique/> - </notification> - - <notification - icon="alertmodal.tga" - name="HelpReportAbuseEmailLL" - type="alertmodal"> -Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards]. - -All reported abuses are investigated and resolved. You can view the resolution by reading the [http://secondlife.com/support/incidentreport.php Incident Report]. - <unique/> - </notification> - - <notification - icon="alertmodal.tga" - name="HelpReportAbuseEmailEO" + name="HelpReportAbuseEmailEO" type="alertmodal"> IMPORTANT: This report will go to the owner of the region you are currently in and not to Linden Lab. @@ -4499,31 +3988,6 @@ Link to this from a web page to give others easy access to this location, or try </form> </notification> - <notification - icon="alertmodal.tga" - name="GraphicsPreferencesHelp" - type="alertmodal"> -This panel controls window size and resolution and the quality of the client's graphics. The Preferences > Graphics interface allows you to choose between four graphics levels: Low, Mid, High, and Ultra. You may also customize your graphics settings by clicking the Advanced button and manipulating the following settings: - -Shaders: Enable or disable various types of pixel shaders. - -Reflection Detail: Sets the types of objects that water can reflect. - -Avatar Rendering: Sets options that affect how the client renders avatars. - -Draw Distance: Affects how far out from your viewpoint objects will be rendered in the scene. - -Max Particle Count: Sets the maximum number of particles you are able to see on your screen at once. - -Post Process Quality: Sets the resolution with which Glow is rendered. - -Mesh Detail: Sets the amount of detail or number of triangles used in rendering certain objects. A higher value takes longer to render, but makes these objects appear with more detail. - -Lighting Detail: Selects what types of lights you would like to render. - -Terrain Detail: Sets the amount of detail you would like to see for the terrain texture. - </notification> - <notification icon="alertmodal.tga" name="WLSavePresetAlert" @@ -4571,306 +4035,6 @@ PostProcess Effect exists. Do you still wish overwrite it? yestext="Yes"/> </notification> - <notification - icon="alertmodal.tga" - name="HelpEditSky" - type="alertmodal"> -Edit the WindLight sliders to create and save a set of skies. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpEditDayCycle" - type="alertmodal"> -Set which skies to turn to throughout the day. - </notification> - - <notification - icon="alertmodal.tga" - name="EnvSettingsHelpButton" - type="alertmodal"> -These settings adjust the way the environment looks locally on your computer. Your graphics card needs to support atmospheric shaders in order to have access to all of the settings. - -Adjust the "Time of Day" slider to change the day's phase locally on the viewer. - -Adjust the "Cloud Cover" slider to control how much the clouds cover the sky. - -Pick a color in the "Water Color" color picker to change the color of the water. - -Adjust the "Water Fog" slider to control how dense the fog is underwater. - -Click "Use Estate Time" to reset the time of day to the region's current time of day and remain linked to it. - -Click "Advanced Sky" to bring up an editor with more advanced settings for the sky. - -Click "Advanced Water" to bring up an editor with more advanced settings for the water. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpDayCycle" - type="alertmodal"> -The Day Cycle Editor gives you control over the sky during [SECOND_LIFE]'s day/night cycle. This is the cycle that is used by the Basic Environment Editor's Time of Day slider. - -The Day Cycle Editor works by setting keyframes. These are nodes (represented by the gray blips on the time graph) that have Sky Presets associated with them. As the Time of Day progresses, the WindLight sky "animates" as it interpolates between these keyframes. - -The yellow arrow above the timeline represents your current view, based on Time of Day. Click and drag it to see how your day will animate. You may add or delete keyframes by pressing the Add Key and Delete Key buttons to the right of the timeline. - -You can set the time position of a keyframe by either dragging it along the timeline, or by setting its value manually in the Key Frame Settings frame. Within the Key Frame Settings frame, you'll be able to associate the keyframe with its respective WindLight preset. - -Length of Cycle dictates the overall duration of a "day". Setting this to a low value (for instance, 2 min.) will mean your entire 24-hour timeline will animate in only two real minutes! Once you are satisfied with your timeline and keyframe cycle, use the Play and Stop buttons to preview the results. Remember- you can also move the yellow time-indicator arrow above the timeline to see the cycle animate interactively. Using the Use Estate Time button will synchronize your day length and time of day with the Estate's day cycle. - -Once you are pleased with your Day Cycle, you can save and load it with the Save Test Day and Load Test Day buttons. Note that, for now, we only allow one Day Cycle. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpBlueHorizon" - type="alertmodal"> -Use the Red/Green/Blue (RGB) sliders to adjust the color of the sky. You can use the Intensity (I) slider to move all three RGB sliders in unison. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpHazeHorizon" - type="alertmodal"> -Haze Horizon is one of the most useful parameters for adjusting overall light exposure in the scene. It is effective for simulating many exposure settings, such as white-outs from the sun and darker, closed-iris settings. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpBlueDensity" - type="alertmodal"> -Blue Density affects the overall color saturation of the sky and fog. If you move the Intensity (I) slider to the right, colors will become brighter and more vibrant. If you move it all the way to the left, the colors will become duller, eventually fading to black and white. If you want to fine-tune the sky's color balance, you can control individual elements of saturation by using the Red/Green/Blue (RGB) sliders. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpHazeDensity" - type="alertmodal"> -Haze Density controls the level of dull, gray haze in the atmosphere. It is effective for simulating scenes with high levels of smoke and man-made pollutants. It is also effective for simulating fog and mist. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpDensityMult" - type="alertmodal"> -The Density Multiplier can be used to affect the overall atmospheric density. At lower settings, it creates a feeling of "thin air", and at higher settings, it creates a very heavy, smoggy effect. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpDistanceMult" - type="alertmodal"> -Adjusts WindLight's perceived distance. A value of zero effectively turns off WindLight's influence on terrain and objects. Values greater than 1 simulate greater distances for thicker atmospheric effects. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpMaxAltitude" - type="alertmodal"> -Max Altitude adjusts the altitude calculations WindLight performs when computing its atmospheric lighting. At later times of day, it is useful for adjusting how "deep" the sunset appears. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpSunlightColor" - type="alertmodal"> -Adjusts the color and intensity of the direct light in the scene. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpSunAmbient" - type="alertmodal"> -Adjusts the color and intensity of ambient atmospheric light in the scene. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpSunGlow" - type="alertmodal"> -The Size slider controls the size of the sun. -The Focus slider controls how blurred the sun is over the sky. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpSceneGamma" - type="alertmodal"> -Adjust the screen's distribution of light and dark. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpStarBrightness" - type="alertmodal"> -Adjusts the brightness of the stars in the sky. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpTimeOfDay" - type="alertmodal"> -Controls the location of the sun in the sky. -Similar to elevation. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpEastAngle" - type="alertmodal"> -Controls the location of the sun in the sky. -Similar to azimuth. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpCloudColor" - type="alertmodal"> -Edits the color of the clouds. It is generally recommended to keep it whitish, but hey, have fun if you want. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpCloudDetail" - type="alertmodal"> -Controls the detail image layered on top of the main cloud image. X and Y control its position. D (Density) controls how puffy or fractured the clouds appear. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpCloudDensity" - type="alertmodal"> -Allows you to control the position of the clouds with the X and Y sliders and how dense they are with the the D slider. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpCloudCoverage" - type="alertmodal"> -Controls how much the clouds cover the sky. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpCloudScale" - type="alertmodal"> -Controls the scaling of the cloud image on the sky dome. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpCloudScrollX" - type="alertmodal"> -Controls the speed of the clouds as they move in the X direction. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpCloudScrollY" - type="alertmodal"> -Controls the speed of the clouds as they move in the Y direction. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpClassicClouds" - type="alertmodal"> -Check this box to enable rendering of [SECOND_LIFE]'s older classic clouds in addition to WindLight's clouds. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpWaterFogColor" - type="alertmodal"> -Chooses the color of the underwater fog. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpWaterFogDensity" - type="alertmodal"> -Controls how dense the water fog is and how far you can see underwater. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpUnderWaterFogMod" - type="alertmodal"> -Modifies the effect of the Fog Density Exponent to control how far you can see when your avatar is underwater. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpWaterGlow" - type="alertmodal"> -Controls how much the surface of the water glows. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpWaterNormalScale" - type="alertmodal"> -Controls the scaling of the three wavelets that make up the water. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpWaterFresnelScale" - type="alertmodal"> -Controls how much light is reflected at different angles. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpWaterFresnelOffset" - type="alertmodal"> -Controls how much light intensity is reflected. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpWaterScaleAbove" - type="alertmodal"> -Controls how much light is refracted from looking above the surface of the water. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpWaterScaleBelow" - type="alertmodal"> -Controls how much light is refracted from looking from below the surface of the water. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpWaterBlurMultiplier" - type="alertmodal"> -Controls how waves and reflections are mixed. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpWaterNormalMap" - type="alertmodal"> -Controls what normal map is layered across the water to determine reflections/refractions. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpWaterWave1" - type="alertmodal"> -Controls where and how fast the large scaled version of the normal map moves in the X and Y direction. - </notification> - - <notification - icon="alertmodal.tga" - name="HelpWaterWave2" - type="alertmodal"> -Controls where and how fast the the small scaled version of the normal map moves in the X and Y direction. - </notification> - <notification icon="alert.tga" name="NewSkyPreset" @@ -5618,14 +4782,6 @@ You are banned from the region. Your account cannot connect to this teen grid region. </notification> - <notification - icon="notify.tga" - name="NoHelpIslandTP" - type="notify"> -You cannot teleport back to Help Island. -Go to 'Help Island Public' to repeat the tutorial. - </notification> - <notification icon="notify.tga" name="ImproperPaymentStatus" 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 04e0ad3be8a..c81c7113ae2 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 @@ -29,17 +29,6 @@ name="land_contrib_error"> Unable to set your land contribution. </panel.string> - <!-- - <button - follows="left|top" - height="16" - label="?" - layout="topleft" - left="250" - name="help_button" - top="8" - width="20" /> - --> <!-- <text type="string" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index d9fb9629982..0e4d490369a 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -22,16 +22,6 @@ the General tab. name="no_notices_text"> There are no past notices. </panel.string> - <!-- <button - follows="left|top" - height="16" - label="?" - label_selected="?" - layout="topleft" - left="250" - name="help_button" - top="8" - width="20" /> --> <!--<text follows="left|top" type="string" @@ -383,4 +373,4 @@ the General tab. top_pad="10" width="135" /> </panel> -</panel> \ No newline at end of file +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 909c3f45776..e87859f788a 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -18,17 +18,6 @@ </panel.string> <panel.string name="help_text" /> - <!-- - <button - follows="left|top" - height="16" - label="?" - layout="topleft" - left="250" - name="help_button" - top="8" - width="20" /> - --> <!--<panel follows="left|top" height="80" diff --git a/indra/newview/skins/default/xui/en/panel_region_covenant.xml b/indra/newview/skins/default/xui/en/panel_region_covenant.xml index b3147f5e6ba..49fc930cd8a 100644 --- a/indra/newview/skins/default/xui/en/panel_region_covenant.xml +++ b/indra/newview/skins/default/xui/en/panel_region_covenant.xml @@ -103,17 +103,6 @@ width="308"> Last Modified Wed Dec 31 16:00:00 1969 </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="5" - name="covenant_help" - top_delta="-2" - width="18" /> - <text_editor enabled="false" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml index 25e1171688c..a1bca4229dc 100644 --- a/indra/newview/skins/default/xui/en/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml @@ -40,16 +40,6 @@ tool_tip="Disable all scripts in this region" top="30" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="70" - name="disable_scripts_help" - top_delta="2" - width="18" /> <check_box height="20" label="Disable Collisions" @@ -59,16 +49,6 @@ tool_tip="Disable non-avatar collisions in this region" top="50" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="70" - name="disable_collisions_help" - top_delta="2" - width="18" /> <check_box height="20" label="Disable Physics" @@ -78,16 +58,6 @@ tool_tip="Disable all physics in this region" top="70" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="70" - name="disable_physics_help" - top_delta="2" - width="18" /> <button enabled="false" follows="left|top" @@ -204,16 +174,6 @@ tool_tip="List of objects experiencing the most potential collisions" top="313" width="150" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="10" - name="top_colliders_help" - top_delta="2" - width="18" /> <button follows="left|top" font="SansSerifSmall" @@ -225,16 +185,6 @@ tool_tip="List of objects spending the most time running scripts" top_pad="5" width="150" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="10" - name="top_scripts_help" - top_delta="2" - width="18" /> <button follows="left|top" font="SansSerifSmall" @@ -246,16 +196,6 @@ tool_tip="Give 2 minute countdown and restart region" top_pad="5" width="130" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="10" - name="restart_help" - top_delta="2" - width="18" /> <button follows="left|top" font="SansSerifSmall" diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml index c7a60ed2e48..add14761791 100644 --- a/indra/newview/skins/default/xui/en/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml @@ -94,16 +94,6 @@ regions in the estate. name="use_global_time_check" top="132" width="200" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="20" - name="use_global_time_help" - top_delta="2" - width="18" /> <check_box height="20" label="Fixed Sun" @@ -112,16 +102,6 @@ regions in the estate. name="fixed_sun_check" top="152" width="100" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="120" - name="fixed_sun_help" - top_delta="2" - width="18" /> <icon height="20" image_name="icon_day_cycle.tga" @@ -151,16 +131,6 @@ regions in the estate. name="externally_visible_check" top_pad="6" width="200" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="20" - name="externally_visible_help" - top_delta="2" - width="18" /> <text type="string" length="1" @@ -201,16 +171,6 @@ regions in the estate. name="voice_chat_check" top="304" width="200" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="20" - name="voice_chat_help" - top_delta="2" - width="18" /> <check_box height="20" label="Allow Direct Teleport" @@ -219,16 +179,6 @@ regions in the estate. name="allow_direct_teleport" top_pad="4" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="140" - name="allow_direct_teleport_help" - top_delta="2" - width="18" /> <text type="string" length="1" @@ -249,16 +199,6 @@ regions in the estate. name="abuse_email_address" top_pad="5" width="205" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="12" - name="abuse_email_address_help" - top_dekta="0" - width="18" /> <button enabled="false" follows="left|top" @@ -300,16 +240,6 @@ regions in the estate. width="200"> Estate Managers: </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="182" - name="estate_manager_help" - top_delta="-1" - width="18" /> <view_border bevel_style="none" follows="top|left" @@ -357,16 +287,6 @@ regions in the estate. width="200"> Allowed Residents: </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="182" - name="allow_resident_help" - top_delta="-1" - width="18" /> <view_border bevel_style="none" follows="top|left" @@ -414,16 +334,6 @@ regions in the estate. width="200"> Allowed Groups: </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="182" - name="allow_group_help" - top_delta="-1" - width="18" /> <view_border bevel_style="none" follows="top|left" @@ -471,16 +381,6 @@ regions in the estate. width="200"> Banned Residents: </text> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_delta="182" - name="ban_resident_help" - top_delta="-1" - width="18" /> <view_border bevel_style="none" follows="top|left" diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index 160ae96fc4e..7f477bdc647 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -83,16 +83,6 @@ name="block_terraform_check" top="70" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="terraform_help" - top_delta="2" - width="18" /> <check_box height="20" label="Block Fly" @@ -101,16 +91,6 @@ name="block_fly_check" top="90" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="fly_help" - top_delta="2" - width="18" /> <check_box height="20" label="Allow Damage" @@ -119,16 +99,6 @@ name="allow_damage_check" top="110" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="damage_help" - top_delta="2" - width="18" /> <check_box height="20" label="Restrict Pushing" @@ -137,16 +107,6 @@ name="restrict_pushobject" top="130" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="restrict_pushobject_help" - top_delta="2" - width="18" /> <check_box height="20" label="Allow Land Resell" @@ -155,16 +115,6 @@ name="allow_land_resell_check" top="160" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="land_resell_help" - top_delta="2" - width="18" /> <check_box height="20" label="Allow Land Join/Divide" @@ -173,16 +123,6 @@ name="allow_parcel_changes_check" top="180" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="parcel_changes_help" - top_delta="2" - width="18" /> <check_box height="20" label="Block Land Show in Search" @@ -192,16 +132,6 @@ tool_tip="Let people see this region and its parcels in search results" top="200" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="parcel_search_help" - top_delta="2" - width="18" /> <spinner follows="left|top" height="20" @@ -215,16 +145,6 @@ name="agent_limit_spin" top="240" width="170" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="25" - name="agent_limit_help" - top_delta="2" - width="18" /> <spinner follows="left|top" height="20" @@ -238,16 +158,6 @@ name="object_bonus_spin" top="260" width="170" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="25" - name="object_bonus_help" - top_delta="2" - width="18" /> <text follows="left|top" height="20" @@ -280,16 +190,6 @@ name="PG" value="13" /> </combo_box> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="10" - name="access_help" - top_delta="2" - width="18" /> <button enabled="false" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml index 9b9c62dbf9d..b199339628d 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml @@ -83,16 +83,6 @@ name="block_terraform_check" top="70" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="terraform_help" - top_delta="2" - width="18" /> <check_box height="20" label="Block Fly" @@ -101,16 +91,6 @@ name="block_fly_check" top="90" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="fly_help" - top_delta="2" - width="18" /> <check_box height="20" label="Allow Damage" @@ -119,16 +99,6 @@ name="allow_damage_check" top="110" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="damage_help" - top_delta="2" - width="18" /> <check_box height="20" label="Restrict Pushing" @@ -137,16 +107,6 @@ name="restrict_pushobject" top="130" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="restrict_pushobject_help" - top_delta="2" - width="18" /> <check_box height="20" label="Allow Land Resell" @@ -155,16 +115,6 @@ name="allow_land_resell_check" top="160" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="land_resell_help" - top_delta="2" - width="18" /> <check_box height="20" label="Allow Land Join/Divide" @@ -173,16 +123,6 @@ name="allow_parcel_changes_check" top="180" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="parcel_changes_help" - top_delta="2" - width="18" /> <check_box height="20" label="Block Land Show in Search" @@ -192,16 +132,6 @@ tool_tip="Let people see this region and its parcels in search results" top="200" width="80" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="115" - name="parcel_search_help" - top_delta="2" - width="18" /> <spinner follows="left|top" height="20" @@ -215,16 +145,6 @@ name="agent_limit_spin" top="240" width="170" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="25" - name="agent_limit_help" - top_delta="2" - width="18" /> <spinner follows="left|top" height="20" @@ -238,16 +158,6 @@ name="object_bonus_spin" top="260" width="170" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="25" - name="object_bonus_help" - top_delta="2" - width="18" /> <text follows="left|top" height="20" @@ -280,16 +190,6 @@ name="PG" value="13" /> </combo_box> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="10" - name="access_help" - top_delta="2" - width="18" /> <button enabled="false" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_region_terrain.xml b/indra/newview/skins/default/xui/en/panel_region_terrain.xml index 148d9500bb8..ffd51bf510f 100644 --- a/indra/newview/skins/default/xui/en/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/en/panel_region_terrain.xml @@ -42,16 +42,6 @@ name="water_height_spin" top="40" width="180" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="5" - name="water_height_help" - top_delta="2" - width="18" /> <spinner follows="left|top" height="20" @@ -64,16 +54,6 @@ name="terrain_raise_spin" top="60" width="180" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="5" - name="terrain_raise_help" - top_delta="2" - width="18" /> <spinner follows="left|top" height="20" @@ -87,16 +67,6 @@ name="terrain_lower_spin" top="80" width="180" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="5" - name="terrain_lower_help" - top_delta="2" - width="18" /> <check_box height="20" label="Use Estate Sun" @@ -105,16 +75,6 @@ name="use_estate_sun_check" top="35" width="100" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="70" - name="use_estate_sun_help" - top_delta="2" - width="18" /> <check_box height="20" label="Fixed Sun" @@ -123,16 +83,6 @@ name="fixed_sun_check" top="55" width="100" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="70" - name="fixed_sun_help" - top_delta="2" - width="18" /> <icon height="20" image_name="icon_day_cycle.tga" @@ -182,16 +132,6 @@ tool_tip="Available only to estate owners, not managers" top_pad="60" width="170" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="10" - name="download_raw_help" - top_delta="2" - width="18" /> <button follows="left|top" height="20" @@ -202,16 +142,6 @@ tool_tip="Available only to estate owners, not managers" top="243" width="170" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="10" - name="upload_raw_help" - top_delta="2" - width="18" /> <button follows="left|top" height="20" @@ -222,14 +152,4 @@ tool_tip="Set current terrain as mid-point for raise/lower limits" top="283" width="100" /> - <button - follows="left|top" - font="SansSerifSmall" - height="18" - label="?" - layout="topleft" - left_pad="10" - name="bake_terrain_help" - top_delta="2" - width="18" /> </panel> -- GitLab From 5f30904db45c8cd3eec5506503128eaf3df4e429 Mon Sep 17 00:00:00 2001 From: Dmitry Zaporozhan <dzaporozhan@productengine.com> Date: Tue, 3 Nov 2009 12:30:09 +0200 Subject: [PATCH 036/306] Fixed Windows build. --HG-- branch : product-engine --- indra/newview/llagentui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp index 41c8066aca4..2911a35581b 100644 --- a/indra/newview/llagentui.cpp +++ b/indra/newview/llagentui.cpp @@ -92,8 +92,8 @@ std::string LLAgentUI::buildSLURL(const bool escaped /*= true*/) //static BOOL LLAgentUI::checkAgentDistance(const LLVector3& pole, F32 radius) { - S32 delta_x = gAgent.getPositionAgent().mV[VX] - pole.mV[VX]; - S32 delta_y = gAgent.getPositionAgent().mV[VY] - pole.mV[VY]; + F32 delta_x = gAgent.getPositionAgent().mV[VX] - pole.mV[VX]; + F32 delta_y = gAgent.getPositionAgent().mV[VY] - pole.mV[VY]; return sqrt( delta_x* delta_x + delta_y* delta_y ) < radius; } -- GitLab From 3a09e94c7cc23279a4e5353baf81b3ba2dc3e6f4 Mon Sep 17 00:00:00 2001 From: Igor Borovkov <iborovkov@productengine.com> Date: Tue, 3 Nov 2009 12:57:21 +0200 Subject: [PATCH 037/306] got rid of exit crash and warning messages 'Trying to access deleted singleton' --HG-- branch : product-engine --- indra/newview/llagentpicksinfo.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/newview/llagentpicksinfo.cpp b/indra/newview/llagentpicksinfo.cpp index 6e5835bace2..3c8d0dac426 100644 --- a/indra/newview/llagentpicksinfo.cpp +++ b/indra/newview/llagentpicksinfo.cpp @@ -47,7 +47,8 @@ class LLAgentPicksInfo::LLAgentPicksObserver : public LLAvatarPropertiesObserver ~LLAgentPicksObserver() { - LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this); + if (LLAvatarPropertiesProcessor::instanceExists()) + LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this); } void sendAgentPicksRequest() -- GitLab From c940d3d5b92ba915a51e98c9141243ccd6b5145b Mon Sep 17 00:00:00 2001 From: Eugene Kondrashev <ekondrashev@productengine.com> Date: Tue, 3 Nov 2009 13:11:49 +0200 Subject: [PATCH 038/306] Added 'Loading...' message to avatarlist while opening group/adhoc chat --HG-- branch : product-engine --- indra/newview/llparticipantlist.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index e97eb1df2b6..918c7989eda 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -32,6 +32,9 @@ #include "llviewerprecompiledheaders.h" +// common includes +#include "lltrans.h" + #include "llparticipantlist.h" #include "llavatarlist.h" #include "llspeakers.h" @@ -49,6 +52,8 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove"); mSpeakerMgr->addListener(mSpeakerClearListener, "clear"); + mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); + //Lets fill avatarList with existing speakers LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); -- GitLab From 01724523cffec8b01ae873ed46cd05ec27a26379 Mon Sep 17 00:00:00 2001 From: Igor Borovkov <iborovkov@productengine.com> Date: Tue, 3 Nov 2009 13:15:15 +0200 Subject: [PATCH 039/306] IM: defensive fix to get rid of warnings about attempts to get speaker mgr for removed sessions --HG-- branch : product-engine --- indra/newview/llimfloater.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index dee86f4a222..7bad9499211 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -106,6 +106,8 @@ void LLIMFloater::onFocusReceived() // virtual void LLIMFloater::onClose(bool app_quitting) { + if (!gIMMgr->hasSession(mSessionID)) return; + setTyping(false); gIMMgr->leaveSession(mSessionID); } -- GitLab From 3b17d74cb0998bbdbd70e3fc70255a2ba5df385b Mon Sep 17 00:00:00 2001 From: Yuri Chebotarev <ychebotarev@productengine.com> Date: Tue, 3 Nov 2009 13:34:19 +0200 Subject: [PATCH 040/306] fix for normal task EXT-2099 Make the Log button toggleable --HG-- branch : product-engine --- .../newview/skins/default/xui/en/panel_nearby_chat_bar.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 2182163da5b..555fedb1ffb 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 @@ -42,13 +42,17 @@ width="20" /> <button follows="right" + is_toggle="true" width="45" top="0" layout="topleft" left_pad="8" label="Log" height="23" + name="show_nearby_chat" tool_tip="Show/hide nearby chat log"> - <button.commit_callback function="Floater.Toggle" parameter="nearby_chat"/> + <button.init_callback + function="Button.SetDockableFloaterToggle" + parameter="nearby_chat" /> </button> </panel> -- GitLab From 645e2588511ff55b773e22fe3c9ee2c4de37843c Mon Sep 17 00:00:00 2001 From: Andrew Dyukov <adyukov@productengine.com> Date: Tue, 3 Nov 2009 14:01:33 +0200 Subject: [PATCH 041/306] Fixed EXT-1854 (Area of working for nav bar context menu is changed) --HG-- branch : product-engine --- indra/newview/llnavigationbar.cpp | 7 +++++++ indra/newview/llnavigationbar.h | 1 + 2 files changed, 8 insertions(+) diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index e63daac4afb..b35fd6134b7 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -50,6 +50,7 @@ #include "llslurl.h" #include "llurlsimstring.h" #include "llviewerinventory.h" +#include "llviewermenu.h" #include "llviewerparcelmgr.h" #include "llworldmap.h" #include "llappviewer.h" @@ -271,6 +272,12 @@ void LLNavigationBar::draw() LLPanel::draw(); } +BOOL LLNavigationBar::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ + show_navbar_context_menu(this,x,y); + return TRUE; +} + void LLNavigationBar::onBackButtonClicked() { LLTeleportHistory::getInstance()->goBack(); diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 8b625e7fa62..21645664dad 100644 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -54,6 +54,7 @@ class LLNavigationBar virtual ~LLNavigationBar(); /*virtual*/ void draw(); + /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); /*virtual*/ BOOL postBuild(); void handleLoginComplete(); -- GitLab From c4935ea25b8a3fcf93df07ee2f39fd54b48c5960 Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Tue, 3 Nov 2009 14:24:57 +0200 Subject: [PATCH 042/306] no ticket. Mistyped class name has been corrected. --HG-- branch : product-engine --- indra/newview/lllandmarkactions.cpp | 6 +++--- indra/newview/lllandmarkactions.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp index 0b07dd4f212..319212f6043 100644 --- a/indra/newview/lllandmarkactions.cpp +++ b/indra/newview/lllandmarkactions.cpp @@ -135,13 +135,13 @@ use_substring(if_use_substring) // Returns true if the given inventory item is a landmark pointing to the current parcel. // Used to find out if there is at least one landmark from current parcel. -class LLFistAgentParcelLandmark : public LLInventoryCollectFunctor +class LLFirstAgentParcelLandmark : public LLInventoryCollectFunctor { private: bool mFounded;// to avoid unnecessary check public: - LLFistAgentParcelLandmark(): mFounded(false){} + LLFirstAgentParcelLandmark(): mFounded(false){} /*virtual*/ bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) { @@ -202,7 +202,7 @@ bool LLLandmarkActions::landmarkAlreadyExists() //static bool LLLandmarkActions::hasParcelLandmark() { - LLFistAgentParcelLandmark get_first_agent_landmark; + LLFirstAgentParcelLandmark get_first_agent_landmark; LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; fetch_landmarks(cats, items, get_first_agent_landmark); diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h index 312426cab01..1c524c820c9 100644 --- a/indra/newview/lllandmarkactions.h +++ b/indra/newview/lllandmarkactions.h @@ -55,7 +55,7 @@ class LLLandmarkActions static bool landmarkAlreadyExists(); /** - * @brief Checks whether landmark exists for current parcel. + * @brief Checks whether landmark exists for current agent parcel. */ static bool hasParcelLandmark(); -- GitLab From 24179cbcc609953ec05c75bcdad5b042e1d62e92 Mon Sep 17 00:00:00 2001 From: Igor Borovkov <iborovkov@productengine.com> Date: Tue, 3 Nov 2009 14:25:08 +0200 Subject: [PATCH 043/306] fixed normal EXT-1131 Message Well counts non-interactive notifications however chiclet-window is opened --HG-- branch : product-engine --- indra/newview/llchiclet.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index a854eb852fe..1049348684f 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -830,13 +830,21 @@ LLChicletPanel::~LLChicletPanel() void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){ LLUUID session_id = data["session_id"].asUUID(); + S32 unread = data["num_unread"].asInteger(); + + LLIMFloater* im_floater = LLIMFloater::findInstance(session_id); + if (im_floater && im_floater->getVisible()) + { + unread = 0; + } + std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id); std::list<LLChiclet *>::iterator iter; for (iter = chiclets.begin(); iter != chiclets.end(); iter++) { LLChiclet* chiclet = *iter; if (chiclet != NULL) { - chiclet->setCounter(data["num_unread"].asInteger()); + chiclet->setCounter(unread); } else { -- GitLab From 37742cbbf242abcd9f70a8a179ec740e6867e121 Mon Sep 17 00:00:00 2001 From: Eugene Kondrashev <ekondrashev@productengine.com> Date: Tue, 3 Nov 2009 14:35:00 +0200 Subject: [PATCH 044/306] Added double click avatar list item callback showing new IM session --HG-- branch : product-engine --- indra/newview/llparticipantlist.cpp | 13 +++++++++++++ indra/newview/llparticipantlist.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 918c7989eda..133f13aab84 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -34,6 +34,8 @@ // common includes #include "lltrans.h" +#include "llavataractions.h" +#include "llagent.h" #include "llparticipantlist.h" #include "llavatarlist.h" @@ -53,6 +55,7 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av mSpeakerMgr->addListener(mSpeakerClearListener, "clear"); mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); + mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); //Lets fill avatarList with existing speakers LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); @@ -67,6 +70,16 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av mAvatarList->sortByName(); } +void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list) +{ + LLUUID clicked_id = list->getSelectedUUID(); + + if (clicked_id.isNull() || clicked_id == gAgent.getID()) + return; + + LLAvatarActions::startIM(clicked_id); +} + LLParticipantList::~LLParticipantList() { delete mSpeakerAddListener; diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 68aae0aee54..a3a55303c01 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -74,6 +74,8 @@ class LLParticipantList LLAvatarList* mAvatarList; }; private: + void onAvatarListDoubleClicked(LLAvatarList* list); + LLSpeakerMgr* mSpeakerMgr; LLAvatarList* mAvatarList; -- GitLab From a7d82c0d0e02f53929e5a5574f6efcb7db91b5af Mon Sep 17 00:00:00 2001 From: Sergey Borushevsky <sborushevsky@productengine.com> Date: Tue, 3 Nov 2009 14:54:43 +0200 Subject: [PATCH 045/306] Temporary fix for normal task EXT-1510 (Implement left side sticking control panels for IM floaters) Disabled resizing of left side control panel to not occupy space for chat history on the right side. Changed follows properties for icon and buttons in panel_im_control_panel, icon sticked to top, buttons to bottom. --HG-- branch : product-engine --- .../newview/skins/default/xui/en/floater_im_session.xml | 2 +- .../skins/default/xui/en/panel_im_control_panel.xml | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) 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 c314fce42dc..c4324b425a9 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -28,10 +28,10 @@ name="panel_im_control_panel" layout="topleft" top_delta="-3" - width="146" height="305" follows="left" label="IM Control Panel" + auto_resize="false" user_resize="false" /> <layout_panel height="305" width="200" 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 a9396661e0a..04ee1a19cb1 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 @@ -5,26 +5,31 @@ border="false"> <avatar_icon name="avatar_icon" + follows="left|top" width="96" height="96" /> <button name="view_profile_btn" + follows="left|bottom" label="View Profile" left_delta="3" width="125" height="20" /> <button name="add_friend_btn" + follows="left|bottom" label="Add Friend" width="125" height="20" /> <button name="call_btn" + follows="left|bottom" label="Call" width="125" height="20" /> <button + follows="left|bottom" height="20" label="End Call" name="end_call_btn" @@ -33,6 +38,7 @@ <button enabled="false" + follows="left|bottom" name="voice_ctrls_btn" label="Open Voice Controls" width="125" @@ -40,14 +46,17 @@ visible="false"/> <button name="teleport_btn" + follows="left|bottom" label="Teleport" width="125" height="20" /> <button name="share_btn" + follows="left|bottom" label="Share" width="125" height="20" /> <button name="pay_btn" + follows="left|bottom" label="Pay" width="125" height="20" /> -- GitLab From 4fa120feb419f7ab99998466623696584b7b282d Mon Sep 17 00:00:00 2001 From: Dmitry Zaporozhan <dzaporozhan@productengine.com> Date: Tue, 3 Nov 2009 14:58:31 +0200 Subject: [PATCH 046/306] Fixed low bug EXT-1620 - Collapsed accordion panels should expand while filtering if they contain matched items. --HG-- branch : product-engine --- indra/newview/llavatarlist.cpp | 35 +++++++++++++++++++++ indra/newview/llavatarlist.h | 7 +++++ indra/newview/llpanelpeople.cpp | 54 +++++++++++++++++++++++++++++++++ indra/newview/llpanelpeople.h | 6 ++++ 4 files changed, 102 insertions(+) diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 7b2dc02864f..8609ba8b1c6 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -239,11 +239,46 @@ void LLAvatarList::refresh() bool dirty = add_limit_exceeded || (have_filter && !have_names); setDirty(dirty); + // Refreshed all items, lets send refresh_complete signal. + if(!dirty) + { + std::vector<LLSD> cur_values; + getValues(cur_values); + mRefreshCompleteSignal(this, LLSD((S32)cur_values.size())); + } + // Commit if we've added/removed items. if (modified) onCommit(); } +bool LLAvatarList::filterHasMatches() +{ + uuid_vector_t values = getIDs(); + + for (uuid_vector_t::const_iterator it=values.begin(); it != values.end(); it++) + { + std::string name; + const LLUUID& buddy_id = *it; + BOOL have_name = gCacheName->getFullName(buddy_id, name); + + // If name has not been loaded yet we consider it as a match. + // When the name will be loaded the filter will be applied again(in refresh()). + + if (have_name && !findInsensitive(name, mNameFilter)) + { + continue; + } + + return true; + } + return false; +} + +boost::signals2::connection LLAvatarList::setRefreshCompleteCallback(const commit_signal_t::slot_type& cb) +{ + return mRefreshCompleteSignal.connect(cb); +} void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos) { diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 51d3760d393..195d9e5b550 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -82,6 +82,11 @@ class LLAvatarList : public LLFlatListView const std::string getIconParamName() const{return mIconParamName;} virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); + // Return true if filter has at least one match. + bool filterHasMatches(); + + boost::signals2::connection setRefreshCompleteCallback(const commit_signal_t::slot_type& cb); + protected: void refresh(); @@ -107,6 +112,8 @@ class LLAvatarList : public LLFlatListView uuid_vector_t mIDs; LLAvatarListItem::ContextMenu* mContextMenu; + + commit_signal_t mRefreshCompleteSignal; }; /** Abstract comparator for avatar items */ diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 0d16b0a041b..2f8fae0f5de 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -42,6 +42,7 @@ #include "llpanelpeople.h" // newview +#include "llaccordionctrl.h" #include "llaccordionctrltab.h" #include "llagent.h" #include "llavataractions.h" @@ -516,6 +517,9 @@ BOOL LLPanelPeople::postBuild() // call this method in case some list is empty and buttons can be in inconsistent state updateButtons(); + mOnlineFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2)); + mAllFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2)); + return TRUE; } @@ -560,6 +564,8 @@ void LLPanelPeople::updateFriendList() mOnlineFriendList->setDirty(); mAllFriendList->setDirty(); + + showFriendsAccordionsIfNeeded(); } void LLPanelPeople::updateNearbyList() @@ -813,6 +819,8 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string) mAllFriendList->setNameFilter(mFilterSubString); mRecentList->setNameFilter(mFilterSubString); mGroupList->setNameFilter(mFilterSubString); + + showFriendsAccordionsIfNeeded(); } void LLPanelPeople::onTabSelected(const LLSD& param) @@ -1125,3 +1133,49 @@ void LLPanelPeople::onOpen(const LLSD& key) else reSelectedCurrentTab(); } + +void LLPanelPeople::showAccordion(const std::string name, bool show) +{ + if(name.empty()) + { + llwarns << "No name provided" << llendl; + return; + } + + LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(name); + tab->setVisible(show); + if(show) + { + // expand accordion + tab->changeOpenClose(false); + } +} + +void LLPanelPeople::showFriendsAccordionsIfNeeded() +{ + if(FRIENDS_TAB_NAME == getActiveTabName()) + { + // Expand and show accordions if needed, else - hide them + showAccordion("tab_online", mOnlineFriendList->filterHasMatches()); + showAccordion("tab_all", mAllFriendList->filterHasMatches()); + + // Rearrange accordions + LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); + accordion->arrange(); + } +} + +void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param) +{ + if(ctrl == mOnlineFriendList) + { + showAccordion("tab_online", param.asInteger()); + } + else if(ctrl == mAllFriendList) + { + showAccordion("tab_all", param.asInteger()); + } + + LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); + accordion->arrange(); +} diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index dc0aaeb70f1..9bf9befe906 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -124,6 +124,12 @@ class LLPanelPeople : public LLPanel void onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list); + void showAccordion(const std::string name, bool show); + + void showFriendsAccordionsIfNeeded(); + + void onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param); + LLFilterEditor* mFilterEditor; LLTabContainer* mTabContainer; LLAvatarList* mOnlineFriendList; -- GitLab From 1e4877244d34d2c31459cc42a351736c6494e99e Mon Sep 17 00:00:00 2001 From: "lynx@eniac45.lindenlab.com" <lynx@eniac45.lindenlab.com> Date: Tue, 3 Nov 2009 06:39:21 -0800 Subject: [PATCH 047/306] Trivial whitespace change to test mercurial process with tofu and soft. --- indra/llwindow/llwindowsdl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 9f03c8f6956..1df2b5eba84 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -59,7 +59,7 @@ extern "C" { #if LL_LINUX || LL_SOLARIS // not necessarily available on random SDL platforms, so #if LL_LINUX -// for execv(), waitpid(), fork() +// for execv(), waitpid(), fork() # include <unistd.h> # include <sys/types.h> # include <sys/wait.h> -- GitLab From efa9c7a5ba1fa1facaa15d22418e9d4199c3f773 Mon Sep 17 00:00:00 2001 From: Andrew Polunin <apolunin@productengine.com> Date: Tue, 3 Nov 2009 17:26:57 +0200 Subject: [PATCH 048/306] fixed bug EXT-1480 [BSI] Cannot give invenotry offers by dragging an item to profile on the sidebar --HG-- branch : product-engine --- indra/newview/llpanelprofileview.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h index b59d1d42f31..45c2fc116e7 100644 --- a/indra/newview/llpanelprofileview.h +++ b/indra/newview/llpanelprofileview.h @@ -36,6 +36,8 @@ #include "llpanel.h" #include "llpanelprofile.h" #include "llavatarpropertiesprocessor.h" +#include "llagent.h" +#include "lltooldraganddrop.h" class LLPanelProfile; class LLPanelProfileTab; @@ -64,6 +66,18 @@ class LLPanelProfileView : public LLPanelProfile /*virtual*/ void togglePanel(LLPanel* panel); + BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, + BOOL drop, EDragAndDropType cargo_type, + void *cargo_data, EAcceptance *accept, + std::string& tooltip_msg) + { + LLToolDragAndDrop::handleGiveDragAndDrop(getAvatarId(), gAgent.getSessionID(), drop, + cargo_type, cargo_data, accept); + + return TRUE; + } + + protected: void onBackBtnClick(); -- GitLab From f1d834c50d7155102a6482e1c4e4205ddca65be2 Mon Sep 17 00:00:00 2001 From: Yuri Chebotarev <ychebotarev@productengine.com> Date: Tue, 3 Nov 2009 17:31:26 +0200 Subject: [PATCH 049/306] fix for normal task EXT-239 Save chat window state and position between sessions --HG-- branch : product-engine --- indra/llui/llfloater.cpp | 6 ++++++ indra/llui/llfloater.h | 3 +++ indra/llui/llfloaterreg.cpp | 3 +-- indra/newview/llnearbychat.cpp | 37 +++++++++++++++++++++++++--------- indra/newview/llnearbychat.h | 7 +++---- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 8c72b079eee..99aebbcb308 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -772,6 +772,12 @@ LLMultiFloater* LLFloater::getHost() return (LLMultiFloater*)mHostHandle.get(); } +void LLFloater::applySavedVariables() +{ + applyRectControl(); + applyDockState(); +} + void LLFloater::applyRectControl() { if (mRectControl.size() > 1) diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index ef0d06a58ea..95c8dd84f65 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -280,6 +280,9 @@ friend class LLMultiFloater; protected: void setRectControl(const std::string& rectname) { mRectControl = rectname; }; + + virtual void applySavedVariables(); + void applyRectControl(); void applyDockState(); void storeRectControl(); diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index aca4dc56eed..f8e07913fbf 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -134,8 +134,7 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key) // Note: key should eventually be a non optional LLFloater arg; for now, set mKey to be safe res->mKey = key; res->setInstanceName(name); - res->applyRectControl(); // Can't apply rect control until setting instance name - res->applyDockState();//same... + res->applySavedVariables(); // Can't apply rect and dock state until setting instance name if (res->mAutoTile && !res->getHost() && index > 0) { const LLRect& cur_rect = res->getRect(); diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 12638ab8551..81d033d7f98 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -97,14 +97,39 @@ BOOL LLNearbyChat::postBuild() if (getDockControl() == NULL) { setDockControl(new LLDockControl( - LLBottomTray::getInstance()->getNearbyChatBar(), this, - getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1))); + LLBottomTray::getInstance()->getNearbyChatBar(), this, + getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1))); } return true; } +void LLNearbyChat::applySavedVariables() +{ + + if (mRectControl.size() > 1) + { + const LLRect& rect = LLUI::sSettingGroups["floater"]->getRect(mRectControl); + reshape(rect.getWidth(), rect.getHeight()); + setRect(rect); + } + + + if(!LLUI::sSettingGroups["floater"]->controlExists(mDocStateControl)) + { + setDocked(true); + } + else + { + if (mDocStateControl.size() > 1) + { + bool dockState = LLUI::sSettingGroups["floater"]->getBOOL(mDocStateControl); + setDocked(dockState); + } + } +} + LLColor4 nearbychat_get_text_color(const LLChat& chat) { LLColor4 text_color; @@ -265,11 +290,5 @@ void LLNearbyChat::getAllowedRect(LLRect& rect) { rect = gViewerWindow->getWorldViewRect(); } -void LLNearbyChat::setVisible (BOOL visible) -{ - LLDockableFloater::setVisible(visible); -} -void LLNearbyChat::toggleWindow() -{ -} + diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 20cbf7537d6..cb4654654a9 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -52,16 +52,15 @@ class LLNearbyChat: public LLDockableFloater void onNearbyChatContextMenuItemClicked(const LLSD& userdata); bool onNearbyChatCheckContextMenuItem(const LLSD& userdata); - void setDocked (bool docked, bool pop_on_undock); - void toggleWindow (); + void setDocked (bool docked, bool pop_on_undock = true); /*virtual*/ void onOpen (const LLSD& key); - virtual void setVisible (BOOL visible); - virtual void setRect (const LLRect &rect); private: + virtual void applySavedVariables(); + void getAllowedRect (LLRect& rect); void onNearbySpeakers (); -- GitLab From 3483f9e0d04f7a956921b9ac60e85b4371f97322 Mon Sep 17 00:00:00 2001 From: Mike Antipov <mantipov@productengine.com> Date: Tue, 3 Nov 2009 17:40:26 +0200 Subject: [PATCH 050/306] Fixed major bug EXT-2098 (Unable to delete landmarks) The reason of this bug is that moved (removed to trash) Inventory Item exists in Panel which has no Trash folder in View hierarchy (Favorites & Landmarks accordions). I have updated LLInventoryPanel::modelChanged for case Inventory structure is changed: - added condition to verify if moved item is in Inventory Panel having content of some Inventory Folder and is not moved into the same folder. In this case appropriate View is removed from the Panel hierarchy. --HG-- branch : product-engine --- indra/newview/llfloaterinventory.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp index a47916b7d7b..274c2234de3 100644 --- a/indra/newview/llfloaterinventory.cpp +++ b/indra/newview/llfloaterinventory.cpp @@ -1447,6 +1447,19 @@ void LLInventoryPanel::modelChanged(U32 mask) view_item->getParentFolder()->extractItem(view_item); view_item->addToFolder(new_parent, mFolders); } +/* + on the other side in case Inventory Panel has content of the any folder + it is possible that item moved to some folder which is absent in current + Panel. For ex. removing item (via moving to trash). + In this case we need to check if new parent is other then inventory start folder + and simply remove its View from the hierarchy. + See details in EXT-2098. +*/ + // So, let check if item was moved into folder out of this Inventory Panel. + else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID) + { + view_item->getParentFolder()->extractItem(view_item); + } } } else -- GitLab From 5ea6474aebb7f81ce797de1449863bac1543fb03 Mon Sep 17 00:00:00 2001 From: Eugene Mutavchi <emutavchi@productengine.com> Date: Tue, 3 Nov 2009 17:47:20 +0200 Subject: [PATCH 051/306] Implemented low task EXT-1787 (Implement sorting of participant list) --HG-- branch : product-engine --- indra/newview/llpanelimcontrolpanel.cpp | 14 ++++ indra/newview/llpanelimcontrolpanel.h | 1 + indra/newview/llparticipantlist.cpp | 96 +++++++++++++++++-------- indra/newview/llparticipantlist.h | 56 +++++++++++---- 4 files changed, 121 insertions(+), 46 deletions(-) diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index b5e0cdccc0c..21e88b6d07c 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -199,6 +199,20 @@ void LLPanelGroupControlPanel::onGroupInfoButtonClicked() LLGroupActions::show(mGroupID); } +void LLPanelGroupControlPanel::onSortMenuItemClicked(const LLSD& userdata) +{ + // TODO: Check this code when when sort order menu will be added. (EM) + if (false && !mParticipantList) + return; + + std::string chosen_item = userdata.asString(); + + if (chosen_item == "sort_name") + { + mParticipantList->setSortOrder(LLParticipantList::E_SORT_BY_NAME); + } + +} void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id) { diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index b60ddc1d8d8..fa101f42803 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -99,6 +99,7 @@ class LLPanelGroupControlPanel : public LLPanelChatControlPanel private: void onGroupInfoButtonClicked(); + void onSortMenuItemClicked(const LLSD& userdata); }; class LLPanelAdHocControlPanel : public LLPanelGroupControlPanel diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 133f13aab84..9450bee3153 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -44,15 +44,15 @@ //LLParticipantList retrieves add, clear and remove events and updates view accordingly LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list): mSpeakerMgr(data_source), - mAvatarList(avatar_list) + mAvatarList(avatar_list), + mSpeakerAddListener(*this), + mSpeakerRemoveListener(*this), + mSpeakerClearListener(*this), + mSortOrder(E_SORT_BY_NAME) { - mSpeakerAddListener = new SpeakerAddListener(mAvatarList); - mSpeakerRemoveListener = new SpeakerRemoveListener(mAvatarList); - mSpeakerClearListener = new SpeakerClearListener(mAvatarList); - - mSpeakerMgr->addListener(mSpeakerAddListener, "add"); - mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove"); - mSpeakerMgr->addListener(mSpeakerClearListener, "clear"); + mSpeakerMgr->addListener(&mSpeakerAddListener, "add"); + mSpeakerMgr->addListener(&mSpeakerRemoveListener, "remove"); + mSpeakerMgr->addListener(&mSpeakerClearListener, "clear"); mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); @@ -66,8 +66,11 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av { group_members.push_back((*it)->mID); } - mAvatarList->setDirty(); - mAvatarList->sortByName(); + sort(); +} + +LLParticipantList::~LLParticipantList() +{ } void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list) @@ -80,20 +83,16 @@ void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list) LLAvatarActions::startIM(clicked_id); } -LLParticipantList::~LLParticipantList() +void LLParticipantList::setSortOrder(EParticipantSortOrder order) { - delete mSpeakerAddListener; - delete mSpeakerRemoveListener; - delete mSpeakerClearListener; - mSpeakerAddListener = NULL; - mSpeakerRemoveListener = NULL; - mSpeakerClearListener = NULL; + if ( mSortOrder != order ) + { + mSortOrder = order; + sort(); + } } -// -// LLParticipantList::SpeakerAddListener -// -bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); LLUUID uu_id = event->getValue().asUUID(); @@ -106,15 +105,11 @@ bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::L } group_members.push_back(uu_id); - mAvatarList->setDirty(); - mAvatarList->sortByName(); + sort(); return true; } -// -// LLParticipantList::SpeakerRemoveListener -// -bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); LLAvatarList::uuid_vector_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID()); @@ -126,10 +121,7 @@ bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents return true; } -// -// LLParticipantList::SpeakerClearListener -// -bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); group_members.clear(); @@ -137,3 +129,45 @@ bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents: return true; } +void LLParticipantList::sort() +{ + if ( !mAvatarList ) + return; + + // Mark AvatarList as dirty one + mAvatarList->setDirty(); + + // TODO: Implement more sorting orders after specs updating (EM) + switch ( mSortOrder ) { + case E_SORT_BY_NAME : + mAvatarList->sortByName(); + break; + default : + llwarns << "Unrecognized sort order for " << mAvatarList->getName() << llendl; + return; + } +} + +// +// LLParticipantList::SpeakerAddListener +// +bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ + return mParent.onAddItemEvent(event, userdata); +} + +// +// LLParticipantList::SpeakerRemoveListener +// +bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ + return mParent.onRemoveItemEvent(event, userdata); +} + +// +// LLParticipantList::SpeakerClearListener +// +bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ + return mParent.onClearListEvent(event, userdata); +} diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index a3a55303c01..04d9e292568 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -38,48 +38,74 @@ class LLAvatarList; class LLParticipantList { + LOG_CLASS(LLParticipantList); public: LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list); ~LLParticipantList(); + typedef enum e_participant_sort_oder { + E_SORT_BY_NAME = 0, + } EParticipantSortOrder; + + /** + * Set and sort Avatarlist by given order + */ + void setSortOrder(EParticipantSortOrder order = E_SORT_BY_NAME); + protected: + /** + * LLSpeakerMgr event handlers + */ + bool onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + bool onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + bool onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + + /** + * Sorts the Avatarlist by stored order + */ + void sort(); //List of listeners implementing LLOldEvents::LLSimpleListener. //There is no way to handle all the events in one listener as LLSpeakerMgr registers listeners in such a way //that one listener can handle only one type of event - class SpeakerAddListener : public LLOldEvents::LLSimpleListener + class BaseSpeakerListner : public LLOldEvents::LLSimpleListener { public: - SpeakerAddListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {} + BaseSpeakerListner(LLParticipantList& parent) : mParent(parent) {} + protected: + LLParticipantList& mParent; + }; + class SpeakerAddListener : public BaseSpeakerListner + { + public: + SpeakerAddListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - LLAvatarList* mAvatarList; }; - class SpeakerRemoveListener : public LLOldEvents::LLSimpleListener + class SpeakerRemoveListener : public BaseSpeakerListner { public: - SpeakerRemoveListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {} - + SpeakerRemoveListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - LLAvatarList* mAvatarList; }; - class SpeakerClearListener : public LLOldEvents::LLSimpleListener + class SpeakerClearListener : public BaseSpeakerListner { public: - SpeakerClearListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {} - + SpeakerClearListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - LLAvatarList* mAvatarList; }; + private: void onAvatarListDoubleClicked(LLAvatarList* list); LLSpeakerMgr* mSpeakerMgr; - LLAvatarList* mAvatarList; + LLAvatarList* mAvatarList; + + SpeakerAddListener mSpeakerAddListener; + SpeakerRemoveListener mSpeakerRemoveListener; + SpeakerClearListener mSpeakerClearListener; - SpeakerAddListener* mSpeakerAddListener; - SpeakerRemoveListener* mSpeakerRemoveListener; - SpeakerClearListener* mSpeakerClearListener; + EParticipantSortOrder mSortOrder; }; -- GitLab From 4d88830a0ce6d097c02b743ad32be01ec31f99f0 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Tue, 3 Nov 2009 16:30:22 +0000 Subject: [PATCH 052/306] trivial whitespace change #2 --- indra/llwindow/llwindowsdl.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 1df2b5eba84..cfc078ba897 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -33,6 +33,8 @@ #if LL_SDL +// 2 + #include "linden_common.h" #include "llwindowsdl.h" -- GitLab From 3c59a22bcfd7f676d119306b976a96621ee9b205 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Tue, 3 Nov 2009 16:30:40 +0000 Subject: [PATCH 053/306] trivial whitespace change #1 --- indra/llwindow/llwindowsdl.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 1df2b5eba84..d57f9536569 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -31,6 +31,11 @@ * $/LicenseInfo$ */ +// 1 + + + + #if LL_SDL #include "linden_common.h" -- GitLab From d37dcfd340777497538fafb7b2513f46cbfe14c1 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Tue, 3 Nov 2009 16:31:04 +0000 Subject: [PATCH 054/306] trivial comment change #3 --- indra/llwindow/llwindowsdl.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index d57f9536569..aee161bd1d8 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -40,6 +40,8 @@ #include "linden_common.h" +// 3 + #include "llwindowsdl.h" #include "llwindowcallbacks.h" -- GitLab From fb8fa98367326141cee45fd2cfcc66f133d0ff77 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Tue, 3 Nov 2009 16:37:43 +0000 Subject: [PATCH 055/306] Backed out changeset ba150ce614d0 --- indra/llwindow/llwindowsdl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 1df2b5eba84..9f03c8f6956 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -59,7 +59,7 @@ extern "C" { #if LL_LINUX || LL_SOLARIS // not necessarily available on random SDL platforms, so #if LL_LINUX -// for execv(), waitpid(), fork() +// for execv(), waitpid(), fork() # include <unistd.h> # include <sys/types.h> # include <sys/wait.h> -- GitLab From ad5f5299fb9ca858372e3d33c2fa8b28d9c164ac Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Tue, 3 Nov 2009 16:37:57 +0000 Subject: [PATCH 056/306] Backed out changeset 776703433218 --- indra/llwindow/llwindowsdl.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index d57f9536569..1df2b5eba84 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -31,11 +31,6 @@ * $/LicenseInfo$ */ -// 1 - - - - #if LL_SDL #include "linden_common.h" -- GitLab From 29135c8154e31591af1825beb58c37f4966339af Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Tue, 3 Nov 2009 16:38:06 +0000 Subject: [PATCH 057/306] Backed out changeset 30592b61e452 --- indra/llwindow/llwindowsdl.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index aee161bd1d8..d57f9536569 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -40,8 +40,6 @@ #include "linden_common.h" -// 3 - #include "llwindowsdl.h" #include "llwindowcallbacks.h" -- GitLab From 27257fa210626527a6b0febfa61f141e55d2d813 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Tue, 3 Nov 2009 16:38:20 +0000 Subject: [PATCH 058/306] Backed out changeset 8bb55c0994a2 --- indra/llwindow/llwindowsdl.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index cfc078ba897..1df2b5eba84 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -33,8 +33,6 @@ #if LL_SDL -// 2 - #include "linden_common.h" #include "llwindowsdl.h" -- GitLab From 3cb64a8fdf5d7c973bcd28a80c9bb3ddcd3dcd30 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Tue, 3 Nov 2009 16:39:53 +0000 Subject: [PATCH 059/306] Backed out changeset 8d2ba8bb62a5 --- indra/llwindow/llwindowsdl.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 145785ad694..cfc078ba897 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -31,19 +31,12 @@ * $/LicenseInfo$ */ -// 1 - - - - #if LL_SDL // 2 #include "linden_common.h" -// 3 - #include "llwindowsdl.h" #include "llwindowcallbacks.h" -- GitLab From 22e6c3f952428750e68d08ed8788be37f20498a1 Mon Sep 17 00:00:00 2001 From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com> Date: Tue, 3 Nov 2009 11:45:54 -0500 Subject: [PATCH 060/306] Added .DS_Store to .hgignore and removed the checked in version from the repos. It's an OSX image cache file that was accidentally added to the repos. -Reviewed by brad. --- .hgignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.hgignore b/.hgignore index 454be00dbff..cff2a14b940 100644 --- a/.hgignore +++ b/.hgignore @@ -7,6 +7,8 @@ syntax: glob # Emacs temp files *~ .*.swp +#OSX image cache file +*.DS_Store LICENSES indra/.distcc indra/build-darwin-* -- GitLab From ed40da679530329fce0e7505dc90a898a10d7d86 Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk <slitovchuk@productengine.com> Date: Tue, 3 Nov 2009 19:13:36 +0200 Subject: [PATCH 061/306] Implemented sub-task EXT-1452 '"places" title should not be on this panel': - Made LLPlaceInfo a base class for two derived LLPlaceProfile and LLLandmarkInfo classes each representing a separate panel with its own XUI layout. - Fixed broken title change for Place Profile and Landmark cases. --HG-- branch : product-engine --- indra/newview/CMakeLists.txt | 4 + indra/newview/llpanellandmarkinfo.cpp | 437 ++++++++ indra/newview/llpanellandmarkinfo.h | 85 ++ indra/newview/llpanelplaceinfo.cpp | 931 +---------------- indra/newview/llpanelplaceinfo.h | 146 +-- indra/newview/llpanelplaceprofile.cpp | 541 ++++++++++ indra/newview/llpanelplaceprofile.h | 114 ++ indra/newview/llpanelplaces.cpp | 227 ++-- indra/newview/llpanelplaces.h | 11 +- indra/newview/llviewermessage.cpp | 6 +- .../default/xui/en/panel_landmark_info.xml | 257 +++++ .../default/xui/en/panel_place_profile.xml | 979 ++++++++++++++++++ .../skins/default/xui/en/panel_places.xml | 18 +- 13 files changed, 2647 insertions(+), 1109 deletions(-) create mode 100644 indra/newview/llpanellandmarkinfo.cpp create mode 100644 indra/newview/llpanellandmarkinfo.h create mode 100644 indra/newview/llpanelplaceprofile.cpp create mode 100644 indra/newview/llpanelplaceprofile.h create mode 100644 indra/newview/skins/default/xui/en/panel_landmark_info.xml create mode 100644 indra/newview/skins/default/xui/en/panel_place_profile.xml diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 0133d2222d9..be736c57c87 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -316,6 +316,7 @@ set(viewer_SOURCE_FILES llpanelinventory.cpp llpanelland.cpp llpanellandaudio.cpp + llpanellandmarkinfo.cpp llpanellandmarks.cpp llpanellandmedia.cpp llpanellogin.cpp @@ -334,6 +335,7 @@ set(viewer_SOURCE_FILES llpanelpicks.cpp llpanelplace.cpp llpanelplaceinfo.cpp + llpanelplaceprofile.cpp llpanelplaces.cpp llpanelplacestab.cpp llpanelprimmediacontrols.cpp @@ -794,6 +796,7 @@ set(viewer_HEADER_FILES llpanelinventory.h llpanelland.h llpanellandaudio.h + llpanellandmarkinfo.h llpanellandmarks.h llpanellandmedia.h llpanellogin.h @@ -812,6 +815,7 @@ set(viewer_HEADER_FILES llpanelpicks.h llpanelplace.h llpanelplaceinfo.h + llpanelplaceprofile.h llpanelplaces.h llpanelplacestab.h llpanelprimmediacontrols.h diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp new file mode 100644 index 00000000000..1152ca68736 --- /dev/null +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -0,0 +1,437 @@ +/** + * @file llpanellandmarkinfo.cpp + * @brief Displays landmark info in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpanellandmarkinfo.h" + +#include "llinventory.h" + +#include "llcombobox.h" +#include "lllineeditor.h" +#include "lltextbox.h" +#include "lltexteditor.h" +#include "lltrans.h" + +#include "llagent.h" +#include "llagentui.h" +#include "llinventorymodel.h" +#include "lllandmarkactions.h" +#include "llviewerinventory.h" +#include "llviewerparcelmgr.h" +#include "llviewerregion.h" + +//---------------------------------------------------------------------------- +// Aux types and methods +//---------------------------------------------------------------------------- + +typedef std::pair<LLUUID, std::string> folder_pair_t; + +static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right); +static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats); + +static LLRegisterPanelClassWrapper<LLPanelLandmarkInfo> t_landmark_info("panel_landmark_info"); + +LLPanelLandmarkInfo::LLPanelLandmarkInfo() +: LLPanelPlaceInfo() +{} + +// virtual +LLPanelLandmarkInfo::~LLPanelLandmarkInfo() +{} + +// virtual +BOOL LLPanelLandmarkInfo::postBuild() +{ + LLPanelPlaceInfo::postBuild(); + + mOwner = getChild<LLTextBox>("owner"); + mCreator = getChild<LLTextBox>("creator"); + mCreated = getChild<LLTextBox>("created"); + + mTitleEditor = getChild<LLLineEditor>("title_editor"); + mNotesEditor = getChild<LLTextEditor>("notes_editor"); + mFolderCombo = getChild<LLComboBox>("folder_combo"); + + return TRUE; +} + +// virtual +void LLPanelLandmarkInfo::resetLocation() +{ + LLPanelPlaceInfo::resetLocation(); + + std::string not_available = getString("not_available"); + mCreator->setText(not_available); + mOwner->setText(not_available); + mCreated->setText(not_available); + mTitleEditor->setText(LLStringUtil::null); + mNotesEditor->setText(LLStringUtil::null); +} + +// virtual +void LLPanelLandmarkInfo::setInfoType(INFO_TYPE type) +{ + LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel"); + + bool is_info_type_create_landmark = type == CREATE_LANDMARK; + bool is_info_type_landmark = type == LANDMARK; + + landmark_info_panel->setVisible(is_info_type_landmark); + + getChild<LLTextBox>("folder_label")->setVisible(is_info_type_create_landmark); + mFolderCombo->setVisible(is_info_type_create_landmark); + + switch(type) + { + case CREATE_LANDMARK: + mCurrentTitle = getString("title_create_landmark"); + + mTitleEditor->setEnabled(TRUE); + mNotesEditor->setEnabled(TRUE); + break; + + case LANDMARK: + default: + mCurrentTitle = getString("title_landmark"); + + mTitleEditor->setEnabled(FALSE); + mNotesEditor->setEnabled(FALSE); + break; + } + + populateFoldersList(); + + LLPanelPlaceInfo::setInfoType(type); +} + +// virtual +void LLPanelLandmarkInfo::processParcelInfo(const LLParcelData& parcel_data) +{ + LLPanelPlaceInfo::processParcelInfo(parcel_data); + + // HACK: Flag 0x2 == adult region, + // Flag 0x1 == mature region, otherwise assume PG + std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG); + if (parcel_data.flags & 0x2) + { + rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT); + } + else if (parcel_data.flags & 0x1) + { + rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); + } + + mMaturityRatingText->setValue(rating); + + S32 region_x; + S32 region_y; + S32 region_z; + + // If the region position is zero, grab position from the global + if(mPosRegion.isExactlyZero()) + { + region_x = llround(parcel_data.global_x) % REGION_WIDTH_UNITS; + region_y = llround(parcel_data.global_y) % REGION_WIDTH_UNITS; + region_z = llround(parcel_data.global_z); + } + else + { + region_x = llround(mPosRegion.mV[VX]); + region_y = llround(mPosRegion.mV[VY]); + region_z = llround(mPosRegion.mV[VZ]); + } + + if (mInfoType == CREATE_LANDMARK) + { + if (parcel_data.name.empty()) + { + mTitleEditor->setText(llformat("%s (%d, %d, %d)", + parcel_data.sim_name.c_str(), region_x, region_y, region_z)); + } + else + { + mTitleEditor->setText(parcel_data.name); + } + + std::string desc; + LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, gAgent.getPositionAgent()); + mNotesEditor->setText(desc); + + if (!LLLandmarkActions::landmarkAlreadyExists()) + { + createLandmark(mFolderCombo->getValue().asUUID()); + } + } +} + +void LLPanelLandmarkInfo::displayItemInfo(const LLInventoryItem* pItem) +{ + if (!pItem) + return; + + if(!gCacheName) + return; + + const LLPermissions& perm = pItem->getPermissions(); + + ////////////////// + // CREATOR NAME // + ////////////////// + if (pItem->getCreatorUUID().notNull()) + { + std::string name; + LLUUID creator_id = pItem->getCreatorUUID(); + if (!gCacheName->getFullName(creator_id, name)) + { + gCacheName->get(creator_id, FALSE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mCreator, _2, _3)); + } + mCreator->setText(name); + } + else + { + mCreator->setText(getString("unknown")); + } + + //////////////// + // OWNER NAME // + //////////////// + if(perm.isOwned()) + { + std::string name; + if (perm.isGroupOwned()) + { + LLUUID group_id = perm.getGroup(); + if (!gCacheName->getGroupName(group_id, name)) + { + gCacheName->get(group_id, TRUE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mOwner, _2, _3)); + } + } + else + { + LLUUID owner_id = perm.getOwner(); + if (!gCacheName->getFullName(owner_id, name)) + { + gCacheName->get(owner_id, FALSE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mOwner, _2, _3)); + } + } + mOwner->setText(name); + } + else + { + mOwner->setText(getString("public")); + } + + ////////////////// + // ACQUIRE DATE // + ////////////////// + time_t time_utc = pItem->getCreationDate(); + if (0 == time_utc) + { + mCreated->setText(getString("unknown")); + } + else + { + std::string timeStr = getString("acquired_date"); + LLSD substitution; + substitution["datetime"] = (S32) time_utc; + LLStringUtil::format (timeStr, substitution); + mCreated->setText(timeStr); + } + + mTitleEditor->setText(pItem->getName()); + mNotesEditor->setText(pItem->getDescription()); +} + +void LLPanelLandmarkInfo::toggleLandmarkEditMode(BOOL enabled) +{ + // If switching to edit mode while creating landmark + // the "Create Landmark" title remains. + if (enabled && mInfoType != CREATE_LANDMARK) + { + mTitle->setText(getString("title_edit_landmark")); + } + else + { + mTitle->setText(mCurrentTitle); + } + + if (mNotesEditor->getReadOnly() == (enabled == TRUE)) + { + mTitleEditor->setEnabled(enabled); + mNotesEditor->setReadOnly(!enabled); + mFolderCombo->setVisible(enabled); + getChild<LLTextBox>("folder_label")->setVisible(enabled); + + // HACK: To change the text color in a text editor + // when it was enabled/disabled we set the text once again. + mNotesEditor->setText(mNotesEditor->getText()); + } +} + +const std::string& LLPanelLandmarkInfo::getLandmarkTitle() const +{ + return mTitleEditor->getText(); +} + +const std::string LLPanelLandmarkInfo::getLandmarkNotes() const +{ + return mNotesEditor->getText(); +} + +const LLUUID LLPanelLandmarkInfo::getLandmarkFolder() const +{ + return mFolderCombo->getValue().asUUID(); +} + +BOOL LLPanelLandmarkInfo::setLandmarkFolder(const LLUUID& id) +{ + return mFolderCombo->setCurrentByID(id); +} + +void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id) +{ + std::string name = mTitleEditor->getText(); + std::string desc = mNotesEditor->getText(); + + LLStringUtil::trim(name); + LLStringUtil::trim(desc); + + // If typed name is empty use the parcel name instead. + if (name.empty()) + { + name = mParcelName->getText(); + + // If no parcel exists use the region name instead. + if (name.empty()) + { + name = mRegionName->getText(); + } + } + + LLStringUtil::replaceChar(desc, '\n', ' '); + // If no folder chosen use the "Landmarks" folder. + LLLandmarkActions::createLandmarkHere(name, desc, + folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK)); +} + +// static +std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCategory* cat) +{ + std::string name = cat->getName(); + LLUUID parent_id; + + // translate category name, if it's right below the root + // FIXME: it can throw notification about non existent string in strings.xml + if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID()) + { + LLTrans::findString(name, "InvFolder " + name); + } + + // we don't want "My Inventory" to appear in the name + while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID()) + { + cat = gInventory.getCategory(parent_id); + name = cat->getName() + "/" + name; + } + + return name; +} + +void LLPanelLandmarkInfo::populateFoldersList() +{ + // Collect all folders that can contain landmarks. + LLInventoryModel::cat_array_t cats; + collectLandmarkFolders(cats); + + mFolderCombo->removeall(); + + // Put the "Landmarks" folder first in list. + LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id); + if (!cat) + { + llwarns << "Cannot find the landmarks folder" << llendl; + } + std::string cat_full_name = getFullFolderName(cat); + mFolderCombo->add(cat_full_name, cat->getUUID()); + + typedef std::vector<folder_pair_t> folder_vec_t; + folder_vec_t folders; + // Sort the folders by their full name. + for (S32 i = 0; i < cats.count(); i++) + { + cat = cats.get(i); + cat_full_name = getFullFolderName(cat); + folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name)); + } + sort(folders.begin(), folders.end(), cmp_folders); + + // Finally, populate the combobox. + for (folder_vec_t::const_iterator it = folders.begin(); it != folders.end(); it++) + mFolderCombo->add(it->second, LLSD(it->first)); +} + +static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right) +{ + return left.second < right.second; +} + +static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats) +{ + LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + + // Add descendent folders of the "Landmarks" category. + LLInventoryModel::item_array_t items; // unused + LLIsType is_category(LLAssetType::AT_CATEGORY); + gInventory.collectDescendentsIf( + landmarks_id, + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + is_category); + + // Add the "My Favorites" category. + LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id); + if (!favorites_cat) + { + llwarns << "Cannot find the favorites folder" << llendl; + } + else + { + cats.put(favorites_cat); + } +} diff --git a/indra/newview/llpanellandmarkinfo.h b/indra/newview/llpanellandmarkinfo.h new file mode 100644 index 00000000000..03377986b31 --- /dev/null +++ b/indra/newview/llpanellandmarkinfo.h @@ -0,0 +1,85 @@ +/** + * @file llpanellandmarkinfo.h + * @brief Displays landmark info in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELLANDMARKINFO_H +#define LL_LLPANELLANDMARKINFO_H + +#include "llpanelplaceinfo.h" + +class LLComboBox; +class LLLineEditor; +class LLTextEditor; + +class LLPanelLandmarkInfo : public LLPanelPlaceInfo +{ +public: + LLPanelLandmarkInfo(); + /*virtual*/ ~LLPanelLandmarkInfo(); + + /*virtual*/ BOOL postBuild(); + + /*virtual*/ void resetLocation(); + + /*virtual*/ void setInfoType(INFO_TYPE type); + + /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); + + // Displays landmark owner, creator and creation date info. + void displayItemInfo(const LLInventoryItem* pItem); + + void toggleLandmarkEditMode(BOOL enabled); + + const std::string& getLandmarkTitle() const; + const std::string getLandmarkNotes() const; + const LLUUID getLandmarkFolder() const; + + // Select current landmark folder in combobox. + BOOL setLandmarkFolder(const LLUUID& id); + + // Create a landmark for the current location + // in a folder specified by folder_id. + void createLandmark(const LLUUID& folder_id); + + static std::string getFullFolderName(const LLViewerInventoryCategory* cat); + +private: + void populateFoldersList(); + + LLTextBox* mOwner; + LLTextBox* mCreator; + LLTextBox* mCreated; + LLLineEditor* mTitleEditor; + LLTextEditor* mNotesEditor; + LLComboBox* mFolderCombo; +}; + +#endif // LL_LLPANELLANDMARKINFO_H diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index 34644cfe42d..2c5f4b5afaa 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -1,6 +1,6 @@ /** * @file llpanelplaceinfo.cpp - * @brief Displays place information in Side Tray. + * @brief Base class for place information in Side Tray. * * $LicenseInfo:firstyear=2009&license=viewergpl$ * @@ -39,66 +39,34 @@ #include "llsecondlifeurls.h" #include "llinventory.h" -#include "llparcel.h" -#include "llqueryflags.h" +#include "llsdutil_math.h" -#include "llbutton.h" -#include "llcombobox.h" -#include "lliconctrl.h" #include "llscrollcontainer.h" #include "lltextbox.h" -#include "lltrans.h" -#include "llaccordionctrl.h" -#include "llaccordionctrltab.h" #include "llagent.h" -#include "llagentui.h" -#include "llappviewer.h" #include "llavatarpropertiesprocessor.h" -#include "llcallbacklist.h" #include "llexpandabletextbox.h" #include "llfloaterworldmap.h" -#include "llfloaterbuycurrency.h" #include "llinventorymodel.h" -#include "lllandmarkactions.h" #include "llpanelpick.h" #include "lltexturectrl.h" -#include "llstatusbar.h" #include "llviewerinventory.h" #include "llviewerparcelmgr.h" #include "llviewerregion.h" -#include "llviewercontrol.h" #include "llviewertexteditor.h" #include "llworldmap.h" -#include "llsdutil_math.h" - -//---------------------------------------------------------------------------- -// Aux types and methods -//---------------------------------------------------------------------------- - -typedef std::pair<LLUUID, std::string> folder_pair_t; - -static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right); -static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats); - -static LLRegisterPanelClassWrapper<LLPanelPlaceInfo> t_place_info("panel_place_info"); LLPanelPlaceInfo::LLPanelPlaceInfo() : LLPanel(), mParcelID(), mRequestedID(), mPosRegion(), - mLandmarkID(), - mMinHeight(0), - mScrollingPanel(NULL), - mInfoPanel(NULL), - mMediaPanel(NULL), - mForSalePanel(NULL), - mYouAreHerePanel(NULL), - mSelectedParcelID(-1) + mMinHeight(0) {} +//virtual LLPanelPlaceInfo::~LLPanelPlaceInfo() { if (mParcelID.notNull()) @@ -107,220 +75,41 @@ LLPanelPlaceInfo::~LLPanelPlaceInfo() } } +//virtual BOOL LLPanelPlaceInfo::postBuild() { - mTitle = getChild<LLTextBox>("panel_title"); + mTitle = getChild<LLTextBox>("title"); mCurrentTitle = mTitle->getText(); - mForSalePanel = getChild<LLPanel>("for_sale_panel"); - mYouAreHerePanel = getChild<LLPanel>("here_panel"); - gIdleCallbacks.addFunction(&LLPanelPlaceInfo::updateYouAreHereBanner, this); - - //Icon value should contain sale price of last selected parcel. - mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")-> - setMouseDownCallback(boost::bind(&LLPanelPlaceInfo::onForSaleBannerClick, this)); - mSnapshotCtrl = getChild<LLTextureCtrl>("logo"); mRegionName = getChild<LLTextBox>("region_title"); mParcelName = getChild<LLTextBox>("parcel_title"); mDescEditor = getChild<LLExpandableTextBox>("description"); mMaturityRatingText = getChild<LLTextBox>("maturity_value"); - mParcelOwner = getChild<LLTextBox>("owner_value"); - mLastVisited = getChild<LLTextBox>("last_visited_value"); - - mRatingText = getChild<LLTextBox>("rating_value"); - mVoiceText = getChild<LLTextBox>("voice_value"); - mFlyText = getChild<LLTextBox>("fly_value"); - mPushText = getChild<LLTextBox>("push_value"); - mBuildText = getChild<LLTextBox>("build_value"); - mScriptsText = getChild<LLTextBox>("scripts_value"); - mDamageText = getChild<LLTextBox>("damage_value"); - - mRegionNameText = getChild<LLTextBox>("region_name"); - mRegionTypeText = getChild<LLTextBox>("region_type"); - mRegionRatingText = getChild<LLTextBox>("region_rating"); - mRegionOwnerText = getChild<LLTextBox>("region_owner"); - mRegionGroupText = getChild<LLTextBox>("region_group"); - - mEstateNameText = getChild<LLTextBox>("estate_name"); - mEstateRatingText = getChild<LLTextBox>("estate_rating"); - mEstateOwnerText = getChild<LLTextBox>("estate_owner"); - mCovenantText = getChild<LLTextEditor>("covenant"); - - mSalesPriceText = getChild<LLTextBox>("sales_price"); - mAreaText = getChild<LLTextBox>("area"); - mTrafficText = getChild<LLTextBox>("traffic"); - mPrimitivesText = getChild<LLTextBox>("primitives"); - mParcelScriptsText = getChild<LLTextBox>("parcel_scripts"); - mTerraformLimitsText = getChild<LLTextBox>("terraform_limits"); - mSubdivideText = getChild<LLTextEditor>("subdivide"); - mResaleText = getChild<LLTextEditor>("resale"); - mSaleToText = getChild<LLTextBox>("sale_to"); - mOwner = getChild<LLTextBox>("owner"); - mCreator = getChild<LLTextBox>("creator"); - mCreated = getChild<LLTextBox>("created"); - - mTitleEditor = getChild<LLLineEditor>("title_editor"); - mNotesEditor = getChild<LLTextEditor>("notes_editor"); - mFolderCombo = getChild<LLComboBox>("folder_combo"); - - LLScrollContainer* scroll_container = getChild<LLScrollContainer>("scroll_container"); + LLScrollContainer* scroll_container = getChild<LLScrollContainer>("place_scroll"); scroll_container->setBorderVisible(FALSE); mMinHeight = scroll_container->getScrolledViewRect().getHeight(); - mScrollingPanel = getChild<LLPanel>("scrolling_panel"); - mInfoPanel = getChild<LLPanel>("info_panel"); - mMediaPanel = getChild<LLMediaPanel>("media_panel"); - if (!mMediaPanel) - return FALSE; - return TRUE; } -void LLPanelPlaceInfo::displayItemInfo(const LLInventoryItem* pItem) -{ - if (!pItem) - return; - - mLandmarkID = pItem->getUUID(); - - if(!gCacheName) - return; - - const LLPermissions& perm = pItem->getPermissions(); - - ////////////////// - // CREATOR NAME // - ////////////////// - if (pItem->getCreatorUUID().notNull()) - { - std::string name; - LLUUID creator_id = pItem->getCreatorUUID(); - if (!gCacheName->getFullName(creator_id, name)) - { - gCacheName->get(creator_id, FALSE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mCreator, _2, _3)); - } - mCreator->setText(name); - } - else - { - mCreator->setText(getString("unknown")); - } - - //////////////// - // OWNER NAME // - //////////////// - if(perm.isOwned()) - { - std::string name; - if (perm.isGroupOwned()) - { - LLUUID group_id = perm.getGroup(); - if (!gCacheName->getGroupName(group_id, name)) - { - gCacheName->get(group_id, TRUE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mOwner, _2, _3)); - } - } - else - { - LLUUID owner_id = perm.getOwner(); - if (!gCacheName->getFullName(owner_id, name)) - { - gCacheName->get(owner_id, FALSE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mOwner, _2, _3)); - } - } - mOwner->setText(name); - } - else - { - mOwner->setText(getString("public")); - } - - ////////////////// - // ACQUIRE DATE // - ////////////////// - time_t time_utc = pItem->getCreationDate(); - if (0 == time_utc) - { - mCreated->setText(getString("unknown")); - } - else - { - std::string timeStr = getString("acquired_date"); - LLSD substitution; - substitution["datetime"] = (S32) time_utc; - LLStringUtil::format (timeStr, substitution); - mCreated->setText(timeStr); - } - - mTitleEditor->setText(pItem->getName()); - mNotesEditor->setText(pItem->getDescription()); -} - -void LLPanelPlaceInfo::nameUpdatedCallback( - LLTextBox* text, - const std::string& first, - const std::string& last) -{ - text->setText(first + " " + last); -} - +//virtual void LLPanelPlaceInfo::resetLocation() { mParcelID.setNull(); mRequestedID.setNull(); - mLandmarkID.setNull(); mPosRegion.clearVec(); - mForSalePanel->setVisible(FALSE); - mYouAreHerePanel->setVisible(FALSE); + std::string not_available = getString("not_available"); mMaturityRatingText->setValue(not_available); - mParcelOwner->setValue(not_available); - mLastVisited->setValue(not_available); mRegionName->setText(not_available); mParcelName->setText(not_available); mDescEditor->setText(not_available); - mCreator->setText(not_available); - mOwner->setText(not_available); - mCreated->setText(not_available); - mTitleEditor->setText(LLStringUtil::null); - mNotesEditor->setText(LLStringUtil::null); + mSnapshotCtrl->setImageAssetID(LLUUID::null); mSnapshotCtrl->setFallbackImageName("default_land_picture.j2c"); - - mRatingText->setText(not_available); - mVoiceText->setText(not_available); - mFlyText->setText(not_available); - mPushText->setText(not_available); - mBuildText->setText(not_available); - mParcelScriptsText->setText(not_available); - mDamageText->setText(not_available); - - mRegionNameText->setValue(not_available); - mRegionTypeText->setValue(not_available); - mRegionRatingText->setValue(not_available); - mRegionOwnerText->setValue(not_available); - mRegionGroupText->setValue(not_available); - - mEstateNameText->setValue(not_available); - mEstateRatingText->setValue(not_available); - mEstateOwnerText->setValue(not_available); - mCovenantText->setValue(not_available); - - mSalesPriceText->setValue(not_available); - mAreaText->setValue(not_available); - mTrafficText->setValue(not_available); - mPrimitivesText->setValue(not_available); - mParcelScriptsText->setValue(not_available); - mTerraformLimitsText->setValue(not_available); - mSubdivideText->setValue(not_available); - mResaleText->setValue(not_available); - mSaleToText->setValue(not_available); } //virtual @@ -330,108 +119,55 @@ void LLPanelPlaceInfo::setParcelID(const LLUUID& parcel_id) sendParcelInfoRequest(); } +//virtual void LLPanelPlaceInfo::setInfoType(INFO_TYPE type) { - LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel"); - LLPanel* landmark_edit_panel = getChild<LLPanel>("landmark_edit_panel"); - - bool is_info_type_agent = type == AGENT; - bool is_info_type_create_landmark = type == CREATE_LANDMARK; - bool is_info_type_landmark = type == LANDMARK; - bool is_info_type_teleport_history = type == TELEPORT_HISTORY; - - getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent); - mMaturityRatingText->setVisible(!is_info_type_agent); - - getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent); - mParcelOwner->setVisible(is_info_type_agent); - - getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history); - mLastVisited->setVisible(is_info_type_teleport_history); - - landmark_info_panel->setVisible(is_info_type_landmark); - landmark_edit_panel->setVisible(is_info_type_landmark || is_info_type_create_landmark); - - getChild<LLTextBox>("folder_lable")->setVisible(is_info_type_create_landmark); - mFolderCombo->setVisible(is_info_type_create_landmark); - - getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent); - - switch(type) - { - case CREATE_LANDMARK: - mCurrentTitle = getString("title_create_landmark"); - - mTitleEditor->setEnabled(TRUE); - mNotesEditor->setEnabled(TRUE); - - populateFoldersList(); - break; - - case AGENT: - case PLACE: - mCurrentTitle = getString("title_place"); - - if (!isMediaPanelVisible()) - { - mTitle->setText(mCurrentTitle); - } - break; - - case LANDMARK: - mCurrentTitle = getString("title_landmark"); - - mTitleEditor->setEnabled(FALSE); - mNotesEditor->setEnabled(FALSE); - - populateFoldersList(); - break; - - case TELEPORT_HISTORY: - mCurrentTitle = getString("title_teleport_history"); - break; - } - - if (type != AGENT) - toggleMediaPanel(FALSE); + mTitle->setText(mCurrentTitle); mInfoType = type; } -BOOL LLPanelPlaceInfo::isMediaPanelVisible() +void LLPanelPlaceInfo::sendParcelInfoRequest() { - if (!mMediaPanel) - return FALSE; + if (mParcelID != mRequestedID) + { + LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this); + LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID); - return mMediaPanel->getVisible(); + mRequestedID = mParcelID; + } } -void LLPanelPlaceInfo::toggleMediaPanel(BOOL visible) +void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id, + const LLVector3d& pos_global) { - if (!mMediaPanel) - return; + LLViewerRegion* region = gAgent.getRegion(); + if (!region) + return; + + mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), + (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), + (F32)pos_global.mdV[VZ]); - if (visible) + LLSD body; + std::string url = region->getCapability("RemoteParcelRequest"); + if (!url.empty()) { - mTitle->setText(getString("title_media")); + body["location"] = ll_sd_from_vector3(mPosRegion); + if (!region_id.isNull()) + { + body["region_id"] = region_id; + } + if (!pos_global.isExactlyZero()) + { + U64 region_handle = to_region_handle(pos_global); + body["region_handle"] = ll_sd_from_U64(region_handle); + } + LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle())); } else { - mTitle->setText(mCurrentTitle); - } - - mInfoPanel->setVisible(!visible); - mMediaPanel->setVisible(visible); -} - -void LLPanelPlaceInfo::sendParcelInfoRequest() -{ - if (mParcelID != mRequestedID) - { - LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this); - LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID); - - mRequestedID = mParcelID; + mDescEditor->setText(getString("server_update_text")); } } @@ -473,27 +209,6 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data) mDescEditor->setText(parcel_data.desc); } - // HACK: Flag 0x2 == adult region, - // Flag 0x1 == mature region, otherwise assume PG - std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG); - if (parcel_data.flags & 0x2) - { - rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT); - } - else if (parcel_data.flags & 0x1) - { - rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); - } - - mMaturityRatingText->setValue(rating); - mRatingText->setValue(rating); - - //update for_sale banner, here we should use DFQ_FOR_SALE instead of PF_FOR_SALE - //because we deal with remote parcel response format - bool is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) && - mInfoType == AGENT ? TRUE : FALSE; - mForSalePanel->setVisible(is_for_sale); - S32 region_x; S32 region_y; S32 region_z; @@ -521,408 +236,25 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data) { mParcelName->setText(getString("not_available")); } - - if (mInfoType == CREATE_LANDMARK) - { - if (parcel_data.name.empty()) - { - mTitleEditor->setText(llformat("%s (%d, %d, %d)", - parcel_data.sim_name.c_str(), region_x, region_y, region_z)); - } - else - { - mTitleEditor->setText(parcel_data.name); - } - - // FIXME: Creating landmark works only for current agent location. - std::string desc; - LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, gAgent.getPositionAgent()); - mNotesEditor->setText(desc); - - if (!LLLandmarkActions::landmarkAlreadyExists()) - { - createLandmark(mFolderCombo->getValue().asUUID()); - } - } } -void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id, - const LLVector3d& pos_global) +// virtual +void LLPanelPlaceInfo::handleVisibilityChange(BOOL new_visibility) { - LLViewerRegion* region = gAgent.getRegion(); - if (!region) - return; - - mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), - (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), - (F32)pos_global.mdV[VZ]); - - LLSD body; - std::string url = region->getCapability("RemoteParcelRequest"); - if (!url.empty()) - { - body["location"] = ll_sd_from_vector3(mPosRegion); - if (!region_id.isNull()) - { - body["region_id"] = region_id; - } - if (!pos_global.isExactlyZero()) - { - U64 region_handle = to_region_handle(pos_global); - body["region_handle"] = ll_sd_from_U64(region_handle); - } - LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle())); - } - else - { - mDescEditor->setText(getString("server_update_text")); - } -} + LLPanel::handleVisibilityChange(new_visibility); -void LLPanelPlaceInfo::displaySelectedParcelInfo(LLParcel* parcel, - LLViewerRegion* region, - const LLVector3d& pos_global, - bool is_current_parcel) -{ - if (!region || !parcel) + LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); + if (!parcel_mgr) return; - // send EstateCovenantInfo message - LLMessageSystem *msg = gMessageSystem; - msg->newMessage("EstateCovenantRequest"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); - msg->sendReliable(region->getHost()); - - LLParcelData parcel_data; - - // HACK: Converting sim access flags to the format - // returned by remote parcel response. - switch(region->getSimAccess()) - { - case SIM_ACCESS_MATURE: - parcel_data.flags = 0x1; - break; - - case SIM_ACCESS_ADULT: - parcel_data.flags = 0x2; - break; - - default: - parcel_data.flags = 0; - } - parcel_data.desc = parcel->getDesc(); - parcel_data.name = parcel->getName(); - parcel_data.sim_name = region->getName(); - parcel_data.snapshot_id = parcel->getSnapshotID(); - mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), - (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), - (F32)pos_global.mdV[VZ]); - parcel_data.global_x = pos_global.mdV[VX]; - parcel_data.global_y = pos_global.mdV[VY]; - parcel_data.global_z = pos_global.mdV[VZ]; - - std::string on = getString("on"); - std::string off = getString("off"); - - // Processing parcel characteristics - if (parcel->getParcelFlagAllowVoice()) - { - mVoiceText->setText(on); - } - else - { - mVoiceText->setText(off); - } - - if (!region->getBlockFly() && parcel->getAllowFly()) - { - mFlyText->setText(on); - } - else - { - mFlyText->setText(off); - } - - if (region->getRestrictPushObject() || parcel->getRestrictPushObject()) - { - mPushText->setText(off); - } - else - { - mPushText->setText(on); - } - - if (parcel->getAllowModify()) - { - mBuildText->setText(on); - } - else - { - mBuildText->setText(off); - } - - if((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) || - (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) || - !parcel->getAllowOtherScripts()) - { - mScriptsText->setText(off); - } - else - { - mScriptsText->setText(on); - } - - if (region->getAllowDamage() || parcel->getAllowDamage()) - { - mDamageText->setText(on); - } - else - { - mDamageText->setText(off); - } - - mRegionNameText->setText(region->getName()); - mRegionTypeText->setText(region->getSimProductName()); - mRegionRatingText->setText(region->getSimAccessString()); - - // Determine parcel owner - if (parcel->isPublic()) - { - mParcelOwner->setText(getString("public")); - mRegionOwnerText->setText(getString("public")); - } - else - { - if (parcel->getIsGroupOwned()) - { - mRegionOwnerText->setText(getString("group_owned_text")); - - if(!parcel->getGroupID().isNull()) - { - // FIXME: Using parcel group as region group. - gCacheName->get(parcel->getGroupID(), TRUE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mRegionGroupText, _2, _3)); - - gCacheName->get(parcel->getGroupID(), TRUE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mParcelOwner, _2, _3)); - } - else - { - std::string owner = getString("none_text"); - mRegionGroupText->setText(owner); - mParcelOwner->setText(owner); - } - } - else - { - // Figure out the owner's name - gCacheName->get(parcel->getOwnerID(), FALSE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mParcelOwner, _2, _3)); - gCacheName->get(region->getOwner(), FALSE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mRegionOwnerText, _2, _3)); - } - - if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus()) - { - mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text")); - } - } - - mEstateRatingText->setText(region->getSimAccessString()); - - S32 area; - S32 claim_price; - S32 rent_price; - F32 dwell; - BOOL for_sale = parcel->getForSale(); - LLViewerParcelMgr::getInstance()->getDisplayInfo(&area, - &claim_price, - &rent_price, - &for_sale, - &dwell); - if (for_sale) - { - // Adding "For Sale" flag in remote parcel response format. - parcel_data.flags |= DFQ_FOR_SALE; - - const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); - if(auth_buyer_id.notNull()) - { - gCacheName->get(auth_buyer_id, TRUE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mSaleToText, _2, _3)); - - // Show sales info to a specific person or a group he belongs to. - if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id)) - { - for_sale = FALSE; - } - } - else - { - mSaleToText->setText(getString("anyone")); - } - - const U8* sign = (U8*)getString("price_text").c_str(); - const U8* sqm = (U8*)getString("area_text").c_str(); - - mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice())); - mAreaText->setText(llformat("%d %s", area, sqm)); - mTrafficText->setText(llformat("%.0f", dwell)); - - // Can't have more than region max tasks, regardless of parcel - // object bonus factor. - S32 primitives = llmin(llround(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()), - (S32)region->getMaxTasks()); - - const U8* available = (U8*)getString("available").c_str(); - const U8* allocated = (U8*)getString("allocated").c_str(); - - mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated)); - - if (parcel->getAllowOtherScripts()) - { - mParcelScriptsText->setText(getString("all_residents_text")); - } - else if (parcel->getAllowGroupScripts()) - { - mParcelScriptsText->setText(getString("group_text")); - } - else - { - mParcelScriptsText->setText(off); - } - - mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off); - - if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) - { - mSubdivideText->setText(getString("can_change")); - } - else - { - mSubdivideText->setText(getString("can_not_change")); - } - if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) - { - mResaleText->setText(getString("can_not_resell")); - } - else - { - mResaleText->setText(getString("can_resell")); - } - } - - mSelectedParcelID = parcel->getLocalID(); - mLastSelectedRegionID = region->getRegionID(); - processParcelInfo(parcel_data); - - mYouAreHerePanel->setVisible(is_current_parcel); - getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale); -} - -void LLPanelPlaceInfo::updateEstateName(const std::string& name) -{ - mEstateNameText->setText(name); -} - -void LLPanelPlaceInfo::updateEstateOwnerName(const std::string& name) -{ - mEstateOwnerText->setText(name); -} - -void LLPanelPlaceInfo::updateCovenantText(const std::string &text) -{ - mCovenantText->setText(text); -} - -void LLPanelPlaceInfo::updateLastVisitedText(const LLDate &date) -{ - if (date.isNull()) - { - mLastVisited->setText(getString("unknown")); - } - else - { - std::string timeStr = getString("acquired_date"); - LLSD substitution; - substitution["datetime"] = (S32) date.secondsSinceEpoch(); - LLStringUtil::format (timeStr, substitution); - mLastVisited->setText(timeStr); - } -} - -void LLPanelPlaceInfo::toggleLandmarkEditMode(BOOL enabled) -{ - // If switching to edit mode while creating landmark - // the "Create Landmark" title remains. - if (enabled && mInfoType != CREATE_LANDMARK) - { - mTitle->setText(getString("title_edit_landmark")); - } - else - { - mTitle->setText(mCurrentTitle); - } - - if (mNotesEditor->getReadOnly() == (enabled == TRUE)) - { - mTitleEditor->setEnabled(enabled); - mNotesEditor->setReadOnly(!enabled); - mFolderCombo->setVisible(enabled); - getChild<LLTextBox>("folder_lable")->setVisible(enabled); - - // HACK: To change the text color in a text editor - // when it was enabled/disabled we set the text once again. - mNotesEditor->setText(mNotesEditor->getText()); - } -} - -const std::string& LLPanelPlaceInfo::getLandmarkTitle() const -{ - return mTitleEditor->getText(); -} - -const std::string LLPanelPlaceInfo::getLandmarkNotes() const -{ - return mNotesEditor->getText(); -} - -const LLUUID LLPanelPlaceInfo::getLandmarkFolder() const -{ - return mFolderCombo->getValue().asUUID(); -} - -BOOL LLPanelPlaceInfo::setLandmarkFolder(const LLUUID& id) -{ - return mFolderCombo->setCurrentByID(id); -} - -void LLPanelPlaceInfo::createLandmark(const LLUUID& folder_id) -{ - std::string name = mTitleEditor->getText(); - std::string desc = mNotesEditor->getText(); - - LLStringUtil::trim(name); - LLStringUtil::trim(desc); - - // If typed name is empty use the parcel name instead. - if (name.empty()) + // Remove land selection when panel hides. + if (!new_visibility) { - name = mParcelName->getText(); - - // If no parcel exists use the region name instead. - if (name.empty()) + if (!parcel_mgr->selectionEmpty()) { - name = mRegionName->getText(); + parcel_mgr->deselectLand(); } } - - LLStringUtil::replaceChar(desc, '\n', ' '); - // If no folder chosen use the "Landmarks" folder. - LLLandmarkActions::createLandmarkHere(name, desc, - folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK)); } void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel) @@ -942,159 +274,10 @@ void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel->setPickData(&data); } -// virtual -void LLPanelPlaceInfo::handleVisibilityChange (BOOL new_visibility) -{ - LLPanel::handleVisibilityChange(new_visibility); - - LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); - if (!parcel_mgr) - return; - - // Remove land selection when panel hides. - if (!new_visibility) - { - if (!parcel_mgr->selectionEmpty()) - { - parcel_mgr->deselectLand(); - } - } -} - -void LLPanelPlaceInfo::populateFoldersList() +// static +void LLPanelPlaceInfo::nameUpdatedCallback(LLTextBox* text, + const std::string& first, + const std::string& last) { - // Collect all folders that can contain landmarks. - LLInventoryModel::cat_array_t cats; - collectLandmarkFolders(cats); - - mFolderCombo->removeall(); - - // Put the "Landmarks" folder first in list. - LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); - const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id); - if (!cat) - { - llwarns << "Cannot find the landmarks folder" << llendl; - } - std::string cat_full_name = getFullFolderName(cat); - mFolderCombo->add(cat_full_name, cat->getUUID()); - - typedef std::vector<folder_pair_t> folder_vec_t; - folder_vec_t folders; - // Sort the folders by their full name. - for (S32 i = 0; i < cats.count(); i++) - { - cat = cats.get(i); - cat_full_name = getFullFolderName(cat); - folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name)); - } - sort(folders.begin(), folders.end(), cmp_folders); - - // Finally, populate the combobox. - for (folder_vec_t::const_iterator it = folders.begin(); it != folders.end(); it++) - mFolderCombo->add(it->second, LLSD(it->first)); -} - -//static -void LLPanelPlaceInfo::updateYouAreHereBanner(void* userdata) -{ - //YouAreHere Banner should be displayed only for selected places, - // If you want to display it for landmark or teleport history item, you should check by mParcelId - - LLPanelPlaceInfo* self = static_cast<LLPanelPlaceInfo*>(userdata); - if(!self->getVisible()) - return; - if(!gDisconnected) - { - static F32 radius = gSavedSettings.getF32("YouAreHereDistance"); - - BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID && - LLAgentUI::checkAgentDistance(self->mPosRegion, radius); - - self->mYouAreHerePanel->setVisible(display_banner); - } -} - -void LLPanelPlaceInfo::onForSaleBannerClick() -{ - LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance(); - LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection(); - LLViewerRegion* selected_region = mgr->getSelectionRegion(); - if(!hParcel.isNull() && selected_region) - { - if(hParcel->getParcel()->getLocalID() == mSelectedParcelID && - mLastSelectedRegionID ==selected_region->getRegionID()) - { - if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0) - { - LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice()); - } - else - { - LLViewerParcelMgr::getInstance()->startBuyLand(); - } - } - else - { - LL_WARNS("Places") << "User is trying to buy remote parcel.Operation is not supported"<< LL_ENDL; - } - - } - - -} - -/*static*/ -std::string LLPanelPlaceInfo::getFullFolderName(const LLViewerInventoryCategory* cat) -{ - std::string name = cat->getName(); - LLUUID parent_id; - - // translate category name, if it's right below the root - // FIXME: it can throw notification about non existent string in strings.xml - if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID()) - { - LLTrans::findString(name, "InvFolder " + name); - } - - // we don't want "My Inventory" to appear in the name - while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID()) - { - cat = gInventory.getCategory(parent_id); - name = cat->getName() + "/" + name; - } - - return name; -} - -static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right) -{ - return left.second < right.second; -} - -static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats) -{ - LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); - - // Add descendent folders of the "Landmarks" category. - LLInventoryModel::item_array_t items; // unused - LLIsType is_category(LLAssetType::AT_CATEGORY); - gInventory.collectDescendentsIf( - landmarks_id, - cats, - items, - LLInventoryModel::EXCLUDE_TRASH, - is_category); - - // Add the "My Favorites" category. - LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); - LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id); - if (!favorites_cat) - { - llwarns << "Cannot find the favorites folder" << llendl; - } - else - { - cats.put(favorites_cat); - } + text->setText(first + " " + last); } diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h index 07a2434d59f..c9e13475428 100644 --- a/indra/newview/llpanelplaceinfo.h +++ b/indra/newview/llpanelplaceinfo.h @@ -1,6 +1,6 @@ /** * @file llpanelplaceinfo.h - * @brief Displays place information in Side Tray. + * @brief Base class for place information in Side Tray. * * $LicenseInfo:firstyear=2009&license=viewergpl$ * @@ -38,19 +38,13 @@ #include "v3dmath.h" #include "lluuid.h" -#include "llpanelmedia.h" #include "llremoteparcelrequest.h" -class LLButton; -class LLComboBox; class LLExpandableTextBox; class LLInventoryItem; -class LLLineEditor; class LLPanelPickEdit; class LLParcel; -class LLIconCtrl; class LLTextBox; -class LLTextEditor; class LLTextureCtrl; class LLViewerRegion; class LLViewerInventoryCategory; @@ -74,30 +68,18 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver // Ignore all old location information, useful if you are // recycling an existing dialog and need to clear it. - void resetLocation(); + virtual void resetLocation(); // Sends a request for data about the given parcel, which will // only update the location if there is none already available. /*virtual*/ void setParcelID(const LLUUID& parcel_id); - // Depending on how the panel was triggered - // (from landmark or current location, or other) + // Depending on how the panel was triggered + // (from landmark or current location, or other) // sets a corresponding title and contents. - void setInfoType(INFO_TYPE type); - - // Create a landmark for the current location - // in a folder specified by folder_id. - void createLandmark(const LLUUID& folder_id); - - // Create a pick for the location specified - // by global_pos. - void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel); - - BOOL isMediaPanelVisible(); - void toggleMediaPanel(BOOL visible); - void displayItemInfo(const LLInventoryItem* pItem); - /*virtual*/ void setErrorStatus(U32 status, const std::string& reason); + virtual void setInfoType(INFO_TYPE type); + // Requests remote parcel info by parcel ID. void sendParcelInfoRequest(); // Displays information about a remote parcel. @@ -105,109 +87,37 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver void displayParcelInfo(const LLUUID& region_id, const LLVector3d& pos_global); - // Displays information about the currently selected parcel - // without sending a request to the server. - // If is_current_parcel true shows "You Are Here" banner. - void displaySelectedParcelInfo(LLParcel* parcel, - LLViewerRegion* region, - const LLVector3d& pos_global, - bool is_current_parcel); - - void updateEstateName(const std::string& name); - void updateEstateOwnerName(const std::string& name); - void updateCovenantText(const std::string &text); - void updateLastVisitedText(const LLDate &date); - - void nameUpdatedCallback(LLTextBox* text, - const std::string& first, - const std::string& last); - - void toggleLandmarkEditMode(BOOL enabled); - - const std::string& getLandmarkTitle() const; - const std::string getLandmarkNotes() const; - const LLUUID getLandmarkFolder() const; - - // Select current landmark folder in combobox. - BOOL setLandmarkFolder(const LLUUID& id); + /*virtual*/ void setErrorStatus(U32 status, const std::string& reason); /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); + /*virtual*/ void handleVisibilityChange (BOOL new_visibility); - - static std::string getFullFolderName(const LLViewerInventoryCategory* cat); -private: + // Create a pick for the location specified + // by global_pos. + void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel); - void populateFoldersList(); - static void updateYouAreHereBanner(void*);// added to gIdleCallbacks - void onForSaleBannerClick(); +protected: + static void nameUpdatedCallback(LLTextBox* text, + const std::string& first, + const std::string& last); /** * mParcelID is valid only for remote places, in other cases it's null. See resetLocation() */ - LLUUID mParcelID; - LLUUID mRequestedID; - LLUUID mLandmarkID; - LLVector3 mPosRegion; - std::string mCurrentTitle; - S32 mMinHeight; - INFO_TYPE mInfoType; - - /** - * Hold last displayed parcel. Needs for YouAreHere banner. - */ - S32 mSelectedParcelID; - LLUUID mLastSelectedRegionID; - - LLTextBox* mTitle; - LLPanel* mForSalePanel; - LLPanel* mYouAreHerePanel; - LLTextureCtrl* mSnapshotCtrl; - LLTextBox* mRegionName; - LLTextBox* mParcelName; - LLExpandableTextBox*mDescEditor; - LLTextBox* mMaturityRatingText; - LLTextBox* mParcelOwner; - LLTextBox* mLastVisited; - - LLTextBox* mRatingText; - LLTextBox* mVoiceText; - LLTextBox* mFlyText; - LLTextBox* mPushText; - LLTextBox* mBuildText; - LLTextBox* mScriptsText; - LLTextBox* mDamageText; - - LLTextBox* mRegionNameText; - LLTextBox* mRegionTypeText; - LLTextBox* mRegionRatingText; - LLTextBox* mRegionOwnerText; - LLTextBox* mRegionGroupText; - - LLTextBox* mEstateNameText; - LLTextBox* mEstateRatingText; - LLTextBox* mEstateOwnerText; - LLTextEditor* mCovenantText; - - LLTextBox* mSalesPriceText; - LLTextBox* mAreaText; - LLTextBox* mTrafficText; - LLTextBox* mPrimitivesText; - LLTextBox* mParcelScriptsText; - LLTextBox* mTerraformLimitsText; - LLTextEditor* mSubdivideText; - LLTextEditor* mResaleText; - LLTextBox* mSaleToText; - - LLTextBox* mOwner; - LLTextBox* mCreator; - LLTextBox* mCreated; - LLLineEditor* mTitleEditor; - LLTextEditor* mNotesEditor; - LLComboBox* mFolderCombo; - LLPanel* mScrollingPanel; - LLPanel* mInfoPanel; - LLMediaPanel* mMediaPanel; + LLUUID mParcelID; + LLUUID mRequestedID; + LLVector3 mPosRegion; + std::string mCurrentTitle; + S32 mMinHeight; + INFO_TYPE mInfoType; + + LLTextBox* mTitle; + LLTextureCtrl* mSnapshotCtrl; + LLTextBox* mRegionName; + LLTextBox* mParcelName; + LLExpandableTextBox* mDescEditor; + LLTextBox* mMaturityRatingText; }; #endif // LL_LLPANELPLACEINFO_H diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp new file mode 100644 index 00000000000..9ba72fe6cff --- /dev/null +++ b/indra/newview/llpanelplaceprofile.cpp @@ -0,0 +1,541 @@ +/** + * @file llpanelplaceprofile.cpp + * @brief Displays place profile in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpanelplaceprofile.h" + +#include "llparcel.h" + +#include "llqueryflags.h" + +#include "lliconctrl.h" +#include "lllineeditor.h" +#include "lltextbox.h" +#include "lltexteditor.h" + +#include "llaccordionctrl.h" +#include "llaccordionctrltab.h" +#include "llagent.h" +#include "llagentui.h" +#include "llappviewer.h" +#include "llcallbacklist.h" +#include "llfloaterbuycurrency.h" +#include "llstatusbar.h" +#include "llviewercontrol.h" +#include "llviewerparcelmgr.h" +#include "llviewerregion.h" + +static LLRegisterPanelClassWrapper<LLPanelPlaceProfile> t_place_profile("panel_place_profile"); + +LLPanelPlaceProfile::LLPanelPlaceProfile() +: LLPanelPlaceInfo(), + mForSalePanel(NULL), + mYouAreHerePanel(NULL), + mSelectedParcelID(-1) +{} + +// virtual +LLPanelPlaceProfile::~LLPanelPlaceProfile() +{} + +// virtual +BOOL LLPanelPlaceProfile::postBuild() +{ + LLPanelPlaceInfo::postBuild(); + + mForSalePanel = getChild<LLPanel>("for_sale_panel"); + mYouAreHerePanel = getChild<LLPanel>("here_panel"); + gIdleCallbacks.addFunction(&LLPanelPlaceProfile::updateYouAreHereBanner, this); + + //Icon value should contain sale price of last selected parcel. + mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")-> + setMouseDownCallback(boost::bind(&LLPanelPlaceProfile::onForSaleBannerClick, this)); + + mParcelOwner = getChild<LLTextBox>("owner_value"); + mLastVisited = getChild<LLTextBox>("last_visited_value"); + + mRatingText = getChild<LLTextBox>("rating_value"); + mVoiceText = getChild<LLTextBox>("voice_value"); + mFlyText = getChild<LLTextBox>("fly_value"); + mPushText = getChild<LLTextBox>("push_value"); + mBuildText = getChild<LLTextBox>("build_value"); + mScriptsText = getChild<LLTextBox>("scripts_value"); + mDamageText = getChild<LLTextBox>("damage_value"); + + mRegionNameText = getChild<LLTextBox>("region_name"); + mRegionTypeText = getChild<LLTextBox>("region_type"); + mRegionRatingText = getChild<LLTextBox>("region_rating"); + mRegionOwnerText = getChild<LLTextBox>("region_owner"); + mRegionGroupText = getChild<LLTextBox>("region_group"); + + mEstateNameText = getChild<LLTextBox>("estate_name"); + mEstateRatingText = getChild<LLTextBox>("estate_rating"); + mEstateOwnerText = getChild<LLTextBox>("estate_owner"); + mCovenantText = getChild<LLTextEditor>("covenant"); + + mSalesPriceText = getChild<LLTextBox>("sales_price"); + mAreaText = getChild<LLTextBox>("area"); + mTrafficText = getChild<LLTextBox>("traffic"); + mPrimitivesText = getChild<LLTextBox>("primitives"); + mParcelScriptsText = getChild<LLTextBox>("parcel_scripts"); + mTerraformLimitsText = getChild<LLTextBox>("terraform_limits"); + mSubdivideText = getChild<LLTextEditor>("subdivide"); + mResaleText = getChild<LLTextEditor>("resale"); + mSaleToText = getChild<LLTextBox>("sale_to"); + + return TRUE; +} + +// virtual +void LLPanelPlaceProfile::resetLocation() +{ + LLPanelPlaceInfo::resetLocation(); + + mForSalePanel->setVisible(FALSE); + mYouAreHerePanel->setVisible(FALSE); + + std::string not_available = getString("not_available"); + mParcelOwner->setValue(not_available); + mLastVisited->setValue(not_available); + + mRatingText->setText(not_available); + mVoiceText->setText(not_available); + mFlyText->setText(not_available); + mPushText->setText(not_available); + mBuildText->setText(not_available); + mParcelScriptsText->setText(not_available); + mDamageText->setText(not_available); + + mRegionNameText->setValue(not_available); + mRegionTypeText->setValue(not_available); + mRegionRatingText->setValue(not_available); + mRegionOwnerText->setValue(not_available); + mRegionGroupText->setValue(not_available); + + mEstateNameText->setValue(not_available); + mEstateRatingText->setValue(not_available); + mEstateOwnerText->setValue(not_available); + mCovenantText->setValue(not_available); + + mSalesPriceText->setValue(not_available); + mAreaText->setValue(not_available); + mTrafficText->setValue(not_available); + mPrimitivesText->setValue(not_available); + mParcelScriptsText->setValue(not_available); + mTerraformLimitsText->setValue(not_available); + mSubdivideText->setValue(not_available); + mResaleText->setValue(not_available); + mSaleToText->setValue(not_available); +} + +// virtual +void LLPanelPlaceProfile::setInfoType(INFO_TYPE type) +{ + bool is_info_type_agent = type == AGENT; + bool is_info_type_teleport_history = type == TELEPORT_HISTORY; + + getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent); + mMaturityRatingText->setVisible(!is_info_type_agent); + + getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent); + mParcelOwner->setVisible(is_info_type_agent); + + getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history); + mLastVisited->setVisible(is_info_type_teleport_history); + + getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent); + + switch(type) + { + case AGENT: + case PLACE: + default: + mCurrentTitle = getString("title_place"); + break; + + case TELEPORT_HISTORY: + mCurrentTitle = getString("title_teleport_history"); + break; + } + + LLPanelPlaceInfo::setInfoType(type); +} + +// virtual +void LLPanelPlaceProfile::processParcelInfo(const LLParcelData& parcel_data) +{ + LLPanelPlaceInfo::processParcelInfo(parcel_data); + + // HACK: Flag 0x2 == adult region, + // Flag 0x1 == mature region, otherwise assume PG + std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG); + if (parcel_data.flags & 0x2) + { + rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT); + } + else if (parcel_data.flags & 0x1) + { + rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); + } + + mMaturityRatingText->setValue(rating); + mRatingText->setValue(rating); + + //update for_sale banner, here we should use DFQ_FOR_SALE instead of PF_FOR_SALE + //because we deal with remote parcel response format + bool is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) && + mInfoType == AGENT ? TRUE : FALSE; + mForSalePanel->setVisible(is_for_sale); +} + +void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, + LLViewerRegion* region, + const LLVector3d& pos_global, + bool is_current_parcel) +{ + if (!region || !parcel) + return; + + // send EstateCovenantInfo message + LLMessageSystem *msg = gMessageSystem; + msg->newMessage("EstateCovenantRequest"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); + msg->sendReliable(region->getHost()); + + LLParcelData parcel_data; + + // HACK: Converting sim access flags to the format + // returned by remote parcel response. + switch(region->getSimAccess()) + { + case SIM_ACCESS_MATURE: + parcel_data.flags = 0x1; + break; + + case SIM_ACCESS_ADULT: + parcel_data.flags = 0x2; + break; + + default: + parcel_data.flags = 0; + } + parcel_data.desc = parcel->getDesc(); + parcel_data.name = parcel->getName(); + parcel_data.sim_name = region->getName(); + parcel_data.snapshot_id = parcel->getSnapshotID(); + mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), + (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), + (F32)pos_global.mdV[VZ]); + parcel_data.global_x = pos_global.mdV[VX]; + parcel_data.global_y = pos_global.mdV[VY]; + parcel_data.global_z = pos_global.mdV[VZ]; + + std::string on = getString("on"); + std::string off = getString("off"); + + // Processing parcel characteristics + if (parcel->getParcelFlagAllowVoice()) + { + mVoiceText->setText(on); + } + else + { + mVoiceText->setText(off); + } + + if (!region->getBlockFly() && parcel->getAllowFly()) + { + mFlyText->setText(on); + } + else + { + mFlyText->setText(off); + } + + if (region->getRestrictPushObject() || parcel->getRestrictPushObject()) + { + mPushText->setText(off); + } + else + { + mPushText->setText(on); + } + + if (parcel->getAllowModify()) + { + mBuildText->setText(on); + } + else + { + mBuildText->setText(off); + } + + if((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) || + (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) || + !parcel->getAllowOtherScripts()) + { + mScriptsText->setText(off); + } + else + { + mScriptsText->setText(on); + } + + if (region->getAllowDamage() || parcel->getAllowDamage()) + { + mDamageText->setText(on); + } + else + { + mDamageText->setText(off); + } + + mRegionNameText->setText(region->getName()); + mRegionTypeText->setText(region->getSimProductName()); + mRegionRatingText->setText(region->getSimAccessString()); + + // Determine parcel owner + if (parcel->isPublic()) + { + mParcelOwner->setText(getString("public")); + mRegionOwnerText->setText(getString("public")); + } + else + { + if (parcel->getIsGroupOwned()) + { + mRegionOwnerText->setText(getString("group_owned_text")); + + if(!parcel->getGroupID().isNull()) + { + // FIXME: Using parcel group as region group. + gCacheName->get(parcel->getGroupID(), TRUE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionGroupText, _2, _3)); + + gCacheName->get(parcel->getGroupID(), TRUE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3)); + } + else + { + std::string owner = getString("none_text"); + mRegionGroupText->setText(owner); + mParcelOwner->setText(owner); + } + } + else + { + // Figure out the owner's name + gCacheName->get(parcel->getOwnerID(), FALSE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3)); + gCacheName->get(region->getOwner(), FALSE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionOwnerText, _2, _3)); + } + + if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus()) + { + mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text")); + } + } + + mEstateRatingText->setText(region->getSimAccessString()); + + S32 area; + S32 claim_price; + S32 rent_price; + F32 dwell; + BOOL for_sale = parcel->getForSale(); + LLViewerParcelMgr::getInstance()->getDisplayInfo(&area, + &claim_price, + &rent_price, + &for_sale, + &dwell); + if (for_sale) + { + // Adding "For Sale" flag in remote parcel response format. + parcel_data.flags |= DFQ_FOR_SALE; + + const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); + if(auth_buyer_id.notNull()) + { + gCacheName->get(auth_buyer_id, TRUE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mSaleToText, _2, _3)); + + // Show sales info to a specific person or a group he belongs to. + if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id)) + { + for_sale = FALSE; + } + } + else + { + mSaleToText->setText(getString("anyone")); + } + + const U8* sign = (U8*)getString("price_text").c_str(); + const U8* sqm = (U8*)getString("area_text").c_str(); + + mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice())); + mAreaText->setText(llformat("%d %s", area, sqm)); + mTrafficText->setText(llformat("%.0f", dwell)); + + // Can't have more than region max tasks, regardless of parcel + // object bonus factor. + S32 primitives = llmin(llround(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()), + (S32)region->getMaxTasks()); + + const U8* available = (U8*)getString("available").c_str(); + const U8* allocated = (U8*)getString("allocated").c_str(); + + mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated)); + + if (parcel->getAllowOtherScripts()) + { + mParcelScriptsText->setText(getString("all_residents_text")); + } + else if (parcel->getAllowGroupScripts()) + { + mParcelScriptsText->setText(getString("group_text")); + } + else + { + mParcelScriptsText->setText(off); + } + + mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off); + + if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) + { + mSubdivideText->setText(getString("can_change")); + } + else + { + mSubdivideText->setText(getString("can_not_change")); + } + if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) + { + mResaleText->setText(getString("can_not_resell")); + } + else + { + mResaleText->setText(getString("can_resell")); + } + } + + mSelectedParcelID = parcel->getLocalID(); + mLastSelectedRegionID = region->getRegionID(); + processParcelInfo(parcel_data); + + mYouAreHerePanel->setVisible(is_current_parcel); + getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale); +} + +void LLPanelPlaceProfile::updateEstateName(const std::string& name) +{ + mEstateNameText->setText(name); +} + +void LLPanelPlaceProfile::updateEstateOwnerName(const std::string& name) +{ + mEstateOwnerText->setText(name); +} + +void LLPanelPlaceProfile::updateCovenantText(const std::string &text) +{ + mCovenantText->setText(text); +} + +void LLPanelPlaceProfile::updateLastVisitedText(const LLDate &date) +{ + if (date.isNull()) + { + mLastVisited->setText(getString("unknown")); + } + else + { + std::string timeStr = getString("acquired_date"); + LLSD substitution; + substitution["datetime"] = (S32) date.secondsSinceEpoch(); + LLStringUtil::format (timeStr, substitution); + mLastVisited->setText(timeStr); + } +} + +void LLPanelPlaceProfile::onForSaleBannerClick() +{ + LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance(); + LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection(); + LLViewerRegion* selected_region = mgr->getSelectionRegion(); + if(!hParcel.isNull() && selected_region) + { + if(hParcel->getParcel()->getLocalID() == mSelectedParcelID && + mLastSelectedRegionID ==selected_region->getRegionID()) + { + if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0) + { + LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice()); + } + else + { + LLViewerParcelMgr::getInstance()->startBuyLand(); + } + } + else + { + LL_WARNS("Places") << "User is trying to buy remote parcel.Operation is not supported"<< LL_ENDL; + } + + } +} + +// static +void LLPanelPlaceProfile::updateYouAreHereBanner(void* userdata) +{ + //YouAreHere Banner should be displayed only for selected places, + // If you want to display it for landmark or teleport history item, you should check by mParcelId + + LLPanelPlaceProfile* self = static_cast<LLPanelPlaceProfile*>(userdata); + if(!self->getVisible()) + return; + + if(!gDisconnected) + { + static F32 radius = gSavedSettings.getF32("YouAreHereDistance"); + + BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID && + LLAgentUI::checkAgentDistance(self->mPosRegion, radius); + + self->mYouAreHerePanel->setVisible(display_banner); + } +} diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h new file mode 100644 index 00000000000..d8e4bcb6bdb --- /dev/null +++ b/indra/newview/llpanelplaceprofile.h @@ -0,0 +1,114 @@ +/** + * @file llpanelplaceprofile.h + * @brief Displays place profile in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELPLACEPROFILE_H +#define LL_LLPANELPLACEPROFILE_H + +#include "llpanelplaceinfo.h" + +class LLTextEditor; + +class LLPanelPlaceProfile : public LLPanelPlaceInfo +{ +public: + LLPanelPlaceProfile(); + /*virtual*/ ~LLPanelPlaceProfile(); + + /*virtual*/ BOOL postBuild(); + + /*virtual*/ void resetLocation(); + + /*virtual*/ void setInfoType(INFO_TYPE type); + + /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); + + // Displays information about the currently selected parcel + // without sending a request to the server. + // If is_current_parcel true shows "You Are Here" banner. + void displaySelectedParcelInfo(LLParcel* parcel, + LLViewerRegion* region, + const LLVector3d& pos_global, + bool is_current_parcel); + + void updateEstateName(const std::string& name); + void updateEstateOwnerName(const std::string& name); + void updateCovenantText(const std::string &text); + void updateLastVisitedText(const LLDate &date); + +private: + void onForSaleBannerClick(); + + static void updateYouAreHereBanner(void*);// added to gIdleCallbacks + + /** + * Holds last displayed parcel. Needed for YouAreHere banner. + */ + S32 mSelectedParcelID; + LLUUID mLastSelectedRegionID; + + LLPanel* mForSalePanel; + LLPanel* mYouAreHerePanel; + + LLTextBox* mParcelOwner; + LLTextBox* mLastVisited; + + LLTextBox* mRatingText; + LLTextBox* mVoiceText; + LLTextBox* mFlyText; + LLTextBox* mPushText; + LLTextBox* mBuildText; + LLTextBox* mScriptsText; + LLTextBox* mDamageText; + + LLTextBox* mRegionNameText; + LLTextBox* mRegionTypeText; + LLTextBox* mRegionRatingText; + LLTextBox* mRegionOwnerText; + LLTextBox* mRegionGroupText; + + LLTextBox* mEstateNameText; + LLTextBox* mEstateRatingText; + LLTextBox* mEstateOwnerText; + LLTextEditor* mCovenantText; + + LLTextBox* mSalesPriceText; + LLTextBox* mAreaText; + LLTextBox* mTrafficText; + LLTextBox* mPrimitivesText; + LLTextBox* mParcelScriptsText; + LLTextBox* mTerraformLimitsText; + LLTextEditor* mSubdivideText; + LLTextEditor* mResaleText; + LLTextBox* mSaleToText; +}; + +#endif // LL_LLPANELPLACEPROFILE_H diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index b2e9110e966..42e4a6e40b1 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -57,9 +57,10 @@ #include "llinventorymodel.h" #include "lllandmarkactions.h" #include "lllandmarklist.h" -#include "llpanelplaceinfo.h" +#include "llpanellandmarkinfo.h" #include "llpanellandmarks.h" #include "llpanelpick.h" +#include "llpanelplaceprofile.h" #include "llpanelteleporthistory.h" #include "llteleporthistorystorage.h" #include "lltoggleablemenu.h" @@ -121,7 +122,8 @@ LLPanelPlaces::LLPanelPlaces() mFilterSubString(LLStringUtil::null), mActivePanel(NULL), mFilterEditor(NULL), - mPlaceInfo(NULL), + mPlaceProfile(NULL), + mLandmarkInfo(NULL), mPickPanel(NULL), mItem(NULL), mPlaceMenu(NULL), @@ -135,7 +137,7 @@ LLPanelPlaces::LLPanelPlaces() gInventory.addObserver(mInventoryObserver); LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback( - boost::bind(&LLPanelPlaces::onAgentParcelChange, this)); + boost::bind(&LLPanelPlaces::updateVerbs, this)); //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() } @@ -206,25 +208,32 @@ BOOL LLPanelPlaces::postBuild() mFilterEditor->setCommitCallback(boost::bind(&LLPanelPlaces::onFilterEdit, this, _2, false)); } - mPlaceInfo = getChild<LLPanelPlaceInfo>("panel_place_info"); + mPlaceProfile = getChild<LLPanelPlaceProfile>("panel_place_profile"); + mLandmarkInfo = getChild<LLPanelLandmarkInfo>("panel_landmark_info"); + if (!mPlaceProfile || !mLandmarkInfo) + return FALSE; - LLButton* back_btn = mPlaceInfo->getChild<LLButton>("back_btn"); + LLButton* back_btn = mPlaceProfile->getChild<LLButton>("back_btn"); back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); - LLLineEditor* title_editor = mPlaceInfo->getChild<LLLineEditor>("title_editor"); + back_btn = mLandmarkInfo->getChild<LLButton>("back_btn"); + back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); + + LLLineEditor* title_editor = mLandmarkInfo->getChild<LLLineEditor>("title_editor"); title_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this), NULL); - LLTextEditor* notes_editor = mPlaceInfo->getChild<LLTextEditor>("notes_editor"); + LLTextEditor* notes_editor = mLandmarkInfo->getChild<LLTextEditor>("notes_editor"); notes_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); - LLComboBox* folder_combo = mPlaceInfo->getChild<LLComboBox>("folder_combo"); + LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo"); folder_combo->setSelectionCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); + return TRUE; } void LLPanelPlaces::onOpen(const LLSD& key) { - if(mPlaceInfo == NULL || key.size() == 0) + if(!mPlaceProfile || !mLandmarkInfo || key.size() == 0) return; mFilterEditor->clear(); @@ -239,11 +248,11 @@ void LLPanelPlaces::onOpen(const LLSD& key) if (mPlaceInfoType == AGENT_INFO_TYPE) { - mPlaceInfo->setInfoType(LLPanelPlaceInfo::AGENT); + mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT); } else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) { - mPlaceInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK); + mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK); if (key.has("x") && key.has("y") && key.has("z")) { @@ -256,11 +265,11 @@ void LLPanelPlaces::onOpen(const LLSD& key) mPosGlobal = gAgent.getPositionGlobal(); } - mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal); + mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal); } else if (mPlaceInfoType == LANDMARK_INFO_TYPE) { - mPlaceInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); + mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); LLInventoryItem* item = gInventory.getItem(key["id"].asUUID()); if (!item) @@ -270,17 +279,12 @@ void LLPanelPlaces::onOpen(const LLSD& key) } else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) { - if (mPlaceInfo->isMediaPanelVisible()) - { - toggleMediaPanel(); - } - mPosGlobal = LLVector3d(key["x"].asReal(), key["y"].asReal(), key["z"].asReal()); - mPlaceInfo->setInfoType(LLPanelPlaceInfo::PLACE); - mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal); + mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE); + mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); } else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) { @@ -291,9 +295,9 @@ void LLPanelPlaces::onOpen(const LLSD& key) mPosGlobal = hist_items[index].mGlobalPos; - mPlaceInfo->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); - mPlaceInfo->updateLastVisitedText(hist_items[index].mDate); - mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal); + mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); + mPlaceProfile->updateLastVisitedText(hist_items[index].mDate); + mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); } LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); @@ -321,7 +325,7 @@ void LLPanelPlaces::onOpen(const LLSD& key) void LLPanelPlaces::setItem(LLInventoryItem* item) { - if (!mPlaceInfo || !item) + if (!mLandmarkInfo || !item) return; mItem = item; @@ -351,19 +355,19 @@ void LLPanelPlaces::setItem(LLInventoryItem* item) if (is_landmark_editable) { - if(!mPlaceInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull()) + if(!mLandmarkInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull()) { const LLViewerInventoryCategory* cat = gInventory.getCategory(mItem->getParentUUID()); - if(cat) + if (cat) { - std::string cat_fullname = LLPanelPlaceInfo::getFullFolderName(cat); - LLComboBox* folderList = mPlaceInfo->getChild<LLComboBox>("folder_combo"); - folderList->add(cat_fullname, cat->getUUID(),ADD_TOP); + std::string cat_fullname = LLPanelLandmarkInfo::getFullFolderName(cat); + LLComboBox* folderList = mLandmarkInfo->getChild<LLComboBox>("folder_combo"); + folderList->add(cat_fullname, cat->getUUID(), ADD_TOP); } } } - mPlaceInfo->displayItemInfo(mItem); + mLandmarkInfo->displayItemInfo(mItem); LLLandmark* lm = gLandmarkList.getAsset(mItem->getAssetUUID(), boost::bind(&LLPanelPlaces::onLandmarkLoaded, this, _1)); @@ -375,13 +379,13 @@ void LLPanelPlaces::setItem(LLInventoryItem* item) void LLPanelPlaces::onLandmarkLoaded(LLLandmark* landmark) { - if (!mPlaceInfo) + if (!mLandmarkInfo) return; LLUUID region_id; landmark->getRegionID(region_id); landmark->getGlobalPos(mPosGlobal); - mPlaceInfo->displayParcelInfo(region_id, mPosGlobal); + mLandmarkInfo->displayParcelInfo(region_id, mPosGlobal); } void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_filter) @@ -418,10 +422,8 @@ void LLPanelPlaces::onShareButtonClicked() void LLPanelPlaces::onTeleportButtonClicked() { - if (!mPlaceInfo) - return; - - if (mPlaceInfo->getVisible()) + LLPanelPlaceInfo* panel = getCurrentInfoPanel(); + if (panel && panel->getVisible()) { if (mPlaceInfoType == LANDMARK_INFO_TYPE) { @@ -450,10 +452,8 @@ void LLPanelPlaces::onTeleportButtonClicked() void LLPanelPlaces::onShowOnMapButtonClicked() { - if (!mPlaceInfo) - return; - - if (mPlaceInfo->getVisible()) + LLPanelPlaceInfo* panel = getCurrentInfoPanel(); + if (panel && panel->getVisible()) { LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); if(!worldmap_instance) @@ -496,31 +496,31 @@ void LLPanelPlaces::onShowOnMapButtonClicked() void LLPanelPlaces::onEditButtonClicked() { - if (!mPlaceInfo || isLandmarkEditModeOn) + if (!mLandmarkInfo || isLandmarkEditModeOn) return; isLandmarkEditModeOn = true; - mPlaceInfo->toggleLandmarkEditMode(TRUE); + mLandmarkInfo->toggleLandmarkEditMode(TRUE); updateVerbs(); } void LLPanelPlaces::onSaveButtonClicked() { - if (!mPlaceInfo || mItem.isNull()) + if (!mLandmarkInfo || mItem.isNull()) return; - std::string current_title_value = mPlaceInfo->getLandmarkTitle(); + std::string current_title_value = mLandmarkInfo->getLandmarkTitle(); std::string item_title_value = mItem->getName(); - std::string current_notes_value = mPlaceInfo->getLandmarkNotes(); + std::string current_notes_value = mLandmarkInfo->getLandmarkNotes(); std::string item_notes_value = mItem->getDescription(); LLStringUtil::trim(current_title_value); LLStringUtil::trim(current_notes_value); LLUUID item_id = mItem->getUUID(); - LLUUID folder_id = mPlaceInfo->getLandmarkFolder(); + LLUUID folder_id = mLandmarkInfo->getLandmarkFolder(); LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(mItem); @@ -553,7 +553,7 @@ void LLPanelPlaces::onSaveButtonClicked() void LLPanelPlaces::onCancelButtonClicked() { - if (!mPlaceInfo) + if (!mLandmarkInfo) return; if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) @@ -562,13 +562,13 @@ void LLPanelPlaces::onCancelButtonClicked() } else { - mPlaceInfo->toggleLandmarkEditMode(FALSE); + mLandmarkInfo->toggleLandmarkEditMode(FALSE); isLandmarkEditModeOn = false; updateVerbs(); // Reload the landmark properties. - mPlaceInfo->displayItemInfo(mItem); + mLandmarkInfo->displayItemInfo(mItem); } } @@ -652,9 +652,6 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param) } else if (item == "pick") { - if (!mPlaceInfo) - return; - if (mPickPanel == NULL) { mPickPanel = LLPanelPickEdit::create(); @@ -667,7 +664,12 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param) togglePickPanel(TRUE); mPickPanel->onOpen(LLSD()); - mPlaceInfo->createPick(mPosGlobal, mPickPanel); + + LLPanelPlaceInfo* panel = getCurrentInfoPanel(); + if (panel) + { + panel->createPick(mPosGlobal, mPickPanel); + } LLRect rect = getRect(); mPickPanel->reshape(rect.getWidth(), rect.getHeight()); @@ -694,39 +696,16 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param) void LLPanelPlaces::onBackButtonClicked() { - if (!mPlaceInfo) - return; - - if (mPlaceInfo->isMediaPanelVisible()) - { - toggleMediaPanel(); - } - else - { - togglePlaceInfoPanel(FALSE); + togglePlaceInfoPanel(FALSE); - // Resetting mPlaceInfoType when Place Info panel is closed. - mPlaceInfoType = LLStringUtil::null; + // Resetting mPlaceInfoType when Place Info panel is closed. + mPlaceInfoType = LLStringUtil::null; - isLandmarkEditModeOn = false; - } + isLandmarkEditModeOn = false; updateVerbs(); } -void LLPanelPlaces::toggleMediaPanel() -{ - if (!mPlaceInfo) - return; - - mPlaceInfo->toggleMediaPanel(!mPlaceInfo->isMediaPanelVisible()); - - // Refresh the current place info because - // the media panel controls can't refer to - // the remote parcel media. - onOpen(LLSD().insert("type", AGENT_INFO_TYPE)); -} - void LLPanelPlaces::togglePickPanel(BOOL visible) { setAllChildrenVisible(this, !visible); @@ -737,26 +716,50 @@ void LLPanelPlaces::togglePickPanel(BOOL visible) void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible) { - if (!mPlaceInfo) + if (!mPlaceProfile || !mLandmarkInfo) return; - mPlaceInfo->setVisible(visible); mFilterEditor->setVisible(!visible); mTabContainer->setVisible(!visible); - if (visible) + if (mPlaceInfoType == AGENT_INFO_TYPE || + mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || + mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) { - mPlaceInfo->resetLocation(); + mPlaceProfile->setVisible(visible); - LLRect rect = getRect(); - LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); - mPlaceInfo->reshape(new_rect.getWidth(),new_rect.getHeight()); + if (visible) + { + mPlaceProfile->resetLocation(); + + LLRect rect = getRect(); + LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); + mPlaceProfile->reshape(new_rect.getWidth(), new_rect.getHeight()); + + mLandmarkInfo->setVisible(FALSE); + } + } + else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || + mPlaceInfoType == LANDMARK_INFO_TYPE) + { + mLandmarkInfo->setVisible(visible); + + if (visible) + { + mLandmarkInfo->resetLocation(); + + LLRect rect = getRect(); + LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); + mLandmarkInfo->reshape(new_rect.getWidth(), new_rect.getHeight()); + + mPlaceProfile->setVisible(FALSE); + } } } void LLPanelPlaces::changedParcelSelection() { - if (!mPlaceInfo) + if (!mPlaceProfile) return; LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); @@ -782,8 +785,8 @@ void LLPanelPlaces::changedParcelSelection() } } - mPlaceInfo->resetLocation(); - mPlaceInfo->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel); + mPlaceProfile->resetLocation(); + mPlaceProfile->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel); updateVerbs(); } @@ -830,30 +833,22 @@ void LLPanelPlaces::changedInventory(U32 mask) gInventory.removeObserver(mInventoryObserver); } -void LLPanelPlaces::onAgentParcelChange() +void LLPanelPlaces::updateVerbs() { - if (!mPlaceInfo) - return; + bool is_place_info_visible; - if (mPlaceInfo->isMediaPanelVisible()) + LLPanelPlaceInfo* panel = getCurrentInfoPanel(); + if (panel) { - onOpen(LLSD().insert("type", AGENT_INFO_TYPE)); + is_place_info_visible = panel->getVisible(); } else { - updateVerbs(); + is_place_info_visible = false; } -} -void LLPanelPlaces::updateVerbs() -{ - if (!mPlaceInfo) - return; - - bool is_place_info_visible = mPlaceInfo->getVisible(); bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE; bool is_create_landmark_visible = mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE; - bool is_media_panel_visible = mPlaceInfo->isMediaPanelVisible(); mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); @@ -864,7 +859,7 @@ void LLPanelPlaces::updateVerbs() mCancelBtn->setVisible(isLandmarkEditModeOn); mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn); - mOverflowBtn->setEnabled(is_place_info_visible && !is_media_panel_visible && !is_create_landmark_visible); + mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible); if (is_place_info_visible) { @@ -872,16 +867,13 @@ void LLPanelPlaces::updateVerbs() { // We don't need to teleport to the current location // so check if the location is not within the current parcel. - mTeleportBtn->setEnabled(!is_media_panel_visible && - !mPosGlobal.isExactlyZero() && + mTeleportBtn->setEnabled(!mPosGlobal.isExactlyZero() && !LLViewerParcelMgr::getInstance()->inAgentParcel(mPosGlobal)); } else if (mPlaceInfoType == LANDMARK_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) { mTeleportBtn->setEnabled(TRUE); } - - mShowOnMapBtn->setEnabled(!is_media_panel_visible); } else { @@ -890,6 +882,23 @@ void LLPanelPlaces::updateVerbs() } } +LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel() +{ + if (mPlaceInfoType == AGENT_INFO_TYPE || + mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || + mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) + { + return mPlaceProfile; + } + else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || + mPlaceInfoType == LANDMARK_INFO_TYPE) + { + return mLandmarkInfo; + } + + return NULL; +} + static bool is_agent_in_selected_parcel(LLParcel* parcel) { LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index e2d281dd840..39eb5261db4 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -37,6 +37,10 @@ class LLInventoryItem; class LLFilterEditor; class LLLandmark; + +class LLPanelLandmarkInfo; +class LLPanelPlaceProfile; + class LLPanelPickEdit; class LLPanelPlaceInfo; class LLPanelPlacesTab; @@ -85,13 +89,16 @@ class LLPanelPlaces : public LLPanel void togglePickPanel(BOOL visible); void togglePlaceInfoPanel(BOOL visible); - void onAgentParcelChange(); void updateVerbs(); + LLPanelPlaceInfo* getCurrentInfoPanel(); + LLFilterEditor* mFilterEditor; LLPanelPlacesTab* mActivePanel; LLTabContainer* mTabContainer; - LLPanelPlaceInfo* mPlaceInfo; + LLPanelPlaceProfile* mPlaceProfile; + LLPanelLandmarkInfo* mLandmarkInfo; + LLPanelPickEdit* mPickPanel; LLToggleableMenu* mPlaceMenu; LLToggleableMenu* mLandmarkMenu; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 5fd762ab3d3..caa668836db 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -139,7 +139,7 @@ #include "llgroupactions.h" #include "llagentui.h" #include "llpanelblockedlist.h" -#include "llpanelplaceinfo.h" +#include "llpanelplaceprofile.h" #include <boost/tokenizer.hpp> #include <boost/algorithm/string/split.hpp> @@ -5548,7 +5548,7 @@ void process_covenant_reply(LLMessageSystem* msg, void**) LLPanelLandCovenant::updateEstateOwnerName(owner_name); LLFloaterBuyLand::updateEstateOwnerName(owner_name); - LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info"); + LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile"); if (panel) { panel->updateEstateName(estate_name); @@ -5682,7 +5682,7 @@ void onCovenantLoadComplete(LLVFS *vfs, LLPanelLandCovenant::updateCovenantText(covenant_text); LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid); - LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info"); + LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile"); if (panel) { panel->updateCovenantText(covenant_text); diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml new file mode 100644 index 00000000000..03ba7f7c81f --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -0,0 +1,257 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="570" + layout="topleft" + left="0" + min_height="350" + name="landmark_info" + top="20" + width="330"> + <string + name="title_create_landmark" + value="Create Landmark" /> + <string + name="title_edit_landmark" + value="Edit Landmark" /> + <string + name="title_landmark" + value="Landmark" /> + <string + name="not_available" + value="(N\A)" /> + <string + name="unknown" + value="(unknown)" /> + <string + name="public" + value="(public)" /> + <string + name="server_update_text"> + Place information not available without server update. + </string> + <string + name="server_error_text"> + Information about this location is unavailable at this time, please try again later. + </string> + <string + name="server_forbidden_text"> + Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner. + </string> + <string + name="acquired_date"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </string> + <button + follows="top|right" + height="23" + image_overlay="BackArrow_Off" + layout="topleft" + left="10" + name="back_btn" + picture_style="true" + tab_stop="false" + top="0" + width="23" /> + <text + follows="top|left|right" + font="SansSerifHugeBold" + height="26" + layout="topleft" + left_pad="10" + name="title" + text_color="white" + top="0" + use_ellipses="true" + value="Place Profile" + width="275" /> + <scroll_container + color="DkGray2" + follows="all" + height="533" + layout="topleft" + left="10" + name="place_scroll" + opaque="true" + top_pad="5" + width="313"> + <panel + bg_alpha_color="DkGray2" + follows="all" + height="533" + layout="topleft" + left="0" + min_height="300" + name="scrolling_panel" + top="0" + width="313"> + <texture_picker + enabled="false" + follows="top|left" + height="190" + layout="topleft" + left="10" + name="logo" + top="10" + width="290" /> + <text + follows="left|top|right" + font="SansSerifLarge" + height="14" + layout="topleft" + left="10" + name="region_title" + text_color="white" + top_pad="5" + use_ellipses="true" + value="SampleRegion" + width="290" /> + <text + follows="left|top|right" + height="14" + layout="topleft" + left="10" + name="parcel_title" + top_pad="4" + use_ellipses="true" + value="SampleParcel, Name Long (145, 228, 26)" + width="285" /> + <expandable_text + follows="left|top|right" + height="50" + layout="topleft" + left="5" + name="description" + top_pad="10" + value="Du waltz die spritz" + width="300" /> + <panel + follows="left|top|right" + height="55" + layout="topleft" + left="10" + name="landmark_info_panel" + top_pad="10" + width="290"> + <text + follows="left|top" + height="15" + layout="topleft" + left="0" + name="owner_label" + top_pad="10" + value="Owner:" + width="90" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="70" + name="owner" + top_delta="0" + width="200" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="0" + name="creator_label" + value="Creator:" + width="90" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="70" + name="creator" + top_delta="0" + width="200" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="0" + name="created_label" + value="Created:" + width="50" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="70" + name="created" + top_delta="0" + width="200" /> + </panel> + <panel + follows="left|top|right" + height="210" + layout="topleft" + left="10" + name="landmark_edit_panel" + width="290"> + <text + follows="left|top" + height="15" + layout="topleft" + left="0" + name="title_label" + top_pad="10" + value="Title:" + width="290" /> + <line_editor + background_image_disabled="task_panel_background.png" + follows="left|top|right" + height="22" + layout="topleft" + left="0" + max_length="63" + name="title_editor" + prevalidate_callback="ascii" + text_readonly_color="white" + top_pad="5" + width="290" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="0" + name="notes_label" + top_pad="10" + value="My notes:" + width="290" /> + <text_editor + bg_readonly_color="DkGray2" + follows="all" + height="70" + layout="topleft" + left="0" + max_length="127" + name="notes_editor" + read_only="true" + text_readonly_color="white" + top_pad="5" + width="290" + wrap="true" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="0" + name="folder_label" + top_pad="15" + value="Landmark location:" + width="290" /> + <combo_box + follows="bottom|left|right" + height="20" + layout="topleft" + left="0" + name="folder_combo" + top_pad="5" + width="200" /> + </panel> + </panel> + </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml new file mode 100644 index 00000000000..7e073f064d7 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -0,0 +1,979 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="570" + layout="topleft" + left="0" + min_height="350" + name="place_profile" + top="20" + width="330"> + <string + name="on" + value="On" /> + <string + name="off" + value="Off" /> + <string + name="anyone" + value="Anyone" /> + <string + name="available" + value="available" /> + <string + name="allocated" + value="allocated" /> + <string + name="title_place" + value="Place Profile" /> + <string + name="title_teleport_history" + value="Teleport History Location" /> + <string + name="not_available" + value="(N\A)" /> + <string + name="unknown" + value="(unknown)" /> + <string + name="public" + value="(public)" /> + <string + name="none_text" + value="(none)" /> + <string + name="sale_pending_text" + value="(Sale Pending)" /> + <string + name="group_owned_text" + value="(Group Owned)" /> + <string + name="price_text" + value="L$" /> + <string + name="area_text" + value="m²" /> + <string + name="all_residents_text" + value="All Residents" /> + <string + name="group_text" + value="Group" /> + <string + name="can_resell"> + Purchased land in this region may be resold. + </string> + <string + name="can_not_resell"> + Purchased land in this region may not be resold. + </string> + <string + name="can_change"> + Purchased land in this region may be joined or subdivided. + </string> + <string + name="can_not_change"> + Purchased land in this region may not be joined or subdivided. + </string> + <string + name="server_update_text"> + Place information not available without server update. + </string> + <string + name="server_error_text"> + Information about this location is unavailable at this time, please try again later. + </string> + <string + name="server_forbidden_text"> + Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner. + </string> + <string + name="acquired_date"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </string> + <button + follows="top|right" + height="23" + image_overlay="BackArrow_Off" + layout="topleft" + left="10" + name="back_btn" + picture_style="true" + tab_stop="false" + top="0" + width="23" /> + <text + follows="top|left|right" + font="SansSerifHugeBold" + height="26" + layout="topleft" + left_pad="10" + name="title" + text_color="white" + top="0" + use_ellipses="true" + value="Place Profile" + width="275" /> + <scroll_container + color="DkGray2" + follows="all" + height="533" + layout="topleft" + left="10" + name="place_scroll" + opaque="true" + top_pad="5" + width="313"> + <panel + bg_alpha_color="DkGray2" + follows="all" + height="533" + layout="topleft" + left="0" + min_height="300" + name="scrolling_panel" + top="0" + value=">" + width="313"> + <texture_picker + enabled="false" + follows="top|left" + height="190" + layout="topleft" + left="10" + name="logo" + top="10" + width="290" /> + <layout_stack + border_size="0" + clip="false" + follows="all" + height="50" + layout="topleft" + mouse_opaque="false" + name="panel_stack" + orientation="horizontal" + top_pad="-65" + width="100"> + <layout_panel + follows="left|right" + height="50" + layout="topleft" + left="0" + min_height="50" + min_width="50" + mouse_opaque="false" + name="here_panel" + top="0" + user_resize="false" + width="60"> + <icon + follows="top|left" + height="50" + image_name="YouAreHere_Badge" + layout="topleft" + left="0" + name="icon_you_are_here" + top="0" + width="50" /> + </layout_panel> + <layout_panel + follows="left|right" + height="60" + layout="topleft" + min_height="50" + min_width="60" + mouse_opaque="false" + name="for_sale_panel" + top="0" + user_resize="false" + width="60"> + <icon + follows="top|left" + height="50" + image_name="ForSale_Badge" + layout="topleft" + left="10" + name="icon_for_sale" + top="0" + width="50" /> + </layout_panel> + </layout_stack> + <text + follows="left|top|right" + font="SansSerifLarge" + height="14" + layout="topleft" + left="10" + name="region_title" + text_color="white" + top_pad="5" + use_ellipses="true" + value="SampleRegion" + width="290" /> + <!-- <icon + follows="top|right" + height="16" + image_name="Icon_For_Sale" + layout="topleft" + left="3" + mouse_opaque="true" + name="icon_for_sale" + width="16" />--> + <text + follows="left|top|right" + height="14" + layout="topleft" + left="10" + name="parcel_title" + top_pad="4" + use_ellipses="true" + value="SampleParcel, Name Long (145, 228, 26)" + width="285" /> + <expandable_text + follows="left|top|right" + height="50" + layout="topleft" + left="5" + name="description" + top_pad="10" + value="Du waltz die spritz" + width="300" /> + <text + follows="left|top" + height="14" + layout="topleft" + left="10" + name="owner_label" + text_color="White" + top_pad="0" + value="Owner:" + width="90" /> + <!--TODO: HOOK THIS NAME UP WITH AN INSPECTOR --> + <text + follows="left|top|right" + height="14" + layout="topleft" + left_pad="1" + name="owner_value" + top_delta="0" + value="Alex Superduperlongenamenton" + width="205" /> + <accordion + follows="all" + height="230" + layout="topleft" + left="0" + name="advanced_info_accordion" + top_pad="10" + width="313"> + <accordion_tab + layout="topleft" + name="parcel_characteristics_tab" + title="Parcel"> + <scroll_container + color="DkGray2" + follows="all" + height="132" + layout="topleft" + left="0" + name="parcel_scroll" + opaque="true" + top="0" + width="290"> + <panel + follows="all" + height="165" + layout="topleft" + left="0" + top="0" + width="275"> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_M" + layout="topleft" + left="20" + name="icon_M" + top="0" + width="18" /> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_R" + layout="topleft" + left="20" + name="icon_R" + top="0" + width="18" /> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_PG" + layout="topleft" + left="20" + name="icon_PG" + top="0" + visible="false" + width="18" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="8" + name="rating_label" + value="Rating:" + width="80" /> + <text + follows="right|top" + height="16" + layout="topleft" + left_pad="0" + name="rating_value" + top_delta="0" + value="Mature" + width="120" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Voice" + layout="topleft" + left="20" + name="icon_Voice" + top_pad="5" + width="22" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_VoiceNo" + layout="topleft" + left="20" + name="icon_VoiceNo" + top_delta="0" + visible="false" + width="22" /> + <text + follows="left|top" + height="18" + layout="topleft" + left_pad="8" + name="voice_label" + top_delta="0" + value="Voice:" + width="76" /> + <text + follows="right|top" + height="18" + layout="topleft" + left_pad="0" + name="voice_value" + top_delta="0" + value="On" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Fly" + layout="topleft" + left="20" + name="icon_Fly" + top_pad="3" + width="22" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_FlyNo" + layout="topleft" + left="20" + name="icon_FlyNo" + top_delta="0" + visible="false" + width="22" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="8" + name="fly_label" + value="Fly:" + width="76" /> + <text + follows="right|top" + height="16" + layout="topleft" + left_pad="0" + name="fly_value" + top_delta="0" + value="On" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Push" + layout="topleft" + left="20" + name="icon_Push" + top_pad="3" + visible="false" + width="22" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_PushNo" + layout="topleft" + left="20" + name="icon_PushNo" + top_delta="0" + width="22" /> + <text + follows="left|top" + height="14" + layout="topleft" + left_pad="8" + name="push_label" + value="Push:" + width="76" /> + <text + follows="right|top" + height="14" + layout="topleft" + left_pad="0" + name="push_value" + top_delta="0" + value="Off" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Build" + layout="topleft" + left="20" + name="icon_Build" + top_pad="3" + width="22" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_BuildNo" + layout="topleft" + left="20" + name="icon_BuildNo" + top_delta="0" + visible="false" /> + <text + follows="left|top" + height="14" + layout="topleft" + left_pad="8" + name="build_label" + value="Build:" + width="76" /> + <text + follows="right|top" + height="15" + layout="topleft" + left_pad="0" + name="build_value" + top_delta="0" + value="On" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Scripts" + layout="topleft" + left="20" + name="icon_Scripts" + top_pad="3" + width="22" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_ScriptsNo" + layout="topleft" + left="20" + name="icon_ScriptsNo" + top_delta="0" + visible="false" /> + <text + follows="left|top" + height="14" + layout="topleft" + left_pad="8" + name="scripts_label" + value="Scripts:" + width="76" /> + <text + follows="right|top" + height="14" + layout="topleft" + left_pad="0" + name="scripts_value" + top_delta="0" + value="On" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Damage" + layout="topleft" + left="20" + name="icon_Damage" + top_pad="7" + visible="false" + width="22" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_DamageNo" + layout="topleft" + left="20" + name="icon_DamageNo" + top_delta="0" /> + <text + follows="left|top" + height="14" + layout="topleft" + left_pad="8" + name="damage_label" + value="Damage:" + width="76" /> + <text + follows="right|top" + height="14" + layout="topleft" + left_pad="0" + name="damage_value" + top_delta="0" + value="Off" + width="60" /> + <button + follows="bottom|right" + height="19" + label="About Land" + layout="topleft" + name="about_land_btn" + right="-5" + tab_stop="false" + top="138" + width="90"> + <click_callback + function="ShowFloater" + parameter="about_land" /> + </button> + </panel> + </scroll_container> + </accordion_tab> + <accordion_tab + expanded="false" + layout="topleft" + name="region_information_tab" + title="Region"> + <panel + follows="all" + height="125" + layout="topleft" + left="0" + top="0" + width="290"> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="region_name_label" + top_pad="5" + value="Region:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left_pad="0" + name="region_name" + top_delta="0" + value="Mooseland" + width="195" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="region_type_label" + top_pad="5" + value="Type:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left_pad="0" + name="region_type" + top_delta="0" + value="Moose" + width="195" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="region_rating_label" + top_pad="7" + value="Rating:" + width="80" /> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_M" + layout="topleft" + left_pad="0" + name="icon_M" + width="18" /> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_R" + layout="topleft" + left_delta="0" + name="icon_R" + top_delta="0" + visible="false" + width="18" /> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_PG" + layout="topleft" + left_delta="0" + name="icon_PG" + top_delta="0" + visible="false" + width="18" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left_pad="10" + name="region_rating" + value="Explicit" + width="100" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="region_owner_label" + top_pad="5" + value="Owner:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left_pad="0" + name="region_owner" + top_delta="0" + value="moose Van Moose" + width="195" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="region_group_label" + top_pad="5" + value="Group:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left_pad="0" + name="region_group" + top_delta="0" + use_ellipses="true" + width="195"> + The Mighty Moose of mooseville soundvillemoose + </text> + <button + follows="bottom|right" + height="19" + label="Region/Estate" + layout="topleft" + name="region_info_btn" + right="-5" + tab_stop="false" + width="105"> + <click_callback + function="ShowFloater" + parameter="region_info" /> + </button> + </panel> + </accordion_tab> + <accordion_tab + expanded="false" + layout="topleft" + name="estate_information_tab" + title="Estate"> + <panel + follows="all" + height="189" + layout="topleft" + left="0" + top="0" + width="290"> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="estate_name_label" + top_pad="5" + value="Estate:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="90" + name="estate_name" + top_delta="0" + width="160" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="estate_rating_label" + top_pad="5" + value="Rating:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="90" + name="estate_rating" + top_delta="0" + width="160" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="estate_owner_label" + top_pad="5" + value="Owner:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="90" + name="estate_owner" + top_delta="0" + width="160" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="covenant_label" + top_pad="5" + value="Covenant:" + width="220" /> + <text_editor + bg_focus_color="DkGray2" + bg_readonly_color="DkGray2" + follows="left|top|right" + handle_edit_keys_directly="true" + height="90" + layout="topleft" + left="10" + max_length="65535" + name="covenant" + read_only="true" + top_pad="0" + width="280" /> + </panel> + </accordion_tab> + <accordion_tab + expanded="false" + layout="topleft" + name="sales_tab" + title="For Sale"> + <panel + follows="all" + height="300" + layout="topleft" + left="0" + top="0" + width="290"> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="sales_price_label" + top_pad="5" + value="Price:" + width="100" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="110" + name="sales_price" + top_delta="0" + width="140" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="area_label" + top_pad="5" + value="Area:" + width="100" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="110" + name="area" + top_delta="0" + width="140" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="traffic_label" + top_pad="5" + value="Traffic:" + width="100" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="110" + name="traffic" + top_delta="0" + width="140" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="primitives_label" + top_pad="5" + value="Primitives:" + width="100" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="110" + name="primitives" + top_delta="0" + width="140" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="parcel_scripts_label" + top_pad="5" + value="Scripts:" + width="100" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="110" + name="parcel_scripts" + top_delta="0" + width="140" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="terraform_limits_label" + top_pad="5" + value="Terraform limits:" + width="100" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="110" + name="terraform_limits" + top_delta="0" + width="140" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="subdivide_label" + top_pad="5" + value="Subdivide/Join ability:" + width="220" /> + <text_editor + bg_focus_color="DkGray2" + bg_readonly_color="DkGray2" + follows="left|top|right" + height="45" + layout="topleft" + left="10" + max_length="65535" + name="subdivide" + read_only="true" + top_pad="5" + width="245" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="resale_label" + top_pad="5" + value="ReSale ability:" + width="80" /> + <text_editor + bg_focus_color="DkGray2" + bg_readonly_color="DkGray2" + follows="left|top|right" + height="45" + layout="topleft" + left="10" + max_length="65535" + name="resale" + read_only="true" + top_pad="5" + width="245" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="sale_to_label" + top_pad="5" + value="For sale to:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="90" + name="sale_to" + top_delta="0" + width="160" /> + </panel> + </accordion_tab> + </accordion> + </panel> + </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index 5aa53ab46b1..87ac5be74a1 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -40,14 +40,26 @@ background_visible="true" top_pad="10" width="313" /> <panel - class="panel_place_info" - filename="panel_place_info.xml" + class="panel_place_profile" + filename="panel_place_profile.xml" follows="all" height="533" layout="topleft" left="0" help_topic="places_info_tab" - name="panel_place_info" + name="panel_place_profile" + top="5" + visible="false" + width="313" /> + <panel + class="panel_landmark_info" + filename="panel_landmark_info.xml" + follows="all" + height="533" + layout="topleft" + left="0" + help_topic="places_info_tab" + name="panel_landmark_info" top="5" visible="false" width="313" /> -- GitLab From 97f9ad9f4c049a76287968f2d4fd5133e883984b Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Tue, 3 Nov 2009 17:16:37 +0000 Subject: [PATCH 062/306] DEV-41358 DEV-41361: Added support for new SLAPP URLs, needed for the new Search web pages. These are: secondlife:///app/worldmap/{NAME}/{COORDS} Show the given coordinate on the World Map secondlife:///app/agent/{UUID}/pay Pay the specified Resident secondlife:///app/agent/{UUID}/im IM the specified Resident secondlife:///app/agent/{UUID}/requestfriend Request friendship of the specificed Resident secondlife:///app/agent/{UUID}/offerteleport Offer to Teleport the specified Resident secondlife:///app/agent/{UUID}/mute Mute/Block Resident secondlife:///app/agent/{UUID}/unmute Unmute/Unblock Resident --- indra/newview/llfloaterworldmap.cpp | 30 ++++++++++++++++++ indra/newview/llpanelprofile.cpp | 48 +++++++++++++++++++++++++++-- 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index b7e8835fb88..f3f600149f9 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -45,6 +45,7 @@ #include "llcallingcard.h" #include "llcombobox.h" #include "llviewercontrol.h" +#include "llcommandhandler.h" #include "lldraghandle.h" #include "llfirstuse.h" #include "llfloaterreg.h" // getTypedInstance() @@ -96,6 +97,35 @@ static const F32 SIM_COORD_DEFAULT = 128.f; // Globals //--------------------------------------------------------------------------- +// handle secondlife:///app/worldmap/{NAME}/{COORDS} URLs +class LLWorldMapHandler : public LLCommandHandler +{ +public: + // requires trusted browser to trigger + LLWorldMapHandler() : LLCommandHandler("worldmap", UNTRUSTED_THROTTLE) { } + + bool handle(const LLSD& params, const LLSD& query_map, + LLMediaCtrl* web) + { + if (params.size() == 0) + { + return false; + } + + const std::string region_name = params[0].asString(); + S32 x = (params.size() > 1) ? params[1].asInteger() : 128; + S32 y = (params.size() > 2) ? params[2].asInteger() : 128; + S32 z = (params.size() > 3) ? params[3].asInteger() : 0; + + LLFloaterWorldMap::getInstance()->trackURL(region_name, x, y, z); + LLFloaterReg::showInstance("world_map", "center"); + + return true; + } +}; +LLWorldMapHandler gWorldMapHandler; + + LLFloaterWorldMap* gFloaterWorldMap = NULL; class LLMapInventoryObserver : public LLInventoryObserver diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index bec670cdaa7..8147ff17f0f 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -59,17 +59,61 @@ class LLAgentHandler : public LLCommandHandler return false; } - if (params[1].asString() == "about") + const std::string verb = params[1].asString(); + if (verb == "about") { LLAvatarActions::showProfile(avatar_id); return true; } - if (params[1].asString() == "inspect") + if (verb == "inspect") { LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", avatar_id)); return true; } + + if (verb == "im") + { + LLAvatarActions::startIM(avatar_id); + return true; + } + + if (verb == "pay") + { + LLAvatarActions::pay(avatar_id); + return true; + } + + if (verb == "offerteleport") + { + LLAvatarActions::offerTeleport(avatar_id); + return true; + } + + if (verb == "requestfriend") + { + LLAvatarActions::requestFriendshipDialog(avatar_id); + return true; + } + + if (verb == "mute") + { + if (! LLAvatarActions::isBlocked(avatar_id)) + { + LLAvatarActions::toggleBlock(avatar_id); + } + return true; + } + + if (verb == "unmute") + { + if (LLAvatarActions::isBlocked(avatar_id)) + { + LLAvatarActions::toggleBlock(avatar_id); + } + return true; + } + return false; } }; -- GitLab From 9109809fb18968edfcd8e8f01428309fcc2e7578 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Tue, 3 Nov 2009 12:22:31 -0500 Subject: [PATCH 063/306] For EXT-1591: Current Outfit Folder contains duplicate attachment items after relog. --HG-- branch : avatar-pipeline --- indra/newview/llagentwearables.cpp | 3 ++- indra/newview/llappearancemgr.cpp | 37 ++++++++++++++++++++++++++++++ indra/newview/llappearancemgr.h | 3 ++- indra/newview/llvoavatarself.cpp | 13 ----------- 4 files changed, 41 insertions(+), 15 deletions(-) diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 380469f5b36..d1d6e496b65 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -2014,7 +2014,8 @@ void LLInitialWearablesFetch::done() LLFindWearables is_wearable; gInventory.collectDescendentsIf(mCompleteFolders.front(), cat_array, wearable_array, LLInventoryModel::EXCLUDE_TRASH, is_wearable); - + + LLAppearanceManager::setAttachmentInvLinkEnable(true); if (wearable_array.count() > 0) { LLAppearanceManager::instance().updateAppearanceFromCOF(); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index c297f8db298..8d0f11e021e 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1181,6 +1181,14 @@ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& it std::set<LLUUID> LLAppearanceManager::sRegisteredAttachments; +bool LLAppearanceManager::sAttachmentInvLinkEnabled(false); + +/* static */ +void LLAppearanceManager::setAttachmentInvLinkEnable(bool val) +{ + llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl; + sAttachmentInvLinkEnabled = val; +} void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg) { @@ -1204,6 +1212,22 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id) { sRegisteredAttachments.insert(item_id); dumpAttachmentSet(sRegisteredAttachments,"after register:"); + + if (sAttachmentInvLinkEnabled) + { + LLViewerInventoryItem *item = gInventory.getItem(item_id); + if (item) + { + LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:"); + LLAppearanceManager::wearItem(item,false); // Add COF link for item. + gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); + gInventory.notifyObservers(); + } + } + else + { + llinfos << "no link changes, inv link not enabled" << llendl; + } } /* static */ @@ -1211,4 +1235,17 @@ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id) { sRegisteredAttachments.erase(item_id); dumpAttachmentSet(sRegisteredAttachments,"after unregister:"); + + if (sAttachmentInvLinkEnabled) + { + LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:"); + LLAppearanceManager::removeItemLinks(item_id, false); + // BAP - needs to change for label to track link. + gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); + gInventory.notifyObservers(); + } + else + { + llinfos << "no link changes, inv link not enabled" << llendl; + } } diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 45c6e23bae7..56f54dfc23d 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -70,7 +70,7 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager> static void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg); static void unregisterAttachment(const LLUUID& item_id); static void registerAttachment(const LLUUID& item_id); - + static void setAttachmentInvLinkEnable(bool val); private: static void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type); @@ -99,6 +99,7 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager> static void purgeCategory(const LLUUID& category, bool keep_outfit_links); static std::set<LLUUID> sRegisteredAttachments; + static bool sAttachmentInvLinkEnabled; }; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 44fd81f0d17..a964f431719 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1081,15 +1081,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view { const LLUUID& attachment_id = viewer_object->getItemID(); LLAppearanceManager::registerAttachment(attachment_id); - LLViewerInventoryItem *item = gInventory.getItem(attachment_id); - if (item) - { - LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:"); - LLAppearanceManager::wearItem(item,false); // Add COF link for item. - gInventory.addChangedMask(LLInventoryObserver::LABEL, attachment_id); - } } - gInventory.notifyObservers(); return attachment; } @@ -1127,14 +1119,9 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object) } else { - LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:"); - LLAppearanceManager::removeItemLinks(attachment_id, false); LLAppearanceManager::unregisterAttachment(attachment_id); } - // BAP - needs to change for label to track link. - gInventory.addChangedMask(LLInventoryObserver::LABEL, attachment_id); - gInventory.notifyObservers(); return TRUE; } return FALSE; -- GitLab From 7b4a5d7ba8457bcab2fd371a48e10fa21c52d7fd Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Tue, 3 Nov 2009 19:38:53 +0200 Subject: [PATCH 064/306] EXT-1976 Voice indicator in Nearby Chat entry field is active during a private call. Cause: Nearbychat bar had used LLActiveSpeakerMgr instead of LLlocalSpeakerMgr. --HG-- branch : product-engine --- indra/newview/llnearbychatbar.cpp | 5 +++-- indra/newview/llnearbychatbar.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 32dc5e59278..10a5a415ce9 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -207,6 +207,7 @@ LLNearbyChatBar::LLNearbyChatBar() : LLPanel() , mChatBox(NULL) { + mSpeakerMgr = LLLocalSpeakerMgr::getInstance(); } //virtual @@ -516,8 +517,8 @@ void LLNearbyChatBar::displaySpeakingIndicator() LLUUID id; id.setNull(); - mSpeakerMgr.update(TRUE); - mSpeakerMgr.getSpeakerList(&speaker_list, FALSE); + mSpeakerMgr->update(TRUE); + mSpeakerMgr->getSpeakerList(&speaker_list, FALSE); for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i) { diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index 06204e6367b..0307eee7bf0 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -127,7 +127,7 @@ class LLNearbyChatBar LLLineEditor* mChatBox; LLTalkButton* mTalkBtn; LLOutputMonitorCtrl* mOutputMonitor; - LLActiveSpeakerMgr mSpeakerMgr; + LLLocalSpeakerMgr* mSpeakerMgr; }; #endif -- GitLab From fd3a9fb152dd7bd828d56efb535d0d08330fc2b9 Mon Sep 17 00:00:00 2001 From: Eugene Mutavchi <emutavchi@productengine.com> Date: Tue, 3 Nov 2009 19:47:26 +0200 Subject: [PATCH 065/306] Fixed major bug EXT-2007 (Friends Conference: Names of partisipants are invisible) --HG-- branch : product-engine --- .../skins/default/xui/en/floater_im_session.xml | 10 +++++----- .../skins/default/xui/en/panel_adhoc_control_panel.xml | 5 +++-- .../skins/default/xui/en/panel_group_control_panel.xml | 6 +++--- .../skins/default/xui/en/panel_im_control_panel.xml | 2 +- 4 files changed, 12 insertions(+), 11 deletions(-) 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 c4324b425a9..cdcee9ab641 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -12,13 +12,13 @@ can_dock="true" can_minimize="true" visible="true" - width="365" + width="400" can_resize="true" min_width="200" min_height="150"> <layout_stack follows="left|top|right|bottom" height="305" - width="365" + width="400" layout="topleft" orientation="horizontal" name="im_panels" @@ -34,7 +34,7 @@ auto_resize="false" user_resize="false" /> <layout_panel height="305" - width="200" + width="235" left_delta="146" top="0" user_resize="false"> @@ -61,9 +61,9 @@ name="chat_history" parse_highlights="true" allow_html="true" - width="195"> + width="230"> </chat_history> - <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="190"> + <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="225"> </line_editor> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml index f50acc224f0..87c4e2787f4 100644 --- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="panel_im_control_panel" - width="146" + width="180" height="215" border="false"> <avatar_list @@ -16,10 +16,11 @@ show_info_btn="false" show_profile_btn="false" top="10" - width="140" /> + width="180" /> <button name="call_btn" label="Call" + left_delta="27" width="125" height="20" /> <button diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index 9ed510dff3e..3358015335d 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="panel_im_control_panel" - width="146" + width="180" height="238" border="false"> <avatar_list @@ -16,11 +16,11 @@ show_info_btn="false" show_profile_btn="false" top="10" - width="140" /> + width="180" /> <button name="group_info_btn" label="Group Info" - left_delta="3" + left_delta="27" width="125" height="20" /> <button 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 04ee1a19cb1..1831f58e199 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 @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="panel_im_control_panel" - width="125" + width="128" height="298" border="false"> -- GitLab From e299bea7e92dadbda09fb33339a04000e679aa2e Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Tue, 3 Nov 2009 12:59:10 -0500 Subject: [PATCH 066/306] Added missing llinventorypanel files from previous checkin. --HG-- branch : avatar-pipeline --- indra/newview/llinventorypanel.cpp | 888 +++++++++++++++++++++++++++++ indra/newview/llinventorypanel.h | 206 +++++++ 2 files changed, 1094 insertions(+) create mode 100644 indra/newview/llinventorypanel.cpp create mode 100644 indra/newview/llinventorypanel.h diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp new file mode 100644 index 00000000000..c17a035503b --- /dev/null +++ b/indra/newview/llinventorypanel.cpp @@ -0,0 +1,888 @@ +/** + * @file llfloaterinventory.cpp + * @brief Implementation of the inventory view and associated stuff. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include <utility> // for std::pair<> + +#include "llinventorypanel.h" + +// Seraph TODO: Remove unnecessary headers + +// library includes +#include "llagent.h" +#include "llagentwearables.h" +#include "llcallingcard.h" +#include "llfloaterreg.h" +#include "llsdserialize.h" +#include "llfiltereditor.h" +#include "llspinctrl.h" +#include "llui.h" +#include "message.h" + +// newview includes +#include "llappearancemgr.h" +#include "llappviewer.h" +#include "llfirstuse.h" +#include "llfloaterchat.h" +#include "llfloatercustomize.h" +#include "llfocusmgr.h" +#include "llfolderview.h" +#include "llgesturemgr.h" +#include "lliconctrl.h" +#include "llimview.h" +#include "llinventorybridge.h" +#include "llinventoryclipboard.h" +#include "llinventorymodel.h" +#include "lllineeditor.h" +#include "llmenugl.h" +#include "llpreviewanim.h" +#include "llpreviewgesture.h" +#include "llpreviewnotecard.h" +#include "llpreviewscript.h" +#include "llpreviewsound.h" +#include "llpreviewtexture.h" +#include "llresmgr.h" +#include "llscrollbar.h" +#include "llscrollcontainer.h" +#include "llselectmgr.h" +#include "lltabcontainer.h" +#include "lltooldraganddrop.h" +#include "lluictrlfactory.h" +#include "llviewerinventory.h" +#include "llviewermessage.h" +#include "llviewerobjectlist.h" +#include "llviewerregion.h" +#include "llviewerwindow.h" +#include "llvoavatarself.h" +#include "llwearablelist.h" + +static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel"); + +const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder"); +const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder"); +const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string(""); +static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER; + +LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) : + LLPanel(p), + mInventoryObserver(NULL), + mFolders(NULL), + mScroller(NULL), + mSortOrderSetting(p.sort_order_setting), + mInventory(p.inventory), + mAllowMultiSelect(p.allow_multi_select), + mHasInventoryConnection(false), + mStartFolderString(p.start_folder), + mBuildDefaultHierarchy(true), + mInvFVBridgeBuilder(NULL) +{ + mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER; + + // contex menu callbacks + mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); + mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2)); + mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2)); + mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this)); + + setBackgroundColor(LLUIColorTable::instance().getColor("InventoryBackgroundColor")); + setBackgroundVisible(TRUE); + setBackgroundOpaque(TRUE); +} + +BOOL LLInventoryPanel::postBuild() +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD); + + mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves + + // create root folder + { + LLRect folder_rect(0, + 0, + getRect().getWidth(), + 0); + LLFolderView::Params p; + p.name = getName(); + p.rect = folder_rect; + p.parent_panel = this; + mFolders = LLUICtrlFactory::create<LLFolderView>(p); + mFolders->setAllowMultiSelect(mAllowMultiSelect); + } + + mCommitCallbackRegistrar.popScope(); + + mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); + + // scroller + { + LLRect scroller_view_rect = getRect(); + scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom); + LLScrollContainer::Params p; + p.name("Inventory Scroller"); + p.rect(scroller_view_rect); + p.follows.flags(FOLLOWS_ALL); + p.reserve_scroll_corner(true); + p.tab_stop(true); + mScroller = LLUICtrlFactory::create<LLScrollContainer>(p); + } + addChild(mScroller); + mScroller->addChild(mFolders); + + mFolders->setScrollContainer(mScroller); + + // set up the callbacks from the inventory we're viewing, and then + // build everything. + mInventoryObserver = new LLInventoryPanelObserver(this); + mInventory->addObserver(mInventoryObserver); + + // determine the root folder, if any, so inventory contents show just the children + // of that folder (i.e. not including the folder itself). + const LLAssetType::EType preferred_type = LLAssetType::lookupHumanReadable(mStartFolderString); + + if ("inventory" == mStartFolderString) + { + mStartFolderID = gInventory.getRootFolderID(); + } + else if ("library" == mStartFolderString) + { + mStartFolderID = gInventory.getLibraryRootFolderID(); + } + else + { + mStartFolderID = (preferred_type != LLAssetType::AT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); + } + + // build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback + if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection) + { + rebuildViewsFor(mStartFolderID); + mHasInventoryConnection = true; + } + + // bit of a hack to make sure the inventory is open. + mFolders->openFolder(preferred_type != LLAssetType::AT_NONE ? LLAssetType::lookupCategoryName(preferred_type) : "My Inventory"); + + if (mSortOrderSetting != INHERIT_SORT_ORDER) + { + setSortOrder(gSavedSettings.getU32(mSortOrderSetting)); + } + else + { + setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER)); + } + mFolders->setSortOrder(mFolders->getFilter()->getSortOrder()); + + return TRUE; +} + +LLInventoryPanel::~LLInventoryPanel() +{ + // should this be a global setting? + if (mFolders) + { + U32 sort_order = mFolders->getSortOrder(); + if (mSortOrderSetting != INHERIT_SORT_ORDER) + { + gSavedSettings.setU32(mSortOrderSetting, sort_order); + } + } + + // LLView destructor will take care of the sub-views. + mInventory->removeObserver(mInventoryObserver); + delete mInventoryObserver; + mScroller = NULL; +} + +LLMemType mt(LLMemType::MTYPE_INVENTORY_FROM_XML); // ! BUG ! Should this be removed? +void LLInventoryPanel::draw() +{ + // select the desired item (in case it wasn't loaded when the selection was requested) + mFolders->updateSelection(); + LLPanel::draw(); +} + +LLInventoryFilter* LLInventoryPanel::getFilter() +{ + if (mFolders) return mFolders->getFilter(); + return NULL; +} + +void LLInventoryPanel::setFilterTypes(U64 filter_types, BOOL filter_for_categories) +{ + mFolders->getFilter()->setFilterTypes(filter_types, filter_for_categories); +} + +void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask) +{ + mFolders->getFilter()->setFilterPermissions(filter_perm_mask); +} + +void LLInventoryPanel::setFilterSubString(const std::string& string) +{ + mFolders->getFilter()->setFilterSubString(string); +} + +void LLInventoryPanel::setSortOrder(U32 order) +{ + mFolders->getFilter()->setSortOrder(order); + if (mFolders->getFilter()->isModified()) + { + mFolders->setSortOrder(order); + // try to keep selection onscreen, even if it wasn't to start with + mFolders->scrollToShowSelection(); + } +} + +void LLInventoryPanel::setSinceLogoff(BOOL sl) +{ + mFolders->getFilter()->setDateRangeLastLogoff(sl); +} + +void LLInventoryPanel::setHoursAgo(U32 hours) +{ + mFolders->getFilter()->setHoursAgo(hours); +} + +void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show) +{ + mFolders->getFilter()->setShowFolderState(show); +} + +LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState() +{ + return mFolders->getFilter()->getShowFolderState(); +} + +static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh"); + +void LLInventoryPanel::modelChanged(U32 mask) +{ + LLFastTimer t2(FTM_REFRESH); + + bool handled = false; + + // inventory just initialized, do complete build + if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection) + { + rebuildViewsFor(mStartFolderID); + mHasInventoryConnection = true; + return; + } + + if(mask & LLInventoryObserver::LABEL) + { + handled = true; + // label change - empty out the display name for each object + // in this change set. + const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); + std::set<LLUUID>::const_iterator id_it = changed_items.begin(); + std::set<LLUUID>::const_iterator id_end = changed_items.end(); + LLFolderViewItem* view = NULL; + LLInvFVBridge* bridge = NULL; + for (;id_it != id_end; ++id_it) + { + view = mFolders->getItemByID(*id_it); + if(view) + { + // request refresh on this item (also flags for filtering) + bridge = (LLInvFVBridge*)view->getListener(); + if(bridge) + { // Clear the display name first, so it gets properly re-built during refresh() + bridge->clearDisplayName(); + } + view->refresh(); + } + } + } + if((mask & (LLInventoryObserver::STRUCTURE + | LLInventoryObserver::ADD + | LLInventoryObserver::REMOVE)) != 0) + { + handled = true; + // Record which folders are open by uuid. + LLInventoryModel* model = getModel(); + if (model) + { + const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); + + std::set<LLUUID>::const_iterator id_it = changed_items.begin(); + std::set<LLUUID>::const_iterator id_end = changed_items.end(); + for (;id_it != id_end; ++id_it) + { + // sync view with model + LLInventoryObject* model_item = model->getObject(*id_it); + LLFolderViewItem* view_item = mFolders->getItemByID(*id_it); + + if (model_item) + { + if (!view_item) + { + // this object was just created, need to build a view for it + if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD) + { + llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl; + } + buildNewViews(*id_it); + + // select any newly created object + // that has the auto rename at top of folder + // root set + if(mFolders->getRoot()->needsAutoRename()) + { + setSelection(*id_it, FALSE); + } + } + else + { + // this object was probably moved, check its parent + if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE) + { + llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << llendl; + } + + LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID()); + + // added check against NULL for cases when Inventory panel contains startFolder. + // in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself. + // this check is a fix for bug EXT-1859. + if (NULL != new_parent && view_item->getParentFolder() != new_parent) + { + view_item->getParentFolder()->extractItem(view_item); + view_item->addToFolder(new_parent, mFolders); + } + } + } + else + { + if (view_item) + { + if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE) + { + llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl; + } + // item in view but not model, need to delete view + view_item->destroyView(); + } + else + { + llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl; + } + } + } + } + } + + if (!handled) + { + // it's a small change that only requires a refresh. + // *TODO: figure out a more efficient way to do the refresh + // since it is expensive on large inventories + mFolders->refresh(); + } +} + + +void LLInventoryPanel::rebuildViewsFor(const LLUUID& id) +{ + LLFolderViewItem* old_view = NULL; + + // get old LLFolderViewItem + old_view = mFolders->getItemByID(id); + if (old_view && id.notNull()) + { + old_view->destroyView(); + } + + buildNewViews(id); +} + +void LLInventoryPanel::buildNewViews(const LLUUID& id) +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS); + LLFolderViewItem* itemp = NULL; + LLInventoryObject* objectp = NULL; + + // Don't add the start folder (the inventory panel will show contents + // beginning with the children of the starting folder, excluding the starting folder itself). + if (id != mStartFolderID) + { + objectp = gInventory.getObject(id); + if (objectp) + { + const LLUUID &parent_id = objectp->getParentUUID(); + // If this item's parent is the starting folder, then just add it to the top level (recall that + // the starting folder isn't actually represented in the view, parent_folder would be NULL in + // this case otherwise). + LLFolderViewFolder* parent_folder = (parent_id == mStartFolderID ? + mFolders : (LLFolderViewFolder*)mFolders->getItemByID(parent_id)); + + // This item exists outside the inventory's hierarchy, so don't add it. + if (!parent_folder) + { + return; + } + + if (objectp->getType() <= LLAssetType::AT_NONE || + objectp->getType() >= LLAssetType::AT_COUNT) + { + llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << + ((S32) objectp->getType()) << llendl; + return; + } + + if (objectp->getType() == LLAssetType::AT_CATEGORY && + objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) + { + LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(), + objectp->getType(), + LLInventoryType::IT_CATEGORY, + this, + objectp->getUUID()); + + if (new_listener) + { + LLFolderViewFolder::Params p; + p.name = new_listener->getDisplayName(); + p.icon = new_listener->getIcon(); + p.root = mFolders; + p.listener = new_listener; + LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p); + + folderp->setItemSortOrder(mFolders->getSortOrder()); + itemp = folderp; + } + } + else + { + // Build new view for item + LLInventoryItem* item = (LLInventoryItem*)objectp; + LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(), + item->getActualType(), + item->getInventoryType(), + this, + item->getUUID(), + item->getFlags()); + + if (new_listener) + { + LLFolderViewItem::Params params; + params.name(new_listener->getDisplayName()); + params.icon(new_listener->getIcon()); + params.creation_date(new_listener->getCreationDate()); + params.root(mFolders); + params.listener(new_listener); + params.rect(LLRect (0, 0, 0, 0)); + itemp = LLUICtrlFactory::create<LLFolderViewItem> (params); + } + } + + if (itemp) + { + itemp->addToFolder(parent_folder, mFolders); + } + } + } + + // If this is a folder, add the children of the folder and recursively add any + // child folders. + if ((id == mStartFolderID) || + (objectp && objectp->getType() == LLAssetType::AT_CATEGORY)) + { + LLViewerInventoryCategory::cat_array_t* categories; + LLViewerInventoryItem::item_array_t* items; + + mInventory->lockDirectDescendentArrays(id, categories, items); + if(categories) + { + S32 count = categories->count(); + for(S32 i = 0; i < count; ++i) + { + LLInventoryCategory* cat = categories->get(i); + buildNewViews(cat->getUUID()); + } + } + if(items) + { + S32 count = items->count(); + for(S32 i = 0; i < count; ++i) + { + LLInventoryItem* item = items->get(i); + buildNewViews(item->getUUID()); + } + } + mInventory->unlockDirectDescendentArrays(id); + } +} + +struct LLConfirmPurgeData +{ + LLUUID mID; + LLInventoryModel* mModel; +}; + +class LLIsNotWorn : public LLInventoryCollectFunctor +{ +public: + LLIsNotWorn() {} + virtual ~LLIsNotWorn() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item) + { + return !gAgentWearables.isWearingItem(item->getUUID()); + } +}; + +class LLOpenFolderByID : public LLFolderViewFunctor +{ +public: + LLOpenFolderByID(const LLUUID& id) : mID(id) {} + virtual ~LLOpenFolderByID() {} + virtual void doFolder(LLFolderViewFolder* folder) + { + if (folder->getListener() && folder->getListener()->getUUID() == mID) folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); + } + virtual void doItem(LLFolderViewItem* item) {} +protected: + const LLUUID& mID; +}; + + +void LLInventoryPanel::openSelected() +{ + LLFolderViewItem* folder_item = mFolders->getCurSelectedItem(); + if(!folder_item) return; + LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener(); + if(!bridge) return; + bridge->openItem(); +} + +BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask) +{ + BOOL handled = LLView::handleHover(x, y, mask); + if(handled) + { + ECursorType cursor = getWindow()->getCursor(); + if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW) + { + // replace arrow cursor with arrow and hourglass cursor + getWindow()->setCursor(UI_CURSOR_WORKING); + } + } + else + { + getWindow()->setCursor(UI_CURSOR_ARROW); + } + return TRUE; +} + +BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg) +{ + + BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); + + if (handled) + { + mFolders->setDragAndDropThisFrame(); + } + + return handled; +} + +void LLInventoryPanel::onFocusLost() +{ + // inventory no longer handles cut/copy/paste/delete + if (LLEditMenuHandler::gEditMenuHandler == mFolders) + { + LLEditMenuHandler::gEditMenuHandler = NULL; + } + + LLPanel::onFocusLost(); +} + +void LLInventoryPanel::onFocusReceived() +{ + // inventory now handles cut/copy/paste/delete + LLEditMenuHandler::gEditMenuHandler = mFolders; + + LLPanel::onFocusReceived(); +} + + +void LLInventoryPanel::openAllFolders() +{ + mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); + mFolders->arrangeAll(); +} + +void LLInventoryPanel::openDefaultFolderForType(LLAssetType::EType type) +{ + LLUUID category_id = mInventory->findCategoryUUIDForType(type); + LLOpenFolderByID opener(category_id); + mFolders->applyFunctorRecursively(opener); +} + +void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus) +{ + // Don't select objects in COF (e.g. to prevent refocus when items are worn). + const LLInventoryObject *obj = gInventory.getObject(obj_id); + if (obj && obj->getParentUUID() == LLAppearanceManager::getCOF()) + { + return; + } + mFolders->setSelectionByID(obj_id, take_keyboard_focus); +} + +void LLInventoryPanel::clearSelection() +{ + mFolders->clearSelection(); +} + +void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action) +{ + LLFolderView* fv = getRootFolder(); + if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename + { + fv->setNeedsAutoRename(FALSE); + if (items.size()) // new asset is visible and selected + { + fv->startRenamingSelectedItem(); + } + } + // Seraph - Put determineFolderType in here for ensemble typing? +} + +//---------------------------------------------------------------------------- + +void LLInventoryPanel::doToSelected(const LLSD& userdata) +{ + mFolders->doToSelected(&gInventory, userdata); +} + +void LLInventoryPanel::doCreate(const LLSD& userdata) +{ + menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata); +} + +bool LLInventoryPanel::beginIMSession() +{ + std::set<LLUUID> selected_items; + mFolders->getSelectionList(selected_items); + + std::string name; + static int session_num = 1; + + LLDynamicArray<LLUUID> members; + EInstantMessage type = IM_SESSION_CONFERENCE_START; + + std::set<LLUUID>::const_iterator iter; + for (iter = selected_items.begin(); iter != selected_items.end(); iter++) + { + + LLUUID item = *iter; + LLFolderViewItem* folder_item = mFolders->getItemByID(item); + + if(folder_item) + { + LLFolderViewEventListener* fve_listener = folder_item->getListener(); + if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY)) + { + + LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener(); + if(!bridge) return true; + LLViewerInventoryCategory* cat = bridge->getCategory(); + if(!cat) return true; + name = cat->getName(); + LLUniqueBuddyCollector is_buddy; + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + gInventory.collectDescendentsIf(bridge->getUUID(), + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_buddy); + S32 count = item_array.count(); + if(count > 0) + { + LLFloaterReg::showInstance("communicate"); + // create the session + LLAvatarTracker& at = LLAvatarTracker::instance(); + LLUUID id; + for(S32 i = 0; i < count; ++i) + { + id = item_array.get(i)->getCreatorUUID(); + if(at.isBuddyOnline(id)) + { + members.put(id); + } + } + } + } + else + { + LLFolderViewItem* folder_item = mFolders->getItemByID(item); + if(!folder_item) return true; + LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener(); + + if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD) + { + LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID()); + + if (inv_item) + { + LLAvatarTracker& at = LLAvatarTracker::instance(); + LLUUID id = inv_item->getCreatorUUID(); + + if(at.isBuddyOnline(id)) + { + members.put(id); + } + } + } //if IT_CALLINGCARD + } //if !IT_CATEGORY + } + } //for selected_items + + // the session_id is randomly generated UUID which will be replaced later + // with a server side generated number + + if (name.empty()) + { + name = llformat("Session %d", session_num++); + } + + gIMMgr->addSession(name, type, members[0], members); + + return true; +} + +bool LLInventoryPanel::attachObject(const LLSD& userdata) +{ + std::set<LLUUID> selected_items; + mFolders->getSelectionList(selected_items); + + std::string joint_name = userdata.asString(); + LLVOAvatar *avatarp = static_cast<LLVOAvatar*>(gAgent.getAvatarObject()); + LLViewerJointAttachment* attachmentp = NULL; + for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); + iter != avatarp->mAttachmentPoints.end(); ) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter++; + LLViewerJointAttachment* attachment = curiter->second; + if (attachment->getName() == joint_name) + { + attachmentp = attachment; + break; + } + } + if (attachmentp == NULL) + { + return true; + } + + for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin(); + set_iter != selected_items.end(); + ++set_iter) + { + const LLUUID &id = *set_iter; + LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id); + if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID())) + { + rez_attachment(item, attachmentp); + } + else if(item && item->isComplete()) + { + // must be in library. copy it to our inventory and put it on. + LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp); + copy_inventory_item(gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + } + gFocusMgr.setKeyboardFocus(NULL); + + return true; +} + + +//---------------------------------------------------------------------------- + +// static DEBUG ONLY: +void LLInventoryPanel::dumpSelectionInformation(void* user_data) +{ + LLInventoryPanel* iv = (LLInventoryPanel*)user_data; + iv->mFolders->dumpSelectionInformation(); +} + +BOOL LLInventoryPanel::getSinceLogoff() +{ + return mFolders->getFilter()->isSinceLogoff(); +} + +void example_param_block_usage() +{ + LLInventoryPanel::Params param_block; + param_block.name(std::string("inventory")); + + param_block.sort_order_setting(LLInventoryPanel::RECENTITEMS_SORT_ORDER); + param_block.allow_multi_select(true); + param_block.filter(LLInventoryPanel::Filter() + .sort_order(1) + .types(0xffff0000)); + param_block.inventory(&gInventory); + param_block.has_border(true); + + LLUICtrlFactory::create<LLInventoryPanel>(param_block); + + param_block = LLInventoryPanel::Params(); + param_block.name(std::string("inventory")); + + //LLSD param_block_sd; + //param_block_sd["sort_order_setting"] = LLInventoryPanel::RECENTITEMS_SORT_ORDER; + //param_block_sd["allow_multi_select"] = true; + //param_block_sd["filter"]["sort_order"] = 1; + //param_block_sd["filter"]["types"] = (S32)0xffff0000; + //param_block_sd["has_border"] = true; + + //LLInitParam::LLSDParser(param_block_sd).parse(param_block); + + LLUICtrlFactory::create<LLInventoryPanel>(param_block); +} diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h new file mode 100644 index 00000000000..f958aaf839d --- /dev/null +++ b/indra/newview/llinventorypanel.h @@ -0,0 +1,206 @@ +/** + * @file llinventorypanel.h + * @brief LLInventoryPanel + * class definition + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLINVENTORYPANEL_H +#define LL_LLINVENTORYPANEL_H + +#include "llassetstorage.h" +#include "lldarray.h" +#include "llfloater.h" +#include "llinventory.h" +#include "llinventoryfilter.h" +#include "llfolderview.h" +#include "llinventorymodel.h" +#include "lluictrlfactory.h" +#include <set> + +class LLFolderViewItem; +class LLInventoryFilter; +class LLInventoryModel; +class LLInvFVBridge; +class LLInventoryFVBridgeBuilder; +class LLMenuBarGL; +class LLCheckBoxCtrl; +class LLSpinCtrl; +class LLScrollContainer; +class LLTextBox; +class LLIconCtrl; +class LLSaveFolderState; +class LLFilterEditor; +class LLTabContainer; + +class LLInventoryPanel : public LLPanel +{ +public: + static const std::string DEFAULT_SORT_ORDER; + static const std::string RECENTITEMS_SORT_ORDER; + static const std::string INHERIT_SORT_ORDER; + + struct Filter : public LLInitParam::Block<Filter> + { + Optional<U32> sort_order; + Optional<U32> types; + Optional<std::string> search_string; + + Filter() + : sort_order("sort_order"), + types("types", 0xffffffff), + search_string("search_string") + {} + }; + + struct Params + : public LLInitParam::Block<Params, LLPanel::Params> + { + Optional<std::string> sort_order_setting; + Optional<LLInventoryModel*> inventory; + Optional<bool> allow_multi_select; + Optional<Filter> filter; + Optional<std::string> start_folder; + + Params() + : sort_order_setting("sort_order_setting"), + inventory("", &gInventory), + allow_multi_select("allow_multi_select", true), + filter("filter"), + start_folder("start_folder") + {} + }; + +protected: + LLInventoryPanel(const Params&); + friend class LLUICtrlFactory; + +public: + virtual ~LLInventoryPanel(); + + LLInventoryModel* getModel() { return mInventory; } + + BOOL postBuild(); + + // LLView methods + void draw(); + BOOL handleHover(S32 x, S32 y, MASK mask); + BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg); + // LLUICtrl methods + /*virtual*/ void onFocusLost(); + /*virtual*/ void onFocusReceived(); + + // Call this method to set the selection. + void openAllFolders(); + void openDefaultFolderForType(LLAssetType::EType); + void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus); + void setSelectCallback(const LLFolderView::signal_t::slot_type& cb) { if (mFolders) mFolders->setSelectCallback(cb); } + void clearSelection(); + LLInventoryFilter* getFilter(); + void setFilterTypes(U64 filter, BOOL filter_for_categories = FALSE); // if filter_for_categories is true, operate on folder preferred asset type + U32 getFilterTypes() const { return mFolders->getFilterTypes(); } + void setFilterPermMask(PermissionMask filter_perm_mask); + U32 getFilterPermMask() const { return mFolders->getFilterPermissions(); } + void setFilterSubString(const std::string& string); + const std::string getFilterSubString() { return mFolders->getFilterSubString(); } + void setSortOrder(U32 order); + U32 getSortOrder() { return mFolders->getSortOrder(); } + void setSinceLogoff(BOOL sl); + void setHoursAgo(U32 hours); + BOOL getSinceLogoff(); + + void setShowFolderState(LLInventoryFilter::EFolderShow show); + LLInventoryFilter::EFolderShow getShowFolderState(); + void setAllowMultiSelect(BOOL allow) { mFolders->setAllowMultiSelect(allow); } + // This method is called when something has changed about the inventory. + void modelChanged(U32 mask); + LLFolderView* getRootFolder() { return mFolders; } + LLScrollContainer* getScrollableContainer() { return mScroller; } + + void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); + + // Callbacks + void doToSelected(const LLSD& userdata); + void doCreate(const LLSD& userdata); + bool beginIMSession(); + bool attachObject(const LLSD& userdata); + + // DEBUG ONLY: + static void dumpSelectionInformation(void* user_data); + + void openSelected(); + void unSelectAll() { mFolders->setSelection(NULL, FALSE, FALSE); } + +protected: + // Given the id and the parent, build all of the folder views. + void rebuildViewsFor(const LLUUID& id); + virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719 + +protected: + LLInventoryModel* mInventory; + LLInventoryObserver* mInventoryObserver; + BOOL mAllowMultiSelect; + std::string mSortOrderSetting; + +//private: // Can not make these private - needed by llinventorysubtreepanel + LLFolderView* mFolders; + std::string mStartFolderString; + + /** + * Contains UUID of Inventory item from which hierarchy should be built. + * Can be set with the "start_folder" xml property. + * Default is LLUUID::null that means total Inventory hierarchy. + */ + LLUUID mStartFolderID; + LLScrollContainer* mScroller; + bool mHasInventoryConnection; + + /** + * Flag specified if default inventory hierarchy should be created in postBuild() + */ + bool mBuildDefaultHierarchy; + + LLUUID mRootInventoryItemUUID; + + /** + * Pointer to LLInventoryFVBridgeBuilder. + * + * It is set in LLInventoryPanel's constructor and can be overridden in derived classes with + * another implementation. + * Take into account it will not be deleted by LLInventoryPanel itself. + */ + const LLInventoryFVBridgeBuilder* mInvFVBridgeBuilder; + +}; + +#endif // LL_LLINVENTORYPANEL_H -- GitLab From ebfe3d93d99b9028bc04e0c0e8043b3dd2719971 Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Tue, 3 Nov 2009 20:04:57 +0200 Subject: [PATCH 067/306] implemented minor task EXT-1617 No need to expand all accordion panels in the My Landmarks --HG-- branch : product-engine --- indra/newview/llpanellandmarks.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index c9598a25768..704bc309ee5 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -615,19 +615,21 @@ void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const void LLLandmarksPanel::onFoldingAction(const LLSD& userdata) { - if(!mCurrentSelectedList) return; - - LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); + LLFolderView* landmarks_folder = mLandmarksInventoryPanel->getRootFolder(); + LLFolderView* fav_folder = mFavoritesInventoryPanel->getRootFolder(); std::string command_name = userdata.asString(); if ("expand_all" == command_name) { - root_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); - root_folder->arrangeAll(); + landmarks_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); + fav_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); + landmarks_folder->arrangeAll(); + fav_folder->arrangeAll(); } else if ("collapse_all" == command_name) { - root_folder->closeAllFolders(); + landmarks_folder->closeAllFolders(); + fav_folder->closeAllFolders(); } else if ( "sort_by_date" == command_name) { @@ -638,6 +640,9 @@ void LLLandmarksPanel::onFoldingAction(const LLSD& userdata) } else { + if(!mCurrentSelectedList) return; + + LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); root_folder->doToSelected(&gInventory, userdata); } } -- GitLab From 864594f68e20210d30d1d65b7350f173af13867a Mon Sep 17 00:00:00 2001 From: Sergey Borushevsky <sborushevsky@productengine.com> Date: Tue, 3 Nov 2009 20:05:57 +0200 Subject: [PATCH 068/306] Fixed normal bug EXT-2041 (Gestures toolbar button should be a button like move/view, not a dropdown). --HG-- branch : product-engine --- indra/newview/llnearbychatbar.cpp | 4 ++++ .../skins/default/xui/en/widgets/gesture_combo_box.xml | 10 +++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 10a5a415ce9..d7a5ff289c2 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -77,6 +77,10 @@ LLGestureComboBox::LLGestureComboBox(const LLGestureComboBox::Params& p) // refresh list from current active gestures refreshGestures(); + + // This forces using of halign from xml, since LLComboBox + // sets it to LLFontGL::LEFT, if text entry is disabled + mButton->setHAlign(p.drop_down_button.font_halign); } LLGestureComboBox::~LLGestureComboBox() diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml index ab4ad940893..6171be034f4 100644 --- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml @@ -15,14 +15,14 @@ image_disabled_selected="ComboButton_Disabled_Selected" /> <gesture_combo_box.drop_down_button name="Drop Down Button" label="" + halign="center" hover_glow_amount="0.15" font="SansSerif" scale_image="true" - pad_right="24" - image_unselected="DropDown_Off" - image_selected="DropDown_Selected" - image_disabled="DropDown_Disabled" - image_disabled_selected="DropDown_Disabled_Selected" /> + image_unselected="PushButton_Off" + image_selected="PushButton_Selected" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Selected_Disabled" /> <gesture_combo_box.combo_list bg_writeable_color="MenuDefaultBgColor" scroll_bar_bg_visible="true" /> <gesture_combo_box.combo_editor name="Combo Text Entry" -- GitLab From 73573688c550c8a1e9ab4822d92f33f3523778af Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Tue, 3 Nov 2009 13:32:31 -0500 Subject: [PATCH 069/306] Removed declared but never defined function, which was causing a build failure on Mac --HG-- branch : avatar-pipeline --- indra/newview/llsidepanelinventory.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 8a1b97695d1..5197a9bbc3e 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -47,9 +47,6 @@ static const std::string LANDMARK_INFO_TYPE = "landmark"; static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place"; static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history"; -// Helper functions -static void setAllChildrenVisible(LLView* view, BOOL visible); - static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); LLSidepanelInventory::LLSidepanelInventory() -- GitLab From 506738926d9eca873d8ebaf16af5184c2cc76b90 Mon Sep 17 00:00:00 2001 From: Lis Pardi <lis@lindenlab.com> Date: Tue, 3 Nov 2009 13:33:26 -0500 Subject: [PATCH 070/306] Ext-1766 about land --> object page titles crammed --- .../default/xui/en/floater_about_land.xml | 202 +++++++++--------- 1 file changed, 102 insertions(+), 100 deletions(-) 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 e13aa610e53..1efc5455549 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater - legacy_header_height="18" can_tear_off="false" height="420" layout="topleft" @@ -26,28 +25,24 @@ remaining </floater.string> <tab_container - follows="all" + follows="left|top|right|bottom" height="400" - halign="center" layout="topleft" - font="SansSerifSmall" left="1" - tab_padding_right="5" - tab_height="20" name="landtab" tab_position="top" top="20" width="459"> - <panel + <panel border="true" - follows="all" + follows="left|top|right|bottom" height="380" label="General" layout="topleft" left="1" help_topic="land_general_tab" name="land_general_panel" - top="0" + top="-31" width="458"> <panel.string name="new users only"> @@ -536,7 +531,7 @@ Go to World menu > About Land or select another parcel to show its details. </panel> <panel border="true" - follows="all" + follows="left|top|right|bottom" height="380" label="Covenant" layout="topleft" @@ -632,7 +627,7 @@ Go to World menu > About Land or select another parcel to show its details. length="1" enabled="false" follows="left|top|right|bottom" - handle_edit_keys_directly="true" + handle_edit_keys_directly="true" height="115" layout="topleft" left_delta="0" @@ -803,7 +798,7 @@ Go to World menu > About Land or select another parcel to show its details. </panel> <panel border="true" - follows="all" + follows="left|top|right|bottom" height="380" label="Objects" layout="topleft" @@ -854,7 +849,7 @@ Go to World menu > About Land or select another parcel to show its details. left_delta="152" name="objects_available" top_delta="0" - width="212"> + width="260"> [COUNT] out of [MAX] ([AVAILABLE] available) </text> <text @@ -875,7 +870,7 @@ Go to World menu > About Land or select another parcel to show its details. follows="left|top" height="16" layout="topleft" - left_delta="152" + left_delta="200" name="object_contrib_text" top_delta="0" width="212"> @@ -899,7 +894,7 @@ Go to World menu > About Land or select another parcel to show its details. follows="left|top" height="16" layout="topleft" - left_delta="152" + left_delta="200" name="total_objects_text" top_delta="0" width="48"> @@ -914,7 +909,7 @@ Go to World menu > About Land or select another parcel to show its details. left="28" name="Owned by parcel owner:" top="84" - width="128"> + width="176"> Owned by parcel owner: </text> <text @@ -923,7 +918,7 @@ Go to World menu > About Land or select another parcel to show its details. follows="left|top" height="16" layout="topleft" - left_delta="128" + left_delta="176" name="owner_objects_text" top_delta="0" width="48"> @@ -939,7 +934,7 @@ Go to World menu > About Land or select another parcel to show its details. label_selected="Show" layout="topleft" name="ShowOwner" - right="-190" + right="-140" width="60" /> <button bottom="100" @@ -951,7 +946,7 @@ Go to World menu > About Land or select another parcel to show its details. label_selected="Return..." layout="topleft" name="ReturnOwner..." - right="-60" + right="-10" tool_tip="Return objects to their owners." width="119" /> <text @@ -963,7 +958,7 @@ Go to World menu > About Land or select another parcel to show its details. left="28" name="Set to group:" top="104" - width="128"> + width="176"> Set to group: </text> <text @@ -972,7 +967,7 @@ Go to World menu > About Land or select another parcel to show its details. follows="left|top" height="16" layout="topleft" - left_delta="128" + left_delta="176" name="group_objects_text" top_delta="0" width="48"> @@ -988,7 +983,7 @@ Go to World menu > About Land or select another parcel to show its details. label_selected="Show" layout="topleft" name="ShowGroup" - right="-190" + right="-140" width="60" /> <button bottom="120" @@ -1000,7 +995,7 @@ Go to World menu > About Land or select another parcel to show its details. label_selected="Return..." layout="topleft" name="ReturnGroup..." - right="-60" + right="-10" tool_tip="Return objects to their owners." width="119" /> <text @@ -1012,7 +1007,7 @@ Go to World menu > About Land or select another parcel to show its details. left="28" name="Owned by others:" top="124" - width="128"> + width="176"> Owned by others: </text> <text @@ -1021,7 +1016,7 @@ Go to World menu > About Land or select another parcel to show its details. follows="left|top" height="16" layout="topleft" - left_delta="128" + left_delta="176" name="other_objects_text" top_delta="0" width="48"> @@ -1037,7 +1032,7 @@ Go to World menu > About Land or select another parcel to show its details. label_selected="Show" layout="topleft" name="ShowOther" - right="-190" + right="-140" width="60" /> <button bottom="140" @@ -1049,7 +1044,7 @@ Go to World menu > About Land or select another parcel to show its details. label_selected="Return..." layout="topleft" name="ReturnOther..." - right="-60" + right="-10" tool_tip="Return objects to their owners." width="119" /> <text @@ -1061,7 +1056,7 @@ Go to World menu > About Land or select another parcel to show its details. left="28" name="Selected / sat upon:" top="144" - width="128"> + width="176"> Selected / sat upon: </text> <text @@ -1070,7 +1065,7 @@ Go to World menu > About Land or select another parcel to show its details. follows="left|top" height="16" layout="topleft" - left_delta="128" + left_delta="176" name="selected_objects_text" top_delta="0" width="48"> @@ -1097,7 +1092,7 @@ Go to World menu > About Land or select another parcel to show its details. layout="topleft" max_length="6" name="clean other time" - right="-100" + right="-50" width="56" /> <text type="string" @@ -1169,7 +1164,7 @@ Go to World menu > About Land or select another parcel to show its details. </panel> <panel border="true" - follows="all" + follows="left|top|right|bottom" height="333" label="Options" layout="topleft" @@ -1605,15 +1600,16 @@ Only large parcels can be listed in search. value="Anywhere" /> </combo_box> </panel> - <panel + <panel border="true" - follows="all" + follows="left|top|right|bottom" height="363" label="Media" layout="topleft" left_delta="0" help_topic="land_media_tab" name="land_media_panel" + top_delta="1" width="458"> <text type="string" @@ -1624,22 +1620,24 @@ Only large parcels can be listed in search. left="10" name="with media:" top="9" - width="100"> + width="65"> Type: </text> <combo_box - height="20" + height="18" layout="topleft" - left_pad="10" + left_pad="5" name="media type" tool_tip="Specify if the URL is a movie, web page, or other media" - width="150" /> + top_delta="-2" + width="120" /> <text follows="left|top" height="16" layout="topleft" left_pad="10" name="mime_type" + top_delta="2" width="200" /> <text type="string" @@ -1649,30 +1647,32 @@ Only large parcels can be listed in search. layout="topleft" left="10" name="at URL:" - top_pad="10" - width="100"> + top="29" + width="65"> Home URL: </text> <line_editor + bottom_delta="0" follows="left|top" - height="20" + height="16" layout="topleft" - left_pad="10" + left="80" max_length="255" name="media_url" + right="-80" select_on_focus="true" - width="270" - /> + text_readonly_color="0.576471 0.662745 0.835294 1" /> <button follows="left|top" font="SansSerifSmall" - height="20" - label="Set" - label_selected="Set" + height="16" + label="Set..." + label_selected="Set..." layout="topleft" - left_pad="5" + left_pad="8" name="set_media_url" - width="50" /> + top_delta="0" + width="60" /> <text type="string" length="1" @@ -1681,34 +1681,37 @@ Only large parcels can be listed in search. layout="topleft" left="10" name="CurrentURL:" - top_pad="10" - width="100"> + top="49" + width="65"> Current URL: </text> <text follows="left|top" height="16" layout="topleft" - left_pad="10" + left_pad="5" name="current_url" - width="260">http://</text> + top_delta="0" + width="300" /> <button follows="left|top" - height="20" - label="Reset" - label_selected="Reset" + font="SansSerifSmall" + height="16" + label="Reset..." + label_selected="Reset..." layout="topleft" left_pad="6" name="reset_media_url" + top_delta="0" width="60" /> <check_box height="16" label="Hide URL" layout="topleft" - left="120" + left="100" name="hide_media_url" tool_tip="Checking this option will hide the media url to any non-authorized viewers of this parcel information. Note this is not available for HTML types." - top_pad="2" + top="89" width="200" /> <text type="string" @@ -1718,20 +1721,23 @@ Only large parcels can be listed in search. layout="topleft" left="10" name="Description:" - top_pad="10" - width="100"> + top="49" + width="364"> Description: </text> <line_editor + border_style="line" + border_thickness="1" + bottom_delta="0" follows="left|top" - height="35" + height="16" layout="topleft" + left="80" + max_length="255" name="url_description" - left_pad="10" + right="-80" select_on_focus="true" - tool_tip="Text displayed next to play/load button" - top_delta="0" - width="270" /> + tool_tip="Text displayed next to play/load button" /> <text type="string" length="1" @@ -1740,9 +1746,10 @@ Only large parcels can be listed in search. layout="topleft" left="10" name="Media texture:" - top_pad="10" - width="100"> - Replace Texture: + top="69" + width="364"> + Replace +Texture: </text> <texture_picker allow_no_texture="true" @@ -1750,7 +1757,7 @@ Only large parcels can be listed in search. follows="left|top" height="80" layout="topleft" - left_pad="10" + left_delta="70" name="media texture" tool_tip="Click to choose a picture" top_delta="0" @@ -1759,22 +1766,25 @@ Only large parcels can be listed in search. type="string" length="1" follows="left|top" - height="50" + height="16" layout="topleft" - left_pad="10" + left_delta="75" name="replace_texture_help" - top_delta="0" - word_wrap="true" - width="240"> - Objects using this texture will show the movie or web page after you click the play arrow. + top="85" + width="270"> + Objects using this texture will show the movie or + web page after you click the play arrow. + + Select the thumbnail to choose a different texture. </text> <check_box height="16" label="Auto scale" layout="topleft" + left_delta="70" name="media_auto_scale" tool_tip="Checking this option will scale the content for this parcel automatically. It may be slightly slower and lower quality visually but no other texture scaling or alignment will be required." - top_pad="3" + top_delta="0" width="200" /> <text type="string" @@ -1782,11 +1792,11 @@ Only large parcels can be listed in search. follows="left|top" height="16" layout="topleft" - left="10" - top_pad="10" + left="85" name="media_size" tool_tip="Size to render Web media, leave 0 for default." - width="100"> + top="185" + width="85"> Size: </text> <spinner @@ -1798,22 +1808,12 @@ Only large parcels can be listed in search. increment="1" initial_value="0" layout="topleft" - left_pad="10" + left_delta="65" max_val="1024" name="media_size_width" tool_tip="Size to render Web media, leave 0 for default." top_delta="0" width="64" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_pad="5" - name="pixels"> - px wide - </text> <spinner decimal_digits="0" enabled="false" @@ -1823,21 +1823,23 @@ Only large parcels can be listed in search. increment="1" initial_value="0" layout="topleft" - left="120" - top_pad="3" + left_pad="16" max_val="1024" name="media_size_height" tool_tip="Size to render Web media, leave 0 for default." + top_delta="0" width="64" /> <text type="string" length="1" + bottom_delta="0" follows="left|top" height="16" layout="topleft" - left_pad="5" - name="pixels"> - px high + left_delta="70" + name="pixels" + right="-10"> + pixels </text> <text type="string" @@ -1847,15 +1849,15 @@ Only large parcels can be listed in search. layout="topleft" left="10" name="Options:" - top_pad="10" - width="100"> + top="237" + width="292"> Options: </text> <check_box height="16" label="Loop" layout="topleft" - left_pad="10" + left_delta="70" name="media_loop" tool_tip="Play media in a loop. When the media has finished playing, it will restart from the beginning." top_delta="0" @@ -1863,9 +1865,9 @@ Only large parcels can be listed in search. </panel> <panel border="true" - follows="all" + follows="left|top|right|bottom" height="363" - label="Sound" + label="Audio" layout="topleft" left_delta="0" help_topic="land_audio_tab" @@ -1967,7 +1969,7 @@ Only large parcels can be listed in search. </panel> <panel border="true" - follows="all" + follows="left|top|right|bottom" height="333" label="Access" layout="topleft" -- GitLab From 1ceee1b80b4a1788581f9a59435c4901a99549ac Mon Sep 17 00:00:00 2001 From: Sergey Borushevsky <sborushevsky@productengine.com> Date: Tue, 3 Nov 2009 20:51:18 +0200 Subject: [PATCH 071/306] Fixed EXT-2025 (Gesture btn couses nothing) --HG-- branch : product-engine --- indra/newview/skins/default/xui/en/panel_bottomtray.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 61bd1d186e5..920593e7ae3 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -93,7 +93,7 @@ min_width="76" name="gesture_panel" user_resize="false"> - <button + <gesture_combo_box follows="right" height="23" label="Gesture" -- GitLab From 90f03ea00b0db2de6a09f176c634ae8836a404e8 Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Tue, 3 Nov 2009 20:57:55 +0200 Subject: [PATCH 072/306] rollback changes after commit fcc1a5f44ee8 --HG-- branch : product-engine --- indra/integration_tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/integration_tests/CMakeLists.txt b/indra/integration_tests/CMakeLists.txt index 664a3ee853c..67e8fbf1f2c 100644 --- a/indra/integration_tests/CMakeLists.txt +++ b/indra/integration_tests/CMakeLists.txt @@ -1,3 +1,3 @@ # -*- cmake -*- -#add_subdirectory(llui_libtest) +add_subdirectory(llui_libtest) -- GitLab From 5884c2fa4c01a959edaf68a4197c9d1913899d17 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Tue, 3 Nov 2009 13:58:08 -0500 Subject: [PATCH 073/306] EXT-2131 : object properties sidepanel EXT-2128 : remove multi-properties ability, disable from inventory menu Also includes llsidepanelinventory cleanup. --HG-- branch : avatar-pipeline --- indra/newview/llinventorybridge.cpp | 6 + indra/newview/llpanelobjectinventory.cpp | 3818 +++++++++++----------- indra/newview/llsidepanelinventory.cpp | 523 ++- indra/newview/llsidepanelinventory.h | 165 +- 4 files changed, 2246 insertions(+), 2266 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 336025e55ee..b9775cf0e9c 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -604,6 +604,12 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, { disabled_items.push_back(std::string("Delete")); } + + // If multiple items are selected, disable properties (if it exists). + if ((flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Properties")); + } } void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 365a6e632fa..63fad7ddfdb 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1,1905 +1,1913 @@ -/** - * @file llsidepanelinventory.cpp - * @brief LLPanelObjectInventory class implementation - * - * $LicenseInfo:firstyear=2002&license=viewergpl$ - * - * Copyright (c) 2002-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -//***************************************************************************** -// -// Implementation of the panel inventory - used to view and control a -// task's inventory. -// -//***************************************************************************** - -#include "llviewerprecompiledheaders.h" - -#include "llpanelobjectinventory.h" - -#include "roles_constants.h" - -#include "llagent.h" -#include "llcallbacklist.h" -#include "llfloaterbuycurrency.h" -#include "llfloaterreg.h" -#include "llinventorybridge.h" -#include "llinventoryfunctions.h" -#include "llpreviewanim.h" -#include "llpreviewgesture.h" -#include "llpreviewnotecard.h" -#include "llpreviewscript.h" -#include "llpreviewsound.h" -#include "llpreviewtexture.h" -#include "llscrollcontainer.h" -#include "llselectmgr.h" -#include "llstatusbar.h" -#include "lltrans.h" -#include "llviewerregion.h" -#include "llviewerobjectlist.h" -#include "llviewermessage.h" - - -///---------------------------------------------------------------------------- -/// Class LLTaskInvFVBridge -///---------------------------------------------------------------------------- - -class LLTaskInvFVBridge : public LLFolderViewEventListener -{ -protected: - LLUUID mUUID; - std::string mName; - mutable std::string mDisplayName; - LLPanelObjectInventory* mPanel; - U32 mFlags; - - LLInventoryItem* findItem() const; - -public: - LLTaskInvFVBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name, - U32 flags=0); - virtual ~LLTaskInvFVBridge( void ) {} - - virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; } - virtual std::string getLabelSuffix() const { return LLStringUtil::null; } - - static LLTaskInvFVBridge* createObjectBridge(LLPanelObjectInventory* panel, - LLInventoryObject* object); - void showProperties(); - void buyItem(); - S32 getPrice(); - static bool commitBuyItem(const LLSD& notification, const LLSD& response); - - // LLFolderViewEventListener functionality - virtual const std::string& getName() const; - virtual const std::string& getDisplayName() const; - virtual PermissionMask getPermissionMask() const { return PERM_NONE; } - /*virtual*/ LLAssetType::EType getPreferredType() const { return LLAssetType::AT_NONE; } - virtual const LLUUID& getUUID() const { return mUUID; } - virtual time_t getCreationDate() const; - virtual LLUIImagePtr getIcon() const; - virtual void openItem(); - virtual void closeItem() {} - virtual void previewItem(); - virtual void selectItem() {} - virtual BOOL isItemRenameable() const; - virtual BOOL renameItem(const std::string& new_name); - virtual BOOL isItemMovable() const; - virtual BOOL isItemRemovable(); - virtual BOOL removeItem(); - virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch); - virtual void move(LLFolderViewEventListener* parent_listener); - virtual BOOL isItemCopyable() const; - virtual BOOL copyToClipboard() const; - virtual void cutToClipboard(); - virtual BOOL isClipboardPasteable() const; - virtual void pasteFromClipboard(); - virtual void pasteLinkFromClipboard(); - virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); - virtual BOOL isUpToDate() const { return TRUE; } - virtual BOOL hasChildren() const { return FALSE; } - virtual LLInventoryType::EType getInventoryType() const { return LLInventoryType::IT_NONE; } - // LLDragAndDropBridge functionality - virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; - virtual BOOL dragOrDrop(MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data); -}; - -LLTaskInvFVBridge::LLTaskInvFVBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name, - U32 flags): - mUUID(uuid), - mName(name), - mPanel(panel), - mFlags(flags) -{ - -} - -LLInventoryItem* LLTaskInvFVBridge::findItem() const -{ - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if(object) - { - return (LLInventoryItem*)(object->getInventoryObject(mUUID)); - } - return NULL; -} - -void LLTaskInvFVBridge::showProperties() -{ - LLFloaterProperties* floater = LLFloaterReg::showTypedInstance<LLFloaterProperties>("properties", mUUID); - if (floater) - { - floater->setObjectID(mPanel->getTaskUUID()); - } -} - -struct LLBuyInvItemData -{ - LLUUID mTaskID; - LLUUID mItemID; - LLAssetType::EType mType; - - LLBuyInvItemData(const LLUUID& task, - const LLUUID& item, - LLAssetType::EType type) : - mTaskID(task), mItemID(item), mType(type) - {} -}; - -void LLTaskInvFVBridge::buyItem() -{ - llinfos << "LLTaskInvFVBridge::buyItem()" << llendl; - LLInventoryItem* item = findItem(); - if(!item || !item->getSaleInfo().isForSale()) return; - LLBuyInvItemData* inv = new LLBuyInvItemData(mPanel->getTaskUUID(), - mUUID, - item->getType()); - - const LLSaleInfo& sale_info = item->getSaleInfo(); - const LLPermissions& perm = item->getPermissions(); - const std::string owner_name; // no owner name currently... FIXME? - - LLViewerObject* obj; - if( ( obj = gObjectList.findObject( mPanel->getTaskUUID() ) ) && obj->isAttachment() ) - { - LLNotifications::instance().add("Cannot_Purchase_an_Attachment"); - llinfos << "Attempt to purchase an attachment" << llendl; - delete inv; - } - else - { - LLSD args; - args["PRICE"] = llformat("%d",sale_info.getSalePrice()); - args["OWNER"] = owner_name; - if (sale_info.getSaleType() != LLSaleInfo::FS_CONTENTS) - { - U32 next_owner_mask = perm.getMaskNextOwner(); - args["MODIFYPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo"); - args["COPYPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo"); - args["RESELLPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo"); - } - - std::string alertdesc; - switch(sale_info.getSaleType()) - { - case LLSaleInfo::FS_ORIGINAL: - alertdesc = owner_name.empty() ? "BuyOriginalNoOwner" : "BuyOriginal"; - break; - case LLSaleInfo::FS_CONTENTS: - alertdesc = owner_name.empty() ? "BuyContentsNoOwner" : "BuyContents"; - break; - case LLSaleInfo::FS_COPY: - default: - alertdesc = owner_name.empty() ? "BuyCopyNoOwner" : "BuyCopy"; - break; - } - - LLSD payload; - payload["task_id"] = inv->mTaskID; - payload["item_id"] = inv->mItemID; - payload["type"] = inv->mType; - LLNotifications::instance().add(alertdesc, args, payload, LLTaskInvFVBridge::commitBuyItem); - } -} - -S32 LLTaskInvFVBridge::getPrice() -{ - LLInventoryItem* item = findItem(); - if(item) - { - return item->getSaleInfo().getSalePrice(); - } - else - { - return -1; - } -} - -// static -bool LLTaskInvFVBridge::commitBuyItem(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - if(0 == option) - { - LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID()); - if(!object || !object->getRegion()) return false; - - - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_BuyObjectInventory); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_Data); - msg->addUUIDFast(_PREHASH_ObjectID, notification["payload"]["task_id"].asUUID()); - msg->addUUIDFast(_PREHASH_ItemID, notification["payload"]["item_id"].asUUID()); - msg->addUUIDFast(_PREHASH_FolderID, - gInventory.findCategoryUUIDForType((LLAssetType::EType)notification["payload"]["type"].asInteger())); - msg->sendReliable(object->getRegion()->getHost()); - } - return false; -} - -const std::string& LLTaskInvFVBridge::getName() const -{ - return mName; -} - -const std::string& LLTaskInvFVBridge::getDisplayName() const -{ - LLInventoryItem* item = findItem(); - if(item) - { - mDisplayName.assign(item->getName()); - - const LLPermissions& perm(item->getPermissions()); - BOOL copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE); - BOOL mod = gAgent.allowOperation(PERM_MODIFY, perm, GP_OBJECT_MANIPULATE); - BOOL xfer = gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE); - - if(!copy) - { - mDisplayName.append(" (no copy)"); - } - if(!mod) - { - mDisplayName.append(" (no modify)"); - } - if(!xfer) - { - mDisplayName.append(" (no transfer)"); - } - } - - return mDisplayName; -} - -// BUG: No creation dates for task inventory -time_t LLTaskInvFVBridge::getCreationDate() const -{ - return 0; -} - -LLUIImagePtr LLTaskInvFVBridge::getIcon() const -{ - BOOL item_is_multi = FALSE; - if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) - { - item_is_multi = TRUE; - } - - return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi ); -} - -void LLTaskInvFVBridge::openItem() -{ - // no-op. - lldebugs << "LLTaskInvFVBridge::openItem()" << llendl; -} - -void LLTaskInvFVBridge::previewItem() -{ - openItem(); -} - -BOOL LLTaskInvFVBridge::isItemRenameable() const -{ - if(gAgent.isGodlike()) return TRUE; - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if(object) - { - LLInventoryItem* item; - item = (LLInventoryItem*)(object->getInventoryObject(mUUID)); - if(item && gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), - GP_OBJECT_MANIPULATE, GOD_LIKE)) - { - return TRUE; - } - } - return FALSE; -} - -BOOL LLTaskInvFVBridge::renameItem(const std::string& new_name) -{ - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if(object) - { - LLViewerInventoryItem* item = NULL; - item = (LLViewerInventoryItem*)object->getInventoryObject(mUUID); - if(item && (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), - GP_OBJECT_MANIPULATE, GOD_LIKE))) - { - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->rename(new_name); - object->updateInventory( - new_item, - TASK_INVENTORY_ITEM_KEY, - false); - } - } - return TRUE; -} - -BOOL LLTaskInvFVBridge::isItemMovable() const -{ - //LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - //if(object && (object->permModify() || gAgent.isGodlike())) - //{ - // return TRUE; - //} - //return FALSE; - return TRUE; -} - -BOOL LLTaskInvFVBridge::isItemRemovable() -{ - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if(object - && (object->permModify() || object->permYouOwner())) - { - return TRUE; - } - return FALSE; -} - -bool remove_task_inventory_callback(const LLSD& notification, const LLSD& response, LLPanelObjectInventory* panel) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID()); - if(option == 0 && object) - { - // yes - LLSD::array_const_iterator list_end = notification["payload"]["inventory_ids"].endArray(); - for (LLSD::array_const_iterator list_it = notification["payload"]["inventory_ids"].beginArray(); - list_it != list_end; - ++list_it) - { - object->removeInventory(list_it->asUUID()); - } - - // refresh the UI. - panel->refresh(); - } - return false; -} - -// helper for remove -// ! REFACTOR ! two_uuids_list_t is also defined in llinevntorybridge.h, but differently. -typedef std::pair<LLUUID, std::list<LLUUID> > panel_two_uuids_list_t; -typedef std::pair<LLPanelObjectInventory*, panel_two_uuids_list_t> remove_data_t; -BOOL LLTaskInvFVBridge::removeItem() -{ - if(isItemRemovable() && mPanel) - { - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if(object) - { - if(object->permModify()) - { - // just do it. - object->removeInventory(mUUID); - return TRUE; - } - else - { - remove_data_t* data = new remove_data_t; - data->first = mPanel; - data->second.first = mPanel->getTaskUUID(); - data->second.second.push_back(mUUID); - LLSD payload; - payload["task_id"] = mPanel->getTaskUUID(); - payload["inventory_ids"].append(mUUID); - LLNotifications::instance().add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel)); - return FALSE; - } - } - } - return FALSE; -} - -void LLTaskInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) -{ - if (!mPanel) - { - return; - } - - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if (!object) - { - return; - } - - if (!object->permModify()) - { - LLSD payload; - payload["task_id"] = mPanel->getTaskUUID(); - for (S32 i = 0; i < (S32)batch.size(); i++) - { - LLTaskInvFVBridge* itemp = (LLTaskInvFVBridge*)batch[i]; - payload["inventory_ids"].append(itemp->getUUID()); - } - LLNotifications::instance().add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel)); - - } - else - { - for (S32 i = 0; i < (S32)batch.size(); i++) - { - LLTaskInvFVBridge* itemp = (LLTaskInvFVBridge*)batch[i]; - - if(itemp->isItemRemovable()) - { - // just do it. - object->removeInventory(itemp->getUUID()); - } - } - } -} - -void LLTaskInvFVBridge::move(LLFolderViewEventListener* parent_listener) -{ -} - -BOOL LLTaskInvFVBridge::isItemCopyable() const -{ - LLInventoryItem* item = findItem(); - if(!item) return FALSE; - return gAgent.allowOperation(PERM_COPY, item->getPermissions(), - GP_OBJECT_MANIPULATE); -} - -BOOL LLTaskInvFVBridge::copyToClipboard() const -{ - return FALSE; -} - -void LLTaskInvFVBridge::cutToClipboard() -{ -} - -BOOL LLTaskInvFVBridge::isClipboardPasteable() const -{ - return FALSE; -} - -void LLTaskInvFVBridge::pasteFromClipboard() -{ -} - -void LLTaskInvFVBridge::pasteLinkFromClipboard() -{ -} - -BOOL LLTaskInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const -{ - //llinfos << "LLTaskInvFVBridge::startDrag()" << llendl; - if(mPanel) - { - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if(object) - { - LLInventoryItem* inv = NULL; - if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) - { - const LLPermissions& perm = inv->getPermissions(); - bool can_copy = gAgent.allowOperation(PERM_COPY, perm, - GP_OBJECT_MANIPULATE); - if (object->isAttachment() && !can_copy) - { - //RN: no copy contents of attachments cannot be dragged out - // due to a race condition and possible exploit where - // attached objects do not update their inventory items - // when their contents are manipulated - return FALSE; - } - if((can_copy && perm.allowTransferTo(gAgent.getID())) - || object->permYouOwner()) -// || gAgent.isGodlike()) - - { - *type = LLAssetType::lookupDragAndDropType(inv->getType()); - - *id = inv->getUUID(); - return TRUE; - } - } - } - } - return FALSE; -} - -BOOL LLTaskInvFVBridge::dragOrDrop(MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data) -{ - //llinfos << "LLTaskInvFVBridge::dragOrDrop()" << llendl; - return FALSE; -} - -// virtual -void LLTaskInvFVBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if (action == "task_buy") - { - // Check the price of the item. - S32 price = getPrice(); - if (-1 == price) - { - llwarns << "label_buy_task_bridged_item: Invalid price" << llendl; - } - else - { - if (price > 0 && price > gStatusBar->getBalance()) - { - LLFloaterBuyCurrency::buyCurrency("This costs", price); - } - else - { - buyItem(); - } - } - } - else if (action == "task_open") - { - openItem(); - } - else if (action == "task_properties") - { - showProperties(); - } -} - -void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - LLInventoryItem* item = findItem(); - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if (!item) - { - hide_context_entries(menu, items, disabled_items); - return; - } - - if(gAgent.allowOperation(PERM_OWNER, item->getPermissions(), - GP_OBJECT_MANIPULATE) - && item->getSaleInfo().isForSale()) - { - items.push_back(std::string("Task Buy")); - - std::string label= LLTrans::getString("Buy"); - // Check the price of the item. - S32 price = getPrice(); - if (-1 == price) - { - llwarns << "label_buy_task_bridged_item: Invalid price" << llendl; - } - else - { - std::ostringstream info; - info << LLTrans::getString("BuyforL$") << price; - label.assign(info.str()); - } - - const LLView::child_list_t *list = menu.getChildList(); - LLView::child_list_t::const_iterator itor; - for (itor = list->begin(); itor != list->end(); ++itor) - { - std::string name = (*itor)->getName(); - LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor); - if (name == "Task Buy" && menu_itemp) - { - menu_itemp->setLabel(label); - } - } - } - else - { - items.push_back(std::string("Task Open")); - if (!isItemCopyable()) - { - disabled_items.push_back(std::string("Task Open")); - } - } - items.push_back(std::string("Task Properties")); - if(isItemRenameable()) - { - items.push_back(std::string("Task Rename")); - } - if(isItemRemovable()) - { - items.push_back(std::string("Task Remove")); - } - - hide_context_entries(menu, items, disabled_items); -} - - -///---------------------------------------------------------------------------- -/// Class LLTaskFolderBridge -///---------------------------------------------------------------------------- - -class LLTaskCategoryBridge : public LLTaskInvFVBridge -{ -public: - LLTaskCategoryBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual LLUIImagePtr getIcon() const; - virtual const std::string& getDisplayName() const { return getName(); } - virtual BOOL isItemRenameable() const; - virtual BOOL renameItem(const std::string& new_name); - virtual BOOL isItemRemovable(); - virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - virtual BOOL hasChildren() const; - virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; - virtual BOOL dragOrDrop(MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data); -}; - -LLTaskCategoryBridge::LLTaskCategoryBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskCategoryBridge::getIcon() const -{ - return LLUI::getUIImage("Inv_FolderClosed"); -} - -BOOL LLTaskCategoryBridge::isItemRenameable() const -{ - return FALSE; -} - -BOOL LLTaskCategoryBridge::renameItem(const std::string& new_name) -{ - return FALSE; -} - -BOOL LLTaskCategoryBridge::isItemRemovable() -{ - return FALSE; -} - -void LLTaskCategoryBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - std::vector<std::string> items; - std::vector<std::string> disabled_items; - items.push_back(std::string("Task Open")); - hide_context_entries(menu, items, disabled_items); -} - -BOOL LLTaskCategoryBridge::hasChildren() const -{ - // return TRUE if we have or do know know if we have children. - // *FIX: For now, return FALSE - we will know for sure soon enough. - return FALSE; -} - -BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const -{ - //llinfos << "LLTaskInvFVBridge::startDrag()" << llendl; - if(mPanel) - { - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if(object) - { - LLInventoryItem* inv = NULL; - if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) - { - const LLPermissions& perm = inv->getPermissions(); - bool can_copy = gAgent.allowOperation(PERM_COPY, perm, - GP_OBJECT_MANIPULATE); - if((can_copy && perm.allowTransferTo(gAgent.getID())) - || object->permYouOwner()) -// || gAgent.isGodlike()) - - { - *type = LLAssetType::lookupDragAndDropType(inv->getType()); - - *id = inv->getUUID(); - return TRUE; - } - } - } - } - return FALSE; -} - -BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data) -{ - //llinfos << "LLTaskCategoryBridge::dragOrDrop()" << llendl; - BOOL accept = FALSE; - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if(object) - { - switch(cargo_type) - { - case DAD_CATEGORY: - accept = LLToolDragAndDrop::getInstance()->dadUpdateInventoryCategory(object,drop); - break; - case DAD_TEXTURE: - case DAD_SOUND: - case DAD_LANDMARK: - case DAD_OBJECT: - case DAD_NOTECARD: - case DAD_CLOTHING: - case DAD_BODYPART: - case DAD_ANIMATION: - case DAD_GESTURE: - case DAD_CALLINGCARD: - accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data); - if(accept && drop) - { - LLToolDragAndDrop::dropInventory(object, - (LLViewerInventoryItem*)cargo_data, - LLToolDragAndDrop::getInstance()->getSource(), - LLToolDragAndDrop::getInstance()->getSourceID()); - } - break; - case DAD_SCRIPT: - // *HACK: In order to resolve SL-22177, we need to block - // drags from notecards and objects onto other - // objects. uncomment the simpler version when we have - // that right. - //accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data); - if(LLToolDragAndDrop::isInventoryDropAcceptable( - object, (LLViewerInventoryItem*)cargo_data) - && (LLToolDragAndDrop::SOURCE_WORLD != LLToolDragAndDrop::getInstance()->getSource()) - && (LLToolDragAndDrop::SOURCE_NOTECARD != LLToolDragAndDrop::getInstance()->getSource())) - { - accept = TRUE; - } - if(accept && drop) - { - LLViewerInventoryItem* item = (LLViewerInventoryItem*)cargo_data; - // rez in the script active by default, rez in - // inactive if the control key is being held down. - BOOL active = ((mask & MASK_CONTROL) == 0); - LLToolDragAndDrop::dropScript(object, item, active, - LLToolDragAndDrop::getInstance()->getSource(), - LLToolDragAndDrop::getInstance()->getSourceID()); - } - break; - default: - break; - } - } - return accept; -} - -///---------------------------------------------------------------------------- -/// Class LLTaskTextureBridge -///---------------------------------------------------------------------------- - -class LLTaskTextureBridge : public LLTaskInvFVBridge -{ -public: - LLTaskTextureBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name, - LLInventoryType::EType it); - - virtual LLUIImagePtr getIcon() const; - virtual void openItem(); -protected: - LLInventoryType::EType mInventoryType; -}; - -LLTaskTextureBridge::LLTaskTextureBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name, - LLInventoryType::EType it) : - LLTaskInvFVBridge(panel, uuid, name), - mInventoryType(it) -{ -} - -LLUIImagePtr LLTaskTextureBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_TEXTURE, mInventoryType, 0, FALSE); -} - -void LLTaskTextureBridge::openItem() -{ - llinfos << "LLTaskTextureBridge::openItem()" << llendl; - LLPreviewTexture* preview = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); - if(preview) - { - preview->setObjectID(mPanel->getTaskUUID()); - } -} - - -///---------------------------------------------------------------------------- -/// Class LLTaskSoundBridge -///---------------------------------------------------------------------------- - -class LLTaskSoundBridge : public LLTaskInvFVBridge -{ -public: - LLTaskSoundBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual LLUIImagePtr getIcon() const; - virtual void openItem(); - virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); - virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - static void openSoundPreview(void* data); -}; - -LLTaskSoundBridge::LLTaskSoundBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskSoundBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE); -} - -void LLTaskSoundBridge::openItem() -{ - openSoundPreview((void*)this); -} - -void LLTaskSoundBridge::openSoundPreview(void* data) -{ - LLTaskSoundBridge* self = (LLTaskSoundBridge*)data; - if(!self) - return; - - LLPreviewSound* preview = LLFloaterReg::showTypedInstance<LLPreviewSound>("preview_sound", LLSD(self->mUUID), TAKE_FOCUS_YES); - if (preview) - { - preview->setObjectID(self->mPanel->getTaskUUID()); - } -} - -// virtual -void LLTaskSoundBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if (action == "task_play") - { - LLInventoryItem* item = findItem(); - if(item) - { - send_sound_trigger(item->getAssetUUID(), 1.0); - } - } - LLTaskInvFVBridge::performAction(folder, model, action); -} - -void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - LLInventoryItem* item = findItem(); - if(!item) return; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(item->getPermissions().getOwner() != gAgent.getID() - && item->getSaleInfo().isForSale()) - { - items.push_back(std::string("Task Buy")); - - std::string label= LLTrans::getString("Buy"); - // Check the price of the item. - S32 price = getPrice(); - if (-1 == price) - { - llwarns << "label_buy_task_bridged_item: Invalid price" << llendl; - } - else - { - std::ostringstream info; - info << LLTrans::getString("BuyforL$") << price; - label.assign(info.str()); - } - - const LLView::child_list_t *list = menu.getChildList(); - LLView::child_list_t::const_iterator itor; - for (itor = list->begin(); itor != list->end(); ++itor) - { - std::string name = (*itor)->getName(); - LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor); - if (name == "Task Buy" && menu_itemp) - { - menu_itemp->setLabel(label); - } - } - } - else - { - items.push_back(std::string("Task Open")); - if (!isItemCopyable()) - { - disabled_items.push_back(std::string("Task Open")); - } - } - items.push_back(std::string("Task Properties")); - if(isItemRenameable()) - { - items.push_back(std::string("Task Rename")); - } - if(isItemRemovable()) - { - items.push_back(std::string("Task Remove")); - } - - items.push_back(std::string("Task Play")); - - - hide_context_entries(menu, items, disabled_items); -} - -///---------------------------------------------------------------------------- -/// Class LLTaskLandmarkBridge -///---------------------------------------------------------------------------- - -class LLTaskLandmarkBridge : public LLTaskInvFVBridge -{ -public: - LLTaskLandmarkBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual LLUIImagePtr getIcon() const; -}; - -LLTaskLandmarkBridge::LLTaskLandmarkBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskLandmarkBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0, FALSE); -} - - -///---------------------------------------------------------------------------- -/// Class LLTaskCallingCardBridge -///---------------------------------------------------------------------------- - -class LLTaskCallingCardBridge : public LLTaskInvFVBridge -{ -public: - LLTaskCallingCardBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual LLUIImagePtr getIcon() const; - virtual BOOL isItemRenameable() const; - virtual BOOL renameItem(const std::string& new_name); -}; - -LLTaskCallingCardBridge::LLTaskCallingCardBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskCallingCardBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0, FALSE); -} - -BOOL LLTaskCallingCardBridge::isItemRenameable() const -{ - return FALSE; -} - -BOOL LLTaskCallingCardBridge::renameItem(const std::string& new_name) -{ - return FALSE; -} - - -///---------------------------------------------------------------------------- -/// Class LLTaskScriptBridge -///---------------------------------------------------------------------------- - -class LLTaskScriptBridge : public LLTaskInvFVBridge -{ -public: - LLTaskScriptBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual LLUIImagePtr getIcon() const; - //static BOOL enableIfCopyable( void* userdata ); -}; - -LLTaskScriptBridge::LLTaskScriptBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskScriptBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); -} - - -class LLTaskLSLBridge : public LLTaskScriptBridge -{ -public: - LLTaskLSLBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual void openItem(); - virtual BOOL removeItem(); - //virtual void buildContextMenu(LLMenuGL& menu); - - //static void copyToInventory(void* userdata); -}; - -LLTaskLSLBridge::LLTaskLSLBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskScriptBridge(panel, uuid, name) -{ -} - -void LLTaskLSLBridge::openItem() -{ - llinfos << "LLTaskLSLBridge::openItem() " << mUUID << llendl; - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if(!object || object->isInventoryPending()) - { - return; - } - LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES); - if (preview && (object->permModify() || gAgent.isGodlike())) - { - preview->setObjectID(mPanel->getTaskUUID()); - } -} - -BOOL LLTaskLSLBridge::removeItem() -{ - LLFloaterReg::hideInstance("preview_scriptedit", LLSD(mUUID)); - return LLTaskInvFVBridge::removeItem(); -} - -///---------------------------------------------------------------------------- -/// Class LLTaskObjectBridge -///---------------------------------------------------------------------------- - -class LLTaskObjectBridge : public LLTaskInvFVBridge -{ -public: - LLTaskObjectBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual LLUIImagePtr getIcon() const; -}; - -LLTaskObjectBridge::LLTaskObjectBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskObjectBridge::getIcon() const -{ - BOOL item_is_multi = FALSE; - if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) - { - item_is_multi = TRUE; - } - - return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi); -} - -///---------------------------------------------------------------------------- -/// Class LLTaskNotecardBridge -///---------------------------------------------------------------------------- - -class LLTaskNotecardBridge : public LLTaskInvFVBridge -{ -public: - LLTaskNotecardBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual LLUIImagePtr getIcon() const; - virtual void openItem(); - virtual BOOL removeItem(); -}; - -LLTaskNotecardBridge::LLTaskNotecardBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskNotecardBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE); -} - -void LLTaskNotecardBridge::openItem() -{ - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if(!object || object->isInventoryPending()) - { - return; - } - if(object->permModify() || gAgent.isGodlike()) - { - LLPreviewNotecard* preview = LLFloaterReg::showTypedInstance<LLPreviewNotecard>("preview_notecard", LLSD(mUUID), TAKE_FOCUS_YES); - if (preview) - { - preview->setObjectID(mPanel->getTaskUUID()); - } - } -} - -BOOL LLTaskNotecardBridge::removeItem() -{ - LLFloaterReg::hideInstance("preview_notecard", LLSD(mUUID)); - return LLTaskInvFVBridge::removeItem(); -} - -///---------------------------------------------------------------------------- -/// Class LLTaskGestureBridge -///---------------------------------------------------------------------------- - -class LLTaskGestureBridge : public LLTaskInvFVBridge -{ -public: - LLTaskGestureBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual LLUIImagePtr getIcon() const; - virtual void openItem(); - virtual BOOL removeItem(); -}; - -LLTaskGestureBridge::LLTaskGestureBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskGestureBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE); -} - -void LLTaskGestureBridge::openItem() -{ - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if(!object || object->isInventoryPending()) - { - return; - } - LLPreviewGesture::show(mUUID, mPanel->getTaskUUID()); -} - -BOOL LLTaskGestureBridge::removeItem() -{ - // Don't need to deactivate gesture because gestures inside objects can never be active. - LLFloaterReg::hideInstance("preview_gesture", LLSD(mUUID)); - return LLTaskInvFVBridge::removeItem(); -} - -///---------------------------------------------------------------------------- -/// Class LLTaskAnimationBridge -///---------------------------------------------------------------------------- - -class LLTaskAnimationBridge : public LLTaskInvFVBridge -{ -public: - LLTaskAnimationBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual LLUIImagePtr getIcon() const; - virtual void openItem(); - virtual BOOL removeItem(); -}; - -LLTaskAnimationBridge::LLTaskAnimationBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskAnimationBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); -} - -void LLTaskAnimationBridge::openItem() -{ - LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); - if(!object || object->isInventoryPending()) - { - return; - } - - LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); - if (preview && (object->permModify() || gAgent.isGodlike())) - { - preview->setObjectID(mPanel->getTaskUUID()); - } -} - -BOOL LLTaskAnimationBridge::removeItem() -{ - LLFloaterReg::hideInstance("preview_anim", LLSD(mUUID)); - return LLTaskInvFVBridge::removeItem(); -} - -///---------------------------------------------------------------------------- -/// Class LLTaskWearableBridge -///---------------------------------------------------------------------------- - -class LLTaskWearableBridge : public LLTaskInvFVBridge -{ -public: - LLTaskWearableBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name, - LLAssetType::EType asset_type, - U32 flags); - - virtual LLUIImagePtr getIcon() const; - -protected: - LLAssetType::EType mAssetType; -}; - -LLTaskWearableBridge::LLTaskWearableBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name, - LLAssetType::EType asset_type, - U32 flags) : - LLTaskInvFVBridge(panel, uuid, name, flags), - mAssetType( asset_type ) -{ -} - -LLUIImagePtr LLTaskWearableBridge::getIcon() const -{ - return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE ); -} - - -///---------------------------------------------------------------------------- -/// LLTaskInvFVBridge impl -//---------------------------------------------------------------------------- - -LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory* panel, - LLInventoryObject* object) -{ - LLTaskInvFVBridge* new_bridge = NULL; - LLAssetType::EType type = object->getType(); - LLInventoryItem* item = NULL; - switch(type) - { - case LLAssetType::AT_TEXTURE: - item = (LLInventoryItem*)object; - new_bridge = new LLTaskTextureBridge(panel, - object->getUUID(), - object->getName(), - item->getInventoryType()); - break; - case LLAssetType::AT_SOUND: - new_bridge = new LLTaskSoundBridge(panel, - object->getUUID(), - object->getName()); - break; - case LLAssetType::AT_LANDMARK: - new_bridge = new LLTaskLandmarkBridge(panel, - object->getUUID(), - object->getName()); - break; - case LLAssetType::AT_CALLINGCARD: - new_bridge = new LLTaskCallingCardBridge(panel, - object->getUUID(), - object->getName()); - break; - case LLAssetType::AT_SCRIPT: - // OLD SCRIPTS DEPRECATED - JC - llwarns << "Old script" << llendl; - //new_bridge = new LLTaskOldScriptBridge(panel, - // object->getUUID(), - // object->getName()); - break; - case LLAssetType::AT_OBJECT: - new_bridge = new LLTaskObjectBridge(panel, - object->getUUID(), - object->getName()); - break; - case LLAssetType::AT_NOTECARD: - new_bridge = new LLTaskNotecardBridge(panel, - object->getUUID(), - object->getName()); - break; - case LLAssetType::AT_ANIMATION: - new_bridge = new LLTaskAnimationBridge(panel, - object->getUUID(), - object->getName()); - break; - case LLAssetType::AT_GESTURE: - new_bridge = new LLTaskGestureBridge(panel, - object->getUUID(), - object->getName()); - break; - case LLAssetType::AT_CLOTHING: - case LLAssetType::AT_BODYPART: - item = (LLInventoryItem*)object; - new_bridge = new LLTaskWearableBridge(panel, - object->getUUID(), - object->getName(), - type, - item->getFlags()); - break; - case LLAssetType::AT_CATEGORY: - case LLAssetType::AT_FAVORITE: - new_bridge = new LLTaskCategoryBridge(panel, - object->getUUID(), - object->getName()); - break; - case LLAssetType::AT_LSL_TEXT: - new_bridge = new LLTaskLSLBridge(panel, - object->getUUID(), - object->getName()); - break; - - break; - default: - llinfos << "Unhandled inventory type (llassetstorage.h): " - << (S32)type << llendl; - break; - } - return new_bridge; -} - - -///---------------------------------------------------------------------------- -/// Class LLPanelObjectInventory -///---------------------------------------------------------------------------- - -static LLDefaultChildRegistry::Register<LLPanelObjectInventory> r("panel_inventory_object"); - -void do_nothing() -{ -} - -// Default constructor -LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Params& p) : - LLPanel(p), - mScroller(NULL), - mFolders(NULL), - mHaveInventory(FALSE), - mIsInventoryEmpty(TRUE), - mInventoryNeedsUpdate(FALSE) -{ - // Setup context menu callbacks - mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2)); - mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); - mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); - mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&do_nothing)); - mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing)); - mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing)); -} - -// Destroys the object -LLPanelObjectInventory::~LLPanelObjectInventory() -{ - if (!gIdleCallbacks.deleteFunction(idle, this)) - { - llwarns << "LLPanelObjectInventory::~LLPanelObjectInventory() failed to delete callback" << llendl; - } -} - -BOOL LLPanelObjectInventory::postBuild() -{ - // clear contents and initialize menus, sets up mFolders - reset(); - - // Register an idle update callback - gIdleCallbacks.addFunction(idle, this); - - return TRUE; -} - -void LLPanelObjectInventory::doToSelected(const LLSD& userdata) -{ - mFolders->doToSelected(&gInventory, userdata); -} - -void LLPanelObjectInventory::clearContents() -{ - mHaveInventory = FALSE; - mIsInventoryEmpty = TRUE; - if (LLToolDragAndDrop::getInstance() && LLToolDragAndDrop::getInstance()->getSource() == LLToolDragAndDrop::SOURCE_WORLD) - { - LLToolDragAndDrop::getInstance()->endDrag(); - } - - if( mScroller ) - { - // removes mFolders - removeChild( mScroller ); //*TODO: Really shouldn't do this during draw()/refresh() - mScroller->die(); - mScroller = NULL; - mFolders = NULL; - } -} - - -void LLPanelObjectInventory::reset() -{ - clearContents(); - - setBorderVisible(FALSE); - - mCommitCallbackRegistrar.pushScope(); // push local callbacks - - LLRect dummy_rect(0, 1, 1, 0); - LLFolderView::Params p; - p.name = "task inventory"; - p.task_id = getTaskUUID(); - p.parent_panel = this; - mFolders = LLUICtrlFactory::create<LLFolderView>(p); - // this ensures that we never say "searching..." or "no items found" - mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); - mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); - - LLRect scroller_rect(0, getRect().getHeight(), getRect().getWidth(), 0); - LLScrollContainer::Params scroll_p; - scroll_p.name("task inventory scroller"); - scroll_p.rect(scroller_rect); - scroll_p.follows.flags(FOLLOWS_ALL); - mScroller = LLUICtrlFactory::create<LLScrollContainer>(scroll_p); - addChild(mScroller); - mScroller->addChild(mFolders); - - mFolders->setScrollContainer( mScroller ); - - mCommitCallbackRegistrar.popScope(); -} - -void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object, - InventoryObjectList* inventory, - S32 serial_num, - void* data) -{ - if(!object) return; - - //llinfos << "invetnory arrived: \n" - // << " panel UUID: " << panel->mTaskUUID << "\n" - // << " task UUID: " << object->mID << llendl; - if(mTaskUUID == object->mID) - { - mInventoryNeedsUpdate = TRUE; - } - - // refresh any properties floaters that are hanging around. - if(inventory) - { - for (InventoryObjectList::const_iterator iter = inventory->begin(); - iter != inventory->end(); ) - { - LLInventoryObject* item = *iter++; - LLFloaterProperties* floater = LLFloaterReg::findTypedInstance<LLFloaterProperties>("properites", item->getUUID()); - if(floater) - { - floater->refresh(); - } - } - } -} - -void LLPanelObjectInventory::updateInventory() -{ - //llinfos << "inventory arrived: \n" - // << " panel UUID: " << panel->mTaskUUID << "\n" - // << " task UUID: " << object->mID << llendl; - // We're still interested in this task's inventory. - std::set<LLUUID> selected_items; - BOOL inventory_has_focus = FALSE; - if (mHaveInventory && mFolders->getNumSelectedDescendants()) - { - mFolders->getSelectionList(selected_items); - inventory_has_focus = gFocusMgr.childHasKeyboardFocus(mFolders); - } - - reset(); - - LLViewerObject* objectp = gObjectList.findObject(mTaskUUID); - if (objectp) - { - LLInventoryObject* inventory_root = objectp->getInventoryRoot(); - InventoryObjectList contents; - objectp->getInventoryContents(contents); - if (inventory_root) - { - createFolderViews(inventory_root, contents); - mHaveInventory = TRUE; - mIsInventoryEmpty = FALSE; - mFolders->setEnabled(TRUE); - } - else - { - // TODO: create an empty inventory - mIsInventoryEmpty = TRUE; - mHaveInventory = TRUE; - } - } - else - { - // TODO: create an empty inventory - mIsInventoryEmpty = TRUE; - mHaveInventory = TRUE; - } - - // restore previous selection - std::set<LLUUID>::iterator selection_it; - BOOL first_item = TRUE; - for (selection_it = selected_items.begin(); selection_it != selected_items.end(); ++selection_it) - { - LLFolderViewItem* selected_item = mFolders->getItemByID(*selection_it); - if (selected_item) - { - //HACK: "set" first item then "change" each other one to get keyboard focus right - if (first_item) - { - mFolders->setSelection(selected_item, TRUE, inventory_has_focus); - first_item = FALSE; - } - else - { - mFolders->changeSelection(selected_item, TRUE); - } - } - } - - mFolders->requestArrange(); - mInventoryNeedsUpdate = FALSE; -} - -// *FIX: This is currently a very expensive operation, because we have -// to iterate through the inventory one time for each category. This -// leads to an N^2 based on the category count. This could be greatly -// speeded with an efficient multimap implementation, but we don't -// have that in our current arsenal. -void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents) -{ - if (!inventory_root) - { - return; - } - // Create a visible root category. - LLTaskInvFVBridge* bridge = NULL; - bridge = LLTaskInvFVBridge::createObjectBridge(this, inventory_root); - if(bridge) - { - LLFolderViewFolder* new_folder = NULL; - LLFolderViewFolder::Params p; - p.name = inventory_root->getName(); - p.icon = LLUI::getUIImage("Inv_FolderClosed"); - p.icon_open = LLUI::getUIImage("Inv_FolderOpen"); - p.root = mFolders; - p.listener = bridge; - new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p); - new_folder->addToFolder(mFolders, mFolders); - new_folder->toggleOpen(); - - createViewsForCategory(&contents, inventory_root, new_folder); - } -} - -typedef std::pair<LLInventoryObject*, LLFolderViewFolder*> obj_folder_pair; - -void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* inventory, - LLInventoryObject* parent, - LLFolderViewFolder* folder) -{ - // Find all in the first pass - LLDynamicArray<obj_folder_pair*> child_categories; - LLTaskInvFVBridge* bridge; - LLFolderViewItem* view; - - InventoryObjectList::iterator it = inventory->begin(); - InventoryObjectList::iterator end = inventory->end(); - for( ; it != end; ++it) - { - LLInventoryObject* obj = *it; - - if(parent->getUUID() == obj->getParentUUID()) - { - bridge = LLTaskInvFVBridge::createObjectBridge(this, obj); - if(!bridge) - { - continue; - } - if(LLAssetType::AT_CATEGORY == obj->getType()) - { - LLFolderViewFolder::Params p; - p.name = obj->getName(); - p.icon = LLUI::getUIImage("Inv_FolderClosed"); - p.icon_open = LLUI::getUIImage("Inv_FolderOpen"); - p.root = mFolders; - p.listener = bridge; - view = LLUICtrlFactory::create<LLFolderViewFolder>(p); - child_categories.put(new obj_folder_pair(obj, - (LLFolderViewFolder*)view)); - } - else - { - LLFolderViewItem::Params params; - params.name(obj->getName()); - params.icon(bridge->getIcon()); - params.creation_date(bridge->getCreationDate()); - params.root(mFolders); - params.listener(bridge); - params.rect(LLRect()); - view = LLUICtrlFactory::create<LLFolderViewItem> (params); - } - view->addToFolder(folder, mFolders); - } - } - - // now, for each category, do the second pass - for(S32 i = 0; i < child_categories.count(); i++) - { - createViewsForCategory(inventory, child_categories[i]->first, - child_categories[i]->second ); - delete child_categories[i]; - } -} - -void LLPanelObjectInventory::refresh() -{ - //llinfos << "LLPanelObjectInventory::refresh()" << llendl; - BOOL has_inventory = FALSE; - const BOOL non_root_ok = TRUE; - LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(NULL, non_root_ok); - if(node) - { - LLViewerObject* object = node->getObject(); - if(object && ((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1) - || (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1))) - { - // determine if we need to make a request. Start with a - // default based on if we have inventory at all. - BOOL make_request = !mHaveInventory; - - // If the task id is different than what we've stored, - // then make the request. - if(mTaskUUID != object->mID) - { - mTaskUUID = object->mID; - make_request = TRUE; - - // This is a new object so pre-emptively clear the contents - // Otherwise we show the old stuff until the update comes in - clearContents(); - - // Register for updates from this object, - registerVOInventoryListener(object,NULL); - } - - // Based on the node information, we may need to dirty the - // object inventory and get it again. - if(node->mValid) - { - if(node->mInventorySerial != object->getInventorySerial() || object->isInventoryDirty()) - { - make_request = TRUE; - } - } - - // do the request if necessary. - if(make_request) - { - requestVOInventory(); - } - has_inventory = TRUE; - } - } - if(!has_inventory) - { - mTaskUUID = LLUUID::null; - removeVOInventoryListener(); - clearContents(); - } - //llinfos << "LLPanelObjectInventory::refresh() " << mTaskUUID << llendl; -} - -void LLPanelObjectInventory::removeSelectedItem() -{ - if(mFolders) - { - mFolders->removeSelectedItems(); - } -} - -void LLPanelObjectInventory::startRenamingSelectedItem() -{ - if(mFolders) - { - mFolders->startRenamingSelectedItem(); - } -} - -void LLPanelObjectInventory::draw() -{ - LLPanel::draw(); - - if(mIsInventoryEmpty) - { - if((LLUUID::null != mTaskUUID) && (!mHaveInventory)) - { - LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("LoadingContents"), 0, - (S32)(getRect().getWidth() * 0.5f), - 10, - LLColor4( 1, 1, 1, 1 ), - LLFontGL::HCENTER, - LLFontGL::BOTTOM); - } - else if(mHaveInventory) - { - LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("NoContents"), 0, - (S32)(getRect().getWidth() * 0.5f), - 10, - LLColor4( 1, 1, 1, 1 ), - LLFontGL::HCENTER, - LLFontGL::BOTTOM); - } - } -} - -void LLPanelObjectInventory::deleteAllChildren() -{ - mScroller = NULL; - mFolders = NULL; - LLView::deleteAllChildren(); -} - -BOOL LLPanelObjectInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg) -{ - if (mFolders && mHaveInventory) - { - LLFolderViewItem* folderp = mFolders->getNextFromChild(NULL); - if (!folderp) - { - return FALSE; - } - // Try to pass on unmodified mouse coordinates - S32 local_x = x - mFolders->getRect().mLeft; - S32 local_y = y - mFolders->getRect().mBottom; - - if (mFolders->pointInView(local_x, local_y)) - { - return mFolders->handleDragAndDrop(local_x, local_y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); - } - else - { - //force mouse coordinates to be inside folder rectangle - return mFolders->handleDragAndDrop(5, 1, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); - } - } - else - { - return FALSE; - } -} - -//static -void LLPanelObjectInventory::idle(void* user_data) -{ - LLPanelObjectInventory* self = (LLPanelObjectInventory*)user_data; - - - if (self->mInventoryNeedsUpdate) - { - self->updateInventory(); - } -} +/** + * @file llsidepanelinventory.cpp + * @brief LLPanelObjectInventory class implementation + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +//***************************************************************************** +// +// Implementation of the panel inventory - used to view and control a +// task's inventory. +// +//***************************************************************************** + +#include "llviewerprecompiledheaders.h" + +#include "llpanelobjectinventory.h" + +#include "roles_constants.h" + +#include "llagent.h" +#include "llcallbacklist.h" +#include "llfloaterbuycurrency.h" +#include "llfloaterreg.h" +#include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llpreviewanim.h" +#include "llpreviewgesture.h" +#include "llpreviewnotecard.h" +#include "llpreviewscript.h" +#include "llpreviewsound.h" +#include "llpreviewtexture.h" +#include "llscrollcontainer.h" +#include "llselectmgr.h" +#include "llsidetray.h" +#include "llstatusbar.h" +#include "lltrans.h" +#include "llviewerregion.h" +#include "llviewerobjectlist.h" +#include "llviewermessage.h" + + +///---------------------------------------------------------------------------- +/// Class LLTaskInvFVBridge +///---------------------------------------------------------------------------- + +class LLTaskInvFVBridge : public LLFolderViewEventListener +{ +protected: + LLUUID mUUID; + std::string mName; + mutable std::string mDisplayName; + LLPanelObjectInventory* mPanel; + U32 mFlags; + + LLInventoryItem* findItem() const; + +public: + LLTaskInvFVBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + U32 flags=0); + virtual ~LLTaskInvFVBridge( void ) {} + + virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; } + virtual std::string getLabelSuffix() const { return LLStringUtil::null; } + + static LLTaskInvFVBridge* createObjectBridge(LLPanelObjectInventory* panel, + LLInventoryObject* object); + void showProperties(); + void buyItem(); + S32 getPrice(); + static bool commitBuyItem(const LLSD& notification, const LLSD& response); + + // LLFolderViewEventListener functionality + virtual const std::string& getName() const; + virtual const std::string& getDisplayName() const; + virtual PermissionMask getPermissionMask() const { return PERM_NONE; } + /*virtual*/ LLAssetType::EType getPreferredType() const { return LLAssetType::AT_NONE; } + virtual const LLUUID& getUUID() const { return mUUID; } + virtual time_t getCreationDate() const; + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); + virtual void closeItem() {} + virtual void previewItem(); + virtual void selectItem() {} + virtual BOOL isItemRenameable() const; + virtual BOOL renameItem(const std::string& new_name); + virtual BOOL isItemMovable() const; + virtual BOOL isItemRemovable(); + virtual BOOL removeItem(); + virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch); + virtual void move(LLFolderViewEventListener* parent_listener); + virtual BOOL isItemCopyable() const; + virtual BOOL copyToClipboard() const; + virtual void cutToClipboard(); + virtual BOOL isClipboardPasteable() const; + virtual void pasteFromClipboard(); + virtual void pasteLinkFromClipboard(); + virtual void buildContextMenu(LLMenuGL& menu, U32 flags); + virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + virtual BOOL isUpToDate() const { return TRUE; } + virtual BOOL hasChildren() const { return FALSE; } + virtual LLInventoryType::EType getInventoryType() const { return LLInventoryType::IT_NONE; } + // LLDragAndDropBridge functionality + virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; + virtual BOOL dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data); +}; + +LLTaskInvFVBridge::LLTaskInvFVBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + U32 flags): + mUUID(uuid), + mName(name), + mPanel(panel), + mFlags(flags) +{ + +} + +LLInventoryItem* LLTaskInvFVBridge::findItem() const +{ + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + return (LLInventoryItem*)(object->getInventoryObject(mUUID)); + } + return NULL; +} + +void LLTaskInvFVBridge::showProperties() +{ + LLSD key; + key["object"] = mPanel->getTaskUUID(); + key["id"] = mUUID; + LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); + + /* + LLFloaterProperties* floater = LLFloaterReg::showTypedInstance<LLFloaterProperties>("properties", mUUID); + if (floater) + { + floater->setObjectID(mPanel->getTaskUUID()); + } + */ +} + +struct LLBuyInvItemData +{ + LLUUID mTaskID; + LLUUID mItemID; + LLAssetType::EType mType; + + LLBuyInvItemData(const LLUUID& task, + const LLUUID& item, + LLAssetType::EType type) : + mTaskID(task), mItemID(item), mType(type) + {} +}; + +void LLTaskInvFVBridge::buyItem() +{ + llinfos << "LLTaskInvFVBridge::buyItem()" << llendl; + LLInventoryItem* item = findItem(); + if(!item || !item->getSaleInfo().isForSale()) return; + LLBuyInvItemData* inv = new LLBuyInvItemData(mPanel->getTaskUUID(), + mUUID, + item->getType()); + + const LLSaleInfo& sale_info = item->getSaleInfo(); + const LLPermissions& perm = item->getPermissions(); + const std::string owner_name; // no owner name currently... FIXME? + + LLViewerObject* obj; + if( ( obj = gObjectList.findObject( mPanel->getTaskUUID() ) ) && obj->isAttachment() ) + { + LLNotifications::instance().add("Cannot_Purchase_an_Attachment"); + llinfos << "Attempt to purchase an attachment" << llendl; + delete inv; + } + else + { + LLSD args; + args["PRICE"] = llformat("%d",sale_info.getSalePrice()); + args["OWNER"] = owner_name; + if (sale_info.getSaleType() != LLSaleInfo::FS_CONTENTS) + { + U32 next_owner_mask = perm.getMaskNextOwner(); + args["MODIFYPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo"); + args["COPYPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo"); + args["RESELLPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo"); + } + + std::string alertdesc; + switch(sale_info.getSaleType()) + { + case LLSaleInfo::FS_ORIGINAL: + alertdesc = owner_name.empty() ? "BuyOriginalNoOwner" : "BuyOriginal"; + break; + case LLSaleInfo::FS_CONTENTS: + alertdesc = owner_name.empty() ? "BuyContentsNoOwner" : "BuyContents"; + break; + case LLSaleInfo::FS_COPY: + default: + alertdesc = owner_name.empty() ? "BuyCopyNoOwner" : "BuyCopy"; + break; + } + + LLSD payload; + payload["task_id"] = inv->mTaskID; + payload["item_id"] = inv->mItemID; + payload["type"] = inv->mType; + LLNotifications::instance().add(alertdesc, args, payload, LLTaskInvFVBridge::commitBuyItem); + } +} + +S32 LLTaskInvFVBridge::getPrice() +{ + LLInventoryItem* item = findItem(); + if(item) + { + return item->getSaleInfo().getSalePrice(); + } + else + { + return -1; + } +} + +// static +bool LLTaskInvFVBridge::commitBuyItem(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + if(0 == option) + { + LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID()); + if(!object || !object->getRegion()) return false; + + + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_BuyObjectInventory); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_Data); + msg->addUUIDFast(_PREHASH_ObjectID, notification["payload"]["task_id"].asUUID()); + msg->addUUIDFast(_PREHASH_ItemID, notification["payload"]["item_id"].asUUID()); + msg->addUUIDFast(_PREHASH_FolderID, + gInventory.findCategoryUUIDForType((LLAssetType::EType)notification["payload"]["type"].asInteger())); + msg->sendReliable(object->getRegion()->getHost()); + } + return false; +} + +const std::string& LLTaskInvFVBridge::getName() const +{ + return mName; +} + +const std::string& LLTaskInvFVBridge::getDisplayName() const +{ + LLInventoryItem* item = findItem(); + if(item) + { + mDisplayName.assign(item->getName()); + + const LLPermissions& perm(item->getPermissions()); + BOOL copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE); + BOOL mod = gAgent.allowOperation(PERM_MODIFY, perm, GP_OBJECT_MANIPULATE); + BOOL xfer = gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE); + + if(!copy) + { + mDisplayName.append(" (no copy)"); + } + if(!mod) + { + mDisplayName.append(" (no modify)"); + } + if(!xfer) + { + mDisplayName.append(" (no transfer)"); + } + } + + return mDisplayName; +} + +// BUG: No creation dates for task inventory +time_t LLTaskInvFVBridge::getCreationDate() const +{ + return 0; +} + +LLUIImagePtr LLTaskInvFVBridge::getIcon() const +{ + BOOL item_is_multi = FALSE; + if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) + { + item_is_multi = TRUE; + } + + return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi ); +} + +void LLTaskInvFVBridge::openItem() +{ + // no-op. + lldebugs << "LLTaskInvFVBridge::openItem()" << llendl; +} + +void LLTaskInvFVBridge::previewItem() +{ + openItem(); +} + +BOOL LLTaskInvFVBridge::isItemRenameable() const +{ + if(gAgent.isGodlike()) return TRUE; + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + LLInventoryItem* item; + item = (LLInventoryItem*)(object->getInventoryObject(mUUID)); + if(item && gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), + GP_OBJECT_MANIPULATE, GOD_LIKE)) + { + return TRUE; + } + } + return FALSE; +} + +BOOL LLTaskInvFVBridge::renameItem(const std::string& new_name) +{ + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + LLViewerInventoryItem* item = NULL; + item = (LLViewerInventoryItem*)object->getInventoryObject(mUUID); + if(item && (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), + GP_OBJECT_MANIPULATE, GOD_LIKE))) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->rename(new_name); + object->updateInventory( + new_item, + TASK_INVENTORY_ITEM_KEY, + false); + } + } + return TRUE; +} + +BOOL LLTaskInvFVBridge::isItemMovable() const +{ + //LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + //if(object && (object->permModify() || gAgent.isGodlike())) + //{ + // return TRUE; + //} + //return FALSE; + return TRUE; +} + +BOOL LLTaskInvFVBridge::isItemRemovable() +{ + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object + && (object->permModify() || object->permYouOwner())) + { + return TRUE; + } + return FALSE; +} + +bool remove_task_inventory_callback(const LLSD& notification, const LLSD& response, LLPanelObjectInventory* panel) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID()); + if(option == 0 && object) + { + // yes + LLSD::array_const_iterator list_end = notification["payload"]["inventory_ids"].endArray(); + for (LLSD::array_const_iterator list_it = notification["payload"]["inventory_ids"].beginArray(); + list_it != list_end; + ++list_it) + { + object->removeInventory(list_it->asUUID()); + } + + // refresh the UI. + panel->refresh(); + } + return false; +} + +// helper for remove +// ! REFACTOR ! two_uuids_list_t is also defined in llinevntorybridge.h, but differently. +typedef std::pair<LLUUID, std::list<LLUUID> > panel_two_uuids_list_t; +typedef std::pair<LLPanelObjectInventory*, panel_two_uuids_list_t> remove_data_t; +BOOL LLTaskInvFVBridge::removeItem() +{ + if(isItemRemovable() && mPanel) + { + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + if(object->permModify()) + { + // just do it. + object->removeInventory(mUUID); + return TRUE; + } + else + { + remove_data_t* data = new remove_data_t; + data->first = mPanel; + data->second.first = mPanel->getTaskUUID(); + data->second.second.push_back(mUUID); + LLSD payload; + payload["task_id"] = mPanel->getTaskUUID(); + payload["inventory_ids"].append(mUUID); + LLNotifications::instance().add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel)); + return FALSE; + } + } + } + return FALSE; +} + +void LLTaskInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) +{ + if (!mPanel) + { + return; + } + + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if (!object) + { + return; + } + + if (!object->permModify()) + { + LLSD payload; + payload["task_id"] = mPanel->getTaskUUID(); + for (S32 i = 0; i < (S32)batch.size(); i++) + { + LLTaskInvFVBridge* itemp = (LLTaskInvFVBridge*)batch[i]; + payload["inventory_ids"].append(itemp->getUUID()); + } + LLNotifications::instance().add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel)); + + } + else + { + for (S32 i = 0; i < (S32)batch.size(); i++) + { + LLTaskInvFVBridge* itemp = (LLTaskInvFVBridge*)batch[i]; + + if(itemp->isItemRemovable()) + { + // just do it. + object->removeInventory(itemp->getUUID()); + } + } + } +} + +void LLTaskInvFVBridge::move(LLFolderViewEventListener* parent_listener) +{ +} + +BOOL LLTaskInvFVBridge::isItemCopyable() const +{ + LLInventoryItem* item = findItem(); + if(!item) return FALSE; + return gAgent.allowOperation(PERM_COPY, item->getPermissions(), + GP_OBJECT_MANIPULATE); +} + +BOOL LLTaskInvFVBridge::copyToClipboard() const +{ + return FALSE; +} + +void LLTaskInvFVBridge::cutToClipboard() +{ +} + +BOOL LLTaskInvFVBridge::isClipboardPasteable() const +{ + return FALSE; +} + +void LLTaskInvFVBridge::pasteFromClipboard() +{ +} + +void LLTaskInvFVBridge::pasteLinkFromClipboard() +{ +} + +BOOL LLTaskInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const +{ + //llinfos << "LLTaskInvFVBridge::startDrag()" << llendl; + if(mPanel) + { + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + LLInventoryItem* inv = NULL; + if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) + { + const LLPermissions& perm = inv->getPermissions(); + bool can_copy = gAgent.allowOperation(PERM_COPY, perm, + GP_OBJECT_MANIPULATE); + if (object->isAttachment() && !can_copy) + { + //RN: no copy contents of attachments cannot be dragged out + // due to a race condition and possible exploit where + // attached objects do not update their inventory items + // when their contents are manipulated + return FALSE; + } + if((can_copy && perm.allowTransferTo(gAgent.getID())) + || object->permYouOwner()) +// || gAgent.isGodlike()) + + { + *type = LLAssetType::lookupDragAndDropType(inv->getType()); + + *id = inv->getUUID(); + return TRUE; + } + } + } + } + return FALSE; +} + +BOOL LLTaskInvFVBridge::dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data) +{ + //llinfos << "LLTaskInvFVBridge::dragOrDrop()" << llendl; + return FALSE; +} + +// virtual +void LLTaskInvFVBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if (action == "task_buy") + { + // Check the price of the item. + S32 price = getPrice(); + if (-1 == price) + { + llwarns << "label_buy_task_bridged_item: Invalid price" << llendl; + } + else + { + if (price > 0 && price > gStatusBar->getBalance()) + { + LLFloaterBuyCurrency::buyCurrency("This costs", price); + } + else + { + buyItem(); + } + } + } + else if (action == "task_open") + { + openItem(); + } + else if (action == "task_properties") + { + showProperties(); + } +} + +void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + LLInventoryItem* item = findItem(); + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if (!item) + { + hide_context_entries(menu, items, disabled_items); + return; + } + + if(gAgent.allowOperation(PERM_OWNER, item->getPermissions(), + GP_OBJECT_MANIPULATE) + && item->getSaleInfo().isForSale()) + { + items.push_back(std::string("Task Buy")); + + std::string label= LLTrans::getString("Buy"); + // Check the price of the item. + S32 price = getPrice(); + if (-1 == price) + { + llwarns << "label_buy_task_bridged_item: Invalid price" << llendl; + } + else + { + std::ostringstream info; + info << LLTrans::getString("BuyforL$") << price; + label.assign(info.str()); + } + + const LLView::child_list_t *list = menu.getChildList(); + LLView::child_list_t::const_iterator itor; + for (itor = list->begin(); itor != list->end(); ++itor) + { + std::string name = (*itor)->getName(); + LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor); + if (name == "Task Buy" && menu_itemp) + { + menu_itemp->setLabel(label); + } + } + } + else + { + items.push_back(std::string("Task Open")); + if (!isItemCopyable()) + { + disabled_items.push_back(std::string("Task Open")); + } + } + items.push_back(std::string("Task Properties")); + if(isItemRenameable()) + { + items.push_back(std::string("Task Rename")); + } + if(isItemRemovable()) + { + items.push_back(std::string("Task Remove")); + } + + hide_context_entries(menu, items, disabled_items); +} + + +///---------------------------------------------------------------------------- +/// Class LLTaskFolderBridge +///---------------------------------------------------------------------------- + +class LLTaskCategoryBridge : public LLTaskInvFVBridge +{ +public: + LLTaskCategoryBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + virtual const std::string& getDisplayName() const { return getName(); } + virtual BOOL isItemRenameable() const; + virtual BOOL renameItem(const std::string& new_name); + virtual BOOL isItemRemovable(); + virtual void buildContextMenu(LLMenuGL& menu, U32 flags); + virtual BOOL hasChildren() const; + virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; + virtual BOOL dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data); +}; + +LLTaskCategoryBridge::LLTaskCategoryBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskCategoryBridge::getIcon() const +{ + return LLUI::getUIImage("Inv_FolderClosed"); +} + +BOOL LLTaskCategoryBridge::isItemRenameable() const +{ + return FALSE; +} + +BOOL LLTaskCategoryBridge::renameItem(const std::string& new_name) +{ + return FALSE; +} + +BOOL LLTaskCategoryBridge::isItemRemovable() +{ + return FALSE; +} + +void LLTaskCategoryBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + std::vector<std::string> items; + std::vector<std::string> disabled_items; + items.push_back(std::string("Task Open")); + hide_context_entries(menu, items, disabled_items); +} + +BOOL LLTaskCategoryBridge::hasChildren() const +{ + // return TRUE if we have or do know know if we have children. + // *FIX: For now, return FALSE - we will know for sure soon enough. + return FALSE; +} + +BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const +{ + //llinfos << "LLTaskInvFVBridge::startDrag()" << llendl; + if(mPanel) + { + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + LLInventoryItem* inv = NULL; + if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID))) + { + const LLPermissions& perm = inv->getPermissions(); + bool can_copy = gAgent.allowOperation(PERM_COPY, perm, + GP_OBJECT_MANIPULATE); + if((can_copy && perm.allowTransferTo(gAgent.getID())) + || object->permYouOwner()) +// || gAgent.isGodlike()) + + { + *type = LLAssetType::lookupDragAndDropType(inv->getType()); + + *id = inv->getUUID(); + return TRUE; + } + } + } + } + return FALSE; +} + +BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data) +{ + //llinfos << "LLTaskCategoryBridge::dragOrDrop()" << llendl; + BOOL accept = FALSE; + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(object) + { + switch(cargo_type) + { + case DAD_CATEGORY: + accept = LLToolDragAndDrop::getInstance()->dadUpdateInventoryCategory(object,drop); + break; + case DAD_TEXTURE: + case DAD_SOUND: + case DAD_LANDMARK: + case DAD_OBJECT: + case DAD_NOTECARD: + case DAD_CLOTHING: + case DAD_BODYPART: + case DAD_ANIMATION: + case DAD_GESTURE: + case DAD_CALLINGCARD: + accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data); + if(accept && drop) + { + LLToolDragAndDrop::dropInventory(object, + (LLViewerInventoryItem*)cargo_data, + LLToolDragAndDrop::getInstance()->getSource(), + LLToolDragAndDrop::getInstance()->getSourceID()); + } + break; + case DAD_SCRIPT: + // *HACK: In order to resolve SL-22177, we need to block + // drags from notecards and objects onto other + // objects. uncomment the simpler version when we have + // that right. + //accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data); + if(LLToolDragAndDrop::isInventoryDropAcceptable( + object, (LLViewerInventoryItem*)cargo_data) + && (LLToolDragAndDrop::SOURCE_WORLD != LLToolDragAndDrop::getInstance()->getSource()) + && (LLToolDragAndDrop::SOURCE_NOTECARD != LLToolDragAndDrop::getInstance()->getSource())) + { + accept = TRUE; + } + if(accept && drop) + { + LLViewerInventoryItem* item = (LLViewerInventoryItem*)cargo_data; + // rez in the script active by default, rez in + // inactive if the control key is being held down. + BOOL active = ((mask & MASK_CONTROL) == 0); + LLToolDragAndDrop::dropScript(object, item, active, + LLToolDragAndDrop::getInstance()->getSource(), + LLToolDragAndDrop::getInstance()->getSourceID()); + } + break; + default: + break; + } + } + return accept; +} + +///---------------------------------------------------------------------------- +/// Class LLTaskTextureBridge +///---------------------------------------------------------------------------- + +class LLTaskTextureBridge : public LLTaskInvFVBridge +{ +public: + LLTaskTextureBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + LLInventoryType::EType it); + + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); +protected: + LLInventoryType::EType mInventoryType; +}; + +LLTaskTextureBridge::LLTaskTextureBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + LLInventoryType::EType it) : + LLTaskInvFVBridge(panel, uuid, name), + mInventoryType(it) +{ +} + +LLUIImagePtr LLTaskTextureBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_TEXTURE, mInventoryType, 0, FALSE); +} + +void LLTaskTextureBridge::openItem() +{ + llinfos << "LLTaskTextureBridge::openItem()" << llendl; + LLPreviewTexture* preview = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); + if(preview) + { + preview->setObjectID(mPanel->getTaskUUID()); + } +} + + +///---------------------------------------------------------------------------- +/// Class LLTaskSoundBridge +///---------------------------------------------------------------------------- + +class LLTaskSoundBridge : public LLTaskInvFVBridge +{ +public: + LLTaskSoundBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); + virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); + virtual void buildContextMenu(LLMenuGL& menu, U32 flags); + static void openSoundPreview(void* data); +}; + +LLTaskSoundBridge::LLTaskSoundBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskSoundBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE); +} + +void LLTaskSoundBridge::openItem() +{ + openSoundPreview((void*)this); +} + +void LLTaskSoundBridge::openSoundPreview(void* data) +{ + LLTaskSoundBridge* self = (LLTaskSoundBridge*)data; + if(!self) + return; + + LLPreviewSound* preview = LLFloaterReg::showTypedInstance<LLPreviewSound>("preview_sound", LLSD(self->mUUID), TAKE_FOCUS_YES); + if (preview) + { + preview->setObjectID(self->mPanel->getTaskUUID()); + } +} + +// virtual +void LLTaskSoundBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if (action == "task_play") + { + LLInventoryItem* item = findItem(); + if(item) + { + send_sound_trigger(item->getAssetUUID(), 1.0); + } + } + LLTaskInvFVBridge::performAction(folder, model, action); +} + +void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + LLInventoryItem* item = findItem(); + if(!item) return; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(item->getPermissions().getOwner() != gAgent.getID() + && item->getSaleInfo().isForSale()) + { + items.push_back(std::string("Task Buy")); + + std::string label= LLTrans::getString("Buy"); + // Check the price of the item. + S32 price = getPrice(); + if (-1 == price) + { + llwarns << "label_buy_task_bridged_item: Invalid price" << llendl; + } + else + { + std::ostringstream info; + info << LLTrans::getString("BuyforL$") << price; + label.assign(info.str()); + } + + const LLView::child_list_t *list = menu.getChildList(); + LLView::child_list_t::const_iterator itor; + for (itor = list->begin(); itor != list->end(); ++itor) + { + std::string name = (*itor)->getName(); + LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor); + if (name == "Task Buy" && menu_itemp) + { + menu_itemp->setLabel(label); + } + } + } + else + { + items.push_back(std::string("Task Open")); + if (!isItemCopyable()) + { + disabled_items.push_back(std::string("Task Open")); + } + } + items.push_back(std::string("Task Properties")); + if(isItemRenameable()) + { + items.push_back(std::string("Task Rename")); + } + if(isItemRemovable()) + { + items.push_back(std::string("Task Remove")); + } + + items.push_back(std::string("Task Play")); + + + hide_context_entries(menu, items, disabled_items); +} + +///---------------------------------------------------------------------------- +/// Class LLTaskLandmarkBridge +///---------------------------------------------------------------------------- + +class LLTaskLandmarkBridge : public LLTaskInvFVBridge +{ +public: + LLTaskLandmarkBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; +}; + +LLTaskLandmarkBridge::LLTaskLandmarkBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskLandmarkBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0, FALSE); +} + + +///---------------------------------------------------------------------------- +/// Class LLTaskCallingCardBridge +///---------------------------------------------------------------------------- + +class LLTaskCallingCardBridge : public LLTaskInvFVBridge +{ +public: + LLTaskCallingCardBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + virtual BOOL isItemRenameable() const; + virtual BOOL renameItem(const std::string& new_name); +}; + +LLTaskCallingCardBridge::LLTaskCallingCardBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskCallingCardBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0, FALSE); +} + +BOOL LLTaskCallingCardBridge::isItemRenameable() const +{ + return FALSE; +} + +BOOL LLTaskCallingCardBridge::renameItem(const std::string& new_name) +{ + return FALSE; +} + + +///---------------------------------------------------------------------------- +/// Class LLTaskScriptBridge +///---------------------------------------------------------------------------- + +class LLTaskScriptBridge : public LLTaskInvFVBridge +{ +public: + LLTaskScriptBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + //static BOOL enableIfCopyable( void* userdata ); +}; + +LLTaskScriptBridge::LLTaskScriptBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskScriptBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); +} + + +class LLTaskLSLBridge : public LLTaskScriptBridge +{ +public: + LLTaskLSLBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual void openItem(); + virtual BOOL removeItem(); + //virtual void buildContextMenu(LLMenuGL& menu); + + //static void copyToInventory(void* userdata); +}; + +LLTaskLSLBridge::LLTaskLSLBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskScriptBridge(panel, uuid, name) +{ +} + +void LLTaskLSLBridge::openItem() +{ + llinfos << "LLTaskLSLBridge::openItem() " << mUUID << llendl; + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(!object || object->isInventoryPending()) + { + return; + } + LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES); + if (preview && (object->permModify() || gAgent.isGodlike())) + { + preview->setObjectID(mPanel->getTaskUUID()); + } +} + +BOOL LLTaskLSLBridge::removeItem() +{ + LLFloaterReg::hideInstance("preview_scriptedit", LLSD(mUUID)); + return LLTaskInvFVBridge::removeItem(); +} + +///---------------------------------------------------------------------------- +/// Class LLTaskObjectBridge +///---------------------------------------------------------------------------- + +class LLTaskObjectBridge : public LLTaskInvFVBridge +{ +public: + LLTaskObjectBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; +}; + +LLTaskObjectBridge::LLTaskObjectBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskObjectBridge::getIcon() const +{ + BOOL item_is_multi = FALSE; + if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) + { + item_is_multi = TRUE; + } + + return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi); +} + +///---------------------------------------------------------------------------- +/// Class LLTaskNotecardBridge +///---------------------------------------------------------------------------- + +class LLTaskNotecardBridge : public LLTaskInvFVBridge +{ +public: + LLTaskNotecardBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); + virtual BOOL removeItem(); +}; + +LLTaskNotecardBridge::LLTaskNotecardBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskNotecardBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE); +} + +void LLTaskNotecardBridge::openItem() +{ + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(!object || object->isInventoryPending()) + { + return; + } + if(object->permModify() || gAgent.isGodlike()) + { + LLPreviewNotecard* preview = LLFloaterReg::showTypedInstance<LLPreviewNotecard>("preview_notecard", LLSD(mUUID), TAKE_FOCUS_YES); + if (preview) + { + preview->setObjectID(mPanel->getTaskUUID()); + } + } +} + +BOOL LLTaskNotecardBridge::removeItem() +{ + LLFloaterReg::hideInstance("preview_notecard", LLSD(mUUID)); + return LLTaskInvFVBridge::removeItem(); +} + +///---------------------------------------------------------------------------- +/// Class LLTaskGestureBridge +///---------------------------------------------------------------------------- + +class LLTaskGestureBridge : public LLTaskInvFVBridge +{ +public: + LLTaskGestureBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); + virtual BOOL removeItem(); +}; + +LLTaskGestureBridge::LLTaskGestureBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskGestureBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE); +} + +void LLTaskGestureBridge::openItem() +{ + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(!object || object->isInventoryPending()) + { + return; + } + LLPreviewGesture::show(mUUID, mPanel->getTaskUUID()); +} + +BOOL LLTaskGestureBridge::removeItem() +{ + // Don't need to deactivate gesture because gestures inside objects can never be active. + LLFloaterReg::hideInstance("preview_gesture", LLSD(mUUID)); + return LLTaskInvFVBridge::removeItem(); +} + +///---------------------------------------------------------------------------- +/// Class LLTaskAnimationBridge +///---------------------------------------------------------------------------- + +class LLTaskAnimationBridge : public LLTaskInvFVBridge +{ +public: + LLTaskAnimationBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name); + + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); + virtual BOOL removeItem(); +}; + +LLTaskAnimationBridge::LLTaskAnimationBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name) : + LLTaskInvFVBridge(panel, uuid, name) +{ +} + +LLUIImagePtr LLTaskAnimationBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); +} + +void LLTaskAnimationBridge::openItem() +{ + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if(!object || object->isInventoryPending()) + { + return; + } + + LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); + if (preview && (object->permModify() || gAgent.isGodlike())) + { + preview->setObjectID(mPanel->getTaskUUID()); + } +} + +BOOL LLTaskAnimationBridge::removeItem() +{ + LLFloaterReg::hideInstance("preview_anim", LLSD(mUUID)); + return LLTaskInvFVBridge::removeItem(); +} + +///---------------------------------------------------------------------------- +/// Class LLTaskWearableBridge +///---------------------------------------------------------------------------- + +class LLTaskWearableBridge : public LLTaskInvFVBridge +{ +public: + LLTaskWearableBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + LLAssetType::EType asset_type, + U32 flags); + + virtual LLUIImagePtr getIcon() const; + +protected: + LLAssetType::EType mAssetType; +}; + +LLTaskWearableBridge::LLTaskWearableBridge( + LLPanelObjectInventory* panel, + const LLUUID& uuid, + const std::string& name, + LLAssetType::EType asset_type, + U32 flags) : + LLTaskInvFVBridge(panel, uuid, name, flags), + mAssetType( asset_type ) +{ +} + +LLUIImagePtr LLTaskWearableBridge::getIcon() const +{ + return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE ); +} + + +///---------------------------------------------------------------------------- +/// LLTaskInvFVBridge impl +//---------------------------------------------------------------------------- + +LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory* panel, + LLInventoryObject* object) +{ + LLTaskInvFVBridge* new_bridge = NULL; + LLAssetType::EType type = object->getType(); + LLInventoryItem* item = NULL; + switch(type) + { + case LLAssetType::AT_TEXTURE: + item = (LLInventoryItem*)object; + new_bridge = new LLTaskTextureBridge(panel, + object->getUUID(), + object->getName(), + item->getInventoryType()); + break; + case LLAssetType::AT_SOUND: + new_bridge = new LLTaskSoundBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_LANDMARK: + new_bridge = new LLTaskLandmarkBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_CALLINGCARD: + new_bridge = new LLTaskCallingCardBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_SCRIPT: + // OLD SCRIPTS DEPRECATED - JC + llwarns << "Old script" << llendl; + //new_bridge = new LLTaskOldScriptBridge(panel, + // object->getUUID(), + // object->getName()); + break; + case LLAssetType::AT_OBJECT: + new_bridge = new LLTaskObjectBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_NOTECARD: + new_bridge = new LLTaskNotecardBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_ANIMATION: + new_bridge = new LLTaskAnimationBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_GESTURE: + new_bridge = new LLTaskGestureBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_BODYPART: + item = (LLInventoryItem*)object; + new_bridge = new LLTaskWearableBridge(panel, + object->getUUID(), + object->getName(), + type, + item->getFlags()); + break; + case LLAssetType::AT_CATEGORY: + case LLAssetType::AT_FAVORITE: + new_bridge = new LLTaskCategoryBridge(panel, + object->getUUID(), + object->getName()); + break; + case LLAssetType::AT_LSL_TEXT: + new_bridge = new LLTaskLSLBridge(panel, + object->getUUID(), + object->getName()); + break; + + break; + default: + llinfos << "Unhandled inventory type (llassetstorage.h): " + << (S32)type << llendl; + break; + } + return new_bridge; +} + + +///---------------------------------------------------------------------------- +/// Class LLPanelObjectInventory +///---------------------------------------------------------------------------- + +static LLDefaultChildRegistry::Register<LLPanelObjectInventory> r("panel_inventory_object"); + +void do_nothing() +{ +} + +// Default constructor +LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Params& p) : + LLPanel(p), + mScroller(NULL), + mFolders(NULL), + mHaveInventory(FALSE), + mIsInventoryEmpty(TRUE), + mInventoryNeedsUpdate(FALSE) +{ + // Setup context menu callbacks + mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); + mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&do_nothing)); + mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing)); + mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing)); +} + +// Destroys the object +LLPanelObjectInventory::~LLPanelObjectInventory() +{ + if (!gIdleCallbacks.deleteFunction(idle, this)) + { + llwarns << "LLPanelObjectInventory::~LLPanelObjectInventory() failed to delete callback" << llendl; + } +} + +BOOL LLPanelObjectInventory::postBuild() +{ + // clear contents and initialize menus, sets up mFolders + reset(); + + // Register an idle update callback + gIdleCallbacks.addFunction(idle, this); + + return TRUE; +} + +void LLPanelObjectInventory::doToSelected(const LLSD& userdata) +{ + mFolders->doToSelected(&gInventory, userdata); +} + +void LLPanelObjectInventory::clearContents() +{ + mHaveInventory = FALSE; + mIsInventoryEmpty = TRUE; + if (LLToolDragAndDrop::getInstance() && LLToolDragAndDrop::getInstance()->getSource() == LLToolDragAndDrop::SOURCE_WORLD) + { + LLToolDragAndDrop::getInstance()->endDrag(); + } + + if( mScroller ) + { + // removes mFolders + removeChild( mScroller ); //*TODO: Really shouldn't do this during draw()/refresh() + mScroller->die(); + mScroller = NULL; + mFolders = NULL; + } +} + + +void LLPanelObjectInventory::reset() +{ + clearContents(); + + setBorderVisible(FALSE); + + mCommitCallbackRegistrar.pushScope(); // push local callbacks + + LLRect dummy_rect(0, 1, 1, 0); + LLFolderView::Params p; + p.name = "task inventory"; + p.task_id = getTaskUUID(); + p.parent_panel = this; + mFolders = LLUICtrlFactory::create<LLFolderView>(p); + // this ensures that we never say "searching..." or "no items found" + mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS); + mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); + + LLRect scroller_rect(0, getRect().getHeight(), getRect().getWidth(), 0); + LLScrollContainer::Params scroll_p; + scroll_p.name("task inventory scroller"); + scroll_p.rect(scroller_rect); + scroll_p.follows.flags(FOLLOWS_ALL); + mScroller = LLUICtrlFactory::create<LLScrollContainer>(scroll_p); + addChild(mScroller); + mScroller->addChild(mFolders); + + mFolders->setScrollContainer( mScroller ); + + mCommitCallbackRegistrar.popScope(); +} + +void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object, + InventoryObjectList* inventory, + S32 serial_num, + void* data) +{ + if(!object) return; + + //llinfos << "invetnory arrived: \n" + // << " panel UUID: " << panel->mTaskUUID << "\n" + // << " task UUID: " << object->mID << llendl; + if(mTaskUUID == object->mID) + { + mInventoryNeedsUpdate = TRUE; + } + + // refresh any properties floaters that are hanging around. + if(inventory) + { + for (InventoryObjectList::const_iterator iter = inventory->begin(); + iter != inventory->end(); ) + { + LLInventoryObject* item = *iter++; + LLFloaterProperties* floater = LLFloaterReg::findTypedInstance<LLFloaterProperties>("properites", item->getUUID()); + if(floater) + { + floater->refresh(); + } + } + } +} + +void LLPanelObjectInventory::updateInventory() +{ + //llinfos << "inventory arrived: \n" + // << " panel UUID: " << panel->mTaskUUID << "\n" + // << " task UUID: " << object->mID << llendl; + // We're still interested in this task's inventory. + std::set<LLUUID> selected_items; + BOOL inventory_has_focus = FALSE; + if (mHaveInventory && mFolders->getNumSelectedDescendants()) + { + mFolders->getSelectionList(selected_items); + inventory_has_focus = gFocusMgr.childHasKeyboardFocus(mFolders); + } + + reset(); + + LLViewerObject* objectp = gObjectList.findObject(mTaskUUID); + if (objectp) + { + LLInventoryObject* inventory_root = objectp->getInventoryRoot(); + InventoryObjectList contents; + objectp->getInventoryContents(contents); + if (inventory_root) + { + createFolderViews(inventory_root, contents); + mHaveInventory = TRUE; + mIsInventoryEmpty = FALSE; + mFolders->setEnabled(TRUE); + } + else + { + // TODO: create an empty inventory + mIsInventoryEmpty = TRUE; + mHaveInventory = TRUE; + } + } + else + { + // TODO: create an empty inventory + mIsInventoryEmpty = TRUE; + mHaveInventory = TRUE; + } + + // restore previous selection + std::set<LLUUID>::iterator selection_it; + BOOL first_item = TRUE; + for (selection_it = selected_items.begin(); selection_it != selected_items.end(); ++selection_it) + { + LLFolderViewItem* selected_item = mFolders->getItemByID(*selection_it); + if (selected_item) + { + //HACK: "set" first item then "change" each other one to get keyboard focus right + if (first_item) + { + mFolders->setSelection(selected_item, TRUE, inventory_has_focus); + first_item = FALSE; + } + else + { + mFolders->changeSelection(selected_item, TRUE); + } + } + } + + mFolders->requestArrange(); + mInventoryNeedsUpdate = FALSE; +} + +// *FIX: This is currently a very expensive operation, because we have +// to iterate through the inventory one time for each category. This +// leads to an N^2 based on the category count. This could be greatly +// speeded with an efficient multimap implementation, but we don't +// have that in our current arsenal. +void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents) +{ + if (!inventory_root) + { + return; + } + // Create a visible root category. + LLTaskInvFVBridge* bridge = NULL; + bridge = LLTaskInvFVBridge::createObjectBridge(this, inventory_root); + if(bridge) + { + LLFolderViewFolder* new_folder = NULL; + LLFolderViewFolder::Params p; + p.name = inventory_root->getName(); + p.icon = LLUI::getUIImage("Inv_FolderClosed"); + p.icon_open = LLUI::getUIImage("Inv_FolderOpen"); + p.root = mFolders; + p.listener = bridge; + new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p); + new_folder->addToFolder(mFolders, mFolders); + new_folder->toggleOpen(); + + createViewsForCategory(&contents, inventory_root, new_folder); + } +} + +typedef std::pair<LLInventoryObject*, LLFolderViewFolder*> obj_folder_pair; + +void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* inventory, + LLInventoryObject* parent, + LLFolderViewFolder* folder) +{ + // Find all in the first pass + LLDynamicArray<obj_folder_pair*> child_categories; + LLTaskInvFVBridge* bridge; + LLFolderViewItem* view; + + InventoryObjectList::iterator it = inventory->begin(); + InventoryObjectList::iterator end = inventory->end(); + for( ; it != end; ++it) + { + LLInventoryObject* obj = *it; + + if(parent->getUUID() == obj->getParentUUID()) + { + bridge = LLTaskInvFVBridge::createObjectBridge(this, obj); + if(!bridge) + { + continue; + } + if(LLAssetType::AT_CATEGORY == obj->getType()) + { + LLFolderViewFolder::Params p; + p.name = obj->getName(); + p.icon = LLUI::getUIImage("Inv_FolderClosed"); + p.icon_open = LLUI::getUIImage("Inv_FolderOpen"); + p.root = mFolders; + p.listener = bridge; + view = LLUICtrlFactory::create<LLFolderViewFolder>(p); + child_categories.put(new obj_folder_pair(obj, + (LLFolderViewFolder*)view)); + } + else + { + LLFolderViewItem::Params params; + params.name(obj->getName()); + params.icon(bridge->getIcon()); + params.creation_date(bridge->getCreationDate()); + params.root(mFolders); + params.listener(bridge); + params.rect(LLRect()); + view = LLUICtrlFactory::create<LLFolderViewItem> (params); + } + view->addToFolder(folder, mFolders); + } + } + + // now, for each category, do the second pass + for(S32 i = 0; i < child_categories.count(); i++) + { + createViewsForCategory(inventory, child_categories[i]->first, + child_categories[i]->second ); + delete child_categories[i]; + } +} + +void LLPanelObjectInventory::refresh() +{ + //llinfos << "LLPanelObjectInventory::refresh()" << llendl; + BOOL has_inventory = FALSE; + const BOOL non_root_ok = TRUE; + LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(NULL, non_root_ok); + if(node) + { + LLViewerObject* object = node->getObject(); + if(object && ((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1) + || (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1))) + { + // determine if we need to make a request. Start with a + // default based on if we have inventory at all. + BOOL make_request = !mHaveInventory; + + // If the task id is different than what we've stored, + // then make the request. + if(mTaskUUID != object->mID) + { + mTaskUUID = object->mID; + make_request = TRUE; + + // This is a new object so pre-emptively clear the contents + // Otherwise we show the old stuff until the update comes in + clearContents(); + + // Register for updates from this object, + registerVOInventoryListener(object,NULL); + } + + // Based on the node information, we may need to dirty the + // object inventory and get it again. + if(node->mValid) + { + if(node->mInventorySerial != object->getInventorySerial() || object->isInventoryDirty()) + { + make_request = TRUE; + } + } + + // do the request if necessary. + if(make_request) + { + requestVOInventory(); + } + has_inventory = TRUE; + } + } + if(!has_inventory) + { + mTaskUUID = LLUUID::null; + removeVOInventoryListener(); + clearContents(); + } + //llinfos << "LLPanelObjectInventory::refresh() " << mTaskUUID << llendl; +} + +void LLPanelObjectInventory::removeSelectedItem() +{ + if(mFolders) + { + mFolders->removeSelectedItems(); + } +} + +void LLPanelObjectInventory::startRenamingSelectedItem() +{ + if(mFolders) + { + mFolders->startRenamingSelectedItem(); + } +} + +void LLPanelObjectInventory::draw() +{ + LLPanel::draw(); + + if(mIsInventoryEmpty) + { + if((LLUUID::null != mTaskUUID) && (!mHaveInventory)) + { + LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("LoadingContents"), 0, + (S32)(getRect().getWidth() * 0.5f), + 10, + LLColor4( 1, 1, 1, 1 ), + LLFontGL::HCENTER, + LLFontGL::BOTTOM); + } + else if(mHaveInventory) + { + LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("NoContents"), 0, + (S32)(getRect().getWidth() * 0.5f), + 10, + LLColor4( 1, 1, 1, 1 ), + LLFontGL::HCENTER, + LLFontGL::BOTTOM); + } + } +} + +void LLPanelObjectInventory::deleteAllChildren() +{ + mScroller = NULL; + mFolders = NULL; + LLView::deleteAllChildren(); +} + +BOOL LLPanelObjectInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg) +{ + if (mFolders && mHaveInventory) + { + LLFolderViewItem* folderp = mFolders->getNextFromChild(NULL); + if (!folderp) + { + return FALSE; + } + // Try to pass on unmodified mouse coordinates + S32 local_x = x - mFolders->getRect().mLeft; + S32 local_y = y - mFolders->getRect().mBottom; + + if (mFolders->pointInView(local_x, local_y)) + { + return mFolders->handleDragAndDrop(local_x, local_y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); + } + else + { + //force mouse coordinates to be inside folder rectangle + return mFolders->handleDragAndDrop(5, 1, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); + } + } + else + { + return FALSE; + } +} + +//static +void LLPanelObjectInventory::idle(void* user_data) +{ + LLPanelObjectInventory* self = (LLPanelObjectInventory*)user_data; + + + if (self->mInventoryNeedsUpdate) + { + self->updateInventory(); + } +} diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 8a1b97695d1..b5481cdf2dc 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -1,276 +1,247 @@ -/** - * @file LLSidepanelInventory.cpp - * @brief Side Bar "Inventory" panel - * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * - * Copyright (c) 2004-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" -#include "llsidepanelinventory.h" - -#include "llagent.h" -#include "llbutton.h" -#include "llinventorybridge.h" -#include "llinventorypanel.h" -#include "llpanelmaininventory.h" -#include "llsidepanelobjectinfo.h" -#include "lltabcontainer.h" - -static const S32 LANDMARK_FOLDERS_MENU_WIDTH = 250; -static const std::string AGENT_INFO_TYPE = "agent"; -static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark"; -static const std::string LANDMARK_INFO_TYPE = "landmark"; -static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place"; -static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history"; - -// Helper functions -static void setAllChildrenVisible(LLView* view, BOOL visible); - -static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); - -LLSidepanelInventory::LLSidepanelInventory() - : LLPanel(), - mSidepanelObjectInfo(NULL), - mItem(NULL) -{ - - //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() -} - -LLSidepanelInventory::~LLSidepanelInventory() -{ -} - -BOOL LLSidepanelInventory::postBuild() -{ - mInfoBtn = getChild<LLButton>("info_btn"); - mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this)); - - mShareBtn = getChild<LLButton>("share_btn"); - mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); - - mShareBtn = getChild<LLButton>("share_btn"); - mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); - - mWearBtn = getChild<LLButton>("wear_btn"); - mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this)); - - mPlayBtn = getChild<LLButton>("play_btn"); - mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this)); - - mTeleportBtn = getChild<LLButton>("teleport_btn"); - mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this)); - - mOverflowBtn = getChild<LLButton>("overflow_btn"); - mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this)); - - mTabContainer = getChild<LLTabContainer>("Inventory Tabs"); - mSidepanelObjectInfo = getChild<LLSidepanelObjectInfo>("sidepanel_object_info"); - - mPanelMainInventory = getChild<LLPanelMainInventory>("panel_main_inventory"); - mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); - - LLButton* back_btn = mSidepanelObjectInfo->getChild<LLButton>("back_btn"); - back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); - - return TRUE; -} - -void LLSidepanelInventory::onOpen(const LLSD& key) -{ - if(mSidepanelObjectInfo == NULL || key.size() == 0) - return; - - mItem = NULL; - - LLInventoryItem* item = gInventory.getItem(key["id"].asUUID()); - if (!item) - { - return; - } - setItem(item); - toggleObjectInfoPanel(TRUE); -} - -void LLSidepanelInventory::setItem(LLInventoryItem* item) -{ - if (!mSidepanelObjectInfo || !item) - return; - - mItem = item; - - LLAssetType::EType item_type = mItem->getActualType(); - if (item_type == LLAssetType::AT_LINK) - { - mItem = gInventory.getItem(mItem->getLinkedUUID()); - if (mItem.isNull()) - return; - } - - // Check if item is in agent's inventory and he has the permission to modify it. - BOOL is_object_editable = gInventory.isObjectDescendentOf(mItem->getUUID(), gInventory.getRootFolderID()) && - mItem->getPermissions().allowModifyBy(gAgent.getID()); - - mInfoBtn->setEnabled(is_object_editable); - // mSaveBtn->setEnabled(is_object_editable); - - mSidepanelObjectInfo->displayItemInfo(mItem); -} - -void LLSidepanelInventory::onInfoButtonClicked() -{ - LLInventoryItem *item = getSelectedItem(); - if (item) - { - setItem(item); - toggleObjectInfoPanel(TRUE); - } -} - -void LLSidepanelInventory::onShareButtonClicked() -{ -} - -void LLSidepanelInventory::performActionOnSelection(const std::string &action) -{ - LLInventoryPanel *panel = mPanelMainInventory->getActivePanel(); - LLFolderViewItem* current_item = panel->getRootFolder()->getCurSelectedItem(); - if (!current_item) - { - return; - } - current_item->getListener()->performAction(panel->getRootFolder(), panel->getModel(), action); -} - -void LLSidepanelInventory::onWearButtonClicked() -{ - performActionOnSelection("wear"); - performActionOnSelection("attach"); -} - -void LLSidepanelInventory::onPlayButtonClicked() -{ - performActionOnSelection("activate"); -} - -void LLSidepanelInventory::onTeleportButtonClicked() -{ - performActionOnSelection("teleport"); -} - -void LLSidepanelInventory::onOverflowButtonClicked() -{ -} - -void LLSidepanelInventory::onBackButtonClicked() -{ - if (!mSidepanelObjectInfo) - return; - - toggleObjectInfoPanel(FALSE); - - - updateVerbs(); -} - -void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) -{ - updateVerbs(); -} - -void LLSidepanelInventory::toggleObjectInfoPanel(BOOL visible) -{ - if (!mSidepanelObjectInfo) - return; - - mSidepanelObjectInfo->setVisible(visible); - mTabContainer->setVisible(!visible); - - if (visible) - { - mSidepanelObjectInfo->reset(); - mSidepanelObjectInfo->setEditMode(FALSE); - - LLRect rect = getRect(); - LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); - mSidepanelObjectInfo->reshape(new_rect.getWidth(),new_rect.getHeight()); - } -} - -void LLSidepanelInventory::updateVerbs() -{ - mInfoBtn->setEnabled(FALSE); - mShareBtn->setEnabled(FALSE); - - mWearBtn->setVisible(FALSE); - mWearBtn->setEnabled(FALSE); - mPlayBtn->setVisible(FALSE); - mPlayBtn->setEnabled(FALSE); - mTeleportBtn->setVisible(FALSE); - mTeleportBtn->setEnabled(FALSE); - - const LLInventoryItem *item = getSelectedItem(); - if (!item) - return; - - mInfoBtn->setEnabled(TRUE); - mShareBtn->setEnabled(TRUE); - - switch(item->getInventoryType()) - { - case LLInventoryType::IT_WEARABLE: - case LLInventoryType::IT_OBJECT: - case LLInventoryType::IT_ATTACHMENT: - mWearBtn->setVisible(TRUE); - mWearBtn->setEnabled(TRUE); - break; - case LLInventoryType::IT_SOUND: - case LLInventoryType::IT_GESTURE: - case LLInventoryType::IT_ANIMATION: - mPlayBtn->setVisible(TRUE); - mPlayBtn->setEnabled(TRUE); - break; - case LLInventoryType::IT_LANDMARK: - mTeleportBtn->setVisible(TRUE); - mTeleportBtn->setEnabled(TRUE); - break; - default: - break; - } -} - -LLInventoryItem *LLSidepanelInventory::getSelectedItem() -{ - LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); - if (!current_item) - { - return NULL; - } - const LLUUID &item_id = current_item->getListener()->getUUID(); - LLInventoryItem *item = gInventory.getItem(item_id); - return item; -} +/** + * @file LLSidepanelInventory.cpp + * @brief Side Bar "Inventory" panel + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llsidepanelinventory.h" + +#include "llagent.h" +#include "llbutton.h" +#include "llinventorybridge.h" +#include "llinventorypanel.h" +#include "llpanelmaininventory.h" +#include "llsidepanelobjectinfo.h" +#include "lltabcontainer.h" + +static const S32 LANDMARK_FOLDERS_MENU_WIDTH = 250; +static const std::string AGENT_INFO_TYPE = "agent"; +static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark"; +static const std::string LANDMARK_INFO_TYPE = "landmark"; +static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place"; +static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history"; + +// Helper functions +static void setAllChildrenVisible(LLView* view, BOOL visible); + +static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); + +LLSidepanelInventory::LLSidepanelInventory() + : LLPanel(), + mSidepanelObjectInfo(NULL) +{ + + //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() +} + +LLSidepanelInventory::~LLSidepanelInventory() +{ +} + +BOOL LLSidepanelInventory::postBuild() +{ + mInfoBtn = getChild<LLButton>("info_btn"); + mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this)); + + mShareBtn = getChild<LLButton>("share_btn"); + mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); + + mShareBtn = getChild<LLButton>("share_btn"); + mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); + + mWearBtn = getChild<LLButton>("wear_btn"); + mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this)); + + mPlayBtn = getChild<LLButton>("play_btn"); + mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this)); + + mTeleportBtn = getChild<LLButton>("teleport_btn"); + mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this)); + + mOverflowBtn = getChild<LLButton>("overflow_btn"); + mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this)); + + mTabContainer = getChild<LLTabContainer>("Inventory Tabs"); + mSidepanelObjectInfo = getChild<LLSidepanelObjectInfo>("sidepanel_object_info"); + + mPanelMainInventory = getChild<LLPanelMainInventory>("panel_main_inventory"); + mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); + + LLButton* back_btn = mSidepanelObjectInfo->getChild<LLButton>("back_btn"); + back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); + + return TRUE; +} + +void LLSidepanelInventory::onOpen(const LLSD& key) +{ + if(key.size() == 0) + return; + + mSidepanelObjectInfo->reset(); + + if (key.has("id")) + { + mSidepanelObjectInfo->setItemID(key["id"].asUUID()); + } + + if (key.has("object")) + { + mSidepanelObjectInfo->setObjectID(key["object"].asUUID()); + } + + toggleObjectInfoPanel(TRUE); +} + +void LLSidepanelInventory::onInfoButtonClicked() +{ + LLInventoryItem *item = getSelectedItem(); + if (item) + { + mSidepanelObjectInfo->reset(); + mSidepanelObjectInfo->setItemID(item->getUUID()); + toggleObjectInfoPanel(TRUE); + } +} + +void LLSidepanelInventory::onShareButtonClicked() +{ +} + +void LLSidepanelInventory::performActionOnSelection(const std::string &action) +{ + LLInventoryPanel *panel = mPanelMainInventory->getActivePanel(); + LLFolderViewItem* current_item = panel->getRootFolder()->getCurSelectedItem(); + if (!current_item) + { + return; + } + current_item->getListener()->performAction(panel->getRootFolder(), panel->getModel(), action); +} + +void LLSidepanelInventory::onWearButtonClicked() +{ + performActionOnSelection("wear"); + performActionOnSelection("attach"); +} + +void LLSidepanelInventory::onPlayButtonClicked() +{ + performActionOnSelection("activate"); +} + +void LLSidepanelInventory::onTeleportButtonClicked() +{ + performActionOnSelection("teleport"); +} + +void LLSidepanelInventory::onOverflowButtonClicked() +{ +} + +void LLSidepanelInventory::onBackButtonClicked() +{ + toggleObjectInfoPanel(FALSE); + updateVerbs(); +} + +void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) +{ + updateVerbs(); +} + +void LLSidepanelInventory::toggleObjectInfoPanel(BOOL visible) +{ + mSidepanelObjectInfo->setVisible(visible); + mTabContainer->setVisible(!visible); + + if (visible) + { + mSidepanelObjectInfo->reset(); + mSidepanelObjectInfo->setEditMode(FALSE); + + LLRect rect = getRect(); + LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); + mSidepanelObjectInfo->reshape(new_rect.getWidth(),new_rect.getHeight()); + } +} + +void LLSidepanelInventory::updateVerbs() +{ + mInfoBtn->setEnabled(FALSE); + mShareBtn->setEnabled(FALSE); + + mWearBtn->setVisible(FALSE); + mWearBtn->setEnabled(FALSE); + mPlayBtn->setVisible(FALSE); + mPlayBtn->setEnabled(FALSE); + mTeleportBtn->setVisible(FALSE); + mTeleportBtn->setEnabled(FALSE); + + const LLInventoryItem *item = getSelectedItem(); + if (!item) + return; + + mInfoBtn->setEnabled(TRUE); + mShareBtn->setEnabled(TRUE); + + switch(item->getInventoryType()) + { + case LLInventoryType::IT_WEARABLE: + case LLInventoryType::IT_OBJECT: + case LLInventoryType::IT_ATTACHMENT: + mWearBtn->setVisible(TRUE); + mWearBtn->setEnabled(TRUE); + break; + case LLInventoryType::IT_SOUND: + case LLInventoryType::IT_GESTURE: + case LLInventoryType::IT_ANIMATION: + mPlayBtn->setVisible(TRUE); + mPlayBtn->setEnabled(TRUE); + break; + case LLInventoryType::IT_LANDMARK: + mTeleportBtn->setVisible(TRUE); + mTeleportBtn->setEnabled(TRUE); + break; + default: + break; + } +} + +LLInventoryItem *LLSidepanelInventory::getSelectedItem() +{ + LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); + if (!current_item) + { + return NULL; + } + const LLUUID &item_id = current_item->getListener()->getUUID(); + LLInventoryItem *item = gInventory.getItem(item_id); + return item; +} diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index 784f5e43b7c..62eeecc5e23 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -1,85 +1,80 @@ -/** - * @file LLSidepanelInventory.h - * @brief Side Bar "Inventory" panel - * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * - * Copyright (c) 2004-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_LLSIDEPANELINVENTORY_H -#define LL_LLSIDEPANELINVENTORY_H - -#include "llpanel.h" - -class LLInventoryItem; -class LLSidepanelObjectInfo; -class LLTabContainer; -class LLPanelMainInventory; -class LLFolderViewItem; - -class LLSidepanelInventory : public LLPanel -{ -public: - LLSidepanelInventory(); - virtual ~LLSidepanelInventory(); - - /*virtual*/ BOOL postBuild(); - /*virtual*/ void onOpen(const LLSD& key); - - void setItem(LLInventoryItem* item); - -protected: - LLInventoryItem *getSelectedItem(); - void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); - void onTabSelected(); - void toggleObjectInfoPanel(BOOL visible); - void updateVerbs(); - void performActionOnSelection(const std::string &action); - - LLTabContainer* mTabContainer; - LLSidepanelObjectInfo* mSidepanelObjectInfo; - LLPanelMainInventory* mPanelMainInventory; - - void onInfoButtonClicked(); - void onShareButtonClicked(); - void onWearButtonClicked(); - void onPlayButtonClicked(); - void onTeleportButtonClicked(); - void onOverflowButtonClicked(); - void onBackButtonClicked(); - - LLButton* mInfoBtn; - LLButton* mShareBtn; - LLButton* mWearBtn; - LLButton* mPlayBtn; - LLButton* mTeleportBtn; - LLButton* mOverflowBtn; - - // Pointer to a item - LLPointer<LLInventoryItem> mItem; -}; - -#endif //LL_LLSIDEPANELINVENTORY_H +/** + * @file LLSidepanelInventory.h + * @brief Side Bar "Inventory" panel + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLSIDEPANELINVENTORY_H +#define LL_LLSIDEPANELINVENTORY_H + +#include "llpanel.h" + +class LLInventoryItem; +class LLSidepanelObjectInfo; +class LLTabContainer; +class LLPanelMainInventory; +class LLFolderViewItem; + +class LLSidepanelInventory : public LLPanel +{ +public: + LLSidepanelInventory(); + virtual ~LLSidepanelInventory(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + +protected: + LLInventoryItem *getSelectedItem(); + void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); + void onTabSelected(); + void toggleObjectInfoPanel(BOOL visible); + void updateVerbs(); + void performActionOnSelection(const std::string &action); + + LLTabContainer* mTabContainer; + LLSidepanelObjectInfo* mSidepanelObjectInfo; + LLPanelMainInventory* mPanelMainInventory; + + void onInfoButtonClicked(); + void onShareButtonClicked(); + void onWearButtonClicked(); + void onPlayButtonClicked(); + void onTeleportButtonClicked(); + void onOverflowButtonClicked(); + void onBackButtonClicked(); + + LLButton* mInfoBtn; + LLButton* mShareBtn; + LLButton* mWearBtn; + LLButton* mPlayBtn; + LLButton* mTeleportBtn; + LLButton* mOverflowBtn; +}; + +#endif //LL_LLSIDEPANELINVENTORY_H -- GitLab From d3e270da51fbd1053ed3482da69f9c987b13c63f Mon Sep 17 00:00:00 2001 From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com> Date: Tue, 3 Nov 2009 14:08:05 -0500 Subject: [PATCH 074/306] "Uncrammed" the layout. http://jira.secondlife.com/browse/EXT-1974 http://jira.secondlife.com/browse/EXT-1580 --- .../default/xui/en/floater_land_holdings.xml | 101 +++++++++--------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_land_holdings.xml b/indra/newview/skins/default/xui/en/floater_land_holdings.xml index 46d74b6aff8..85f0e6411bf 100644 --- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" - height="400" + height="430" layout="topleft" name="land holdings floater" help_topic="land_holdings_floater" - title="My Land" - width="280"> + title="MY LAND" + width="600"> <floater.string name="area_string"> [AREA] m² @@ -15,81 +15,82 @@ draw_heading="true" height="170" layout="topleft" - left="8" + left="10" name="parcel list" - top="24" - width="270"> + top="28" + width="580"> <scroll_list.columns label="Parcel" name="name" - width="69" /> + width="167" /> <scroll_list.columns label="Region" name="location" - width="74" /> + width="180" /> <scroll_list.columns label="Type" name="type" - width="55" /> + width="145" /> <scroll_list.columns label="Area" name="area" - width="10" /> + width="88" /> <scroll_list.columns label="" name="hidden" width="-1" /> </scroll_list> <button - height="20" - font="SansSerifSmall" + height="23" + font="SansSerifBold" label="Teleport" label_selected="Teleport" layout="topleft" - left_delta="4" + top="208" + left="10" name="Teleport" tool_tip="Teleport to the center of this land." - top_pad="4" - width="100" /> + width="80" /> <button - height="20" - font="SansSerifSmall" + height="23" + font="SansSerifBold" label="Map" label_selected="Map" layout="topleft" - left_pad="4" + top="208" + left="95" name="Show on Map" tool_tip="Show this land on the world map" - top_delta="0" - width="100" /> + width="80" /> <text type="string" length="1" follows="left|top" - height="16" layout="topleft" - left="12" + top="251" + left="10" name="contrib_label" - top="222" - width="480"> + height="16" + width="580"> Contributions to your groups: </text> <scroll_list draw_heading="true" height="75" layout="topleft" - left_delta="-4" name="grant list" - top_pad="4" - width="270"> + top="271" + left="10" + width="580"> <scroll_list.columns label="Group" name="group" - width="125" /> + width="290" + left_pad="10" /> <scroll_list.columns label="Area" name="area" - width="125" /> + width="290" /> </scroll_list> <text type="string" @@ -97,12 +98,11 @@ follows="left|top" height="16" layout="topleft" - left_delta="4" name="allowed_label" - top_pad="4" - width="150"> - Allowed land holdings at -current payment plan: + top="366" + left="10" + width="290"> + Allowed land holdings at current payment plan: </text> <text type="string" @@ -110,10 +110,10 @@ current payment plan: follows="left|top" height="16" layout="topleft" - left_pad="5" name="allowed_text" - top_delta="10" - width="132"> + top="366" + left="305" + width="290"> [AREA] m² </text> <text @@ -122,10 +122,10 @@ current payment plan: follows="left|top" height="16" layout="topleft" - left="12" + top="386" + left="10" name="current_label" - top_pad="5" - width="150"> + width="290"> Current land holdings: </text> <text @@ -134,10 +134,10 @@ current payment plan: follows="left|top" height="16" layout="topleft" - left_pad="5" + top="386" + left="305" name="current_text" - top_delta="0" - width="132"> + width="290"> [AREA] m² </text> <text @@ -147,12 +147,11 @@ current payment plan: font="SansSerifBold" height="16" layout="topleft" - left="12" + top="406" + left="10" name="available_label" - top_pad="5" - width="150"> - Available for land -purchases: + width="290"> + Available for land purchases: </text> <text type="string" @@ -161,10 +160,10 @@ purchases: font="SansSerifBold" height="16" layout="topleft" - left_pad="5" name="available_text" - top_delta="5" - width="140"> + top="406" + left="305" + width="290"> [AREA] m² </text> </floater> \ No newline at end of file -- GitLab From 00e56b09071f4e29ccec1a5451161817ffba4d96 Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Tue, 3 Nov 2009 19:08:11 +0000 Subject: [PATCH 075/306] DEV-41358 DEV-41361: Added support for secondlife:///app/worldmap SLurls to the LLUrlRegistry. These are now displayed with the more human-readable label of "Show Map for XXXX" and sport a context menu with various operations. I also added "Show on Map" options to the context menus for other location-based SLurls. I also internationalized the text for "Teleport to" and the new "Show Map for" strings. --- indra/llui/lltextbase.cpp | 1 + indra/llui/llurlaction.cpp | 12 ++++ indra/llui/llurlaction.h | 3 + indra/llui/llurlentry.cpp | 58 +++++++++++++++++-- indra/llui/llurlentry.h | 12 ++++ indra/llui/llurlregistry.cpp | 1 + .../skins/default/xui/en/menu_url_map.xml | 30 ++++++++++ .../default/xui/en/menu_url_objectim.xml | 7 +++ .../skins/default/xui/en/menu_url_parcel.xml | 9 +++ .../skins/default/xui/en/menu_url_slurl.xml | 7 +++ .../default/xui/en/menu_url_teleport.xml | 9 +++ .../newview/skins/default/xui/en/strings.xml | 5 ++ 12 files changed, 150 insertions(+), 4 deletions(-) create mode 100644 indra/newview/skins/default/xui/en/menu_url_map.xml diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 9a26f0b4726..e11e5f446e5 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1419,6 +1419,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url) registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url)); registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url)); registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url)); + registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url)); registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url)); registrar.add("Url.CopyUrl", boost::bind(&LLUrlAction::copyURLToClipboard, url)); diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp index f3401f91f7a..679db5e39ba 100644 --- a/indra/llui/llurlaction.cpp +++ b/indra/llui/llurlaction.cpp @@ -121,6 +121,18 @@ void LLUrlAction::teleportToLocation(std::string url) } } +void LLUrlAction::showLocationOnMap(std::string url) +{ + LLUrlMatch match; + if (LLUrlRegistry::instance().findUrl(url, match)) + { + if (! match.getLocation().empty()) + { + executeSLURL("secondlife:///app/worldmap/" + match.getLocation()); + } + } +} + void LLUrlAction::copyURLToClipboard(std::string url) { LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(url)); diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h index 6b9d565b44c..4830cf27ef9 100644 --- a/indra/llui/llurlaction.h +++ b/indra/llui/llurlaction.h @@ -67,6 +67,9 @@ class LLUrlAction /// if the Url specifies an SL location, teleport there static void teleportToLocation(std::string url); + /// if the Url specifies an SL location, show it on a map + static void showLocationOnMap(std::string url); + /// perform the appropriate action for left-clicking on a Url static void clickAction(std::string url); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 52e4229fb4d..ddb6c6baffe 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -468,6 +468,7 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe LLURI uri(url); LLSD path_array = uri.pathArray(); S32 path_parts = path_array.size(); + const std::string label = LLTrans::getString("SLurlLabelTeleport"); if (path_parts == 6) { // handle teleport url with (X,Y,Z) coordinates @@ -475,7 +476,7 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe std::string x = path_array[path_parts-3]; std::string y = path_array[path_parts-2]; std::string z = path_array[path_parts-1]; - return "Teleport to " + location + " (" + x + "," + y + "," + z + ")"; + return label + " " + location + " (" + x + "," + y + "," + z + ")"; } else if (path_parts == 5) { @@ -483,20 +484,20 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe std::string location = unescapeUrl(path_array[path_parts-3]); std::string x = path_array[path_parts-2]; std::string y = path_array[path_parts-1]; - return "Teleport to " + location + " (" + x + "," + y + ")"; + return label + " " + location + " (" + x + "," + y + ")"; } else if (path_parts == 4) { // handle teleport url with (X) coordinate only std::string location = unescapeUrl(path_array[path_parts-2]); std::string x = path_array[path_parts-1]; - return "Teleport to " + location + " (" + x + ")"; + return label + " " + location + " (" + x + ")"; } else if (path_parts == 3) { // handle teleport url with no coordinates std::string location = unescapeUrl(path_array[path_parts-1]); - return "Teleport to " + location; + return label + " " + location; } return url; @@ -599,3 +600,52 @@ std::string LLUrlEntrySLLabel::getUrl(const std::string &string) return getUrlFromWikiLink(string); } +// +// LLUrlEntryWorldMap Describes secondlife:///<location> URLs +// +LLUrlEntryWorldMap::LLUrlEntryWorldMap() +{ + mPattern = boost::regex("secondlife:///app/worldmap/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*", + boost::regex::perl|boost::regex::icase); + mMenuName = "menu_url_map.xml"; + mTooltip = LLTrans::getString("TooltipMapUrl"); +} + +std::string LLUrlEntryWorldMap::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ + // + // we handle SLURLs in the following formats: + // - secondlife:///app/worldmap/PLACE/X/Y/Z + // - secondlife:///app/worldmap/PLACE/X/Y + // - secondlife:///app/worldmap/PLACE/X + // + LLURI uri(url); + LLSD path_array = uri.pathArray(); + S32 path_parts = path_array.size(); + if (path_parts < 3) + { + return url; + } + + const std::string label = LLTrans::getString("SLurlLabelShowOnMap"); + std::string location = path_array[2]; + std::string x = (path_parts > 3) ? path_array[3] : "128"; + std::string y = (path_parts > 4) ? path_array[4] : "128"; + std::string z = (path_parts > 5) ? path_array[5] : "0"; + return label + " " + location + " (" + x + "," + y + "," + z + ")"; +} + +std::string LLUrlEntryWorldMap::getLocation(const std::string &url) const +{ + // return the part of the Url after secondlife:///app/worldmap/ part + const std::string search_string = "//app/worldmap/"; + size_t pos = url.find(search_string); + if (pos == std::string::npos) + { + return ""; + } + + pos += search_string.size(); + return url.substr(pos, url.size() - pos); +} + diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index afb2fdcde9f..180ef856737 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -243,4 +243,16 @@ class LLUrlEntrySLLabel : public LLUrlEntryBase /*virtual*/ std::string getUrl(const std::string &string); }; +/// +/// LLUrlEntryWorldMap Describes a Second Life worldmap Url, e.g., +/// secondlife:///app/worldmap/Ahern/50/50/50 +/// +class LLUrlEntryWorldMap : public LLUrlEntryBase +{ +public: + LLUrlEntryWorldMap(); + /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); + /*virtual*/ std::string getLocation(const std::string &url) const; +}; + #endif diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 249c7320d69..60275b60bc2 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -51,6 +51,7 @@ LLUrlRegistry::LLUrlRegistry() registerUrl(new LLUrlEntryGroup()); registerUrl(new LLUrlEntryParcel()); registerUrl(new LLUrlEntryTeleport()); + registerUrl(new LLUrlEntryWorldMap()); registerUrl(new LLUrlEntryObjectIM()); registerUrl(new LLUrlEntryPlace()); registerUrl(new LLUrlEntrySL()); diff --git a/indra/newview/skins/default/xui/en/menu_url_map.xml b/indra/newview/skins/default/xui/en/menu_url_map.xml new file mode 100644 index 00000000000..2ca9e3b3fe6 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_url_map.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + layout="topleft" + name="Url Popup"> + <menu_item_call + label="Show on Map" + layout="topleft" + name="show_on_map"> + <menu_item_call.on_click + function="Url.Execute" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Teleport to Location" + layout="topleft" + name="teleport_to_location"> + <menu_item_call.on_click + function="Url.Teleport" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Copy SLurl to clipboard" + layout="topleft" + name="url_copy"> + <menu_item_call.on_click + function="Url.CopyUrl" /> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_url_objectim.xml b/indra/newview/skins/default/xui/en/menu_url_objectim.xml index 6f7e659f48d..35c2269b0d1 100644 --- a/indra/newview/skins/default/xui/en/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/en/menu_url_objectim.xml @@ -11,6 +11,13 @@ </menu_item_call> <menu_item_separator layout="topleft" /> + <menu_item_call + label="Show on Map" + layout="topleft" + name="show_on_map"> + <menu_item_call.on_click + function="Url.ShowOnMap" /> + </menu_item_call> <menu_item_call label="Teleport to Object Location" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_url_parcel.xml b/indra/newview/skins/default/xui/en/menu_url_parcel.xml index 3804f7f7802..f477c310fb7 100644 --- a/indra/newview/skins/default/xui/en/menu_url_parcel.xml +++ b/indra/newview/skins/default/xui/en/menu_url_parcel.xml @@ -9,6 +9,15 @@ <menu_item_call.on_click function="Url.Execute" /> </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Show on Map" + layout="topleft" + name="show_on_map"> + <menu_item_call.on_click + function="Url.ShowOnMap" /> + </menu_item_call> <menu_item_separator layout="topleft" /> <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_url_slurl.xml b/indra/newview/skins/default/xui/en/menu_url_slurl.xml index 58714f1f42f..98abc206a59 100644 --- a/indra/newview/skins/default/xui/en/menu_url_slurl.xml +++ b/indra/newview/skins/default/xui/en/menu_url_slurl.xml @@ -11,6 +11,13 @@ </menu_item_call> <menu_item_separator layout="topleft" /> + <menu_item_call + label="Show on Map" + layout="topleft" + name="show_on_map"> + <menu_item_call.on_click + function="Url.ShowOnMap" /> + </menu_item_call> <menu_item_call label="Teleport to Location" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_url_teleport.xml b/indra/newview/skins/default/xui/en/menu_url_teleport.xml index ff52d7e1092..289e32bcf41 100644 --- a/indra/newview/skins/default/xui/en/menu_url_teleport.xml +++ b/indra/newview/skins/default/xui/en/menu_url_teleport.xml @@ -9,6 +9,15 @@ <menu_item_call.on_click function="Url.Execute" /> </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Show on Map" + layout="topleft" + name="show_on_map"> + <menu_item_call.on_click + function="Url.ShowOnMap" /> + </menu_item_call> <menu_item_separator layout="topleft" /> <menu_item_call diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index e842517853d..0f7e8cb1377 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -73,8 +73,13 @@ <string name="TooltipParcelUrl">Click to view this parcel's description</string> <string name="TooltipTeleportUrl">Click to teleport to this location</string> <string name="TooltipObjectIMUrl">Click to view this object's description</string> + <string name="TooltipMapUrl">Click to view this location on a map</string> <string name="TooltipSLAPP">Click to run the secondlife:// command</string> <string name="CurrentURL" value=" CurrentURL: [CurrentURL]" /> + + <!-- text for SLURL labels --> + <string name="SLurlLabelTeleport">Teleport to</string> + <string name="SLurlLabelShowOnMap">Show Map for</string> <!-- ButtonToolTips, llfloater.cpp --> <string name="BUTTON_CLOSE_DARWIN">Close (⌘W)</string> -- GitLab From 80ec865c2b4863d0c9b29885ee834c8af75c8813 Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Tue, 3 Nov 2009 21:34:14 +0200 Subject: [PATCH 076/306] fixed minor bug EXT-1618 Add Landmark does nothing if resident stands exactly in the location of existing landmark --HG-- branch : product-engine --- indra/newview/llpanellandmarks.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 704bc309ee5..5f717b51cc5 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -552,14 +552,16 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const std::string command_name = userdata.asString(); if("add_landmark" == command_name) { - if(LLLandmarkActions::landmarkAlreadyExists()) + LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos(); + if(landmark) + { + LLSideTray::getInstance()->showPanel("panel_places", + LLSD().insert("type", "landmark").insert("id",landmark->getUUID())); + } + else { - std::string location; - LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_FULL); - llwarns<<" Landmark already exists at location: "<< location<<llendl; - return; + LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); } - LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); } else if ("category" == command_name) { -- GitLab From fc7ac26ea315f3d60779f3b3ba775395d57654c9 Mon Sep 17 00:00:00 2001 From: Eugene Mutavchi <emutavchi@productengine.com> Date: Tue, 3 Nov 2009 21:38:19 +0200 Subject: [PATCH 077/306] Implemented major sub-task EXT-2140 (Avatar icon in p2p should take all available space on Control Panel) --HG-- branch : product-engine --- .../skins/default/xui/en/floater_im_session.xml | 10 +++++----- .../skins/default/xui/en/panel_im_control_panel.xml | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) 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 cdcee9ab641..88aca005cfe 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -3,7 +3,7 @@ legacy_header_height="18" background_visible="true" follows="left|top|right|bottom" - height="330" + height="359" layout="topleft" left="0" name="panel_im" @@ -17,7 +17,7 @@ min_width="200" min_height="150"> <layout_stack follows="left|top|right|bottom" - height="305" + height="344" width="400" layout="topleft" orientation="horizontal" @@ -28,12 +28,12 @@ name="panel_im_control_panel" layout="topleft" top_delta="-3" - height="305" + height="344" follows="left" label="IM Control Panel" auto_resize="false" user_resize="false" /> - <layout_panel height="305" + <layout_panel height="344" width="235" left_delta="146" top="0" @@ -56,7 +56,7 @@ length="1" follows="left|top|right|bottom" font="SansSerif" - height="255" + height="290" layout="topleft" name="chat_history" parse_highlights="true" 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 1831f58e199..0dd38784263 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 @@ -1,18 +1,18 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="panel_im_control_panel" width="128" - height="298" + height="327" border="false"> <avatar_icon name="avatar_icon" follows="left|top" - width="96" - height="96" /> + left_delta="3" + width="125" + height="125" /> <button name="view_profile_btn" follows="left|bottom" label="View Profile" - left_delta="3" width="125" height="20" /> -- GitLab From 9d8bd3625a01e38fb6b1af6153a43408933495df Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Tue, 3 Nov 2009 14:41:53 -0500 Subject: [PATCH 078/306] DEV-1186 possibly typo in avatar_lad.xml bumped wearable definition number and fixed minor typo in avatar_lad.xml - fix submitted by external contributor. Verified the change is correct and gave credit - change is de minimis, but we haven't caught this/noticed on our own for a while. Code reviewed by Bigpapi --- doc/contributions.txt | 1 + indra/newview/character/avatar_lad.xml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 942ba0f0b97..990756d76dd 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -372,6 +372,7 @@ Michelle2 Zenovka VWR-8310 VWR-9499 Mm Alder + VWR-197 VWR-3777 VWR-4794 VWR-13578 diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index c43ba279846..10c197d09eb 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="US-ASCII" standalone="yes"?> <linden_avatar - version="1.0" wearable_definition_version="23"> + version="1.0" wearable_definition_version="24"> <!-- The wearable_definition_version is checked during asset upload. --> <!-- If you increment it, check indra/lib/python/indra/assetutil.py. --> <skeleton @@ -8985,7 +8985,7 @@ render_pass="bump"> id="1017" /> <driven - id="1033" /> + id="1035" /> <driven id="914" -- GitLab From de2fe92bb9df5f5f64dff79a4e6df35330c15329 Mon Sep 17 00:00:00 2001 From: Sergey Borushevsky <sborushevsky@productengine.com> Date: Tue, 3 Nov 2009 21:58:09 +0200 Subject: [PATCH 079/306] Fixed normal bug EXT-2150 (IM Floaters should display their title in CAPS (p2p, group, ad-hoc)). --HG-- branch : product-engine --- indra/newview/llimfloater.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 7bad9499211..19fa66fd0e4 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -236,7 +236,10 @@ BOOL LLIMFloater::postBuild() mChatHistory = getChild<LLChatHistory>("chat_history"); - setTitle(LLIMModel::instance().getName(mSessionID)); + std::string session_name(LLIMModel::instance().getName(mSessionID)); + LLStringUtil::toUpper(session_name); + setTitle(session_name); + setDocked(true); mTypingStart = LLTrans::getString("IM_typing_start_string"); -- GitLab From 90d92647f417601814c3e7fffac357435f485c79 Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Tue, 3 Nov 2009 15:17:27 -0500 Subject: [PATCH 080/306] EXT-2141 baked texture not keyed on version # We actually already have this, stored in our baked texture dictionary. Generated new UUIDs for the baked texture hashes - this will ensure that new baked textures will be generated when users switch to viewer-2, and should clear up the invisibility issues people see from old 1.22 bakes being used as alpha-enabled. Code reviewed by Bigpapi --- indra/newview/llvoavatardefines.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/llvoavatardefines.cpp b/indra/newview/llvoavatardefines.cpp index 5624f19c8d0..49c4a1a6c89 100644 --- a/indra/newview/llvoavatardefines.cpp +++ b/indra/newview/llvoavatardefines.cpp @@ -84,34 +84,34 @@ LLVOAvatarDictionary::BakedTextures::BakedTextures() { // Baked textures addEntry(BAKED_HEAD, new BakedEntry(TEX_HEAD_BAKED, - "head", "18ded8d6-bcfc-e415-8539-944c0f5ea7a6", + "head", "a4b9dc38-e13b-4df9-b284-751efb0566ff", 3, TEX_HEAD_BODYPAINT, TEX_HEAD_TATTOO, TEX_HEAD_ALPHA, 5, WT_SHAPE, WT_SKIN, WT_HAIR, WT_TATTOO, WT_ALPHA)); addEntry(BAKED_UPPER, new BakedEntry(TEX_UPPER_BAKED, - "upper_body", "338c29e3-3024-4dbb-998d-7c04cf4fa88f", + "upper_body", "5943ff64-d26c-4a90-a8c0-d61f56bd98d4", 7, TEX_UPPER_SHIRT,TEX_UPPER_BODYPAINT, TEX_UPPER_JACKET, TEX_UPPER_GLOVES, TEX_UPPER_UNDERSHIRT, TEX_UPPER_TATTOO, TEX_UPPER_ALPHA, 8, WT_SHAPE, WT_SKIN, WT_SHIRT, WT_JACKET, WT_GLOVES, WT_UNDERSHIRT, WT_TATTOO, WT_ALPHA)); addEntry(BAKED_LOWER, new BakedEntry(TEX_LOWER_BAKED, - "lower_body", "91b4a2c7-1b1a-ba16-9a16-1f8f8dcc1c3f", + "lower_body", "2944ee70-90a7-425d-a5fb-d749c782ed7d", 8, TEX_LOWER_PANTS,TEX_LOWER_BODYPAINT,TEX_LOWER_SHOES, TEX_LOWER_SOCKS, TEX_LOWER_JACKET, TEX_LOWER_UNDERPANTS, TEX_LOWER_TATTOO, TEX_LOWER_ALPHA, 9, WT_SHAPE, WT_SKIN, WT_PANTS, WT_SHOES, WT_SOCKS, WT_JACKET, WT_UNDERPANTS, WT_TATTOO, WT_ALPHA)); addEntry(BAKED_EYES, new BakedEntry(TEX_EYES_BAKED, - "eyes", "b2cf28af-b840-1071-3c6a-78085d8128b5", + "eyes", "27b1bc0f-979f-4b13-95fe-b981c2ba9788", 2, TEX_EYES_IRIS, TEX_EYES_ALPHA, 2, WT_EYES, WT_ALPHA)); addEntry(BAKED_SKIRT, new BakedEntry(TEX_SKIRT_BAKED, - "skirt", "ea800387-ea1a-14e0-56cb-24f2022f969a", + "skirt", "03e7e8cb-1368-483b-b6f3-74850838ba63", 1, TEX_SKIRT, 1, WT_SKIRT)); addEntry(BAKED_HAIR, new BakedEntry(TEX_HAIR_BAKED, - "hair", "0af1ef7c-ad24-11dd-8790-001f5bf833e8", + "hair", "a60e85a9-74e8-48d8-8a2d-8129f28d9b61", 2, TEX_HAIR, TEX_HAIR_ALPHA, 2, WT_HAIR, WT_ALPHA)); } -- GitLab From f75ce16477af31c2df1d79bcb492ae43c3b380e8 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Tue, 3 Nov 2009 12:24:07 -0800 Subject: [PATCH 081/306] Clean up login panel XML and code. Kill dead "web based login" viewer-auth mWebLoginKey. Port over my reg-in-client code from svn, off by default. Reviewed with Ambroff. --- indra/newview/app_settings/settings.xml | 11 ++ indra/newview/llloginhandler.cpp | 31 +++-- indra/newview/llloginhandler.h | 6 +- indra/newview/llpanellogin.cpp | 121 +++++++++++------- indra/newview/llpanellogin.h | 6 +- indra/newview/llstartup.cpp | 12 +- .../skins/default/xui/en/panel_login.xml | 16 ++- 7 files changed, 135 insertions(+), 68 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 768fdd41030..7254fff664a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5558,6 +5558,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>RegInClient</key> + <map> + <key>Comment</key> + <string>Experimental: Embed registration in login screen</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>RegionTextureSize</key> <map> <key>Comment</key> diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp index 6f0b8a3c1e6..2a1f42c3c4b 100644 --- a/indra/newview/llloginhandler.cpp +++ b/indra/newview/llloginhandler.cpp @@ -56,7 +56,7 @@ bool LLLoginHandler::parseDirectLogin(std::string url) LLURI uri(url); parse(uri.queryMap()); - if (mWebLoginKey.isNull() || + if (/*mWebLoginKey.isNull() ||*/ mFirstName.empty() || mLastName.empty()) { @@ -71,7 +71,7 @@ bool LLLoginHandler::parseDirectLogin(std::string url) void LLLoginHandler::parse(const LLSD& queryMap) { - mWebLoginKey = queryMap["web_login_key"].asUUID(); + //mWebLoginKey = queryMap["web_login_key"].asUUID(); mFirstName = queryMap["first_name"].asString(); mLastName = queryMap["last_name"].asString(); @@ -165,7 +165,15 @@ void LLLoginHandler::parse(const LLSD& queryMap) bool LLLoginHandler::handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web) -{ +{ + if (tokens.size() == 1 + && tokens[0].asString() == "show") + { + // We're using reg-in-client, so show the XUI login widgets + LLPanelLogin::showLoginWidgets(); + return true; + } + parse(query_map); //if we haven't initialized stuff yet, this is @@ -200,14 +208,15 @@ bool LLLoginHandler::handle(const LLSD& tokens, LLPanelLogin::setFields(mFirstName, mLastName, password); } - if (mWebLoginKey.isNull()) - { - LLPanelLogin::loadLoginPage(); - } - else - { - LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); - } + //if (mWebLoginKey.isNull()) + //{ + // LLPanelLogin::loadLoginPage(); + //} + //else + //{ + // LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); + //} + LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); } return true; } diff --git a/indra/newview/llloginhandler.h b/indra/newview/llloginhandler.h index d36ceaf3cc0..ac4648761b2 100644 --- a/indra/newview/llloginhandler.h +++ b/indra/newview/llloginhandler.h @@ -48,7 +48,9 @@ class LLLoginHandler : public LLCommandHandler std::string getFirstName() const { return mFirstName; } std::string getLastName() const { return mLastName; } - LLUUID getWebLoginKey() const { return mWebLoginKey; } + + // Web-based login unsupported + //LLUUID getWebLoginKey() const { return mWebLoginKey; } private: void parse(const LLSD& queryMap); @@ -56,7 +58,7 @@ class LLLoginHandler : public LLCommandHandler private: std::string mFirstName; std::string mLastName; - LLUUID mWebLoginKey; + //LLUUID mWebLoginKey; }; extern LLLoginHandler gLoginHandler; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 24e76e2c6e0..5d826f0a561 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -198,7 +198,16 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, //leave room for the login menu bar setRect(LLRect(0, rect.getHeight()-18, rect.getWidth(), 0)); #endif - reshape(rect.getWidth(), rect.getHeight()); + // Legacy login web page is hidden under the menu bar. + // Adjust reg-in-client web browser widget to not be hidden. + if (gSavedSettings.getBOOL("RegInClient")) + { + reshape(rect.getWidth(), rect.getHeight() - MENU_BAR_HEIGHT); + } + else + { + reshape(rect.getWidth(), rect.getHeight()); + } #if !USE_VIEWER_AUTH childSetPrevalidate("first_name_edit", LLLineEditor::prevalidatePrintableNoSpace); @@ -234,9 +243,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, childSetAction("connect_btn", onClickConnect, this); - setDefaultBtn("connect_btn"); - - // childSetAction("quit_btn", onClickQuit, this); + getChild<LLPanel>("login_widgets")->setDefaultBtn("connect_btn"); std::string channel = gSavedSettings.getString("VersionChannelName"); std::string version = llformat("%d.%d.%d (%d)", @@ -267,19 +274,20 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, web_browser->setTabStop(FALSE); // web_browser->navigateToLocalPage( "loading", "loading.html" ); - // make links open in external browser - web_browser->setOpenInExternalBrowser( true ); + if (gSavedSettings.getBOOL("RegInClient")) + { + // need to follow links in the internal browser + web_browser->setOpenInExternalBrowser( false ); - // force the size to be correct (XML doesn't seem to be sufficient to do this) (with some padding so the other login screen doesn't show through) - LLRect htmlRect = getRect(); -#if USE_VIEWER_AUTH - htmlRect.setCenterAndSize( getRect().getCenterX() - 2, getRect().getCenterY(), getRect().getWidth() + 6, getRect().getHeight()); -#else - htmlRect.setCenterAndSize( getRect().getCenterX() - 2, getRect().getCenterY() + 40, getRect().getWidth() + 6, getRect().getHeight() - 78 ); -#endif - web_browser->setRect( htmlRect ); - web_browser->reshape( htmlRect.getWidth(), htmlRect.getHeight(), TRUE ); - reshape( getRect().getWidth(), getRect().getHeight(), 1 ); + getChild<LLView>("login_widgets")->setVisible(false); + } + else + { + // make links open in external browser + web_browser->setOpenInExternalBrowser( true ); + + reshapeBrowser(); + } // kick off a request to grab the url manually gResponsePtr = LLIamHereLogin::build( this ); @@ -297,6 +305,27 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, } +// force the size to be correct (XML doesn't seem to be sufficient to do this) +// (with some padding so the other login screen doesn't show through) +void LLPanelLogin::reshapeBrowser() +{ + LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html"); + LLRect rect = gViewerWindow->getVirtualWindowRect(); + LLRect html_rect; +#if USE_VIEWER_AUTH + html_rect.setCenterAndSize( + rect.getCenterX() - 2, rect.getCenterY(), + rect.getWidth() + 6, rect.getHeight()); +#else + html_rect.setCenterAndSize( + rect.getCenterX() - 2, rect.getCenterY() + 40, + rect.getWidth() + 6, rect.getHeight() - 78 ); +#endif + web_browser->setRect( html_rect ); + web_browser->reshape( html_rect.getWidth(), html_rect.getHeight(), TRUE ); + reshape( rect.getWidth(), rect.getHeight(), 1 ); +} + void LLPanelLogin::setSiteIsAlive( bool alive ) { LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html"); @@ -384,10 +413,14 @@ void LLPanelLogin::draw() if ( mHtmlAvailable ) { #if !USE_VIEWER_AUTH - // draw a background box in black - gl_rect_2d( 0, height - 264, width, 264, LLColor4( 0.0f, 0.0f, 0.0f, 1.f ) ); - // draw the bottom part of the background image - just the blue background to the native client UI - mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight()); + if (getChild<LLView>("login_widgets")->getVisible()) + { + // draw a background box in black + gl_rect_2d( 0, height - 264, width, 264, LLColor4::black ); + // draw the bottom part of the background image + // just the blue background to the native client UI + mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight()); + } #endif } else @@ -418,12 +451,6 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask) return TRUE; } - if (KEY_RETURN == key && MASK_NONE == mask) - { - // let the panel handle UICtrl processing: calls onClickConnect() - return LLPanel::handleKeyHere(key, mask); - } - return LLPanel::handleKeyHere(key, mask); } @@ -483,6 +510,19 @@ void LLPanelLogin::giveFocus() #endif } +// static +void LLPanelLogin::showLoginWidgets() +{ + sInstance->childSetVisible("login_widgets", true); + LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html"); + web_browser->setOpenInExternalBrowser( true ); + sInstance->reshapeBrowser(); + // *TODO: Append all the usual login parameters, like first_login=Y etc. + std::string splash_screen_url = sInstance->getString("real_url"); + web_browser->navigateTo( splash_screen_url, "text/html" ); + LLUICtrl* first_name_edit = sInstance->getChild<LLUICtrl>("first_name_edit"); + first_name_edit->setFocus(TRUE); +} // static void LLPanelLogin::show(const LLRect &rect, @@ -797,8 +837,17 @@ void LLPanelLogin::loadLoginPage() LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html"); - // navigate to the "real" page - web_browser->navigateTo( oStr.str(), "text/html" ); + // navigate to the "real" page + if (gSavedSettings.getBOOL("RegInClient")) + { + web_browser->setFocus(TRUE); + login_page = sInstance->getString("reg_in_client_url"); + web_browser->navigateTo(login_page, "text/html"); + } + else + { + web_browser->navigateTo( oStr.str(), "text/html" ); + } } void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent event) @@ -883,22 +932,6 @@ void LLPanelLogin::onClickNewAccount(void*) } -// *NOTE: This function is dead as of 2008 August. I left it here in case -// we suddenly decide to put the Quit button back. JC -// static -void LLPanelLogin::onClickQuit(void*) -{ - if (sInstance && sInstance->mCallback) - { - // tell the responder we're not here anymore - if ( gResponsePtr ) - gResponsePtr->setParent( 0 ); - - sInstance->mCallback(1, sInstance->mCallbackData); - } -} - - // static void LLPanelLogin::onClickVersion(void*) { diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index 5692b8d345a..acb2001c22f 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -56,6 +56,10 @@ class LLPanelLogin: virtual void draw(); virtual void setFocus( BOOL b ); + // Show the XUI first name, last name, and password widgets. They are + // hidden on startup for reg-in-client + static void showLoginWidgets(); + static void show(const LLRect &rect, BOOL show_server, void (*callback)(S32 option, void* user_data), void* callback_data); @@ -86,10 +90,10 @@ class LLPanelLogin: /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); private: + void reshapeBrowser(); static void onClickConnect(void*); static void onClickNewAccount(void*); // static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response); - static void onClickQuit(void*); static void onClickVersion(void*); static void onClickForgotPassword(void*); static void onPassKey(LLLineEditor* caller, void* user_data); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 9aa74e8b9f9..9bdea57491a 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -738,7 +738,7 @@ bool idle_startup() } if (!gLoginHandler.getFirstName().empty() || !gLoginHandler.getLastName().empty() - || !gLoginHandler.getWebLoginKey().isNull() ) + /*|| !gLoginHandler.getWebLoginKey().isNull()*/ ) { // We have at least some login information on a SLURL gFirstname = gLoginHandler.getFirstName(); @@ -895,13 +895,9 @@ bool idle_startup() gViewerWindow->moveProgressViewToFront(); //reset the values that could have come in from a slurl - if (!gLoginHandler.getWebLoginKey().isNull()) - { - gFirstname = gLoginHandler.getFirstName(); - gLastname = gLoginHandler.getLastName(); -// gWebLoginKey = gLoginHandler.getWebLoginKey(); - } - + gFirstname = gLoginHandler.getFirstName(); + gLastname = gLoginHandler.getLastName(); + if (show_connect_box) { // TODO if not use viewer auth diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index afe00271f7c..c3d199ee93d 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -15,10 +15,14 @@ name="real_url"> http://secondlife.com/app/login/ </panel.string> + <string name="reg_in_client_url"> + http://secondlife.eniac15.lindenlab.com/reg-in-client/ + </string> <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php </panel.string> + <!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp --> <web_browser border_visible="false" bottom="600" @@ -26,9 +30,16 @@ layout="topleft" left="0" name="login_html" - right="-1" start_url="" - top="1" /> + top="0" + height="600" + width="800"/> + <panel + follows="left|bottom|right" + name="login_widgets" + layout="topleft" + left="0" + top="0"> <text type="string" length="1" @@ -215,4 +226,5 @@ width="300"> [VERSION] </text> + </panel> </panel> -- GitLab From b7d020e744e69749dc946ce63fdb18d613a18e0a Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Tue, 3 Nov 2009 16:28:52 -0500 Subject: [PATCH 082/306] EXT-2168 : Rename ObjectInfo to ItemInfo Renaming for better clarity as to what llsidepaneliteminfo does. Also fixed an error where Edit was not enabling the panel. Also did some superficial cleanup and reorganization of llsidepanel- files. --HG-- branch : avatar-pipeline --- indra/newview/CMakeLists.txt | 4 +- indra/newview/llsidepanelinventory.cpp | 481 +++++---- indra/newview/llsidepanelinventory.h | 166 +-- indra/newview/llsidepaneliteminfo.cpp | 961 ++++++++++++++++++ indra/newview/llsidepaneliteminfo.h | 107 ++ .../default/xui/en/sidepanel_inventory.xml | 244 ++--- .../default/xui/en/sidepanel_item_info.xml | 531 ++++++++++ 7 files changed, 2046 insertions(+), 448 deletions(-) create mode 100644 indra/newview/llsidepaneliteminfo.cpp create mode 100644 indra/newview/llsidepaneliteminfo.h create mode 100644 indra/newview/skins/default/xui/en/sidepanel_item_info.xml diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e138b431c59..8882f02df47 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -370,7 +370,7 @@ set(viewer_SOURCE_FILES llsearchhistory.cpp llselectmgr.cpp llsidepanelinventory.cpp - llsidepanelobjectinfo.cpp + llsidepaneliteminfo.cpp llsidetray.cpp llsidetraypanelcontainer.cpp llsky.cpp @@ -855,7 +855,7 @@ set(viewer_HEADER_FILES llsearchhistory.h llselectmgr.h llsidepanelinventory.h - llsidepanelobjectinfo.h + llsidepaneliteminfo.h llsidetray.h llsidetraypanelcontainer.h llsky.h diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 3cf17fb7f27..dbe7e9fec6d 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -1,244 +1,237 @@ -/** - * @file LLSidepanelInventory.cpp - * @brief Side Bar "Inventory" panel - * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * - * Copyright (c) 2004-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" -#include "llsidepanelinventory.h" - -#include "llagent.h" -#include "llbutton.h" -#include "llinventorybridge.h" -#include "llinventorypanel.h" -#include "llpanelmaininventory.h" -#include "llsidepanelobjectinfo.h" -#include "lltabcontainer.h" - -static const S32 LANDMARK_FOLDERS_MENU_WIDTH = 250; -static const std::string AGENT_INFO_TYPE = "agent"; -static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark"; -static const std::string LANDMARK_INFO_TYPE = "landmark"; -static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place"; -static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history"; - -static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); - -LLSidepanelInventory::LLSidepanelInventory() - : LLPanel(), - mSidepanelObjectInfo(NULL) -{ - - //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() -} - -LLSidepanelInventory::~LLSidepanelInventory() -{ -} - -BOOL LLSidepanelInventory::postBuild() -{ - mInfoBtn = getChild<LLButton>("info_btn"); - mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this)); - - mShareBtn = getChild<LLButton>("share_btn"); - mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); - - mShareBtn = getChild<LLButton>("share_btn"); - mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); - - mWearBtn = getChild<LLButton>("wear_btn"); - mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this)); - - mPlayBtn = getChild<LLButton>("play_btn"); - mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this)); - - mTeleportBtn = getChild<LLButton>("teleport_btn"); - mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this)); - - mOverflowBtn = getChild<LLButton>("overflow_btn"); - mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this)); - - mTabContainer = getChild<LLTabContainer>("Inventory Tabs"); - mSidepanelObjectInfo = getChild<LLSidepanelObjectInfo>("sidepanel_object_info"); - - mPanelMainInventory = getChild<LLPanelMainInventory>("panel_main_inventory"); - mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); - - LLButton* back_btn = mSidepanelObjectInfo->getChild<LLButton>("back_btn"); - back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); - - return TRUE; -} - -void LLSidepanelInventory::onOpen(const LLSD& key) -{ - if(key.size() == 0) - return; - - mSidepanelObjectInfo->reset(); - - if (key.has("id")) - { - mSidepanelObjectInfo->setItemID(key["id"].asUUID()); - } - - if (key.has("object")) - { - mSidepanelObjectInfo->setObjectID(key["object"].asUUID()); - } - - toggleObjectInfoPanel(TRUE); -} - -void LLSidepanelInventory::onInfoButtonClicked() -{ - LLInventoryItem *item = getSelectedItem(); - if (item) - { - mSidepanelObjectInfo->reset(); - mSidepanelObjectInfo->setItemID(item->getUUID()); - toggleObjectInfoPanel(TRUE); - } -} - -void LLSidepanelInventory::onShareButtonClicked() -{ -} - -void LLSidepanelInventory::performActionOnSelection(const std::string &action) -{ - LLInventoryPanel *panel = mPanelMainInventory->getActivePanel(); - LLFolderViewItem* current_item = panel->getRootFolder()->getCurSelectedItem(); - if (!current_item) - { - return; - } - current_item->getListener()->performAction(panel->getRootFolder(), panel->getModel(), action); -} - -void LLSidepanelInventory::onWearButtonClicked() -{ - performActionOnSelection("wear"); - performActionOnSelection("attach"); -} - -void LLSidepanelInventory::onPlayButtonClicked() -{ - performActionOnSelection("activate"); -} - -void LLSidepanelInventory::onTeleportButtonClicked() -{ - performActionOnSelection("teleport"); -} - -void LLSidepanelInventory::onOverflowButtonClicked() -{ -} - -void LLSidepanelInventory::onBackButtonClicked() -{ - toggleObjectInfoPanel(FALSE); - updateVerbs(); -} - -void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) -{ - updateVerbs(); -} - -void LLSidepanelInventory::toggleObjectInfoPanel(BOOL visible) -{ - mSidepanelObjectInfo->setVisible(visible); - mTabContainer->setVisible(!visible); - - if (visible) - { - mSidepanelObjectInfo->reset(); - mSidepanelObjectInfo->setEditMode(FALSE); - - LLRect rect = getRect(); - LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); - mSidepanelObjectInfo->reshape(new_rect.getWidth(),new_rect.getHeight()); - } -} - -void LLSidepanelInventory::updateVerbs() -{ - mInfoBtn->setEnabled(FALSE); - mShareBtn->setEnabled(FALSE); - - mWearBtn->setVisible(FALSE); - mWearBtn->setEnabled(FALSE); - mPlayBtn->setVisible(FALSE); - mPlayBtn->setEnabled(FALSE); - mTeleportBtn->setVisible(FALSE); - mTeleportBtn->setEnabled(FALSE); - - const LLInventoryItem *item = getSelectedItem(); - if (!item) - return; - - mInfoBtn->setEnabled(TRUE); - mShareBtn->setEnabled(TRUE); - - switch(item->getInventoryType()) - { - case LLInventoryType::IT_WEARABLE: - case LLInventoryType::IT_OBJECT: - case LLInventoryType::IT_ATTACHMENT: - mWearBtn->setVisible(TRUE); - mWearBtn->setEnabled(TRUE); - break; - case LLInventoryType::IT_SOUND: - case LLInventoryType::IT_GESTURE: - case LLInventoryType::IT_ANIMATION: - mPlayBtn->setVisible(TRUE); - mPlayBtn->setEnabled(TRUE); - break; - case LLInventoryType::IT_LANDMARK: - mTeleportBtn->setVisible(TRUE); - mTeleportBtn->setEnabled(TRUE); - break; - default: - break; - } -} - -LLInventoryItem *LLSidepanelInventory::getSelectedItem() -{ - LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); - if (!current_item) - { - return NULL; - } - const LLUUID &item_id = current_item->getListener()->getUUID(); - LLInventoryItem *item = gInventory.getItem(item_id); - return item; -} +/** + * @file LLSidepanelInventory.cpp + * @brief Side Bar "Inventory" panel + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llsidepanelinventory.h" + +#include "llagent.h" +#include "llbutton.h" +#include "llinventorybridge.h" +#include "llinventorypanel.h" +#include "llpanelmaininventory.h" +#include "llsidepaneliteminfo.h" +#include "lltabcontainer.h" + +static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); + +LLSidepanelInventory::LLSidepanelInventory() + : LLPanel(), + mSidepanelItemInfo(NULL) +{ + + //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() +} + +LLSidepanelInventory::~LLSidepanelInventory() +{ +} + +BOOL LLSidepanelInventory::postBuild() +{ + mInfoBtn = getChild<LLButton>("info_btn"); + mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this)); + + mShareBtn = getChild<LLButton>("share_btn"); + mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); + + mShareBtn = getChild<LLButton>("share_btn"); + mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); + + mWearBtn = getChild<LLButton>("wear_btn"); + mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this)); + + mPlayBtn = getChild<LLButton>("play_btn"); + mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this)); + + mTeleportBtn = getChild<LLButton>("teleport_btn"); + mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this)); + + mOverflowBtn = getChild<LLButton>("overflow_btn"); + mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this)); + + mTabContainer = getChild<LLTabContainer>("Inventory Tabs"); + mSidepanelItemInfo = getChild<LLSidepanelItemInfo>("sidepanel_item_info"); + + mPanelMainInventory = getChild<LLPanelMainInventory>("panel_main_inventory"); + mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); + + LLButton* back_btn = mSidepanelItemInfo->getChild<LLButton>("back_btn"); + back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); + + return TRUE; +} + +void LLSidepanelInventory::onOpen(const LLSD& key) +{ + if(key.size() == 0) + return; + + mSidepanelItemInfo->reset(); + + if (key.has("id")) + { + mSidepanelItemInfo->setItemID(key["id"].asUUID()); + } + + if (key.has("object")) + { + mSidepanelItemInfo->setObjectID(key["object"].asUUID()); + } + + toggleItemInfoPanel(TRUE); +} + +void LLSidepanelInventory::onInfoButtonClicked() +{ + LLInventoryItem *item = getSelectedItem(); + if (item) + { + mSidepanelItemInfo->reset(); + mSidepanelItemInfo->setItemID(item->getUUID()); + toggleItemInfoPanel(TRUE); + } +} + +void LLSidepanelInventory::onShareButtonClicked() +{ +} + +void LLSidepanelInventory::performActionOnSelection(const std::string &action) +{ + LLInventoryPanel *panel = mPanelMainInventory->getActivePanel(); + LLFolderViewItem* current_item = panel->getRootFolder()->getCurSelectedItem(); + if (!current_item) + { + return; + } + current_item->getListener()->performAction(panel->getRootFolder(), panel->getModel(), action); +} + +void LLSidepanelInventory::onWearButtonClicked() +{ + performActionOnSelection("wear"); + performActionOnSelection("attach"); +} + +void LLSidepanelInventory::onPlayButtonClicked() +{ + performActionOnSelection("activate"); +} + +void LLSidepanelInventory::onTeleportButtonClicked() +{ + performActionOnSelection("teleport"); +} + +void LLSidepanelInventory::onOverflowButtonClicked() +{ +} + +void LLSidepanelInventory::onBackButtonClicked() +{ + toggleItemInfoPanel(FALSE); + updateVerbs(); +} + +void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) +{ + updateVerbs(); +} + +void LLSidepanelInventory::toggleItemInfoPanel(BOOL visible) +{ + mSidepanelItemInfo->setVisible(visible); + mTabContainer->setVisible(!visible); + + if (visible) + { + mSidepanelItemInfo->dirty(); + mSidepanelItemInfo->setEditMode(FALSE); + + LLRect rect = getRect(); + LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); + mSidepanelItemInfo->reshape(new_rect.getWidth(),new_rect.getHeight()); + } +} + +void LLSidepanelInventory::updateVerbs() +{ + mInfoBtn->setEnabled(FALSE); + mShareBtn->setEnabled(FALSE); + + mWearBtn->setVisible(FALSE); + mWearBtn->setEnabled(FALSE); + mPlayBtn->setVisible(FALSE); + mPlayBtn->setEnabled(FALSE); + mTeleportBtn->setVisible(FALSE); + mTeleportBtn->setEnabled(FALSE); + + const LLInventoryItem *item = getSelectedItem(); + if (!item) + return; + + mInfoBtn->setEnabled(TRUE); + mShareBtn->setEnabled(TRUE); + + switch(item->getInventoryType()) + { + case LLInventoryType::IT_WEARABLE: + case LLInventoryType::IT_OBJECT: + case LLInventoryType::IT_ATTACHMENT: + mWearBtn->setVisible(TRUE); + mWearBtn->setEnabled(TRUE); + break; + case LLInventoryType::IT_SOUND: + case LLInventoryType::IT_GESTURE: + case LLInventoryType::IT_ANIMATION: + mPlayBtn->setVisible(TRUE); + mPlayBtn->setEnabled(TRUE); + break; + case LLInventoryType::IT_LANDMARK: + mTeleportBtn->setVisible(TRUE); + mTeleportBtn->setEnabled(TRUE); + break; + default: + break; + } +} + +LLInventoryItem *LLSidepanelInventory::getSelectedItem() +{ + LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); + if (!current_item) + { + return NULL; + } + const LLUUID &item_id = current_item->getListener()->getUUID(); + LLInventoryItem *item = gInventory.getItem(item_id); + return item; +} diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index 62eeecc5e23..fbffb39b8c9 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -1,80 +1,86 @@ -/** - * @file LLSidepanelInventory.h - * @brief Side Bar "Inventory" panel - * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * - * Copyright (c) 2004-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_LLSIDEPANELINVENTORY_H -#define LL_LLSIDEPANELINVENTORY_H - -#include "llpanel.h" - -class LLInventoryItem; -class LLSidepanelObjectInfo; -class LLTabContainer; -class LLPanelMainInventory; -class LLFolderViewItem; - -class LLSidepanelInventory : public LLPanel -{ -public: - LLSidepanelInventory(); - virtual ~LLSidepanelInventory(); - - /*virtual*/ BOOL postBuild(); - /*virtual*/ void onOpen(const LLSD& key); - -protected: - LLInventoryItem *getSelectedItem(); - void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); - void onTabSelected(); - void toggleObjectInfoPanel(BOOL visible); - void updateVerbs(); - void performActionOnSelection(const std::string &action); - - LLTabContainer* mTabContainer; - LLSidepanelObjectInfo* mSidepanelObjectInfo; - LLPanelMainInventory* mPanelMainInventory; - - void onInfoButtonClicked(); - void onShareButtonClicked(); - void onWearButtonClicked(); - void onPlayButtonClicked(); - void onTeleportButtonClicked(); - void onOverflowButtonClicked(); - void onBackButtonClicked(); - - LLButton* mInfoBtn; - LLButton* mShareBtn; - LLButton* mWearBtn; - LLButton* mPlayBtn; - LLButton* mTeleportBtn; - LLButton* mOverflowBtn; -}; - -#endif //LL_LLSIDEPANELINVENTORY_H +/** + * @file LLSidepanelInventory.h + * @brief Side Bar "Inventory" panel + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLSIDEPANELINVENTORY_H +#define LL_LLSIDEPANELINVENTORY_H + +#include "llpanel.h" + +class LLInventoryItem; +class LLSidepanelItemInfo; +class LLTabContainer; +class LLPanelMainInventory; +class LLFolderViewItem; + +class LLSidepanelInventory : public LLPanel +{ +public: + LLSidepanelInventory(); + virtual ~LLSidepanelInventory(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + +protected: + // Tracks highlighted (selected) item in inventory panel. + LLInventoryItem *getSelectedItem(); + void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); + // "wear", "teleport", etc. + void performActionOnSelection(const std::string &action); + + void toggleItemInfoPanel(BOOL visible); + void updateVerbs(); + + // + // UI Elements + // +protected: + void onInfoButtonClicked(); + void onShareButtonClicked(); + void onWearButtonClicked(); + void onPlayButtonClicked(); + void onTeleportButtonClicked(); + void onOverflowButtonClicked(); + void onBackButtonClicked(); +private: + LLButton* mInfoBtn; + LLButton* mShareBtn; + LLButton* mWearBtn; + LLButton* mPlayBtn; + LLButton* mTeleportBtn; + LLButton* mOverflowBtn; + + LLTabContainer* mTabContainer; + LLSidepanelItemInfo* mSidepanelItemInfo; + LLPanelMainInventory* mPanelMainInventory; +}; + +#endif //LL_LLSIDEPANELINVENTORY_H diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp new file mode 100644 index 00000000000..0b00c7fbe90 --- /dev/null +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -0,0 +1,961 @@ +/** + * @file llsidepaneliteminfo.cpp + * @brief A floater which shows an inventory item's properties. + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llsidepaneliteminfo.h" + +#include "roles_constants.h" + +#include "llagent.h" +#include "llavataractions.h" +#include "llbutton.h" +#include "llfloaterreg.h" +#include "llgroupactions.h" +#include "llinventorymodel.h" +#include "lllineeditor.h" +#include "llradiogroup.h" +#include "llviewercontrol.h" +#include "llviewerinventory.h" +#include "llviewerobjectlist.h" + + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLItemPropertiesObserver +// +// Helper class to watch for changes to the item. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLItemPropertiesObserver : public LLInventoryObserver +{ +public: + LLItemPropertiesObserver(LLSidepanelItemInfo* floater) + : mFloater(floater) + { + gInventory.addObserver(this); + } + virtual ~LLItemPropertiesObserver() + { + gInventory.removeObserver(this); + } + virtual void changed(U32 mask); +private: + LLSidepanelItemInfo* mFloater; +}; + +void LLItemPropertiesObserver::changed(U32 mask) +{ + // if there's a change we're interested in. + if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0) + { + mFloater->dirty(); + } +} + + + +///---------------------------------------------------------------------------- +/// Class LLSidepanelItemInfo +///---------------------------------------------------------------------------- + +static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_item_info"); + +// Default constructor +LLSidepanelItemInfo::LLSidepanelItemInfo() + : LLPanel(), + mItemID(LLUUID::null), + mDirty(TRUE), + mEditMode(FALSE) +{ + mPropertiesObserver = new LLItemPropertiesObserver(this); + + //LLUICtrlFactory::getInstance()->buildFloater(this,"floater_inventory_item_properties.xml"); +} + +// Destroys the object +LLSidepanelItemInfo::~LLSidepanelItemInfo() +{ + delete mPropertiesObserver; + mPropertiesObserver = NULL; +} + +// virtual +BOOL LLSidepanelItemInfo::postBuild() +{ + mEditBtn = getChild<LLButton>("edit_btn"); + mEditBtn->setClickedCallback(boost::bind(&LLSidepanelItemInfo::onEditButtonClicked, this)); + + mSaveBtn = getChild<LLButton>("save_btn"); + mSaveBtn->setClickedCallback(boost::bind(&LLSidepanelItemInfo::onSaveButtonClicked, this)); + + mCancelBtn = getChild<LLButton>("cancel_btn"); + mCancelBtn->setClickedCallback(boost::bind(&LLSidepanelItemInfo::onCancelButtonClicked, this)); + + // build the UI + // item name & description + childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidatePrintableNotPipe); + //getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this)); + childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidatePrintableNotPipe); + //getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this)); + + // Creator information + getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this)); + + // owner information + getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickOwner,this)); + + // acquired date + // owner permissions + // Permissions debug text + // group permissions + // getChild<LLUICtrl>("CheckShareWithGroup")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); + + // everyone permissions + // getChild<LLUICtrl>("CheckEveryoneCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); + + // next owner permissions + // getChild<LLUICtrl>("CheckNextOwnerModify")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); + // getChild<LLUICtrl>("CheckNextOwnerCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); + // getChild<LLUICtrl>("CheckNextOwnerTransfer")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); + + // Mark for sale or not, and sale info + // getChild<LLUICtrl>("CheckPurchase")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this)); + // getChild<LLUICtrl>("RadioSaleType")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleType, this)); + + // "Price" label for edit + // getChild<LLUICtrl>("Edit Cost")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this)); + + // The UI has been built, now fill in all the values + refresh(); + + return TRUE; +} + +void LLSidepanelItemInfo::setVisible(BOOL visible) +{ + if (visible) + { + mDirty = TRUE; + } + LLPanel::setVisible(visible); +} + +void LLSidepanelItemInfo::setObjectID(const LLUUID& object_id) +{ + mObjectID = object_id; +} + +void LLSidepanelItemInfo::setItemID(const LLUUID& item_id) +{ + mItemID = item_id; +} + +void LLSidepanelItemInfo::setEditMode(BOOL edit) +{ + mEditMode = edit; + mDirty = TRUE; +} + +void LLSidepanelItemInfo::reset() +{ + mObjectID = LLUUID::null; + mItemID = LLUUID::null; + mDirty = TRUE; +} + +void LLSidepanelItemInfo::refresh() +{ + LLInventoryItem* item = findItem(); + if(item) + { + refreshFromItem(item); + updateVerbs(); + } + + if (!mEditMode || !item) + { + //RN: it is possible that the container object is in the middle of an inventory refresh + // causing findItem() to fail, so just temporarily disable everything + + mDirty = TRUE; + + const std::string no_item_names[]={ + "LabelItemName", + "LabelItemDesc", + "LabelCreatorName", + "LabelOwnerName", + "CheckOwnerModify", + "CheckOwnerCopy", + "CheckOwnerTransfer", + "CheckShareWithGroup", + "CheckEveryoneCopy", + "CheckNextOwnerModify", + "CheckNextOwnerCopy", + "CheckNextOwnerTransfer", + "CheckPurchase", + "RadioSaleType", + "Edit Cost" + }; + + for(size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t) + { + childSetEnabled(no_item_names[t],false); + } + + const std::string hide_names[]={ + "BaseMaskDebug", + "OwnerMaskDebug", + "GroupMaskDebug", + "EveryoneMaskDebug", + "NextMaskDebug" + }; + for(size_t t=0; t<LL_ARRAY_SIZE(hide_names); ++t) + { + childSetVisible(hide_names[t],false); + } + } + + if (!item) + { + const std::string no_edit_mode_names[]={ + "BtnCreator", + "BtnOwner", + }; + for(size_t t=0; t<LL_ARRAY_SIZE(no_edit_mode_names); ++t) + { + childSetEnabled(no_edit_mode_names[t],false); + } + } + + updateVerbs(); +} + +void LLSidepanelItemInfo::draw() +{ + if (mDirty) + { + // RN: clear dirty first because refresh can set dirty to TRUE + mDirty = FALSE; + refresh(); + } + + LLPanel::draw(); +} + +void LLSidepanelItemInfo::dirty() +{ + mDirty = TRUE; +} + +void LLSidepanelItemInfo::refreshFromItem(LLInventoryItem* item) +{ + //////////////////////// + // PERMISSIONS LOOKUP // + //////////////////////// + + // do not enable the UI for incomplete items. + LLViewerInventoryItem* i = (LLViewerInventoryItem*)item; + BOOL is_complete = i->isComplete(); + const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(i->getInventoryType()); + const BOOL is_calling_card = (i->getInventoryType() == LLInventoryType::IT_CALLINGCARD); + const LLPermissions& perm = item->getPermissions(); + const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm, + GP_OBJECT_MANIPULATE); + const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm, + GP_OBJECT_SET_SALE) && + !cannot_restrict_permissions; + const BOOL is_link = i->getIsLinkType(); + + // You need permission to modify the object to modify an inventory + // item in it. + LLViewerObject* object = NULL; + if(!mObjectID.isNull()) object = gObjectList.findObject(mObjectID); + BOOL is_obj_modify = TRUE; + if(object) + { + is_obj_modify = object->permOwnerModify(); + } + + ////////////////////// + // ITEM NAME & DESC // + ////////////////////// + BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm, + GP_OBJECT_MANIPULATE) + && is_obj_modify && is_complete; + + childSetEnabled("LabelItemNameTitle",TRUE); + childSetEnabled("LabelItemName",is_modifiable && !is_calling_card); // for now, don't allow rename of calling cards + childSetText("LabelItemName",item->getName()); + childSetEnabled("LabelItemDescTitle",TRUE); + childSetEnabled("LabelItemDesc",is_modifiable); + childSetVisible("IconLocked",!is_modifiable); + childSetText("LabelItemDesc",item->getDescription()); + + ////////////////// + // CREATOR NAME // + ////////////////// + if(!gCacheName) return; + if(!gAgent.getRegion()) return; + + if (item->getCreatorUUID().notNull()) + { + std::string name; + gCacheName->getFullName(item->getCreatorUUID(), name); + childSetEnabled("BtnCreator",TRUE); + childSetEnabled("LabelCreatorTitle",TRUE); + childSetEnabled("LabelCreatorName",TRUE); + childSetText("LabelCreatorName",name); + } + else + { + childSetEnabled("BtnCreator",FALSE); + childSetEnabled("LabelCreatorTitle",FALSE); + childSetEnabled("LabelCreatorName",FALSE); + childSetText("LabelCreatorName",getString("unknown")); + } + + //////////////// + // OWNER NAME // + //////////////// + if(perm.isOwned()) + { + std::string name; + if (perm.isGroupOwned()) + { + gCacheName->getGroupName(perm.getGroup(), name); + } + else + { + gCacheName->getFullName(perm.getOwner(), name); + } + childSetEnabled("BtnOwner",TRUE); + childSetEnabled("LabelOwnerTitle",TRUE); + childSetEnabled("LabelOwnerName",TRUE); + childSetText("LabelOwnerName",name); + } + else + { + childSetEnabled("BtnOwner",FALSE); + childSetEnabled("LabelOwnerTitle",FALSE); + childSetEnabled("LabelOwnerName",FALSE); + childSetText("LabelOwnerName",getString("public")); + } + + ////////////////// + // ACQUIRE DATE // + ////////////////// + + time_t time_utc = item->getCreationDate(); + if (0 == time_utc) + { + childSetText("LabelAcquiredDate",getString("unknown")); + } + else + { + std::string timeStr = getString("acquiredDate"); + LLSD substitution; + substitution["datetime"] = (S32) time_utc; + LLStringUtil::format (timeStr, substitution); + childSetText ("LabelAcquiredDate", timeStr); + } + + /////////////////////// + // OWNER PERMISSIONS // + /////////////////////// + if(can_agent_manipulate) + { + childSetText("OwnerLabel",getString("you_can")); + } + else + { + childSetText("OwnerLabel",getString("owner_can")); + } + + U32 base_mask = perm.getMaskBase(); + U32 owner_mask = perm.getMaskOwner(); + U32 group_mask = perm.getMaskGroup(); + U32 everyone_mask = perm.getMaskEveryone(); + U32 next_owner_mask = perm.getMaskNextOwner(); + + childSetEnabled("OwnerLabel",TRUE); + childSetEnabled("CheckOwnerModify",FALSE); + childSetValue("CheckOwnerModify",LLSD((BOOL)(owner_mask & PERM_MODIFY))); + childSetEnabled("CheckOwnerCopy",FALSE); + childSetValue("CheckOwnerCopy",LLSD((BOOL)(owner_mask & PERM_COPY))); + childSetEnabled("CheckOwnerTransfer",FALSE); + childSetValue("CheckOwnerTransfer",LLSD((BOOL)(owner_mask & PERM_TRANSFER))); + + /////////////////////// + // DEBUG PERMISSIONS // + /////////////////////// + + if( gSavedSettings.getBOOL("DebugPermissions") ) + { + BOOL slam_perm = FALSE; + BOOL overwrite_group = FALSE; + BOOL overwrite_everyone = FALSE; + + if (item->getType() == LLAssetType::AT_OBJECT) + { + U32 flags = item->getFlags(); + slam_perm = flags & LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM; + overwrite_everyone = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; + overwrite_group = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + } + + std::string perm_string; + + perm_string = "B: "; + perm_string += mask_to_string(base_mask); + childSetText("BaseMaskDebug",perm_string); + childSetVisible("BaseMaskDebug",TRUE); + + perm_string = "O: "; + perm_string += mask_to_string(owner_mask); + childSetText("OwnerMaskDebug",perm_string); + childSetVisible("OwnerMaskDebug",TRUE); + + perm_string = "G"; + perm_string += overwrite_group ? "*: " : ": "; + perm_string += mask_to_string(group_mask); + childSetText("GroupMaskDebug",perm_string); + childSetVisible("GroupMaskDebug",TRUE); + + perm_string = "E"; + perm_string += overwrite_everyone ? "*: " : ": "; + perm_string += mask_to_string(everyone_mask); + childSetText("EveryoneMaskDebug",perm_string); + childSetVisible("EveryoneMaskDebug",TRUE); + + perm_string = "N"; + perm_string += slam_perm ? "*: " : ": "; + perm_string += mask_to_string(next_owner_mask); + childSetText("NextMaskDebug",perm_string); + childSetVisible("NextMaskDebug",TRUE); + } + else + { + childSetVisible("BaseMaskDebug",FALSE); + childSetVisible("OwnerMaskDebug",FALSE); + childSetVisible("GroupMaskDebug",FALSE); + childSetVisible("EveryoneMaskDebug",FALSE); + childSetVisible("NextMaskDebug",FALSE); + } + + ///////////// + // SHARING // + ///////////// + + // Check for ability to change values. + if (is_link || cannot_restrict_permissions) + { + childSetEnabled("CheckShareWithGroup",FALSE); + childSetEnabled("CheckEveryoneCopy",FALSE); + } + else if (is_obj_modify && can_agent_manipulate) + { + childSetEnabled("CheckShareWithGroup",TRUE); + childSetEnabled("CheckEveryoneCopy",(owner_mask & PERM_COPY) && (owner_mask & PERM_TRANSFER)); + } + else + { + childSetEnabled("CheckShareWithGroup",FALSE); + childSetEnabled("CheckEveryoneCopy",FALSE); + } + + // Set values. + BOOL is_group_copy = (group_mask & PERM_COPY) ? TRUE : FALSE; + BOOL is_group_modify = (group_mask & PERM_MODIFY) ? TRUE : FALSE; + BOOL is_group_move = (group_mask & PERM_MOVE) ? TRUE : FALSE; + + if (is_group_copy && is_group_modify && is_group_move) + { + childSetValue("CheckShareWithGroup",LLSD((BOOL)TRUE)); + + LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup"); + if(ctl) + { + ctl->setTentative(FALSE); + } + } + else if (!is_group_copy && !is_group_modify && !is_group_move) + { + childSetValue("CheckShareWithGroup",LLSD((BOOL)FALSE)); + LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup"); + if(ctl) + { + ctl->setTentative(FALSE); + } + } + else + { + LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup"); + if(ctl) + { + ctl->setTentative(TRUE); + ctl->set(TRUE); + } + } + + childSetValue("CheckEveryoneCopy",LLSD((BOOL)(everyone_mask & PERM_COPY))); + + /////////////// + // SALE INFO // + /////////////// + + const LLSaleInfo& sale_info = item->getSaleInfo(); + BOOL is_for_sale = sale_info.isForSale(); + // Check for ability to change values. + if (is_obj_modify && can_agent_sell + && gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE)) + { + childSetEnabled("SaleLabel",is_complete); + childSetEnabled("CheckPurchase",is_complete); + + childSetEnabled("NextOwnerLabel",TRUE); + childSetEnabled("CheckNextOwnerModify",(base_mask & PERM_MODIFY) && !cannot_restrict_permissions); + childSetEnabled("CheckNextOwnerCopy",(base_mask & PERM_COPY) && !cannot_restrict_permissions); + childSetEnabled("CheckNextOwnerTransfer",(next_owner_mask & PERM_COPY) && !cannot_restrict_permissions); + + childSetEnabled("RadioSaleType",is_complete && is_for_sale); + childSetEnabled("TextPrice",is_complete && is_for_sale); + childSetEnabled("Edit Cost",is_complete && is_for_sale); + } + else + { + childSetEnabled("SaleLabel",FALSE); + childSetEnabled("CheckPurchase",FALSE); + + childSetEnabled("NextOwnerLabel",FALSE); + childSetEnabled("CheckNextOwnerModify",FALSE); + childSetEnabled("CheckNextOwnerCopy",FALSE); + childSetEnabled("CheckNextOwnerTransfer",FALSE); + + childSetEnabled("RadioSaleType",FALSE); + childSetEnabled("TextPrice",FALSE); + childSetEnabled("Edit Cost",FALSE); + } + + // Set values. + childSetValue("CheckPurchase", is_for_sale); + childSetEnabled("combobox sale copy", is_for_sale); + childSetEnabled("Edit Cost", is_for_sale); + childSetValue("CheckNextOwnerModify",LLSD(BOOL(next_owner_mask & PERM_MODIFY))); + childSetValue("CheckNextOwnerCopy",LLSD(BOOL(next_owner_mask & PERM_COPY))); + childSetValue("CheckNextOwnerTransfer",LLSD(BOOL(next_owner_mask & PERM_TRANSFER))); + + LLRadioGroup* radioSaleType = getChild<LLRadioGroup>("RadioSaleType"); + if (is_for_sale) + { + radioSaleType->setSelectedIndex((S32)sale_info.getSaleType() - 1); + S32 numerical_price; + numerical_price = sale_info.getSalePrice(); + childSetText("Edit Cost",llformat("%d",numerical_price)); + } + else + { + radioSaleType->setSelectedIndex(-1); + childSetText("Edit Cost",llformat("%d",0)); + } +} + +void LLSidepanelItemInfo::onClickCreator() +{ + LLInventoryItem* item = findItem(); + if(!item) return; + if(!item->getCreatorUUID().isNull()) + { + LLAvatarActions::showProfile(item->getCreatorUUID()); + } +} + +// static +void LLSidepanelItemInfo::onClickOwner() +{ + LLInventoryItem* item = findItem(); + if(!item) return; + if(item->getPermissions().isGroupOwned()) + { + LLGroupActions::show(item->getPermissions().getGroup()); + } + else + { + LLAvatarActions::showProfile(item->getPermissions().getOwner()); + } +} + +// static +void LLSidepanelItemInfo::onCommitName() +{ + //llinfos << "LLSidepanelItemInfo::onCommitName()" << llendl; + LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); + if(!item) + { + return; + } + LLLineEditor* labelItemName = getChild<LLLineEditor>("LabelItemName"); + + if(labelItemName&& + (item->getName() != labelItemName->getText()) && + (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)) ) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->rename(labelItemName->getText()); + if(mObjectID.isNull()) + { + new_item->updateServer(FALSE); + gInventory.updateItem(new_item); + gInventory.notifyObservers(); + } + else + { + LLViewerObject* object = gObjectList.findObject(mObjectID); + if(object) + { + object->updateInventory( + new_item, + TASK_INVENTORY_ITEM_KEY, + false); + } + } + } +} + +void LLSidepanelItemInfo::onCommitDescription() +{ + //llinfos << "LLSidepanelItemInfo::onCommitDescription()" << llendl; + LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); + if(!item) return; + + LLLineEditor* labelItemDesc = getChild<LLLineEditor>("LabelItemDesc"); + if(!labelItemDesc) + { + return; + } + if((item->getDescription() != labelItemDesc->getText()) && + (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE))) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + + new_item->setDescription(labelItemDesc->getText()); + if(mObjectID.isNull()) + { + new_item->updateServer(FALSE); + gInventory.updateItem(new_item); + gInventory.notifyObservers(); + } + else + { + LLViewerObject* object = gObjectList.findObject(mObjectID); + if(object) + { + object->updateInventory( + new_item, + TASK_INVENTORY_ITEM_KEY, + false); + } + } + } +} + +// static +void LLSidepanelItemInfo::onCommitPermissions() +{ + //llinfos << "LLSidepanelItemInfo::onCommitPermissions()" << llendl; + LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); + if(!item) return; + LLPermissions perm(item->getPermissions()); + + + LLCheckBoxCtrl* CheckShareWithGroup = getChild<LLCheckBoxCtrl>("CheckShareWithGroup"); + + if(CheckShareWithGroup) + { + perm.setGroupBits(gAgent.getID(), gAgent.getGroupID(), + CheckShareWithGroup->get(), + PERM_MODIFY | PERM_MOVE | PERM_COPY); + } + LLCheckBoxCtrl* CheckEveryoneCopy = getChild<LLCheckBoxCtrl>("CheckEveryoneCopy"); + if(CheckEveryoneCopy) + { + perm.setEveryoneBits(gAgent.getID(), gAgent.getGroupID(), + CheckEveryoneCopy->get(), PERM_COPY); + } + + LLCheckBoxCtrl* CheckNextOwnerModify = getChild<LLCheckBoxCtrl>("CheckNextOwnerModify"); + if(CheckNextOwnerModify) + { + perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(), + CheckNextOwnerModify->get(), PERM_MODIFY); + } + LLCheckBoxCtrl* CheckNextOwnerCopy = getChild<LLCheckBoxCtrl>("CheckNextOwnerCopy"); + if(CheckNextOwnerCopy) + { + perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(), + CheckNextOwnerCopy->get(), PERM_COPY); + } + LLCheckBoxCtrl* CheckNextOwnerTransfer = getChild<LLCheckBoxCtrl>("CheckNextOwnerTransfer"); + if(CheckNextOwnerTransfer) + { + perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(), + CheckNextOwnerTransfer->get(), PERM_TRANSFER); + } + if(perm != item->getPermissions() + && item->isComplete()) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->setPermissions(perm); + U32 flags = new_item->getFlags(); + // If next owner permissions have changed (and this is an object) + // then set the slam permissions flag so that they are applied on rez. + if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner()) + && (item->getType() == LLAssetType::AT_OBJECT)) + { + flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM; + } + // If everyone permissions have changed (and this is an object) + // then set the overwrite everyone permissions flag so they + // are applied on rez. + if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone()) + && (item->getType() == LLAssetType::AT_OBJECT)) + { + flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE; + } + // If group permissions have changed (and this is an object) + // then set the overwrite group permissions flag so they + // are applied on rez. + if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup()) + && (item->getType() == LLAssetType::AT_OBJECT)) + { + flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP; + } + new_item->setFlags(flags); + if(mObjectID.isNull()) + { + new_item->updateServer(FALSE); + gInventory.updateItem(new_item); + gInventory.notifyObservers(); + } + else + { + LLViewerObject* object = gObjectList.findObject(mObjectID); + if(object) + { + object->updateInventory( + new_item, + TASK_INVENTORY_ITEM_KEY, + false); + } + } + } + else + { + // need to make sure we don't just follow the click + refresh(); + } +} + +// static +void LLSidepanelItemInfo::onCommitSaleInfo() +{ + //llinfos << "LLSidepanelItemInfo::onCommitSaleInfo()" << llendl; + updateSaleInfo(); +} + +// static +void LLSidepanelItemInfo::onCommitSaleType() +{ + //llinfos << "LLSidepanelItemInfo::onCommitSaleType()" << llendl; + updateSaleInfo(); +} + +void LLSidepanelItemInfo::updateSaleInfo() +{ + LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); + if(!item) return; + LLSaleInfo sale_info(item->getSaleInfo()); + if(!gAgent.allowOperation(PERM_TRANSFER, item->getPermissions(), GP_OBJECT_SET_SALE)) + { + childSetValue("CheckPurchase",LLSD((BOOL)FALSE)); + } + + if((BOOL)childGetValue("CheckPurchase")) + { + // turn on sale info + LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_COPY; + + LLRadioGroup* RadioSaleType = getChild<LLRadioGroup>("RadioSaleType"); + if(RadioSaleType) + { + switch (RadioSaleType->getSelectedIndex()) + { + case 0: + sale_type = LLSaleInfo::FS_ORIGINAL; + break; + case 1: + sale_type = LLSaleInfo::FS_COPY; + break; + case 2: + sale_type = LLSaleInfo::FS_CONTENTS; + break; + default: + sale_type = LLSaleInfo::FS_COPY; + break; + } + } + + if (sale_type == LLSaleInfo::FS_COPY + && !gAgent.allowOperation(PERM_COPY, item->getPermissions(), + GP_OBJECT_SET_SALE)) + { + sale_type = LLSaleInfo::FS_ORIGINAL; + } + + + + S32 price = -1; + price = getChild<LLUICtrl>("Edit Cost")->getValue().asInteger();; + + // Invalid data - turn off the sale + if (price < 0) + { + sale_type = LLSaleInfo::FS_NOT; + price = 0; + } + + sale_info.setSaleType(sale_type); + sale_info.setSalePrice(price); + } + else + { + sale_info.setSaleType(LLSaleInfo::FS_NOT); + } + if(sale_info != item->getSaleInfo() + && item->isComplete()) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + + // Force an update on the sale price at rez + if (item->getType() == LLAssetType::AT_OBJECT) + { + U32 flags = new_item->getFlags(); + flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE; + new_item->setFlags(flags); + } + + new_item->setSaleInfo(sale_info); + if(mObjectID.isNull()) + { + // This is in the agent's inventory. + new_item->updateServer(FALSE); + gInventory.updateItem(new_item); + gInventory.notifyObservers(); + } + else + { + // This is in an object's contents. + LLViewerObject* object = gObjectList.findObject(mObjectID); + if(object) + { + object->updateInventory( + new_item, + TASK_INVENTORY_ITEM_KEY, + false); + } + } + } + else + { + // need to make sure we don't just follow the click + refresh(); + } +} + +LLInventoryItem* LLSidepanelItemInfo::findItem() const +{ + LLInventoryItem* item = NULL; + if(mObjectID.isNull()) + { + // it is in agent inventory + item = gInventory.getItem(mItemID); + } + else + { + LLViewerObject* object = gObjectList.findObject(mObjectID); + if(object) + { + item = (LLInventoryItem*)object->getInventoryObject(mItemID); + } + } + return item; +} + +void LLSidepanelItemInfo::updateVerbs() +{ + mEditBtn->setVisible(!mEditMode); + mSaveBtn->setVisible(mEditMode); + mCancelBtn->setVisible(mEditMode); + + const LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); + if (item) + { + const LLPermissions& perm = item->getPermissions(); + BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm, + GP_OBJECT_MANIPULATE); + mEditBtn->setEnabled(is_modifiable); + } +} + +void LLSidepanelItemInfo::onEditButtonClicked() +{ + setEditMode(TRUE); + refresh(); + updateVerbs(); +} + +void LLSidepanelItemInfo::onSaveButtonClicked() +{ + onCommitName(); + onCommitDescription(); + onCommitPermissions(); + onCommitSaleInfo(); + onCommitSaleType(); + + setEditMode(FALSE); + refresh(); + updateVerbs(); +} + +void LLSidepanelItemInfo::onCancelButtonClicked() +{ + setEditMode(FALSE); + refresh(); + updateVerbs(); +} diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h new file mode 100644 index 00000000000..21ca63894cf --- /dev/null +++ b/indra/newview/llsidepaneliteminfo.h @@ -0,0 +1,107 @@ +/** + * @file llsidepaneliteminfo.h + * @brief A panel which shows an inventory item's properties. + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLSIDEPANELITEMINFO_H +#define LL_LLSIDEPANELITEMINFO_H + +#include <map> +#include "llmultifloater.h" +#include "lliconctrl.h" + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLSidepanelItemInfo +// Object properties for inventory side panel. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLButton; +class LLInventoryItem; +class LLItemPropertiesObserver; + +class LLSidepanelItemInfo : public LLPanel +{ +public: + LLSidepanelItemInfo(); + virtual ~LLSidepanelItemInfo(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void setVisible(BOOL visible); + /*virtual*/ void draw(); + + void setObjectID(const LLUUID& object_id); + void setItemID(const LLUUID& item_id); + void setEditMode(BOOL edit); + + void reset(); + void dirty(); + +protected: + LLInventoryItem* findItem() const; + void refresh(); + void refreshFromItem(LLInventoryItem* item); + void updateVerbs(); + +private: + // The item id of the inventory item in question. + LLUUID mItemID; + + // mObjectID will have a value if it is associated with a task in + // the world, and will be == LLUUID::null if it's in the agent + // inventory. + LLUUID mObjectID; + + BOOL mDirty; + BOOL mEditMode; + + LLItemPropertiesObserver* mPropertiesObserver; + + // + // UI Elements + // +protected: + void onEditButtonClicked(); + void onSaveButtonClicked(); + void onCancelButtonClicked(); + void onClickCreator(); + void onClickOwner(); + void onCommitName(); + void onCommitDescription(); + void onCommitPermissions(); + void onCommitSaleInfo(); + void onCommitSaleType(); + void updateSaleInfo(); +private: + LLButton* mEditBtn; + LLButton* mSaveBtn; + LLButton* mCancelBtn; +}; + +#endif // LL_LLSIDEPANELITEMINFO_H diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml index d0c3cdfafcf..0b4a0e1e24c 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml @@ -1,122 +1,122 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - background_visible="true" - follows="all" - height="400" - label="Things" - layout="topleft" - min_height="350" - min_width="240" - name="objects panel" - width="333"> - <tab_container - follows="all" - height="390" - layout="topleft" - left="9" - name="Inventory Tabs" - tab_position="top" - top="0" - width="313" - tab_height="0" - visible="true"> - <panel - class="panel_main_inventory" - filename="panel_main_inventory.xml" - follows="all" - layout="topleft" - left="0" - name="panel_main_inventory" - top="15" - label="" - height="330" - width="467"> - <panel - height="25" - layout="bottomright" - left="0" - help_topic="objects_button_tab" - name="button_panel" - bottom="0" - width="313"> - <button - enabled="true" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Info" - layout="topleft" - left="0" - name="info_btn" - top="0" - width="60" /> - <button - enabled="true" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Share" - layout="topleft" - left_pad="5" - name="share_btn" - top="0" - width="60" /> - <button - enabled="false" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Wear" - layout="topleft" - left="130" - name="wear_btn" - top="0" - width="60" /> - <button - enabled="false" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Play" - layout="topleft" - name="play_btn" - left="130" - top="0" - width="50" /> - <button - enabled="false" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Teleport" - layout="topleft" - left="130" - name="teleport_btn" - top="0" - width="77" /> - <button - follows="bottom|right" - font="SansSerifSmallBold" - height="25" - label="v" - layout="topleft" - name="overflow_btn" - right="-10" - top="0" - width="30" /> - </panel> - </panel> - </tab_container> - - <panel - class="sidepanel_object_info" - filename="sidepanel_object_info.xml" - follows="all" - height="360" - layout="topleft" - left="0" - help_topic="objects_info_tab" - name="sidepanel_object_info" - top="30" - visible="false" /> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="400" + label="Things" + layout="topleft" + min_height="350" + min_width="240" + name="objects panel" + width="333"> + <tab_container + follows="all" + height="390" + layout="topleft" + left="9" + name="Inventory Tabs" + tab_position="top" + top="0" + width="313" + tab_height="0" + visible="true"> + <panel + class="panel_main_inventory" + filename="panel_main_inventory.xml" + follows="all" + layout="topleft" + left="0" + name="panel_main_inventory" + top="15" + label="" + height="330" + width="467"> + <panel + height="25" + layout="bottomright" + left="0" + help_topic="item_button_tab" + name="button_panel" + bottom="0" + width="313"> + <button + enabled="true" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Info" + layout="topleft" + left="0" + name="info_btn" + top="0" + width="60" /> + <button + enabled="true" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Share" + layout="topleft" + left_pad="5" + name="share_btn" + top="0" + width="60" /> + <button + enabled="false" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Wear" + layout="topleft" + left="130" + name="wear_btn" + top="0" + width="60" /> + <button + enabled="false" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Play" + layout="topleft" + name="play_btn" + left="130" + top="0" + width="50" /> + <button + enabled="false" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Teleport" + layout="topleft" + left="130" + name="teleport_btn" + top="0" + width="77" /> + <button + follows="bottom|right" + font="SansSerifSmallBold" + height="25" + label="v" + layout="topleft" + name="overflow_btn" + right="-10" + top="0" + width="30" /> + </panel> + </panel> + </tab_container> + + <panel + class="sidepanel_item_info" + filename="sidepanel_item_info.xml" + follows="all" + height="360" + layout="topleft" + left="0" + help_topic="item_info_tab" + name="sidepanel_item_info" + top="30" + visible="false" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml new file mode 100644 index 00000000000..6a6e22c2e65 --- /dev/null +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -0,0 +1,531 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + auto_tile="true" + height="560" + layout="topleft" + name="item properties" + help_topic="item_properties" + save_rect="true" + title="Inventory Item Properties" + width="325"> + <panel.string + name="unknown"> + (unknown) + </panel.string> + <panel.string + name="public"> + (public) + </panel.string> + <panel.string + name="you_can"> + You can: + </panel.string> + <panel.string + name="owner_can"> + Owner can: + </panel.string> + <panel.string + name="acquiredDate"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </panel.string> + <icon + follows="top|right" + height="18" + image_name="Lock" + layout="topleft" + right="-50" + mouse_opaque="true" + name="IconLocked" + top="4" + width="18" /> + <button + follows="top|right" + height="25" + image_overlay="BackArrow_Off" + layout="topleft" + name="back_btn" + picture_style="true" + right="-5" + tab_stop="false" + top="0" + width="25" /> + + <tab_container + follows="all" + height="450" + layout="topleft" + left="10" + name="tabs" + tab_min_width="70" + tab_height="0" + tab_position="top" + top_pad="10" + width="313"> + <panel + follows="all" + height="500" + label="" + layout="topleft" + left="0" + help_topic="people_nearby_tab" + name="nearby_panel" + top="0" + border="1" + width="313"> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="5" + name="LabelItemNameTitle" + top="5" + width="78"> + Name: + </text> + <line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="16" + layout="topleft" + left_delta="78" + max_length="63" + name="LabelItemName" + top_delta="0" + width="225" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="5" + name="LabelItemDescTitle" + top_delta="20" + width="78"> + Description: + </text> + <line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="16" + layout="topleft" + left_delta="78" + max_length="127" + name="LabelItemDesc" + top_delta="0" + width="225" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="LabelCreatorTitle" + top="65" + width="78"> + Creator: + </text> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="78" + name="LabelCreatorName" + top_delta="0" + width="200"> + Nicole Linden + </text> + <button + follows="top|right" + font="SansSerifSmall" + height="16" + label="Profile..." + layout="topleft" + left_delta="144" + name="BtnCreator" + top_delta="0" + width="78" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="LabelOwnerTitle" + top="85" + width="78"> + Owner: + </text> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="78" + name="LabelOwnerName" + top_delta="0" + width="200"> + Thrax Linden + </text> + <button + follows="top|right" + font="SansSerifSmall" + height="16" + label="Profile..." + layout="topleft" + left_delta="144" + name="BtnOwner" + top_delta="0" + width="78" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="LabelAcquiredTitle" + top="105" + width="78"> + Acquired: + </text> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="78" + name="LabelAcquiredDate" + top_delta="0" + width="252"> + Wed May 24 12:50:46 2006 + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="OwnerLabel" + top="125" + width="78"> + You: + </text> + <check_box + height="16" + label="Edit" + layout="topleft" + left_pad="5" + name="CheckOwnerModify" + top_delta="0" + width="78" /> + <check_box + height="16" + label="Copy" + layout="topleft" + left_delta="0" + name="CheckOwnerCopy" + top_pad="5" + width="88" /> + <check_box + height="16" + label="Resell" + layout="topleft" + left_delta="0" + name="CheckOwnerTransfer" + top_pad="5" + width="106" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="AnyoneLabel" + top_pad="5" + width="78"> + Anyone: + </text> + <check_box + height="16" + label="Copy" + layout="topleft" + left_pad="5" + name="CheckEveryoneCopy" + top_delta="0" + width="130" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="GroupLabel" + top_pad="5" + width="78"> + Group: + </text> + <check_box + height="16" + label="Share" + layout="topleft" + left_pad="5" + name="CheckShareWithGroup" + top_delta="5" + width="106" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="NextOwnerLabel" + top_pad="5" + width="78"> + Next owner: + </text> + <check_box + height="16" + label="Edit" + layout="topleft" + left_pad="5" + name="CheckNextOwnerModify" + top_delta="0" + width="78" /> + <check_box + height="16" + label="Copy" + layout="topleft" + left_delta="0" + name="CheckNextOwnerCopy" + top_pad="5" + width="88" /> + <check_box + height="16" + label="Resell" + layout="topleft" + left_delta="0" + name="CheckNextOwnerTransfer" + top_pad="5" + width="106" /> + <check_box + height="16" + label="For Sale" + layout="topleft" + left="10" + name="CheckPurchase" + top_pad="5" + width="78" /> + <combo_box + height="19" + left_pad="5" + layout="topleft" + follows="left|top" + name="combobox sale copy" + width="90"> + <combo_box.item + label="Copy" + name="Copy" + value="Copy" /> + <combo_box.item + label="Original" + name="Original" + value="Original" /> + </combo_box> + <spinner + follows="left|top" + decimal_digits="0" + increment="1" + control_name="Edit Cost" + name="Edit Cost" + label="Price: L$" + label_width="60" + left="10" + width="180" + min_val="1" + height="19" + max_val="999999999" + top_pad="5"/> + + <!--line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="16" + layout="topleft" + left_pad="5" + max_length="25" + name="EditPrice" + top_delta="0" + width="242" /--> + + <!--text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="BaseMaskDebug" + top="155" + width="330"> + B: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="OwnerMaskDebug" + top_delta="0" + width="270"> + O: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="GroupMaskDebug" + top_delta="0" + width="210"> + G: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="EveryoneMaskDebug" + top_delta="0" + width="150"> + E: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="NextMaskDebug" + top_delta="0" + width="90"> + N: + </text--> + <!--text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="SaleLabel" + top_pad="5" + width="330"> + Mark Item: + </text--> + + + <!--radio_group + draw_border="false" + follows="left|top|right" + height="16" + layout="topleft" + left_delta="78" + name="RadioSaleType" + top_delta="0" + width="252"> + <radio_item + height="16" + label="Original" + layout="topleft" + left="0" + name="radio" + top="0" + width="70" /> + <radio_item + height="16" + label="Copy" + layout="topleft" + left_delta="60" + name="radio2" + top_delta="0" + width="70" /> + </radio_group--> + + <!--text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="TextPrice" + top_pad="5" + width="78"> + Price: L$ + </text--> + </panel> + </tab_container> + <panel + height="25" + layout="bottomright" + left="0" + help_topic="places_button_tab" + name="button_panel" + bottom="5" + width="325"> + <button + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Edit" + layout="topleft" + left="10" + name="edit_btn" + top="0" + width="50" /> + <button + follows="bottom|right" + font="SansSerifSmallBold" + height="25" + label="Cancel" + layout="topleft" + name="cancel_btn" + right="-10" + top="0" + width="70" /> + <button + follows="bottom|right" + font="SansSerifSmallBold" + height="25" + label="Save" + layout="topleft" + name="save_btn" + left_pad="-135" + top="0" + width="60" /> + </panel> + +</panel> -- GitLab From fcecb648ef2e88715fd6a18765126650b635c367 Mon Sep 17 00:00:00 2001 From: Soft Linden <soft@lindenlab.com> Date: Tue, 3 Nov 2009 15:39:20 -0600 Subject: [PATCH 083/306] DEV-41348 SNOW-278 Clean up mime_types.xml --- .../skins/default/xui/en/mime_types.xml | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml index 2de9449ea6c..76c0d027f33 100644 --- a/indra/newview/skins/default/xui/en/mime_types.xml +++ b/indra/newview/skins/default/xui/en/mime_types.xml @@ -163,8 +163,8 @@ movie </widgettype> <impl> - media_plugin_quicktime - </impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="application/javascript"> <label name="application/javascript_label"> @@ -208,7 +208,7 @@ </mimetype> <mimetype name="application/smil"> <label name="application/smil_label"> - Synchronized Multimedia Integration Language (SMIL) + Synchronized Multimedia Integration Language (SMIL) </label> <widgettype> movie @@ -348,8 +348,8 @@ web </widgettype> <impl> - media_plugin_webkit - </impl> + media_plugin_webkit + </impl> </mimetype> <mimetype menu="1" name="text/plain"> <label name="text/plain_label"> @@ -381,8 +381,8 @@ movie </widgettype> <impl> - media_plugin_quicktime - </impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="video/mp4"> <label name="video/mp4_label"> @@ -392,8 +392,8 @@ movie </widgettype> <impl> - media_plugin_quicktime - </impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype menu="1" name="video/quicktime"> <label name="video/quicktime_label"> @@ -403,8 +403,8 @@ movie </widgettype> <impl> - media_plugin_quicktime - </impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="video/x-ms-asf"> <label name="video/x-ms-asf_label"> @@ -414,8 +414,8 @@ movie </widgettype> <impl> - media_plugin_quicktime - </impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="video/x-ms-wmv"> <label name="video/x-ms-wmv_label"> @@ -425,8 +425,8 @@ movie </widgettype> <impl> - media_plugin_quicktime - </impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype menu="1" name="video/x-msvideo"> <label name="video/x-msvideo_label"> @@ -436,7 +436,7 @@ movie </widgettype> <impl> - media_plugin_quicktime - </impl> + media_plugin_quicktime + </impl> </mimetype> </mimetypes> -- GitLab From 4692244422fd45057164bcb85f040b258dd307b6 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Tue, 3 Nov 2009 16:41:38 -0500 Subject: [PATCH 084/306] Adding sidepanel_ .xml files to XUI preview tool. --HG-- branch : avatar-pipeline --- indra/newview/llfloateruipreview.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 2fe21f28de1..663bd232f74 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -670,6 +670,15 @@ void LLFloaterUIPreview::refreshList() } } + found = TRUE; + while(found) // for every sidepanel file that matches the pattern + { + if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "sidepanel_*.xml", name, FALSE))) // get next file matching pattern + { + addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) + } + } + if(!mFileList->isEmpty()) // if there were any matching files, just select the first one (so we don't have to worry about disabling buttons when no entry is selected) { mFileList->selectFirstItem(); -- GitLab From 2a0697711aefaa25c698bae8e57c0964ba38b3fb Mon Sep 17 00:00:00 2001 From: Soft Linden <soft@lindenlab.com> Date: Tue, 3 Nov 2009 15:45:30 -0600 Subject: [PATCH 085/306] DEV-41348 SNOW-278 Clean up mime_types.xml - missed credit --- doc/contributions.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/contributions.txt b/doc/contributions.txt index 942ba0f0b97..f4ba643198a 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -139,6 +139,7 @@ Blakar Ogre blino Nakamura VWR-17 Boroondas Gupte + SNOW-278 VWR-233 WEB-262 Bulli Schumann -- GitLab From 4e52e09fea81fbde6019afc39b1c028b393fb4c8 Mon Sep 17 00:00:00 2001 From: Soft Linden <soft@lindenlab.com> Date: Tue, 3 Nov 2009 15:49:33 -0600 Subject: [PATCH 086/306] DEV-37978 VWR-8617: Missing / incorrect keywords TEXTURE_MEDIA and TEXTURE_DEFAULT --- doc/contributions.txt | 1 + indra/newview/app_settings/keywords.ini | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index f4ba643198a..4e3379d21fb 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -297,6 +297,7 @@ Jacek Antonelli VWR-2947 VWR-2948 VWR-3605 + VWR-8617 JB Kraft VWR-5283 VWR-7802 diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index 544f1c598e9..5f6fd6e4a73 100644 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -560,7 +560,8 @@ STATUS_WHITELIST_FAILED URL failed to pass whitelist NULL_KEY Indicates an empty key EOF Indicates the last line of a notecard was read TEXTURE_BLANK UUID for the "Blank" texture -TEXTURE_DEFAULT UUID for the "Default Media" texture +TEXTURE_DEFAULT Alias for TEXTURE_PLYWOOD +TEXTURE_MEDIA UUID for the "Default Media" texture TEXTURE_PLYWOOD UUID for the default "Plywood" texture TEXTURE_TRANSPARENT UUID for the "White - Transparent" texture -- GitLab From 876bb9043c795872ee4d6b86924541fc5ebbf222 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Tue, 3 Nov 2009 13:51:11 -0800 Subject: [PATCH 087/306] Fixed strings to use our preferred <string> instead of <floater.string> --- .../skins/default/xui/en/floater_tools.xml | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index f566dbdb75f..aee58df4910 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -13,58 +13,58 @@ single_instance="true" sound_flags="0" width="280"> - <floater.string + <string name="status_rotate"> Drag colored bands to rotate object - </floater.string> - <floater.string + </string> + <string name="status_scale"> Click and drag to stretch selected side - </floater.string> - <floater.string + </string> + <string name="status_move"> Drag to move, shift-drag to copy - </floater.string> - <floater.string + </string> + <string name="status_modifyland"> Click and hold to modify land - </floater.string> - <floater.string + </string> + <string name="status_camera"> Click and drag to move camera - </floater.string> - <floater.string + </string> + <string name="status_grab"> Drag to move, Ctrl to lift, Ctrl+Shift to rotate - </floater.string> - <floater.string + </string> + <string name="status_place"> Click inworld to build - </floater.string> - <floater.string + </string> + <string name="status_selectland"> Click and drag to select land - </floater.string> - <floater.string + </string> + <string name="grid_screen_text"> Screen - </floater.string> - <floater.string + </string> + <string name="grid_local_text"> Local - </floater.string> - <floater.string + </string> + <string name="grid_world_text"> World - </floater.string> - <floater.string + </string> + <string name="grid_reference_text"> Reference - </floater.string> - <floater.string + </string> + <string name="grid_attachment_text"> Attachment - </floater.string> + </string> <button follows="left|top" height="20" -- GitLab From dbaa7e28cab9700e4342220410d49a608c600a0b Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Tue, 3 Nov 2009 13:59:12 -0800 Subject: [PATCH 088/306] fixing de dot --- indra/newview/llvoicevisualizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp index 9bafc03a6d1..e777d7362f7 100644 --- a/indra/newview/llvoicevisualizer.cpp +++ b/indra/newview/llvoicevisualizer.cpp @@ -142,7 +142,7 @@ LLVoiceVisualizer::LLVoiceVisualizer( const U8 type ) for (int i=0; i<NUM_VOICE_SYMBOL_WAVES; i++) { mSoundSymbol.mWaveFadeOutStartTime [i] = mCurrentTime; - mSoundSymbol.mTexture [i] = LLViewerTextureManager::getFetchedTextureFromFile(sound_level_img[i], FALSE, TRUE); + mSoundSymbol.mTexture [i] = LLViewerTextureManager::getFetchedTextureFromFile(sound_level_img[i], FALSE, LLViewerTexture::BOOST_UI); mSoundSymbol.mWaveActive [i] = false; mSoundSymbol.mWaveOpacity [i] = 1.0f; mSoundSymbol.mWaveExpansion [i] = 1.0f; -- GitLab From c86ec95232d0211e15a67e7d10b138477af80530 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Tue, 3 Nov 2009 14:39:09 -0800 Subject: [PATCH 089/306] EXT-1865 Can now set objects for sale for L$0 Trivial XUI mistake, not reviewed --- indra/newview/skins/default/xui/en/floater_tools.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 9294dc19ecf..1d87a0f9d26 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -1034,7 +1034,10 @@ label="Original" value="1" /> </combo_box> -<!-- NEW PRICE SPINNER --> +<!-- NEW PRICE SPINNER + Objects are allowed to be for sale for L$0 to invoke buy UI behavior + even though the user gets a free copy. +--> <spinner follows="left|top" decimal_digits="0" @@ -1046,7 +1049,7 @@ label="Price: L$" label_width="65" width="150" - min_val="1" + min_val="0" height="20" max_val="999999999" /> <check_box -- GitLab From 3f622037f83ff6c15a2634e174fb3cf6b7f7227b Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Tue, 3 Nov 2009 15:25:03 -0800 Subject: [PATCH 090/306] EXT-1345 Convert LLTalkButton to XUI XML Allows Erica and co to change and localize it. Trivial, not reviewed. --- indra/newview/llchiclet.cpp | 27 ++----------------- .../skins/default/xui/en/panel_bottomtray.xml | 2 +- 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index bad61101c1b..21514b17d96 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -51,7 +51,7 @@ #include "lltransientfloatermgr.h" static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel"); -static LLDefaultChildRegistry::Register<LLTalkButton> t2("chiclet_talk"); +static LLDefaultChildRegistry::Register<LLTalkButton> t2("talk_button"); static LLDefaultChildRegistry::Register<LLNotificationChiclet> t3("chiclet_notification"); static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t4("chiclet_im_p2p"); static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t5("chiclet_im_group"); @@ -1257,30 +1257,7 @@ LLTalkButton::Params::Params() , show_button("show_button") , monitor("monitor") { - // *TODO Vadim: move hardcoded labels (!) and other params to XUI. - speak_button.name("left"); - speak_button.label("Speak"); - speak_button.label_selected("Speak"); - speak_button.font(LLFontGL::getFontSansSerifSmall()); - speak_button.tab_stop(false); - speak_button.is_toggle(true); - speak_button.picture_style(true); - // Use default button art. JC - //speak_button.image_selected(LLUI::getUIImage("SegmentedBtn_Left_Selected")); - //speak_button.image_unselected(LLUI::getUIImage("SegmentedBtn_Left_Off")); - - show_button.name("right"); - show_button.label(LLStringUtil::null); - show_button.rect(LLRect(0, 0, 20, 0)); - show_button.tab_stop(false); - show_button.is_toggle(true); - show_button.picture_style(true); - show_button.image_selected(LLUI::getUIImage("ComboButton_Selected")); - show_button.image_unselected(LLUI::getUIImage("ComboButton_Off")); - - monitor.name("monitor"); - // *TODO: Make this data driven. - monitor.rect(LLRect(0, 18, 18, 0)); + // See widgets/talk_button.xml } LLTalkButton::LLTalkButton(const Params& p) diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 61bd1d186e5..c1837495874 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -60,7 +60,7 @@ min_width="96" name="speak_panel" user_resize="false"> - <chiclet_talk + <talk_button follows="right" height="23" speak_button.tab_stop="true" -- GitLab From c386169742df3053baa185a43f991f0db68c2bcc Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Tue, 3 Nov 2009 16:13:39 -0800 Subject: [PATCH 091/306] Removed unneeded layout="topleft" attributes. --- .../default/xui/en/menu_inspect_avatar_gear.xml | 15 ++------------- .../default/xui/en/menu_inspect_self_gear.xml | 7 +------ 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml index 6049476a43f..8ee67b9a020 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml @@ -7,7 +7,6 @@ name="Gear Menu"> <menu_item_call label="View Profile" - layout="topleft" enabled="true" name="view_profile"> <menu_item_call.on_click @@ -15,49 +14,42 @@ </menu_item_call> <menu_item_call label="Add Friend" - layout="topleft" name="add_friend"> <menu_item_call.on_click function="InspectAvatar.AddFriend"/> </menu_item_call> <menu_item_call label="IM" - layout="topleft" name="im"> <menu_item_call.on_click function="InspectAvatar.IM"/> </menu_item_call> <menu_item_call label="Call" - layout="topleft" enabled="true" name="call"> </menu_item_call> <menu_item_call label="Teleport" - layout="topleft" name="teleport"> <menu_item_call.on_click function="InspectAvatar.Teleport"/> </menu_item_call> <menu_item_call label="Invite to Group" - layout="topleft" name="invite_to_group"> <menu_item_call.on_click function="InspectAvatar.InviteToGroup"/> </menu_item_call> - <menu_item_separator layout="topleft" /> + <menu_item_separator /> <menu_item_call label="Block" - layout="topleft" name="block"> <menu_item_call.on_click function="InspectAvatar.Block"/> </menu_item_call> <menu_item_call label="Report" - layout="topleft" name="report"> <menu_item_call.on_click function="InspectAvatar.Report"/> @@ -88,7 +80,6 @@ </menu_item_call> <menu_item_call label="Find On Map" - layout="topleft" name="find_on_map"> <menu_item_call.on_click function="InspectAvatar.FindOnMap"/> @@ -97,16 +88,14 @@ </menu_item_call> <menu_item_call label="Zoom In" - layout="topleft" name="zoom_in"> <menu_item_call.on_click function="InspectAvatar.ZoomIn"/> </menu_item_call> <menu_item_call label="Pay" - layout="topleft" name="pay"> <menu_item_call.on_click function="InspectAvatar.Pay"/> </menu_item_call> -</menu> \ No newline at end of file +</menu> diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml index 19c2bf34969..ce5ee83f556 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml @@ -7,7 +7,6 @@ name="Gear Menu"> <menu_item_call label="Stand Up" - layout="topleft" enabled="true" name="stand_up"> <menu_item_call.on_click @@ -18,7 +17,6 @@ </menu_item_call> <menu_item_call label="My Appearance" - layout="topleft" name="my_appearance"> <menu_item_call.on_click function="ShowFloater" @@ -28,7 +26,6 @@ </menu_item_call> <menu_item_call label="My Profile" - layout="topleft" enabled="true" name="my_profile"> <menu_item_call.on_click @@ -37,7 +34,6 @@ </menu_item_call> <menu_item_call label="My Friends" - layout="topleft" name="my_friends"> <menu_item_call.on_click function="Self.Friends" @@ -45,9 +41,8 @@ </menu_item_call> <menu_item_call label="My Groups" - layout="topleft" name="my_groups"> <menu_item_call.on_click function="Self.Groups" /> </menu_item_call> -</menu> \ No newline at end of file +</menu> -- GitLab From a3f9b5d2d8cba2aa7de71aee0564a8125ca02e29 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Tue, 3 Nov 2009 16:13:54 -0800 Subject: [PATCH 092/306] EXT-2093 People inspectors should include an "IM" button --- indra/newview/llinspectavatar.cpp | 19 +++++++++++++++++-- .../skins/default/xui/en/inspect_avatar.xml | 12 ++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index bfad2b16248..9989a3b4731 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -188,7 +188,8 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd) { mCommitCallbackRegistrar.add("InspectAvatar.ViewProfile", boost::bind(&LLInspectAvatar::onClickViewProfile, this)); mCommitCallbackRegistrar.add("InspectAvatar.AddFriend", boost::bind(&LLInspectAvatar::onClickAddFriend, this)); - mCommitCallbackRegistrar.add("InspectAvatar.IM", boost::bind(&LLInspectAvatar::onClickIM, this)); + mCommitCallbackRegistrar.add("InspectAvatar.IM", + boost::bind(&LLInspectAvatar::onClickIM, this)); mCommitCallbackRegistrar.add("InspectAvatar.Teleport", boost::bind(&LLInspectAvatar::onClickTeleport, this)); mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup", boost::bind(&LLInspectAvatar::onClickInviteToGroup, this)); mCommitCallbackRegistrar.add("InspectAvatar.Pay", boost::bind(&LLInspectAvatar::onClickPay, this)); @@ -306,7 +307,21 @@ void LLInspectAvatar::requestUpdate() // You can't re-add someone as a friend if they are already your friend bool is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarID) != NULL; bool is_self = (mAvatarID == gAgentID); - childSetEnabled("add_friend_btn", !is_friend && !is_self); + if (is_self) + { + getChild<LLUICtrl>("add_friend_btn")->setVisible(false); + getChild<LLUICtrl>("im_btn")->setVisible(false); + } + else if (is_friend) + { + getChild<LLUICtrl>("add_friend_btn")->setVisible(false); + getChild<LLUICtrl>("im_btn")->setVisible(true); + } + else + { + getChild<LLUICtrl>("add_friend_btn")->setVisible(true); + getChild<LLUICtrl>("im_btn")->setVisible(false); + } // Use an avatar_icon even though the image id will come down with the // avatar properties because the avatar_icon code maintains a cache of icons diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml index 6b13e2f1c7c..e2ae81e0b93 100644 --- a/indra/newview/skins/default/xui/en/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml @@ -128,6 +128,8 @@ left_delta="110" tab_stop="false" width="18" /> + <!-- Overlapping buttons for default actions + llinspectavatar.cpp makes visible the most likely default action --> <button follows="bottom|left" height="23" @@ -136,6 +138,16 @@ top="246" name="add_friend_btn" width="100" /> + <button + follows="bottom|left" + height="23" + label="IM" + left_delta="0" + top_delta="0" + name="im_btn" + width="100" + commit_callback.function="InspectAvatar.IM" + /> <menu_button follows="top|left" height="18" -- GitLab From 0dce13377e6fe6ec6c575bdeb725cbf9fd60d107 Mon Sep 17 00:00:00 2001 From: Rick Pasetto <rick@lindenlab.com> Date: Tue, 3 Nov 2009 16:21:55 -0800 Subject: [PATCH 093/306] Fix unposted bug: potential incorrect contract in LLMediaEntry::asLLSD(LLSD& sd) Review #26 Callum found this potential bug in LLMediaEntry::asLLSD(LLSD&). It does not erase the incoming LLSD's WHITELIST_KEY. Every other key is overwritten in this manner, but for the WHITELIST_KEY it is just appended. Note that this is in code common to the server...but I do not believe at this point that there is a bug exhibited by this. Added unit test to test for this case. --- indra/llprimitive/llmediaentry.cpp | 1 + indra/llprimitive/tests/llmediaentry_test.cpp | 116 ++++++++++-------- 2 files changed, 66 insertions(+), 51 deletions(-) diff --git a/indra/llprimitive/llmediaentry.cpp b/indra/llprimitive/llmediaentry.cpp index fa04bf80e7a..701300163a3 100644 --- a/indra/llprimitive/llmediaentry.cpp +++ b/indra/llprimitive/llmediaentry.cpp @@ -164,6 +164,7 @@ void LLMediaEntry::asLLSD(LLSD& sd) const // "security" fields sd[WHITELIST_ENABLE_KEY] = mWhiteListEnable; + sd.erase(WHITELIST_KEY); for (U32 i=0; i<mWhiteList.size(); i++) { sd[WHITELIST_KEY].append(mWhiteList[i]); diff --git a/indra/llprimitive/tests/llmediaentry_test.cpp b/indra/llprimitive/tests/llmediaentry_test.cpp index 9ce65609237..cd9608d56b7 100644 --- a/indra/llprimitive/tests/llmediaentry_test.cpp +++ b/indra/llprimitive/tests/llmediaentry_test.cpp @@ -223,8 +223,7 @@ namespace tut { set_test_name("Test LLMediaEntry Instantiation"); LLMediaEntry entry; - ensure_llsd_equals(get_test_name(), defaultMediaEntryLLSD, entry.asLLSD()); - + ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, entry.asLLSD()); } template<> template<> @@ -251,12 +250,27 @@ namespace tut ensure_llsd_equals(get_test_name() + " failed", golden, entry.asLLSD()); } + template<> template<> + void object::test<4>() + { + set_test_name("Test LLMediaEntry::asLLSD()"); + LLMediaEntry entry; + LLSD sd; + // Put some cruft in the LLSD + sd[LLMediaEntry::CURRENT_URL_KEY] = "http://www.example.com"; + LLSD whitelist; + whitelist.append("*.example.com"); + sd[LLMediaEntry::WHITELIST_KEY] = whitelist; + entry.asLLSD(sd); + ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, sd); + } + // limit tests const char *URL_OK = "http://www.example.com"; const char *URL_TOO_BIG = "http://www.example.com.qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"; template<> template<> - void object::test<4>() + void object::test<5>() { set_test_name("Test Limits on setting current URL"); LLMediaEntry entry; @@ -267,7 +281,7 @@ namespace tut } template<> template<> - void object::test<5>() + void object::test<6>() { set_test_name("Test Limits on setting home URL"); LLMediaEntry entry; @@ -278,7 +292,7 @@ namespace tut } template<> template<> - void object::test<6>() + void object::test<7>() { set_test_name("Test Limits on setting whitelist"); @@ -292,7 +306,7 @@ namespace tut } template<> template<> - void object::test<7>() + void object::test<8>() { set_test_name("Test Limits on setting whitelist too big"); @@ -307,7 +321,7 @@ namespace tut } template<> template<> - void object::test<8>() + void object::test<9>() { set_test_name("Test Limits on setting whitelist too many"); @@ -323,7 +337,7 @@ namespace tut } template<> template<> - void object::test<9>() + void object::test<10>() { set_test_name("Test to make sure both setWhiteList() functions behave the same"); @@ -341,7 +355,7 @@ namespace tut } template<> template<> - void object::test<10>() + void object::test<11>() { set_test_name("Test to make sure both setWhiteList() functions behave the same"); @@ -362,7 +376,7 @@ namespace tut } template<> template<> - void object::test<11>() + void object::test<12>() { set_test_name("Test to make sure both setWhiteList() functions behave the same"); @@ -386,99 +400,99 @@ namespace tut // Check the "empty whitelist" case template<> template<> - void object::test<12>() { whitelist_test("", "http://www.example.com", true); } + void object::test<13>() { whitelist_test("", "http://www.example.com", true); } // Check the "missing scheme" case template<> template<> - void object::test<13>() { whitelist_test("www.example.com", "http://www.example.com", true); } + void object::test<14>() { whitelist_test("www.example.com", "http://www.example.com", true); } // Check the "exactly the same" case template<> template<> - void object::test<14>() { whitelist_test("http://example.com", "http://example.com", true); } + void object::test<15>() { whitelist_test("http://example.com", "http://example.com", true); } // Check the enable flag template<> template<> - void object::test<15>() { whitelist_test(false, "www.example.com", "http://www.secondlife.com", true); } + void object::test<16>() { whitelist_test(false, "www.example.com", "http://www.secondlife.com", true); } template<> template<> - void object::test<16>() { whitelist_test(true, "www.example.com", "http://www.secondlife.com", false); } + void object::test<17>() { whitelist_test(true, "www.example.com", "http://www.secondlife.com", false); } // Check permutations of trailing slash: template<> template<> - void object::test<17>() { whitelist_test("http://www.example.com", "http://www.example.com/", true); } + void object::test<18>() { whitelist_test("http://www.example.com", "http://www.example.com/", true); } template<> template<> - void object::test<18>() { whitelist_test("http://www.example.com/", "http://www.example.com/", true); } + void object::test<19>() { whitelist_test("http://www.example.com/", "http://www.example.com/", true); } template<> template<> - void object::test<19>() { whitelist_test("http://www.example.com/", "http://www.example.com", false); } + void object::test<20>() { whitelist_test("http://www.example.com/", "http://www.example.com", false); } template<> template<> - void object::test<20>() { whitelist_test("http://www.example.com", "http://www.example.com/foobar", true); } + void object::test<21>() { whitelist_test("http://www.example.com", "http://www.example.com/foobar", true); } template<> template<> - void object::test<21>() { whitelist_test("http://www.example.com/", "http://www.example.com/foobar", false); } + void object::test<22>() { whitelist_test("http://www.example.com/", "http://www.example.com/foobar", false); } // More cases... template<> template<> - void object::test<22>() { whitelist_test("http://example.com", "http://example.com/wiki", true); } + void object::test<23>() { whitelist_test("http://example.com", "http://example.com/wiki", true); } template<> template<> - void object::test<23>() { whitelist_test("www.example.com", "http://www.example.com/help", true); } + void object::test<24>() { whitelist_test("www.example.com", "http://www.example.com/help", true); } template<> template<> - void object::test<24>() { whitelist_test("http://www.example.com", "http://wwwexample.com", false); } + void object::test<25>() { whitelist_test("http://www.example.com", "http://wwwexample.com", false); } template<> template<> - void object::test<25>() { whitelist_test("http://www.example.com", "http://www.example.com/wiki", true); } + void object::test<26>() { whitelist_test("http://www.example.com", "http://www.example.com/wiki", true); } template<> template<> - void object::test<26>() { whitelist_test("example.com", "http://wwwexample.com", false); } + void object::test<27>() { whitelist_test("example.com", "http://wwwexample.com", false); } template<> template<> - void object::test<27>() { whitelist_test("http://www.example.com/", "http://www.amazon.com/wiki", false); } + void object::test<28>() { whitelist_test("http://www.example.com/", "http://www.amazon.com/wiki", false); } template<> template<> - void object::test<28>() { whitelist_test("www.example.com", "http://www.amazon.com", false); } + void object::test<29>() { whitelist_test("www.example.com", "http://www.amazon.com", false); } // regexp cases template<> template<> - void object::test<29>() { whitelist_test("*.example.com", "http://www.example.com", true); } + void object::test<30>() { whitelist_test("*.example.com", "http://www.example.com", true); } template<> template<> - void object::test<30>() { whitelist_test("*.example.com", "http://www.amazon.com", false); } + void object::test<31>() { whitelist_test("*.example.com", "http://www.amazon.com", false); } template<> template<> - void object::test<31>() { whitelist_test("*.example.com", "http://www.example.com/foo/bar", true); } + void object::test<32>() { whitelist_test("*.example.com", "http://www.example.com/foo/bar", true); } template<> template<> - void object::test<32>() { whitelist_test("*.example.com", "http:/example.com/foo/bar", false); } + void object::test<33>() { whitelist_test("*.example.com", "http:/example.com/foo/bar", false); } template<> template<> - void object::test<33>() { whitelist_test("*example.com", "http://example.com/foo/bar", true); } + void object::test<34>() { whitelist_test("*example.com", "http://example.com/foo/bar", true); } template<> template<> - void object::test<34>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?example.com", false); } + void object::test<35>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?example.com", false); } template<> template<> - void object::test<35>() { whitelist_test("example.com", "http://my.virus.com/foo/bar?example.com", false); } + void object::test<36>() { whitelist_test("example.com", "http://my.virus.com/foo/bar?example.com", false); } template<> template<> - void object::test<36>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?*example.com", false); } + void object::test<37>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?*example.com", false); } template<> template<> - void object::test<37>() { whitelist_test("http://*example.com", "http://www.example.com", true); } + void object::test<38>() { whitelist_test("http://*example.com", "http://www.example.com", true); } template<> template<> - void object::test<38>() { whitelist_test("http://*.example.com", "http://www.example.com", true); } + void object::test<39>() { whitelist_test("http://*.example.com", "http://www.example.com", true); } template<> template<> - void object::test<39>() { whitelist_test("http://*.e$?^.com", "http://www.e$?^.com", true); } + void object::test<40>() { whitelist_test("http://*.e$?^.com", "http://www.e$?^.com", true); } template<> template<> - void object::test<40>() { whitelist_test("*.example.com/foo/bar", "http://www.example.com/", false); } + void object::test<41>() { whitelist_test("*.example.com/foo/bar", "http://www.example.com/", false); } template<> template<> - void object::test<41>() { whitelist_test("*.example.com/foo/bar", "http://example.com/foo/bar", false); } + void object::test<42>() { whitelist_test("*.example.com/foo/bar", "http://example.com/foo/bar", false); } template<> template<> - void object::test<42>() { whitelist_test("http://*.example.com/foo/bar", "http://www.example.com", false); } + void object::test<43>() { whitelist_test("http://*.example.com/foo/bar", "http://www.example.com", false); } template<> template<> - void object::test<43>() { whitelist_test("http://*.example.com", "https://www.example.com", false); } + void object::test<44>() { whitelist_test("http://*.example.com", "https://www.example.com", false); } template<> template<> - void object::test<44>() { whitelist_test("http*://*.example.com", "rtsp://www.example.com", false); } + void object::test<45>() { whitelist_test("http*://*.example.com", "rtsp://www.example.com", false); } template<> template<> - void object::test<45>() { whitelist_test("http*://*.example.com", "https://www.example.com", true); } + void object::test<46>() { whitelist_test("http*://*.example.com", "https://www.example.com", true); } template<> template<> - void object::test<46>() { whitelist_test("example.com", "http://www.example.com", false); } + void object::test<47>() { whitelist_test("example.com", "http://www.example.com", false); } template<> template<> - void object::test<47>() { whitelist_test("www.example.com", "http://www.example.com:80", false); } + void object::test<48>() { whitelist_test("www.example.com", "http://www.example.com:80", false); } template<> template<> - void object::test<48>() { whitelist_test("www.example.com", "http://www.example.com", true); } + void object::test<49>() { whitelist_test("www.example.com", "http://www.example.com", true); } template<> template<> - void object::test<49>() { whitelist_test("www.example.com/", "http://www.example.com", false); } + void object::test<50>() { whitelist_test("www.example.com/", "http://www.example.com", false); } template<> template<> - void object::test<50>() { whitelist_test("www.example.com/foo/bar/*", "http://www.example.com/foo/bar/baz", true); } + void object::test<51>() { whitelist_test("www.example.com/foo/bar/*", "http://www.example.com/foo/bar/baz", true); } // Path only template<> template<> - void object::test<51>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/baz", true); } + void object::test<52>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/baz", true); } template<> template<> - void object::test<52>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/", false); } + void object::test<53>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/", false); } } -- GitLab From fcb899be4789dfa8d93edad3f163fe260296285d Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Tue, 3 Nov 2009 16:39:58 -0800 Subject: [PATCH 094/306] Missed the talk_button.xml file add. --- .../default/xui/en/widgets/talk_button.xml | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 indra/newview/skins/default/xui/en/widgets/talk_button.xml diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml new file mode 100644 index 00000000000..725492052ca --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- Derives from LLUICtrl --> +<talk_button> + <!-- To make speak button look green when selected set: + image_selected="SegmentedBtn_Left_Selected" + image_unselected="SegmentedBtn_Left_Off" + --> + <speak_button + name="left" + label="Speak" + label_selected="Speak" + font="SansSerifSmall" + tab_stop="false" + is_toggle="true" + picture_style="true" + /> + <show_button + name="right" + label="" + left="0" + top="0" + right="20" + bottom="0" + tab_stop="false" + is_toggle="true" + picture_style="true" + image_selected="ComboButton_Selected" + image_unselected="ComboButton_Off" + /> + <monitor + name="monitor" + left="0" + top="18" + right="18" + bottom="0" + /> +</talk_button> -- GitLab From f263d119c4c4a3816da15e327afc99fd94d39eef Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Tue, 3 Nov 2009 19:46:57 -0500 Subject: [PATCH 095/306] EXT-2130 : XUI cleanup Reformatted sidepanel_inventory Took out tab container from both sidepanel_inventory and sidepanel_item_info --HG-- branch : avatar-pipeline --- indra/newview/llsidepanelinventory.cpp | 98 ++- indra/newview/llsidepanelinventory.h | 6 +- .../default/xui/en/panel_main_inventory.xml | 830 +++++++++--------- .../default/xui/en/sidepanel_inventory.xml | 225 +++-- .../default/xui/en/sidepanel_item_info.xml | 35 +- 5 files changed, 588 insertions(+), 606 deletions(-) diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index dbe7e9fec6d..2ea84efd301 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -44,7 +44,7 @@ static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_ LLSidepanelInventory::LLSidepanelInventory() : LLPanel(), - mSidepanelItemInfo(NULL) + mItemPanel(NULL) { //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() @@ -56,36 +56,40 @@ LLSidepanelInventory::~LLSidepanelInventory() BOOL LLSidepanelInventory::postBuild() { - mInfoBtn = getChild<LLButton>("info_btn"); - mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this)); - - mShareBtn = getChild<LLButton>("share_btn"); - mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); - - mShareBtn = getChild<LLButton>("share_btn"); - mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); - - mWearBtn = getChild<LLButton>("wear_btn"); - mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this)); - - mPlayBtn = getChild<LLButton>("play_btn"); - mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this)); - - mTeleportBtn = getChild<LLButton>("teleport_btn"); - mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this)); - - mOverflowBtn = getChild<LLButton>("overflow_btn"); - mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this)); - - mTabContainer = getChild<LLTabContainer>("Inventory Tabs"); - mSidepanelItemInfo = getChild<LLSidepanelItemInfo>("sidepanel_item_info"); - - mPanelMainInventory = getChild<LLPanelMainInventory>("panel_main_inventory"); - mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); - - LLButton* back_btn = mSidepanelItemInfo->getChild<LLButton>("back_btn"); - back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); + // UI elements from inventory panel + { + mInventoryPanel = getChild<LLPanel>("sidepanel__inventory_panel"); + + mInfoBtn = mInventoryPanel->getChild<LLButton>("info_btn"); + mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this)); + + mShareBtn = mInventoryPanel->getChild<LLButton>("share_btn"); + mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); + + mWearBtn = mInventoryPanel->getChild<LLButton>("wear_btn"); + mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this)); + + mPlayBtn = mInventoryPanel->getChild<LLButton>("play_btn"); + mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this)); + + mTeleportBtn = mInventoryPanel->getChild<LLButton>("teleport_btn"); + mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this)); + + mOverflowBtn = mInventoryPanel->getChild<LLButton>("overflow_btn"); + mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this)); + + LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + panel_main_inventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); + } + // UI elements from item panel + { + mItemPanel = getChild<LLSidepanelItemInfo>("sidepanel__item_panel"); + + LLButton* back_btn = mItemPanel->getChild<LLButton>("back_btn"); + back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); + } + return TRUE; } @@ -94,16 +98,16 @@ void LLSidepanelInventory::onOpen(const LLSD& key) if(key.size() == 0) return; - mSidepanelItemInfo->reset(); + mItemPanel->reset(); if (key.has("id")) { - mSidepanelItemInfo->setItemID(key["id"].asUUID()); + mItemPanel->setItemID(key["id"].asUUID()); } if (key.has("object")) { - mSidepanelItemInfo->setObjectID(key["object"].asUUID()); + mItemPanel->setObjectID(key["object"].asUUID()); } toggleItemInfoPanel(TRUE); @@ -114,8 +118,8 @@ void LLSidepanelInventory::onInfoButtonClicked() LLInventoryItem *item = getSelectedItem(); if (item) { - mSidepanelItemInfo->reset(); - mSidepanelItemInfo->setItemID(item->getUUID()); + mItemPanel->reset(); + mItemPanel->setItemID(item->getUUID()); toggleItemInfoPanel(TRUE); } } @@ -126,13 +130,13 @@ void LLSidepanelInventory::onShareButtonClicked() void LLSidepanelInventory::performActionOnSelection(const std::string &action) { - LLInventoryPanel *panel = mPanelMainInventory->getActivePanel(); - LLFolderViewItem* current_item = panel->getRootFolder()->getCurSelectedItem(); + LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); if (!current_item) { return; } - current_item->getListener()->performAction(panel->getRootFolder(), panel->getModel(), action); + current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getRootFolder(), panel_main_inventory->getActivePanel()->getModel(), action); } void LLSidepanelInventory::onWearButtonClicked() @@ -168,17 +172,18 @@ void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> void LLSidepanelInventory::toggleItemInfoPanel(BOOL visible) { - mSidepanelItemInfo->setVisible(visible); - mTabContainer->setVisible(!visible); + mItemPanel->setVisible(visible); + mInventoryPanel->setVisible(!visible); if (visible) { - mSidepanelItemInfo->dirty(); - mSidepanelItemInfo->setEditMode(FALSE); - + mItemPanel->dirty(); + mItemPanel->setEditMode(FALSE); + /* LLRect rect = getRect(); - LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); - mSidepanelItemInfo->reshape(new_rect.getWidth(),new_rect.getHeight()); + LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mInventoryPanel->getRect().mBottom); + mItemPanel->reshape(new_rect.getWidth(),new_rect.getHeight()); + */ } } @@ -226,7 +231,8 @@ void LLSidepanelInventory::updateVerbs() LLInventoryItem *LLSidepanelInventory::getSelectedItem() { - LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); + LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); if (!current_item) { return NULL; diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index fbffb39b8c9..f9fe3e4e0e9 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -36,7 +36,6 @@ class LLInventoryItem; class LLSidepanelItemInfo; -class LLTabContainer; class LLPanelMainInventory; class LLFolderViewItem; @@ -78,9 +77,8 @@ class LLSidepanelInventory : public LLPanel LLButton* mTeleportBtn; LLButton* mOverflowBtn; - LLTabContainer* mTabContainer; - LLSidepanelItemInfo* mSidepanelItemInfo; - LLPanelMainInventory* mPanelMainInventory; + LLPanel* mInventoryPanel; // Main inventory view + LLSidepanelItemInfo* mItemPanel; // Individual item view }; #endif //LL_LLSIDEPANELINVENTORY_H diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 9a3fdcc327b..8c5bf768d69 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -1,415 +1,415 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - background_visible="true" - follows="all" - height="400" - label="Things" - layout="topleft" - min_height="350" - min_width="240" - name="inventory panel" - width="330"> - <panel.string - name="Title"> - Things - </panel.string> - <filter_editor - text_pad_left="12" - follows="left|top|right" - font="SanSerif" - height="20" - label="Filter" - layout="topleft" - left="15" - name="inventory search editor" - top="34" - width="300" /> - <tab_container - follows="left|top|right|bottom" - height="300" - layout="topleft" - left_delta="-4" - name="inventory filter tabs" - tab_position="top" - top_pad="4" - width="305"> - <inventory_panel - follows="left|top|right|bottom" - height="295" - label="All Items" - layout="topleft" - left="1" - name="All Items" - top="16" - width="290" /> - <inventory_panel - follows="left|top|right|bottom" - height="295" - label="Recent Items" - layout="topleft" - left_delta="0" - name="Recent Items" - top_delta="0" - width="290" /> - </tab_container> - <menu_bar - bg_visible="false" - follows="left|top|right" - height="18" - layout="topleft" - left_delta="0" - mouse_opaque="false" - name="Inventory Menu" - top_delta="-45" - width="290"> - <menu - height="101" - label="File" - layout="topleft" - left="0" - mouse_opaque="false" - name="File" - tear_off="true" - top="-117" - width="128"> - <menu_item_call - label="Open" - layout="topleft" - name="Open"> - <menu_item_call.on_click - function="Inventory.DoToSelected" - parameter="open" /> - </menu_item_call> - <menu - create_jump_keys="true" - label="Upload" - layout="topleft" - name="upload" - tear_off="true"> - <menu_item_call - label="Image (L$[COST])..." - layout="topleft" - name="Upload Image" - shortcut="control|U"> - <menu_item_call.on_click - function="File.UploadImage" - parameter="" /> - <menu_item_call.on_enable - function="File.EnableUpload" /> - </menu_item_call> - <menu_item_call - label="Sound (L$[COST])..." - layout="topleft" - name="Upload Sound"> - <menu_item_call.on_click - function="File.UploadSound" - parameter="" /> - <menu_item_call.on_enable - function="File.EnableUpload" /> - </menu_item_call> - <menu_item_call - label="Animation (L$[COST])..." - layout="topleft" - name="Upload Animation"> - <menu_item_call.on_click - function="File.UploadAnim" - parameter="" /> - <menu_item_call.on_enable - function="File.EnableUpload" /> - </menu_item_call> - <menu_item_call - label="Bulk (L$[COST] per file)..." - layout="topleft" - name="Bulk Upload"> - <menu_item_call.on_click - function="File.UploadBulk" - parameter="" /> - </menu_item_call> - <menu_item_separator - layout="topleft" /> - </menu> - <menu_item_separator - layout="topleft" /> - <menu_item_call - label="New Window" - layout="topleft" - name="New Window"> - <menu_item_call.on_click - function="Inventory.NewWindow" /> - </menu_item_call> - <menu_item_separator - layout="topleft" - name="separator2" /> - <menu_item_call - label="Show Filters" - layout="topleft" - name="Show Filters"> - <menu_item_call.on_click - function="Inventory.ShowFilters" /> - </menu_item_call> - <menu_item_call - label="Reset Filters" - layout="topleft" - name="Reset Current"> - <menu_item_call.on_click - function="Inventory.ResetFilter" /> - </menu_item_call> - <menu_item_call - label="Close All Folders" - layout="topleft" - name="Close All Folders"> - <menu_item_call.on_click - function="Inventory.CloseAllFolders" /> - </menu_item_call> - <menu_item_separator - layout="topleft" - name="separator3" /> - <menu_item_call - label="Empty Trash" - layout="topleft" - name="Empty Trash"> - <menu_item_call.on_click - function="Inventory.EmptyTrash" /> - </menu_item_call> - <menu_item_call - label="Empty Lost And Found" - layout="topleft" - name="Empty Lost And Found"> - <menu_item_call.on_click - function="Inventory.EmptyLostAndFound" /> - </menu_item_call> - </menu> - <menu - height="121" - label="Create" - layout="topleft" - left="0" - mouse_opaque="false" - name="Create" - tear_off="true" - top="-201" - width="121"> - <menu_item_call - label="New Folder" - layout="topleft" - name="New Folder"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="category" /> - </menu_item_call> - <menu_item_call - label="New Script" - layout="topleft" - name="New Script"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="lsl" /> - </menu_item_call> - <menu_item_call - label="New Note" - layout="topleft" - name="New Note"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="notecard" /> - </menu_item_call> - <menu_item_call - label="New Gesture" - layout="topleft" - name="New Gesture"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="gesture" /> - </menu_item_call> - <menu - height="175" - label="New Clothes" - layout="topleft" - left_delta="0" - mouse_opaque="false" - name="New Clothes" - top_pad="514" - width="125"> - <menu_item_call - label="New Shirt" - layout="topleft" - name="New Shirt"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="shirt" /> - </menu_item_call> - <menu_item_call - label="New Pants" - layout="topleft" - name="New Pants"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="pants" /> - </menu_item_call> - <menu_item_call - label="New Shoes" - layout="topleft" - name="New Shoes"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="shoes" /> - </menu_item_call> - <menu_item_call - label="New Socks" - layout="topleft" - name="New Socks"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="socks" /> - </menu_item_call> - <menu_item_call - label="New Jacket" - layout="topleft" - name="New Jacket"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="jacket" /> - </menu_item_call> - <menu_item_call - label="New Skirt" - layout="topleft" - name="New Skirt"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="skirt" /> - </menu_item_call> - <menu_item_call - label="New Gloves" - layout="topleft" - name="New Gloves"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="gloves" /> - </menu_item_call> - <menu_item_call - label="New Undershirt" - layout="topleft" - name="New Undershirt"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="undershirt" /> - </menu_item_call> - <menu_item_call - label="New Underpants" - layout="topleft" - name="New Underpants"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="underpants" /> - </menu_item_call> - <menu_item_call - label="New Alpha" - layout="topleft" - name="New Alpha"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="alpha" /> - </menu_item_call> - <menu_item_call - label="New Tattoo" - layout="topleft" - name="New Tattoo"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="tattoo" /> - </menu_item_call> - </menu> - <menu - height="85" - label="New Body Parts" - layout="topleft" - left_delta="0" - mouse_opaque="false" - name="New Body Parts" - top_pad="514" - width="118"> - <menu_item_call - label="New Shape" - layout="topleft" - name="New Shape"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="shape" /> - </menu_item_call> - <menu_item_call - label="New Skin" - layout="topleft" - name="New Skin"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="skin" /> - </menu_item_call> - <menu_item_call - label="New Hair" - layout="topleft" - name="New Hair"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="hair" /> - </menu_item_call> - <menu_item_call - label="New Eyes" - layout="topleft" - name="New Eyes"> - <menu_item_call.on_click - function="Inventory.DoCreate" - parameter="eyes" /> - </menu_item_call> - </menu> - </menu> - <menu - height="49" - label="Sort" - layout="topleft" - left="0" - mouse_opaque="false" - name="Sort" - tear_off="true" - top="-113" - width="118"> - <menu_item_check - control_name="Inventory.SortByName" - label="By Name" - layout="topleft" - name="By Name"> - <menu_item_check.on_click - function="Inventory.SetSortBy" - parameter="name" /> - </menu_item_check> - <menu_item_check - control_name="Inventory.SortByDate" - label="By Date" - layout="topleft" - name="By Date"> - <menu_item_check.on_click - function="Inventory.SetSortBy" - parameter="date" /> - </menu_item_check> - <menu_item_separator - layout="topleft" /> - <menu_item_check - control_name="Inventory.FoldersAlwaysByName" - label="Folders Always By Name" - layout="topleft" - name="Folders Always By Name"> - <menu_item_check.on_click - function="Inventory.SetSortBy" - parameter="foldersalwaysbyname" /> - </menu_item_check> - <menu_item_check - control_name="Inventory.SystemFoldersToTop" - label="System Folders To Top" - layout="topleft" - name="System Folders To Top"> - <menu_item_check.on_click - function="Inventory.SetSortBy" - parameter="systemfolderstotop" /> - </menu_item_check> - </menu> - </menu_bar> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="400" + label="Things" + layout="topleft" + min_height="350" + min_width="240" + name="main inventory panel" + width="330"> + <panel.string + name="Title"> + Things + </panel.string> + <filter_editor + text_pad_left="12" + follows="left|top|right" + font="SanSerif" + height="20" + label="Filter" + layout="topleft" + left="15" + name="inventory search editor" + top="34" + width="300" /> + <tab_container + follows="left|top|right|bottom" + height="300" + layout="topleft" + left_delta="-4" + name="inventory filter tabs" + tab_position="top" + top_pad="4" + width="305"> + <inventory_panel + follows="left|top|right|bottom" + height="295" + label="All Items" + layout="topleft" + left="1" + name="All Items" + top="16" + width="290" /> + <inventory_panel + follows="left|top|right|bottom" + height="295" + label="Recent Items" + layout="topleft" + left_delta="0" + name="Recent Items" + top_delta="0" + width="290" /> + </tab_container> + <menu_bar + bg_visible="false" + follows="left|top|right" + height="18" + layout="topleft" + left_delta="0" + mouse_opaque="false" + name="Inventory Menu" + top_delta="-45" + width="290"> + <menu + height="101" + label="File" + layout="topleft" + left="0" + mouse_opaque="false" + name="File" + tear_off="true" + top="-117" + width="128"> + <menu_item_call + label="Open" + layout="topleft" + name="Open"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="open" /> + </menu_item_call> + <menu + create_jump_keys="true" + label="Upload" + layout="topleft" + name="upload" + tear_off="true"> + <menu_item_call + label="Image (L$[COST])..." + layout="topleft" + name="Upload Image" + shortcut="control|U"> + <menu_item_call.on_click + function="File.UploadImage" + parameter="" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + </menu_item_call> + <menu_item_call + label="Sound (L$[COST])..." + layout="topleft" + name="Upload Sound"> + <menu_item_call.on_click + function="File.UploadSound" + parameter="" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + </menu_item_call> + <menu_item_call + label="Animation (L$[COST])..." + layout="topleft" + name="Upload Animation"> + <menu_item_call.on_click + function="File.UploadAnim" + parameter="" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + </menu_item_call> + <menu_item_call + label="Bulk (L$[COST] per file)..." + layout="topleft" + name="Bulk Upload"> + <menu_item_call.on_click + function="File.UploadBulk" + parameter="" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + </menu> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="New Window" + layout="topleft" + name="New Window"> + <menu_item_call.on_click + function="Inventory.NewWindow" /> + </menu_item_call> + <menu_item_separator + layout="topleft" + name="separator2" /> + <menu_item_call + label="Show Filters" + layout="topleft" + name="Show Filters"> + <menu_item_call.on_click + function="Inventory.ShowFilters" /> + </menu_item_call> + <menu_item_call + label="Reset Filters" + layout="topleft" + name="Reset Current"> + <menu_item_call.on_click + function="Inventory.ResetFilter" /> + </menu_item_call> + <menu_item_call + label="Close All Folders" + layout="topleft" + name="Close All Folders"> + <menu_item_call.on_click + function="Inventory.CloseAllFolders" /> + </menu_item_call> + <menu_item_separator + layout="topleft" + name="separator3" /> + <menu_item_call + label="Empty Trash" + layout="topleft" + name="Empty Trash"> + <menu_item_call.on_click + function="Inventory.EmptyTrash" /> + </menu_item_call> + <menu_item_call + label="Empty Lost And Found" + layout="topleft" + name="Empty Lost And Found"> + <menu_item_call.on_click + function="Inventory.EmptyLostAndFound" /> + </menu_item_call> + </menu> + <menu + height="121" + label="Create" + layout="topleft" + left="0" + mouse_opaque="false" + name="Create" + tear_off="true" + top="-201" + width="121"> + <menu_item_call + label="New Folder" + layout="topleft" + name="New Folder"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="category" /> + </menu_item_call> + <menu_item_call + label="New Script" + layout="topleft" + name="New Script"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="lsl" /> + </menu_item_call> + <menu_item_call + label="New Note" + layout="topleft" + name="New Note"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="notecard" /> + </menu_item_call> + <menu_item_call + label="New Gesture" + layout="topleft" + name="New Gesture"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="gesture" /> + </menu_item_call> + <menu + height="175" + label="New Clothes" + layout="topleft" + left_delta="0" + mouse_opaque="false" + name="New Clothes" + top_pad="514" + width="125"> + <menu_item_call + label="New Shirt" + layout="topleft" + name="New Shirt"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="shirt" /> + </menu_item_call> + <menu_item_call + label="New Pants" + layout="topleft" + name="New Pants"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="pants" /> + </menu_item_call> + <menu_item_call + label="New Shoes" + layout="topleft" + name="New Shoes"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="shoes" /> + </menu_item_call> + <menu_item_call + label="New Socks" + layout="topleft" + name="New Socks"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="socks" /> + </menu_item_call> + <menu_item_call + label="New Jacket" + layout="topleft" + name="New Jacket"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="jacket" /> + </menu_item_call> + <menu_item_call + label="New Skirt" + layout="topleft" + name="New Skirt"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="skirt" /> + </menu_item_call> + <menu_item_call + label="New Gloves" + layout="topleft" + name="New Gloves"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="gloves" /> + </menu_item_call> + <menu_item_call + label="New Undershirt" + layout="topleft" + name="New Undershirt"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="undershirt" /> + </menu_item_call> + <menu_item_call + label="New Underpants" + layout="topleft" + name="New Underpants"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="underpants" /> + </menu_item_call> + <menu_item_call + label="New Alpha" + layout="topleft" + name="New Alpha"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="alpha" /> + </menu_item_call> + <menu_item_call + label="New Tattoo" + layout="topleft" + name="New Tattoo"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="tattoo" /> + </menu_item_call> + </menu> + <menu + height="85" + label="New Body Parts" + layout="topleft" + left_delta="0" + mouse_opaque="false" + name="New Body Parts" + top_pad="514" + width="118"> + <menu_item_call + label="New Shape" + layout="topleft" + name="New Shape"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="shape" /> + </menu_item_call> + <menu_item_call + label="New Skin" + layout="topleft" + name="New Skin"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="skin" /> + </menu_item_call> + <menu_item_call + label="New Hair" + layout="topleft" + name="New Hair"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="hair" /> + </menu_item_call> + <menu_item_call + label="New Eyes" + layout="topleft" + name="New Eyes"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="eyes" /> + </menu_item_call> + </menu> + </menu> + <menu + height="49" + label="Sort" + layout="topleft" + left="0" + mouse_opaque="false" + name="Sort" + tear_off="true" + top="-113" + width="118"> + <menu_item_check + control_name="Inventory.SortByName" + label="By Name" + layout="topleft" + name="By Name"> + <menu_item_check.on_click + function="Inventory.SetSortBy" + parameter="name" /> + </menu_item_check> + <menu_item_check + control_name="Inventory.SortByDate" + label="By Date" + layout="topleft" + name="By Date"> + <menu_item_check.on_click + function="Inventory.SetSortBy" + parameter="date" /> + </menu_item_check> + <menu_item_separator + layout="topleft" /> + <menu_item_check + control_name="Inventory.FoldersAlwaysByName" + label="Folders Always By Name" + layout="topleft" + name="Folders Always By Name"> + <menu_item_check.on_click + function="Inventory.SetSortBy" + parameter="foldersalwaysbyname" /> + </menu_item_check> + <menu_item_check + control_name="Inventory.SystemFoldersToTop" + label="System Folders To Top" + layout="topleft" + name="System Folders To Top"> + <menu_item_check.on_click + function="Inventory.SetSortBy" + parameter="systemfolderstotop" /> + </menu_item_check> + </menu> + </menu_bar> +</panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml index 0b4a0e1e24c..fc37bc07b8e 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml @@ -1,122 +1,113 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - background_visible="true" - follows="all" - height="400" - label="Things" - layout="topleft" - min_height="350" - min_width="240" - name="objects panel" - width="333"> - <tab_container - follows="all" - height="390" - layout="topleft" - left="9" - name="Inventory Tabs" - tab_position="top" - top="0" - width="313" - tab_height="0" - visible="true"> + background_visible="true" + follows="all" + height="570" + label="Things" + layout="topleft" + min_height="350" + min_width="240" + name="objects panel" + width="333"> <panel - class="panel_main_inventory" - filename="panel_main_inventory.xml" - follows="all" - layout="topleft" - left="0" - name="panel_main_inventory" - top="15" - label="" - height="330" - width="467"> - <panel - height="25" - layout="bottomright" - left="0" - help_topic="item_button_tab" - name="button_panel" - bottom="0" - width="313"> - <button - enabled="true" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Info" - layout="topleft" - left="0" - name="info_btn" - top="0" - width="60" /> - <button - enabled="true" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Share" - layout="topleft" - left_pad="5" - name="share_btn" - top="0" - width="60" /> - <button - enabled="false" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Wear" - layout="topleft" - left="130" - name="wear_btn" - top="0" - width="60" /> - <button - enabled="false" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Play" - layout="topleft" - name="play_btn" - left="130" - top="0" - width="50" /> - <button - enabled="false" - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Teleport" - layout="topleft" - left="130" - name="teleport_btn" - top="0" - width="77" /> - <button - follows="bottom|right" - font="SansSerifSmallBold" - height="25" - label="v" - layout="topleft" - name="overflow_btn" - right="-10" - top="0" - width="30" /> - </panel> - </panel> - </tab_container> + follows="all" + layout="topleft" + left="0" + name="sidepanel__inventory_panel" + top="0" + label="" + height="570" + visible="true" + width="330"> + <panel + class="panel_main_inventory" + filename="panel_main_inventory.xml" + follows="all" + layout="topleft" + left="0" + name="panel_main_inventory" + top="0" + label="" + height="500" + width="330" /> + <panel + height="25" + layout="bottomright" + help_topic="item_button_tab" + name="button_panel" + left="5" + bottom="5" + width="313"> + <button + enabled="true" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Info" + layout="topleft" + left="0" + name="info_btn" + top="0" + width="60" /> + <button + enabled="true" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Share" + layout="topleft" + left_pad="5" + name="share_btn" + top="0" + width="60" /> + <button + enabled="false" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Wear" + layout="topleft" + left="130" + name="wear_btn" + top="0" + width="60" /> + <button + enabled="false" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Play" + layout="topleft" + name="play_btn" + left="130" + top="0" + width="50" /> + <button + enabled="false" + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Teleport" + layout="topleft" + left="130" + name="teleport_btn" + top="0" + width="77" /> + </panel> + </panel> + + <panel + follows="all" + layout="topleft" + left="0" + class="sidepanel_item_info" + filename="sidepanel_item_info.xml" + name="sidepanel__item_panel" + top="0" + label="" + height="570" + visible="false" + width="330"> + </panel> - <panel - class="sidepanel_item_info" - filename="sidepanel_item_info.xml" - follows="all" - height="360" - layout="topleft" - left="0" - help_topic="item_info_tab" - name="sidepanel_item_info" - top="30" - visible="false" /> </panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index 6a6e22c2e65..faf310d5c9d 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel auto_tile="true" - height="560" + height="570" layout="topleft" name="item properties" help_topic="item_properties" save_rect="true" title="Inventory Item Properties" - width="325"> + width="333"> <panel.string name="unknown"> (unknown) @@ -49,28 +49,15 @@ tab_stop="false" top="0" width="25" /> - - <tab_container - follows="all" - height="450" - layout="topleft" - left="10" - name="tabs" - tab_min_width="70" - tab_height="0" - tab_position="top" - top_pad="10" - width="313"> <panel follows="all" - height="500" + height="450" label="" layout="topleft" - left="0" + left="5" help_topic="people_nearby_tab" name="nearby_panel" - top="0" - border="1" + top="30" width="313"> <text type="string" @@ -487,22 +474,22 @@ Price: L$ </text--> </panel> - </tab_container> + <panel height="25" layout="bottomright" - left="0" - help_topic="places_button_tab" + help_topic="button_tab" name="button_panel" + left="5" bottom="5" - width="325"> + width="313"> <button follows="bottom|left" font="SansSerifSmallBold" height="25" label="Edit" layout="topleft" - left="10" + left="0" name="edit_btn" top="0" width="50" /> @@ -513,7 +500,7 @@ label="Cancel" layout="topleft" name="cancel_btn" - right="-10" + right="-1" top="0" width="70" /> <button -- GitLab From 99b90378069f91e49d2db0a58932545f480bc4f7 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Tue, 3 Nov 2009 20:09:31 -0500 Subject: [PATCH 096/306] EXT-2130 : XUI Cleanup Tab/indent formatting for sidepanel_item_info --HG-- branch : avatar-pipeline --- .../default/xui/en/sidepanel_item_info.xml | 1019 +++++++++-------- 1 file changed, 521 insertions(+), 498 deletions(-) diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index faf310d5c9d..f77fc204f34 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -1,518 +1,541 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - auto_tile="true" - height="570" - layout="topleft" - name="item properties" - help_topic="item_properties" - save_rect="true" - title="Inventory Item Properties" - width="333"> - <panel.string - name="unknown"> + auto_tile="true" + height="570" + layout="topleft" + name="item properties" + help_topic="item_properties" + save_rect="true" + title="Inventory Item Properties" + width="333"> + <panel.string + name="unknown"> (unknown) - </panel.string> - <panel.string - name="public"> + </panel.string> + <panel.string + name="public"> (public) </panel.string> - <panel.string - name="you_can"> + <panel.string + name="you_can"> You can: </panel.string> - <panel.string - name="owner_can"> + <panel.string + name="owner_can"> Owner can: </panel.string> - <panel.string - name="acquiredDate"> + <panel.string + name="acquiredDate"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] - </panel.string> - <icon - follows="top|right" - height="18" - image_name="Lock" - layout="topleft" - right="-50" - mouse_opaque="true" - name="IconLocked" - top="4" - width="18" /> + </panel.string> + <icon + follows="top|right" + height="18" + image_name="Lock" + layout="topleft" + right="-50" + mouse_opaque="true" + name="IconLocked" + top="4" + width="18" /> <button - follows="top|right" - height="25" - image_overlay="BackArrow_Off" - layout="topleft" - name="back_btn" - picture_style="true" - right="-5" - tab_stop="false" - top="0" - width="25" /> - <panel + follows="top|right" + height="25" + image_overlay="BackArrow_Off" + layout="topleft" + name="back_btn" + picture_style="true" + right="-5" + tab_stop="false" + top="0" + width="25" /> + <panel follows="all" - height="450" + height="500" label="" layout="topleft" left="5" - help_topic="people_nearby_tab" - name="nearby_panel" + help_topic="" top="30" + border="1" width="313"> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="5" - name="LabelItemNameTitle" - top="5" - width="78"> - Name: - </text> - <line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="16" - layout="topleft" - left_delta="78" - max_length="63" - name="LabelItemName" - top_delta="0" - width="225" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="5" - name="LabelItemDescTitle" - top_delta="20" - width="78"> - Description: - </text> - <line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="16" - layout="topleft" - left_delta="78" - max_length="127" - name="LabelItemDesc" - top_delta="0" - width="225" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="LabelCreatorTitle" - top="65" - width="78"> - Creator: - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="78" - name="LabelCreatorName" - top_delta="0" - width="200"> - Nicole Linden - </text> - <button - follows="top|right" - font="SansSerifSmall" - height="16" - label="Profile..." - layout="topleft" - left_delta="144" - name="BtnCreator" - top_delta="0" - width="78" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="LabelOwnerTitle" - top="85" - width="78"> - Owner: - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="78" - name="LabelOwnerName" - top_delta="0" - width="200"> - Thrax Linden - </text> - <button - follows="top|right" - font="SansSerifSmall" - height="16" - label="Profile..." - layout="topleft" - left_delta="144" - name="BtnOwner" - top_delta="0" - width="78" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="LabelAcquiredTitle" - top="105" - width="78"> - Acquired: - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="78" - name="LabelAcquiredDate" - top_delta="0" - width="252"> - Wed May 24 12:50:46 2006 - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="OwnerLabel" - top="125" - width="78"> - You: - </text> - <check_box - height="16" - label="Edit" - layout="topleft" - left_pad="5" - name="CheckOwnerModify" - top_delta="0" - width="78" /> - <check_box - height="16" - label="Copy" - layout="topleft" - left_delta="0" - name="CheckOwnerCopy" - top_pad="5" - width="88" /> - <check_box - height="16" - label="Resell" - layout="topleft" - left_delta="0" - name="CheckOwnerTransfer" - top_pad="5" - width="106" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="AnyoneLabel" - top_pad="5" - width="78"> - Anyone: - </text> - <check_box - height="16" - label="Copy" - layout="topleft" - left_pad="5" - name="CheckEveryoneCopy" - top_delta="0" - width="130" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="GroupLabel" - top_pad="5" - width="78"> - Group: - </text> - <check_box - height="16" - label="Share" - layout="topleft" - left_pad="5" - name="CheckShareWithGroup" - top_delta="5" - width="106" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="NextOwnerLabel" - top_pad="5" - width="78"> - Next owner: - </text> - <check_box - height="16" - label="Edit" - layout="topleft" - left_pad="5" - name="CheckNextOwnerModify" - top_delta="0" - width="78" /> - <check_box - height="16" - label="Copy" - layout="topleft" - left_delta="0" - name="CheckNextOwnerCopy" - top_pad="5" - width="88" /> - <check_box - height="16" - label="Resell" - layout="topleft" - left_delta="0" - name="CheckNextOwnerTransfer" - top_pad="5" - width="106" /> - <check_box - height="16" - label="For Sale" - layout="topleft" - left="10" - name="CheckPurchase" - top_pad="5" - width="78" /> - <combo_box - height="19" - left_pad="5" - layout="topleft" - follows="left|top" - name="combobox sale copy" - width="90"> - <combo_box.item - label="Copy" - name="Copy" - value="Copy" /> - <combo_box.item - label="Original" - name="Original" - value="Original" /> - </combo_box> - <spinner - follows="left|top" - decimal_digits="0" - increment="1" - control_name="Edit Cost" - name="Edit Cost" - label="Price: L$" - label_width="60" - left="10" - width="180" - min_val="1" - height="19" - max_val="999999999" - top_pad="5"/> - - <!--line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="16" - layout="topleft" - left_pad="5" - max_length="25" - name="EditPrice" - top_delta="0" - width="242" /--> - - <!--text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="BaseMaskDebug" - top="155" - width="330"> - B: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="60" - name="OwnerMaskDebug" - top_delta="0" - width="270"> - O: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="60" - name="GroupMaskDebug" - top_delta="0" - width="210"> - G: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="60" - name="EveryoneMaskDebug" - top_delta="0" - width="150"> - E: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="60" - name="NextMaskDebug" - top_delta="0" - width="90"> - N: - </text--> - <!--text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="10" - name="SaleLabel" - top_pad="5" - width="330"> - Mark Item: - </text--> - - - <!--radio_group - draw_border="false" - follows="left|top|right" - height="16" - layout="topleft" - left_delta="78" - name="RadioSaleType" - top_delta="0" - width="252"> - <radio_item - height="16" - label="Original" - layout="topleft" - left="0" - name="radio" - top="0" - width="70" /> - <radio_item - height="16" - label="Copy" - layout="topleft" - left_delta="60" - name="radio2" - top_delta="0" - width="70" /> - </radio_group--> - - <!--text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="TextPrice" - top_pad="5" - width="78"> - Price: L$ - </text--> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="5" + name="LabelItemNameTitle" + top="5" + width="78"> + Name: + </text> + <line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="16" + layout="topleft" + left_delta="78" + max_length="63" + name="LabelItemName" + top_delta="0" + width="225" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="5" + name="LabelItemDescTitle" + top_delta="20" + width="78"> + Description: + </text> + <line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="16" + layout="topleft" + left_delta="78" + max_length="127" + name="LabelItemDesc" + top_delta="0" + width="225" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="LabelCreatorTitle" + top="65" + width="78"> + Creator: + </text> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="78" + name="LabelCreatorName" + top_delta="0" + width="200"> + Nicole Linden + </text> + <button + follows="top|right" + font="SansSerifSmall" + height="16" + label="Profile..." + layout="topleft" + left_delta="144" + name="BtnCreator" + top_delta="0" + width="78" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="LabelOwnerTitle" + top="85" + width="78"> + Owner: + </text> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="78" + name="LabelOwnerName" + top_delta="0" + width="200"> + Thrax Linden + </text> + <button + follows="top|right" + font="SansSerifSmall" + height="16" + label="Profile..." + layout="topleft" + left_delta="144" + name="BtnOwner" + top_delta="0" + width="78" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="LabelAcquiredTitle" + top="105" + width="78"> + Acquired: + </text> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left_delta="78" + name="LabelAcquiredDate" + top_delta="0" + width="252"> + Wed May 24 12:50:46 2006 + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="OwnerLabel" + top="125" + width="78"> + You: + </text> + <check_box + height="16" + label="Edit" + layout="topleft" + left_pad="5" + name="CheckOwnerModify" + top_delta="0" + width="78" /> + <check_box + height="16" + label="Copy" + layout="topleft" + left_delta="0" + name="CheckOwnerCopy" + top_pad="5" + width="88" /> + <check_box + height="16" + label="Resell" + layout="topleft" + left_delta="0" + name="CheckOwnerTransfer" + top_pad="5" + width="106" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="AnyoneLabel" + top_pad="5" + width="78"> + Anyone: + </text> + <check_box + height="16" + label="Copy" + layout="topleft" + left_pad="5" + name="CheckEveryoneCopy" + top_delta="0" + width="130" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="GroupLabel" + top_pad="5" + width="78"> + Group: + </text> + <check_box + height="16" + label="Share" + layout="topleft" + left_pad="5" + name="CheckShareWithGroup" + top_delta="5" + width="106" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="NextOwnerLabel" + top_pad="5" + width="78"> + Next owner: + </text> + <check_box + height="16" + label="Edit" + layout="topleft" + left_pad="5" + name="CheckNextOwnerModify" + top_delta="0" + width="78" /> + <check_box + height="16" + label="Copy" + layout="topleft" + left_delta="0" + name="CheckNextOwnerCopy" + top_pad="5" + width="88" /> + <check_box + height="16" + label="Resell" + layout="topleft" + left_delta="0" + name="CheckNextOwnerTransfer" + top_pad="5" + width="106" /> + <check_box + height="16" + label="For Sale" + layout="topleft" + left="10" + name="CheckPurchase" + top_pad="5" + width="78" /> + <combo_box + height="19" + left_pad="5" + layout="topleft" + follows="left|top" + name="combobox sale copy" + width="90"> + <combo_box.item + label="Copy" + name="Copy" + value="Copy" /> + <combo_box.item + label="Original" + name="Original" + value="Original" /> + </combo_box> + <spinner + follows="left|top" + decimal_digits="0" + increment="1" + control_name="Edit Cost" + name="Edit Cost" + label="Price: L$" + label_width="60" + left="10" + width="180" + min_val="1" + height="19" + max_val="999999999" + top_pad="5"/> + <!--line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="16" + layout="topleft" + left_pad="5" + max_length="25" + name="EditPrice" + top_delta="0" + width="242" /--> + <!--text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="BaseMaskDebug" + top="155" + width="330"> + B: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="OwnerMaskDebug" + top_delta="0" + width="270"> + O: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="GroupMaskDebug" + top_delta="0" + width="210"> + G: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="EveryoneMaskDebug" + top_delta="0" + width="150"> + E: + </text> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="60" + name="NextMaskDebug" + top_delta="0" + width="90"> + N: + </text--> + <!--text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="SaleLabel" + top_pad="5" + width="330"> + Mark Item: + </text--> + <!--radio_group + draw_border="false" + follows="left|top|right" + height="16" + layout="topleft" + left_delta="78" + name="RadioSaleType" + top_delta="0" + width="252"> + <radio_item + height="16" + label="Original" + layout="topleft" + left="0" + name="radio" + top="0" + width="70" /> + <radio_item + height="16" + label="Copy" + layout="topleft" + left_delta="60" + name="radio2" + top_delta="0" + width="70" /> + </radio_group--> + <!--text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="TextPrice" + top_pad="5" + width="78"> + Price: L$ + </text--> </panel> - <panel - height="25" - layout="bottomright" - help_topic="button_tab" - name="button_panel" - left="5" - bottom="5" - width="313"> - <button - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Edit" - layout="topleft" - left="0" - name="edit_btn" - top="0" - width="50" /> - <button - follows="bottom|right" - font="SansSerifSmallBold" - height="25" - label="Cancel" - layout="topleft" - name="cancel_btn" - right="-1" - top="0" - width="70" /> - <button - follows="bottom|right" - font="SansSerifSmallBold" - height="25" - label="Save" - layout="topleft" - name="save_btn" - left_pad="-135" - top="0" - width="60" /> - </panel> - + height="25" + layout="bottomright" + help_topic="button_tab" + name="button_panel" + left="5" + bottom="5" + width="313"> + <button + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Edit" + layout="topleft" + left="0" + name="edit_btn" + top="0" + width="50" /> + <button + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Open" + layout="topleft" + left_pad="5" + name="edit_btn" + top="0" + width="60" /> + <button + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Build" + layout="topleft" + left_pad="5" + name="edit_btn" + top="0" + width="60" /> + <button + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Buy" + layout="topleft" + left_pad="5" + name="edit_btn" + top="0" + width="60" /> + <button + follows="bottom|right" + font="SansSerifSmallBold" + height="25" + label="Cancel" + layout="topleft" + name="cancel_btn" + right="-1" + top="0" + width="70" /> + <button + follows="bottom|right" + font="SansSerifSmallBold" + height="25" + label="Save" + layout="topleft" + name="save_btn" + left_pad="-135" + top="0" + width="60" /> + </panel> </panel> -- GitLab From ce3dfcee3bec1ad782128ea891e21130911c9984 Mon Sep 17 00:00:00 2001 From: Erica <erica@lindenlab.com> Date: Tue, 3 Nov 2009 17:35:07 -0800 Subject: [PATCH 097/306] EXT-2062 UI of Notice accordion in the Group Profile panel is corrupted, EXT-1528 Widen groups content to match new sidebar width --- .../default/xui/en/panel_group_general.xml | 6 +- .../xui/en/panel_group_info_sidetray.xml | 139 +++-- .../default/xui/en/panel_group_land_money.xml | 207 +++---- .../default/xui/en/panel_group_notices.xml | 243 ++++----- .../default/xui/en/panel_group_roles.xml | 503 ++++++------------ 5 files changed, 468 insertions(+), 630 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index a85c55f9b2c..4f24c7a745b 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -1,14 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel follows="all" - height="412" + height="380" label="General" class="panel_group_general" layout="topleft" left="0" top="0" name="general_tab" - width="313"> + width="303"> <panel.string name="help_text"> The General tab contains general information about this group, a list of members, general Group Preferences and member options. @@ -41,7 +41,7 @@ Hover your mouse over the options for more help. draw_heading="true" follows="left|top" heading_height="16" - height="160" + height="130" layout="topleft" left_delta="0" name="visible_members" diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index d8d47c40084..63e8ffcb1ee 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -5,7 +5,7 @@ background_visible="true" height="570" label="Group Info" layout="topleft" - min_height="350" + min_height="425" left="0" top="20" name="GroupInfo" @@ -60,7 +60,7 @@ background_visible="true" top_delta="5" width="250" height="20" - visible="true" /> + visible="false" /> <texture_picker follows="left|top" height="113" @@ -112,33 +112,46 @@ background_visible="true" left_delta="0" top_pad="6" height="23" - label="Join now!" - label_selected="Join now!" + label="JOIN NOW!" name="btn_join" visible="true" width="120" /> <accordion follows="all" - height="405" + height="425" layout="topleft" left="0" + multiple_expansion="false" name="groups_accordion" - top_pad="20" - width="333"> + top_pad="15" + width="336"> <accordion_tab can_resize="false" + expanded="true" layout="topleft" name="tab_general" title="General"> - <panel - border="false" - filename="panel_group_general.xml" + <scroll_container + color="DkGray2" + opaque="true" + height="323" + follows="all" layout="topleft" left="0" - help_topic="group_general_tab" - name="general_tab" top="0" - width="333" /> + name="general_scroll" + reserve_scroll_corner="false" + width="333"> + <panel + border="false" + filename="panel_group_general.xml" + layout="topleft" + left="0" + help_topic="group_general_tab" + name="general_tab" + top="0" + width="303" /> + </scroll_container> </accordion_tab> <accordion_tab can_resize="false" @@ -146,15 +159,27 @@ background_visible="true" layout="topleft" name="tab_roles" title="Roles"> - <panel - border="false" - filename="panel_group_roles.xml" - layout="topleft" - left="0" - help_topic="group_roles_tab" - name="roles_tab" - top="0" - width="333" /> + <scroll_container + color="DkGray2" + opaque="true" + height="323" + follows="all" + layout="topleft" + left="0" + top="0" + name="roles_scroll" + reserve_scroll_corner="false" + width="333"> + <panel + border="false" + filename="panel_group_roles.xml" + layout="topleft" + left="0" + help_topic="group_roles_tab" + name="roles_tab" + top="0" + width="303" /> + </scroll_container> </accordion_tab> <accordion_tab can_resize="false" @@ -162,21 +187,45 @@ background_visible="true" layout="topleft" name="tab_notices" title="Notices"> + <scroll_container + color="DkGray2" + opaque="true" + height="323" + follows="all" + layout="topleft" + left="0" + top="0" + name="notices_scroll" + reserve_scroll_corner="false" + width="333"> <panel + border="false" filename="panel_group_notices.xml" layout="topleft" left="0" help_topic="group_notices_tab" name="notices_tab" top="0" - width="333" /> + width="303" /> + </scroll_container> </accordion_tab> - <accordion_tab + <accordion_tab can_resize="false" expanded="false" layout="topleft" name="tab_notices" title="Land/Assets"> + <scroll_container + color="DkGray2" + opaque="true" + height="323" + follows="all" + layout="topleft" + left="0" + top="0" + name="land_scroll" + reserve_scroll_corner="false" + width="333"> <panel border="false" filename="panel_group_land_money.xml" @@ -185,41 +234,43 @@ background_visible="true" help_topic="group_land_money_tab" name="land_money_tab" top="0" - width="333" /> + width="313" /> + </scroll_container> </accordion_tab> </accordion> - <button + <button follows="top|left" - height="20" + height="22" image_overlay="Refresh_Off" layout="topleft" + left="5" name="btn_refresh" picture_style="true" - left="5" - width="20" /> - <button - height="20" - font="SansSerifSmall" - label="Save" - label_selected="Save" - name="btn_apply" - left_pad="5" - width="65" /> - <button + top_pad="-15" + width="23" /> + <button height="20" label="Create" - label_selected="Create" + label_selected="New group" name="btn_create" - left_pad="5" + left_pad="10" visible="false" - width="65" /> - <button - left_pad="5" + width="100" /> + <!-- <button + left_pad="10" height="20" label="Cancel" label_selected="Cancel" name="btn_cancel" visible="false" + width="65" />--> + <button + height="20" + font="SansSerifSmall" + label="Save" + label_selected="Save" + name="btn_apply" + left_pad="10" + right="-10" width="65" /> - </panel> \ No newline at end of file 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 c81c7113ae2..99fc39c466a 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 @@ -1,25 +1,25 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - border="true" + border="false" follows="all" height="510" label="Land & L$" layout="topleft" left="1" name="land_money_tab" - top="490" - width="280"> + top="0" + width="313"> <panel.string name="help_text"> - Parcels owned by the group are listed along with contribution details. A warning appears until the Total Land in Use is less than or equal to the Total Contribution. The Planning, Details, and Sales tabs provide information about the group's finances. + Parcels owned by a group are listed along with contribution details. A warning appears until the Total Land in Use is less than or = to the Total Contribution. </panel.string> <panel.string name="cant_view_group_land_text"> - You do not have permission to view group owned land. + You don't have permission to view group owned land </panel.string> <panel.string name="cant_view_group_accounting_text"> - You do not have permission to view the group's accounting information. + You don't have permission to view the group's accounting information. </panel.string> <panel.string name="loading_txt"> @@ -27,7 +27,7 @@ </panel.string> <panel.string name="land_contrib_error"> - Unable to set your land contribution. + Unable to set your land contribution </panel.string> <!-- <text type="string" @@ -44,29 +44,29 @@ <scroll_list draw_heading="true" follows="top" - heading_height="14" - height="100" + heading_height="20" + height="150" layout="topleft" - left="5" + left="0" name="group_parcel_list" - top_pad="10" - width="265"> + top_pad="0" + width="313"> <scroll_list.columns label="Parcel" name="name" - width="67" /> + width="78" /> <scroll_list.columns label="Region" name="location" - width="72" /> + width="78" /> <scroll_list.columns label="Type" name="type" - width="60" /> + width="70" /> <scroll_list.columns label="Area" name="area" - width="20" /> + width="50" /> <scroll_list.columns label="" name="hidden" @@ -74,14 +74,14 @@ </scroll_list> <button follows="top" - height="20" + height="23" label="Map" label_selected="Map" layout="topleft" - left="150" name="map_button" - top_pad="10" - width="125" + right="-10" + top_pad="5" + width="95" enabled="false" /> <text type="string" @@ -91,11 +91,12 @@ layout="topleft" left="5" name="total_contributed_land_label" - top_pad="10" + top_pad="0" width="130"> Total Contribution: </text> <text + text_color="EmphasisColor" type="string" follows="left|top" height="16" @@ -119,6 +120,7 @@ Total Land In Use: </text> <text + text_color="EmphasisColor" type="string" follows="left|top" height="16" @@ -142,6 +144,7 @@ Land Available: </text> <text + text_color="EmphasisColor" type="string" follows="left|top" height="16" @@ -168,19 +171,19 @@ border_style="line" border_thickness="1" follows="left|top" - height="16" + height="19" layout="topleft" left_pad="5" max_length="10" name="your_contribution_line_editor" - top_delta="-2" + top_delta="0" width="95" /> <text type="string" follows="left|top" height="16" layout="topleft" - left_pad="5" + left_pad="3" name="your_contribution_units" top_delta="2"> m² @@ -193,13 +196,13 @@ layout="topleft" left="140" name="your_contribution_max_value" - top_pad="0" + top_pad="2" width="95"> ([AMOUNT] max) </text> <icon height="16" - image_name="smicon_warn.tga" + image_name="notify_next" layout="topleft" left="9" name="group_over_limit_icon" @@ -211,14 +214,14 @@ type="string" word_wrap="true" font="SansSerifSmall" - height="40" + height="35" layout="topleft" - left_pad="5" + left_pad="0" name="group_over_limit_text" - text_color="GroupOverTierColor" + text_color="EmphasisColor" top_delta="0" - width="250"> - Group members must contribute more land credits to support land in use. + width="290"> + Group members must contribute more land credits to support land in use </text> <text type="string" @@ -242,128 +245,126 @@ name="group_money_tab_container" tab_position="top" tab_height="20" - top_pad="10" - width="265"> + top_pad="2" + tab_min_width="70" + width="300"> <panel - border="true" + border="false" follows="all" height="180" - label="Planning" + label="PLANNING" layout="topleft" - left="1" + left="0" help_topic="group_money_planning_tab" name="group_money_planning_tab" top="5" - width="265"> + width="300"> <text_editor type="string" - bg_readonly_color="0.784314 0.819608 0.8 1" follows="all" - font="Monospace" - height="168" + font="SansSerif" + height="140" layout="topleft" - left="8" + left="0" max_length="4096" name="group_money_planning_text" - top="5" - width="250" + top="0" + width="300" word_wrap="true"> - Computing... + Loading... </text_editor> </panel> <panel - border="true" - follows="left|top|right|bottom" + border="false" + follows="all" height="180" - label="Details" + label="DETAILS" layout="topleft" - left_delta="0" + left="0" help_topic="group_money_details_tab" name="group_money_details_tab" - top_delta="0" - width="265"> + top="5" + width="300"> <text_editor type="string" - bg_readonly_color="0.784314 0.819608 0.8 1" follows="all" - font="Monospace" height="140" layout="topleft" - left="8" + left="0" max_length="4096" name="group_money_details_text" - top="7" - width="250" + top="0" + width="300" word_wrap="true"> - Computing... + Loading... </text_editor> - <button - height="20" - label="< Earlier" - label_selected="< Earlier" - layout="topleft" - left="5" - name="earlier_details_button" - tool_tip="Go back in time" - top_pad="10" - width="125" /> <button - height="20" - label="Later >" - label_selected="Later >" - layout="topleft" - left_pad="5" + follows="left|top" + height="23" + image_overlay="Arrow_Left_Off" + layout="topleft" + name="earlier_details_button" + picture_style="true" + tool_tip="Back" + top_pad="3" + right="-35" + width="31" /> + <button + follows="left|top" + height="23" + image_overlay="Arrow_Right_Off" + layout="topleft" + left_pad="10" name="later_details_button" - tool_tip="Go forward in time" - top_delta="0" - width="125" /> + picture_style="true" + tool_tip="Next" + width="31" /> </panel> <panel - border="true" - follows="left|top|right|bottom" + border="false" + follows="all" height="180" - label="Sales" + label="SALES" layout="topleft" left_delta="0" help_topic="group_money_sales_tab" name="group_money_sales_tab" top_delta="-1" - width="265"> + width="300"> <text_editor type="string" - bg_readonly_color="0.784314 0.819608 0.8 1" follows="all" - font="Monospace" height="140" layout="topleft" - left="8" + left="0" max_length="4096" name="group_money_sales_text" - top="7" - width="250" + top="0" + width="300" word_wrap="true"> - Computing... + Loading... </text_editor> - <button - height="20" - label="< Earlier" - label_selected="< Earlier" - layout="topleft" - left="5" - name="earlier_sales_button" - tool_tip="Go back in time" - top_pad="10" - width="125" /> - <button - height="20" - label="Later >" - label_selected="Later >" - layout="topleft" - left_pad="5" + <button + follows="left|top" + height="23" + image_overlay="Arrow_Left_Off" + layout="topleft" + name="earlier_sales_button" + picture_style="true" + tool_tip="Back" + top_pad="3" + right="-35" + width="31" /> + <button + follows="left|top" + height="23" + image_overlay="Arrow_Right_Off" + layout="topleft" + left_pad="10" name="later_sales_button" - tool_tip="Go forward in time" - top_delta="0" - width="125" /> + picture_style="true" + tool_tip="Next" + width="31" /> </panel> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 0e4d490369a..bfb49a60c25 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -1,14 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - border="true" follows="all" height="485" label="Notices" layout="topleft" - left="1" + left="0" name="notices_tab" - top="485" - width="280"> + top="0" + width="313"> <panel.string name="help_text"> Notices are a quick way to communicate across a @@ -20,60 +19,48 @@ the General tab. </panel.string> <panel.string name="no_notices_text"> - There are no past notices. + There are no past notices </panel.string> - <!--<text - follows="left|top" - type="string" - font="SansSerifBig" - height="16" - layout="topleft" - left="10" - name="lbl" - top_pad="10" - width="269"> - Group Notices Archive - </text> --> <text follows="left|top" type="string" word_wrap="true" - height="40" + height="30" layout="topleft" - left_delta="10" + left="10" name="lbl2" - text_color="EmphasisColor" - top_pad="10" - width="270"> - Notices are kept for 14 days. Notice lists are limited to 200 notices per group on a daily basis. + top="5" + width="300"> + Notices are kept for 14 days +Groups are limited to 200 notices/group daily </text> <scroll_list follows="left|top" column_padding="0" draw_heading="true" - heading_height="14" - height="109" + heading_height="16" + height="125" layout="topleft" - left_delta="0" + left="0" name="notice_list" top_pad="0" - width="265"> + width="303"> <scroll_list.columns label="" name="icon" - width="16" /> + width="20" /> <scroll_list.columns label="Subject" name="subject" - width="100" /> + width="125" /> <scroll_list.columns label="From" name="from" - width="83" /> + width="90" /> <scroll_list.columns label="Date" name="date" - width="50" /> + width="30" /> <scroll_list.columns name="sort" width="-1" /> @@ -84,39 +71,42 @@ the General tab. layout="topleft" name="notice_list_none_found" visible="false"> - None found. + None found </text> - <button - follows="left|top" - height="20" - font="SansSerifSmall" - label="New Notice" - label_selected="Create New Notice" - layout="topleft" - left_delta="0" - name="create_new_notice" - top_delta="4" - width="125" /> - <button - follows="left|top" - height="20" - font="SansSerifSmall" - label="Refresh" - label_selected="Refresh List" + <button + follows="bottom|left" + height="18" + image_selected="AddItem_Press" + image_unselected="AddItem_Off" + image_disabled="AddItem_Disabled" + layout="topleft" + label="Create a new notice" + left="15" + name="create_new_notice" + picture_style="true" + tool_tip="Create a new notice" + top_delta="-5" + width="18" /> + <button + follows="top|left" + height="22" + image_overlay="Refresh_Off" layout="topleft" - left_pad="12" name="refresh_notices" - top_delta="0" - width="125" /> + picture_style="true" + right="-5" + top_delta="5" + width="23" /> <panel follows="left|top" - height="268" + height="300" label="Create New Notice" layout="topleft" left="0" - name="panel_create_new_notice" top_pad="10" - width="265"> + visible="false" + name="panel_create_new_notice" + width="303"> <text follows="left|top" type="string" @@ -127,30 +117,16 @@ the General tab. mouse_opaque="false" name="lbl" text_color="EmphasisColor" - top_pad="0" - width="265"> + top="0" + width="200"> Create a Notice </text> - <text - follows="left|top" - type="string" - word_wrap="true" - height="90" - layout="topleft" - left_delta="0" - name="lbl2" - text_color="EmphasisColor" - top_pad="4" - width="195"> - You can add a single item to a notice by dragging it from your inventory to this panel. Attached items must be copiable and transferrable, and you can't send a folder. - </text> <text follows="left|top" type="string" halign="left" height="16" layout="topleft" - left_delta="0" name="lbl3" top_pad="10" width="60"> @@ -164,8 +140,7 @@ the General tab. left_pad="3" max_length="63" name="create_subject" - top_delta="-1" - width="200" /> + width="220" /> <text follows="left|top" type="string" @@ -174,106 +149,100 @@ the General tab. layout="topleft" left="10" name="lbl4" - top_pad="10" + top_pad="5" width="60"> Message: </text> <text_editor - height="75" + height="90" layout="topleft" left_pad="3" max_length="511" name="create_message" top_delta="0" - width="200" + width="220" word_wrap="true" /> <text follows="left|top" type="string" halign="left" - height="16" + height="14" layout="topleft" left="10" name="lbl5" - top_pad="10" - width="60"> + width="200"> Attach: </text> <line_editor enabled="false" - height="16" + height="19" layout="topleft" - left_pad="3" - max_length="63" + max_length="90" mouse_opaque="false" name="create_inventory_name" - top_delta="0" - width="200" /> + top_pad="2" + width="285" /> + <text + text_color="EmphasisColor" + follows="left|top" + type="string" + halign="right" + height="34" + layout="topleft" + left="10" + name="string" + top_pad="15" + word_wrap="true" + width="150"> + Drag here to attach something -- > + </text> <icon - height="16" + height="72" + image_name="DropTarget" layout="topleft" - left_delta="0" - name="create_inv_icon" - top_delta="0" - width="16" /> + left_pad="10" + mouse_opaque="true" + name="drop_icon" + top_delta="-10" + width="72" /> <button follows="left|top" - height="20" - font="SansSerifSmall" - label="Remove Attachment" - label_selected="Remove Attachment" + height="23" + label="Remove" layout="topleft" - left="10" + left="70" name="remove_attachment" - top_pad="10" - width="135" /> + top_delta="45" + width="90" /> <button follows="left|top" - height="20" - font="SansSerifSmall" + height="23" label="Send" label_selected="Send Notice" layout="topleft" - left_delta="138" + right="-10" + top_pad="20" name="send_notice" - top_delta="0" - width="125" /> - <panel - bevel_style="in" - border="true" - height="71" - layout="topleft" - left="200" - name="drop_target2" - top="20" - width="71" /> - <icon - height="59" - image_name="icon_groupnoticeinventory.tga" - layout="topleft" - left_delta="6" - mouse_opaque="true" - name="drop_icon" - top="26" - width="59" /> - <group_drop_target + width="100" /> + <group_drop_target height="466" - layout="topleft" + top="0" left="0" + layout="topleft" name="drop_target" tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." - top="-198" - width="280" /> + width="295" /> </panel> <panel follows="left|top" - height="268" + height="300" label="View Past Notice" layout="topleft" left="0" + visible="true" name="panel_view_past_notice" - top="197" - width="265"> + top="180" + width="303"> <text type="string" font="SansSerifBig" @@ -294,9 +263,9 @@ the General tab. layout="topleft" left_delta="0" name="lbl2" - top_pad="4" + top_pad="2" width="265"> - To send a new notice, click the 'New Notice' button above. + To send a new notice, click the + button </text> <text type="string" @@ -305,7 +274,7 @@ the General tab. layout="topleft" left_delta="0" name="lbl3" - top_pad="24" + top_pad="15" visible="false" width="60"> Subject: @@ -336,13 +305,13 @@ the General tab. </text> <text_editor enabled="false" - height="150" + height="205" layout="topleft" left="10" max_length="511" name="view_message" top_delta="-35" - width="260" + width="285" word_wrap="true" /> <line_editor enabled="false" @@ -353,7 +322,7 @@ the General tab. mouse_opaque="false" name="view_inventory_name" top_pad="10" - width="260" /> + width="285" /> <icon height="16" layout="topleft" @@ -363,14 +332,12 @@ the General tab. width="16" /> <button follows="left|top" - height="20" - font="SansSerifSmall" - label="Open Attachment" - label_selected="Open Attachment" + height="23" + label="Open attachment" layout="topleft" - left_delta="0" + right="-10" name="open_attachment" - top_pad="10" + top_pad="5" width="135" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index e87859f788a..5ed464bcec8 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel border="false" - height="412" + height="552" label="Members & Roles" layout="topleft" left="0" @@ -18,158 +18,28 @@ </panel.string> <panel.string name="help_text" /> - <!--<panel - follows="left|top" - height="80" - layout="topleft" - left="10" - name="members_header" - top_pad="10" - width="270"> - <text - type="string" - font="SansSerifBig" - height="16" - layout="topleft" - left="0" - name="static" - top="0" - width="270"> - Members & Roles - </text> - <text - type="string" - word_wrap="true" - height="40" - layout="topleft" - left_delta="0" - name="static2" - top_pad="4" - width="270"> - Group Members are assigned Roles with Abilities. These settings can easily be customized, allowing for greater organization and flexibility. - </text> - </panel> - <panel - follows="left|top" - height="24" - layout="topleft" - left_delta="0" - name="roles_header" - top_delta="0" - visible="false" - width="270"> - <text - type="string" - font="SansSerifBig" - height="16" - layout="topleft" - left="0" - name="static" - top="0" - width="270"> - Roles - </text> - <text - type="string" - word_wrap="true" - height="40" - layout="topleft" - left_delta="0" - name="role_properties_modifiable" - top_pad="4" - visible="false" - width="270"> - Select a Role below. You can modify its Name, Description and Member Title. - </text> - <text - type="string" - word_wrap="true" - height="40" - layout="topleft" - left_delta="0" - name="role_properties_not_modifiable" - top_delta="0" - width="270"> - Select a Role below to see its properties, Members and allowed Abilities. - </text> - <text - type="string" - word_wrap="true" - height="16" - layout="topleft" - left_delta="0" - name="role_actions_modifiable" - top_delta="24" - visible="false" - width="270"> - You can also assign Abilities to the Role. - </text> - <text - type="string" - word_wrap="true" - height="16" - layout="topleft" - left_delta="0" - name="role_actions_not_modifiable" - top_delta="0" - width="270"> - You may view, but not modify, assigned Abilities. - </text> - </panel> - <panel - follows="left|top" - height="24" - layout="topleft" - left_delta="0" - name="actions_header" - top_delta="0" - visible="false" - width="270"> - <text - type="string" - font="SansSerifBig" - height="16" - layout="topleft" - left="0" - name="static" - top="0" - width="270"> - Abilities - </text> - <text - type="string" - word_wrap="true" - height="40" - layout="topleft" - left_delta="0" - name="static2" - top_pad="4" - width="270"> - You can view an Ability's Description and which Roles and Members can execute the Ability. - </text> - </panel> --> <tab_container - border="true" + border="false" follows="left|top" - height="260" + height="245" halign="center" layout="topleft" left="5" name="roles_tab_container" tab_position="top" tab_height="20" - top="0" + tab_min_width="96" + top="3" width="303"> <panel border="false" - height="260" - label="Members" + height="220" + label="MEMBERS" layout="topleft" - left="1" + left="0" help_topic="roles_members_tab" name="members_sub_tab" tool_tip="Members" - top="17" class="panel_group_members_subtab" width="300"> <panel.string @@ -187,8 +57,7 @@ clicking on their names. follows="left|top|right" max_length="250" label="Filter Members" - name="filter_input" - font="SansSerif" /> + name="filter_input" /> <!-- <button enabled="false" font="SansSerifSmall" @@ -229,6 +98,7 @@ clicking on their names. font="SansSerifSmall" label="Invite" layout="topleft" + left="5" name="member_invite" top_pad="3" width="100" /> @@ -238,8 +108,10 @@ clicking on their names. label="Eject" layout="topleft" left_pad="5" + right="-5" name="member_eject" width="100" /> + <!--What is this?--> <icon height="16" image_name="Inv_FolderClosed" @@ -250,15 +122,14 @@ clicking on their names. </panel> <panel border="false" - height="164" - label="Roles" + height="220" + label="ROLES" layout="topleft" - left_delta="0" + left="0" help_topic="roles_roles_tab" name="roles_sub_tab" class="panel_group_roles_subtab" - top="17" - width="265"> + width="300"> <panel.string name="help_text"> Roles have a title and an allowed list of Abilities @@ -282,40 +153,19 @@ including the Everyone and Owner Roles. name="power_partial_icon"> checkbox_enabled_false.tga </panel.string> - <filter_editor - layout="topleft" - top="10" - left="4" - width="260" - height="20" - follows="left|top|right" - max_length="250" - label="Filter Roles" - name="filter_input" - font="SansSerif" /> - <!--<line_editor - border_style="line" - border_thickness="1" - follows="left|top" - height="16" - layout="topleft" - left="4" - max_length="63" - name="search_text" - top="10" - width="90" /> - <button - font="SansSerifSmall" - height="20" - label="Search" - layout="topleft" - left_pad="5" - name="search_button" - top_delta="-2" - width="80" /> + <filter_editor + layout="topleft" + top="10" + left="4" + width="280" + height="20" + follows="left|top|right" + max_length="250" + label="Filter Roles" + name="filter_input" /> + <!-- <button enabled="false" - font="SansSerifSmall" height="20" label="Show All" layout="topleft" @@ -326,11 +176,13 @@ including the Everyone and Owner Roles. <scroll_list column_padding="0" draw_heading="true" + draw_stripes="false" follows="left|top" heading_height="20" height="150" layout="topleft" - left="4" + search_column="1" + left="0" name="role_list" top_pad="4" width="300"> @@ -352,7 +204,7 @@ including the Everyone and Owner Roles. font="SansSerifSmall" label="Add Role" layout="topleft" - left_delta="0" + left="5" name="role_create" top_pad="6" width="125" /> @@ -362,20 +214,20 @@ including the Everyone and Owner Roles. label="Delete Role" layout="topleft" left_pad="5" + right="-5" name="role_delete" top_delta="0" width="125" /> </panel> <panel border="false" - height="164" - label="Abilities" + height="220" + label="ABILITIES" layout="topleft" - left_delta="0" + left="0" help_topic="roles_actions_tab" name="actions_sub_tab" class="panel_group_actions_subtab" - top="17" tool_tip="You can view an Ability's Description and which Roles and Members can execute the Ability." width="300"> <panel.string @@ -383,37 +235,17 @@ including the Everyone and Owner Roles. Abilities allow Members in Roles to do specific things in this group. There's a broad variety of Abilities. </panel.string> - <filter_editor - layout="topleft" - top="10" - left="4" - width="255" - height="20" - follows="left|top|right" - max_length="250" - label="Filter Abilities" - name="filter_input" - font="SansSerif" /> - <!--<line_editor - border_style="line" - border_thickness="1" - follows="left|top" - height="16" - layout="topleft" - left="4" - max_length="63" - name="search_text" - top="10" - width="90" /> - <button - font="SansSerifSmall" - height="20" - label="Search" - layout="topleft" - left_pad="5" - name="search_button" - top_delta="-2" - width="80" /> + <filter_editor + layout="topleft" + top="10" + left="4" + width="280" + height="20" + follows="left|top|right" + max_length="250" + label="Filter Abilities" + name="filter_input" /> + <!-- <button enabled="false" font="SansSerifSmall" @@ -428,19 +260,19 @@ things in this group. There's a broad variety of Abilities. column_padding="0" draw_stripes="false" follows="left|top" - height="100" + height="160" layout="topleft" - left="6" + left="0" multi_select="true" name="action_list" search_column="1" tool_tip="Select an Ability to view more details" top_pad="6" - width="255"> + width="300"> <scroll_list.columns label="" name="icon" - width="18" /> + width="16" /> <scroll_list.columns label="" name="action" @@ -448,7 +280,7 @@ things in this group. There's a broad variety of Abilities. </scroll_list> <icon height="16" - image_name="inv_folder_plain_closed.tga" + image_name="Inv_FolderClosed" layout="topleft" name="power_folder_icon" visible="false" @@ -456,105 +288,93 @@ things in this group. There's a broad variety of Abilities. </panel> </tab_container> <panel - height="150" + height="252" layout="topleft" follows="left|top" left="10" name="members_footer" - top_pad="2" + top_pad="10" + top_delta="0" width="300"> <text type="string" - font="SansSerif" height="16" layout="topleft" follows="left|top" left="0" name="static" - top_pad="0" - width="100"> + top_pad="5" + width="295"> Assigned Roles </text> - <text - type="string" - font="SansSerif" - height="16" - layout="topleft" - follows="left|top" - left_pad="35" - name="static2" - top_delta="0" - width="100"> - Allowed Abilities - </text> <scroll_list draw_stripes="false" follows="left|top" - height="150" + height="80" layout="topleft" left="0" name="member_assigned_roles" - top_pad="5" - width="130"> + top_pad="0" + width="295"> <scroll_list.columns label="" name="checkbox" - width="18" /> + width="30" /> <scroll_list.columns label="" name="role" - width="107" /> + width="265" /> </scroll_list> - <scroll_list - draw_stripes="false" - height="150" + <text + type="string" + height="16" layout="topleft" follows="left|top" - left_pad="5" + left="0" + name="static2" + top_pad="5" + width="295"> + Allowed Abilities + </text> + <scroll_list + draw_stripes="false" + height="80" + layout="topleft" + left="0" name="member_allowed_actions" + search_column="2" tool_tip="For details of each allowed ability see the abilities tab" - top_delta="0" - width="130"> + top_pad="0" + width="295"> <scroll_list.columns label="" name="icon" - width="14" /> + width="20" /> <scroll_list.columns label="" name="action" - width="126" /> + width="275" /> </scroll_list> </panel> <panel - height="252" + height="297" layout="topleft" - left_delta="0" + left="10" name="roles_footer" top_delta="0" + top="245" visible="false" - width="270"> + width="300"> <text type="string" - font="SansSerif" height="16" layout="topleft" left="0" name="static" top="0" - width="100"> + width="140"> Name </text> - <text - type="string" - font="SansSerif" - height="16" - layout="topleft" - left_pad="35" - name="static2" - top_delta="0" - width="100"> - Description - </text> <line_editor type="string" border_style="line" @@ -563,21 +383,19 @@ things in this group. There's a broad variety of Abilities. height="20" layout="topleft" left="0" - max_length="20" + max_length="295" name="role_name" top_pad="0" - width="130"> + width="295"> Employees </line_editor> <text type="string" - font="SansSerif" height="16" layout="topleft" - left_delta="0" name="static3" - top_pad="10" - width="100"> + top_pad="5" + width="295"> Title </text> <line_editor @@ -587,158 +405,159 @@ things in this group. There's a broad variety of Abilities. follows="left|top" height="20" layout="topleft" - left_delta="0" - max_length="20" + max_length="295" name="role_title" top_pad="0" - width="130"> - (waiting) + width="295"> + (waiting) </line_editor> + <text + type="string" + height="16" + layout="topleft" + left="0" + name="static2" + top_pad="5" + width="100"> + Description + </text> <text_editor type="string" halign="left" - height="48" + height="35" layout="topleft" - left="135" - max_length="254" + left="0" + max_length="295" name="role_description" - top="16" - width="130" + top_pad="0" + width="295" word_wrap="true"> - (waiting) + (waiting) </text_editor> <text type="string" - font="SansSerif" height="16" layout="topleft" + follows="left|top" left="0" - name="static4" - top="85" - width="120"> - Assigned Members - </text> - <text - type="string" - font="SansSerif" - height="16" - layout="topleft" - left_pad="15" - name="static5" - tool_tip="A list of abilities the currently selected role can perform" - top_delta="0" - width="100"> - Allowed Abilities + name="static" + top_pad="5" + width="295"> + Assigned Roles </text> <name_list draw_stripes="false" - height="150" + height="50" layout="topleft" left="0" name="role_assigned_members" top_pad="0" - width="130" /> + width="295" /> <check_box - height="16" - label="Members are visible" + height="15" + label="Reveal members" layout="topleft" - left_delta="0" name="role_visible_in_list" tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group." - top_pad="10" - width="130" /> + top_pad="3" + width="290" /> + <text + type="string" + height="16" + layout="topleft" + follows="left|top" + left="0" + name="static2" + top_pad="5" + width="295"> + Allowed Abilities + </text> <scroll_list draw_stripes="false" - height="150" + height="50" layout="topleft" - left="135" + left="0" name="role_allowed_actions" search_column="2" tool_tip="For details of each allowed ability see the abilities tab" - top="101" - width="130"> + top_pad="0" + width="295"> <scroll_list.columns label="" name="icon" - width="2" /> + width="20" /> <scroll_list.columns label="" name="checkbox" - width="16" /> + width="20" /> <scroll_list.columns label="" name="action" - width="220" /> + width="250" /> </scroll_list> </panel> <panel - height="215" + height="303" layout="topleft" - left_delta="0" + left="10" name="actions_footer" top_delta="0" + top="245" visible="false" - width="265"> + width="300"> <text type="string" - font="SansSerif" height="16" layout="topleft" - left="0" name="static" - top="0" width="200"> - Description + Ability description </text> <text_editor type="string" enabled="false" halign="left" - height="48" + height="80" layout="topleft" left_delta="0" max_length="512" name="action_description" top_pad="0" - width="265" + width="295" word_wrap="true"> This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. </text_editor> <text type="string" - font="SansSerif" height="16" layout="topleft" left_delta="0" name="static2" - top_pad="10" - width="125"> - Roles with Ability + top_pad="5" + width="295"> + Roles with this ability </text> - <text + <scroll_list + height="60" + layout="topleft" + left="0" + name="action_roles" + top_pad="0" + width="295" /> + <text type="string" - font="SansSerif" height="16" layout="topleft" - left_pad="10" name="static3" - top_delta="0" - width="125"> - Members with Ability + top_pad="5" + width="295"> + Members with this ability </text> - <scroll_list - height="150" - layout="topleft" - left="0" - name="action_roles" - top="90" - width="130" /> <name_list - height="150" + height="100" layout="topleft" - left_pad="5" name="action_members" - top_delta="0" - width="130" /> + top_pad="0" + width="295" /> </panel> </panel> -- GitLab From abf77532d8534fe98b8c05ddf049ad429da34992 Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Tue, 3 Nov 2009 19:42:52 -0700 Subject: [PATCH 098/306] fix the bug that textuer boost level is mixed with boolean numbers. --- indra/newview/llcolorswatch.cpp | 3 ++- indra/newview/lldrawpoolbump.cpp | 2 +- indra/newview/lldrawpoolterrain.cpp | 4 ++-- indra/newview/lldrawpoolwater.cpp | 4 ++-- indra/newview/llface.cpp | 4 ++-- indra/newview/llfloaterreporter.cpp | 2 +- indra/newview/llfloaterscriptdebug.cpp | 2 +- indra/newview/llpreviewtexture.cpp | 2 +- indra/newview/llselectmgr.cpp | 6 +++--- indra/newview/llspatialpartition.cpp | 2 +- indra/newview/lltexturectrl.cpp | 4 ++-- indra/newview/lltextureview.cpp | 2 +- indra/newview/llviewerobject.cpp | 6 +++--- indra/newview/llviewertexture.cpp | 14 ++++++++------ indra/newview/llviewertexture.h | 15 ++++++++------- indra/newview/llviewertexturelist.cpp | 12 ++++++------ indra/newview/llviewertexturelist.h | 8 ++++---- indra/newview/llvoavatar.cpp | 2 +- indra/newview/llvograss.cpp | 2 +- indra/newview/llvosky.cpp | 8 ++++---- indra/newview/llvotree.cpp | 2 +- indra/newview/llvovolume.cpp | 4 ++-- indra/newview/llwearable.cpp | 2 +- indra/newview/llworldmap.cpp | 7 ++++--- indra/newview/llworldmapview.cpp | 5 +++-- 25 files changed, 65 insertions(+), 59 deletions(-) diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index 7b75c77a1e3..ed304bdd345 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -228,7 +228,8 @@ void LLColorSwatchCtrl::draw() { if (!mFallbackImageName.empty()) { - LLPointer<LLViewerTexture> fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + LLPointer<LLViewerTexture> fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, TRUE, + LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); if( fallback_image->getComponents() == 4 ) { gl_rect_2d_checkerboard( interior ); diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index e087feeaecf..5f845c3721d 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -144,7 +144,7 @@ void LLStandardBumpmap::restoreGL() gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage = LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id), TRUE, - FALSE, + LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0); diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 790e75cfaae..9dc22cddcd2 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -72,7 +72,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) : sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale"); sDetailMode = gSavedSettings.getS32("RenderTerrainDetail"); mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga", - TRUE, TRUE, + TRUE, LLViewerTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE, GL_ALPHA8, GL_ALPHA, LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb")); @@ -81,7 +81,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) : mAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP); m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c", - TRUE, TRUE, + TRUE, LLViewerTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE, GL_ALPHA8, GL_ALPHA, LLUUID("38b86f85-2575-52a9-a531-23108d8da837")); diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 21e17cc2074..107de934dfc 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -69,11 +69,11 @@ LLVector3 LLDrawPoolWater::sLightDir; LLDrawPoolWater::LLDrawPoolWater() : LLFacePool(POOL_WATER) { - mHBTex[0] = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, TRUE); + mHBTex[0] = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI); gGL.getTexUnit(0)->bind(mHBTex[0]) ; mHBTex[0]->setAddressMode(LLTexUnit::TAM_CLAMP); - mHBTex[1] = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, TRUE); + mHBTex[1] = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI); gGL.getTexUnit(0)->bind(mHBTex[1]); mHBTex[1]->setAddressMode(LLTexUnit::TAM_CLAMP); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 09b3ce1e863..8ec448e281c 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -515,8 +515,8 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color) /* removed in lieu of raycast uv detection void LLFace::renderSelectedUV() { - LLViewerTexture* red_blue_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test1.j2c", TRUE, TRUE); - LLViewerTexture* green_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test2.tga", TRUE, TRUE); + LLViewerTexture* red_blue_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test1.j2c", TRUE, LLViewerTexture::BOOST_UI); + LLViewerTexture* green_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test2.tga", TRUE, LLViewerTexture::BOOST_UI); LLGLSUVSelect object_select; diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 70a3ad5252d..ad2fe34e95e 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -789,7 +789,7 @@ void LLFloaterReporter::takeScreenshot() // store in the image list so it doesn't try to fetch from the server LLPointer<LLViewerFetchedTexture> image_in_list = - LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid, TRUE, FALSE, LLViewerTexture::FETCHED_TEXTURE); + LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::FETCHED_TEXTURE); image_in_list->createGLTexture(0, raw); // the texture picker then uses that texture diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp index 3bf1848efb7..eeea71cc4cd 100644 --- a/indra/newview/llfloaterscriptdebug.cpp +++ b/indra/newview/llfloaterscriptdebug.cpp @@ -106,7 +106,7 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std: if (objectp) { - objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, TRUE)); + objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, LLViewerTexture::BOOST_UI)); floater_label = llformat("%s(%.2f, %.2f)", user_name.c_str(), objectp->getPositionRegion().mV[VX], objectp->getPositionRegion().mV[VY]); } else diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 9c21faa3be5..86fa2c4695a 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -552,7 +552,7 @@ void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata) void LLPreviewTexture::loadAsset() { - mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); mImage->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); mAssetStatus = PREVIEW_ASSET_LOADING; updateDimensions(); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 759c86f3a02..b8ceef08991 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1448,7 +1448,7 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid) // Texture picker defaults aren't inventory items // * Don't need to worry about permissions for them // * Can just apply the texture and be done with it. - objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE)); + objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); } return true; } @@ -1604,7 +1604,7 @@ BOOL LLSelectMgr::selectionRevertTextures() } else { - object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE)); + object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); } } } @@ -4604,7 +4604,7 @@ void LLSelectMgr::updateSilhouettes() if (!mSilhouetteImagep) { - mSilhouetteImagep = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", TRUE, TRUE); + mSilhouetteImagep = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", TRUE, LLViewerTexture::BOOST_UI); } mHighlightedObjects->cleanupNodes(); diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 9f317803ce7..279e1438519 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -2704,7 +2704,7 @@ void renderTexturePriority(LLDrawable* drawable) drawBox(center, size); /*S32 boost = imagep->getBoostLevel(); - if (boost) + if (boost>LLViewerTexture::BOOST_NONE) { F32 t = (F32) boost / (F32) (LLViewerTexture::BOOST_MAX_LEVEL-1); LLVector4 col = lerp(boost_cold, boost_hot, t); diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 50ebc205a99..efe88047420 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -529,7 +529,7 @@ void LLFloaterTexturePicker::draw() mTexturep = NULL; if(mImageAssetID.notNull()) { - mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES, IMMEDIATE_NO); + mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES); mTexturep->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); } else if (!mFallbackImageName.empty()) @@ -1190,7 +1190,7 @@ void LLTextureCtrl::draw() } else if (!mImageAssetID.isNull()) { - mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES, IMMEDIATE_NO); + mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES); mTexturep->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); } else if (!mFallbackImageName.empty()) diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index ea675c5a6e4..dafa4f25caa 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -168,7 +168,7 @@ void LLTextureBar::draw() { color = LLColor4::green4; } - else if (mImagep->getBoostLevel()) + else if (mImagep->getBoostLevel() > LLViewerTexture::BOOST_NONE) { color = LLColor4::magenta; } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 20cd516fa06..26411ce152a 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2928,7 +2928,7 @@ void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */) { LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); LLUUID sculpt_id = sculpt_params->getSculptTexture(); - LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED); + LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED); } if (boost_children) @@ -3691,7 +3691,7 @@ void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry) // if (mDrawable.notNull() && mDrawable->isVisible()) // { const LLUUID& image_id = getTE(te)->getID(); - mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); // } } @@ -3717,7 +3717,7 @@ S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost hos uuid == LLUUID::null) { retval = LLPrimitive::setTETexture(te, uuid); - mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); + mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); setChanged(TEXTURE); if (mDrawable.notNull()) { diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 758bf8c1aa0..6b8c8c01d4b 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -198,6 +198,7 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture( LLGLenum primary_format, LLHost request_from_host) { + llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ; return gTextureList.getImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ; } @@ -210,6 +211,7 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile( LLGLenum primary_format, const LLUUID& force_id) { + llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ; return gTextureList.getImageFromFile(filename, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ; } @@ -256,10 +258,10 @@ void LLViewerTextureManager::init() image_raw = NULL; LLViewerFetchedTexture::sDefaultImagep->dontDiscard(); #else - LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE); + LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); #endif - LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, TRUE, TRUE); + LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, TRUE, LLViewerTexture::BOOST_UI); LLViewerFetchedTexture::sSmokeImagep->setNoDelete() ; LLViewerTexture::initClass() ; @@ -1240,7 +1242,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority() { ddiscard+=2; } - else if (mGLTexturep.notNull() && !mGLTexturep->getBoundRecently() && mBoostLevel == 0) + else if (mGLTexturep.notNull() && !mGLTexturep->getBoundRecently() && mBoostLevel == LLViewerTexture::BOOST_NONE) { ddiscard-=2; } @@ -1252,11 +1254,11 @@ F32 LLViewerFetchedTexture::calcDecodePriority() pixel_priority = llclamp(pixel_priority, 0.0f, priority-1.f); // priority range = 100000-900000 if ( mBoostLevel > BOOST_HIGH) { - priority = 1000000.f + pixel_priority + 1000.f * mBoostLevel; + priority = 1000000.f + pixel_priority + 1000.f * (mBoostLevel - LLViewerTexture::BOOST_NONE); } else { - priority += 0.f + pixel_priority + 1000.f * mBoostLevel; + priority += 0.f + pixel_priority + 1000.f * (mBoostLevel - LLViewerTexture::BOOST_NONE); } } return priority; @@ -1436,7 +1438,7 @@ bool LLViewerFetchedTexture::updateFetch() } if (!mDontDiscard) { - if (mBoostLevel == 0) + if (mBoostLevel == LLViewerTexture::BOOST_NONE) { desired_discard = llmax(desired_discard, current_discard-1); } diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 020478beef2..ff8f14e8792 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -107,11 +107,12 @@ class LLViewerTexture : public LLTexture enum EBoostLevel { - BOOST_NONE = 0, - BOOST_AVATAR_BAKED = 1, - BOOST_AVATAR = 2, - BOOST_CLOUDS = 3, - BOOST_SCULPTED = 4, + //skip 0 and 1 to avoid mistakenly mixing boost level with boolean numbers. + BOOST_NONE = 2, + BOOST_AVATAR_BAKED = 3, + BOOST_AVATAR = 4, + BOOST_CLOUDS = 5, + BOOST_SCULPTED = 6, BOOST_HIGH = 10, BOOST_TERRAIN = 11, // has to be high priority for minimap / low detail @@ -601,7 +602,7 @@ class LLViewerTextureManager static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id, BOOL usemipmap = TRUE, - BOOL level_immediate = FALSE, // Get the requested level immediately upon creation. + S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -610,7 +611,7 @@ class LLViewerTextureManager static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename, BOOL usemipmap = TRUE, - BOOL level_immediate = FALSE, // Get the requested level immediately upon creation. + S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index b5986c70f58..d2be1ac9b55 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -197,7 +197,7 @@ void LLViewerTextureList::doPrefetchImages() if(LLViewerTexture::FETCHED_TEXTURE == texture_type || LLViewerTexture::LOD_TEXTURE == texture_type) { - LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(uuid, MIPMAP_TRUE, FALSE, texture_type); + LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(uuid, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, texture_type); if (image) { image->addTextureStats((F32)pixel_area); @@ -325,14 +325,14 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& { // Never mind that this ignores image_set_id; // getImage() will handle that later. - return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE); + return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); } std::string full_path = gDirUtilp->findSkinnedFilename("textures", filename); if (full_path.empty()) { llwarns << "Failed to find local image file: " << filename << llendl; - return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE); + return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI); } // generate UUID based on hash of filename @@ -400,7 +400,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id, if ((&image_id == NULL) || image_id.isNull()) { - return (LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE)); + return (LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI)); } LLPointer<LLViewerFetchedTexture> imagep = findImage(image_id); @@ -1171,7 +1171,7 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d U8 *data = new U8[data_size]; msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); - LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); if (!image) { delete [] data; @@ -1235,7 +1235,7 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d U8 *data = new U8[data_size]; msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size); - LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); if (!image) { delete [] data; diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index fda57ce981b..6948db70f83 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -131,7 +131,7 @@ class LLViewerTextureList LLViewerFetchedTexture * getImage(const LLUUID &image_id, BOOL usemipmap = TRUE, - BOOL level_immediate = FALSE, // Get the requested level immediately upon creation. + S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -140,7 +140,7 @@ class LLViewerTextureList LLViewerFetchedTexture * getImageFromFile(const std::string& filename, BOOL usemipmap = TRUE, - BOOL level_immediate = FALSE, // Get the requested level immediately upon creation. + S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -149,7 +149,7 @@ class LLViewerTextureList LLViewerFetchedTexture* createImage(const LLUUID &image_id, BOOL usemipmap = TRUE, - BOOL level_immediate = FALSE, // Get the requested level immediately upon creation. + S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation. S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, LLGLint internal_format = 0, LLGLenum primary_format = 0, @@ -159,7 +159,7 @@ class LLViewerTextureList // Request image from a specific host, used for baked avatar textures. // Implemented in header in case someone changes default params above. JC LLViewerFetchedTexture* getImageFromHost(const LLUUID& image_id, LLHost host) - { return getImage(image_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); } + { return getImage(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); } public: typedef std::set<LLPointer<LLViewerFetchedTexture> > image_list_t; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 4bf66ba17e0..240f87d104e 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -6520,7 +6520,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) && baked_index != BAKED_SKIRT) { setTEImage(mBakedTextureDatas[baked_index].mTextureIndex, - LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE)); + LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); } } diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index 570a3334b9e..110433a27d4 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -106,7 +106,7 @@ void LLVOGrass::updateSpecies() SpeciesMap::const_iterator it = sSpeciesTable.begin(); mSpecies = (*it).first; } - setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE)); + setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); } diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index d44c5432669..d37deaf53d1 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -376,9 +376,9 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) mSun.setIntensity(SUN_INTENSITY); mMoon.setIntensity(0.1f * SUN_INTENSITY); - mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, TRUE); + mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI); mSunTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); - mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, TRUE); + mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI); mMoonTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); mBloomTexturep = LLViewerTextureManager::getFetchedTexture(IMG_BLOOM1); mBloomTexturep->setNoDelete() ; @@ -472,9 +472,9 @@ void LLVOSky::restoreGL() { mSkyTex[i].restoreGL(); } - mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, TRUE); + mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI); mSunTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); - mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, TRUE); + mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI); mMoonTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); mBloomTexturep = LLViewerTextureManager::getFetchedTexture(IMG_BLOOM1); mBloomTexturep->setNoDelete() ; diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 615ae13bc2c..ec118d89bcc 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -311,7 +311,7 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys, // // Load Species-Specific data // - mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); mBranchLength = sSpeciesTable[mSpecies]->mBranchLength; mTrunkLength = sSpeciesTable[mSpecies]->mTrunkLength; mLeafScale = sSpeciesTable[mSpecies]->mLeafScale; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 7d4bef3f7d3..1d94e9118e0 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -665,7 +665,7 @@ void LLVOVolume::updateTextures() { LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); LLUUID id = sculpt_params->getSculptTexture(); - mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); if (mSculptTexture.notNull()) { S32 lod = llmin(mLOD, 3); @@ -876,7 +876,7 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail if (isSculpted()) { - mSculptTexture = LLViewerTextureManager::getFetchedTexture(volume_params.getSculptID(), TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + mSculptTexture = LLViewerTextureManager::getFetchedTexture(volume_params.getSculptID(), TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); if (mSculptTexture.notNull()) { //ignore sculpt GL usage since bao fixed this in a separate branch diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 4cd29bb8386..f2cf84c2281 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -661,7 +661,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater { image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te); } - LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE ); + LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE ); // MULTI-WEARABLE: replace hard-coded 0 avatar->setLocalTextureTE(te, image, set_by_user, 0); } diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index f198f3a0cf5..355d4141c35 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -525,7 +525,7 @@ void LLWorldMap::processMapLayerReply(LLMessageSystem* msg, void**) LLWorldMapLayer new_layer; new_layer.LayerDefined = TRUE; msg->getUUIDFast(_PREHASH_LayerData, _PREHASH_ImageID, new_layer.LayerImageID, block); - new_layer.LayerImage = LLViewerTextureManager::getFetchedTexture(new_layer.LayerImageID, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + new_layer.LayerImage = LLViewerTextureManager::getFetchedTexture(new_layer.LayerImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); gGL.getTexUnit(0)->bind(new_layer.LayerImage); new_layer.LayerImage->setAddressMode(LLTexUnit::TAM_CLAMP); @@ -640,14 +640,15 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**) siminfo->mMapImageID[agent_flags] = image_id; #ifdef IMMEDIATE_IMAGE_LOAD - siminfo->mCurrentImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + siminfo->mCurrentImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], + MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); siminfo->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP); #endif if (siminfo->mMapImageID[2].notNull()) { #ifdef IMMEDIATE_IMAGE_LOAD - siminfo->mOverlayImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[2], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + siminfo->mOverlayImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[2], MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); #endif } else diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 823db027eeb..920415873e9 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -511,7 +511,8 @@ void LLWorldMapView::draw() (textures_requested_this_tick < MAX_REQUEST_PER_TICK))) { textures_requested_this_tick++; - info->mCurrentImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + info->mCurrentImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], + MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); info->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP); simimage = info->mCurrentImage; gGL.getTexUnit(0)->bind(simimage); @@ -524,7 +525,7 @@ void LLWorldMapView::draw() (textures_requested_this_tick < MAX_REQUEST_PER_TICK))) { textures_requested_this_tick++; - info->mOverlayImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[2], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + info->mOverlayImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[2], MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); info->mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP); overlayimage = info->mOverlayImage; gGL.getTexUnit(0)->bind(overlayimage); -- GitLab From e8afde0ed3f37ab5920bee3b66060489c53ef380 Mon Sep 17 00:00:00 2001 From: Steve Bennetts <steve@lindenlab.com> Date: Tue, 3 Nov 2009 20:06:26 -0800 Subject: [PATCH 099/306] merge fixes. Includes a refactoring of LLParticipantList to fix compile errors on Windows. --- indra/newview/llpanellandmarkinfo.cpp | 8 ++++---- indra/newview/llparticipantlist.cpp | 29 +++++++++++++++++---------- indra/newview/llparticipantlist.h | 16 +++++++-------- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 1152ca68736..6f3b0db498c 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -344,7 +344,7 @@ void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id) LLStringUtil::replaceChar(desc, '\n', ' '); // If no folder chosen use the "Landmarks" folder. LLLandmarkActions::createLandmarkHere(name, desc, - folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK)); + folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK)); } // static @@ -379,7 +379,7 @@ void LLPanelLandmarkInfo::populateFoldersList() mFolderCombo->removeall(); // Put the "Landmarks" folder first in list. - LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id); if (!cat) { @@ -411,7 +411,7 @@ static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right) static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats) { - LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); // Add descendent folders of the "Landmarks" category. LLInventoryModel::item_array_t items; // unused @@ -424,7 +424,7 @@ static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats) is_category); // Add the "My Favorites" category. - LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id); if (!favorites_cat) { diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 9450bee3153..c00c07e53ad 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -1,5 +1,5 @@ -/** - * @file llparticipantlist.cpp +llparticipantlist /** + * @file.cpp * @brief LLParticipantList intended to update view(LLAvatarList) according to incoming messages * * $LicenseInfo:firstyear=2009&license=viewergpl$ @@ -45,14 +45,18 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list): mSpeakerMgr(data_source), mAvatarList(avatar_list), - mSpeakerAddListener(*this), - mSpeakerRemoveListener(*this), - mSpeakerClearListener(*this), + mSpeakerAddListener(NULL), + mSpeakerRemoveListener(NULL), + mSpeakerClearListener(NULL), mSortOrder(E_SORT_BY_NAME) { - mSpeakerMgr->addListener(&mSpeakerAddListener, "add"); - mSpeakerMgr->addListener(&mSpeakerRemoveListener, "remove"); - mSpeakerMgr->addListener(&mSpeakerClearListener, "clear"); + mSpeakerAddListener = new SpeakerAddListener(this); + mSpeakerRemoveListener = new SpeakerRemoveListener(this); + mSpeakerClearListener = new SpeakerClearListener(this); + + mSpeakerMgr->addListener(mSpeakerAddListener, "add"); + mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove"); + mSpeakerMgr->addListener(mSpeakerClearListener, "clear"); mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); @@ -71,6 +75,9 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av LLParticipantList::~LLParticipantList() { + delete mSpeakerAddListener; + delete mSpeakerRemoveListener; + delete mSpeakerClearListener; } void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list) @@ -153,7 +160,7 @@ void LLParticipantList::sort() // bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { - return mParent.onAddItemEvent(event, userdata); + return mParent->onAddItemEvent(event, userdata); } // @@ -161,7 +168,7 @@ bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::L // bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { - return mParent.onRemoveItemEvent(event, userdata); + return mParent->onRemoveItemEvent(event, userdata); } // @@ -169,5 +176,5 @@ bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents // bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { - return mParent.onClearListEvent(event, userdata); + return mParent->onClearListEvent(event, userdata); } diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 04d9e292568..e8d72249069 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -71,29 +71,29 @@ class LLParticipantList class BaseSpeakerListner : public LLOldEvents::LLSimpleListener { public: - BaseSpeakerListner(LLParticipantList& parent) : mParent(parent) {} + BaseSpeakerListner(LLParticipantList* parent) : mParent(parent) {} protected: - LLParticipantList& mParent; + LLParticipantList* mParent; }; class SpeakerAddListener : public BaseSpeakerListner { public: - SpeakerAddListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} + SpeakerAddListener(LLParticipantList* parent) : BaseSpeakerListner(parent) {} /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); }; class SpeakerRemoveListener : public BaseSpeakerListner { public: - SpeakerRemoveListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} + SpeakerRemoveListener(LLParticipantList* parent) : BaseSpeakerListner(parent) {} /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); }; class SpeakerClearListener : public BaseSpeakerListner { public: - SpeakerClearListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} + SpeakerClearListener(LLParticipantList* parent) : BaseSpeakerListner(parent) {} /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); }; @@ -103,9 +103,9 @@ class LLParticipantList LLSpeakerMgr* mSpeakerMgr; LLAvatarList* mAvatarList; - SpeakerAddListener mSpeakerAddListener; - SpeakerRemoveListener mSpeakerRemoveListener; - SpeakerClearListener mSpeakerClearListener; + SpeakerAddListener* mSpeakerAddListener; + SpeakerRemoveListener* mSpeakerRemoveListener; + SpeakerClearListener* mSpeakerClearListener; EParticipantSortOrder mSortOrder; }; -- GitLab From de0687d93032710d7d814a37feb20e04e3811adc Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Tue, 3 Nov 2009 20:55:38 -0800 Subject: [PATCH 100/306] Clean up menu_login.xml debug menu Strip out unnecessary layout=topleft Add debug option for reg in client Trivial, not reviewed. --- .../skins/default/xui/en/menu_login.xml | 45 ++++++------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index c3ee6e250b0..dfa5adb743a 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -10,22 +10,18 @@ <menu create_jump_keys="true" label="Me" - layout="topleft" name="File"> <menu_item_call label="Preferences" - layout="topleft" name="Preferences..." shortcut="control|P"> <menu_item_call.on_click function="ShowFloater" parameter="preferences" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator /> <menu_item_call label="Quit [APP_NAME]" - layout="topleft" name="Quit" shortcut="control|Q"> <menu_item_call.on_click @@ -36,7 +32,6 @@ <menu create_jump_keys="true" label="Edit" - layout="topleft" name="Edit" width="153"> </menu> @@ -44,22 +39,18 @@ <menu create_jump_keys="true" label="Help" - layout="topleft" name="Help"> <menu_item_call label="[SECOND_LIFE] Help" - layout="topleft" name="Second Life Help" shortcut="F1"> <menu_item_call.on_click function="ShowFloater" parameter="help f1" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator /> <menu_item_call label="About [APP_NAME]" - layout="topleft" name="About Second Life"> <menu_item_call.on_click function="ShowFloater" @@ -69,7 +60,6 @@ <menu create_jump_keys="true" label="Debug" - layout="topleft" name="Debug" tear_off="true"> <!-- Need a copy of the edit menu here so keyboard shortcuts like @@ -78,12 +68,10 @@ <menu create_jump_keys="true" label="Edit" - layout="topleft" name="Edit" tear_off="true"> <menu_item_call label="Undo" - layout="topleft" name="Undo" shortcut="control|Z"> <menu_item_call.on_click @@ -93,7 +81,6 @@ </menu_item_call> <menu_item_call label="Redo" - layout="topleft" name="Redo" shortcut="control|Y"> <menu_item_call.on_click @@ -101,11 +88,9 @@ <menu_item_call.on_enable function="Edit.EnableRedo" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator /> <menu_item_call label="Cut" - layout="topleft" name="Cut" shortcut="control|X"> <menu_item_call.on_click @@ -115,7 +100,6 @@ </menu_item_call> <menu_item_call label="Copy" - layout="topleft" name="Copy" shortcut="control|C"> <menu_item_call.on_click @@ -125,7 +109,6 @@ </menu_item_call> <menu_item_call label="Paste" - layout="topleft" name="Paste" shortcut="control|V"> <menu_item_call.on_click @@ -135,7 +118,6 @@ </menu_item_call> <menu_item_call label="Delete" - layout="topleft" name="Delete" shortcut="Del"> <menu_item_call.on_click @@ -145,7 +127,6 @@ </menu_item_call> <menu_item_call label="Duplicate" - layout="topleft" name="Duplicate" shortcut="control|D"> <menu_item_call.on_click @@ -153,11 +134,9 @@ <menu_item_call.on_enable function="Edit.EnableDuplicate" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_separator /> <menu_item_call label="Select All" - layout="topleft" name="Select All" shortcut="control|A"> <menu_item_call.on_click @@ -167,7 +146,6 @@ </menu_item_call> <menu_item_call label="Deselect" - layout="topleft" name="Deselect" shortcut="control|E"> <menu_item_call.on_click @@ -179,7 +157,6 @@ <menu_item_separator /> <menu_item_call label="Show Debug Settings" - layout="topleft" name="Debug Settings"> <menu_item_call.on_click function="Advanced.ShowDebugSettings" @@ -187,7 +164,6 @@ </menu_item_call> <menu_item_call label="UI/Color Settings" - layout="topleft" name="UI/Color Settings"> <menu_item_call.on_click function="Advanced.ShowDebugSettings" @@ -196,7 +172,6 @@ <menu_item_separator /> <menu_item_call label="XUI Preview Tool" - layout="topleft" name="UI Preview Tool" shortcut="control|T"> <menu_item_call.on_click @@ -206,7 +181,6 @@ <menu_item_separator /> <menu_item_call label="Widget Test" - layout="topleft" name="Widget Test" shortcut="control|shift|T"> <menu_item_call.on_click @@ -228,10 +202,18 @@ <menu_item_call.on_click function="Advanced.ShowSideTray" /> </menu_item_call> + <menu_item_check + label="Reg In Client Test (restart)" + name="Reg In Client Test (restart)"> + <menu_item_check.on_check + control="RegInClient" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RegInClient" /> + </menu_item_check> <menu_item_separator /> <menu_item_call label="Show TOS" - layout="topleft" name="TOS"> <menu_item_call.on_click function="ShowFloater" @@ -239,7 +221,6 @@ </menu_item_call> <menu_item_call label="Show Critical Message" - layout="topleft" name="Critical"> <menu_item_call.on_click function="ShowFloater" -- GitLab From bf092de246b26c3bf085b1ff22a7200594016063 Mon Sep 17 00:00:00 2001 From: angela <angela@lindenlab.com> Date: Wed, 4 Nov 2009 15:58:49 +0800 Subject: [PATCH 101/306] EXT-1781 selecting Freeze frame (fullscreen preview) in the snapshot tool locks out mouse-clicks when closed --- indra/newview/llfloatersnapshot.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 235e8192186..68dcdba852d 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -1373,8 +1373,10 @@ void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp, void LLFloaterSnapshot::Impl::onClickDiscard(void* data) { LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + if (view) { + view->getParent()->setMouseOpaque(FALSE); view->closeFloater(); } } -- GitLab From 068e1320399510afea2b2e2925c9755153d05423 Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Wed, 4 Nov 2009 09:12:32 +0000 Subject: [PATCH 102/306] DEV-41358 DEV-41362: Get an authentication token from login.cgi and pass this token through to the search web pages via a q= query parameter in the search URL. This will let the search facility determine the user's maturity and teen settings. I also now escape the search string that the user typed in, 'cos they could type anything. Thanks to Mani for showing me how to get responses from login.cgi. --- indra/newview/llfloatersearch.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index bd9798c18e1..97c573ddea5 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -34,8 +34,8 @@ #include "llviewerprecompiledheaders.h" #include "llfloatersearch.h" #include "llmediactrl.h" -#include "llagent.h" - +#include "lllogininstance.h" +#include "lluri.h" LLFloaterSearch::LLFloaterSearch(const LLSD& key) : LLFloater(key), @@ -116,15 +116,11 @@ void LLFloaterSearch::search(const LLSD &key) // append the search query string std::string search_text = key.has("id") ? key["id"].asString() : ""; - url += std::string("?q=") + search_text; + url += std::string("?q=") + LLURI::escape(search_text); - // append the maturity and teen capabilities for this agent - BOOL godlike = gAgent.isGodlike(); - bool mature_enabled = gAgent.canAccessMature() || godlike; - bool adult_enabled = gAgent.canAccessAdult() || godlike; - std::string mature = (mature_enabled) ? "True" : "False"; - std::string teen = (!adult_enabled) ? "True" : "False"; - url += "&t=" + teen + "&m=" + mature; + // append the permissions token that login.cgi gave us + LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token"); + url += "&p=" + search_token.asString(); // and load the URL in the web view mBrowser->navigateTo(url); -- GitLab From 5202334de82a8dbf8f2616fd323291826c17077b Mon Sep 17 00:00:00 2001 From: Mike Antipov <mantipov@productengine.com> Date: Wed, 4 Nov 2009 12:02:04 +0200 Subject: [PATCH 103/306] Fixed Windows build, broken in changeset 698ac0866792 - Made member Speaker Listeners as LLpointers in LLParticipantList --HG-- branch : product-engine --- indra/newview/llparticipantlist.cpp | 13 +++++++------ indra/newview/llparticipantlist.h | 6 +++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 9450bee3153..edff706fee5 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -45,14 +45,15 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list): mSpeakerMgr(data_source), mAvatarList(avatar_list), - mSpeakerAddListener(*this), - mSpeakerRemoveListener(*this), - mSpeakerClearListener(*this), mSortOrder(E_SORT_BY_NAME) { - mSpeakerMgr->addListener(&mSpeakerAddListener, "add"); - mSpeakerMgr->addListener(&mSpeakerRemoveListener, "remove"); - mSpeakerMgr->addListener(&mSpeakerClearListener, "clear"); + mSpeakerAddListener = new SpeakerAddListener(*this); + mSpeakerRemoveListener = new SpeakerRemoveListener(*this); + mSpeakerClearListener = new SpeakerClearListener(*this); + + mSpeakerMgr->addListener(mSpeakerAddListener, "add"); + mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove"); + mSpeakerMgr->addListener(mSpeakerClearListener, "clear"); mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 04d9e292568..8c209c0b208 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -103,9 +103,9 @@ class LLParticipantList LLSpeakerMgr* mSpeakerMgr; LLAvatarList* mAvatarList; - SpeakerAddListener mSpeakerAddListener; - SpeakerRemoveListener mSpeakerRemoveListener; - SpeakerClearListener mSpeakerClearListener; + LLPointer<SpeakerAddListener> mSpeakerAddListener; + LLPointer<SpeakerRemoveListener> mSpeakerRemoveListener; + LLPointer<SpeakerClearListener> mSpeakerClearListener; EParticipantSortOrder mSortOrder; }; -- GitLab From 459e7e268462e93d7e3ec680f4ecf8c120b19a05 Mon Sep 17 00:00:00 2001 From: Eugene Kondrashev <ekondrashev@productengine.com> Date: Wed, 4 Nov 2009 12:54:44 +0200 Subject: [PATCH 104/306] Implemented normal subtask EXT-1516 - Implement chiclet for ad-hoc chat. --HG-- branch : product-engine --- indra/newview/llchiclet.cpp | 3 +++ indra/newview/llchiclet.h | 2 ++ 2 files changed, 5 insertions(+) diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 1049348684f..8a4650763fd 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -455,6 +455,7 @@ LLAdHocChiclet::Params::Params() , unread_notifications("unread_notifications") , speaker("speaker") , show_speaker("show_speaker") +, avatar_icon_color("avatar_icon_color", LLColor4::green) { // *TODO Vadim: Get rid of hardcoded values. rect(LLRect(0, 25, 45, 0)); @@ -492,6 +493,8 @@ LLAdHocChiclet::LLAdHocChiclet(const Params& p) { LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon; mChicletIconCtrl = LLUICtrlFactory::create<LLChicletAvatarIconCtrl>(avatar_params); + //Make the avatar modified + mChicletIconCtrl->setColor(p.avatar_icon_color); addChild(mChicletIconCtrl); LLChicletNotificationCounterCtrl::Params unread_params = p.unread_notifications; diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index 6eefd9829f1..f82259c73e8 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -457,6 +457,8 @@ class LLAdHocChiclet : public LLIMChiclet Optional<bool> show_speaker; + Optional<LLColor4> avatar_icon_color; + Params(); }; -- GitLab From 7ad64438430de9a26d2c7c790eb196db4817f259 Mon Sep 17 00:00:00 2001 From: Eugene Mutavchi <emutavchi@productengine.com> Date: Wed, 4 Nov 2009 13:45:27 +0200 Subject: [PATCH 105/306] Implemented normal sub-task EXT-2145 (Incorrect names of Call button on IM Control Panels) --HG-- branch : product-engine --- .../skins/default/xui/en/panel_adhoc_control_panel.xml | 4 ++-- .../skins/default/xui/en/panel_group_control_panel.xml | 4 ++-- indra/newview/skins/default/xui/en/panel_im_control_panel.xml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml index 87c4e2787f4..0c1e777fa1b 100644 --- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml @@ -19,13 +19,13 @@ width="180" /> <button name="call_btn" - label="Call" + label="Call Group" left_delta="27" width="125" height="20" /> <button name="end_call_btn" - label="End Call" + label="Leave Call" width="125" height="20" visible="false"/> diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index 3358015335d..560d353d00d 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -25,12 +25,12 @@ height="20" /> <button name="call_btn" - label="Call" + label="Call Group" width="125" height="20" /> <button name="end_call_btn" - label="End Call" + label="Leave Call" width="125" height="20" visible="false"/> 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 0dd38784263..7308ca3c29e 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 @@ -31,7 +31,7 @@ <button follows="left|bottom" height="20" - label="End Call" + label="Leave Call" name="end_call_btn" visible="false" width="125" /> -- GitLab From c10a40e54ea32825f46f91525814c19f1cb818e6 Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Wed, 4 Nov 2009 11:53:29 +0000 Subject: [PATCH 106/306] DEV-41358: corrected a minor typo in a comment and refactored some code to avoid duplication. --- indra/llui/llurlentry.cpp | 46 ++++++++++++++------------------------- indra/llui/llurlentry.h | 2 +- 2 files changed, 17 insertions(+), 31 deletions(-) diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index ddb6c6baffe..dae4b512d15 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -145,6 +145,18 @@ void LLUrlEntryBase::callObservers(const std::string &id, const std::string &lab } } +static std::string getStringAfterToken(const std::string str, const std::string token) +{ + size_t pos = str.find(token); + if (pos == std::string::npos) + { + return ""; + } + + pos += token.size(); + return str.substr(pos, str.size() - pos); +} + // // LLUrlEntryHTTP Describes generic http: and https: Urls // @@ -154,7 +166,6 @@ LLUrlEntryHTTP::LLUrlEntryHTTP() boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_http.xml"; mTooltip = LLTrans::getString("TooltipHttpUrl"); - //mIcon = "gear.tga"; } std::string LLUrlEntryHTTP::getLabel(const std::string &url, const LLUrlLabelCallback &cb) @@ -390,7 +401,7 @@ std::string LLUrlEntryParcel::getLabel(const std::string &url, const LLUrlLabelC } // -// LLUrlEntryPlace Describes secondlife:///<location> URLs +// LLUrlEntryPlace Describes secondlife://<location> URLs // LLUrlEntryPlace::LLUrlEntryPlace() { @@ -433,15 +444,7 @@ std::string LLUrlEntryPlace::getLabel(const std::string &url, const LLUrlLabelCa std::string LLUrlEntryPlace::getLocation(const std::string &url) const { // return the part of the Url after secondlife:// part - const std::string search_string = "://"; - size_t pos = url.find(search_string); - if (pos == std::string::npos) - { - return ""; - } - - pos += search_string.size(); - return url.substr(pos, url.size() - pos); + return ::getStringAfterToken(url, "://"); } // @@ -506,15 +509,7 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe std::string LLUrlEntryTeleport::getLocation(const std::string &url) const { // return the part of the Url after ///app/teleport - const std::string search_string = "teleport"; - size_t pos = url.find(search_string); - if (pos == std::string::npos) - { - return ""; - } - - pos += search_string.size() + 1; - return url.substr(pos, url.size() - pos); + return ::getStringAfterToken(url, "app/teleport/"); } /// @@ -638,14 +633,5 @@ std::string LLUrlEntryWorldMap::getLabel(const std::string &url, const LLUrlLabe std::string LLUrlEntryWorldMap::getLocation(const std::string &url) const { // return the part of the Url after secondlife:///app/worldmap/ part - const std::string search_string = "//app/worldmap/"; - size_t pos = url.find(search_string); - if (pos == std::string::npos) - { - return ""; - } - - pos += search_string.size(); - return url.substr(pos, url.size() - pos); + return ::getStringAfterToken(url, "app/worldmap/"); } - diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 180ef856737..4507572b1e1 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -186,7 +186,7 @@ class LLUrlEntryParcel : public LLUrlEntryBase /// /// LLUrlEntryPlace Describes a Second Life location Url, e.g., -/// secondlife:///Ahern/50/50/50 +/// secondlife://Ahern/50/50/50 /// class LLUrlEntryPlace : public LLUrlEntryBase { -- GitLab From 8bd0c9058d3d24218cf59dd01f152b41240853a4 Mon Sep 17 00:00:00 2001 From: Yuri Chebotarev <ychebotarev@productengine.com> Date: Wed, 4 Nov 2009 14:25:41 +0200 Subject: [PATCH 107/306] fix for some group_info bugs. EXT-1091 "Refresh" button is overlapped by "Cancel" button in "Group Profile" panel --HG-- branch : product-engine --- .../xui/en/panel_group_info_sidetray.xml | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index 132c031942c..7e24ad2c940 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -128,15 +128,16 @@ background_visible="true" <accordion_tab can_resize="false" layout="topleft" - name="tab_general" + name="group_general_tab" title="General"> <panel border="false" + class="panel_group_general" filename="panel_group_general.xml" layout="topleft" left="0" help_topic="group_general_tab" - name="general_tab" + name="group_general_tab_panel" top="0" width="333" /> </accordion_tab> @@ -144,15 +145,16 @@ background_visible="true" can_resize="false" expanded="false" layout="topleft" - name="tab_roles" + name="group_roles_tab" title="Roles"> <panel border="false" + class="panel_group_roles" filename="panel_group_roles.xml" layout="topleft" left="0" help_topic="group_roles_tab" - name="roles_tab" + name="group_roles_tab_panel" top="0" width="333" /> </accordion_tab> @@ -160,14 +162,15 @@ background_visible="true" can_resize="false" expanded="false" layout="topleft" - name="tab_notices" + name="group_notices_tab" title="Notices"> <panel + class="panel_group_notices" filename="panel_group_notices.xml" layout="topleft" left="0" help_topic="group_notices_tab" - name="notices_tab" + name="group_notices_tab_panel" top="0" width="333" /> </accordion_tab> @@ -175,15 +178,16 @@ background_visible="true" can_resize="false" expanded="false" layout="topleft" - name="tab_notices" + name="group_land_tab" title="Land/Assets"> <panel border="false" + class="panel_group_land_money" filename="panel_group_land_money.xml" layout="topleft" left="0" help_topic="group_land_money_tab" - name="land_money_tab" + name="group_land_tab_panel" top="0" width="333" /> </accordion_tab> -- GitLab From 2715e94a5ae969956f493609561f0cc144ec2c37 Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk <slitovchuk@productengine.com> Date: Wed, 4 Nov 2009 14:33:00 +0200 Subject: [PATCH 108/306] Implemented major task EXT-2054 "Hook up parcel permission icons to parcel profile": - Added icon representation of parcel permissions to Place Profile panel. --HG-- branch : product-engine --- indra/newview/llpanellandmarkinfo.cpp | 14 --- indra/newview/llpanelplaceinfo.cpp | 14 +++ indra/newview/llpanelplaceprofile.cpp | 86 +++++++------ indra/newview/llpanelplaceprofile.h | 13 +- .../default/xui/en/panel_place_profile.xml | 116 ++---------------- 5 files changed, 84 insertions(+), 159 deletions(-) diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 1152ca68736..fd6a41c5058 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -139,20 +139,6 @@ void LLPanelLandmarkInfo::processParcelInfo(const LLParcelData& parcel_data) { LLPanelPlaceInfo::processParcelInfo(parcel_data); - // HACK: Flag 0x2 == adult region, - // Flag 0x1 == mature region, otherwise assume PG - std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG); - if (parcel_data.flags & 0x2) - { - rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT); - } - else if (parcel_data.flags & 0x1) - { - rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); - } - - mMaturityRatingText->setValue(rating); - S32 region_x; S32 region_y; S32 region_z; diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index 2c5f4b5afaa..e6d10be8582 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -209,6 +209,20 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data) mDescEditor->setText(parcel_data.desc); } + // HACK: Flag 0x2 == adult region, + // Flag 0x1 == mature region, otherwise assume PG + std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG); + if (parcel_data.flags & 0x2) + { + rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT); + } + else if (parcel_data.flags & 0x1) + { + rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); + } + + mMaturityRatingText->setValue(rating); + S32 region_x; S32 region_y; S32 region_z; diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 9ba72fe6cff..814139607cc 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -84,16 +84,24 @@ BOOL LLPanelPlaceProfile::postBuild() mParcelOwner = getChild<LLTextBox>("owner_value"); mLastVisited = getChild<LLTextBox>("last_visited_value"); - mRatingText = getChild<LLTextBox>("rating_value"); + mParcelRatingIcon = getChild<LLIconCtrl>("rating_icon"); + mParcelRatingText = getChild<LLTextBox>("rating_value"); + mVoiceIcon = getChild<LLIconCtrl>("voice_icon"); mVoiceText = getChild<LLTextBox>("voice_value"); + mFlyIcon = getChild<LLIconCtrl>("fly_icon"); mFlyText = getChild<LLTextBox>("fly_value"); + mPushIcon = getChild<LLIconCtrl>("push_icon"); mPushText = getChild<LLTextBox>("push_value"); + mBuildIcon = getChild<LLIconCtrl>("build_icon"); mBuildText = getChild<LLTextBox>("build_value"); + mScriptsIcon = getChild<LLIconCtrl>("scripts_icon"); mScriptsText = getChild<LLTextBox>("scripts_value"); + mDamageIcon = getChild<LLIconCtrl>("damage_icon"); mDamageText = getChild<LLTextBox>("damage_value"); mRegionNameText = getChild<LLTextBox>("region_name"); mRegionTypeText = getChild<LLTextBox>("region_type"); + mRegionRatingIcon = getChild<LLIconCtrl>("region_rating_icon"); mRegionRatingText = getChild<LLTextBox>("region_rating"); mRegionOwnerText = getChild<LLTextBox>("region_owner"); mRegionGroupText = getChild<LLTextBox>("region_group"); @@ -128,16 +136,24 @@ void LLPanelPlaceProfile::resetLocation() mParcelOwner->setValue(not_available); mLastVisited->setValue(not_available); - mRatingText->setText(not_available); + mParcelRatingIcon->setValue(not_available); + mParcelRatingText->setText(not_available); + mVoiceIcon->setValue(not_available); mVoiceText->setText(not_available); + mFlyIcon->setValue(not_available); mFlyText->setText(not_available); + mPushIcon->setValue(not_available); mPushText->setText(not_available); + mBuildIcon->setValue(not_available); mBuildText->setText(not_available); - mParcelScriptsText->setText(not_available); + mScriptsIcon->setValue(not_available); + mScriptsText->setText(not_available); + mDamageIcon->setValue(not_available); mDamageText->setText(not_available); mRegionNameText->setValue(not_available); mRegionTypeText->setValue(not_available); + mRegionRatingIcon->setValue(not_available); mRegionRatingText->setValue(not_available); mRegionOwnerText->setValue(not_available); mRegionGroupText->setValue(not_available); @@ -191,33 +207,6 @@ void LLPanelPlaceProfile::setInfoType(INFO_TYPE type) LLPanelPlaceInfo::setInfoType(type); } -// virtual -void LLPanelPlaceProfile::processParcelInfo(const LLParcelData& parcel_data) -{ - LLPanelPlaceInfo::processParcelInfo(parcel_data); - - // HACK: Flag 0x2 == adult region, - // Flag 0x1 == mature region, otherwise assume PG - std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG); - if (parcel_data.flags & 0x2) - { - rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT); - } - else if (parcel_data.flags & 0x1) - { - rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); - } - - mMaturityRatingText->setValue(rating); - mRatingText->setValue(rating); - - //update for_sale banner, here we should use DFQ_FOR_SALE instead of PF_FOR_SALE - //because we deal with remote parcel response format - bool is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) && - mInfoType == AGENT ? TRUE : FALSE; - mForSalePanel->setVisible(is_for_sale); -} - void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, LLViewerRegion* region, const LLVector3d& pos_global, @@ -238,19 +227,34 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, // HACK: Converting sim access flags to the format // returned by remote parcel response. - switch(region->getSimAccess()) + U8 sim_access = region->getSimAccess(); + switch(sim_access) { case SIM_ACCESS_MATURE: parcel_data.flags = 0x1; + + mParcelRatingIcon->setValue("parcel_drk_M"); + mRegionRatingIcon->setValue("parcel_drk_M"); break; case SIM_ACCESS_ADULT: parcel_data.flags = 0x2; + + mParcelRatingIcon->setValue("parcel_drk_R"); + mRegionRatingIcon->setValue("parcel_drk_R"); break; default: parcel_data.flags = 0; + + mParcelRatingIcon->setValue("parcel_drk_PG"); + mRegionRatingIcon->setValue("parcel_drk_PG"); } + + std::string rating = LLViewerRegion::accessToString(sim_access); + mParcelRatingText->setText(rating); + mRegionRatingText->setText(rating); + parcel_data.desc = parcel->getDesc(); parcel_data.name = parcel->getName(); parcel_data.sim_name = region->getName(); @@ -268,37 +272,45 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, // Processing parcel characteristics if (parcel->getParcelFlagAllowVoice()) { + mVoiceIcon->setValue("parcel_drk_Voice"); mVoiceText->setText(on); } else { + mVoiceIcon->setValue("parcel_drk_VoiceNo"); mVoiceText->setText(off); } if (!region->getBlockFly() && parcel->getAllowFly()) { + mFlyIcon->setValue("parcel_drk_Fly"); mFlyText->setText(on); } else { + mFlyIcon->setValue("parcel_drk_FlyNo"); mFlyText->setText(off); } if (region->getRestrictPushObject() || parcel->getRestrictPushObject()) { + mPushIcon->setValue("parcel_drk_PushNo"); mPushText->setText(off); } else { + mPushIcon->setValue("parcel_drk_Push"); mPushText->setText(on); } if (parcel->getAllowModify()) { + mBuildIcon->setValue("parcel_drk_Build"); mBuildText->setText(on); } else { + mBuildIcon->setValue("parcel_drk_BuildNo"); mBuildText->setText(off); } @@ -306,25 +318,28 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) || !parcel->getAllowOtherScripts()) { + mScriptsIcon->setValue("parcel_drk_ScriptsNo"); mScriptsText->setText(off); } else { + mScriptsIcon->setValue("parcel_drk_Scripts"); mScriptsText->setText(on); } if (region->getAllowDamage() || parcel->getAllowDamage()) { + mDamageIcon->setValue("parcel_drk_Damage"); mDamageText->setText(on); } else { + mDamageIcon->setValue("parcel_drk_DamageNo"); mDamageText->setText(off); } mRegionNameText->setText(region->getName()); mRegionTypeText->setText(region->getSimProductName()); - mRegionRatingText->setText(region->getSimAccessString()); // Determine parcel owner if (parcel->isPublic()) @@ -383,9 +398,6 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, &dwell); if (for_sale) { - // Adding "For Sale" flag in remote parcel response format. - parcel_data.flags |= DFQ_FOR_SALE; - const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); if(auth_buyer_id.notNull()) { @@ -403,6 +415,8 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, mSaleToText->setText(getString("anyone")); } + mForSalePanel->setVisible(for_sale); + const U8* sign = (U8*)getString("price_text").c_str(); const U8* sqm = (U8*)getString("area_text").c_str(); @@ -455,7 +469,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, mSelectedParcelID = parcel->getLocalID(); mLastSelectedRegionID = region->getRegionID(); - processParcelInfo(parcel_data); + LLPanelPlaceInfo::processParcelInfo(parcel_data); mYouAreHerePanel->setVisible(is_current_parcel); getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale); diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h index d8e4bcb6bdb..db54ff8af93 100644 --- a/indra/newview/llpanelplaceprofile.h +++ b/indra/newview/llpanelplaceprofile.h @@ -35,6 +35,7 @@ #include "llpanelplaceinfo.h" +class LLIconCtrl; class LLTextEditor; class LLPanelPlaceProfile : public LLPanelPlaceInfo @@ -49,8 +50,6 @@ class LLPanelPlaceProfile : public LLPanelPlaceInfo /*virtual*/ void setInfoType(INFO_TYPE type); - /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); - // Displays information about the currently selected parcel // without sending a request to the server. // If is_current_parcel true shows "You Are Here" banner. @@ -81,16 +80,24 @@ class LLPanelPlaceProfile : public LLPanelPlaceInfo LLTextBox* mParcelOwner; LLTextBox* mLastVisited; - LLTextBox* mRatingText; + LLIconCtrl* mParcelRatingIcon; + LLTextBox* mParcelRatingText; + LLIconCtrl* mVoiceIcon; LLTextBox* mVoiceText; + LLIconCtrl* mFlyIcon; LLTextBox* mFlyText; + LLIconCtrl* mPushIcon; LLTextBox* mPushText; + LLIconCtrl* mBuildIcon; LLTextBox* mBuildText; + LLIconCtrl* mScriptsIcon; LLTextBox* mScriptsText; + LLIconCtrl* mDamageIcon; LLTextBox* mDamageText; LLTextBox* mRegionNameText; LLTextBox* mRegionTypeText; + LLIconCtrl* mRegionRatingIcon; LLTextBox* mRegionRatingText; LLTextBox* mRegionOwnerText; LLTextBox* mRegionGroupText; diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 7e073f064d7..4dc65fa7363 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -289,33 +289,14 @@ left="0" top="0" width="275"> - <icon - follows="top|left" - height="16" - image_name="parcel_drk_M" - layout="topleft" - left="20" - name="icon_M" - top="0" - width="18" /> - <icon - follows="top|left" - height="16" - image_name="parcel_drk_R" - layout="topleft" - left="20" - name="icon_R" - top="0" - width="18" /> <icon follows="top|left" height="16" image_name="parcel_drk_PG" layout="topleft" left="20" - name="icon_PG" + name="rating_icon" top="0" - visible="false" width="18" /> <text follows="left|top" @@ -332,7 +313,7 @@ left_pad="0" name="rating_value" top_delta="0" - value="Mature" + value="unknown" width="120" /> <icon follows="top|left" @@ -340,19 +321,9 @@ image_name="parcel_drk_Voice" layout="topleft" left="20" - name="icon_Voice" + name="voice_icon" top_pad="5" width="22" /> - <icon - follows="top|left" - height="18" - image_name="parcel_drk_VoiceNo" - layout="topleft" - left="20" - name="icon_VoiceNo" - top_delta="0" - visible="false" - width="22" /> <text follows="left|top" height="18" @@ -377,19 +348,9 @@ image_name="parcel_drk_Fly" layout="topleft" left="20" - name="icon_Fly" + name="fly_icon" top_pad="3" width="22" /> - <icon - follows="top|left" - height="18" - image_name="parcel_drk_FlyNo" - layout="topleft" - left="20" - name="icon_FlyNo" - top_delta="0" - visible="false" - width="22" /> <text follows="left|top" height="16" @@ -413,18 +374,8 @@ image_name="parcel_drk_Push" layout="topleft" left="20" - name="icon_Push" + name="push_icon" top_pad="3" - visible="false" - width="22" /> - <icon - follows="top|left" - height="18" - image_name="parcel_drk_PushNo" - layout="topleft" - left="20" - name="icon_PushNo" - top_delta="0" width="22" /> <text follows="left|top" @@ -449,18 +400,9 @@ image_name="parcel_drk_Build" layout="topleft" left="20" - name="icon_Build" + name="build_icon" top_pad="3" width="22" /> - <icon - follows="top|left" - height="18" - image_name="parcel_drk_BuildNo" - layout="topleft" - left="20" - name="icon_BuildNo" - top_delta="0" - visible="false" /> <text follows="left|top" height="14" @@ -484,18 +426,9 @@ image_name="parcel_drk_Scripts" layout="topleft" left="20" - name="icon_Scripts" + name="scripts_icon" top_pad="3" width="22" /> - <icon - follows="top|left" - height="18" - image_name="parcel_drk_ScriptsNo" - layout="topleft" - left="20" - name="icon_ScriptsNo" - top_delta="0" - visible="false" /> <text follows="left|top" height="14" @@ -519,18 +452,9 @@ image_name="parcel_drk_Damage" layout="topleft" left="20" - name="icon_Damage" + name="damage_icon" top_pad="7" - visible="false" width="22" /> - <icon - follows="top|left" - height="18" - image_name="parcel_drk_DamageNo" - layout="topleft" - left="20" - name="icon_DamageNo" - top_delta="0" /> <text follows="left|top" height="14" @@ -622,33 +546,13 @@ top_pad="7" value="Rating:" width="80" /> - <icon - follows="top|left" - height="16" - image_name="parcel_drk_M" - layout="topleft" - left_pad="0" - name="icon_M" - width="18" /> - <icon - follows="top|left" - height="16" - image_name="parcel_drk_R" - layout="topleft" - left_delta="0" - name="icon_R" - top_delta="0" - visible="false" - width="18" /> <icon follows="top|left" height="16" image_name="parcel_drk_PG" layout="topleft" - left_delta="0" - name="icon_PG" - top_delta="0" - visible="false" + left_pad="0" + name="region_rating_icon" width="18" /> <text follows="left|top|right" -- GitLab From 380bb0ce09913ae05000c86fb0a0ed410ead1089 Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk <slitovchuk@productengine.com> Date: Wed, 4 Nov 2009 15:24:11 +0200 Subject: [PATCH 109/306] No ticket. Removed extra includes. Fixed copyright years. --HG-- branch : product-engine --- indra/newview/llpanellandmarkinfo.cpp | 5 +---- indra/newview/llpanellandmarkinfo.h | 2 +- indra/newview/llpanellandmarks.cpp | 2 +- indra/newview/llpanellandmarks.h | 2 +- indra/newview/llpanelpicks.cpp | 2 +- indra/newview/llpanelpicks.h | 2 +- indra/newview/llpanelplaceinfo.cpp | 7 +------ indra/newview/llpanelplaceinfo.h | 2 +- indra/newview/llpanelplaceprofile.cpp | 4 +--- indra/newview/llpanelplaceprofile.h | 2 +- indra/newview/llpanelplaces.cpp | 2 +- indra/newview/llpanelplaces.h | 2 +- indra/newview/llpanelplacestab.cpp | 2 +- indra/newview/llpanelplacestab.h | 2 +- indra/newview/llpanelteleporthistory.cpp | 2 +- indra/newview/llpanelteleporthistory.h | 2 +- 16 files changed, 16 insertions(+), 26 deletions(-) diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index fd6a41c5058..fe01fc63073 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2004-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -34,8 +34,6 @@ #include "llpanellandmarkinfo.h" -#include "llinventory.h" - #include "llcombobox.h" #include "lllineeditor.h" #include "lltextbox.h" @@ -44,7 +42,6 @@ #include "llagent.h" #include "llagentui.h" -#include "llinventorymodel.h" #include "lllandmarkactions.h" #include "llviewerinventory.h" #include "llviewerparcelmgr.h" diff --git a/indra/newview/llpanellandmarkinfo.h b/indra/newview/llpanellandmarkinfo.h index 03377986b31..73e0ddb9cc9 100644 --- a/indra/newview/llpanellandmarkinfo.h +++ b/indra/newview/llpanellandmarkinfo.h @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2004-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 5f717b51cc5..34c146826f5 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2001-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 0e7abb48650..d54761ed590 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -5,7 +5,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2001-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 6181531f82e..2bf04f96814 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2004-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index 06a0f0a0fdb..5a2754ad106 100644 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2004-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index e6d10be8582..c6006510158 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2004-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -38,8 +38,6 @@ #include "llsdutil.h" #include "llsecondlifeurls.h" -#include "llinventory.h" - #include "llsdutil_math.h" #include "llscrollcontainer.h" @@ -48,15 +46,12 @@ #include "llagent.h" #include "llavatarpropertiesprocessor.h" #include "llexpandabletextbox.h" -#include "llfloaterworldmap.h" -#include "llinventorymodel.h" #include "llpanelpick.h" #include "lltexturectrl.h" #include "llviewerinventory.h" #include "llviewerparcelmgr.h" #include "llviewerregion.h" #include "llviewertexteditor.h" -#include "llworldmap.h" LLPanelPlaceInfo::LLPanelPlaceInfo() : LLPanel(), diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h index c9e13475428..ec30397cff5 100644 --- a/indra/newview/llpanelplaceinfo.h +++ b/indra/newview/llpanelplaceinfo.h @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2004-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 814139607cc..b2a9f6f2513 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2004-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -36,8 +36,6 @@ #include "llparcel.h" -#include "llqueryflags.h" - #include "lliconctrl.h" #include "lllineeditor.h" #include "lltextbox.h" diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h index db54ff8af93..b3ef4acf511 100644 --- a/indra/newview/llpanelplaceprofile.h +++ b/indra/newview/llpanelplaceprofile.h @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2004-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 42e4a6e40b1..6f15e53299e 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2004-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index 39eb5261db4..8faed613f48 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2004-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab diff --git a/indra/newview/llpanelplacestab.cpp b/indra/newview/llpanelplacestab.cpp index 7c0a7b0cc4a..f5e7ff3c409 100644 --- a/indra/newview/llpanelplacestab.cpp +++ b/indra/newview/llpanelplacestab.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2004-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab diff --git a/indra/newview/llpanelplacestab.h b/indra/newview/llpanelplacestab.h index 1c70869414f..3f56dcb2839 100644 --- a/indra/newview/llpanelplacestab.h +++ b/indra/newview/llpanelplacestab.h @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2004-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 7dd9df674c0..437af1c4e71 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2001-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h index 7c1b4034324..b34d9e876c7 100644 --- a/indra/newview/llpanelteleporthistory.h +++ b/indra/newview/llpanelteleporthistory.h @@ -5,7 +5,7 @@ * * $LicenseInfo:firstyear=2009&license=viewergpl$ * - * Copyright (c) 2001-2009, Linden Research, Inc. + * Copyright (c) 2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab -- GitLab From 14af8485fd3759cda8b5471b0f6171b832d3e1b4 Mon Sep 17 00:00:00 2001 From: Mike Antipov <mantipov@productengine.com> Date: Wed, 4 Nov 2009 16:02:12 +0200 Subject: [PATCH 110/306] Fixed normal bug EXT-2061 ("All" list doesn't contain any friends while "Online" list isn't empty in "Friends" tab on People Panel) - added code to force fetching of Inventory "Friends/All" folder in case it is incomplete on startup. --HG-- branch : product-engine --- indra/newview/llfriendcard.cpp | 71 +++++++++++++++++++++++++++++++++- indra/newview/llfriendcard.h | 13 ++++++- 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index fbcaeee01f2..724b18ded2a 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -91,8 +91,44 @@ const LLUUID& get_folder_uuid(const LLUUID& parentFolderUUID, LLInventoryCollect return LLUUID::null; } + +// LLViewerInventoryCategory::fetchDescendents has it own period of fetching. +// for now it is FETCH_TIMER_EXPIRY = 10.0f; So made our period a bit more. +const F32 FETCH_FRIENDS_DESCENDENTS_PERIOD = 11.0f; + + +/** + * Intended to call passed callback after the specified period of time. + * + * Implemented to fix an issue when Inventory folders are in incomplete state. See EXT-2061, EXT-1935, EXT-813. + * For now it uses to periodically sync Inventory Friends/All folder with a Agent's Friends List + * until it is complete. + */ +class FriendListUpdater : public LLEventTimer +{ +public: + typedef boost::function<bool()> callback_t; + + FriendListUpdater(callback_t cb, F32 period) + : LLEventTimer(period) + , mCallback(cb) + { + mEventTimer.start(); + } + + virtual BOOL tick() // from LLEventTimer + { + return mCallback(); + } + +private: + callback_t mCallback; +}; + + // LLFriendCardsManager Constructor / Destructor LLFriendCardsManager::LLFriendCardsManager() +: mFriendsAllFolderCompleted(true) { LLAvatarTracker::instance().addObserver(this); } @@ -269,7 +305,7 @@ bool LLFriendCardsManager::isAnyFriendCategory(const LLUUID& catID) const return TRUE == gInventory.isObjectDescendentOf(catID, friendFolderID); } -void LLFriendCardsManager::syncFriendsFolder() +bool LLFriendCardsManager::syncFriendsFolder() { //lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" if they are absent LLFriendCardsManager::instance().ensureFriendFoldersExist(); @@ -297,11 +333,35 @@ void LLFriendCardsManager::syncFriendsFolder() // 2. Add missing Friend Cards for friends LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin(); llinfos << "try to build friends, count: " << all_buddies.size() << llendl; + mFriendsAllFolderCompleted = true; for(; buddy_it != all_buddies.end(); ++buddy_it) { const LLUUID& buddy_id = (*buddy_it).first; addFriendCardToInventory(buddy_id); } + + if (!mFriendsAllFolderCompleted) + { + forceFriendListIsLoaded(findFriendAllSubfolderUUIDImpl()); + + static bool timer_started = false; + if (!timer_started) + { + lldebugs << "Create and start timer to sync Inventory Friends All folder with Friends list" << llendl; + + // do not worry about destruction of the FriendListUpdater. + // It will be deleted by LLEventTimer::updateClass when FriendListUpdater::tick() returns true. + new FriendListUpdater(boost::bind(&LLFriendCardsManager::syncFriendsFolder, this), + FETCH_FRIENDS_DESCENDENTS_PERIOD); + } + timer_started = true; + } + else + { + lldebugs << "Friends/All Inventory folder is synchronized with the Agent's Friends List" << llendl; + } + + return mFriendsAllFolderCompleted; } void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const @@ -461,7 +521,9 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID) LLUUID friendListFolderID = findFriendAllSubfolderUUIDImpl(); if (shouldBeAdded && !invModel->isCategoryComplete(friendListFolderID)) { + mFriendsAllFolderCompleted = false; shouldBeAdded = false; + lldebugs << "Friends/All category is not completed" << llendl; } if (shouldBeAdded) { @@ -520,4 +582,11 @@ void LLFriendCardsManager::onFriendListUpdate(U32 changed_mask) } } +void LLFriendCardsManager::forceFriendListIsLoaded(const LLUUID& folder_id) const +{ + bool fetching_inventory = gInventory.fetchDescendentsOf(folder_id); + lldebugs << "Trying to fetch descendants of Friends/All Inventory folder, fetched: " + << fetching_inventory << llendl; +} + // EOF diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h index 6ada3428311..feea05bc1dc 100644 --- a/indra/newview/llfriendcard.h +++ b/indra/newview/llfriendcard.h @@ -89,8 +89,10 @@ class LLFriendCardsManager /** * Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List + * + * @return true - if folder is already synchronized, false otherwise. */ - void syncFriendsFolder(); + bool syncFriendsFolder(); /*! * \brief @@ -144,11 +146,20 @@ class LLFriendCardsManager void onFriendListUpdate(U32 changed_mask); + /** + * Force fetching of the Inventory folder specified by passed folder's LLUUID. + * + * It only sends request to server, server reply should be processed in other place. + * Because request can be sent via UDP we need to periodically check if request was completed with success. + */ + void forceFriendListIsLoaded(const LLUUID& folder_id) const; + private: typedef std::set<LLUUID> avatar_uuid_set_t; avatar_uuid_set_t mBuddyIDSet; + bool mFriendsAllFolderCompleted; }; #endif // LL_LLFRIENDCARD_H -- GitLab From e634f2f42d5a7165f4cab2910f144144bc7a31d0 Mon Sep 17 00:00:00 2001 From: Andrew Dyukov <adyukov@productengine.com> Date: Wed, 4 Nov 2009 16:13:47 +0200 Subject: [PATCH 111/306] Fixed problems caused by a160d0dfb897 --HG-- branch : product-engine --- indra/newview/llnavigationbar.cpp | 10 ++++++++-- .../skins/default/xui/en/panel_navigation_bar.xml | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index b35fd6134b7..1312949f540 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -274,8 +274,14 @@ void LLNavigationBar::draw() BOOL LLNavigationBar::handleRightMouseDown(S32 x, S32 y, MASK mask) { - show_navbar_context_menu(this,x,y); - return TRUE; + BOOL handled = childrenHandleRightMouseDown( x, y, mask) != NULL; + if(!handled && !gMenuHolder->hasVisibleMenu()) + { + show_navbar_context_menu(this,x,y); + handled = true; + } + + return handled; } void LLNavigationBar::onBackButtonClicked() diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 4175d21639b..a289ce3cf72 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -11,7 +11,7 @@ <icon follows="all" image_name="NavBar_BG" - mouse_opaque="true" + mouse_opaque="false" name="bg_icon" scale_image="true" visible="true" -- GitLab From 347f2614804d2b681358822c6bd018409aadde83 Mon Sep 17 00:00:00 2001 From: Dmitry Oleshko <doleshko@productengine.com> Date: Wed, 4 Nov 2009 16:35:48 +0200 Subject: [PATCH 112/306] implemented a normal Sub-task (EXT-988) Change indication of unread messges in chiclets --HG-- branch : product-engine --- indra/newview/llchiclet.cpp | 98 ++++++++++++++++--------------------- indra/newview/llchiclet.h | 32 +++++++++--- 2 files changed, 68 insertions(+), 62 deletions(-) diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 8a4650763fd..594385b4ef0 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -198,9 +198,38 @@ void LLChiclet::setValue(const LLSD& value) ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// -LLIMChiclet::LLIMChiclet(const LLChiclet::Params& p) +LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p) : LLChiclet(p) +, mNewMessagesIcon(NULL) +, mCounterCtrl(NULL) +{ + // initialize an overlay icon for new messages + LLIconCtrl::Params icon_params; + icon_params.visible = false; + icon_params.image = LLUI::getUIImage(p.new_messages_icon_name); + mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(icon_params); + // adjust size and position of an icon + LLRect chiclet_rect = p.rect; + LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.mTop, chiclet_rect.mRight, chiclet_rect.getHeight()/2); + // shift an icon a little bit to the right and up corner of a chiclet + overlay_icon_rect.translate(overlay_icon_rect.getWidth()/4, overlay_icon_rect.getHeight()/4); + mNewMessagesIcon->setRect(overlay_icon_rect); + addChild(mNewMessagesIcon); + + setShowCounter(false); +} + +void LLIMChiclet::setShowNewMessagesIcon(bool show) +{ + if(mNewMessagesIcon) + { + mNewMessagesIcon->setVisible(show); + } +} + +bool LLIMChiclet::getShowNewMessagesIcon() { + return mNewMessagesIcon->getVisible(); } void LLIMChiclet::onMouseDown() @@ -274,7 +303,7 @@ LLIMP2PChiclet::Params::Params() , show_speaker("show_speaker") { // *TODO Vadim: Get rid of hardcoded values. - rect(LLRect(0, 25, 45, 0)); + rect(LLRect(0, 25, 25, 0)); avatar_icon.name("avatar_icon"); avatar_icon.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP | FOLLOWS_BOTTOM); @@ -293,6 +322,7 @@ LLIMP2PChiclet::Params::Params() unread_notifications.v_pad(5); unread_notifications.text_color(LLColor4::white); unread_notifications.mouse_opaque(false); + unread_notifications.visible(false); speaker.name("speaker"); speaker.rect(LLRect(45, 25, 65, 0)); @@ -303,7 +333,6 @@ LLIMP2PChiclet::Params::Params() LLIMP2PChiclet::LLIMP2PChiclet(const Params& p) : LLIMChiclet(p) , mChicletIconCtrl(NULL) -, mCounterCtrl(NULL) , mSpeakerCtrl(NULL) , mPopupMenu(NULL) { @@ -322,28 +351,14 @@ LLIMP2PChiclet::LLIMP2PChiclet(const Params& p) mSpeakerCtrl = LLUICtrlFactory::create<LLChicletSpeakerCtrl>(speaker_params); addChild(mSpeakerCtrl); + sendChildToFront(mNewMessagesIcon); setShowSpeaker(p.show_speaker); } void LLIMP2PChiclet::setCounter(S32 counter) { mCounterCtrl->setCounter(counter); - - if(getShowCounter()) - { - LLRect counter_rect = mCounterCtrl->getRect(); - LLRect required_rect = mCounterCtrl->getRequiredRect(); - bool needs_resize = required_rect.getWidth() != counter_rect.getWidth(); - - if(needs_resize) - { - counter_rect.mRight = counter_rect.mLeft + required_rect.getWidth(); - mCounterCtrl->reshape(counter_rect.getWidth(), counter_rect.getHeight()); - mCounterCtrl->setRect(counter_rect); - - onChicletSizeChanged(); - } - } + setShowNewMessagesIcon(counter); } LLRect LLIMP2PChiclet::getRequiredRect() @@ -458,7 +473,7 @@ LLAdHocChiclet::Params::Params() , avatar_icon_color("avatar_icon_color", LLColor4::green) { // *TODO Vadim: Get rid of hardcoded values. - rect(LLRect(0, 25, 45, 0)); + rect(LLRect(0, 25, 25, 0)); avatar_icon.name("avatar_icon"); avatar_icon.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP | FOLLOWS_BOTTOM); @@ -477,6 +492,8 @@ LLAdHocChiclet::Params::Params() unread_notifications.v_pad(5); unread_notifications.text_color(LLColor4::white); unread_notifications.mouse_opaque(false); + unread_notifications.visible(false); + speaker.name("speaker"); speaker.rect(LLRect(45, 25, 65, 0)); @@ -487,7 +504,6 @@ LLAdHocChiclet::Params::Params() LLAdHocChiclet::LLAdHocChiclet(const Params& p) : LLIMChiclet(p) , mChicletIconCtrl(NULL) -, mCounterCtrl(NULL) , mSpeakerCtrl(NULL) , mPopupMenu(NULL) { @@ -508,6 +524,7 @@ LLAdHocChiclet::LLAdHocChiclet(const Params& p) mSpeakerCtrl = LLUICtrlFactory::create<LLChicletSpeakerCtrl>(speaker_params); addChild(mSpeakerCtrl); + sendChildToFront(mNewMessagesIcon); setShowSpeaker(p.show_speaker); } @@ -521,22 +538,7 @@ void LLAdHocChiclet::setSessionId(const LLUUID& session_id) void LLAdHocChiclet::setCounter(S32 counter) { mCounterCtrl->setCounter(counter); - - if(getShowCounter()) - { - LLRect counter_rect = mCounterCtrl->getRect(); - LLRect required_rect = mCounterCtrl->getRequiredRect(); - bool needs_resize = required_rect.getWidth() != counter_rect.getWidth(); - - if(needs_resize) - { - counter_rect.mRight = counter_rect.mLeft + required_rect.getWidth(); - mCounterCtrl->reshape(counter_rect.getWidth(), counter_rect.getHeight()); - mCounterCtrl->setRect(counter_rect); - - onChicletSizeChanged(); - } - } + setShowNewMessagesIcon(counter); } LLRect LLAdHocChiclet::getRequiredRect() @@ -565,7 +567,7 @@ BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) LLIMGroupChiclet::Params::Params() : group_icon("group_icon") { - rect(LLRect(0, 25, 45, 0)); + rect(LLRect(0, 25, 25, 0)); group_icon.name("group_icon"); @@ -581,6 +583,7 @@ LLIMGroupChiclet::Params::Params() unread_notifications.font_halign(LLFontGL::HCENTER); unread_notifications.v_pad(5); unread_notifications.text_color(LLColor4::white); + unread_notifications.visible(false); speaker.name("speaker"); speaker.rect(LLRect(45, 25, 65, 0)); @@ -592,7 +595,6 @@ LLIMGroupChiclet::LLIMGroupChiclet(const Params& p) : LLIMChiclet(p) , LLGroupMgrObserver(LLUUID::null) , mChicletIconCtrl(NULL) -, mCounterCtrl(NULL) , mSpeakerCtrl(NULL) , mPopupMenu(NULL) { @@ -611,6 +613,7 @@ LLIMGroupChiclet::LLIMGroupChiclet(const Params& p) mSpeakerCtrl = LLUICtrlFactory::create<LLChicletSpeakerCtrl>(speaker_params); addChild(mSpeakerCtrl); + sendChildToFront(mNewMessagesIcon); setShowSpeaker(p.show_speaker); } @@ -622,22 +625,7 @@ LLIMGroupChiclet::~LLIMGroupChiclet() void LLIMGroupChiclet::setCounter(S32 counter) { mCounterCtrl->setCounter(counter); - - if(getShowCounter()) - { - LLRect counter_rect = mCounterCtrl->getRect(); - LLRect required_rect = mCounterCtrl->getRequiredRect(); - bool needs_resize = required_rect.getWidth() != counter_rect.getWidth(); - - if(needs_resize) - { - counter_rect.mRight = counter_rect.mLeft + required_rect.getWidth(); - mCounterCtrl->reshape(counter_rect.getWidth(), counter_rect.getHeight()); - mCounterCtrl->setRect(counter_rect); - - onChicletSizeChanged(); - } - } + setShowNewMessagesIcon(counter); } LLRect LLIMGroupChiclet::getRequiredRect() diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index f82259c73e8..a830240b7d4 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -278,6 +278,14 @@ class LLIMChiclet : public LLChiclet TYPE_GROUP, TYPE_AD_HOC }; + struct Params : public LLInitParam::Block<Params, LLChiclet::Params> + { + Optional<std::string> new_messages_icon_name; + + Params() : new_messages_icon_name("new_messages_icon_name", "icn_voice-localchat.tga") + {} + }; + /*virtual*/ ~LLIMChiclet() {}; @@ -307,6 +315,16 @@ class LLIMChiclet : public LLChiclet */ virtual bool getShowSpeaker() {return mShowSpeaker;}; + /* + * Shows/hides overlay icon concerning new unread messages. + */ + virtual void setShowNewMessagesIcon(bool show); + + /* + * Returns visibility of overlay icon concerning new unread messages. + */ + virtual bool getShowNewMessagesIcon(); + /* * Draws border around chiclet. */ @@ -335,7 +353,7 @@ class LLIMChiclet : public LLChiclet protected: - LLIMChiclet(const LLChiclet::Params& p); + LLIMChiclet(const LLIMChiclet::Params& p); /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); @@ -343,6 +361,9 @@ class LLIMChiclet : public LLChiclet bool mShowSpeaker; + LLIconCtrl* mNewMessagesIcon; + LLChicletNotificationCounterCtrl* mCounterCtrl; + /** the id of another participant, either an avatar id or a group id*/ LLUUID mOtherParticipantId; @@ -374,7 +395,7 @@ class LLIMChiclet : public LLChiclet class LLIMP2PChiclet : public LLIMChiclet { public: - struct Params : public LLInitParam::Block<Params, LLChiclet::Params> + struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params> { Optional<LLChicletAvatarIconCtrl::Params> avatar_icon; @@ -436,7 +457,6 @@ class LLIMP2PChiclet : public LLIMChiclet private: LLChicletAvatarIconCtrl* mChicletIconCtrl; - LLChicletNotificationCounterCtrl* mCounterCtrl; LLChicletSpeakerCtrl* mSpeakerCtrl; LLMenuGL* mPopupMenu; }; @@ -447,7 +467,7 @@ class LLIMP2PChiclet : public LLIMChiclet class LLAdHocChiclet : public LLIMChiclet { public: - struct Params : public LLInitParam::Block<Params, LLChiclet::Params> + struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params> { Optional<LLChicletAvatarIconCtrl::Params> avatar_icon; @@ -497,7 +517,6 @@ class LLAdHocChiclet : public LLIMChiclet private: LLChicletAvatarIconCtrl* mChicletIconCtrl; - LLChicletNotificationCounterCtrl* mCounterCtrl; LLChicletSpeakerCtrl* mSpeakerCtrl; LLMenuGL* mPopupMenu; }; @@ -509,7 +528,7 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver { public: - struct Params : public LLInitParam::Block<Params, LLChiclet::Params> + struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params> { Optional<LLChicletGroupIconCtrl::Params> group_icon; @@ -578,7 +597,6 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver private: LLChicletGroupIconCtrl* mChicletIconCtrl; - LLChicletNotificationCounterCtrl* mCounterCtrl; LLChicletSpeakerCtrl* mSpeakerCtrl; LLMenuGL* mPopupMenu; }; -- GitLab From a1e7bef9e70312929b6c1b437a17954e6198c1db Mon Sep 17 00:00:00 2001 From: Eugene Mutavchi <emutavchi@productengine.com> Date: Wed, 4 Nov 2009 17:48:27 +0200 Subject: [PATCH 113/306] No ticket,has sorted xml attributes in alphabetical order. --HG-- branch : product-engine --- .../xui/en/panel_adhoc_control_panel.xml | 35 +++--- .../xui/en/panel_group_control_panel.xml | 44 ++++---- .../default/xui/en/panel_im_control_panel.xml | 100 ++++++++++-------- 3 files changed, 100 insertions(+), 79 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml index 0c1e777fa1b..8dbcfe6360a 100644 --- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml @@ -1,9 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - name="panel_im_control_panel" - width="180" + border="false" height="215" - border="false"> + name="panel_im_control_panel" + width="180"> + <avatar_list color="DkGray2" follows="left|top|right|bottom" @@ -16,24 +17,28 @@ show_info_btn="false" show_profile_btn="false" top="10" - width="180" /> + width="180"/> + <button - name="call_btn" + height="20" label="Call Group" left_delta="27" - width="125" - height="20" /> + name="call_btn" + width="125"/> + <button - name="end_call_btn" + height="20" label="Leave Call" - width="125" - height="20" - visible="false"/> + name="end_call_btn" + visible="false" + width="125"/> + <button enabled="false" - name="voice_ctrls_btn" - label="Open Voice Controls" - width="125" height="20" - visible="false"/> + label="Open Voice Controls" + name="voice_ctrls_btn" + visible="false" + width="125"/> + </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index 560d353d00d..737bb5bcb6d 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -1,9 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - name="panel_im_control_panel" - width="180" + border="false" height="238" - border="false"> + name="panel_im_control_panel" + width="180"> + <avatar_list color="DkGray2" follows="left|top|right|bottom" @@ -16,29 +17,34 @@ show_info_btn="false" show_profile_btn="false" top="10" - width="180" /> + width="180"/> + <button - name="group_info_btn" + height="20" label="Group Info" left_delta="27" - width="125" - height="20" /> + name="group_info_btn" + width="125"/> + <button - name="call_btn" + height="20" label="Call Group" - width="125" - height="20" /> + name="call_btn" + width="125"/> + <button - name="end_call_btn" + height="20" label="Leave Call" - width="125" - height="20" - visible="false"/> + name="end_call_btn" + visible="false" + width="125"/> + <button - enabled="false" - name="voice_ctrls_btn" - label="Open Voice Controls" - width="125" + enabled="false" height="20" - visible="false"/> + label="Open Voice Controls" + name="voice_ctrls_btn" + visible="false" + width="125"/> + </panel> 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 7308ca3c29e..35be31983cc 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 @@ -1,32 +1,37 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="panel_im_control_panel" - width="128" - height="327" - border="false"> +<panel + border="false" + height="327" + name="panel_im_control_panel" + width="128"> - <avatar_icon name="avatar_icon" - follows="left|top" - left_delta="3" - width="125" - height="125" /> + <avatar_icon + follows="left|top" + height="125" + left_delta="3" + name="avatar_icon" + width="125"/> - <button name="view_profile_btn" - follows="left|bottom" - label="View Profile" - width="125" - height="20" /> + <button + follows="left|bottom" + height="20" + label="View Profile" + name="view_profile_btn" + width="125"/> - <button name="add_friend_btn" - follows="left|bottom" - label="Add Friend" - width="125" - height="20" /> + <button + follows="left|bottom" + height="20" + label="Add Friend" + name="add_friend_btn" + width="125"/> - <button name="call_btn" - follows="left|bottom" - label="Call" - width="125" - height="20" /> + <button + follows="left|bottom" + height="20" + label="Call" + name="call_btn" + width="125"/> <button follows="left|bottom" @@ -34,31 +39,36 @@ label="Leave Call" name="end_call_btn" visible="false" - width="125" /> + width="125"/> - <button - enabled="false" + <button + enabled="false" follows="left|bottom" - name="voice_ctrls_btn" + height="20" label="Open Voice Controls" - width="125" + name="voice_ctrls_btn" + visible="false" + width="125"/> + + <button + follows="left|bottom" + height="20" + label="Teleport" + name="teleport_btn" + width="125"/> + + <button + follows="left|bottom" height="20" - visible="false"/> + label="Share" + name="share_btn" + width="125"/> - <button name="teleport_btn" - follows="left|bottom" - label="Teleport" - width="125" - height="20" /> - <button name="share_btn" - follows="left|bottom" - label="Share" - width="125" - height="20" /> - <button name="pay_btn" - follows="left|bottom" - label="Pay" - width="125" - height="20" /> + <button + follows="left|bottom" + height="20" + label="Pay" + name="pay_btn" + width="125"/> </panel> -- GitLab From 0fd7ff59f58dc9c5d9b043830d513020ac7a6cdd Mon Sep 17 00:00:00 2001 From: Eugene Mutavchi <emutavchi@productengine.com> Date: Wed, 4 Nov 2009 18:19:32 +0200 Subject: [PATCH 114/306] Implemented normal sub-task EXT-2142 (Call, End Call and Oen Voice Controls buttons should be located on their own panel at the bottom of the control panel (all types of IMs)) --HG-- branch : product-engine --- .../default/xui/en/floater_im_session.xml | 10 +- .../xui/en/panel_adhoc_control_panel.xml | 51 +++++--- .../xui/en/panel_group_control_panel.xml | 60 +++++---- .../default/xui/en/panel_im_control_panel.xml | 117 ++++++++++-------- 4 files changed, 139 insertions(+), 99 deletions(-) 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 88aca005cfe..8eeff0a9e42 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -12,13 +12,13 @@ can_dock="true" can_minimize="true" visible="true" - width="400" + width="520" can_resize="true" min_width="200" min_height="150"> <layout_stack follows="left|top|right|bottom" height="344" - width="400" + width="520" layout="topleft" orientation="horizontal" name="im_panels" @@ -34,7 +34,7 @@ auto_resize="false" user_resize="false" /> <layout_panel height="344" - width="235" + width="355" left_delta="146" top="0" user_resize="false"> @@ -61,9 +61,9 @@ name="chat_history" parse_highlights="true" allow_html="true" - width="230"> + width="350"> </chat_history> - <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="225"> + <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="345"> </line_editor> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml index 8dbcfe6360a..52017218d6c 100644 --- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml @@ -19,26 +19,39 @@ top="10" width="180"/> - <button - height="20" - label="Call Group" - left_delta="27" - name="call_btn" - width="125"/> + <panel + background_visible="true" + bg_alpha_color="0.2 0.2 0.2 1" + border="false" + bottom="1" + follows="left|bottom" + height="78" + left="0" + name="panel_buttons" + width="180"> - <button - height="20" - label="Leave Call" - name="end_call_btn" - visible="false" - width="125"/> + <button + height="20" + label="Call Group" + left_delta="27" + name="call_btn" + width="125"/> - <button - enabled="false" - height="20" - label="Open Voice Controls" - name="voice_ctrls_btn" - visible="false" - width="125"/> + <button + height="20" + label="Leave Call" + name="end_call_btn" + visible="false" + width="125"/> + + <button + enabled="false" + height="20" + label="Open Voice Controls" + name="voice_ctrls_btn" + visible="false" + width="125"/> + + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index 737bb5bcb6d..daa44ac75ce 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -19,32 +19,44 @@ top="10" width="180"/> - <button - height="20" - label="Group Info" - left_delta="27" - name="group_info_btn" - width="125"/> + <panel + background_visible="true" + bg_alpha_color="0.2 0.2 0.2 1" + border="false" + bottom="1" + follows="left|bottom" + height="98" + left="0" + name="panel_buttons" + width="180"> - <button - height="20" - label="Call Group" - name="call_btn" - width="125"/> + <button + height="20" + label="Group Info" + left_delta="28" + name="group_info_btn" + width="125"/> - <button - height="20" - label="Leave Call" - name="end_call_btn" - visible="false" - width="125"/> + <button + height="20" + label="Call Group" + name="call_btn" + width="125"/> - <button - enabled="false" - height="20" - label="Open Voice Controls" - name="voice_ctrls_btn" - visible="false" - width="125"/> + <button + height="20" + label="Leave Call" + name="end_call_btn" + visible="false" + width="125"/> + <button + enabled="false" + height="20" + label="Open Voice Controls" + name="voice_ctrls_btn" + visible="false" + width="125"/> + + </panel> </panel> 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 35be31983cc..d144d71dcee 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 @@ -2,73 +2,88 @@ <panel border="false" height="327" + layout="topleft" name="panel_im_control_panel" - width="128"> + width="131"> <avatar_icon follows="left|top" height="125" left_delta="3" name="avatar_icon" + top="-10" width="125"/> - <button + <panel + background_visible="true" + bg_alpha_color="0.2 0.2 0.2 1" + border="false" + bottom="1" follows="left|bottom" - height="20" - label="View Profile" - name="view_profile_btn" - width="125"/> + height="195" + left="0" + name="panel_buttons" + width="131"> - <button - follows="left|bottom" - height="20" - label="Add Friend" - name="add_friend_btn" - width="125"/> + <button + follows="left|bottom" + height="20" + label="View Profile" + left_delta="3" + name="view_profile_btn" + width="125"/> - <button - follows="left|bottom" - height="20" - label="Call" - name="call_btn" - width="125"/> + <button + follows="left|bottom" + height="20" + label="Add Friend" + name="add_friend_btn" + width="125"/> - <button - follows="left|bottom" - height="20" - label="Leave Call" - name="end_call_btn" - visible="false" - width="125"/> + <button + follows="left|bottom" + height="20" + label="Call" + name="call_btn" + width="125"/> - <button - enabled="false" - follows="left|bottom" - height="20" - label="Open Voice Controls" - name="voice_ctrls_btn" - visible="false" - width="125"/> + <button + follows="left|bottom" + height="20" + label="Leave Call" + name="end_call_btn" + visible="false" + width="125"/> - <button - follows="left|bottom" - height="20" - label="Teleport" - name="teleport_btn" - width="125"/> + <button + enabled="false" + follows="left|bottom" + height="20" + label="Open Voice Controls" + name="voice_ctrls_btn" + visible="false" + width="125"/> - <button - follows="left|bottom" - height="20" - label="Share" - name="share_btn" - width="125"/> + <button + follows="left|bottom" + height="20" + label="Teleport" + name="teleport_btn" + width="125"/> - <button - follows="left|bottom" - height="20" - label="Pay" - name="pay_btn" - width="125"/> + <button + follows="left|bottom" + height="20" + label="Share" + name="share_btn" + width="125"/> + + <button + follows="left|bottom" + height="20" + label="Pay" + name="pay_btn" + width="125"/> + </panel> </panel> -- GitLab From 8346cd6806f479053a5b81b496dbb9b88ed26bb5 Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk <slitovchuk@productengine.com> Date: Wed, 4 Nov 2009 19:53:17 +0200 Subject: [PATCH 115/306] Fixed normal bug EXT-2192 "Remove "Share" button from all Places Tabs (including Place/Landmark info)". - Removed "Share" button and resized other buttons to take its place. --HG-- branch : product-engine --- indra/newview/llpanelplaces.cpp | 11 ----------- indra/newview/llpanelplaces.h | 2 -- indra/newview/llpanelplacestab.cpp | 1 - indra/newview/llpanelplacestab.h | 3 --- .../skins/default/xui/en/panel_places.xml | 17 +++-------------- 5 files changed, 3 insertions(+), 31 deletions(-) diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 6f15e53299e..0784e4555f8 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -160,9 +160,6 @@ BOOL LLPanelPlaces::postBuild() mShowOnMapBtn = getChild<LLButton>("map_btn"); mShowOnMapBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onShowOnMapButtonClicked, this)); - - mShareBtn = getChild<LLButton>("share_btn"); - //mShareBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onShareButtonClicked, this)); mEditBtn = getChild<LLButton>("edit_btn"); mEditBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); @@ -413,13 +410,6 @@ void LLPanelPlaces::onTabSelected() mActivePanel->updateVerbs(); } -/* -void LLPanelPlaces::onShareButtonClicked() -{ - // TODO: Launch the "Things" Share wizard -} -*/ - void LLPanelPlaces::onTeleportButtonClicked() { LLPanelPlaceInfo* panel = getCurrentInfoPanel(); @@ -852,7 +842,6 @@ void LLPanelPlaces::updateVerbs() mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); - mShareBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); mOverflowBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); mEditBtn->setVisible(mPlaceInfoType == LANDMARK_INFO_TYPE && !isLandmarkEditModeOn); mSaveBtn->setVisible(isLandmarkEditModeOn); diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index 8faed613f48..0d97353b661 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -73,7 +73,6 @@ class LLPanelPlaces : public LLPanel void onFilterEdit(const std::string& search_string, bool force_filter); void onTabSelected(); - //void onShareButtonClicked(); void onTeleportButtonClicked(); void onShowOnMapButtonClicked(); void onEditButtonClicked(); @@ -105,7 +104,6 @@ class LLPanelPlaces : public LLPanel LLButton* mTeleportBtn; LLButton* mShowOnMapBtn; - LLButton* mShareBtn; LLButton* mEditBtn; LLButton* mSaveBtn; LLButton* mCancelBtn; diff --git a/indra/newview/llpanelplacestab.cpp b/indra/newview/llpanelplacestab.cpp index f5e7ff3c409..42c871a41aa 100644 --- a/indra/newview/llpanelplacestab.cpp +++ b/indra/newview/llpanelplacestab.cpp @@ -51,7 +51,6 @@ bool LLPanelPlacesTab::isTabVisible() void LLPanelPlacesTab::setPanelPlacesButtons(LLPanelPlaces* panel) { - //mShareBtn = panel->getChild<LLButton>("share_btn"); mTeleportBtn = panel->getChild<LLButton>("teleport_btn"); mShowOnMapBtn = panel->getChild<LLButton>("map_btn"); } diff --git a/indra/newview/llpanelplacestab.h b/indra/newview/llpanelplacestab.h index 3f56dcb2839..458694d766d 100644 --- a/indra/newview/llpanelplacestab.h +++ b/indra/newview/llpanelplacestab.h @@ -44,10 +44,8 @@ class LLPanelPlacesTab : public LLPanel virtual void onSearchEdit(const std::string& string) = 0; virtual void updateVerbs() = 0; // Updates buttons at the bottom of Places panel - //virtual void onShare() = 0; virtual void onShowOnMap() = 0; virtual void onTeleport() = 0; - //virtual void onCopySLURL() = 0; bool isTabVisible(); // Check if parent TabContainer is visible. @@ -58,7 +56,6 @@ class LLPanelPlacesTab : public LLPanel const LLUUID& snapshot_id, bool teleport); protected: - //LLButton* mShareBtn; LLButton* mTeleportBtn; LLButton* mShowOnMapBtn; }; diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index 87ac5be74a1..488b9582d55 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -79,7 +79,7 @@ background_visible="true" left="5" name="teleport_btn" top="0" - width="77" /> + width="100" /> <button follows="bottom|left" font="SansSerifSmall" @@ -89,18 +89,7 @@ background_visible="true" left_pad="5" name="map_btn" top="0" - width="50" /> - <button - enabled="false" - follows="bottom|left" - font="SansSerifSmall" - height="19" - label="Share" - layout="topleft" - left_pad="5" - name="share_btn" - top="0" - width="60" /> + width="70" /> <button follows="bottom|left" font="SansSerifSmall" @@ -110,7 +99,7 @@ background_visible="true" left_pad="5" name="edit_btn" top="0" - width="50" /> + width="70" /> <button follows="bottom|right" font="SansSerifSmall" -- GitLab From 8f58f4e681a19a66c9c2bc83a11d5d2a6367661c Mon Sep 17 00:00:00 2001 From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com> Date: Wed, 4 Nov 2009 13:04:55 -0500 Subject: [PATCH 116/306] Fix for EXT-2086 & EXT-2087 - No Make Outfit button & Save As behaving as make outfit. Created a dedicated make outfit button, and made save as go back to saving a copy of the current wearable. -Reviewed by nyx --- .../newview/skins/default/xui/en/floater_customize.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml index 07d76f48100..c021dd79de1 100644 --- a/indra/newview/skins/default/xui/en/floater_customize.xml +++ b/indra/newview/skins/default/xui/en/floater_customize.xml @@ -3378,6 +3378,16 @@ scratch and wear it. layout="topleft" name="panel_list" /> </scroll_container> + <button + bottom="536" + follows="right|bottom" + height="20" + label="Make Outfit" + label_selected="Make Outfit" + layout="topleft" + name="make_outfit_btn" + right="-216" + width="100" /> <button bottom="536" follows="right|bottom" -- GitLab From f59c8b5e4e2625930e24ea28cd8e3a713cffed43 Mon Sep 17 00:00:00 2001 From: Sergey Borushevsky <sborushevsky@productengine.com> Date: Wed, 4 Nov 2009 20:09:06 +0200 Subject: [PATCH 117/306] Implemented normal task EXT-2149 (IM Text Editors should display grayed text "TO [avatar_name/group_name/ad-hoc conference]") --HG-- branch : product-engine --- indra/llui/lllineeditor.h | 2 ++ indra/newview/llimfloater.cpp | 12 ++++++++---- .../skins/default/xui/en/floater_im_session.xml | 8 +++++++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 3d7bbdff893..d3daa941cfe 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -172,6 +172,8 @@ class LLLineEditor virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text ); void setLabel(const LLStringExplicit &new_label) { mLabel = new_label; } + const std::string& getLabel() { return mLabel.getString(); } + void setText(const LLStringExplicit &new_text); const std::string& getText() const { return mText.getString(); } diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 19fa66fd0e4..85863ed85bf 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -225,6 +225,7 @@ BOOL LLIMFloater::postBuild() // enable line history support for instant message bar mInputEditor->setEnableLineHistory(TRUE); + mInputEditor->setFocusReceivedCallback( boost::bind(onInputEditorFocusReceived, _1, this) ); mInputEditor->setFocusLostCallback( boost::bind(onInputEditorFocusLost, _1, this) ); mInputEditor->setKeystrokeCallback( onInputEditorKeystroke, this ); @@ -232,14 +233,17 @@ BOOL LLIMFloater::postBuild() mInputEditor->setRevertOnEsc( FALSE ); mInputEditor->setReplaceNewlinesWithSpaces( FALSE ); - childSetCommitCallback("chat_editor", onSendMsg, this); - - mChatHistory = getChild<LLChatHistory>("chat_history"); - std::string session_name(LLIMModel::instance().getName(mSessionID)); + + mInputEditor->setLabel(mInputEditor->getLabel() + " " + session_name); + LLStringUtil::toUpper(session_name); setTitle(session_name); + childSetCommitCallback("chat_editor", onSendMsg, this); + + mChatHistory = getChild<LLChatHistory>("chat_history"); + setDocked(true); mTypingStart = LLTrans::getString("IM_typing_start_string"); 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 8eeff0a9e42..1585d976b36 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -63,7 +63,13 @@ allow_html="true" width="350"> </chat_history> - <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="345"> + <line_editor + follows="left|right" + height="20" + label="To" + layout="topleft" + name="chat_editor" + width="345"> </line_editor> </layout_panel> </layout_stack> -- GitLab From ec8e27b8bf3cdc5056ecd1492b515e4ca79ad4f6 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Wed, 4 Nov 2009 13:14:57 -0500 Subject: [PATCH 118/306] Remove existing wearables of a type when putting on new ones. This will need to be revisited when we go to multi-wearables. --- indra/newview/llappearancemgr.cpp | 40 +++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 8d0f11e021e..382947e4647 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -300,14 +300,25 @@ struct LLWearableHoldingPattern { LLInventoryModel::item_array_t new_items; std::set<LLUUID> items_seen; - for (S32 i=0; i<items.count(); i++) + std::deque<LLViewerInventoryItem*> tmp_list; + // Traverse from the front and keep the first of each item + // encountered, so we actually keep the *last* of each duplicate + // item. This is needed to give the right priority when adding + // duplicate items to an existing outfit. + for (S32 i=items.count()-1; i>=0; i--) { LLViewerInventoryItem *item = items.get(i); LLUUID item_id = item->getLinkedUUID(); if (items_seen.find(item_id)!=items_seen.end()) continue; items_seen.insert(item_id); - new_items.push_back(item); + tmp_list.push_front(item); + } + for (std::deque<LLViewerInventoryItem*>::iterator it = tmp_list.begin(); + it != tmp_list.end(); + ++it) + { + new_items.put(*it); } items = new_items; } @@ -1068,9 +1079,21 @@ void LLAppearanceManager::wearOutfitByName(const std::string& name) //dec_busy_count(); } +bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventoryItem *b) +{ + return (a->isWearableType() && b->isWearableType() && + (a->getWearableType() == b->getWearableType())); +} /* static */ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) { + LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item); + if (!vitem) + { + llwarns << "not an llviewerinventoryitem, failed" << llendl; + return; + } + LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; gInventory.collectDescendents(LLAppearanceManager::getCOF(), @@ -1080,12 +1103,19 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) bool linked_already = false; for (S32 i=0; i<item_array.count(); i++) { - const LLInventoryItem* inv_item = item_array.get(i).get(); + const LLViewerInventoryItem* inv_item = item_array.get(i).get(); if (inv_item->getLinkedUUID() == item->getLinkedUUID()) { linked_already = true; break; } + // Are of same type but are not the same - new item will replace old. + if (areMatchingWearables(vitem,inv_item)) + { + gAgentWearables.removeWearable(inv_item->getWearableType(),true,0); + gInventory.purgeObject(inv_item->getUUID()); + gInventory.notifyObservers(); + } } if (linked_already) { @@ -1096,9 +1126,9 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) { LLPointer<LLInventoryCallback> cb = do_update ? new ModifiedCOFCallback : 0; link_inventory_item( gAgent.getID(), - item->getLinkedUUID(), + vitem->getLinkedUUID(), getCOF(), - item->getName(), + vitem->getName(), LLAssetType::AT_LINK, cb); } -- GitLab From 7383cfe14bd1522d921b96c6ab0804f888f8c5c0 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 4 Nov 2009 13:18:29 -0500 Subject: [PATCH 119/306] EXT-2216 : Task properties sidepanel Guts of task properteis sidepanel created. --HG-- branch : avatar-pipeline --- indra/newview/CMakeLists.txt | 2 + indra/newview/llsidepanelinventory.cpp | 59 +- indra/newview/llsidepanelinventory.h | 16 +- indra/newview/llsidepaneliteminfo.cpp | 1 - indra/newview/llsidepaneliteminfo.h | 30 +- indra/newview/llsidepaneltaskinfo.cpp | 1066 +++++++++++++++++ indra/newview/llsidepaneltaskinfo.h | 113 ++ indra/newview/llviewermenu.cpp | 17 +- .../default/xui/en/sidepanel_inventory.xml | 14 + .../default/xui/en/sidepanel_item_info.xml | 30 - 10 files changed, 1275 insertions(+), 73 deletions(-) create mode 100644 indra/newview/llsidepaneltaskinfo.cpp create mode 100644 indra/newview/llsidepaneltaskinfo.h diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 8882f02df47..c490c31393c 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -371,6 +371,7 @@ set(viewer_SOURCE_FILES llselectmgr.cpp llsidepanelinventory.cpp llsidepaneliteminfo.cpp + llsidepaneltaskinfo.cpp llsidetray.cpp llsidetraypanelcontainer.cpp llsky.cpp @@ -856,6 +857,7 @@ set(viewer_HEADER_FILES llselectmgr.h llsidepanelinventory.h llsidepaneliteminfo.h + llsidepaneltaskinfo.h llsidetray.h llsidetraypanelcontainer.h llsky.h diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 2ea84efd301..9b67bc701da 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -38,6 +38,7 @@ #include "llinventorypanel.h" #include "llpanelmaininventory.h" #include "llsidepaneliteminfo.h" +#include "llsidepaneltaskinfo.h" #include "lltabcontainer.h" static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); @@ -89,6 +90,13 @@ BOOL LLSidepanelInventory::postBuild() LLButton* back_btn = mItemPanel->getChild<LLButton>("back_btn"); back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); } + + // UI elements from task panel + { + mTaskPanel = getChild<LLSidepanelTaskInfo>("sidepanel__task_panel"); + LLButton* back_btn = mTaskPanel->getChild<LLButton>("back_btn"); + back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); + } return TRUE; } @@ -103,14 +111,16 @@ void LLSidepanelInventory::onOpen(const LLSD& key) if (key.has("id")) { mItemPanel->setItemID(key["id"].asUUID()); + if (key.has("object")) + { + mItemPanel->setObjectID(key["object"].asUUID()); + } + showItemInfoPanel(); } - - if (key.has("object")) + if (key.has("task")) { - mItemPanel->setObjectID(key["object"].asUUID()); + showTaskInfoPanel(); } - - toggleItemInfoPanel(TRUE); } void LLSidepanelInventory::onInfoButtonClicked() @@ -120,7 +130,7 @@ void LLSidepanelInventory::onInfoButtonClicked() { mItemPanel->reset(); mItemPanel->setItemID(item->getUUID()); - toggleItemInfoPanel(TRUE); + showItemInfoPanel(); } } @@ -161,8 +171,7 @@ void LLSidepanelInventory::onOverflowButtonClicked() void LLSidepanelInventory::onBackButtonClicked() { - toggleItemInfoPanel(FALSE); - updateVerbs(); + showInventoryPanel(); } void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) @@ -170,21 +179,29 @@ void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> updateVerbs(); } -void LLSidepanelInventory::toggleItemInfoPanel(BOOL visible) +void LLSidepanelInventory::showItemInfoPanel() { - mItemPanel->setVisible(visible); - mInventoryPanel->setVisible(!visible); + mItemPanel->setVisible(TRUE); + mTaskPanel->setVisible(FALSE); + mInventoryPanel->setVisible(FALSE); - if (visible) - { - mItemPanel->dirty(); - mItemPanel->setEditMode(FALSE); - /* - LLRect rect = getRect(); - LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mInventoryPanel->getRect().mBottom); - mItemPanel->reshape(new_rect.getWidth(),new_rect.getHeight()); - */ - } + mItemPanel->dirty(); + mItemPanel->setEditMode(FALSE); +} + +void LLSidepanelInventory::showTaskInfoPanel() +{ + mItemPanel->setVisible(FALSE); + mTaskPanel->setVisible(TRUE); + mInventoryPanel->setVisible(FALSE); +} + +void LLSidepanelInventory::showInventoryPanel() +{ + mItemPanel->setVisible(FALSE); + mTaskPanel->setVisible(FALSE); + mInventoryPanel->setVisible(TRUE); + updateVerbs(); } void LLSidepanelInventory::updateVerbs() diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index f9fe3e4e0e9..681af7fafab 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -34,10 +34,11 @@ #include "llpanel.h" +class LLFolderViewItem; class LLInventoryItem; -class LLSidepanelItemInfo; class LLPanelMainInventory; -class LLFolderViewItem; +class LLSidepanelItemInfo; +class LLSidepanelTaskInfo; class LLSidepanelInventory : public LLPanel { @@ -55,12 +56,19 @@ class LLSidepanelInventory : public LLPanel // "wear", "teleport", etc. void performActionOnSelection(const std::string &action); - void toggleItemInfoPanel(BOOL visible); + void showItemInfoPanel(); + void showTaskInfoPanel(); + void showInventoryPanel(); void updateVerbs(); // // UI Elements // +private: + LLPanel* mInventoryPanel; // Main inventory view + LLSidepanelItemInfo* mItemPanel; // Individual item view + LLSidepanelTaskInfo* mTaskPanel; // Individual in-world object view + protected: void onInfoButtonClicked(); void onShareButtonClicked(); @@ -77,8 +85,6 @@ class LLSidepanelInventory : public LLPanel LLButton* mTeleportBtn; LLButton* mOverflowBtn; - LLPanel* mInventoryPanel; // Main inventory view - LLSidepanelItemInfo* mItemPanel; // Individual item view }; #endif //LL_LLSIDEPANELINVENTORY_H diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 0b00c7fbe90..c857afc6527 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -261,7 +261,6 @@ void LLSidepanelItemInfo::draw() { if (mDirty) { - // RN: clear dirty first because refresh can set dirty to TRUE mDirty = FALSE; refresh(); } diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h index 21ca63894cf..9f5ab402eab 100644 --- a/indra/newview/llsidepaneliteminfo.h +++ b/indra/newview/llsidepaneliteminfo.h @@ -36,6 +36,7 @@ #include <map> #include "llmultifloater.h" #include "lliconctrl.h" +#include "llpermissions.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLSidepanelItemInfo @@ -45,6 +46,7 @@ class LLButton; class LLInventoryItem; class LLItemPropertiesObserver; +class LLViewerObject; class LLSidepanelItemInfo : public LLPanel { @@ -65,31 +67,24 @@ class LLSidepanelItemInfo : public LLPanel protected: LLInventoryItem* findItem() const; + LLViewerObject* findObject() const; void refresh(); void refreshFromItem(LLInventoryItem* item); + void refreshFromPermissions(const LLPermissions& perm); void updateVerbs(); + BOOL isUpdatingObject() const; private: - // The item id of the inventory item in question. - LLUUID mItemID; - - // mObjectID will have a value if it is associated with a task in - // the world, and will be == LLUUID::null if it's in the agent - // inventory. - LLUUID mObjectID; - - BOOL mDirty; - BOOL mEditMode; - - LLItemPropertiesObserver* mPropertiesObserver; + LLUUID mItemID; // inventory UUID for the inventory item. + LLUUID mObjectID; // in-world task UUID, or null if in agent inventory. + BOOL mDirty; // item properties need to be updated + BOOL mEditMode; // if we're in edit mode + LLItemPropertiesObserver* mPropertiesObserver; // for syncing changes to item // // UI Elements // protected: - void onEditButtonClicked(); - void onSaveButtonClicked(); - void onCancelButtonClicked(); void onClickCreator(); void onClickOwner(); void onCommitName(); @@ -98,6 +93,11 @@ class LLSidepanelItemInfo : public LLPanel void onCommitSaleInfo(); void onCommitSaleType(); void updateSaleInfo(); + +protected: + void onEditButtonClicked(); + void onSaveButtonClicked(); + void onCancelButtonClicked(); private: LLButton* mEditBtn; LLButton* mSaveBtn; diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp new file mode 100644 index 00000000000..203fc35187b --- /dev/null +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -0,0 +1,1066 @@ +/** + * @file llsidepaneltaskinfo.cpp + * @brief LLSidepanelTaskInfo class implementation + * This class represents the panel in the build view for + * viewing/editing object names, owners, permissions, etc. + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llsidepaneltaskinfo.h" + +#include "lluuid.h" +#include "llpermissions.h" +#include "llcategory.h" +#include "llclickaction.h" +#include "llfocusmgr.h" +#include "llstring.h" + +#include "llviewerwindow.h" +#include "llresmgr.h" +#include "lltextbox.h" +#include "llbutton.h" +#include "llcheckboxctrl.h" +#include "llviewerobject.h" +#include "llselectmgr.h" +#include "llagent.h" +#include "llstatusbar.h" // for getBalance() +#include "lllineeditor.h" +#include "llcombobox.h" +#include "lluiconstants.h" +#include "lldbstrings.h" +#include "llfloatergroups.h" +#include "llfloaterreg.h" +#include "llavataractions.h" +#include "llnamebox.h" +#include "llviewercontrol.h" +#include "lluictrlfactory.h" +#include "llspinctrl.h" +#include "roles_constants.h" +#include "llgroupactions.h" + +///---------------------------------------------------------------------------- +/// Class llsidepaneltaskinfo +///---------------------------------------------------------------------------- + +static LLRegisterPanelClassWrapper<LLSidepanelTaskInfo> t_task_info("sidepanel_task_info"); + +// Default constructor +LLSidepanelTaskInfo::LLSidepanelTaskInfo() : + LLPanel() +{ + setMouseOpaque(FALSE); +} + +BOOL LLSidepanelTaskInfo::postBuild() +{ + childSetCommitCallback("Object Name",LLSidepanelTaskInfo::onCommitName,this); + childSetPrevalidate("Object Name",LLLineEditor::prevalidatePrintableNotPipe); + childSetCommitCallback("Object Description",LLSidepanelTaskInfo::onCommitDesc,this); + childSetPrevalidate("Object Description",LLLineEditor::prevalidatePrintableNotPipe); + + + getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this)); + + childSetCommitCallback("checkbox share with group",LLSidepanelTaskInfo::onCommitGroupShare,this); + + childSetAction("button deed",LLSidepanelTaskInfo::onClickDeedToGroup,this); + + childSetCommitCallback("checkbox allow everyone move",LLSidepanelTaskInfo::onCommitEveryoneMove,this); + + childSetCommitCallback("checkbox allow everyone copy",LLSidepanelTaskInfo::onCommitEveryoneCopy,this); + + childSetCommitCallback("checkbox for sale",LLSidepanelTaskInfo::onCommitSaleInfo,this); + + childSetCommitCallback("sale type",LLSidepanelTaskInfo::onCommitSaleType,this); + + childSetCommitCallback("Edit Cost", LLSidepanelTaskInfo::onCommitSaleInfo, this); + + childSetCommitCallback("checkbox next owner can modify",LLSidepanelTaskInfo::onCommitNextOwnerModify,this); + childSetCommitCallback("checkbox next owner can copy",LLSidepanelTaskInfo::onCommitNextOwnerCopy,this); + childSetCommitCallback("checkbox next owner can transfer",LLSidepanelTaskInfo::onCommitNextOwnerTransfer,this); + childSetCommitCallback("clickaction",LLSidepanelTaskInfo::onCommitClickAction,this); + childSetCommitCallback("search_check",LLSidepanelTaskInfo::onCommitIncludeInSearch,this); + + mLabelGroupName = getChild<LLNameBox>("Group Name Proxy"); + + return TRUE; +} + +void LLSidepanelTaskInfo::setVisible(BOOL visible) +{ + if (visible) + { + mDirty = TRUE; + } + LLPanel::setVisible(visible); +} + +void LLSidepanelTaskInfo::draw() +{ + if (mDirty) + { + mDirty = FALSE; + refresh(); + } + + LLPanel::draw(); +} + +LLSidepanelTaskInfo::~LLSidepanelTaskInfo() +{ + // base class will take care of everything +} + + +void LLSidepanelTaskInfo::refresh() +{ + LLButton* BtnDeedToGroup = getChild<LLButton>("button deed"); + if(BtnDeedToGroup) + { + std::string deedText; + if (gWarningSettings.getBOOL("DeedObject")) + { + deedText = getString("text deed continued"); + } + else + { + deedText = getString("text deed"); + } + BtnDeedToGroup->setLabelSelected(deedText); + BtnDeedToGroup->setLabelUnselected(deedText); + } + BOOL root_selected = TRUE; + LLSelectNode* nodep = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(); + S32 object_count = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount(); + if(!nodep || 0 == object_count) + { + nodep = LLSelectMgr::getInstance()->getSelection()->getFirstNode(); + object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); + root_selected = FALSE; + } + + //BOOL attachment_selected = LLSelectMgr::getInstance()->getSelection()->isAttachment(); + //attachment_selected = false; + LLViewerObject* objectp = NULL; + if(nodep) objectp = nodep->getObject(); + if(!nodep || !objectp)// || attachment_selected) + { + // ...nothing selected + childSetEnabled("perm_modify",false); + childSetText("perm_modify",LLStringUtil::null); + + childSetEnabled("Creator:",false); + childSetText("Creator Name",LLStringUtil::null); + childSetEnabled("Creator Name",false); + + childSetEnabled("Owner:",false); + childSetText("Owner Name",LLStringUtil::null); + childSetEnabled("Owner Name",false); + + childSetEnabled("Group:",false); + childSetText("Group Name",LLStringUtil::null); + childSetEnabled("Group Name",false); + childSetEnabled("button set group",false); + + childSetText("Object Name",LLStringUtil::null); + childSetEnabled("Object Name",false); + childSetEnabled("Name:",false); + childSetText("Group Name",LLStringUtil::null); + childSetEnabled("Group Name",false); + childSetEnabled("Description:",false); + childSetText("Object Description",LLStringUtil::null); + childSetEnabled("Object Description",false); + + childSetEnabled("Permissions:",false); + + childSetValue("checkbox share with group",FALSE); + childSetEnabled("checkbox share with group",false); + childSetEnabled("button deed",false); + + childSetValue("checkbox allow everyone move",FALSE); + childSetEnabled("checkbox allow everyone move",false); + childSetValue("checkbox allow everyone copy",FALSE); + childSetEnabled("checkbox allow everyone copy",false); + + //Next owner can: + childSetEnabled("Next owner can:",false); + childSetValue("checkbox next owner can modify",FALSE); + childSetEnabled("checkbox next owner can modify",false); + childSetValue("checkbox next owner can copy",FALSE); + childSetEnabled("checkbox next owner can copy",false); + childSetValue("checkbox next owner can transfer",FALSE); + childSetEnabled("checkbox next owner can transfer",false); + + //checkbox for sale + childSetValue("checkbox for sale",FALSE); + childSetEnabled("checkbox for sale",false); + + //checkbox include in search + childSetValue("search_check", FALSE); + childSetEnabled("search_check", false); + + LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type"); + combo_sale_type->setValue(LLSaleInfo::FS_COPY); + combo_sale_type->setEnabled(FALSE); + + childSetEnabled("Cost",false); + childSetText("Cost",getString("Cost Default")); + childSetText("Edit Cost",LLStringUtil::null); + childSetEnabled("Edit Cost",false); + + childSetEnabled("label click action",false); + LLComboBox* ComboClickAction = getChild<LLComboBox>("clickaction"); + if(ComboClickAction) + { + ComboClickAction->setEnabled(FALSE); + ComboClickAction->clear(); + } + childSetVisible("B:",false); + childSetVisible("O:",false); + childSetVisible("G:",false); + childSetVisible("E:",false); + childSetVisible("N:",false); + childSetVisible("F:",false); + + return; + } + + // figure out a few variables + BOOL is_one_object = (object_count == 1); + + // BUG: fails if a root and non-root are both single-selected. + BOOL is_perm_modify = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode() + && LLSelectMgr::getInstance()->selectGetRootsModify()) + || LLSelectMgr::getInstance()->selectGetModify(); + const LLFocusableElement* keyboard_focus_view = gFocusMgr.getKeyboardFocus(); + S32 string_index = 0; + std::string MODIFY_INFO_STRINGS[] = + { + getString("text modify info 1"), + getString("text modify info 2"), + getString("text modify info 3"), + getString("text modify info 4") + }; + if(!is_perm_modify) + { + string_index += 2; + } + if(!is_one_object) + { + ++string_index; + } + childSetEnabled("perm_modify",true); + childSetText("perm_modify",MODIFY_INFO_STRINGS[string_index]); + + childSetEnabled("Permissions:",true); + + // Update creator text field + childSetEnabled("Creator:",true); + BOOL creators_identical; + std::string creator_name; + creators_identical = LLSelectMgr::getInstance()->selectGetCreator(mCreatorID, + creator_name); + + childSetText("Creator Name",creator_name); + childSetEnabled("Creator Name",TRUE); + + // Update owner text field + childSetEnabled("Owner:",true); + + BOOL owners_identical; + std::string owner_name; + owners_identical = LLSelectMgr::getInstance()->selectGetOwner(mOwnerID, owner_name); + +// llinfos << "owners_identical " << (owners_identical ? "TRUE": "FALSE") << llendl; + + if (mOwnerID.isNull()) + { + if(LLSelectMgr::getInstance()->selectIsGroupOwned()) + { + // Group owned already displayed by selectGetOwner + } + else + { + // Display last owner if public + std::string last_owner_name; + LLSelectMgr::getInstance()->selectGetLastOwner(mLastOwnerID, last_owner_name); + + // It should never happen that the last owner is null and the owner + // is null, but it seems to be a bug in the simulator right now. JC + if (!mLastOwnerID.isNull() && !last_owner_name.empty()) + { + owner_name.append(", last "); + owner_name.append( last_owner_name ); + } + } + } + + childSetText("Owner Name",owner_name); + childSetEnabled("Owner Name",TRUE); + + // update group text field + childSetEnabled("Group:",true); + childSetText("Group Name",LLStringUtil::null); + LLUUID group_id; + BOOL groups_identical = LLSelectMgr::getInstance()->selectGetGroup(group_id); + if (groups_identical) + { + if(mLabelGroupName) + { + mLabelGroupName->setNameID(group_id, TRUE); + mLabelGroupName->setEnabled(TRUE); + } + } + else + { + if(mLabelGroupName) + { + mLabelGroupName->setNameID(LLUUID::null, TRUE); + mLabelGroupName->refresh(LLUUID::null, LLStringUtil::null, LLStringUtil::null, TRUE); + mLabelGroupName->setEnabled(FALSE); + } + } + + childSetEnabled("button set group",owners_identical && (mOwnerID == gAgent.getID())); + + // figure out the contents of the name, description, & category + BOOL edit_name_desc = FALSE; + if(is_one_object && objectp->permModify()) + { + edit_name_desc = TRUE; + } + + childSetEnabled("Name:",true); + LLLineEditor* LineEditorObjectName = getChild<LLLineEditor>("Object Name"); + childSetEnabled("Description:",true); + LLLineEditor* LineEditorObjectDesc = getChild<LLLineEditor>("Object Description"); + + if(is_one_object) + { + if(keyboard_focus_view != LineEditorObjectName) + { + childSetText("Object Name",nodep->mName); + } + + if(LineEditorObjectDesc) + { + if(keyboard_focus_view != LineEditorObjectDesc) + { + LineEditorObjectDesc->setText(nodep->mDescription); + } + } + } + else + { + childSetText("Object Name",LLStringUtil::null); + LineEditorObjectDesc->setText(LLStringUtil::null); + } + + if(edit_name_desc) + { + childSetEnabled("Object Name",true); + childSetEnabled("Object Description",true); + } + else + { + childSetEnabled("Object Name",false); + childSetEnabled("Object Description",false); + } + + S32 total_sale_price = 0; + S32 individual_sale_price = 0; + BOOL is_for_sale_mixed = FALSE; + BOOL is_sale_price_mixed = FALSE; + U32 num_for_sale = FALSE; + LLSelectMgr::getInstance()->selectGetAggregateSaleInfo(num_for_sale, + is_for_sale_mixed, + is_sale_price_mixed, + total_sale_price, + individual_sale_price); + + const BOOL self_owned = (gAgent.getID() == mOwnerID); + const BOOL group_owned = LLSelectMgr::getInstance()->selectIsGroupOwned() ; + const BOOL public_owned = (mOwnerID.isNull() && !LLSelectMgr::getInstance()->selectIsGroupOwned()); + const BOOL can_transfer = LLSelectMgr::getInstance()->selectGetRootsTransfer(); + const BOOL can_copy = LLSelectMgr::getInstance()->selectGetRootsCopy(); + + if(!owners_identical) + { + childSetEnabled("Cost",false); + childSetText("Edit Cost",LLStringUtil::null); + childSetEnabled("Edit Cost",false); + } + // You own these objects. + else if(self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE))) + { + // If there are multiple items for sale then set text to PRICE PER UNIT. + if (num_for_sale > 1) + { + childSetText("Cost",getString("Cost Per Unit")); + } + else + { + childSetText("Cost",getString("Cost Default")); + } + + LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost"); + if(!edit_price->hasFocus()) + { + // If the sale price is mixed then set the cost to MIXED, otherwise + // set to the actual cost. + if (num_for_sale > 0 && is_for_sale_mixed) + { + edit_price->setTentative(TRUE); + } + else if (num_for_sale > 0 && is_sale_price_mixed) + { + edit_price->setTentative(TRUE); + } + else + { + edit_price->setValue(individual_sale_price); + } + } + // The edit fields are only enabled if you can sell this object + // and the sale price is not mixed. + bool enable_edit = (num_for_sale && can_transfer) ? !is_for_sale_mixed : false; + childSetEnabled("Cost",enable_edit); + childSetEnabled("Edit Cost",enable_edit); + } + // Someone, not you, owns these objects. + else if(!public_owned) + { + childSetEnabled("Cost",false); + childSetEnabled("Edit Cost",false); + + // Don't show a price if none of the items are for sale. + if (num_for_sale) + childSetText("Edit Cost",llformat("%d",total_sale_price)); + else + childSetText("Edit Cost",LLStringUtil::null); + + // If multiple items are for sale, set text to TOTAL PRICE. + if (num_for_sale > 1) + childSetText("Cost",getString("Cost Total")); + else + childSetText("Cost",getString("Cost Default")); + } + // This is a public object. + else + { + childSetEnabled("Cost",false); + childSetText("Cost",getString("Cost Default")); + + childSetText("Edit Cost",LLStringUtil::null); + childSetEnabled("Edit Cost",false); + } + + // Enable and disable the permissions checkboxes + // based on who owns the object. + // TODO: Creator permissions + + BOOL valid_base_perms = FALSE; + BOOL valid_owner_perms = FALSE; + BOOL valid_group_perms = FALSE; + BOOL valid_everyone_perms = FALSE; + BOOL valid_next_perms = FALSE; + + U32 base_mask_on; + U32 base_mask_off; + U32 owner_mask_on; + U32 owner_mask_off; + U32 group_mask_on; + U32 group_mask_off; + U32 everyone_mask_on; + U32 everyone_mask_off; + U32 next_owner_mask_on = 0; + U32 next_owner_mask_off = 0; + + valid_base_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_BASE, + &base_mask_on, + &base_mask_off); + + valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER, + &owner_mask_on, + &owner_mask_off); + + valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_GROUP, + &group_mask_on, + &group_mask_off); + + valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_EVERYONE, + &everyone_mask_on, + &everyone_mask_off); + + valid_next_perms = LLSelectMgr::getInstance()->selectGetPerm(PERM_NEXT_OWNER, + &next_owner_mask_on, + &next_owner_mask_off); + + + if( gSavedSettings.getBOOL("DebugPermissions") ) + { + std::string perm_string; + if (valid_base_perms) + { + perm_string = "B: "; + perm_string += mask_to_string(base_mask_on); + childSetText("B:",perm_string); + childSetVisible("B:",true); + + perm_string = "O: "; + perm_string += mask_to_string(owner_mask_on); + childSetText("O:",perm_string); + childSetVisible("O:",true); + + perm_string = "G: "; + perm_string += mask_to_string(group_mask_on); + childSetText("G:",perm_string); + childSetVisible("G:",true); + + perm_string = "E: "; + perm_string += mask_to_string(everyone_mask_on); + childSetText("E:",perm_string); + childSetVisible("E:",true); + + perm_string = "N: "; + perm_string += mask_to_string(next_owner_mask_on); + childSetText("N:",perm_string); + childSetVisible("N:",true); + } + perm_string = "F: "; + U32 flag_mask = 0x0; + if (objectp->permMove()) + flag_mask |= PERM_MOVE; + if (objectp->permModify()) + flag_mask |= PERM_MODIFY; + if (objectp->permCopy()) + flag_mask |= PERM_COPY; + if (objectp->permTransfer()) + flag_mask |= PERM_TRANSFER; + perm_string += mask_to_string(flag_mask); + childSetText("F:",perm_string); + childSetVisible("F:",true); + } + else + { + childSetVisible("B:",false); + childSetVisible("O:",false); + childSetVisible("G:",false); + childSetVisible("E:",false); + childSetVisible("N:",false); + childSetVisible("F:",false); + } + + bool has_change_perm_ability = false; + bool has_change_sale_ability = false; + + if(valid_base_perms + && (self_owned + || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_MANIPULATE)))) + { + has_change_perm_ability = true; + } + if(valid_base_perms + && (self_owned + || (group_owned && gAgent.hasPowerInGroup(group_id, GP_OBJECT_SET_SALE)))) + { + has_change_sale_ability = true; + } + + if (!has_change_perm_ability && !has_change_sale_ability && !root_selected) + { + // ...must select root to choose permissions + childSetValue("perm_modify", getString("text modify warning")); + } + + if (has_change_perm_ability) + { + childSetEnabled("checkbox share with group",true); + childSetEnabled("checkbox allow everyone move",owner_mask_on & PERM_MOVE); + childSetEnabled("checkbox allow everyone copy",owner_mask_on & PERM_COPY && owner_mask_on & PERM_TRANSFER); + } + else + { + childSetEnabled("checkbox share with group", FALSE); + childSetEnabled("checkbox allow everyone move", FALSE); + childSetEnabled("checkbox allow everyone copy", FALSE); + } + + if (has_change_sale_ability && (owner_mask_on & PERM_TRANSFER)) + { + childSetEnabled("checkbox for sale", can_transfer || (!can_transfer && num_for_sale)); + // Set the checkbox to tentative if the prices of each object selected + // are not the same. + childSetTentative("checkbox for sale", is_for_sale_mixed); + childSetEnabled("sale type",num_for_sale && can_transfer && !is_sale_price_mixed); + + childSetEnabled("Next owner can:", TRUE); + childSetEnabled("checkbox next owner can modify",base_mask_on & PERM_MODIFY); + childSetEnabled("checkbox next owner can copy",base_mask_on & PERM_COPY); + childSetEnabled("checkbox next owner can transfer",next_owner_mask_on & PERM_COPY); + } + else + { + childSetEnabled("checkbox for sale",FALSE); + childSetEnabled("sale type",FALSE); + + childSetEnabled("Next owner can:",FALSE); + childSetEnabled("checkbox next owner can modify",FALSE); + childSetEnabled("checkbox next owner can copy",FALSE); + childSetEnabled("checkbox next owner can transfer",FALSE); + } + + if(valid_group_perms) + { + if((group_mask_on & PERM_COPY) && (group_mask_on & PERM_MODIFY) && (group_mask_on & PERM_MOVE)) + { + childSetValue("checkbox share with group",TRUE); + childSetTentative("checkbox share with group",FALSE); + childSetEnabled("button deed",gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer); + } + else if((group_mask_off & PERM_COPY) && (group_mask_off & PERM_MODIFY) && (group_mask_off & PERM_MOVE)) + { + childSetValue("checkbox share with group",FALSE); + childSetTentative("checkbox share with group",false); + childSetEnabled("button deed",false); + } + else + { + childSetValue("checkbox share with group",TRUE); + childSetTentative("checkbox share with group",true); + childSetEnabled("button deed",gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && (group_mask_on & PERM_MOVE) && (owner_mask_on & PERM_TRANSFER) && !group_owned && can_transfer); + } + } + + if(valid_everyone_perms) + { + // Move + if(everyone_mask_on & PERM_MOVE) + { + childSetValue("checkbox allow everyone move",TRUE); + childSetTentative("checkbox allow everyone move",false); + } + else if(everyone_mask_off & PERM_MOVE) + { + childSetValue("checkbox allow everyone move",FALSE); + childSetTentative("checkbox allow everyone move",false); + } + else + { + childSetValue("checkbox allow everyone move",TRUE); + childSetTentative("checkbox allow everyone move",true); + } + + // Copy == everyone can't copy + if(everyone_mask_on & PERM_COPY) + { + childSetValue("checkbox allow everyone copy",TRUE); + childSetTentative("checkbox allow everyone copy",!can_copy || !can_transfer); + } + else if(everyone_mask_off & PERM_COPY) + { + childSetValue("checkbox allow everyone copy",FALSE); + childSetTentative("checkbox allow everyone copy",false); + } + else + { + childSetValue("checkbox allow everyone copy",TRUE); + childSetTentative("checkbox allow everyone copy",true); + } + } + + if(valid_next_perms) + { + // Modify == next owner canot modify + if(next_owner_mask_on & PERM_MODIFY) + { + childSetValue("checkbox next owner can modify",TRUE); + childSetTentative("checkbox next owner can modify",false); + } + else if(next_owner_mask_off & PERM_MODIFY) + { + childSetValue("checkbox next owner can modify",FALSE); + childSetTentative("checkbox next owner can modify",false); + } + else + { + childSetValue("checkbox next owner can modify",TRUE); + childSetTentative("checkbox next owner can modify",true); + } + + // Copy == next owner cannot copy + if(next_owner_mask_on & PERM_COPY) + { + childSetValue("checkbox next owner can copy",TRUE); + childSetTentative("checkbox next owner can copy",!can_copy); + } + else if(next_owner_mask_off & PERM_COPY) + { + childSetValue("checkbox next owner can copy",FALSE); + childSetTentative("checkbox next owner can copy",FALSE); + } + else + { + childSetValue("checkbox next owner can copy",TRUE); + childSetTentative("checkbox next owner can copy",TRUE); + } + + // Transfer == next owner cannot transfer + if(next_owner_mask_on & PERM_TRANSFER) + { + childSetValue("checkbox next owner can transfer",TRUE); + childSetTentative("checkbox next owner can transfer",!can_transfer); + } + else if(next_owner_mask_off & PERM_TRANSFER) + { + childSetValue("checkbox next owner can transfer",FALSE); + childSetTentative("checkbox next owner can transfer",FALSE); + } + else + { + childSetValue("checkbox next owner can transfer",TRUE); + childSetTentative("checkbox next owner can transfer",TRUE); + } + } + + // reflect sale information + LLSaleInfo sale_info; + BOOL valid_sale_info = LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info); + LLSaleInfo::EForSale sale_type = sale_info.getSaleType(); + + LLComboBox* combo_sale_type = getChild<LLComboBox>("sale type"); + if (valid_sale_info) + { + combo_sale_type->setValue(sale_type == LLSaleInfo::FS_NOT ? LLSaleInfo::FS_COPY : sale_type); + combo_sale_type->setTentative(FALSE); // unfortunately this doesn't do anything at the moment. + } + else + { + // default option is sell copy, determined to be safest + combo_sale_type->setValue(LLSaleInfo::FS_COPY); + combo_sale_type->setTentative(TRUE); // unfortunately this doesn't do anything at the moment. + } + + childSetValue("checkbox for sale", num_for_sale != 0); + + // HACK: There are some old objects in world that are set for sale, + // but are no-transfer. We need to let users turn for-sale off, but only + // if for-sale is set. + bool cannot_actually_sell = !can_transfer || (!can_copy && sale_type == LLSaleInfo::FS_COPY); + if (num_for_sale && has_change_sale_ability && cannot_actually_sell) + { + childSetEnabled("checkbox for sale", true); + } + + // Check search status of objects + BOOL all_volume = LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ); + bool include_in_search; + bool all_include_in_search = LLSelectMgr::getInstance()->selectionGetIncludeInSearch(&include_in_search); + childSetEnabled("search_check", has_change_sale_ability && all_volume); + childSetValue("search_check", include_in_search); + childSetTentative("search_check", ! all_include_in_search); + + // Click action (touch, sit, buy) + U8 click_action = 0; + if (LLSelectMgr::getInstance()->selectionGetClickAction(&click_action)) + { + LLComboBox* ComboClickAction = getChild<LLComboBox>("clickaction"); + if(ComboClickAction) + { + ComboClickAction->setCurrentByIndex((S32)click_action); + } + } + childSetEnabled("label click action",is_perm_modify && all_volume); + childSetEnabled("clickaction",is_perm_modify && all_volume); +} + + +// static +void LLSidepanelTaskInfo::onClickClaim(void*) +{ + // try to claim ownership + LLSelectMgr::getInstance()->sendOwner(gAgent.getID(), gAgent.getGroupID()); +} + +// static +void LLSidepanelTaskInfo::onClickRelease(void*) +{ + // try to release ownership + LLSelectMgr::getInstance()->sendOwner(LLUUID::null, LLUUID::null); +} + +void LLSidepanelTaskInfo::onClickGroup() +{ + LLUUID owner_id; + std::string name; + BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, name); + LLFloater* parent_floater = gFloaterView->getParentFloater(this); + + if(owners_identical && (owner_id == gAgent.getID())) + { + LLFloaterGroupPicker* fg = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID())); + if (fg) + { + fg->setSelectGroupCallback( boost::bind(&LLSidepanelTaskInfo::cbGroupID, this, _1) ); + + if (parent_floater) + { + LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, fg); + fg->setOrigin(new_rect.mLeft, new_rect.mBottom); + parent_floater->addDependentFloater(fg); + } + } + } +} + +void LLSidepanelTaskInfo::cbGroupID(LLUUID group_id) +{ + if(mLabelGroupName) + { + mLabelGroupName->setNameID(group_id, TRUE); + } + LLSelectMgr::getInstance()->sendGroup(group_id); +} + +static bool callback_deed_to_group(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + if (0 == option) + { + LLUUID group_id; + BOOL groups_identical = LLSelectMgr::getInstance()->selectGetGroup(group_id); + if(group_id.notNull() && groups_identical && (gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED))) + { + LLSelectMgr::getInstance()->sendOwner(LLUUID::null, group_id, FALSE); +// LLViewerStats::getInstance()->incStat(LLViewerStats::ST_RELEASE_COUNT); + } + } + return false; +} + +void LLSidepanelTaskInfo::onClickDeedToGroup(void* data) +{ + LLNotifications::instance().add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group); +} + +///---------------------------------------------------------------------------- +/// Permissions checkboxes +///---------------------------------------------------------------------------- + +// static +void LLSidepanelTaskInfo::onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm) +{ + LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(); + if(!object) return; + + // Checkbox will have toggled itself + // LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data; + LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; + BOOL new_state = check->get(); + + LLSelectMgr::getInstance()->selectionSetObjectPermissions(field, new_state, perm); +} + +// static +void LLSidepanelTaskInfo::onCommitGroupShare(LLUICtrl *ctrl, void *data) +{ + onCommitPerm(ctrl, data, PERM_GROUP, PERM_MODIFY | PERM_MOVE | PERM_COPY); +} + +// static +void LLSidepanelTaskInfo::onCommitEveryoneMove(LLUICtrl *ctrl, void *data) +{ + onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_MOVE); +} + + +// static +void LLSidepanelTaskInfo::onCommitEveryoneCopy(LLUICtrl *ctrl, void *data) +{ + onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_COPY); +} + +// static +void LLSidepanelTaskInfo::onCommitNextOwnerModify(LLUICtrl* ctrl, void* data) +{ + //llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerModify" << llendl; + onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_MODIFY); +} + +// static +void LLSidepanelTaskInfo::onCommitNextOwnerCopy(LLUICtrl* ctrl, void* data) +{ + //llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerCopy" << llendl; + onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_COPY); +} + +// static +void LLSidepanelTaskInfo::onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data) +{ + //llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerTransfer" << llendl; + onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_TRANSFER); +} + +// static +void LLSidepanelTaskInfo::onCommitName(LLUICtrl*, void* data) +{ + //llinfos << "LLSidepanelTaskInfo::onCommitName()" << llendl; + LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data; + LLLineEditor* tb = self->getChild<LLLineEditor>("Object Name"); + if(tb) + { + LLSelectMgr::getInstance()->selectionSetObjectName(tb->getText()); +// LLSelectMgr::getInstance()->selectionSetObjectName(self->mLabelObjectName->getText()); + } +} + + +// static +void LLSidepanelTaskInfo::onCommitDesc(LLUICtrl*, void* data) +{ + //llinfos << "LLSidepanelTaskInfo::onCommitDesc()" << llendl; + LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data; + LLLineEditor* le = self->getChild<LLLineEditor>("Object Description"); + if(le) + { + LLSelectMgr::getInstance()->selectionSetObjectDescription(le->getText()); + } +} + +// static +void LLSidepanelTaskInfo::onCommitSaleInfo(LLUICtrl*, void* data) +{ + LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data; + self->setAllSaleInfo(); +} + +// static +void LLSidepanelTaskInfo::onCommitSaleType(LLUICtrl*, void* data) +{ + LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data; + self->setAllSaleInfo(); +} + +void LLSidepanelTaskInfo::setAllSaleInfo() +{ + llinfos << "LLSidepanelTaskInfo::setAllSaleInfo()" << llendl; + LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_NOT; + + LLCheckBoxCtrl *checkPurchase = getChild<LLCheckBoxCtrl>("checkbox for sale"); + + // Set the sale type if the object(s) are for sale. + if(checkPurchase && checkPurchase->get()) + { + sale_type = static_cast<LLSaleInfo::EForSale>(getChild<LLComboBox>("sale type")->getValue().asInteger()); + } + + S32 price = -1; + + LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost"); + price = (edit_price->getTentative()) ? DEFAULT_PRICE : edit_price->getValue().asInteger(); + + // If somehow an invalid price, turn the sale off. + if (price < 0) + sale_type = LLSaleInfo::FS_NOT; + + LLSaleInfo sale_info(sale_type, price); + LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(sale_info); + + // If turned off for-sale, make sure click-action buy is turned + // off as well + if (sale_type == LLSaleInfo::FS_NOT) + { + U8 click_action = 0; + LLSelectMgr::getInstance()->selectionGetClickAction(&click_action); + if (click_action == CLICK_ACTION_BUY) + { + LLSelectMgr::getInstance()->selectionSetClickAction(CLICK_ACTION_TOUCH); + } + } +} + +struct LLSelectionPayable : public LLSelectedObjectFunctor +{ + virtual bool apply(LLViewerObject* obj) + { + // can pay if you or your parent has money() event in script + LLViewerObject* parent = (LLViewerObject*)obj->getParent(); + return (obj->flagTakesMoney() + || (parent && parent->flagTakesMoney())); + } +}; + +// static +void LLSidepanelTaskInfo::onCommitClickAction(LLUICtrl* ctrl, void*) +{ + LLComboBox* box = (LLComboBox*)ctrl; + if (!box) return; + + U8 click_action = (U8)box->getCurrentIndex(); + if (click_action == CLICK_ACTION_BUY) + { + LLSaleInfo sale_info; + LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info); + if (!sale_info.isForSale()) + { + LLNotifications::instance().add("CantSetBuyObject"); + + // Set click action back to its old value + U8 click_action = 0; + LLSelectMgr::getInstance()->selectionGetClickAction(&click_action); + box->setCurrentByIndex((S32)click_action); + + return; + } + } + else if (click_action == CLICK_ACTION_PAY) + { + // Verify object has script with money() handler + LLSelectionPayable payable; + bool can_pay = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&payable); + if (!can_pay) + { + // Warn, but do it anyway. + LLNotifications::instance().add("ClickActionNotPayable"); + } + } + LLSelectMgr::getInstance()->selectionSetClickAction(click_action); +} + +// static +void LLSidepanelTaskInfo::onCommitIncludeInSearch(LLUICtrl* ctrl, void*) +{ + LLCheckBoxCtrl* box = (LLCheckBoxCtrl*)ctrl; + llassert(box); + + LLSelectMgr::getInstance()->selectionSetIncludeInSearch(box->get()); +} + diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h new file mode 100644 index 00000000000..2b9b4b66b6b --- /dev/null +++ b/indra/newview/llsidepaneltaskinfo.h @@ -0,0 +1,113 @@ +/** + * @file llsidepaneltaskinfo.h + * @brief LLSidepanelTaskInfo class header file + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLSIDEPANELTASKINFO_H +#define LL_LLSIDEPANELTASKINFO_H + +#include "llpanel.h" +#include "lluuid.h" + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLSidepanelTaskInfo +// +// Panel for permissions of an object. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLNameBox; + +class LLSidepanelTaskInfo : public LLPanel +{ +public: + LLSidepanelTaskInfo(); + virtual ~LLSidepanelTaskInfo(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void draw(); + /*virtual*/ void setVisible(BOOL visible); + +protected: + void refresh(); // refresh all labels as needed + + // statics + static void onClickClaim(void*); + static void onClickRelease(void*); + void onClickGroup(); + void cbGroupID(LLUUID group_id); + static void onClickDeedToGroup(void*); + + static void onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm); + + static void onCommitGroupShare(LLUICtrl *ctrl, void *data); + + static void onCommitEveryoneMove(LLUICtrl *ctrl, void *data); + static void onCommitEveryoneCopy(LLUICtrl *ctrl, void *data); + + static void onCommitNextOwnerModify(LLUICtrl* ctrl, void* data); + static void onCommitNextOwnerCopy(LLUICtrl* ctrl, void* data); + static void onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data); + + static void onCommitName(LLUICtrl* ctrl, void* data); + static void onCommitDesc(LLUICtrl* ctrl, void* data); + + static void onCommitSaleInfo(LLUICtrl* ctrl, void* data); + static void onCommitSaleType(LLUICtrl* ctrl, void* data); + void setAllSaleInfo(); + + static void onCommitClickAction(LLUICtrl* ctrl, void*); + static void onCommitIncludeInSearch(LLUICtrl* ctrl, void*); + +private: + LLNameBox* mLabelGroupName; // group name + + LLUUID mCreatorID; + LLUUID mOwnerID; + LLUUID mLastOwnerID; + BOOL mDirty; // item properties need to be updated + +protected: + void onEditButtonClicked(); + void onSaveButtonClicked(); + void onCancelButtonClicked(); + void onOpenButtonClicked(); + void onBuildButtonClicked(); + void onBuyButtonClicked(); +private: + LLButton* mEditBtn; + LLButton* mSaveBtn; + LLButton* mCancelBtn; + LLButton* mOpenBtn; + LLButton* mBuildBtn; + LLButton* mBuyBtn; +}; + + +#endif // LL_LLSIDEPANELTASKINFO_H diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 23ceb1e72d9..526b7967874 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2648,8 +2648,22 @@ void handle_object_edit() // Could be first use LLFirstUse::useBuild(); return; - } + +void handle_object_inspect() +{ + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + LLViewerObject* selected_objectp = selection->getFirstRootObject(); + if (selected_objectp) + { + LLSD key; + key["task"] = "task"; + LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); + } + + LLFloaterReg::showInstance("inspect", LLSD()); +} + //--------------------------------------------------------------------------- // Land pie menu //--------------------------------------------------------------------------- @@ -8062,6 +8076,7 @@ void initialize_menus() commit.add("Object.Buy", boost::bind(&handle_buy)); commit.add("Object.Edit", boost::bind(&handle_object_edit)); + commit.add("Object.Inspect", boost::bind(&handle_object_inspect)); commit.add("Object.Take", boost::bind(&handle_take)); diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml index fc37bc07b8e..cbcc3f10ad2 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml @@ -110,4 +110,18 @@ width="330"> </panel> + <panel + follows="all" + layout="topleft" + left="0" + class="sidepanel_task_info" + filename="sidepanel_task_info.xml" + name="sidepanel__task_panel" + top="0" + label="" + height="570" + visible="false" + width="330"> + </panel> + </panel> diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index f77fc204f34..39cd75074e5 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -487,36 +487,6 @@ name="edit_btn" top="0" width="50" /> - <button - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Open" - layout="topleft" - left_pad="5" - name="edit_btn" - top="0" - width="60" /> - <button - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Build" - layout="topleft" - left_pad="5" - name="edit_btn" - top="0" - width="60" /> - <button - follows="bottom|left" - font="SansSerifSmallBold" - height="25" - label="Buy" - layout="topleft" - left_pad="5" - name="edit_btn" - top="0" - width="60" /> <button follows="bottom|right" font="SansSerifSmallBold" -- GitLab From e8ee119da107c0c473c836f1f0233621f14e2a15 Mon Sep 17 00:00:00 2001 From: Eugene Mutavchi <emutavchi@productengine.com> Date: Wed, 4 Nov 2009 20:23:41 +0200 Subject: [PATCH 120/306] Major sub-task EXT-2142, additional commit: moved call buttons panel to control panel bottom, removed other buttons from panel_call_button --HG-- branch : product-engine --- .../xui/en/panel_adhoc_control_panel.xml | 13 ++- .../xui/en/panel_group_control_panel.xml | 26 ++++-- .../default/xui/en/panel_im_control_panel.xml | 86 ++++++++++--------- 3 files changed, 70 insertions(+), 55 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml index 52017218d6c..24c46b314ff 100644 --- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml @@ -25,19 +25,23 @@ border="false" bottom="1" follows="left|bottom" - height="78" + height="70" left="0" - name="panel_buttons" + left_pad="0" + name="panel_call_buttons" + top_pad="0" width="180"> <button + bottom="10" height="20" - label="Call Group" - left_delta="27" + label="Call" + left_delta="28" name="call_btn" width="125"/> <button + bottom="40" height="20" label="Leave Call" name="end_call_btn" @@ -46,6 +50,7 @@ <button enabled="false" + bottom="10" height="20" label="Open Voice Controls" name="voice_ctrls_btn" diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index daa44ac75ce..46f34949a83 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -19,31 +19,37 @@ top="10" width="180"/> + <button + bottom_pad="0" + height="20" + label="Group Info" + left_delta="28" + name="group_info_btn" + width="125"/> + <panel background_visible="true" bg_alpha_color="0.2 0.2 0.2 1" border="false" bottom="1" follows="left|bottom" - height="98" + height="70" left="0" - name="panel_buttons" + left_pad="0" + name="panel_call_buttons" + top_pad="0" width="180"> <button - height="20" - label="Group Info" - left_delta="28" - name="group_info_btn" - width="125"/> - - <button + bottom="10" height="20" label="Call Group" + left_delta="28" name="call_btn" width="125"/> <button + bottom="40" height="20" label="Leave Call" name="end_call_btn" @@ -52,6 +58,7 @@ <button enabled="false" + bottom="10" height="20" label="Open Voice Controls" name="voice_ctrls_btn" @@ -59,4 +66,5 @@ width="125"/> </panel> + </panel> 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 d144d71dcee..f77a2ec730d 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 @@ -2,7 +2,6 @@ <panel border="false" height="327" - layout="topleft" name="panel_im_control_panel" width="131"> @@ -14,41 +13,64 @@ top="-10" width="125"/> + <button + follows="left|bottom" + height="20" + label="View Profile" + name="view_profile_btn" + width="125"/> + + <button + follows="left|bottom" + height="20" + label="Add Friend" + name="add_friend_btn" + width="125"/> + + <button + follows="left|bottom" + height="20" + label="Teleport" + name="teleport_btn" + width="125"/> + + <button + follows="left|bottom" + height="20" + label="Share" + name="share_btn" + width="125"/> + + <button + follows="left|bottom" + height="20" + label="Pay" + name="pay_btn" + width="125"/> + <panel background_visible="true" bg_alpha_color="0.2 0.2 0.2 1" border="false" bottom="1" follows="left|bottom" - height="195" + height="70" left="0" - name="panel_buttons" + left_pad="0" + name="panel_call_buttons" + top_pad="0" width="131"> <button - follows="left|bottom" - height="20" - label="View Profile" - left_delta="3" - name="view_profile_btn" - width="125"/> - - <button - follows="left|bottom" - height="20" - label="Add Friend" - name="add_friend_btn" - width="125"/> - - <button - follows="left|bottom" + bottom="10" height="20" label="Call" + left_delta="3" name="call_btn" width="125"/> <button - follows="left|bottom" + bottom="40" height="20" label="Leave Call" name="end_call_btn" @@ -57,33 +79,13 @@ <button enabled="false" - follows="left|bottom" + bottom="10" height="20" label="Open Voice Controls" name="voice_ctrls_btn" visible="false" width="125"/> - <button - follows="left|bottom" - height="20" - label="Teleport" - name="teleport_btn" - width="125"/> - - <button - follows="left|bottom" - height="20" - label="Share" - name="share_btn" - width="125"/> - - <button - follows="left|bottom" - height="20" - label="Pay" - name="pay_btn" - width="125"/> - </panel> + </panel> -- GitLab From 77f58385d8ec0440da8c943a8b814a73369ef0d3 Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk <slitovchuk@productengine.com> Date: Wed, 4 Nov 2009 20:24:34 +0200 Subject: [PATCH 121/306] Implemented normal task EXT-704 "Remove Place Media panel". - Removed Place Media panel. This also fixes bug EXT-454 "Place - Media: Gear near 'All nearby media' shoudl be removed according to the latest changes in the spec". --HG-- branch : product-engine --- indra/newview/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index be736c57c87..fde942ad116 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -322,7 +322,6 @@ set(viewer_SOURCE_FILES llpanellogin.cpp llpanellookinfo.cpp llpanellooks.cpp - llpanelmedia.cpp llpanelmediasettingsgeneral.cpp llpanelmediasettingspermissions.cpp llpanelmediasettingssecurity.cpp @@ -802,7 +801,6 @@ set(viewer_HEADER_FILES llpanellogin.h llpanellookinfo.h llpanellooks.h - llpanelmedia.h llpanelmediasettingsgeneral.h llpanelmediasettingspermissions.h llpanelmediasettingssecurity.h -- GitLab From cf9d9237bed3ddf063b2744a009e8e8de55388fe Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Wed, 4 Nov 2009 18:30:59 +0000 Subject: [PATCH 122/306] more splitting of code. --- indra/newview/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e138b431c59..b989f0c2306 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -386,6 +386,7 @@ set(viewer_SOURCE_FILES llsurfacepatch.cpp llsyswellitem.cpp llsyswellwindow.cpp + lltalkbutton.cpp llteleporthistory.cpp llteleporthistorystorage.cpp lltexglobalcolor.cpp @@ -872,6 +873,7 @@ set(viewer_HEADER_FILES llsyswellitem.h llsyswellwindow.h lltable.h + lltalkbutton.h llteleporthistory.h llteleporthistorystorage.h lltexglobalcolor.h -- GitLab From 7573cb61126ef7db439b9c4b690fd77d21aabbc9 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Wed, 4 Nov 2009 18:34:11 +0000 Subject: [PATCH 123/306] split code. --- indra/newview/llchiclet.cpp | 153 +----------------------------------- 1 file changed, 3 insertions(+), 150 deletions(-) diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index bad61101c1b..a3c0a171865 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -51,10 +51,9 @@ #include "lltransientfloatermgr.h" static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel"); -static LLDefaultChildRegistry::Register<LLTalkButton> t2("chiclet_talk"); -static LLDefaultChildRegistry::Register<LLNotificationChiclet> t3("chiclet_notification"); -static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t4("chiclet_im_p2p"); -static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t5("chiclet_im_group"); +static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notification"); +static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p"); +static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group"); S32 LLNotificationChiclet::mUreadSystemNotifications = 0; @@ -1250,152 +1249,6 @@ bool LLChicletPanel::isAnyIMFloaterDoked() ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// -// *TODO Vadim: Move this out of llchiclet.cpp. - -LLTalkButton::Params::Params() - : speak_button("speak_button") - , show_button("show_button") - , monitor("monitor") -{ - // *TODO Vadim: move hardcoded labels (!) and other params to XUI. - speak_button.name("left"); - speak_button.label("Speak"); - speak_button.label_selected("Speak"); - speak_button.font(LLFontGL::getFontSansSerifSmall()); - speak_button.tab_stop(false); - speak_button.is_toggle(true); - speak_button.picture_style(true); - // Use default button art. JC - //speak_button.image_selected(LLUI::getUIImage("SegmentedBtn_Left_Selected")); - //speak_button.image_unselected(LLUI::getUIImage("SegmentedBtn_Left_Off")); - - show_button.name("right"); - show_button.label(LLStringUtil::null); - show_button.rect(LLRect(0, 0, 20, 0)); - show_button.tab_stop(false); - show_button.is_toggle(true); - show_button.picture_style(true); - show_button.image_selected(LLUI::getUIImage("ComboButton_Selected")); - show_button.image_unselected(LLUI::getUIImage("ComboButton_Off")); - - monitor.name("monitor"); - // *TODO: Make this data driven. - monitor.rect(LLRect(0, 18, 18, 0)); -} - -LLTalkButton::LLTalkButton(const Params& p) -: LLUICtrl(p) -, mPrivateCallPanel(NULL) -, mOutputMonitor(NULL) -, mSpeakBtn(NULL) -, mShowBtn(NULL) -{ - LLRect rect = p.rect(); - LLRect speak_rect(0, rect.getHeight(), rect.getWidth(), 0); - LLRect show_rect = p.show_button.rect(); - show_rect.set(0, rect.getHeight(), show_rect.getWidth(), 0); - - speak_rect.mRight -= show_rect.getWidth(); - show_rect.mLeft = speak_rect.getWidth(); - show_rect.mRight = rect.getWidth(); - - LLButton::Params speak_params = p.speak_button; - speak_params.rect(speak_rect); - mSpeakBtn = LLUICtrlFactory::create<LLButton>(speak_params); - addChild(mSpeakBtn); - LLTransientFloaterMgr::getInstance()->addControlView(mSpeakBtn); - - mSpeakBtn->setClickedCallback(boost::bind(&LLTalkButton::onClick_SpeakBtn, this)); - mSpeakBtn->setToggleState(FALSE); - - LLButton::Params show_params = p.show_button; - show_params.rect(show_rect); - mShowBtn = LLUICtrlFactory::create<LLButton>(show_params); - addChild(mShowBtn); - LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn); - - mShowBtn->setClickedCallback(boost::bind(&LLTalkButton::onClick_ShowBtn, this)); - mShowBtn->setToggleState(FALSE); - - static const S32 MONITOR_RIGHT_PAD = 2; - - LLRect monitor_rect = p.monitor.rect(); - S32 monitor_height = monitor_rect.getHeight(); - monitor_rect.mLeft = speak_rect.getWidth() - monitor_rect.getWidth() - MONITOR_RIGHT_PAD; - monitor_rect.mRight = speak_rect.getWidth() - MONITOR_RIGHT_PAD; - monitor_rect.mBottom = (rect.getHeight() / 2) - (monitor_height / 2); - monitor_rect.mTop = monitor_rect.mBottom + monitor_height; - - LLOutputMonitorCtrl::Params monitor_params = p.monitor; - monitor_params.draw_border(false); - monitor_params.rect(monitor_rect); - monitor_params.auto_update(true); - monitor_params.speaker_id(gAgentID); - mOutputMonitor = LLUICtrlFactory::create<LLOutputMonitorCtrl>(monitor_params); - mSpeakBtn->addChild(mOutputMonitor); - - // never show "muted" because you can't mute yourself - mOutputMonitor->setIsMuted(false); -} - -LLTalkButton::~LLTalkButton() -{ -} - -void LLTalkButton::setSpeakBtnToggleState(bool state) -{ - mSpeakBtn->setToggleState(state); -} - -void LLTalkButton::onClick_SpeakBtn() -{ - bool speaking = mSpeakBtn->getToggleState(); - gVoiceClient->setUserPTTState(speaking); -} - -void LLTalkButton::onClick_ShowBtn() -{ - if(!mShowBtn->getToggleState()) - { - mPrivateCallPanel->onClickClose(mPrivateCallPanel); - delete mPrivateCallPanel; - mPrivateCallPanel = NULL; - mShowBtn->setToggleState(FALSE); - return; - } - - S32 x = mSpeakBtn->getRect().mLeft; - S32 y = 0; - - localPointToScreen(x, y, &x, &y); - - mPrivateCallPanel = new LLVoiceControlPanel; - getRootView()->addChild(mPrivateCallPanel); - - y = LLBottomTray::getInstance()->getRect().getHeight() + mPrivateCallPanel->getRect().getHeight(); - - LLRect rect; - rect.setLeftTopAndSize(x, y, mPrivateCallPanel->getRect().getWidth(), mPrivateCallPanel->getRect().getHeight()); - mPrivateCallPanel->setRect(rect); - - - LLAvatarListItem* item = new LLAvatarListItem(); - item->showLastInteractionTime(false); - item->showInfoBtn(true); - item->showSpeakingIndicator(true); - item->reshape(mPrivateCallPanel->getRect().getWidth(), item->getRect().getHeight(), FALSE); - - mPrivateCallPanel->addItem(item); - mPrivateCallPanel->setVisible(TRUE); - mPrivateCallPanel->setFrontmost(TRUE); - - mShowBtn->setToggleState(TRUE); -} - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - LLChicletNotificationCounterCtrl::LLChicletNotificationCounterCtrl(const Params& p) : LLTextBox(p) , mCounter(0) -- GitLab From 5eaf4731770419fa4b32efb498d641a7d9d2f521 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Wed, 4 Nov 2009 18:37:05 +0000 Subject: [PATCH 124/306] more refactoring/paring/splitting.... --- indra/newview/llnearbychatbar.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index 06204e6367b..3fa1d3ea8ac 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -37,11 +37,14 @@ #include "llcombobox.h" #include "llgesturemgr.h" #include "llchat.h" -#include "llchiclet.h" #include "llvoiceclient.h" #include "lloutputmonitorctrl.h" #include "llspeakers.h" + +class LLTalkButton; + + class LLGestureComboBox : public LLComboBox , public LLGestureManagerObserver -- GitLab From 0ee426016aeae605eeb8ab3aa535b2b52462a3d9 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Wed, 4 Nov 2009 10:37:13 -0800 Subject: [PATCH 125/306] added newline at end of llbutton.cpp removed non-localized, invisible labels from scrollbar and tab container arrows EXT-1626 - there is text overlaping in group info mini inspector reviewed by James --- indra/llui/llbutton.cpp | 2 +- indra/llui/llscrollbar.cpp | 2 -- indra/llui/lltabcontainer.cpp | 4 +--- indra/llui/lltextbase.cpp | 6 +----- 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 8daceb9485d..bbaf908d2e5 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -1090,4 +1090,4 @@ void LLButton::resetMouseDownTimer() { mMouseDownTimer.stop(); mMouseDownTimer.reset(); -} \ No newline at end of file +} diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp index b450ecbbf91..dfd315d4516 100644 --- a/indra/llui/llscrollbar.cpp +++ b/indra/llui/llscrollbar.cpp @@ -115,7 +115,6 @@ LLScrollbar::LLScrollbar(const Params & p) LLButton::Params up_btn(mOrientation == VERTICAL ? p.up_button : p.left_button); up_btn.name(std::string("Line Up")); - up_btn.label(std::string("Line Up")); up_btn.rect(line_up_rect); up_btn.click_callback.function(boost::bind(&LLScrollbar::onLineUpBtnPressed, this, _2)); up_btn.mouse_held_callback.function(boost::bind(&LLScrollbar::onLineUpBtnPressed, this, _2)); @@ -126,7 +125,6 @@ LLScrollbar::LLScrollbar(const Params & p) LLButton::Params down_btn(mOrientation == VERTICAL ? p.down_button : p.right_button); down_btn.name(std::string("Line Down")); - down_btn.label(std::string("Line Down")); down_btn.rect(line_down_rect); down_btn.follows.flags(FOLLOWS_RIGHT|FOLLOWS_BOTTOM); down_btn.click_callback.function(boost::bind(&LLScrollbar::onLineDownBtnPressed, this, _2)); diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 6ca9c4ceda7..6073b54371a 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -986,7 +986,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) p.follows.flags = p.follows.flags() | FOLLOWS_BOTTOM; } - btn = LLUICtrlFactory::create<LLButton>(p); +++ btn = LLUICtrlFactory::create<LLButton>(p); } } @@ -1645,7 +1645,6 @@ void LLTabContainer::initButtons() LLButton::Params prev_btn_params; prev_btn_params.name(std::string("Up Arrow")); - prev_btn_params.label(std::string("Up Arrow")); prev_btn_params.rect(up_arrow_btn_rect); prev_btn_params.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT); prev_btn_params.image_unselected.name("scrollbutton_up_out_blue.tga"); @@ -1655,7 +1654,6 @@ void LLTabContainer::initButtons() LLButton::Params next_btn_params; next_btn_params.name(std::string("Down Arrow")); - next_btn_params.label(std::string("Down Arrow")); next_btn_params.rect(down_arrow_btn_rect); next_btn_params.follows.flags(FOLLOWS_BOTTOM | FOLLOWS_LEFT); next_btn_params.image_unselected.name("scrollbutton_down_out_blue.tga"); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 9a26f0b4726..8cbb53dda28 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1450,9 +1450,7 @@ void LLTextBase::setText(const LLStringExplicit &utf8str) appendText(text, false); - //resetDirty(); onValueChange(0, getLength()); - needsReflow(); } //virtual @@ -1630,8 +1628,6 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen insertStringNoUndo(getLength(), wide_text, &segments); } - needsReflow(); - // Set the cursor and scroll position if( selection_start != selection_end ) { @@ -2115,7 +2111,7 @@ LLRect LLTextBase::getVisibleDocumentRect() const LLRect doc_rect = mDocumentView->getLocalRect(); doc_rect.mLeft -= mDocumentView->getRect().mLeft; // adjust for height of text above widget baseline - doc_rect.mBottom = llmin(0, doc_rect.getHeight() - mTextRect.getHeight()); + doc_rect.mBottom = doc_rect.getHeight() - mTextRect.getHeight(); return doc_rect; } } -- GitLab From ad25be8af388ee38c2f0af731d30a6336caf3ad5 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Wed, 4 Nov 2009 10:50:14 -0800 Subject: [PATCH 126/306] fixed up bad merge --- .../skins/default/xui/en/floater_tools.xml | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 0202e8b5828..0614653d76f 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -1011,8 +1011,11 @@ label="Original" value="1" /> </combo_box> -<!-- NEW PRICE SPINNER --> - <spinner +<!-- NEW PRICE SPINNER +Objects are allowed to be for sale for L$0 to invoke buy UI behavior +even though the user gets a free copy. +--> + <spinner follows="left|top" decimal_digits="0" increment="1" @@ -1023,7 +1026,7 @@ label="Price: L$" label_width="65" width="150" - min_val="1" + min_val="0" height="20" max_val="999999999" /> <check_box @@ -2767,7 +2770,7 @@ left_pad="8" name="button permissions" width="130" /> - <panel_inventory + <panel_inventory_object follows="left|top" height="210" layout="topleft" @@ -2842,14 +2845,6 @@ tool_tip="Colorize the parcels according to the type of owner: Green = Your land Aqua = Your group's land Red = Owned by others Yellow = For sale Purple = For auction Grey = Public" top_pad="8" width="205" /> - <!--TODO: HOOK UP TO HELP VIEWER--> - <!-- <button - image_overlay="Arrow_Right_Off" - left_pad="5" - name="button show owners help" - tool_tip="See an explanation of colors" - width="26" - height="22" />--> <text type="string" length="1" -- GitLab From c9ac2b54b94b4b4bb30e9f0750601b6289a802a0 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Wed, 4 Nov 2009 19:24:09 +0000 Subject: [PATCH 127/306] fix up the refactoring... --- indra/newview/llnearbychatbar.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 32dc5e59278..730939861b2 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -36,6 +36,7 @@ #include "lltrans.h" #include "llnearbychatbar.h" +#include "lltalkbutton.h" #include "llbottomtray.h" #include "llagent.h" #include "llgesturemgr.h" -- GitLab From eb02d77ff5d20b99cc35fe9082cf5a22f634a7e1 Mon Sep 17 00:00:00 2001 From: Eugene Kondrashev <ekondrashev@productengine.com> Date: Wed, 4 Nov 2009 21:33:14 +0200 Subject: [PATCH 128/306] Implemented major sub-task EXT-2131 - Output monitor contols should only be shown for Group Chat and Adhoc Chat when in a Voice Call. Added onStateChange callback support for voice channel. Added showing/hiding logic of speaking indicator. --HG-- branch : product-engine --- indra/newview/llavatarlist.cpp | 17 ++++++++++ indra/newview/llavatarlist.h | 3 ++ indra/newview/llavatarlistitem.cpp | 13 ++++++++ indra/newview/llavatarlistitem.h | 6 ++-- indra/newview/llpanelimcontrolpanel.cpp | 32 +++++++++++++------ indra/newview/llpanelimcontrolpanel.h | 6 +++- indra/newview/llvoicechannel.cpp | 14 ++++++-- indra/newview/llvoicechannel.h | 11 +++++++ .../xui/en/panel_adhoc_control_panel.xml | 1 + .../xui/en/panel_group_control_panel.xml | 1 + 10 files changed, 89 insertions(+), 15 deletions(-) diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 8609ba8b1c6..bb03f47f46f 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -65,6 +65,20 @@ void LLAvatarList::toggleIcons() } } +void LLAvatarList::setSpeakingIndicatorsVisible(bool visible) +{ + // Save the new value for new items to use. + mShowSpeakingIndicator = visible; + + // Show/hide icons for all existing items. + std::vector<LLPanel*> items; + getItems(items); + for( std::vector<LLPanel*>::const_iterator it = items.begin(); it != items.end(); it++) + { + static_cast<LLAvatarListItem*>(*it)->setSpeakingIndicatorVisible(mShowSpeakingIndicator); + } +} + static bool findInsensitive(std::string haystack, const std::string& needle_upper) { LLStringUtil::toUpper(haystack); @@ -81,6 +95,7 @@ LLAvatarList::Params::Params() , show_last_interaction_time("show_last_interaction_time", false) , show_info_btn("show_info_btn", true) , show_profile_btn("show_profile_btn", true) +, show_speaking_indicator("show_speaking_indicator", true) { } @@ -94,6 +109,7 @@ LLAvatarList::LLAvatarList(const Params& p) , mShowIcons(true) , mShowInfoBtn(p.show_info_btn) , mShowProfileBtn(p.show_profile_btn) +, mShowSpeakingIndicator(p.show_speaking_indicator) { setCommitOnSelectionChange(true); @@ -295,6 +311,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is item->setAvatarIconVisible(mShowIcons); item->setShowInfoBtn(mShowInfoBtn); item->setShowProfileBtn(mShowProfileBtn); + item->setSpeakingIndicatorVisible(mShowSpeakingIndicator); addItem(item, id, pos); } diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 195d9e5b550..490f93e5015 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -61,6 +61,7 @@ class LLAvatarList : public LLFlatListView Optional<bool> show_last_interaction_time; // show most recent interaction time. *HACK: move this to a derived class Optional<bool> show_info_btn; Optional<bool> show_profile_btn; + Optional<bool> show_speaking_indicator; Params(); }; @@ -76,6 +77,7 @@ class LLAvatarList : public LLFlatListView void setContextMenu(LLAvatarListItem::ContextMenu* menu) { mContextMenu = menu; } void toggleIcons(); + void setSpeakingIndicatorsVisible(bool visible); void sortByName(); void setShowIcons(std::string param_name); bool getIconsVisible() const { return mShowIcons; } @@ -105,6 +107,7 @@ class LLAvatarList : public LLFlatListView bool mShowIcons; bool mShowInfoBtn; bool mShowProfileBtn; + bool mShowSpeakingIndicator; LLTimer* mLITUpdateTimer; // last interaction time update timer std::string mIconParamName; diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index a7ac14c9486..7df278d887b 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -62,6 +62,7 @@ LLAvatarListItem::LLAvatarListItem() mIconWidth = mAvatarName->getRect().mLeft - mAvatarIcon->getRect().mLeft; mInfoBtnWidth = mInfoBtn->getRect().mRight - mSpeakingIndicator->getRect().mRight; mProfileBtnWidth = mProfileBtn->getRect().mRight - mInfoBtn->getRect().mRight; + mSpeakingIndicatorWidth = mSpeakingIndicator->getRect().mRight - mAvatarName->getRect().mRight; } LLAvatarListItem::~LLAvatarListItem() @@ -230,6 +231,18 @@ void LLAvatarListItem::setShowProfileBtn(bool show) mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight()); } +void LLAvatarListItem::setSpeakingIndicatorVisible(bool visible) +{ + // Already done? Then do nothing. + if (mSpeakingIndicator->getVisible() == (BOOL)visible) + return; + mSpeakingIndicator->setVisible(visible); + S32 width_delta = visible ? - mSpeakingIndicatorWidth : mSpeakingIndicatorWidth; + + //Reshaping avatar name + mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight()); +} + void LLAvatarListItem::setAvatarIconVisible(bool visible) { // Already done? Then do nothing. diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index cd7a85c3dc5..d379797a464 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -65,8 +65,9 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver void setAvatarId(const LLUUID& id, bool ignore_status_changes = false); void setLastInteractionTime(const std::string& val); //Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly - void setShowProfileBtn(bool hide); - void setShowInfoBtn(bool hide); + void setShowProfileBtn(bool show); + void setShowInfoBtn(bool show); + void setSpeakingIndicatorVisible(bool visible); void setAvatarIconVisible(bool visible); const LLUUID& getAvatarId() const; @@ -109,6 +110,7 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver S32 mIconWidth; // icon width + padding S32 mInfoBtnWidth; //info btn width + padding S32 mProfileBtnWidth; //profile btn width + padding + S32 mSpeakingIndicatorWidth; //speaking indicator width + padding }; #endif //LL_LLAVATARLISTITEM_H diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index 21e88b6d07c..80b29c4fa79 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -59,6 +59,14 @@ void LLPanelChatControlPanel::onOpenVoiceControlsClicked() // TODO: implement Voice Control Panel opening } +void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state) +{ + bool is_call_started = ( new_state >= LLVoiceChannel::STATE_CALL_STARTED ); + childSetVisible("end_call_btn", is_call_started); + childSetVisible("voice_ctrls_btn", is_call_started); + childSetVisible("call_btn", ! is_call_started); +} + BOOL LLPanelChatControlPanel::postBuild() { childSetAction("call_btn", boost::bind(&LLPanelChatControlPanel::onCallButtonClicked, this)); @@ -76,15 +84,6 @@ void LLPanelChatControlPanel::draw() LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId); if (!session) return; - LLVoiceChannel* voice_channel = session->mVoiceChannel; - if (voice_channel && voice_enabled) - { - bool is_call_started = ( voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED ); - childSetVisible("end_call_btn", is_call_started); - childSetVisible("voice_ctrls_btn", is_call_started); - childSetVisible("call_btn", ! is_call_started); - } - bool session_initialized = session->mSessionInitialized; bool callback_enabled = session->mCallBackEnabled; LLViewerRegion* region = gAgent.getRegion(); @@ -98,6 +97,15 @@ void LLPanelChatControlPanel::draw() LLPanel::draw(); } +void LLPanelChatControlPanel::setSessionId(const LLUUID& session_id) +{ + //Method is called twice for AdHoc and Group chat. Second time when server init reply received + mSessionId = session_id; + LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionId); + if(voice_channel) + voice_channel->setStateChangedCallback(boost::bind(&LLPanelChatControlPanel::onVoiceChannelStateChanged, this, _1, _2)); +} + LLPanelIMControlPanel::LLPanelIMControlPanel() { } @@ -214,6 +222,12 @@ void LLPanelGroupControlPanel::onSortMenuItemClicked(const LLSD& userdata) } +void LLPanelGroupControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state) +{ + LLPanelChatControlPanel::onVoiceChannelStateChanged(old_state, new_state); + mAvatarList->setSpeakingIndicatorsVisible(new_state >= LLVoiceChannel::STATE_CALL_STARTED); +} + void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id) { LLPanelChatControlPanel::setSessionId(session_id); diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index fa101f42803..1f38bffb538 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -34,6 +34,7 @@ #define LL_LLPANELIMCONTROLPANEL_H #include "llpanel.h" +#include "llvoicechannel.h" class LLSpeakerMgr; class LLAvatarList; @@ -52,7 +53,9 @@ class LLPanelChatControlPanel : public LLPanel void onEndCallButtonClicked(); void onOpenVoiceControlsClicked(); - virtual void setSessionId(const LLUUID& session_id) { mSessionId = session_id; } + virtual void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state); + + virtual void setSessionId(const LLUUID& session_id); private: LLUUID mSessionId; @@ -100,6 +103,7 @@ class LLPanelGroupControlPanel : public LLPanelChatControlPanel private: void onGroupInfoButtonClicked(); void onSortMenuItemClicked(const LLSD& userdata); + /*virtual*/ void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state); }; class LLPanelAdHocControlPanel : public LLPanelGroupControlPanel diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 96fcf61e628..cefc88ebee8 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -390,7 +390,15 @@ void LLVoiceChannel::setState(EState state) break; } - mState = state; + doSetState(state); +} + +void LLVoiceChannel::doSetState(const EState& new_state) +{ + EState old_state = mState; + mState = new_state; + if (!mStateChangedCallback.empty()) + mStateChangedCallback(old_state, mState); } void LLVoiceChannel::toggleCallWindowIfNeeded(EState state) @@ -620,7 +628,7 @@ void LLVoiceChannelGroup::setState(EState state) gIMMgr->addSystemMessage(mSessionID, "ringing", mNotifyArgs); } - mState = state; + doSetState(state); break; default: LLVoiceChannel::setState(state); @@ -865,7 +873,7 @@ void LLVoiceChannelP2P::setState(EState state) if (mReceivedCall && state == STATE_RINGING) { gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs); - mState = state; + doSetState(state); return; } LLVoiceChannel::setState(state); diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index 9966bdd5abf..8f1e9ff02d3 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -52,6 +52,8 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver STATE_CONNECTED } EState; + typedef boost::function<void(const EState& old_state, const EState& new_state)> state_changed_callback_t; + LLVoiceChannel(const LLUUID& session_id, const std::string& session_name); virtual ~LLVoiceChannel(); @@ -69,6 +71,8 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver virtual BOOL callStarted(); const std::string& getSessionName() const { return mSessionName; } + void setStateChangedCallback(state_changed_callback_t callback) { mStateChangedCallback = callback; } + const LLUUID getSessionID() { return mSessionID; } EState getState() { return mState; } @@ -85,6 +89,10 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver protected: virtual void setState(EState state); + /** + * Use this method if you want mStateChangedCallback to be executed while state is changed + */ + void doSetState(const EState& state); void toggleCallWindowIfNeeded(EState state); void setURI(std::string uri); @@ -106,6 +114,9 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver static LLVoiceChannel* sCurrentVoiceChannel; static LLVoiceChannel* sSuspendedVoiceChannel; static BOOL sSuspended; + +private: + state_changed_callback_t mStateChangedCallback; }; class LLVoiceChannelGroup : public LLVoiceChannel diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml index 24c46b314ff..0246e21d254 100644 --- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml @@ -16,6 +16,7 @@ opaque="false" show_info_btn="false" show_profile_btn="false" + show_speaking_indicator="false" top="10" width="180"/> diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index 46f34949a83..763dd7b9220 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -16,6 +16,7 @@ opaque="false" show_info_btn="false" show_profile_btn="false" + show_speaking_indicator="false" top="10" width="180"/> -- GitLab From 5a2424d01026327ae8eb17ec2b319495c6f5e9b1 Mon Sep 17 00:00:00 2001 From: Vadim Savchuk <vsavchuk@productengine.com> Date: Wed, 4 Nov 2009 21:45:16 +0200 Subject: [PATCH 129/306] Fixed minor bug EXT-1769 (Edit Pick: '+' icon blinks on mouse over) --HG-- branch : product-engine --- indra/newview/llpanelpick.cpp | 24 ++++++++++++++++++++++-- indra/newview/llpanelpick.h | 11 +++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp index e725479abb5..103f0416865 100644 --- a/indra/newview/llpanelpick.cpp +++ b/indra/newview/llpanelpick.cpp @@ -40,6 +40,7 @@ #include "llagent.h" #include "llagentpicksinfo.h" #include "llbutton.h" +#include "lliconctrl.h" #include "lllineeditor.h" #include "llparcel.h" #include "llviewerparcelmgr.h" @@ -62,6 +63,7 @@ #define XML_SNAPSHOT "pick_snapshot" #define XML_LOCATION "pick_location" +#define XML_BTN_ON_TXTR "edit_icon" #define XML_BTN_SAVE "save_changes_btn" #define SAVE_BTN_LABEL "[WHAT]" @@ -401,8 +403,6 @@ BOOL LLPanelPickEdit::postBuild() LLPanelPickInfo::postBuild(); mSnapshotCtrl->setOnSelectCallback(boost::bind(&LLPanelPickEdit::onPickChanged, this, _1)); - mSnapshotCtrl->setMouseEnterCallback(boost::bind(&LLPanelPickEdit::childSetVisible, this, "edit_icon", true)); - mSnapshotCtrl->setMouseLeaveCallback(boost::bind(&LLPanelPickEdit::childSetVisible, this, "edit_icon", false)); LLLineEditor* line_edit = getChild<LLLineEditor>("pick_name"); line_edit->setKeystrokeCallback(boost::bind(&LLPanelPickEdit::onPickChanged, this, _1), NULL); @@ -547,3 +547,23 @@ void LLPanelPickEdit::processProperties(void* data, EAvatarProcessorType type) LLPanelPickInfo::processProperties(data, type); } } + +// PRIVATE AREA + +void LLPanelPickEdit::initTexturePickerMouseEvents() +{ + text_icon = getChild<LLIconCtrl>(XML_BTN_ON_TXTR); + mSnapshotCtrl->setMouseEnterCallback(boost::bind(&LLPanelPickEdit::onTexturePickerMouseEnter, this, _1)); + mSnapshotCtrl->setMouseLeaveCallback(boost::bind(&LLPanelPickEdit::onTexturePickerMouseLeave, this, _1)); + text_icon->setVisible(FALSE); +} + +void LLPanelPickEdit::onTexturePickerMouseEnter(LLUICtrl* ctrl) +{ + text_icon->setVisible(TRUE); +} + +void LLPanelPickEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl) +{ + text_icon->setVisible(FALSE); +} diff --git a/indra/newview/llpanelpick.h b/indra/newview/llpanelpick.h index 9b605cd6b1a..2c0830f2ac7 100644 --- a/indra/newview/llpanelpick.h +++ b/indra/newview/llpanelpick.h @@ -41,6 +41,7 @@ #include "llremoteparcelrequest.h" #include "llavatarpropertiesprocessor.h" +class LLIconCtrl; class LLTextureCtrl; class LLMessageSystem; class LLAvatarPropertiesObserver; @@ -236,6 +237,16 @@ class LLPanelPickEdit : public LLPanelPickInfo bool mLocationChanged; bool mNeedData; bool mNewPick; + +private: + + void initTexturePickerMouseEvents(); + void onTexturePickerMouseEnter(LLUICtrl* ctrl); + void onTexturePickerMouseLeave(LLUICtrl* ctrl); + +private: + + LLIconCtrl* text_icon; }; #endif // LL_LLPANELPICK_H -- GitLab From fe7750152b69aa89731ca95ac59ef402b6df137d Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Wed, 4 Nov 2009 14:49:48 -0500 Subject: [PATCH 130/306] Added placeholder art for missing icons. --- .../skins/default/textures/icons/Inv_Alpha.png | Bin 0 -> 253 bytes .../skins/default/textures/icons/Inv_Tattoo.png | Bin 0 -> 253 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 indra/newview/skins/default/textures/icons/Inv_Alpha.png create mode 100644 indra/newview/skins/default/textures/icons/Inv_Tattoo.png diff --git a/indra/newview/skins/default/textures/icons/Inv_Alpha.png b/indra/newview/skins/default/textures/icons/Inv_Alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d246c6faf0aeaa4b4ff49b8f28e79cf8c92d52 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X=6kw0hE&{2`tkq2Ju_R~|A6@#h6-scf(aiU2HH)~VMt=_ zU}$D&Zn)#VLdL$MrOTe-5vRk>P6a;Y6Db=Qn46iIwRSKZVGQ`jreNkU*`8sOK+1vY z4Y^Mm`F#RzpJWww(3{ZytDEtaztcL$u*C;hczW6c{&PG0_2r0ZSXIjKGPSW~`yI!O y4B_Vm9&Z}H8W;v}xbaHxuqhNN&ty<Iz>sk-YU8;#>o)+M%HZkh=d#Wzp$PyS5m?~> literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/icons/Inv_Tattoo.png b/indra/newview/skins/default/textures/icons/Inv_Tattoo.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d246c6faf0aeaa4b4ff49b8f28e79cf8c92d52 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X=6kw0hE&{2`tkq2Ju_R~|A6@#h6-scf(aiU2HH)~VMt=_ zU}$D&Zn)#VLdL$MrOTe-5vRk>P6a;Y6Db=Qn46iIwRSKZVGQ`jreNkU*`8sOK+1vY z4Y^Mm`F#RzpJWww(3{ZytDEtaztcL$u*C;hczW6c{&PG0_2r0ZSXIjKGPSW~`yI!O y4B_Vm9&Z}H8W;v}xbaHxuqhNN&ty<Iz>sk-YU8;#>o)+M%HZkh=d#Wzp$PyS5m?~> literal 0 HcmV?d00001 -- GitLab From c3e9536b6fae9fbd751d4a63e243f502e056175d Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Wed, 4 Nov 2009 11:58:39 -0800 Subject: [PATCH 131/306] updated floater_test_textbox to test case of texbox too big for its text removed picture_style from sidepanel_object_info.xml made mime_type error notification unique on mime type reviewed by Leyla --- indra/newview/skins/default/xui/en/floater_test_textbox.xml | 4 ++-- indra/newview/skins/default/xui/en/notifications.xml | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml index f39d27761cd..9e2e9e74e3f 100644 --- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml +++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml @@ -145,11 +145,11 @@ <text type="string" length="1" - bottom="390" + height="60" label="N" layout="topleft" left="10" - name="centered_text" + name="left_aligned_text" width="380" halign="left" text_color="1 1 1 0.7" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index babed28f10e..8679e87f49f 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4629,6 +4629,9 @@ If you want to view streaming media on parcels that support it you should go to name="NoPlugin" type="notify"> No Media Plugin was found to handle the "[MIME_TYPE]" mime type. Media of this type will be unavailable. + <unique> + <context key="MIME_TYPE" /> + </unique> </notification> <notification icon="alertmodal.tga" -- GitLab From 321f5ac36ce04b01bd24d62eb4c7585e83c110f9 Mon Sep 17 00:00:00 2001 From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com> Date: Wed, 4 Nov 2009 15:06:52 -0500 Subject: [PATCH 132/306] Fix for EXT-2050 - Duplicate entries in strings.xml Removed all duplicates (verifying their dupe status and removing the second example). --- .../newview/skins/default/xui/en/strings.xml | 45 ------------------- 1 file changed, 45 deletions(-) diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 0f7e8cb1377..ec2673644f0 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2047,9 +2047,6 @@ this texture in your inventory <!-- panel contents --> <string name="PanelContentsNewScript">New Script</string> - <!-- panel avatar --> - <!-- <string name="None">None</string> Duplicate--> - <!-- Mute --> <string name="MuteByName">(by name)</string> <string name="MuteAgent">(resident)</string> @@ -2306,9 +2303,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Body Thick">Body Thick</string> <string name="Body Thickness">Body Thickness</string> <string name="Body Thin">Body Thin</string> -<string name="Bottom">Bottom</string> -<string name="Bottom Left">Bottom Left</string> -<string name="Bottom Right">Bottom Right</string> <string name="Bow Legged">Bow Legged</string> <string name="Breast Buoyancy">Breast Buoyancy</string> @@ -2330,13 +2324,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="no bustle">No Bustle</string> <string name="more bustle">More Bustle</string> -<string name="Center">Center</string> -<string name="Center 2">Center 2</string> <string name="Chaplin">Chaplin</string> <string name="Cheek Bones">Cheek Bones</string> -<string name="Chest">Chest</string> <string name="Chest Size">Chest Size</string> -<string name="Chin">Chin</string> <string name="Chin Angle">Chin Angle</string> <string name="Chin Cleft">Chin Cleft</string> <string name="Chin Curtains">Chin Curtains</string> @@ -2500,22 +2490,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Jowls">Jowls</string> <string name="Knee Angle">Knee Angle</string> <string name="Knock Kneed">Knock Kneed</string> -<string name="L Forearm">L Forearm</string> -<string name="L Lower Leg">L Lower Leg</string> -<string name="L Upper Arm">L Upper Arm</string> -<string name="L Upper Leg">L Upper Leg</string> <string name="Large">Large</string> <string name="Large Hands">Large Hands</string> -<string name="Left">Left</string> -<string name="Left Ear">Left Ear</string> -<string name="Left Eyeball">Left Eyeball</string> -<string name="Left Foot">Left Foot</string> -<string name="Left Hand">Left Hand</string> -<string name="Left Hip">Left Hip</string> <string name="Left Part">Left Part</string> -<string name="Left Pec">Left Pec</string> -<string name="Left Shoulder">Left Shoulder</string> <string name="Leg Length">Leg Length</string> <string name="Leg Muscles">Leg Muscles</string> <string name="Less">Less</string> @@ -2533,7 +2511,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Less Square">Less Square</string> <string name="Less Volume">Less Volume</string> <string name="Less soul">Less soul</string> -<string name="Light">Light</string> <string name="Lighter">Lighter</string> <string name="Lip Cleft">Lip Cleft</string> <string name="Lip Cleft Depth">Lip Cleft Depth</string> @@ -2596,7 +2573,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="More soul">More soul</string> <string name="Moustache">Moustache</string> -<string name="Mouth">Mouth</string> <string name="Mouth Corner">Mouth Corner</string> <string name="Mouth Position">Mouth Position</string> <string name="Mowhawk">Mowhawk</string> @@ -2624,10 +2600,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="No Spikes">No Spikes</string> <string name="No White">No White</string> <string name="No Wrinkles">No Wrinkles</string> -<string name="None">None</string> <string name="Normal Lower">Normal Lower</string> <string name="Normal Upper">Normal Upper</string> -<string name="Nose">Nose</string> <string name="Nose Left">Nose Left</string> <string name="Nose Right">Nose Right</string> <string name="Nose Size">Nose Size</string> @@ -2667,7 +2641,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Part">Part</string> <string name="Part Bangs">Part Bangs</string> <string name="Pectorals">Pectorals</string> -<string name="Pelvis">Pelvis</string> <string name="Pigment">Pigment</string> <string name="Pigtails">Pigtails</string> <string name="Pink">Pink</string> @@ -2683,24 +2656,12 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Pop Right Eye">Pop Right Eye</string> <string name="Puffy">Puffy</string> <string name="Puffy Eyelids">Puffy Eyelids</string> -<string name="R Forearm">R Forearm</string> -<string name="R Lower Leg">R Lower Leg</string> -<string name="R Upper Arm">R Upper Arm</string> -<string name="R Upper Leg">R Upper Leg</string> <string name="Rainbow Color">Rainbow Color</string> <string name="Red Hair">Red Hair</string> <string name="Red Skin">Red Skin</string> <string name="Regular">Regular</string> <string name="Regular Muscles">Regular Muscles</string> -<string name="Right">Right</string> -<string name="Right Ear">Right Ear</string> -<string name="Right Eyeball">Right Eyeball</string> -<string name="Right Foot">Right Foot</string> -<string name="Right Hand">Right Hand</string> -<string name="Right Hip">Right Hip</string> <string name="Right Part">Right Part</string> -<string name="Right Pec">Right Pec</string> -<string name="Right Shoulder">Right Shoulder</string> <string name="Rosy Complexion">Rosy Complexion</string> <string name="Round">Round</string> <string name="Round Forehead">Round Forehead</string> @@ -2757,7 +2718,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Skinny Neck">Skinny Neck</string> <string name="Skirt Fit">Skirt Fit</string> <string name="Skirt Length">Skirt Length</string> -<string name="Skull">Skull</string> <string name="Slanted Forehead">Slanted Forehead</string> <string name="Sleeve Length">Sleeve Length</string> @@ -2780,12 +2740,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Sparse">Sparse</string> <string name="Spiked Hair">Spiked Hair</string> -<string name="Spine">Spine</string> <string name="Square">Square</string> <string name="Square Toe">Square Toe</string> <string name="Squash Head">Squash Head</string> <string name="Squash/Stretch Head">Squash/Stretch Head</string> -<string name="Stomach">Stomach</string> <string name="Stretch Head">Stretch Head</string> <string name="Sunken">Sunken</string> <string name="Sunken Chest">Sunken Chest</string> @@ -2817,9 +2775,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Tilt Right">Tilt Right</string> <string name="Toe Shape">Toe Shape</string> <string name="Toe Thickness">Toe Thickness</string> -<string name="Top">Top</string> -<string name="Top Left">Top Left</string> -<string name="Top Right">Top Right</string> <string name="Torso Length">Torso Length</string> <string name="Torso Muscles">Torso Muscles</string> <string name="Torso Scrawny">Torso Scrawny</string> -- GitLab From 8c27615aa5c1fc61fa0a5877717699d5df47476d Mon Sep 17 00:00:00 2001 From: Eugene Mutavchi <emutavchi@productengine.com> Date: Wed, 4 Nov 2009 22:17:23 +0200 Subject: [PATCH 133/306] Implemented normal sub-task EXT-2144 (IM P2p control panel should contain avatar name under avatar icon aligned to the left side) --HG-- branch : product-engine --- indra/newview/llpanelimcontrolpanel.cpp | 18 ++++++++++++++++++ indra/newview/llpanelimcontrolpanel.h | 3 +++ .../default/xui/en/floater_im_session.xml | 14 +++++++------- .../default/xui/en/panel_im_control_panel.xml | 12 +++++++++++- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index 80b29c4fa79..76612f2dd1e 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -123,6 +123,8 @@ BOOL LLPanelIMControlPanel::postBuild() childSetAction("teleport_btn", boost::bind(&LLPanelIMControlPanel::onTeleportButtonClicked, this)); childSetAction("pay_btn", boost::bind(&LLPanelIMControlPanel::onPayButtonClicked, this)); childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId())); + + return LLPanelChatControlPanel::postBuild(); } @@ -166,6 +168,9 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID); + // Fetch the currect name + gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4)); + llwarns << "gCacheName->get" << llendl; // Disable profile button if participant is not realy SL avatar LLIMModel::LLIMSession* im_session = im_model.findIMSession(session_id); @@ -173,6 +178,19 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) childSetEnabled("view_profile_btn", FALSE); } +void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) +{ + llwarns << "LLPanelIMControlPanel::nameUpdatedCallback" << llendl; + if ( id == mAvatarID ) + { + llwarns << "LLPanelIMControlPanel::nameUpdatedCallback id == mAvatarID" << llendl; + std::string avatar_name; + avatar_name.assign(first); + avatar_name.append(" "); + avatar_name.append(last); + getChild<LLTextBox>("avatar_name")->setValue(avatar_name); + } +} LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id) { diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index 1f38bffb538..ac5d86345e8 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -72,6 +72,9 @@ class LLPanelIMControlPanel : public LLPanelChatControlPanel void setSessionId(const LLUUID& session_id); +protected: + void nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); + private: void onViewProfileButtonClicked(); void onAddFriendButtonClicked(); 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 1585d976b36..70af2f63b64 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -3,7 +3,7 @@ legacy_header_height="18" background_visible="true" follows="left|top|right|bottom" - height="359" + height="369" layout="topleft" left="0" name="panel_im" @@ -14,10 +14,10 @@ visible="true" width="520" can_resize="true" - min_width="200" - min_height="150"> + min_width="350" + min_height="350"> <layout_stack follows="left|top|right|bottom" - height="344" + height="354" width="520" layout="topleft" orientation="horizontal" @@ -28,12 +28,12 @@ name="panel_im_control_panel" layout="topleft" top_delta="-3" - height="344" + height="354" follows="left" label="IM Control Panel" auto_resize="false" user_resize="false" /> - <layout_panel height="344" + <layout_panel height="354" width="355" left_delta="146" top="0" @@ -56,7 +56,7 @@ length="1" follows="left|top|right|bottom" font="SansSerif" - height="290" + height="300" layout="topleft" name="chat_history" parse_highlights="true" 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 f77a2ec730d..c8b134cdf0d 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 @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel border="false" - height="327" + height="350" name="panel_im_control_panel" width="131"> @@ -13,6 +13,16 @@ top="-10" width="125"/> + <text + follows="left|right" + font="SansSerifBig" + height="16" + layout="topleft" + name="avatar_name" + use_ellipses="true" + value="Unknown" + width="125" /> + <button follows="left|bottom" height="20" -- GitLab From eca4416855b97ee017e55581616b8e4aa0c5e4d4 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Wed, 4 Nov 2009 12:22:06 -0800 Subject: [PATCH 134/306] reverted uniqueness constraint on mime_type errors due to bug in notifications uniqueness filtering --- indra/newview/skins/default/xui/en/notifications.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 8679e87f49f..babed28f10e 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4629,9 +4629,6 @@ If you want to view streaming media on parcels that support it you should go to name="NoPlugin" type="notify"> No Media Plugin was found to handle the "[MIME_TYPE]" mime type. Media of this type will be unavailable. - <unique> - <context key="MIME_TYPE" /> - </unique> </notification> <notification icon="alertmodal.tga" -- GitLab From 98a24938b3cd95f7c93283b91dc95582925265f5 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Wed, 4 Nov 2009 15:28:07 -0500 Subject: [PATCH 135/306] LLAppearanceManager::wearItem() - always check for extra links of same type, even if requested object is already linked. --- indra/newview/llappearancemgr.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 382947e4647..033df053ad9 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1103,14 +1103,16 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) bool linked_already = false; for (S32 i=0; i<item_array.count(); i++) { + // Are these links to the same object? const LLViewerInventoryItem* inv_item = item_array.get(i).get(); if (inv_item->getLinkedUUID() == item->getLinkedUUID()) { linked_already = true; - break; } - // Are of same type but are not the same - new item will replace old. - if (areMatchingWearables(vitem,inv_item)) + // 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)) { gAgentWearables.removeWearable(inv_item->getWearableType(),true,0); gInventory.purgeObject(inv_item->getUUID()); -- GitLab From 179f18d1ab5cc93509339684029cf7e4fe0b3eaa Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Wed, 4 Nov 2009 20:34:11 +0000 Subject: [PATCH 136/306] LLTalkButton -> LLSpeakButton, 'cos that's what it is. --- indra/newview/CMakeLists.txt | 4 +- indra/newview/llbottomtray.cpp | 2 +- indra/newview/llbottomtray.h | 4 +- indra/newview/llchiclet.h | 36 ------ indra/newview/llnearbychatbar.cpp | 10 +- indra/newview/llnearbychatbar.h | 4 +- indra/newview/llspeakbutton.cpp | 196 ++++++++++++++++++++++++++++++ indra/newview/llspeakbutton.h | 81 ++++++++++++ 8 files changed, 289 insertions(+), 48 deletions(-) create mode 100644 indra/newview/llspeakbutton.cpp create mode 100644 indra/newview/llspeakbutton.h diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b989f0c2306..03bf41b1181 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -376,6 +376,7 @@ set(viewer_SOURCE_FILES llsky.cpp llslurl.cpp llspatialpartition.cpp + llspeakbutton.cpp llspeakers.cpp llsplitbutton.cpp llsprite.cpp @@ -386,7 +387,6 @@ set(viewer_SOURCE_FILES llsurfacepatch.cpp llsyswellitem.cpp llsyswellwindow.cpp - lltalkbutton.cpp llteleporthistory.cpp llteleporthistorystorage.cpp lltexglobalcolor.cpp @@ -862,6 +862,7 @@ set(viewer_HEADER_FILES llsky.h llslurl.h llspatialpartition.h + llspeakbutton.h llspeakers.h llsplitbutton.h llsprite.h @@ -873,7 +874,6 @@ set(viewer_HEADER_FILES llsyswellitem.h llsyswellwindow.h lltable.h - lltalkbutton.h llteleporthistory.h llteleporthistorystorage.h lltexglobalcolor.h diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index ddcee5f4536..a17ba79078b 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -47,7 +47,7 @@ LLBottomTray::LLBottomTray(const LLSD&) : mChicletPanel(NULL), mSysWell(NULL), - mTalkBtn(NULL), + mSpeakBtn(NULL), mNearbyChatBar(NULL), mToolbarStack(NULL) diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index a28f1e42ecd..02588a1975f 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -43,7 +43,7 @@ class LLChicletPanel; class LLLineEditor; class LLLayoutStack; class LLNotificationChiclet; -class LLTalkButton; +class LLSpeakButton; class LLNearbyChatBar; class LLIMChiclet; @@ -110,7 +110,7 @@ class LLBottomTray LLChicletPanel* mChicletPanel; LLNotificationChiclet* mSysWell; - LLTalkButton* mTalkBtn; + LLSpeakButton* mSpeakBtn; LLNearbyChatBar* mNearbyChatBar; LLLayoutStack* mToolbarStack; LLMenuGL* mBottomTrayContextMenu; diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index 6eefd9829f1..e84111c53a6 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -833,42 +833,6 @@ class LLChicletPanel : public LLPanel bool mShowControls; }; -/* - * Button displaying voice chat status. Displays voice chat options When clicked. -*/ -class LLTalkButton : public LLUICtrl -{ -public: - - struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> - { - Optional<LLButton::Params> speak_button, - show_button; - - Optional<LLOutputMonitorCtrl::Params> monitor; - - Params(); - }; - - /*virtual*/ ~LLTalkButton(); - - void setSpeakBtnToggleState(bool state); - -protected: - friend class LLUICtrlFactory; - LLTalkButton(const Params& p); - - void onClick_SpeakBtn(); - - void onClick_ShowBtn(); - -private: - LLButton* mSpeakBtn; - LLButton* mShowBtn; - LLVoiceControlPanel* mPrivateCallPanel; - LLOutputMonitorCtrl* mOutputMonitor; -}; - template<class T> T* LLChicletPanel::createChiclet(const LLUUID& session_id, S32 index) { diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 730939861b2..7c26264c9dc 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -36,7 +36,7 @@ #include "lltrans.h" #include "llnearbychatbar.h" -#include "lltalkbutton.h" +#include "llspeakbutton.h" #include "llbottomtray.h" #include "llagent.h" #include "llgesturemgr.h" @@ -229,11 +229,11 @@ BOOL LLNearbyChatBar::postBuild() mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator"); mOutputMonitor->setVisible(FALSE); - mTalkBtn = getParent()->getChild<LLTalkButton>("talk"); + mSpeakBtn = getParent()->getChild<LLSpeakButton>("talk"); // Speak button should be initially disabled because // it takes some time between logging in to world and connecting to voice channel. - mTalkBtn->setEnabled(FALSE); + mSpeakBtn->setEnabled(FALSE); // Registering Chat Bar to receive Voice client status change notifications. gVoiceClient->addObserver(this); @@ -692,7 +692,7 @@ LLWString LLNearbyChatBar::stripChannelNumber(const LLWString &mesg, S32* channe void LLNearbyChatBar::setPTTState(bool state) { - mTalkBtn->setSpeakBtnToggleState(state); + mSpeakBtn->setSpeakBtnToggleState(state); } void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel) @@ -748,7 +748,7 @@ void LLNearbyChatBar::onChange(EStatusType status, const std::string &channelURI break; } - mTalkBtn->setEnabled(enable); + mSpeakBtn->setEnabled(enable); } // Creating the object registers with the dispatcher. diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index 3fa1d3ea8ac..9645c6b4689 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -42,7 +42,7 @@ #include "llspeakers.h" -class LLTalkButton; +class LLSpeakButton; class LLGestureComboBox @@ -128,7 +128,7 @@ class LLNearbyChatBar static S32 sLastSpecialChatChannel; LLLineEditor* mChatBox; - LLTalkButton* mTalkBtn; + LLSpeakButton* mSpeakBtn; LLOutputMonitorCtrl* mOutputMonitor; LLActiveSpeakerMgr mSpeakerMgr; }; diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp new file mode 100644 index 00000000000..c03495ada7b --- /dev/null +++ b/indra/newview/llspeakbutton.cpp @@ -0,0 +1,196 @@ +/** +* @file llspeakbutton.cpp +* @brief LLSpeakButton class implementation +* +* $LicenseInfo:firstyear=2002&license=viewergpl$ +* +* Copyright (c) 2002-2009, Linden Research, Inc. +* +* Second Life Viewer Source Code +* The source code in this file ("Source Code") is provided by Linden Lab +* to you under the terms of the GNU General Public License, version 2.0 +* ("GPL"), unless you have obtained a separate licensing agreement +* ("Other License"), formally executed by you and Linden Lab. Terms of +* the GPL can be found in doc/GPL-license.txt in this distribution, or +* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 +* +* There are special exceptions to the terms and conditions of the GPL as +* it is applied to this Source Code. View the full text of the exception +* in the file doc/FLOSS-exception.txt in this software distribution, or +* online at +* http://secondlifegrid.net/programs/open_source/licensing/flossexception +* +* By copying, modifying or distributing this software, you acknowledge +* that you have read and understood your obligations described above, +* and agree to abide by those obligations. +* +* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO +* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, +* COMPLETENESS OR PERFORMANCE. +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" // must be first include + +#include "llagent.h" +#include "llbottomtray.h" +#include "llfloaterreg.h" +#include "llvoiceclient.h" +#include "llvoicecontrolpanel.h" +#include "lltransientfloatermgr.h" + +#include "llavatariconctrl.h" +#include "llbutton.h" +#include "llpanel.h" +#include "lltextbox.h" +#include "lloutputmonitorctrl.h" +#include "llgroupmgr.h" + +#include "llspeakbutton.h" + +static LLDefaultChildRegistry::Register<LLSpeakButton> t1("chiclet_talk"); + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLSpeakButton::Params::Params() + : speak_button("speak_button") + , show_button("show_button") + , monitor("monitor") +{ + // *TODO Vadim: move hardcoded labels (!) and other params to XUI. + speak_button.name("left"); + speak_button.label("Speak"); + speak_button.label_selected("Speak"); + speak_button.font(LLFontGL::getFontSansSerifSmall()); + speak_button.tab_stop(false); + speak_button.is_toggle(true); + speak_button.picture_style(true); + // Use default button art. JC + //speak_button.image_selected(LLUI::getUIImage("SegmentedBtn_Left_Selected")); + //speak_button.image_unselected(LLUI::getUIImage("SegmentedBtn_Left_Off")); + + show_button.name("right"); + show_button.label(LLStringUtil::null); + show_button.rect(LLRect(0, 0, 20, 0)); + show_button.tab_stop(false); + show_button.is_toggle(true); + show_button.picture_style(true); + show_button.image_selected(LLUI::getUIImage("ComboButton_Selected")); + show_button.image_unselected(LLUI::getUIImage("ComboButton_Off")); + + monitor.name("monitor"); + // *TODO: Make this data driven. + monitor.rect(LLRect(0, 18, 18, 0)); +} + +LLSpeakButton::LLSpeakButton(const Params& p) +: LLUICtrl(p) +, mPrivateCallPanel(NULL) +, mOutputMonitor(NULL) +, mSpeakBtn(NULL) +, mShowBtn(NULL) +{ + LLRect rect = p.rect(); + LLRect speak_rect(0, rect.getHeight(), rect.getWidth(), 0); + LLRect show_rect = p.show_button.rect(); + show_rect.set(0, rect.getHeight(), show_rect.getWidth(), 0); + + speak_rect.mRight -= show_rect.getWidth(); + show_rect.mLeft = speak_rect.getWidth(); + show_rect.mRight = rect.getWidth(); + + LLButton::Params speak_params = p.speak_button; + speak_params.rect(speak_rect); + mSpeakBtn = LLUICtrlFactory::create<LLButton>(speak_params); + addChild(mSpeakBtn); + LLTransientFloaterMgr::getInstance()->addControlView(mSpeakBtn); + + mSpeakBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_SpeakBtn, this)); + mSpeakBtn->setToggleState(FALSE); + + LLButton::Params show_params = p.show_button; + show_params.rect(show_rect); + mShowBtn = LLUICtrlFactory::create<LLButton>(show_params); + addChild(mShowBtn); + LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn); + + mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this)); + mShowBtn->setToggleState(FALSE); + + static const S32 MONITOR_RIGHT_PAD = 2; + + LLRect monitor_rect = p.monitor.rect(); + S32 monitor_height = monitor_rect.getHeight(); + monitor_rect.mLeft = speak_rect.getWidth() - monitor_rect.getWidth() - MONITOR_RIGHT_PAD; + monitor_rect.mRight = speak_rect.getWidth() - MONITOR_RIGHT_PAD; + monitor_rect.mBottom = (rect.getHeight() / 2) - (monitor_height / 2); + monitor_rect.mTop = monitor_rect.mBottom + monitor_height; + + LLOutputMonitorCtrl::Params monitor_params = p.monitor; + monitor_params.draw_border(false); + monitor_params.rect(monitor_rect); + monitor_params.auto_update(true); + monitor_params.speaker_id(gAgentID); + mOutputMonitor = LLUICtrlFactory::create<LLOutputMonitorCtrl>(monitor_params); + mSpeakBtn->addChild(mOutputMonitor); + + // never show "muted" because you can't mute yourself + mOutputMonitor->setIsMuted(false); +} + +LLSpeakButton::~LLSpeakButton() +{ +} + +void LLSpeakButton::setSpeakBtnToggleState(bool state) +{ + mSpeakBtn->setToggleState(state); +} + +void LLSpeakButton::onClick_SpeakBtn() +{ + bool speaking = mSpeakBtn->getToggleState(); + gVoiceClient->setUserPTTState(speaking); +} + +void LLSpeakButton::onClick_ShowBtn() +{ + if(!mShowBtn->getToggleState()) + { + mPrivateCallPanel->onClickClose(mPrivateCallPanel); + delete mPrivateCallPanel; + mPrivateCallPanel = NULL; + mShowBtn->setToggleState(FALSE); + return; + } + + S32 x = mSpeakBtn->getRect().mLeft; + S32 y = 0; + + localPointToScreen(x, y, &x, &y); + + mPrivateCallPanel = new LLVoiceControlPanel; + getRootView()->addChild(mPrivateCallPanel); + + y = LLBottomTray::getInstance()->getRect().getHeight() + mPrivateCallPanel->getRect().getHeight(); + + LLRect rect; + rect.setLeftTopAndSize(x, y, mPrivateCallPanel->getRect().getWidth(), mPrivateCallPanel->getRect().getHeight()); + mPrivateCallPanel->setRect(rect); + + + LLAvatarListItem* item = new LLAvatarListItem(); + item->showLastInteractionTime(false); + item->showInfoBtn(true); + item->showSpeakingIndicator(true); + item->reshape(mPrivateCallPanel->getRect().getWidth(), item->getRect().getHeight(), FALSE); + + mPrivateCallPanel->addItem(item); + mPrivateCallPanel->setVisible(TRUE); + mPrivateCallPanel->setFrontmost(TRUE); + + mShowBtn->setToggleState(TRUE); +} + diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h new file mode 100644 index 00000000000..f1d15ebd707 --- /dev/null +++ b/indra/newview/llspeakbutton.h @@ -0,0 +1,81 @@ +/** +* @file llspeakbutton.h +* @brief LLSpeakButton class header file +* +* $LicenseInfo:firstyear=2002&license=viewergpl$ +* +* Copyright (c) 2002-2009, Linden Research, Inc. +* +* Second Life Viewer Source Code +* The source code in this file ("Source Code") is provided by Linden Lab +* to you under the terms of the GNU General Public License, version 2.0 +* ("GPL"), unless you have obtained a separate licensing agreement +* ("Other License"), formally executed by you and Linden Lab. Terms of +* the GPL can be found in doc/GPL-license.txt in this distribution, or +* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 +* +* There are special exceptions to the terms and conditions of the GPL as +* it is applied to this Source Code. View the full text of the exception +* in the file doc/FLOSS-exception.txt in this software distribution, or +* online at +* http://secondlifegrid.net/programs/open_source/licensing/flossexception +* +* By copying, modifying or distributing this software, you acknowledge +* that you have read and understood your obligations described above, +* and agree to abide by those obligations. +* +* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO +* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, +* COMPLETENESS OR PERFORMANCE. +* $/LicenseInfo$ +*/ + +#ifndef LL_LLSPEAKBUTTON_H +#define LL_LLSPEAKBUTTON_H + +#include "llinitparam.h" +#include "lluictrl.h" + +class LLVoiceControlPanel; +class LLButton; +class LLOutputMonitorCtrl; + +/* + * Button displaying voice chat status. Displays voice chat options when + * clicked. +*/ +class LLSpeakButton : public LLUICtrl +{ +public: + + struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> + { + Optional<LLButton::Params> + speak_button, + show_button; + + Optional<LLOutputMonitorCtrl::Params> monitor; + + Params(); + }; + + /*virtual*/ ~LLSpeakButton(); + + void setSpeakBtnToggleState(bool state); + +protected: + friend class LLUICtrlFactory; + LLSpeakButton(const Params& p); + + void onClick_SpeakBtn(); + + void onClick_ShowBtn(); + +private: + LLButton* mSpeakBtn; + LLButton* mShowBtn; + LLVoiceControlPanel* mPrivateCallPanel; + LLOutputMonitorCtrl* mOutputMonitor; +}; + +#endif // LL_LLSPEAKBUTTON_H -- GitLab From 15df55ecafd2f6d72f25988401ddb7ed58030b79 Mon Sep 17 00:00:00 2001 From: Eugene Mutavchi <emutavchi@productengine.com> Date: Wed, 4 Nov 2009 22:37:46 +0200 Subject: [PATCH 137/306] No ticket, removed unnecessary warnings from 3d35bc1f0cc6 commit. --HG-- branch : product-engine --- indra/newview/llpanelimcontrolpanel.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index 76612f2dd1e..c9168670d5c 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -170,7 +170,7 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) // Fetch the currect name gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4)); - llwarns << "gCacheName->get" << llendl; + // Disable profile button if participant is not realy SL avatar LLIMModel::LLIMSession* im_session = im_model.findIMSession(session_id); @@ -180,10 +180,8 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) { - llwarns << "LLPanelIMControlPanel::nameUpdatedCallback" << llendl; if ( id == mAvatarID ) { - llwarns << "LLPanelIMControlPanel::nameUpdatedCallback id == mAvatarID" << llendl; std::string avatar_name; avatar_name.assign(first); avatar_name.append(" "); -- GitLab From ec9da605c120b9df648eb163dc8647f955275f5f Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 4 Nov 2009 16:25:13 -0500 Subject: [PATCH 138/306] EXT-2216 : Task properties sidepanel Subclassing sidepanel item/task info with llsidepanelinventorysubpanel. Some bug fixing and cleanup. --HG-- branch : avatar-pipeline --- indra/newview/CMakeLists.txt | 2 + indra/newview/llsidepanelinventory.cpp | 5 +- .../newview/llsidepanelinventorysubpanel.cpp | 155 ++++++++++++++++++ indra/newview/llsidepanelinventorysubpanel.h | 82 +++++++++ indra/newview/llsidepaneliteminfo.cpp | 104 +----------- indra/newview/llsidepaneliteminfo.h | 34 +--- indra/newview/llsidepaneltaskinfo.cpp | 61 ++++--- indra/newview/llsidepaneltaskinfo.h | 17 +- 8 files changed, 305 insertions(+), 155 deletions(-) create mode 100644 indra/newview/llsidepanelinventorysubpanel.cpp create mode 100644 indra/newview/llsidepanelinventorysubpanel.h diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index c490c31393c..b3de276e9c5 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -370,6 +370,7 @@ set(viewer_SOURCE_FILES llsearchhistory.cpp llselectmgr.cpp llsidepanelinventory.cpp + llsidepanelinventorysubpanel.cpp llsidepaneliteminfo.cpp llsidepaneltaskinfo.cpp llsidetray.cpp @@ -856,6 +857,7 @@ set(viewer_HEADER_FILES llsearchhistory.h llselectmgr.h llsidepanelinventory.h + llsidepanelinventorysubpanel.h llsidepaneliteminfo.h llsidepaneltaskinfo.h llsidetray.h diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 9b67bc701da..c4779cd29a8 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -186,7 +186,7 @@ void LLSidepanelInventory::showItemInfoPanel() mInventoryPanel->setVisible(FALSE); mItemPanel->dirty(); - mItemPanel->setEditMode(FALSE); + mItemPanel->setIsEditing(FALSE); } void LLSidepanelInventory::showTaskInfoPanel() @@ -194,6 +194,9 @@ void LLSidepanelInventory::showTaskInfoPanel() mItemPanel->setVisible(FALSE); mTaskPanel->setVisible(TRUE); mInventoryPanel->setVisible(FALSE); + + mTaskPanel->dirty(); + mTaskPanel->setIsEditing(FALSE); } void LLSidepanelInventory::showInventoryPanel() diff --git a/indra/newview/llsidepanelinventorysubpanel.cpp b/indra/newview/llsidepanelinventorysubpanel.cpp new file mode 100644 index 00000000000..85224567771 --- /dev/null +++ b/indra/newview/llsidepanelinventorysubpanel.cpp @@ -0,0 +1,155 @@ +/** + * @file llsidepanelinventorysubpanel.cpp + * @brief A floater which shows an inventory item's properties. + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llsidepanelinventorysubpanel.h" + +#include "roles_constants.h" + +#include "llagent.h" +#include "llavataractions.h" +#include "llbutton.h" +#include "llfloaterreg.h" +#include "llgroupactions.h" +#include "llinventorymodel.h" +#include "lllineeditor.h" +#include "llradiogroup.h" +#include "llviewercontrol.h" +#include "llviewerinventory.h" +#include "llviewerobjectlist.h" + + +///---------------------------------------------------------------------------- +/// Class LLSidepanelInventorySubpanel +///---------------------------------------------------------------------------- + +// Default constructor +LLSidepanelInventorySubpanel::LLSidepanelInventorySubpanel() + : LLPanel(), + mIsDirty(TRUE), + mIsEditing(FALSE), + mEditBtn(NULL), + mCancelBtn(NULL), + mSaveBtn(NULL) +{ +} + +// Destroys the object +LLSidepanelInventorySubpanel::~LLSidepanelInventorySubpanel() +{ +} + +// virtual +BOOL LLSidepanelInventorySubpanel::postBuild() +{ + mEditBtn = getChild<LLButton>("edit_btn"); + mEditBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onEditButtonClicked, this)); + + mSaveBtn = getChild<LLButton>("save_btn"); + mSaveBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onSaveButtonClicked, this)); + + mCancelBtn = getChild<LLButton>("cancel_btn"); + mCancelBtn->setClickedCallback(boost::bind(&LLSidepanelInventorySubpanel::onCancelButtonClicked, this)); + return TRUE; +} + +void LLSidepanelInventorySubpanel::setVisible(BOOL visible) +{ + if (visible) + { + dirty(); + setIsEditing(FALSE); + } + LLPanel::setVisible(visible); +} + +void LLSidepanelInventorySubpanel::setIsEditing(BOOL edit) +{ + mIsEditing = edit; + mIsDirty = TRUE; +} + +BOOL LLSidepanelInventorySubpanel::getIsEditing() const +{ + return mIsEditing; +} + +void LLSidepanelInventorySubpanel::reset() +{ + mIsDirty = TRUE; +} + +void LLSidepanelInventorySubpanel::draw() +{ + if (mIsDirty) + { + mIsDirty = FALSE; + refresh(); + updateVerbs(); + } + + LLPanel::draw(); +} + +void LLSidepanelInventorySubpanel::dirty() +{ + mIsDirty = TRUE; +} + +void LLSidepanelInventorySubpanel::updateVerbs() +{ + mEditBtn->setVisible(!mIsEditing); + mSaveBtn->setVisible(mIsEditing); + mCancelBtn->setVisible(mIsEditing); +} + +void LLSidepanelInventorySubpanel::onEditButtonClicked() +{ + setIsEditing(TRUE); + refresh(); + updateVerbs(); +} + +void LLSidepanelInventorySubpanel::onSaveButtonClicked() +{ + save(); + setIsEditing(FALSE); + refresh(); + updateVerbs(); +} + +void LLSidepanelInventorySubpanel::onCancelButtonClicked() +{ + setIsEditing(FALSE); + refresh(); + updateVerbs(); +} diff --git a/indra/newview/llsidepanelinventorysubpanel.h b/indra/newview/llsidepanelinventorysubpanel.h new file mode 100644 index 00000000000..6503887cd1a --- /dev/null +++ b/indra/newview/llsidepanelinventorysubpanel.h @@ -0,0 +1,82 @@ +/** + * @file llsidepanelinventorysubpanel.h + * @brief A panel which shows an inventory item's properties. + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLSIDEPANELINVENTORYSUBPANEL_H +#define LL_LLSIDEPANELINVENTORYSUBPANEL_H + +#include "llpanel.h" + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLSidepanelInventorySubpanel +// Base class for inventory sidepanel panels (e.g. item info, task info). +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLButton; +class LLInventoryItem; + +class LLSidepanelInventorySubpanel : public LLPanel +{ +public: + LLSidepanelInventorySubpanel(); + virtual ~LLSidepanelInventorySubpanel(); + + /*virtual*/ void setVisible(BOOL visible); + virtual BOOL postBuild(); + virtual void draw(); + virtual void reset(); + + void dirty(); + void setIsEditing(BOOL edit); +protected: + virtual void refresh() = 0; + virtual void save() = 0; + virtual void updateVerbs(); + + BOOL getIsEditing() const; + + // + // UI Elements + // +protected: + void onEditButtonClicked(); + void onSaveButtonClicked(); + void onCancelButtonClicked(); + LLButton* mEditBtn; + LLButton* mSaveBtn; + LLButton* mCancelBtn; + +private: + BOOL mIsDirty; // item properties need to be updated + BOOL mIsEditing; // if we're in edit mode +}; + +#endif // LL_LLSIDEPANELINVENTORYSUBPANEL_H diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index c857afc6527..d36ffc9a9cc 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -89,10 +89,7 @@ static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_i // Default constructor LLSidepanelItemInfo::LLSidepanelItemInfo() - : LLPanel(), - mItemID(LLUUID::null), - mDirty(TRUE), - mEditMode(FALSE) + : mItemID(LLUUID::null) { mPropertiesObserver = new LLItemPropertiesObserver(this); @@ -109,14 +106,7 @@ LLSidepanelItemInfo::~LLSidepanelItemInfo() // virtual BOOL LLSidepanelItemInfo::postBuild() { - mEditBtn = getChild<LLButton>("edit_btn"); - mEditBtn->setClickedCallback(boost::bind(&LLSidepanelItemInfo::onEditButtonClicked, this)); - - mSaveBtn = getChild<LLButton>("save_btn"); - mSaveBtn->setClickedCallback(boost::bind(&LLSidepanelItemInfo::onSaveButtonClicked, this)); - - mCancelBtn = getChild<LLButton>("cancel_btn"); - mCancelBtn->setClickedCallback(boost::bind(&LLSidepanelItemInfo::onCancelButtonClicked, this)); + LLSidepanelInventorySubpanel::postBuild(); // build the UI // item name & description @@ -131,42 +121,10 @@ BOOL LLSidepanelItemInfo::postBuild() // owner information getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickOwner,this)); - // acquired date - // owner permissions - // Permissions debug text - // group permissions - // getChild<LLUICtrl>("CheckShareWithGroup")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); - - // everyone permissions - // getChild<LLUICtrl>("CheckEveryoneCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); - - // next owner permissions - // getChild<LLUICtrl>("CheckNextOwnerModify")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); - // getChild<LLUICtrl>("CheckNextOwnerCopy")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); - // getChild<LLUICtrl>("CheckNextOwnerTransfer")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this)); - - // Mark for sale or not, and sale info - // getChild<LLUICtrl>("CheckPurchase")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this)); - // getChild<LLUICtrl>("RadioSaleType")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleType, this)); - - // "Price" label for edit - // getChild<LLUICtrl>("Edit Cost")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this)); - - // The UI has been built, now fill in all the values refresh(); - return TRUE; } -void LLSidepanelItemInfo::setVisible(BOOL visible) -{ - if (visible) - { - mDirty = TRUE; - } - LLPanel::setVisible(visible); -} - void LLSidepanelItemInfo::setObjectID(const LLUUID& object_id) { mObjectID = object_id; @@ -177,17 +135,12 @@ void LLSidepanelItemInfo::setItemID(const LLUUID& item_id) mItemID = item_id; } -void LLSidepanelItemInfo::setEditMode(BOOL edit) -{ - mEditMode = edit; - mDirty = TRUE; -} - void LLSidepanelItemInfo::reset() { + LLSidepanelInventorySubpanel::reset(); + mObjectID = LLUUID::null; mItemID = LLUUID::null; - mDirty = TRUE; } void LLSidepanelItemInfo::refresh() @@ -199,13 +152,8 @@ void LLSidepanelItemInfo::refresh() updateVerbs(); } - if (!mEditMode || !item) + if (!getIsEditing() || !item) { - //RN: it is possible that the container object is in the middle of an inventory refresh - // causing findItem() to fail, so just temporarily disable everything - - mDirty = TRUE; - const std::string no_item_names[]={ "LabelItemName", "LabelItemDesc", @@ -257,22 +205,6 @@ void LLSidepanelItemInfo::refresh() updateVerbs(); } -void LLSidepanelItemInfo::draw() -{ - if (mDirty) - { - mDirty = FALSE; - refresh(); - } - - LLPanel::draw(); -} - -void LLSidepanelItemInfo::dirty() -{ - mDirty = TRUE; -} - void LLSidepanelItemInfo::refreshFromItem(LLInventoryItem* item) { //////////////////////// @@ -916,11 +848,10 @@ LLInventoryItem* LLSidepanelItemInfo::findItem() const return item; } +// virtual void LLSidepanelItemInfo::updateVerbs() { - mEditBtn->setVisible(!mEditMode); - mSaveBtn->setVisible(mEditMode); - mCancelBtn->setVisible(mEditMode); + LLSidepanelInventorySubpanel::updateVerbs(); const LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem(); if (item) @@ -932,29 +863,12 @@ void LLSidepanelItemInfo::updateVerbs() } } -void LLSidepanelItemInfo::onEditButtonClicked() -{ - setEditMode(TRUE); - refresh(); - updateVerbs(); -} - -void LLSidepanelItemInfo::onSaveButtonClicked() +// virtual +void LLSidepanelItemInfo::save() { onCommitName(); onCommitDescription(); onCommitPermissions(); onCommitSaleInfo(); onCommitSaleType(); - - setEditMode(FALSE); - refresh(); - updateVerbs(); -} - -void LLSidepanelItemInfo::onCancelButtonClicked() -{ - setEditMode(FALSE); - refresh(); - updateVerbs(); } diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h index 9f5ab402eab..b348b5cceba 100644 --- a/indra/newview/llsidepaneliteminfo.h +++ b/indra/newview/llsidepaneliteminfo.h @@ -33,10 +33,7 @@ #ifndef LL_LLSIDEPANELITEMINFO_H #define LL_LLSIDEPANELITEMINFO_H -#include <map> -#include "llmultifloater.h" -#include "lliconctrl.h" -#include "llpermissions.h" +#include "llsidepanelinventorysubpanel.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLSidepanelItemInfo @@ -47,38 +44,34 @@ class LLButton; class LLInventoryItem; class LLItemPropertiesObserver; class LLViewerObject; +class LLPermissions; -class LLSidepanelItemInfo : public LLPanel +class LLSidepanelItemInfo : public LLSidepanelInventorySubpanel { public: LLSidepanelItemInfo(); virtual ~LLSidepanelItemInfo(); /*virtual*/ BOOL postBuild(); - /*virtual*/ void setVisible(BOOL visible); - /*virtual*/ void draw(); + /*virtual*/ void reset(); void setObjectID(const LLUUID& object_id); void setItemID(const LLUUID& item_id); void setEditMode(BOOL edit); - void reset(); - void dirty(); - protected: + /*virtual*/ void refresh(); + /*virtual*/ void save(); + /*virtual*/ void updateVerbs(); + LLInventoryItem* findItem() const; LLViewerObject* findObject() const; - void refresh(); + void refreshFromItem(LLInventoryItem* item); - void refreshFromPermissions(const LLPermissions& perm); - void updateVerbs(); - BOOL isUpdatingObject() const; private: LLUUID mItemID; // inventory UUID for the inventory item. LLUUID mObjectID; // in-world task UUID, or null if in agent inventory. - BOOL mDirty; // item properties need to be updated - BOOL mEditMode; // if we're in edit mode LLItemPropertiesObserver* mPropertiesObserver; // for syncing changes to item // @@ -93,15 +86,6 @@ class LLSidepanelItemInfo : public LLPanel void onCommitSaleInfo(); void onCommitSaleType(); void updateSaleInfo(); - -protected: - void onEditButtonClicked(); - void onSaveButtonClicked(); - void onCancelButtonClicked(); -private: - LLButton* mEditBtn; - LLButton* mSaveBtn; - LLButton* mCancelBtn; }; #endif // LL_LLSIDEPANELITEMINFO_H diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 203fc35187b..3608e2c097e 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -73,14 +73,22 @@ static LLRegisterPanelClassWrapper<LLSidepanelTaskInfo> t_task_info("sidepanel_task_info"); // Default constructor -LLSidepanelTaskInfo::LLSidepanelTaskInfo() : - LLPanel() +LLSidepanelTaskInfo::LLSidepanelTaskInfo() { setMouseOpaque(FALSE); } BOOL LLSidepanelTaskInfo::postBuild() { + LLSidepanelInventorySubpanel::postBuild(); + + mOpenBtn = getChild<LLButton>("open_btn"); + mOpenBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onOpenButtonClicked, this)); + mBuildBtn = getChild<LLButton>("build_btn"); + mBuildBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuildButtonClicked, this)); + mBuyBtn = getChild<LLButton>("buy_btn"); + mBuyBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuyButtonClicked, this)); + childSetCommitCallback("Object Name",LLSidepanelTaskInfo::onCommitName,this); childSetPrevalidate("Object Name",LLLineEditor::prevalidatePrintableNotPipe); childSetCommitCallback("Object Description",LLSidepanelTaskInfo::onCommitDesc,this); @@ -114,26 +122,6 @@ BOOL LLSidepanelTaskInfo::postBuild() return TRUE; } -void LLSidepanelTaskInfo::setVisible(BOOL visible) -{ - if (visible) - { - mDirty = TRUE; - } - LLPanel::setVisible(visible); -} - -void LLSidepanelTaskInfo::draw() -{ - if (mDirty) - { - mDirty = FALSE; - refresh(); - } - - LLPanel::draw(); -} - LLSidepanelTaskInfo::~LLSidepanelTaskInfo() { // base class will take care of everything @@ -800,6 +788,8 @@ void LLSidepanelTaskInfo::refresh() } childSetEnabled("label click action",is_perm_modify && all_volume); childSetEnabled("clickaction",is_perm_modify && all_volume); + + updateVerbs(); } @@ -1064,3 +1054,30 @@ void LLSidepanelTaskInfo::onCommitIncludeInSearch(LLUICtrl* ctrl, void*) LLSelectMgr::getInstance()->selectionSetIncludeInSearch(box->get()); } +// virtual +void LLSidepanelTaskInfo::updateVerbs() +{ + LLSidepanelInventorySubpanel::updateVerbs(); + + mOpenBtn->setVisible(!getIsEditing()); + mBuildBtn->setVisible(!getIsEditing()); + mBuyBtn->setVisible(!getIsEditing()); +} + +void LLSidepanelTaskInfo::onOpenButtonClicked() +{ +} + +void LLSidepanelTaskInfo::onBuildButtonClicked() +{ +} + +void LLSidepanelTaskInfo::onBuyButtonClicked() +{ +} + +// virtual +void LLSidepanelTaskInfo::save() +{ +} + diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h index 2b9b4b66b6b..aea65c11706 100644 --- a/indra/newview/llsidepaneltaskinfo.h +++ b/indra/newview/llsidepaneltaskinfo.h @@ -33,7 +33,7 @@ #ifndef LL_LLSIDEPANELTASKINFO_H #define LL_LLSIDEPANELTASKINFO_H -#include "llpanel.h" +#include "llsidepanelinventorysubpanel.h" #include "lluuid.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -44,18 +44,18 @@ class LLNameBox; -class LLSidepanelTaskInfo : public LLPanel +class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel { public: LLSidepanelTaskInfo(); virtual ~LLSidepanelTaskInfo(); /*virtual*/ BOOL postBuild(); - /*virtual*/ void draw(); - /*virtual*/ void setVisible(BOOL visible); protected: - void refresh(); // refresh all labels as needed + /*virtual*/ void refresh(); // refresh all labels as needed + /*virtual*/ void save(); + /*virtual*/ void updateVerbs(); // statics static void onClickClaim(void*); @@ -91,19 +91,12 @@ class LLSidepanelTaskInfo : public LLPanel LLUUID mCreatorID; LLUUID mOwnerID; LLUUID mLastOwnerID; - BOOL mDirty; // item properties need to be updated protected: - void onEditButtonClicked(); - void onSaveButtonClicked(); - void onCancelButtonClicked(); void onOpenButtonClicked(); void onBuildButtonClicked(); void onBuyButtonClicked(); private: - LLButton* mEditBtn; - LLButton* mSaveBtn; - LLButton* mCancelBtn; LLButton* mOpenBtn; LLButton* mBuildBtn; LLButton* mBuyBtn; -- GitLab From b806edf4ac47d18e1a43fb8dbb5fbcad8d13192f Mon Sep 17 00:00:00 2001 From: Bryan O'Sullivan <bos@lindenlab.com> Date: Wed, 4 Nov 2009 14:59:23 -0800 Subject: [PATCH 139/306] Redo Bao's broken merge --- indra/llcommon/CMakeLists.txt | 2 + indra/llcommon/llassettype.cpp | 154 +-- indra/llcommon/llassettype.h | 62 +- indra/llcommon/llfoldertype.cpp | 165 +++ indra/llcommon/llfoldertype.h | 123 +++ indra/llinventory/llinventory.cpp | 62 +- indra/llinventory/llinventory.h | 13 +- indra/llinventory/llinventorytype.cpp | 34 - indra/llinventory/llinventorytype.h | 3 +- .../llinventory/tests/inventorymisc_test.cpp | 4 +- indra/llmessage/lltransfersourceasset.cpp | 1 - indra/llprimitive/llmediaentry.cpp | 1 + indra/llprimitive/tests/llmediaentry_test.cpp | 116 ++- indra/llui/llfloater.cpp | 6 + indra/llui/llfloater.h | 3 + indra/llui/llfloaterreg.cpp | 3 +- indra/newview/CMakeLists.txt | 10 +- indra/newview/app_settings/foldertypes.xml | 25 +- indra/newview/llagentpicksinfo.cpp | 3 +- indra/newview/llagentui.cpp | 5 +- indra/newview/llagentwearables.cpp | 17 +- indra/newview/llappearancemgr.cpp | 24 +- indra/newview/llassetuploadresponders.cpp | 2 +- indra/newview/llavataractions.cpp | 4 +- indra/newview/llavatarlist.cpp | 35 + indra/newview/llavatarlist.h | 7 + indra/newview/llchiclet.cpp | 38 +- indra/newview/llfavoritesbar.cpp | 6 +- indra/newview/llfloateranimpreview.cpp | 2 +- indra/newview/llfloaterbulkpermission.cpp | 1 - indra/newview/llfloaterbuy.cpp | 2 +- indra/newview/llfloaterbuycontents.cpp | 2 +- indra/newview/llfloaterinventory.cpp | 1 + indra/newview/llfloaterinventory.h | 1 + indra/newview/llfloaternamedesc.cpp | 2 +- indra/newview/llfloateropenobject.cpp | 4 +- indra/newview/llfloaterreporter.cpp | 4 +- indra/newview/llfloatersnapshot.cpp | 2 +- indra/newview/llfloaterworldmap.cpp | 2 +- indra/newview/llfolderview.cpp | 5 +- indra/newview/llfolderview.h | 2 +- indra/newview/llfoldervieweventlistener.h | 3 +- indra/newview/llfolderviewitem.cpp | 10 +- indra/newview/llfriendcard.cpp | 8 +- indra/newview/llimfloater.cpp | 7 +- indra/newview/llinspectavatar.cpp | 19 +- indra/newview/llinventorybridge.cpp | 95 +- indra/newview/llinventorybridge.h | 8 +- indra/newview/llinventoryfunctions.cpp | 4 - indra/newview/llinventorymodel.cpp | 63 +- indra/newview/llinventorymodel.h | 13 +- indra/newview/llinventorypanel.cpp | 30 +- indra/newview/llinventorypanel.h | 2 +- indra/newview/lllandmarkactions.cpp | 14 +- indra/newview/lllandmarkactions.h | 2 +- indra/newview/llnavigationbar.cpp | 7 + indra/newview/llnavigationbar.h | 1 + indra/newview/llnearbychat.cpp | 37 +- indra/newview/llnearbychat.h | 7 +- indra/newview/llnearbychatbar.cpp | 9 +- indra/newview/llnearbychatbar.h | 2 +- indra/newview/lloutputmonitorctrl.cpp | 12 +- indra/newview/lloutputmonitorctrl.h | 3 + indra/newview/llpanelcontents.cpp | 3 +- indra/newview/llpanelimcontrolpanel.cpp | 35 +- indra/newview/llpanelimcontrolpanel.h | 3 + indra/newview/llpanellandmarkinfo.cpp | 437 ++++++++ indra/newview/llpanellandmarkinfo.h | 85 ++ indra/newview/llpanellandmarks.cpp | 33 +- indra/newview/llpanelmaininventory.cpp | 4 +- indra/newview/llpanelobjectinventory.cpp | 14 +- indra/newview/llpanelpeople.cpp | 67 +- indra/newview/llpanelpeople.h | 6 + indra/newview/llpanelplaceinfo.cpp | 931 +---------------- indra/newview/llpanelplaceinfo.h | 146 +-- indra/newview/llpanelplaceprofile.cpp | 541 ++++++++++ indra/newview/llpanelplaceprofile.h | 114 ++ indra/newview/llpanelplaces.cpp | 231 +++-- indra/newview/llpanelplaces.h | 11 +- indra/newview/llpanelprofileview.h | 14 + indra/newview/llparticipantlist.cpp | 110 +- indra/newview/llparticipantlist.h | 58 +- indra/newview/llpreview.cpp | 5 +- indra/newview/llpreviewgesture.cpp | 4 +- indra/newview/llresourcedata.h | 3 +- indra/newview/llselectmgr.cpp | 2 +- indra/newview/llstartup.cpp | 6 +- indra/newview/lltexturectrl.cpp | 4 +- indra/newview/lltoastgroupnotifypanel.cpp | 1 - indra/newview/lltooldraganddrop.cpp | 21 +- indra/newview/llviewerassettype.cpp | 114 ++ indra/newview/llviewerassettype.h | 54 + indra/newview/llviewerfoldertype.cpp | 263 +++++ indra/newview/llviewerfoldertype.h | 57 + indra/newview/llviewerinventory.cpp | 112 +- indra/newview/llviewerinventory.h | 4 +- indra/newview/llviewermenu.cpp | 13 +- indra/newview/llviewermenufile.cpp | 16 +- indra/newview/llviewermenufile.h | 6 +- indra/newview/llviewermessage.cpp | 42 +- indra/newview/llviewertexteditor.cpp | 20 +- indra/newview/llvoavatarself.cpp | 35 +- indra/newview/llwearable.cpp | 2 +- .../default/textures/inv_folder_inbox.tga | Bin 0 -> 2085 bytes .../default/xui/en/floater_im_session.xml | 22 +- .../skins/default/xui/en/inspect_avatar.xml | 12 + .../xui/en/menu_inspect_avatar_gear.xml | 15 +- .../default/xui/en/menu_inspect_self_gear.xml | 7 +- .../xui/en/panel_adhoc_control_panel.xml | 5 +- .../skins/default/xui/en/panel_bottomtray.xml | 4 +- .../xui/en/panel_group_control_panel.xml | 6 +- .../default/xui/en/panel_group_general.xml | 6 +- .../xui/en/panel_group_info_sidetray.xml | 141 ++- .../default/xui/en/panel_group_land_money.xml | 207 ++-- .../default/xui/en/panel_group_notices.xml | 243 ++--- .../default/xui/en/panel_group_roles.xml | 503 +++------ .../default/xui/en/panel_im_control_panel.xml | 27 +- .../default/xui/en/panel_landmark_info.xml | 257 +++++ .../skins/default/xui/en/panel_landmarks.xml | 18 +- .../default/xui/en/panel_nearby_chat_bar.xml | 6 +- .../skins/default/xui/en/panel_pick_info.xml | 2 +- .../default/xui/en/panel_place_profile.xml | 979 ++++++++++++++++++ .../skins/default/xui/en/panel_places.xml | 18 +- .../skins/default/xui/en/panel_profile.xml | 2 +- .../default/xui/en/panel_profile_view.xml | 2 +- .../xui/en/widgets/gesture_combo_box.xml | 10 +- .../default/xui/en/widgets/talk_button.xml | 37 + 127 files changed, 4882 insertions(+), 2588 deletions(-) create mode 100644 indra/llcommon/llfoldertype.cpp create mode 100644 indra/llcommon/llfoldertype.h create mode 100644 indra/newview/llpanellandmarkinfo.cpp create mode 100644 indra/newview/llpanellandmarkinfo.h create mode 100644 indra/newview/llpanelplaceprofile.cpp create mode 100644 indra/newview/llpanelplaceprofile.h create mode 100644 indra/newview/llviewerassettype.cpp create mode 100644 indra/newview/llviewerassettype.h create mode 100644 indra/newview/llviewerfoldertype.cpp create mode 100644 indra/newview/llviewerfoldertype.h create mode 100644 indra/newview/skins/default/textures/inv_folder_inbox.tga create mode 100644 indra/newview/skins/default/xui/en/panel_landmark_info.xml create mode 100644 indra/newview/skins/default/xui/en/panel_place_profile.xml create mode 100644 indra/newview/skins/default/xui/en/widgets/talk_button.xml diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index e7aaf3c984d..f7856986121 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -50,6 +50,7 @@ set(llcommon_SOURCE_FILES llfile.cpp llfindlocale.cpp llfixedbuffer.cpp + llfoldertype.cpp llformat.cpp llframetimer.cpp llheartbeat.cpp @@ -150,6 +151,7 @@ set(llcommon_HEADER_FILES llfile.h llfindlocale.h llfixedbuffer.h + llfoldertype.h llformat.h llframetimer.h llhash.h diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp index b2a92861cc3..6d5b12d840b 100644 --- a/indra/llcommon/llassettype.cpp +++ b/indra/llcommon/llassettype.cpp @@ -43,30 +43,21 @@ struct AssetEntry : public LLDictionaryEntry { AssetEntry(const char *desc_name, - const char *type_name, // 8 character limit! - const char *human_name, // for decoding to human readable form; put any and as many printable characters you want in each one - const char *category_name, // used by llinventorymodel when creating new categories - EDragAndDropType dad_type, - bool can_link, // can you create a link to this type? - bool is_protected) // can the viewer change categories of this type? + const char *type_name, // 8 character limit! + const char *human_name, // for decoding to human readable form; put any and as many printable characters you want in each one + bool can_link) // can you create a link to this type? : LLDictionaryEntry(desc_name), mTypeName(type_name), mHumanName(human_name), - mCategoryName(category_name), - mDadType(dad_type), - mCanLink(can_link), - mIsProtected(is_protected) + mCanLink(can_link) { llassert(strlen(mTypeName) <= 8); } const char *mTypeName; const char *mHumanName; - const char *mCategoryName; - EDragAndDropType mDadType; bool mCanLink; - bool mIsProtected; }; class LLAssetDictionary : public LLSingleton<LLAssetDictionary>, @@ -78,48 +69,32 @@ class LLAssetDictionary : public LLSingleton<LLAssetDictionary>, LLAssetDictionary::LLAssetDictionary() { - // DESCRIPTION TYPE NAME HUMAN NAME CATEGORY NAME DRAG&DROP CAN LINK? PROTECTED? - // |--------------------|-----------|-------------------|-------------------|---------------|-----------|-----------| - addEntry(LLAssetType::AT_TEXTURE, new AssetEntry("TEXTURE", "texture", "texture", "Textures", DAD_TEXTURE, TRUE, TRUE)); - addEntry(LLAssetType::AT_SOUND, new AssetEntry("SOUND", "sound", "sound", "Sounds", DAD_SOUND, TRUE, TRUE)); - addEntry(LLAssetType::AT_CALLINGCARD, new AssetEntry("CALLINGCARD", "callcard", "calling card", "Calling Cards", DAD_CALLINGCARD, TRUE, TRUE)); - addEntry(LLAssetType::AT_LANDMARK, new AssetEntry("LANDMARK", "landmark", "landmark", "Landmarks", DAD_LANDMARK, TRUE, TRUE)); - addEntry(LLAssetType::AT_SCRIPT, new AssetEntry("SCRIPT", "script", "legacy script", "Scripts", DAD_NONE, TRUE, TRUE)); - addEntry(LLAssetType::AT_CLOTHING, new AssetEntry("CLOTHING", "clothing", "clothing", "Clothing", DAD_CLOTHING, TRUE, TRUE)); - addEntry(LLAssetType::AT_OBJECT, new AssetEntry("OBJECT", "object", "object", "Objects", DAD_OBJECT, TRUE, TRUE)); - addEntry(LLAssetType::AT_NOTECARD, new AssetEntry("NOTECARD", "notecard", "note card", "Notecards", DAD_NOTECARD, TRUE, TRUE)); - addEntry(LLAssetType::AT_CATEGORY, new AssetEntry("CATEGORY", "category", "folder", "New Folder", DAD_CATEGORY, TRUE, TRUE)); - addEntry(LLAssetType::AT_ROOT_CATEGORY, new AssetEntry("ROOT_CATEGORY", "root", "root", "Inventory", DAD_ROOT_CATEGORY, TRUE, TRUE)); - addEntry(LLAssetType::AT_LSL_TEXT, new AssetEntry("LSL_TEXT", "lsltext", "lsl2 script", "Scripts", DAD_SCRIPT, TRUE, TRUE)); - addEntry(LLAssetType::AT_LSL_BYTECODE, new AssetEntry("LSL_BYTECODE", "lslbyte", "lsl bytecode", "Scripts", DAD_NONE, TRUE, TRUE)); - addEntry(LLAssetType::AT_TEXTURE_TGA, new AssetEntry("TEXTURE_TGA", "txtr_tga", "tga texture", "Uncompressed Images", DAD_NONE, TRUE, TRUE)); - addEntry(LLAssetType::AT_BODYPART, new AssetEntry("BODYPART", "bodypart", "body part", "Body Parts", DAD_BODYPART, TRUE, TRUE)); - addEntry(LLAssetType::AT_TRASH, new AssetEntry("TRASH", "trash", "trash", "Trash", DAD_NONE, FALSE, TRUE)); - addEntry(LLAssetType::AT_SNAPSHOT_CATEGORY, new AssetEntry("SNAPSHOT_CATEGORY", "snapshot", "snapshot", "Photo Album", DAD_NONE, FALSE, TRUE)); - addEntry(LLAssetType::AT_LOST_AND_FOUND, new AssetEntry("LOST_AND_FOUND", "lstndfnd", "lost and found", "Lost And Found", DAD_NONE, FALSE, TRUE)); - addEntry(LLAssetType::AT_SOUND_WAV, new AssetEntry("SOUND_WAV", "snd_wav", "sound", "Uncompressed SoundS", DAD_NONE, TRUE, TRUE)); - addEntry(LLAssetType::AT_IMAGE_TGA, new AssetEntry("IMAGE_TGA", "img_tga", "targa image", "Uncompressed Images", DAD_NONE, TRUE, TRUE)); - addEntry(LLAssetType::AT_IMAGE_JPEG, new AssetEntry("IMAGE_JPEG", "jpeg", "jpeg image", "Uncompressed Images", DAD_NONE, TRUE, TRUE)); - addEntry(LLAssetType::AT_ANIMATION, new AssetEntry("ANIMATION", "animatn", "animation", "Animations", DAD_ANIMATION, TRUE, TRUE)); - addEntry(LLAssetType::AT_GESTURE, new AssetEntry("GESTURE", "gesture", "gesture", "Gestures", DAD_GESTURE, TRUE, TRUE)); - addEntry(LLAssetType::AT_SIMSTATE, new AssetEntry("SIMSTATE", "simstate", "simstate", "New Folder", DAD_NONE, FALSE, TRUE)); - addEntry(LLAssetType::AT_FAVORITE, new AssetEntry("FAVORITE", "favorite", "favorite", "favorite", DAD_NONE, FALSE, TRUE)); - - addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "symbolic link", "Link", DAD_LINK, FALSE, TRUE)); - addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "symbolic folder link", "New Folder", DAD_LINK, FALSE, TRUE)); - - for (S32 ensemble_num = S32(LLAssetType::AT_FOLDER_ENSEMBLE_START); - ensemble_num <= S32(LLAssetType::AT_FOLDER_ENSEMBLE_END); - ensemble_num++) - { - addEntry(LLAssetType::EType(ensemble_num), new AssetEntry("ENSEMBLE", "ensemble", "ensemble", "New Folder", DAD_CATEGORY, FALSE, FALSE)); - } - - addEntry(LLAssetType::AT_CURRENT_OUTFIT, new AssetEntry("CURRENT", "current", "current outfit", "Current Look", DAD_CATEGORY, FALSE, TRUE)); - addEntry(LLAssetType::AT_OUTFIT, new AssetEntry("OUTFIT", "outfit", "outfit", "New Look", DAD_CATEGORY, FALSE, FALSE)); - addEntry(LLAssetType::AT_MY_OUTFITS, new AssetEntry("MY_OUTFITS", "my_otfts", "my outfits", "My Looks", DAD_CATEGORY, FALSE, TRUE)); - - addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, "New Folder", DAD_NONE, FALSE, FALSE)); + // DESCRIPTION TYPE NAME HUMAN NAME CAN LINK? + // |--------------------|-----------|-------------------|-----------| + addEntry(LLAssetType::AT_TEXTURE, new AssetEntry("TEXTURE", "texture", "texture", FALSE)); + addEntry(LLAssetType::AT_SOUND, new AssetEntry("SOUND", "sound", "sound", FALSE)); + addEntry(LLAssetType::AT_CALLINGCARD, new AssetEntry("CALLINGCARD", "callcard", "calling card", FALSE)); + addEntry(LLAssetType::AT_LANDMARK, new AssetEntry("LANDMARK", "landmark", "landmark", FALSE)); + addEntry(LLAssetType::AT_SCRIPT, new AssetEntry("SCRIPT", "script", "legacy script", FALSE)); + addEntry(LLAssetType::AT_CLOTHING, new AssetEntry("CLOTHING", "clothing", "clothing", TRUE)); + addEntry(LLAssetType::AT_OBJECT, new AssetEntry("OBJECT", "object", "object", TRUE)); + addEntry(LLAssetType::AT_NOTECARD, new AssetEntry("NOTECARD", "notecard", "note card", FALSE)); + addEntry(LLAssetType::AT_CATEGORY, new AssetEntry("CATEGORY", "category", "folder", TRUE)); + addEntry(LLAssetType::AT_LSL_TEXT, new AssetEntry("LSL_TEXT", "lsltext", "lsl2 script", FALSE)); + addEntry(LLAssetType::AT_LSL_BYTECODE, new AssetEntry("LSL_BYTECODE", "lslbyte", "lsl bytecode", FALSE)); + addEntry(LLAssetType::AT_TEXTURE_TGA, new AssetEntry("TEXTURE_TGA", "txtr_tga", "tga texture", FALSE)); + addEntry(LLAssetType::AT_BODYPART, new AssetEntry("BODYPART", "bodypart", "body part", TRUE)); + addEntry(LLAssetType::AT_SOUND_WAV, new AssetEntry("SOUND_WAV", "snd_wav", "sound", FALSE)); + addEntry(LLAssetType::AT_IMAGE_TGA, new AssetEntry("IMAGE_TGA", "img_tga", "targa image", FALSE)); + addEntry(LLAssetType::AT_IMAGE_JPEG, new AssetEntry("IMAGE_JPEG", "jpeg", "jpeg image", FALSE)); + addEntry(LLAssetType::AT_ANIMATION, new AssetEntry("ANIMATION", "animatn", "animation", FALSE)); + addEntry(LLAssetType::AT_GESTURE, new AssetEntry("GESTURE", "gesture", "gesture", TRUE)); + addEntry(LLAssetType::AT_SIMSTATE, new AssetEntry("SIMSTATE", "simstate", "simstate", FALSE)); + + addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "symbolic link", FALSE)); + addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "symbolic folder link", FALSE)); + + addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, FALSE)); }; // static @@ -140,8 +115,7 @@ const std::string &LLAssetType::getDesc(LLAssetType::EType asset_type) } else { - static const std::string error_string = "BAD TYPE"; - return error_string; + return badLookup(); } } @@ -156,7 +130,7 @@ const char *LLAssetType::lookup(LLAssetType::EType asset_type) } else { - return "-1"; + return badLookup().c_str(); } } @@ -166,6 +140,7 @@ LLAssetType::EType LLAssetType::lookup(const char* name) return lookup(ll_safe_string(name)); } +// static LLAssetType::EType LLAssetType::lookup(const std::string& type_name) { const LLAssetDictionary *dict = LLAssetDictionary::getInstance(); @@ -193,7 +168,7 @@ const char *LLAssetType::lookupHumanReadable(LLAssetType::EType asset_type) } else { - return NULL; + return badLookup().c_str(); } } @@ -203,6 +178,7 @@ LLAssetType::EType LLAssetType::lookupHumanReadable(const char* name) return lookupHumanReadable(ll_safe_string(name)); } +// static LLAssetType::EType LLAssetType::lookupHumanReadable(const std::string& readable_name) { const LLAssetDictionary *dict = LLAssetDictionary::getInstance(); @@ -219,32 +195,6 @@ LLAssetType::EType LLAssetType::lookupHumanReadable(const std::string& readable_ return AT_NONE; } -// static -const char *LLAssetType::lookupCategoryName(LLAssetType::EType asset_type) -{ - const LLAssetDictionary *dict = LLAssetDictionary::getInstance(); - const AssetEntry *entry = dict->lookup(asset_type); - if (entry) - { - return entry->mCategoryName; - } - else - { - return "New Folder"; - } -} - -// static -EDragAndDropType LLAssetType::lookupDragAndDropType(EType asset_type) -{ - const LLAssetDictionary *dict = LLAssetDictionary::getInstance(); - const AssetEntry *entry = dict->lookup(asset_type); - if (entry) - return entry->mDadType; - else - return DAD_NONE; -} - // static bool LLAssetType::lookupCanLink(EType asset_type) { @@ -269,37 +219,9 @@ bool LLAssetType::lookupIsLinkType(EType asset_type) } // static -// Only ensembles and plain folders aren't protected. "Protected" means -// you can't change certain properties such as their type. -bool LLAssetType::lookupIsProtectedCategoryType(EType asset_type) +const std::string &LLAssetType::badLookup() { - const LLAssetDictionary *dict = LLAssetDictionary::getInstance(); - const AssetEntry *entry = dict->lookup(asset_type); - if (entry) - { - return entry->mIsProtected; - } - return true; -} + static const std::string sBadLookup = "llassettype_bad_lookup"; + return sBadLookup; -// static -bool LLAssetType::lookupIsEnsembleCategoryType(EType asset_type) -{ - return (asset_type >= AT_FOLDER_ENSEMBLE_START && - asset_type <= AT_FOLDER_ENSEMBLE_END); -} - - -// static. Generate a good default description -void LLAssetType::generateDescriptionFor(LLAssetType::EType asset_type, - std::string& description) -{ - const S32 BUF_SIZE = 30; - char time_str[BUF_SIZE]; /* Flawfinder: ignore */ - time_t now; - time(&now); - memset(time_str, '\0', BUF_SIZE); - strftime(time_str, BUF_SIZE - 1, "%Y-%m-%d %H:%M:%S ", localtime(&now)); - description.assign(time_str); - description.append(LLAssetType::lookupHumanReadable(asset_type)); } diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h index 3c760e4d917..ec2290d30e8 100644 --- a/indra/llcommon/llassettype.h +++ b/indra/llcommon/llassettype.h @@ -94,18 +94,6 @@ class LL_COMMON_API LLAssetType AT_BODYPART = 13, // A collection of textures and parameters that can be worn by an avatar. - AT_TRASH = 14, - // Only to be used as a marker for a category preferred type. - // Using this, we can throw things in the trash before completely deleting. - - AT_SNAPSHOT_CATEGORY = 15, - // A marker for a folder meant for snapshots. - // No actual assets will be snapshots, though if there were, you - // could interpret them as textures. - - AT_LOST_AND_FOUND = 16, - // Used to stuff lost&found items into. - AT_SOUND_WAV = 17, // Uncompressed sound. @@ -126,38 +114,22 @@ class LL_COMMON_API LLAssetType AT_SIMSTATE = 22, // Simstate file. - AT_FAVORITE = 23, - // favorite items - AT_LINK = 24, // Inventory symbolic link AT_LINK_FOLDER = 25, // Inventory folder link - - AT_FOLDER_ENSEMBLE_START = 26, - AT_FOLDER_ENSEMBLE_END = 45, - // This range is reserved for special clothing folder types. - - AT_CURRENT_OUTFIT = 46, - // Current outfit - - AT_OUTFIT = 47, - // Predefined outfit ("look") - - AT_MY_OUTFITS = 48, - // Folder that holds your outfits. - - AT_COUNT = 49, + AT_COUNT = 26, // +*********************************************************+ // | TO ADD AN ELEMENT TO THIS ENUM: | // +*********************************************************+ // | 1. INSERT BEFORE AT_COUNT | // | 2. INCREMENT AT_COUNT BY 1 | - // | 3. ADD TO LLAssetDictionary in LLAssetType.cpp | - // | 3. ADD TO DEFAULT_ASSET_FOR_INV in LLInventoryType.cpp | + // | 3. ADD TO LLAssetType.cpp | + // | 4. ADD TO LLViewerAssetType.cpp | + // | 5. ADD TO DEFAULT_ASSET_FOR_INV in LLInventoryType.cpp | // +*********************************************************+ AT_NONE = -1 @@ -173,33 +145,17 @@ class LL_COMMON_API LLAssetType static EType lookupHumanReadable(const std::string& readable_name); static const char* lookupHumanReadable(EType asset_type); - // Generate a good default description. You may want to add a verb - // or agent name after this depending on your application. - static void generateDescriptionFor(LLAssetType::EType asset_type, - std::string& description); - static EType getType(const std::string& desc_name); static const std::string& getDesc(EType asset_type); - static EDragAndDropType lookupDragAndDropType(EType asset_type); static bool lookupCanLink(EType asset_type); static bool lookupIsLinkType(EType asset_type); - static const char* lookupCategoryName(EType asset_type); - static bool lookupIsProtectedCategoryType(EType asset_type); - static bool lookupIsEnsembleCategoryType(EType asset_type); - - /* TODO: Change return types from "const char *" to "const std::string &". - This is fairly straightforward, but requires changing some calls to use .c_str(). - e.g.: - - fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); - + fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType).c_str()); - */ - -private: - // don't instantiate or derive one of these objects - LLAssetType( void ) {} - ~LLAssetType( void ) {} + static const std::string& badLookup(); // error string when a lookup fails + +protected: + LLAssetType() {} + ~LLAssetType() {} }; #endif // LL_LLASSETTYPE_H diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp new file mode 100644 index 00000000000..9107b11597e --- /dev/null +++ b/indra/llcommon/llfoldertype.cpp @@ -0,0 +1,165 @@ +/** + * @file llfoldertype.cpp + * @brief Implementatino of LLFolderType functionality. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "llfoldertype.h" +#include "lldictionary.h" +#include "llmemory.h" +#include "llsingleton.h" + +///---------------------------------------------------------------------------- +/// Class LLFolderType +///---------------------------------------------------------------------------- +struct FolderEntry : public LLDictionaryEntry +{ + FolderEntry(const std::string &type_name, // 8 character limit! + bool is_protected) // can the viewer change categories of this type? + : + LLDictionaryEntry(type_name), + mIsProtected(is_protected) + { + llassert(type_name.length() <= 8); + } + + const bool mIsProtected; +}; + +class LLFolderDictionary : public LLSingleton<LLFolderDictionary>, + public LLDictionary<LLFolderType::EType, FolderEntry> +{ +public: + LLFolderDictionary(); +}; + +LLFolderDictionary::LLFolderDictionary() +{ + // TYPE NAME PROTECTED + // |-----------|---------| + addEntry(LLFolderType::FT_TEXTURE, new FolderEntry("texture", TRUE)); + addEntry(LLFolderType::FT_SOUND, new FolderEntry("sound", TRUE)); + addEntry(LLFolderType::FT_CALLINGCARD, new FolderEntry("callcard", TRUE)); + addEntry(LLFolderType::FT_LANDMARK, new FolderEntry("landmark", TRUE)); + addEntry(LLFolderType::FT_CLOTHING, new FolderEntry("clothing", TRUE)); + addEntry(LLFolderType::FT_OBJECT, new FolderEntry("object", TRUE)); + addEntry(LLFolderType::FT_NOTECARD, new FolderEntry("notecard", TRUE)); + addEntry(LLFolderType::FT_CATEGORY, new FolderEntry("category", TRUE)); + addEntry(LLFolderType::FT_ROOT_CATEGORY, new FolderEntry("root", TRUE)); + addEntry(LLFolderType::FT_LSL_TEXT, new FolderEntry("lsltext", TRUE)); + addEntry(LLFolderType::FT_BODYPART, new FolderEntry("bodypart", TRUE)); + addEntry(LLFolderType::FT_TRASH, new FolderEntry("trash", TRUE)); + addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new FolderEntry("snapshot", TRUE)); + addEntry(LLFolderType::FT_LOST_AND_FOUND, new FolderEntry("lstndfnd", TRUE)); + addEntry(LLFolderType::FT_ANIMATION, new FolderEntry("animatn", TRUE)); + addEntry(LLFolderType::FT_GESTURE, new FolderEntry("gesture", TRUE)); + addEntry(LLFolderType::FT_FAVORITE, new FolderEntry("favorite", TRUE)); + + for (S32 ensemble_num = S32(LLFolderType::FT_ENSEMBLE_START); ensemble_num <= S32(LLFolderType::FT_ENSEMBLE_END); ensemble_num++) + { + addEntry(LLFolderType::EType(ensemble_num), new FolderEntry("ensemble", FALSE)); + } + + addEntry(LLFolderType::FT_CURRENT_OUTFIT, new FolderEntry("current", TRUE)); + addEntry(LLFolderType::FT_OUTFIT, new FolderEntry("outfit", FALSE)); + addEntry(LLFolderType::FT_MY_OUTFITS, new FolderEntry("my_otfts", TRUE)); + addEntry(LLFolderType::FT_INBOX, new FolderEntry("inbox", TRUE)); + + addEntry(LLFolderType::FT_NONE, new FolderEntry("-1", FALSE)); +}; + +// static +LLFolderType::EType LLFolderType::lookup(const std::string& name) +{ + return LLFolderDictionary::getInstance()->lookup(name); +} + +// static +const std::string &LLFolderType::lookup(LLFolderType::EType folder_type) +{ + const FolderEntry *entry = LLFolderDictionary::getInstance()->lookup(folder_type); + if (entry) + { + return entry->mName; + } + else + { + return badLookup(); + } +} + +// static +// Only ensembles and plain folders aren't protected. "Protected" means +// you can't change certain properties such as their type. +bool LLFolderType::lookupIsProtectedType(EType folder_type) +{ + const LLFolderDictionary *dict = LLFolderDictionary::getInstance(); + const FolderEntry *entry = dict->lookup(folder_type); + if (entry) + { + return entry->mIsProtected; + } + return true; +} + +// static +bool LLFolderType::lookupIsEnsembleType(EType folder_type) +{ + return (folder_type >= FT_ENSEMBLE_START && + folder_type <= FT_ENSEMBLE_END); +} + +// static +LLAssetType::EType LLFolderType::folderTypeToAssetType(LLFolderType::EType folder_type) +{ + if (LLAssetType::lookup(LLAssetType::EType(folder_type)) == LLAssetType::badLookup()) + { + llwarns << "Converting to unknown asset type " << folder_type << llendl; + } + return (LLAssetType::EType)folder_type; +} + +// static +LLFolderType::EType LLFolderType::assetTypeToFolderType(LLAssetType::EType asset_type) +{ + if (LLFolderType::lookup(LLFolderType::EType(asset_type)) == LLFolderType::badLookup()) + { + llwarns << "Converting to unknown folder type " << asset_type << llendl; + } + return (LLFolderType::EType)asset_type; +} + +// static +const std::string &LLFolderType::badLookup() +{ + static const std::string sBadLookup = "llfoldertype_bad_lookup"; + return sBadLookup; +} diff --git a/indra/llcommon/llfoldertype.h b/indra/llcommon/llfoldertype.h new file mode 100644 index 00000000000..5374ffd829a --- /dev/null +++ b/indra/llcommon/llfoldertype.h @@ -0,0 +1,123 @@ +/** + * @file llfoldertype.h + * @brief Declaration of LLFolderType. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLFOLDERTYPE_H +#define LL_LLFOLDERTYPE_H + +#include <string> +#include "llassettype.h" + +// This class handles folder types (similar to assettype, except for folders) +// and operations on those. +class LL_COMMON_API LLFolderType +{ +public: + // ! BACKWARDS COMPATIBILITY ! Folder type enums must match asset type enums. + enum EType + { + FT_TEXTURE = 0, + + FT_SOUND = 1, + + FT_CALLINGCARD = 2, + + FT_LANDMARK = 3, + + // FT_SCRIPT = 4, + + FT_CLOTHING = 5, + + FT_OBJECT = 6, + + FT_NOTECARD = 7, + + FT_CATEGORY = 8, + + FT_ROOT_CATEGORY = 9, + + FT_LSL_TEXT = 10, + + // FT_LSL_BYTECODE = 11, + // FT_TEXTURE_TGA = 12, + + FT_BODYPART = 13, + + FT_TRASH = 14, + + FT_SNAPSHOT_CATEGORY = 15, + + FT_LOST_AND_FOUND = 16, + + // FT_SOUND_WAV = 17, + // FT_IMAGE_TGA = 18, + // FT_IMAGE_JPEG = 19, + + FT_ANIMATION = 20, + + FT_GESTURE = 21, + + // FT_SIMSTATE = 22, + + FT_FAVORITE = 23, + + FT_ENSEMBLE_START = 26, + FT_ENSEMBLE_END = 45, + // This range is reserved for special clothing folder types. + + FT_CURRENT_OUTFIT = 46, + FT_OUTFIT = 47, + FT_MY_OUTFITS = 48, + + FT_INBOX = 49, + + FT_COUNT = 50, + + FT_NONE = -1 + }; + + static EType lookup(const std::string& type_name); + static const std::string& lookup(EType folder_type); + + static bool lookupIsProtectedType(EType folder_type); + static bool lookupIsEnsembleType(EType folder_type); + + static LLAssetType::EType folderTypeToAssetType(LLFolderType::EType folder_type); + static LLFolderType::EType assetTypeToFolderType(LLAssetType::EType asset_type); + + static const std::string& badLookup(); // error string when a lookup fails + +protected: + LLFolderType() {} + ~LLFolderType() {} +}; + +#endif // LL_LLFOLDERTYPE_H diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp index 5d3fbe51289..d665deb6050 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -1324,7 +1324,7 @@ BOOL item_date_sort( LLInventoryItem* a, LLInventoryItem* b ) LLInventoryCategory::LLInventoryCategory( const LLUUID& uuid, const LLUUID& parent_uuid, - LLAssetType::EType preferred_type, + LLFolderType::EType preferred_type, const std::string& name) : LLInventoryObject(uuid, parent_uuid, LLAssetType::AT_CATEGORY, name), mPreferredType(preferred_type) @@ -1332,7 +1332,7 @@ LLInventoryCategory::LLInventoryCategory( } LLInventoryCategory::LLInventoryCategory() : - mPreferredType(LLAssetType::AT_NONE) + mPreferredType(LLFolderType::FT_NONE) { mType = LLAssetType::AT_CATEGORY; } @@ -1354,12 +1354,12 @@ void LLInventoryCategory::copyCategory(const LLInventoryCategory* other) mPreferredType = other->mPreferredType; } -LLAssetType::EType LLInventoryCategory::getPreferredType() const +LLFolderType::EType LLInventoryCategory::getPreferredType() const { return mPreferredType; } -void LLInventoryCategory::setPreferredType(LLAssetType::EType type) +void LLInventoryCategory::setPreferredType(LLFolderType::EType type) { mPreferredType = type; } @@ -1405,13 +1405,13 @@ bool LLInventoryCategory::fromLLSD(const LLSD& sd) if (sd.has(w)) { S8 type = (U8)sd[w].asInteger(); - mPreferredType = static_cast<LLAssetType::EType>(type); + mPreferredType = static_cast<LLFolderType::EType>(type); } w = INV_ASSET_TYPE_LABEL_WS; if (sd.has(w)) { S8 type = (U8)sd[w].asInteger(); - mPreferredType = static_cast<LLAssetType::EType>(type); + mPreferredType = static_cast<LLFolderType::EType>(type); } w = INV_NAME_LABEL; @@ -1433,7 +1433,7 @@ void LLInventoryCategory::unpackMessage(LLMessageSystem* msg, msg->getUUIDFast(block, _PREHASH_ParentID, mParentUUID, block_num); S8 type; msg->getS8Fast(block, _PREHASH_Type, type, block_num); - mPreferredType = static_cast<LLAssetType::EType>(type); + mPreferredType = static_cast<LLFolderType::EType>(type); msg->getStringFast(block, _PREHASH_Name, mName, block_num); LLStringUtil::replaceNonstandardASCII(mName, ' '); } @@ -1482,7 +1482,7 @@ BOOL LLInventoryCategory::importFile(LLFILE* fp) } else if(0 == strcmp("pref_type", keyword)) { - mPreferredType = LLAssetType::lookup(valuestr); + mPreferredType = LLFolderType::lookup(valuestr); } else if(0 == strcmp("name", keyword)) { @@ -1514,7 +1514,7 @@ BOOL LLInventoryCategory::exportFile(LLFILE* fp, BOOL) const mParentUUID.toString(uuid_str); fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str()); fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); - fprintf(fp, "\t\tpref_type\t%s\n", LLAssetType::lookup(mPreferredType)); + fprintf(fp, "\t\tpref_type\t%s\n", LLFolderType::lookup(mPreferredType).c_str()); fprintf(fp, "\t\tname\t%s|\n", mName.c_str()); fprintf(fp,"\t}\n"); return TRUE; @@ -1561,7 +1561,7 @@ BOOL LLInventoryCategory::importLegacyStream(std::istream& input_stream) } else if(0 == strcmp("pref_type", keyword)) { - mPreferredType = LLAssetType::lookup(valuestr); + mPreferredType = LLFolderType::lookup(valuestr); } else if(0 == strcmp("name", keyword)) { @@ -1593,7 +1593,7 @@ BOOL LLInventoryCategory::exportLegacyStream(std::ostream& output_stream, BOOL) mParentUUID.toString(uuid_str); output_stream << "\t\tparent_id\t" << uuid_str << "\n"; output_stream << "\t\ttype\t" << LLAssetType::lookup(mType) << "\n"; - output_stream << "\t\tpref_type\t" << LLAssetType::lookup(mPreferredType) << "\n"; + output_stream << "\t\tpref_type\t" << LLFolderType::lookup(mPreferredType) << "\n"; output_stream << "\t\tname\t" << mName.c_str() << "|\n"; output_stream << "\t}\n"; return TRUE; @@ -1629,38 +1629,6 @@ LLSD ll_create_sd_from_inventory_item(LLPointer<LLInventoryItem> item) return rv; } -/* deprecated, use LLInventoryItem::fromLLSD() instead -LLPointer<LLInventoryItem> ll_create_item_from_sd(const LLSD& sd_item) -{ - LLPointer<LLInventoryItem> rv = new LLInventoryItem; - rv->setUUID(sd_item[INV_ITEM_ID_LABEL].asUUID()); - rv->setParent(sd_item[INV_PARENT_ID_LABEL].asUUID()); - rv->rename(sd_item[INV_NAME_LABEL].asString()); - rv->setType( - LLAssetType::lookup(sd_item[INV_ASSET_TYPE_LABEL].asString())); - if (sd_item.has("shadow_id")) - { - LLUUID asset_id = sd_item["shadow_id"]; - LLXORCipher cipher(MAGIC_ID.mData, UUID_BYTES); - cipher.decrypt(asset_id.mData, UUID_BYTES); - rv->setAssetUUID(asset_id); - } - if (sd_item.has(INV_ASSET_ID_LABEL)) - { - rv->setAssetUUID(sd_item[INV_ASSET_ID_LABEL].asUUID()); - } - rv->setDescription(sd_item[INV_DESC_LABEL].asString()); - rv->setSaleInfo(ll_sale_info_from_sd(sd_item[INV_SALE_INFO_LABEL])); - rv->setPermissions(ll_permissions_from_sd(sd_item[INV_PERMISSIONS_LABEL])); - rv->setInventoryType( - LLInventoryType::lookup( - sd_item[INV_INVENTORY_TYPE_LABEL].asString())); - rv->setFlags((U32)(sd_item[INV_FLAGS_LABEL].asInteger())); - rv->setCreationDate(sd_item[INV_CREATION_DATE_LABEL].asInteger()); - return rv; -} -*/ - LLSD ll_create_sd_from_inventory_category(LLPointer<LLInventoryCategory> cat) { LLSD rv; @@ -1675,10 +1643,10 @@ LLSD ll_create_sd_from_inventory_category(LLPointer<LLInventoryCategory> cat) rv[INV_PARENT_ID_LABEL] = cat->getParentUUID(); rv[INV_NAME_LABEL] = cat->getName(); rv[INV_ASSET_TYPE_LABEL] = LLAssetType::lookup(cat->getType()); - if(LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())) + if(LLFolderType::lookupIsProtectedType(cat->getPreferredType())) { rv[INV_PREFERRED_TYPE_LABEL] = - LLAssetType::lookup(cat->getPreferredType()); + LLFolderType::lookup(cat->getPreferredType()).c_str(); } return rv; } @@ -1692,7 +1660,7 @@ LLPointer<LLInventoryCategory> ll_create_category_from_sd(const LLSD& sd_cat) rv->setType( LLAssetType::lookup(sd_cat[INV_ASSET_TYPE_LABEL].asString())); rv->setPreferredType( - LLAssetType::lookup( - sd_cat[INV_PREFERRED_TYPE_LABEL].asString())); + LLFolderType::lookup( + sd_cat[INV_PREFERRED_TYPE_LABEL].asString())); return rv; } diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h index bd581e860f3..3de9d14f542 100644 --- a/indra/llinventory/llinventory.h +++ b/indra/llinventory/llinventory.h @@ -37,6 +37,7 @@ #include "llassetstorage.h" #include "lldarray.h" +#include "llfoldertype.h" #include "llinventorytype.h" #include "llmemtype.h" #include "llpermissions.h" @@ -321,15 +322,15 @@ class LLInventoryCategory : public LLInventoryObject public: MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY); LLInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid, - LLAssetType::EType preferred_type, + LLFolderType::EType preferred_type, const std::string& name); LLInventoryCategory(); LLInventoryCategory(const LLInventoryCategory* other); void copyCategory(const LLInventoryCategory* other); // LLRefCount requires custom copy // accessors and mutators - LLAssetType::EType getPreferredType() const; - void setPreferredType(LLAssetType::EType type); + LLFolderType::EType getPreferredType() const; + void setPreferredType(LLFolderType::EType type); // For messaging system support virtual void packMessage(LLMessageSystem* msg) const; virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0); @@ -345,10 +346,8 @@ class LLInventoryCategory : public LLInventoryObject virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const; protected: - // The type of asset that this category was "meant" to hold - // (although it may in fact hold any type). - LLAssetType::EType mPreferredType; - + // May be the type that this category was "meant" to hold (although it may hold any type). + LLFolderType::EType mPreferredType; }; diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp index a445466b26a..0e71c0d12d8 100644 --- a/indra/llinventory/llinventorytype.cpp +++ b/indra/llinventory/llinventorytype.cpp @@ -79,24 +79,16 @@ LLInventoryDictionary::LLInventoryDictionary() addEntry(LLInventoryType::IT_SOUND, new InventoryEntry("sound", "sound", 1, LLAssetType::AT_SOUND)); addEntry(LLInventoryType::IT_CALLINGCARD, new InventoryEntry("callcard", "calling card", 1, LLAssetType::AT_CALLINGCARD)); addEntry(LLInventoryType::IT_LANDMARK, new InventoryEntry("landmark", "landmark", 1, LLAssetType::AT_LANDMARK)); - //addEntry(LLInventoryType::IT_SCRIPT, new InventoryEntry(NULL,NULL)); - //addEntry(LLInventoryType::IT_CLOTHING, new InventoryEntry(NULL,NULL)); addEntry(LLInventoryType::IT_OBJECT, new InventoryEntry("object", "object", 1, LLAssetType::AT_OBJECT)); addEntry(LLInventoryType::IT_NOTECARD, new InventoryEntry("notecard", "note card", 1, LLAssetType::AT_NOTECARD)); addEntry(LLInventoryType::IT_CATEGORY, new InventoryEntry("category", "folder" )); addEntry(LLInventoryType::IT_ROOT_CATEGORY, new InventoryEntry("root", "root" )); addEntry(LLInventoryType::IT_LSL, new InventoryEntry("script", "script", 2, LLAssetType::AT_LSL_TEXT, LLAssetType::AT_LSL_BYTECODE)); - //addEntry(LLInventoryType::IT_LSL_BYTECODE, new InventoryEntry(NULL,NULL)); - //addEntry(LLInventoryType::IT_TEXTURE_TGA, new InventoryEntry(NULL,NULL)); - //addEntry(LLInventoryType::IT_BODYPART, new InventoryEntry(NULL,NULL)); - //addEntry(LLInventoryType::IT_TRASH, new InventoryEntry(NULL,NULL)); addEntry(LLInventoryType::IT_SNAPSHOT, new InventoryEntry("snapshot", "snapshot", 1, LLAssetType::AT_TEXTURE)); - //addEntry(LLInventoryType::IT_LOST_AND_FOUND, new InventoryEntry(NULL,NULL, )); addEntry(LLInventoryType::IT_ATTACHMENT, new InventoryEntry("attach", "attachment", 1, LLAssetType::AT_OBJECT)); addEntry(LLInventoryType::IT_WEARABLE, new InventoryEntry("wearable", "wearable", 2, LLAssetType::AT_CLOTHING, LLAssetType::AT_BODYPART)); addEntry(LLInventoryType::IT_ANIMATION, new InventoryEntry("animation", "animation", 1, LLAssetType::AT_ANIMATION)); addEntry(LLInventoryType::IT_GESTURE, new InventoryEntry("gesture", "gesture", 1, LLAssetType::AT_GESTURE)); - addEntry(LLInventoryType::IT_FAVORITE, new InventoryEntry("favorite", "favorite", 1, LLAssetType::AT_FAVORITE)); } @@ -128,35 +120,9 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] = LLInventoryType::IT_ANIMATION, // AT_ANIMATION LLInventoryType::IT_GESTURE, // AT_GESTURE LLInventoryType::IT_NONE, // AT_SIMSTATE - LLInventoryType::IT_FAVORITE, // AT_FAVORITE LLInventoryType::IT_NONE, // AT_LINK LLInventoryType::IT_NONE, // AT_LINK_FOLDER - - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - LLInventoryType::IT_CATEGORY, // AT_ENSEMBLE - - LLInventoryType::IT_CATEGORY, // AT_CURRENT_OUTFIT - LLInventoryType::IT_CATEGORY, // AT_OUTFIT - LLInventoryType::IT_CATEGORY, // AT_MY_OUTFITS }; // static diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h index 14b28bfe4b8..e515b8a304b 100644 --- a/indra/llinventory/llinventorytype.h +++ b/indra/llinventory/llinventorytype.h @@ -67,8 +67,7 @@ class LLInventoryType IT_WEARABLE = 18, IT_ANIMATION = 19, IT_GESTURE = 20, - IT_FAVORITE = 21, - IT_COUNT = 22, + IT_COUNT = 21, IT_NONE = -1 }; diff --git a/indra/llinventory/tests/inventorymisc_test.cpp b/indra/llinventory/tests/inventorymisc_test.cpp index 770594dc9df..c797a70c506 100644 --- a/indra/llinventory/tests/inventorymisc_test.cpp +++ b/indra/llinventory/tests/inventorymisc_test.cpp @@ -94,7 +94,7 @@ LLPointer<LLInventoryCategory> create_random_inventory_cat() LLPointer<LLInventoryCategory> cat = new LLInventoryCategory( item_id, parent_id, - LLAssetType::AT_NONE, + LLFolderType::FT_NONE, std::string("Sample category")); return cat; } @@ -452,7 +452,7 @@ namespace tut ensure_equals("4.type::getType() failed", dst->getType(), src->getType()); ensure_equals("5.preferred type::getPreferredType() failed", dst->getPreferredType(), src->getPreferredType()); - src->setPreferredType( LLAssetType::AT_TEXTURE); + src->setPreferredType( LLFolderType::FT_TEXTURE); sd = ll_create_sd_from_inventory_category(src); dst = ll_create_category_from_sd(sd); ensure_equals("6.preferred type::getPreferredType() failed", dst->getPreferredType(), src->getPreferredType()); diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp index 41f3f3f607d..7332f5c9540 100644 --- a/indra/llmessage/lltransfersourceasset.cpp +++ b/indra/llmessage/lltransfersourceasset.cpp @@ -292,7 +292,6 @@ bool is_asset_id_knowable(LLAssetType::EType type) case LLAssetType::AT_BODYPART: case LLAssetType::AT_ANIMATION: case LLAssetType::AT_GESTURE: - case LLAssetType::AT_FAVORITE: case LLAssetType::AT_LINK: case LLAssetType::AT_LINK_FOLDER: rv = true; diff --git a/indra/llprimitive/llmediaentry.cpp b/indra/llprimitive/llmediaentry.cpp index fa04bf80e7a..701300163a3 100644 --- a/indra/llprimitive/llmediaentry.cpp +++ b/indra/llprimitive/llmediaentry.cpp @@ -164,6 +164,7 @@ void LLMediaEntry::asLLSD(LLSD& sd) const // "security" fields sd[WHITELIST_ENABLE_KEY] = mWhiteListEnable; + sd.erase(WHITELIST_KEY); for (U32 i=0; i<mWhiteList.size(); i++) { sd[WHITELIST_KEY].append(mWhiteList[i]); diff --git a/indra/llprimitive/tests/llmediaentry_test.cpp b/indra/llprimitive/tests/llmediaentry_test.cpp index 9ce65609237..cd9608d56b7 100644 --- a/indra/llprimitive/tests/llmediaentry_test.cpp +++ b/indra/llprimitive/tests/llmediaentry_test.cpp @@ -223,8 +223,7 @@ namespace tut { set_test_name("Test LLMediaEntry Instantiation"); LLMediaEntry entry; - ensure_llsd_equals(get_test_name(), defaultMediaEntryLLSD, entry.asLLSD()); - + ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, entry.asLLSD()); } template<> template<> @@ -251,12 +250,27 @@ namespace tut ensure_llsd_equals(get_test_name() + " failed", golden, entry.asLLSD()); } + template<> template<> + void object::test<4>() + { + set_test_name("Test LLMediaEntry::asLLSD()"); + LLMediaEntry entry; + LLSD sd; + // Put some cruft in the LLSD + sd[LLMediaEntry::CURRENT_URL_KEY] = "http://www.example.com"; + LLSD whitelist; + whitelist.append("*.example.com"); + sd[LLMediaEntry::WHITELIST_KEY] = whitelist; + entry.asLLSD(sd); + ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, sd); + } + // limit tests const char *URL_OK = "http://www.example.com"; const char *URL_TOO_BIG = "http://www.example.com.qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"; template<> template<> - void object::test<4>() + void object::test<5>() { set_test_name("Test Limits on setting current URL"); LLMediaEntry entry; @@ -267,7 +281,7 @@ namespace tut } template<> template<> - void object::test<5>() + void object::test<6>() { set_test_name("Test Limits on setting home URL"); LLMediaEntry entry; @@ -278,7 +292,7 @@ namespace tut } template<> template<> - void object::test<6>() + void object::test<7>() { set_test_name("Test Limits on setting whitelist"); @@ -292,7 +306,7 @@ namespace tut } template<> template<> - void object::test<7>() + void object::test<8>() { set_test_name("Test Limits on setting whitelist too big"); @@ -307,7 +321,7 @@ namespace tut } template<> template<> - void object::test<8>() + void object::test<9>() { set_test_name("Test Limits on setting whitelist too many"); @@ -323,7 +337,7 @@ namespace tut } template<> template<> - void object::test<9>() + void object::test<10>() { set_test_name("Test to make sure both setWhiteList() functions behave the same"); @@ -341,7 +355,7 @@ namespace tut } template<> template<> - void object::test<10>() + void object::test<11>() { set_test_name("Test to make sure both setWhiteList() functions behave the same"); @@ -362,7 +376,7 @@ namespace tut } template<> template<> - void object::test<11>() + void object::test<12>() { set_test_name("Test to make sure both setWhiteList() functions behave the same"); @@ -386,99 +400,99 @@ namespace tut // Check the "empty whitelist" case template<> template<> - void object::test<12>() { whitelist_test("", "http://www.example.com", true); } + void object::test<13>() { whitelist_test("", "http://www.example.com", true); } // Check the "missing scheme" case template<> template<> - void object::test<13>() { whitelist_test("www.example.com", "http://www.example.com", true); } + void object::test<14>() { whitelist_test("www.example.com", "http://www.example.com", true); } // Check the "exactly the same" case template<> template<> - void object::test<14>() { whitelist_test("http://example.com", "http://example.com", true); } + void object::test<15>() { whitelist_test("http://example.com", "http://example.com", true); } // Check the enable flag template<> template<> - void object::test<15>() { whitelist_test(false, "www.example.com", "http://www.secondlife.com", true); } + void object::test<16>() { whitelist_test(false, "www.example.com", "http://www.secondlife.com", true); } template<> template<> - void object::test<16>() { whitelist_test(true, "www.example.com", "http://www.secondlife.com", false); } + void object::test<17>() { whitelist_test(true, "www.example.com", "http://www.secondlife.com", false); } // Check permutations of trailing slash: template<> template<> - void object::test<17>() { whitelist_test("http://www.example.com", "http://www.example.com/", true); } + void object::test<18>() { whitelist_test("http://www.example.com", "http://www.example.com/", true); } template<> template<> - void object::test<18>() { whitelist_test("http://www.example.com/", "http://www.example.com/", true); } + void object::test<19>() { whitelist_test("http://www.example.com/", "http://www.example.com/", true); } template<> template<> - void object::test<19>() { whitelist_test("http://www.example.com/", "http://www.example.com", false); } + void object::test<20>() { whitelist_test("http://www.example.com/", "http://www.example.com", false); } template<> template<> - void object::test<20>() { whitelist_test("http://www.example.com", "http://www.example.com/foobar", true); } + void object::test<21>() { whitelist_test("http://www.example.com", "http://www.example.com/foobar", true); } template<> template<> - void object::test<21>() { whitelist_test("http://www.example.com/", "http://www.example.com/foobar", false); } + void object::test<22>() { whitelist_test("http://www.example.com/", "http://www.example.com/foobar", false); } // More cases... template<> template<> - void object::test<22>() { whitelist_test("http://example.com", "http://example.com/wiki", true); } + void object::test<23>() { whitelist_test("http://example.com", "http://example.com/wiki", true); } template<> template<> - void object::test<23>() { whitelist_test("www.example.com", "http://www.example.com/help", true); } + void object::test<24>() { whitelist_test("www.example.com", "http://www.example.com/help", true); } template<> template<> - void object::test<24>() { whitelist_test("http://www.example.com", "http://wwwexample.com", false); } + void object::test<25>() { whitelist_test("http://www.example.com", "http://wwwexample.com", false); } template<> template<> - void object::test<25>() { whitelist_test("http://www.example.com", "http://www.example.com/wiki", true); } + void object::test<26>() { whitelist_test("http://www.example.com", "http://www.example.com/wiki", true); } template<> template<> - void object::test<26>() { whitelist_test("example.com", "http://wwwexample.com", false); } + void object::test<27>() { whitelist_test("example.com", "http://wwwexample.com", false); } template<> template<> - void object::test<27>() { whitelist_test("http://www.example.com/", "http://www.amazon.com/wiki", false); } + void object::test<28>() { whitelist_test("http://www.example.com/", "http://www.amazon.com/wiki", false); } template<> template<> - void object::test<28>() { whitelist_test("www.example.com", "http://www.amazon.com", false); } + void object::test<29>() { whitelist_test("www.example.com", "http://www.amazon.com", false); } // regexp cases template<> template<> - void object::test<29>() { whitelist_test("*.example.com", "http://www.example.com", true); } + void object::test<30>() { whitelist_test("*.example.com", "http://www.example.com", true); } template<> template<> - void object::test<30>() { whitelist_test("*.example.com", "http://www.amazon.com", false); } + void object::test<31>() { whitelist_test("*.example.com", "http://www.amazon.com", false); } template<> template<> - void object::test<31>() { whitelist_test("*.example.com", "http://www.example.com/foo/bar", true); } + void object::test<32>() { whitelist_test("*.example.com", "http://www.example.com/foo/bar", true); } template<> template<> - void object::test<32>() { whitelist_test("*.example.com", "http:/example.com/foo/bar", false); } + void object::test<33>() { whitelist_test("*.example.com", "http:/example.com/foo/bar", false); } template<> template<> - void object::test<33>() { whitelist_test("*example.com", "http://example.com/foo/bar", true); } + void object::test<34>() { whitelist_test("*example.com", "http://example.com/foo/bar", true); } template<> template<> - void object::test<34>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?example.com", false); } + void object::test<35>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?example.com", false); } template<> template<> - void object::test<35>() { whitelist_test("example.com", "http://my.virus.com/foo/bar?example.com", false); } + void object::test<36>() { whitelist_test("example.com", "http://my.virus.com/foo/bar?example.com", false); } template<> template<> - void object::test<36>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?*example.com", false); } + void object::test<37>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?*example.com", false); } template<> template<> - void object::test<37>() { whitelist_test("http://*example.com", "http://www.example.com", true); } + void object::test<38>() { whitelist_test("http://*example.com", "http://www.example.com", true); } template<> template<> - void object::test<38>() { whitelist_test("http://*.example.com", "http://www.example.com", true); } + void object::test<39>() { whitelist_test("http://*.example.com", "http://www.example.com", true); } template<> template<> - void object::test<39>() { whitelist_test("http://*.e$?^.com", "http://www.e$?^.com", true); } + void object::test<40>() { whitelist_test("http://*.e$?^.com", "http://www.e$?^.com", true); } template<> template<> - void object::test<40>() { whitelist_test("*.example.com/foo/bar", "http://www.example.com/", false); } + void object::test<41>() { whitelist_test("*.example.com/foo/bar", "http://www.example.com/", false); } template<> template<> - void object::test<41>() { whitelist_test("*.example.com/foo/bar", "http://example.com/foo/bar", false); } + void object::test<42>() { whitelist_test("*.example.com/foo/bar", "http://example.com/foo/bar", false); } template<> template<> - void object::test<42>() { whitelist_test("http://*.example.com/foo/bar", "http://www.example.com", false); } + void object::test<43>() { whitelist_test("http://*.example.com/foo/bar", "http://www.example.com", false); } template<> template<> - void object::test<43>() { whitelist_test("http://*.example.com", "https://www.example.com", false); } + void object::test<44>() { whitelist_test("http://*.example.com", "https://www.example.com", false); } template<> template<> - void object::test<44>() { whitelist_test("http*://*.example.com", "rtsp://www.example.com", false); } + void object::test<45>() { whitelist_test("http*://*.example.com", "rtsp://www.example.com", false); } template<> template<> - void object::test<45>() { whitelist_test("http*://*.example.com", "https://www.example.com", true); } + void object::test<46>() { whitelist_test("http*://*.example.com", "https://www.example.com", true); } template<> template<> - void object::test<46>() { whitelist_test("example.com", "http://www.example.com", false); } + void object::test<47>() { whitelist_test("example.com", "http://www.example.com", false); } template<> template<> - void object::test<47>() { whitelist_test("www.example.com", "http://www.example.com:80", false); } + void object::test<48>() { whitelist_test("www.example.com", "http://www.example.com:80", false); } template<> template<> - void object::test<48>() { whitelist_test("www.example.com", "http://www.example.com", true); } + void object::test<49>() { whitelist_test("www.example.com", "http://www.example.com", true); } template<> template<> - void object::test<49>() { whitelist_test("www.example.com/", "http://www.example.com", false); } + void object::test<50>() { whitelist_test("www.example.com/", "http://www.example.com", false); } template<> template<> - void object::test<50>() { whitelist_test("www.example.com/foo/bar/*", "http://www.example.com/foo/bar/baz", true); } + void object::test<51>() { whitelist_test("www.example.com/foo/bar/*", "http://www.example.com/foo/bar/baz", true); } // Path only template<> template<> - void object::test<51>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/baz", true); } + void object::test<52>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/baz", true); } template<> template<> - void object::test<52>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/", false); } + void object::test<53>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/", false); } } diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 8c72b079eee..99aebbcb308 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -772,6 +772,12 @@ LLMultiFloater* LLFloater::getHost() return (LLMultiFloater*)mHostHandle.get(); } +void LLFloater::applySavedVariables() +{ + applyRectControl(); + applyDockState(); +} + void LLFloater::applyRectControl() { if (mRectControl.size() > 1) diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index ef0d06a58ea..95c8dd84f65 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -280,6 +280,9 @@ friend class LLMultiFloater; protected: void setRectControl(const std::string& rectname) { mRectControl = rectname; }; + + virtual void applySavedVariables(); + void applyRectControl(); void applyDockState(); void storeRectControl(); diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index aca4dc56eed..f8e07913fbf 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -134,8 +134,7 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key) // Note: key should eventually be a non optional LLFloater arg; for now, set mKey to be safe res->mKey = key; res->setInstanceName(name); - res->applyRectControl(); // Can't apply rect control until setting instance name - res->applyDockState();//same... + res->applySavedVariables(); // Can't apply rect and dock state until setting instance name if (res->mAutoTile && !res->getHost() && index > 0) { const LLRect& cur_rect = res->getRect(); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e138b431c59..643f89068f2 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -216,7 +216,6 @@ set(viewer_SOURCE_FILES llfloaterwhitelistentry.cpp llfloaterwindlight.cpp llfloaterworldmap.cpp - llfoldertype.cpp llfolderview.cpp llfolderviewitem.cpp llfollowcam.cpp @@ -317,6 +316,7 @@ set(viewer_SOURCE_FILES llpanelimcontrolpanel.cpp llpanelland.cpp llpanellandaudio.cpp + llpanellandmarkinfo.cpp llpanellandmarks.cpp llpanellandmedia.cpp llpanellogin.cpp @@ -337,6 +337,7 @@ set(viewer_SOURCE_FILES llpanelpicks.cpp llpanelplace.cpp llpanelplaceinfo.cpp + llpanelplaceprofile.cpp llpanelplaces.cpp llpanelplacestab.cpp llpanelprimmediacontrols.cpp @@ -436,12 +437,14 @@ set(viewer_SOURCE_FILES llvectorperfoptions.cpp llviewchildren.cpp llviewerassetstorage.cpp + llviewerassettype.cpp llvieweraudio.cpp llviewercamera.cpp llviewercontrol.cpp llviewercontrollistener.cpp llviewerdisplay.cpp llviewerfloaterreg.cpp + llviewerfoldertype.cpp llviewergenericmessage.cpp llviewergesture.cpp llviewerhelp.cpp @@ -702,7 +705,6 @@ set(viewer_HEADER_FILES llfloaterwhitelistentry.h llfloaterwindlight.h llfloaterworldmap.h - llfoldertype.h llfolderview.h llfoldervieweventlistener.h llfolderviewitem.h @@ -800,6 +802,7 @@ set(viewer_HEADER_FILES llpanelimcontrolpanel.h llpanelland.h llpanellandaudio.h + llpanellandmarkinfo.h llpanellandmarks.h llpanellandmedia.h llpanellogin.h @@ -820,6 +823,7 @@ set(viewer_HEADER_FILES llpanelpicks.h llpanelplace.h llpanelplaceinfo.h + llpanelplaceprofile.h llpanelplaces.h llpanelplacestab.h llpanelprimmediacontrols.h @@ -923,6 +927,7 @@ set(viewer_HEADER_FILES llvectorperfoptions.h llviewchildren.h llviewerassetstorage.h + llviewerassettype.h llvieweraudio.h llviewerbuild.h llviewercamera.h @@ -930,6 +935,7 @@ set(viewer_HEADER_FILES llviewercontrollistener.h llviewerdisplay.h llviewerfloaterreg.h + llviewerfoldertype.h llviewergenericmessage.h llviewergesture.h llviewerhelp.h diff --git a/indra/newview/app_settings/foldertypes.xml b/indra/newview/app_settings/foldertypes.xml index 2038779c4f5..0d539177f38 100644 --- a/indra/newview/app_settings/foldertypes.xml +++ b/indra/newview/app_settings/foldertypes.xml @@ -1,66 +1,61 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <ensemble_defs> <ensemble - asset_num="-1" - xui_name="default" - icon_name="inv_plain_closed.tga" - /> - <ensemble - asset_num="27" + foldertype_num="27" xui_name="head" icon_name="inv_folder_outfit_head.tga" allowed="hair,eyes" /> <ensemble - asset_num="28" + foldertype_num="28" xui_name="gloves" icon_name="inv_folder_outfit_gloves.tga" allowed="gloves" /> <ensemble - asset_num="29" + foldertype_num="29" xui_name="jacket" icon_name="inv_folder_outfit_jacket.tga" allowed="jacket" /> <ensemble - asset_num="30" + foldertype_num="30" xui_name="pants" icon_name="inv_folder_outfit_pants.tga" allowed="pants,underpants" /> <ensemble - asset_num="31" + foldertype_num="31" xui_name="shape" icon_name="inv_folder_outfit_shape.tga" allowed="shape,skin,hair,eyes" /> <ensemble - asset_num="32" + foldertype_num="32" xui_name="shoes" icon_name="inv_folder_outfit_shoes.tga" allowed="shoes,socks" /> <ensemble - asset_num="33" + foldertype_num="33" xui_name="shirt" icon_name="inv_folder_outfit_shirt.tga" allowed="shirt,undershirt" /> <ensemble - asset_num="34" + foldertype_num="34" xui_name="skirt" icon_name="inv_folder_outfit_skirt.tga" allowed="" /> <ensemble - asset_num="35" + foldertype_num="35" xui_name="underpants" icon_name="inv_folder_outfit_underpants.tga" allowed="underpants" /> <ensemble - asset_num="36" + foldertype_num="36" xui_name="undershirt" icon_name="inv_folder_outfit_undershirt.tga" allowed="undershirt" diff --git a/indra/newview/llagentpicksinfo.cpp b/indra/newview/llagentpicksinfo.cpp index 6e5835bace2..3c8d0dac426 100644 --- a/indra/newview/llagentpicksinfo.cpp +++ b/indra/newview/llagentpicksinfo.cpp @@ -47,7 +47,8 @@ class LLAgentPicksInfo::LLAgentPicksObserver : public LLAvatarPropertiesObserver ~LLAgentPicksObserver() { - LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this); + if (LLAvatarPropertiesProcessor::instanceExists()) + LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this); } void sendAgentPicksRequest() diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp index 09f7c49f23d..2911a35581b 100644 --- a/indra/newview/llagentui.cpp +++ b/indra/newview/llagentui.cpp @@ -92,7 +92,10 @@ std::string LLAgentUI::buildSLURL(const bool escaped /*= true*/) //static BOOL LLAgentUI::checkAgentDistance(const LLVector3& pole, F32 radius) { - return (gAgent.getPositionAgent() - pole).length() < radius; + F32 delta_x = gAgent.getPositionAgent().mV[VX] - pole.mV[VX]; + F32 delta_y = gAgent.getPositionAgent().mV[VY] - pole.mV[VY]; + + return sqrt( delta_x* delta_x + delta_y* delta_y ) < radius; } BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const LLVector3& agent_pos_region) { diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 4b3d27767c8..8c76a219a07 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -434,7 +434,7 @@ void LLAgentWearables::saveWearableAs(const EWearableType type, if (save_in_lost_and_found) { category_id = gInventory.findCategoryUUIDForType( - LLAssetType::AT_LOST_AND_FOUND); + LLFolderType::FT_LOST_AND_FOUND); } else { @@ -840,7 +840,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs } // Get the UUID of the current outfit folder (will be created if it doesn't exist) - LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); LLInitialWearablesFetch* outfit = new LLInitialWearablesFetch(); @@ -981,8 +981,7 @@ void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 inde // Add a new one in the lost and found folder. // (We used to overwrite the "not found" one, but that could potentially // destory content.) JC - LLUUID lost_and_found_id = - gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); LLPointer<LLInventoryCallback> cb = new addWearableToAgentInventoryCallback( LLPointer<LLRefCount>(NULL), @@ -1123,8 +1122,8 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name, // First, make a folder in the Clothes directory. LLUUID folder_id = gInventory.createNewCategory( - gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING), - LLAssetType::AT_NONE, + gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING), + LLFolderType::FT_NONE, new_folder_name); bool found_first_item = false; @@ -1257,10 +1256,10 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name) } // First, make a folder in the My Outfits directory. - LLUUID parent_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_MY_OUTFITS); + const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); LLUUID folder_id = gInventory.createNewCategory( parent_id, - LLAssetType::AT_OUTFIT, + LLFolderType::FT_OUTFIT, new_folder_name); LLAppearanceManager::shallowCopyCategory(LLAppearanceManager::getCOF(),folder_id, NULL); @@ -2032,7 +2031,7 @@ void LLInitialWearablesFetch::processWearablesMessage() { if (!mAgentInitialWearables.empty()) // We have an empty current outfit folder, use the message data instead. { - LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); for (U8 i = 0; i < mAgentInitialWearables.size(); ++i) { // Populate the current outfit folder with links to the wearables passed in the message diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 8d0f11e021e..80086de3dc6 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -130,11 +130,11 @@ void LLOutfitObserver::done() { if(LLInventoryType::IT_GESTURE == item->getInventoryType()) { - pid = gInventory.findCategoryUUIDForType(LLAssetType::AT_GESTURE); + pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE); } else { - pid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); } break; } @@ -146,7 +146,7 @@ void LLOutfitObserver::done() LLUUID cat_id = gInventory.createNewCategory( pid, - LLAssetType::AT_NONE, + LLFolderType::FT_NONE, name); mCatID = cat_id; LLPointer<LLInventoryCallback> cb = new LLWearInventoryCategoryCallback(mCatID, mAppend); @@ -353,7 +353,7 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory /* static */ LLUUID LLAppearanceManager::getCOF() { - return gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); } // Update appearance from outfit folder. @@ -373,12 +373,12 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo else { LLViewerInventoryCategory* catp = gInventory.getCategory(category); - if (catp->getPreferredType() == LLAssetType::AT_NONE || - LLAssetType::lookupIsEnsembleCategoryType(catp->getPreferredType())) + if (catp->getPreferredType() == LLFolderType::FT_NONE || + LLFolderType::lookupIsEnsembleType(catp->getPreferredType())) { updateCOFFromCategory(category, append); // append is false - rebuild COF. } - else if (catp->getPreferredType() == LLAssetType::AT_OUTFIT) + else if (catp->getPreferredType() == LLFolderType::FT_OUTFIT) { rebuildCOFFromOutfit(category); } @@ -405,7 +405,7 @@ void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool app return; } - const LLUUID ¤t_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); // Processes that take time should show the busy cursor //inc_busy_count(); @@ -503,7 +503,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID { LLViewerInventoryCategory *catp = item->getLinkedCategory(); // Skip copying outfit links. - if (catp && catp->getPreferredType() != LLAssetType::AT_OUTFIT) + if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT) { link_inventory_item(gAgent.getID(), item->getLinkedUUID(), @@ -641,7 +641,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID // Add link to outfit if category is an outfit. LLViewerInventoryCategory* catp = gInventory.getCategory(category); - if (!append && catp && catp->getPreferredType() == LLAssetType::AT_OUTFIT) + if (!append && catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) { link_inventory_item(gAgent.getID(), category, cof, catp->getName(), LLAssetType::AT_LINK_FOLDER, link_waiter); @@ -732,7 +732,7 @@ void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category) LLNotifications::instance().add("CouldNotPutOnOutfit"); return; } - + // Processes that take time should show the busy cursor //inc_busy_count(); @@ -750,7 +750,7 @@ void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category) // Create a link to the outfit that we wore. LLViewerInventoryCategory* catp = gInventory.getCategory(category); - if (catp && catp->getPreferredType() == LLAssetType::AT_OUTFIT) + if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) { link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(), LLAssetType::AT_LINK_FOLDER, link_waiter); diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 5dbf57c9bef..d4df6dfbe73 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -334,7 +334,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) LLAssetStorage::LLStoreAssetCallback callback = NULL; void *userdata = NULL; upload_new_resource(next_file, asset_name, asset_name, - 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, + 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, next_owner_perms, group_perms, everyone_perms, display_name, callback, expected_upload_cost, userdata); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 2f674013017..97e0aa5f461 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -343,7 +343,7 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re // Servers older than 1.25 require the text of the message to be the // calling card folder ID for the offering user. JC LLUUID calling_card_folder_id = - gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); std::string message = calling_card_folder_id.asString(); requestFriendship(notification["payload"]["id"].asUUID(), notification["payload"]["name"].asString(), @@ -355,7 +355,7 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re // static void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message) { - LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + const LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); send_improved_im(target_id, target_name, message, diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 7b2dc02864f..8609ba8b1c6 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -239,11 +239,46 @@ void LLAvatarList::refresh() bool dirty = add_limit_exceeded || (have_filter && !have_names); setDirty(dirty); + // Refreshed all items, lets send refresh_complete signal. + if(!dirty) + { + std::vector<LLSD> cur_values; + getValues(cur_values); + mRefreshCompleteSignal(this, LLSD((S32)cur_values.size())); + } + // Commit if we've added/removed items. if (modified) onCommit(); } +bool LLAvatarList::filterHasMatches() +{ + uuid_vector_t values = getIDs(); + + for (uuid_vector_t::const_iterator it=values.begin(); it != values.end(); it++) + { + std::string name; + const LLUUID& buddy_id = *it; + BOOL have_name = gCacheName->getFullName(buddy_id, name); + + // If name has not been loaded yet we consider it as a match. + // When the name will be loaded the filter will be applied again(in refresh()). + + if (have_name && !findInsensitive(name, mNameFilter)) + { + continue; + } + + return true; + } + return false; +} + +boost::signals2::connection LLAvatarList::setRefreshCompleteCallback(const commit_signal_t::slot_type& cb) +{ + return mRefreshCompleteSignal.connect(cb); +} void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos) { diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 51d3760d393..195d9e5b550 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -82,6 +82,11 @@ class LLAvatarList : public LLFlatListView const std::string getIconParamName() const{return mIconParamName;} virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); + // Return true if filter has at least one match. + bool filterHasMatches(); + + boost::signals2::connection setRefreshCompleteCallback(const commit_signal_t::slot_type& cb); + protected: void refresh(); @@ -107,6 +112,8 @@ class LLAvatarList : public LLFlatListView uuid_vector_t mIDs; LLAvatarListItem::ContextMenu* mContextMenu; + + commit_signal_t mRefreshCompleteSignal; }; /** Abstract comparator for avatar items */ diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index bad61101c1b..b9e8c5394da 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -51,7 +51,7 @@ #include "lltransientfloatermgr.h" static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel"); -static LLDefaultChildRegistry::Register<LLTalkButton> t2("chiclet_talk"); +static LLDefaultChildRegistry::Register<LLTalkButton> t2("talk_button"); static LLDefaultChildRegistry::Register<LLNotificationChiclet> t3("chiclet_notification"); static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t4("chiclet_im_p2p"); static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t5("chiclet_im_group"); @@ -830,13 +830,21 @@ LLChicletPanel::~LLChicletPanel() void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){ LLUUID session_id = data["session_id"].asUUID(); + S32 unread = data["num_unread"].asInteger(); + + LLIMFloater* im_floater = LLIMFloater::findInstance(session_id); + if (im_floater && im_floater->getVisible()) + { + unread = 0; + } + std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id); std::list<LLChiclet *>::iterator iter; for (iter = chiclets.begin(); iter != chiclets.end(); iter++) { LLChiclet* chiclet = *iter; if (chiclet != NULL) { - chiclet->setCounter(data["num_unread"].asInteger()); + chiclet->setCounter(unread); } else { @@ -1257,30 +1265,7 @@ LLTalkButton::Params::Params() , show_button("show_button") , monitor("monitor") { - // *TODO Vadim: move hardcoded labels (!) and other params to XUI. - speak_button.name("left"); - speak_button.label("Speak"); - speak_button.label_selected("Speak"); - speak_button.font(LLFontGL::getFontSansSerifSmall()); - speak_button.tab_stop(false); - speak_button.is_toggle(true); - speak_button.picture_style(true); - // Use default button art. JC - //speak_button.image_selected(LLUI::getUIImage("SegmentedBtn_Left_Selected")); - //speak_button.image_unselected(LLUI::getUIImage("SegmentedBtn_Left_Off")); - - show_button.name("right"); - show_button.label(LLStringUtil::null); - show_button.rect(LLRect(0, 0, 20, 0)); - show_button.tab_stop(false); - show_button.is_toggle(true); - show_button.picture_style(true); - show_button.image_selected(LLUI::getUIImage("ComboButton_Selected")); - show_button.image_unselected(LLUI::getUIImage("ComboButton_Off")); - - monitor.name("monitor"); - // *TODO: Make this data driven. - monitor.rect(LLRect(0, 18, 18, 0)); + // See widgets/talk_button.xml } LLTalkButton::LLTalkButton(const Params& p) @@ -1336,6 +1321,7 @@ LLTalkButton::LLTalkButton(const Params& p) // never show "muted" because you can't mute yourself mOutputMonitor->setIsMuted(false); + mOutputMonitor->setIsAgentControl(true); } LLTalkButton::~LLTalkButton() diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index a6afbc05bec..a3980457b98 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -437,7 +437,7 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, } else { - LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); if (item->getParentUUID() == favorites_id) { llwarns << "Attemt to copy a favorite item into the same folder." << llendl; @@ -539,7 +539,7 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con LLToolDragAndDrop* tool_dad = LLToolDragAndDrop::getInstance(); if (tool_dad->getSource() == LLToolDragAndDrop::SOURCE_NOTECARD) { - viewer_item->setType(LLAssetType::AT_FAVORITE); + viewer_item->setType(LLAssetType::AT_LANDMARK); copy_inventory_from_notecard(tool_dad->getObjectID(), tool_dad->getSourceID(), viewer_item.get(), gInventoryCallbacks.registerCB(cb)); } else @@ -561,7 +561,7 @@ void LLFavoritesBarCtrl::changed(U32 mask) { if (mFavoriteFolderId.isNull()) { - mFavoriteFolderId = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + mFavoriteFolderId = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); if (mFavoriteFolderId.notNull()) { diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 55b7ed0c99c..095fe0a220f 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -989,7 +989,7 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata) name, desc, 0, - LLAssetType::AT_NONE, + LLFolderType::FT_NONE, LLInventoryType::IT_ANIMATION, LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), name, diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index 7cb8987879a..538b44c0565 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -264,7 +264,6 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, Invent ( asstype == LLAssetType::AT_BODYPART && gSavedSettings.getBOOL("BulkChangeIncludeBodyParts" )) || ( asstype == LLAssetType::AT_CLOTHING && gSavedSettings.getBOOL("BulkChangeIncludeClothing" )) || ( asstype == LLAssetType::AT_GESTURE && gSavedSettings.getBOOL("BulkChangeIncludeGestures" )) || - ( asstype == LLAssetType::AT_FAVORITE && gSavedSettings.getBOOL("BulkChangeIncludeFavourite" )) || ( asstype == LLAssetType::AT_NOTECARD && gSavedSettings.getBOOL("BulkChangeIncludeNotecards" )) || ( asstype == LLAssetType::AT_OBJECT && gSavedSettings.getBOOL("BulkChangeIncludeObjects" )) || ( asstype == LLAssetType::AT_LSL_TEXT && gSavedSettings.getBOOL("BulkChangeIncludeScripts" )) || diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index 3da06fa7b32..cefd7a38080 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -293,7 +293,7 @@ void LLFloaterBuy::onClickBuy() { // Put the items where we put new folders. LLUUID category_id; - category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); + category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); // *NOTE: doesn't work for multiple object buy, which UI does not // currently support sale info is used for verification only, if diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index f3eaa0c9163..32802f6a200 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -286,7 +286,7 @@ void LLFloaterBuyContents::onClickBuy() // Put the items where we put new folders. LLUUID category_id; - category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CATEGORY); + category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CATEGORY); // *NOTE: doesn't work for multiple object buy, which UI does not // currently support sale info is used for verification only, if diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp index 8570b5eb4a7..92778510e70 100644 --- a/indra/newview/llfloaterinventory.cpp +++ b/indra/newview/llfloaterinventory.cpp @@ -40,6 +40,7 @@ #include "llinventorymodel.h" #include "llpanelmaininventory.h" #include "llresmgr.h" +#include "llviewerfoldertype.h" ///---------------------------------------------------------------------------- /// LLFloaterInventory diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h index f2f2963a333..c0de89bff22 100644 --- a/indra/newview/llfloaterinventory.h +++ b/indra/newview/llfloaterinventory.h @@ -35,6 +35,7 @@ #define LL_LLFLOATERINVENTORY_H #include "llfloater.h" +#include "llfoldertype.h" class LLInventoryPanel; class LLPanelMainInventory; diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index ed7d2c71eaa..b7296518d46 100644 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -176,7 +176,7 @@ void LLFloaterNameDesc::onBtnOK( ) upload_new_resource(mFilenameAndPath, // file childGetValue("name_form").asString(), childGetValue("description_form").asString(), - 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, + 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), display_name, callback, expected_upload_cost, nruserdata); closeFloater(false); diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index b6ec0868cfd..e277aba493c 100644 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -158,14 +158,14 @@ void LLFloaterOpenObject::moveToInventory(bool wear) if (wear) { parent_category_id = gInventory.findCategoryUUIDForType( - LLAssetType::AT_CLOTHING); + LLFolderType::FT_CLOTHING); } else { parent_category_id = gInventory.getRootFolderID(); } LLUUID category_id = gInventory.createNewCategory(parent_category_id, - LLAssetType::AT_NONE, + LLFolderType::FT_NONE, name); LLCatAndWear* data = new LLCatAndWear; diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index ad2fe34e95e..0f4d6e33a36 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -770,7 +770,7 @@ void LLFloaterReporter::takeScreenshot() if (COMPLAINT_REPORT == mReportType) { mResourceDatap->mAssetInfo.mType = LLAssetType::AT_TEXTURE; - mResourceDatap->mPreferredLocation = LLAssetType::EType(-2); + mResourceDatap->mPreferredLocation = LLFolderType::EType(LLResourceData::INVALID_LOCATION); } else { @@ -838,7 +838,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data, } EReportType report_type = UNKNOWN_REPORT; - if (data->mPreferredLocation == -2) + if (data->mPreferredLocation == LLResourceData::INVALID_LOCATION) { report_type = COMPLAINT_REPORT; } diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 235e8192186..541e2a26648 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -980,7 +980,7 @@ void LLSnapshotLivePreview::saveTexture() "Snapshot : " + pos_string, "Taken by " + who_took_it + " at " + pos_string, 0, - LLAssetType::AT_SNAPSHOT_CATEGORY, + LLFolderType::FT_SNAPSHOT_CATEGORY, LLInventoryType::IT_SNAPSHOT, PERM_ALL, // Note: Snapshots to inventory is a special case of content upload PERM_NONE, // that ignores the user's premissions preferences and continues to diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index f3f600149f9..6567c1a649f 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -327,7 +327,7 @@ void LLFloaterWorldMap::onOpen(const LLSD& key) LLFirstUse::useMap(); // Start speculative download of landmarks - LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); gInventory.startBackgroundFetch(landmark_folder_id); childSetFocus("location", TRUE); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index a963c96da43..7863c373c62 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -55,6 +55,7 @@ #include "llviewermenu.h" #include "lluictrlfactory.h" #include "llviewercontrol.h" +#include "llviewerfoldertype.h" #include "llviewerwindow.h" #include "llvoavatar.h" #include "llfloaterproperties.h" @@ -1108,7 +1109,7 @@ void LLFolderView::propertiesSelectedItems( void ) } } -void LLFolderView::changeType(LLInventoryModel *model, LLAssetType::EType new_folder_type) +void LLFolderView::changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type) { LLFolderBridge *folder_bridge = LLFolderBridge::sSelf; @@ -1958,7 +1959,7 @@ bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata) if (action.length() > change_folder_string.length() && (action.compare(0,change_folder_string.length(),"change_folder_type_") == 0)) { - LLAssetType::EType new_folder_type = LLFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length())); + LLFolderType::EType new_folder_type = LLViewerFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length())); changeType(model, new_folder_type); return true; } diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index ebfb4efde2d..0bd65b5f909 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -192,7 +192,7 @@ class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler void propertiesSelectedItems( void ); // change the folder type - void changeType(LLInventoryModel *model, LLAssetType::EType new_folder_type); + void changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type); void autoOpenItem(LLFolderViewFolder* item); void closeAutoOpenedFolders(); diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index ff38da279a5..60ece75cead 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -32,6 +32,7 @@ #define LLFOLDERVIEWEVENTLISTENER_H #include "lldarray.h" // JAMESDEBUG convert to std::vector +#include "llfoldertype.h" #include "llfontgl.h" // just for StyleFlags enum #include "llpointer.h" @@ -57,7 +58,7 @@ class LLFolderViewEventListener virtual const LLUUID& getUUID() const = 0; virtual time_t getCreationDate() const = 0; // UTC seconds virtual PermissionMask getPermissionMask() const = 0; - virtual LLAssetType::EType getPreferredType() const = 0; + virtual LLFolderType::EType getPreferredType() const = 0; virtual LLPointer<LLUIImage> getIcon() const = 0; virtual LLFontGL::StyleFlags getLabelStyle() const = 0; virtual std::string getLabelSuffix() const = 0; diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index f83a426cdab..6fdaefd21ab 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -248,13 +248,13 @@ void LLFolderViewItem::refreshFromListener() if(mListener) { mLabel = mListener->getDisplayName(); - LLAssetType::EType preferred_type = mListener->getPreferredType(); + LLFolderType::EType preferred_type = mListener->getPreferredType(); // *TODO: to be removed when database supports multi language. This is a // temporary attempt to display the inventory folder in the user locale. // mantipov: *NOTE: be sure this code is synchronized with LLFriendCardsManager::findChildFolderUUID // it uses the same way to find localized string - if (LLAssetType::lookupIsProtectedCategoryType(preferred_type)) + if (LLFolderType::lookupIsProtectedType(preferred_type)) { LLTrans::findString(mLabel, "InvFolder " + mLabel); }; @@ -1753,7 +1753,7 @@ bool LLFolderViewFolder::isTrash() const { if (mAmTrash == LLFolderViewFolder::UNKNOWN) { - mAmTrash = mListener->getUUID() == gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH, false) ? LLFolderViewFolder::TRASH : LLFolderViewFolder::NOT_TRASH; + mAmTrash = mListener->getUUID() == gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH, false) ? LLFolderViewFolder::TRASH : LLFolderViewFolder::NOT_TRASH; } return mAmTrash == LLFolderViewFolder::TRASH; } @@ -2167,7 +2167,7 @@ BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask ) { const LLUUID &cat_uuid = getListener()->getUUID(); const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_uuid); - if (cat && cat->getPreferredType() == LLAssetType::AT_OUTFIT) + if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT) { getListener()->performAction(NULL, NULL,"replaceoutfit"); return TRUE; @@ -2490,7 +2490,7 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde && b->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK) { - static LLUUID favorites_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); LLUUID a_uuid = a->getParentFolder()->getListener()->getUUID(); LLUUID b_uuid = b->getParentFolder()->getListener()->getUUID(); diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index fbcaeee01f2..5f79fe8b201 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -135,14 +135,14 @@ const LLUUID LLFriendCardsManager::extractAvatarID(const LLUUID& avatarID) // and this method must be called before any actions with friend list void LLFriendCardsManager::ensureFriendFoldersExist() { - LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); LLUUID friendFolderUUID = findFriendFolderUUIDImpl(); if (friendFolderUUID.isNull()) { friendFolderUUID = gInventory.createNewCategory(callingCardsFolderID, - LLAssetType::AT_CALLINGCARD, get_friend_folder_name()); + LLFolderType::FT_CALLINGCARD, get_friend_folder_name()); } LLUUID friendAllSubfolderUUID = findFriendAllSubfolderUUIDImpl(); @@ -150,7 +150,7 @@ void LLFriendCardsManager::ensureFriendFoldersExist() if (friendAllSubfolderUUID.isNull()) { friendAllSubfolderUUID = gInventory.createNewCategory(friendFolderUUID, - LLAssetType::AT_CALLINGCARD, get_friend_all_subfolder_name()); + LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name()); } } @@ -351,7 +351,7 @@ void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBud /************************************************************************/ const LLUUID& LLFriendCardsManager::findFriendFolderUUIDImpl() const { - LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); std::string friendFolderName = get_friend_folder_name(); diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index dee86f4a222..19fa66fd0e4 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -106,6 +106,8 @@ void LLIMFloater::onFocusReceived() // virtual void LLIMFloater::onClose(bool app_quitting) { + if (!gIMMgr->hasSession(mSessionID)) return; + setTyping(false); gIMMgr->leaveSession(mSessionID); } @@ -234,7 +236,10 @@ BOOL LLIMFloater::postBuild() mChatHistory = getChild<LLChatHistory>("chat_history"); - setTitle(LLIMModel::instance().getName(mSessionID)); + std::string session_name(LLIMModel::instance().getName(mSessionID)); + LLStringUtil::toUpper(session_name); + setTitle(session_name); + setDocked(true); mTypingStart = LLTrans::getString("IM_typing_start_string"); diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index bfad2b16248..9989a3b4731 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -188,7 +188,8 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd) { mCommitCallbackRegistrar.add("InspectAvatar.ViewProfile", boost::bind(&LLInspectAvatar::onClickViewProfile, this)); mCommitCallbackRegistrar.add("InspectAvatar.AddFriend", boost::bind(&LLInspectAvatar::onClickAddFriend, this)); - mCommitCallbackRegistrar.add("InspectAvatar.IM", boost::bind(&LLInspectAvatar::onClickIM, this)); + mCommitCallbackRegistrar.add("InspectAvatar.IM", + boost::bind(&LLInspectAvatar::onClickIM, this)); mCommitCallbackRegistrar.add("InspectAvatar.Teleport", boost::bind(&LLInspectAvatar::onClickTeleport, this)); mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup", boost::bind(&LLInspectAvatar::onClickInviteToGroup, this)); mCommitCallbackRegistrar.add("InspectAvatar.Pay", boost::bind(&LLInspectAvatar::onClickPay, this)); @@ -306,7 +307,21 @@ void LLInspectAvatar::requestUpdate() // You can't re-add someone as a friend if they are already your friend bool is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarID) != NULL; bool is_self = (mAvatarID == gAgentID); - childSetEnabled("add_friend_btn", !is_friend && !is_self); + if (is_self) + { + getChild<LLUICtrl>("add_friend_btn")->setVisible(false); + getChild<LLUICtrl>("im_btn")->setVisible(false); + } + else if (is_friend) + { + getChild<LLUICtrl>("add_friend_btn")->setVisible(false); + getChild<LLUICtrl>("im_btn")->setVisible(true); + } + else + { + getChild<LLUICtrl>("add_friend_btn")->setVisible(true); + getChild<LLUICtrl>("im_btn")->setVisible(false); + } // Use an avatar_icon even though the image id will come down with the // avatar properties because the avatar_icon code maintains a cache of icons diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index b9775cf0e9c..b9a25d5dc74 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -78,6 +78,7 @@ #include "llscrollcontainer.h" #include "llimview.h" #include "lltooldraganddrop.h" +#include "llviewerfoldertype.h" #include "llviewertexturelist.h" #include "llviewerinventory.h" #include "llviewerobjectlist.h" @@ -85,6 +86,7 @@ #include "llvoavatar.h" #include "llwearable.h" #include "llwearablelist.h" +#include "llviewerassettype.h" #include "llviewermessage.h" #include "llviewerregion.h" #include "llvoavatarself.h" @@ -202,9 +204,9 @@ PermissionMask LLInvFVBridge::getPermissionMask() const } // virtual -LLAssetType::EType LLInvFVBridge::getPreferredType() const +LLFolderType::EType LLInvFVBridge::getPreferredType() const { - return LLAssetType::AT_NONE; + return LLFolderType::FT_NONE; } @@ -339,7 +341,7 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener* LLInventoryModel* model = getInventoryModel(); if(!model) return; LLMessageSystem* msg = gMessageSystem; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); LLViewerInventoryItem* item = NULL; LLViewerInventoryCategory* cat = NULL; std::vector<LLUUID> move_ids; @@ -504,7 +506,7 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const } } const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i)); - if (cat && !LLAssetType::lookupCanLink(cat->getPreferredType())) + if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())) { return FALSE; } @@ -645,7 +647,7 @@ BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const if(obj) { - *type = LLAssetType::lookupDragAndDropType(obj->getActualType()); + *type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType()); if(*type == DAD_NONE) { return FALSE; @@ -686,7 +688,7 @@ BOOL LLInvFVBridge::isInTrash() const { LLInventoryModel* model = getInventoryModel(); if(!model) return FALSE; - const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); return model->isObjectDescendentOf(mUUID, trash_id); } @@ -699,7 +701,7 @@ BOOL LLInvFVBridge::isLinkedObjectInTrash() const { LLInventoryModel* model = getInventoryModel(); if(!model) return FALSE; - const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id); } return FALSE; @@ -717,7 +719,7 @@ BOOL LLInvFVBridge::isCOFFolder() const { const LLInventoryModel* model = getInventoryModel(); if(!model) return TRUE; - const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id)) { return TRUE; @@ -1044,7 +1046,7 @@ void LLItemBridge::restoreItem() if(item) { LLInventoryModel* model = getInventoryModel(); - const LLUUID new_parent = model->findCategoryUUIDForType(item->getType()); + const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType())); // do not restamp on restore. LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE); } @@ -1077,7 +1079,7 @@ void LLItemBridge::restoreToWorld() } // Check if it's in the trash. (again similar to the normal rez logic) - const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id)) { remove_from_inventory = TRUE; @@ -1272,7 +1274,7 @@ BOOL LLItemBridge::removeItem() LLPreview::hide(mUUID, TRUE); LLInventoryModel* model = getInventoryModel(); if(!model) return FALSE; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); LLViewerInventoryItem* item = getItem(); // if item is not already in trash @@ -1365,7 +1367,7 @@ BOOL LLFolderBridge::isItemMovable() const LLInventoryObject* obj = getInventoryObject(); if(obj) { - return (!LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)obj)->getPreferredType())); + return (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType())); } return FALSE; } @@ -1401,7 +1403,7 @@ BOOL LLFolderBridge::isItemRemovable() return FALSE; } - if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) + if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) { return FALSE; } @@ -1414,7 +1416,7 @@ BOOL LLFolderBridge::isItemRemovable() for( i = 0; i < descendent_categories.count(); i++ ) { LLInventoryCategory* category = descendent_categories[i]; - if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) + if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) { return FALSE; } @@ -1591,20 +1593,20 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, const LLUUID& cat_id = inv_cat->getUUID(); // Is the destination the trash? - const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); - BOOL is_movable = (!LLAssetType::lookupIsProtectedCategoryType(inv_cat->getPreferredType())); - LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + BOOL is_movable = (!LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType())); + const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); - BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); + BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); if (move_is_into_current_outfit || move_is_into_outfit) { // BAP - restrictions? is_movable = true; } - if (mUUID == gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE)) + if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE)) { is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604 } @@ -1616,7 +1618,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, for( i = 0; i < descendent_categories.count(); i++ ) { LLInventoryCategory* category = descendent_categories[i]; - if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) + if(LLFolderType::lookupIsProtectedType(category->getPreferredType())) { // ...can't move "special folders" like Textures is_movable = FALSE; @@ -1849,8 +1851,8 @@ bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat, LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe? // BAP remove AT_NONE support after ensembles are fully working? return (linked_category && - ((linked_category->getPreferredType() == LLAssetType::AT_NONE) || - (LLAssetType::lookupIsEnsembleCategoryType(linked_category->getPreferredType())))); + ((linked_category->getPreferredType() == LLFolderType::FT_NONE) || + (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType())))); } } @@ -2152,7 +2154,7 @@ void LLFolderBridge::determineFolderType() BOOL LLFolderBridge::isItemRenameable() const { LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory(); - if(cat && !LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType()) + if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()) && (cat->getOwnerID() == gAgent.getID())) { return TRUE; @@ -2167,15 +2169,15 @@ void LLFolderBridge::restoreItem() if(cat) { LLInventoryModel* model = getInventoryModel(); - LLUUID new_parent = model->findCategoryUUIDForType(cat->getType()); + const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(cat->getType())); // do not restamp children on restore LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE); } } -LLAssetType::EType LLFolderBridge::getPreferredType() const +LLFolderType::EType LLFolderBridge::getPreferredType() const { - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + LLFolderType::EType preferred_type = LLFolderType::FT_NONE; LLViewerInventoryCategory* cat = getCategory(); if(cat) { @@ -2188,7 +2190,7 @@ LLAssetType::EType LLFolderBridge::getPreferredType() const // Icons for folders are based on the preferred type LLUIImagePtr LLFolderBridge::getIcon() const { - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + LLFolderType::EType preferred_type = LLFolderType::FT_NONE; LLViewerInventoryCategory* cat = getCategory(); if(cat) { @@ -2197,7 +2199,7 @@ LLUIImagePtr LLFolderBridge::getIcon() const return getIcon(preferred_type); } -LLUIImagePtr LLFolderBridge::getIcon(LLAssetType::EType preferred_type) +LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type) { // we only have one folder image now return LLUI::getUIImage("Inv_FolderClosed"); @@ -2236,7 +2238,7 @@ BOOL LLFolderBridge::removeItem() LLInventoryModel* model = getInventoryModel(); if(!model) return FALSE; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); // Look for any gestures and deactivate them LLInventoryModel::cat_array_t descendent_categories; @@ -2354,11 +2356,11 @@ void LLFolderBridge::folderOptionsMenu() if(!model) return; const LLInventoryCategory* category = model->getCategory(mUUID); - LLAssetType::EType type = category->getPreferredType(); - const bool is_default_folder = category && LLAssetType::lookupIsProtectedCategoryType(type); + LLFolderType::EType type = category->getPreferredType(); + const bool is_default_folder = category && LLFolderType::lookupIsProtectedType(type); // BAP change once we're no longer treating regular categories as ensembles. - const bool is_ensemble = category && (type == LLAssetType::AT_NONE || - LLAssetType::lookupIsEnsembleCategoryType(type)); + const bool is_ensemble = category && (type == LLFolderType::FT_NONE || + LLFolderType::lookupIsEnsembleType(type)); // calling card related functionality for folders. @@ -2424,8 +2426,8 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) // std::vector<std::string> disabled_items; LLInventoryModel* model = getInventoryModel(); if(!model) return; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); + const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point) mDisabledItems.clear(); //adding code to clear out disabled members from previous @@ -2455,7 +2457,6 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) else if(isAgentInventory()) // do not allow creating in library { LLViewerInventoryCategory *cat = getCategory(); - // BAP removed protected check to re-enable standard ops in untyped folders. // Not sure what the right thing is to do here. if (!isCOFFolder() && cat /*&& @@ -2472,7 +2473,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) mItems.push_back(std::string("Change Type")); LLViewerInventoryCategory *cat = getCategory(); - if (cat && LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())) + if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType())) { mDisabledItems.push_back(std::string("Change Type")); } @@ -2482,7 +2483,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) else { // Want some but not all of the items from getClipboardEntries for outfits. - if (cat && cat->getPreferredType()==LLAssetType::AT_OUTFIT) + if (cat && cat->getPreferredType()==LLFolderType::FT_OUTFIT) { mItems.push_back(std::string("Rename")); mItems.push_back(std::string("Delete")); @@ -2618,7 +2619,7 @@ void LLFolderBridge::createNewCategory(void* user_data) if(!model) return; LLUUID id; id = model->createNewCategory(bridge->getUUID(), - LLAssetType::AT_NONE, + LLFolderType::FT_NONE, LLStringUtil::null); model->notifyObservers(); @@ -2703,7 +2704,7 @@ void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type) // Separate function so can be called by global menu as well as right-click // menu. // static -void LLFolderBridge::createWearable(LLUUID parent_id, EWearableType type) +void LLFolderBridge::createWearable(const LLUUID &parent_id, EWearableType type) { LLWearable* wearable = LLWearableList::instance().createNewWearable(type); LLAssetType::EType asset_type = wearable->getAssetType(); @@ -2846,17 +2847,17 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, break; case LLAssetType::AT_CATEGORY: - is_movable = !LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)inv_item)->getPreferredType()); + is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType()); break; default: break; } - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); - LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); - BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); + BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); if(is_movable && move_is_into_trash) { @@ -2886,7 +2887,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, .isObjDirectDescendentOfCategory (inv_item, getCategory()); } - LLUUID favorites_id = model->findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE); // we can move item inside a folder only if this folder is Favorites. See EXT-719 accept = is_movable && ((mUUID != inv_item->getParentUUID()) || (mUUID == favorites_id)); @@ -4934,7 +4935,7 @@ void LLLSLTextBridgeAction::doIt() BOOL LLWearableBridgeAction::isInTrash() const { if(!mModel) return FALSE; - LLUUID trash_id = mModel->findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH); return mModel->isObjectDescendentOf(mUUID, trash_id); } @@ -5073,7 +5074,7 @@ std::string LLLinkFolderBridge::sPrefix("Link: "); LLUIImagePtr LLLinkFolderBridge::getIcon() const { - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + LLFolderType::EType preferred_type = LLFolderType::FT_NONE; if (LLViewerInventoryItem *item = getItem()) { if (const LLViewerInventoryCategory* cat = item->getLinkedCategory()) diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 3f3513a665e..f95e8f93619 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -159,7 +159,7 @@ class LLInvFVBridge : public LLFolderViewEventListener virtual const std::string& getName() const; virtual const std::string& getDisplayName() const; virtual PermissionMask getPermissionMask() const; - virtual LLAssetType::EType getPreferredType() const; + virtual LLFolderType::EType getPreferredType() const; virtual time_t getCreationDate() const; virtual LLFontGL::StyleFlags getLabelStyle() const { @@ -298,9 +298,9 @@ class LLFolderBridge : public LLInvFVBridge virtual void selectItem(); virtual void restoreItem(); - virtual LLAssetType::EType getPreferredType() const; + virtual LLFolderType::EType getPreferredType() const; virtual LLUIImagePtr getIcon() const; - static LLUIImagePtr getIcon(LLAssetType::EType asset_type); + static LLUIImagePtr getIcon(LLFolderType::EType preferred_type); virtual BOOL renameItem(const std::string& new_name); virtual BOOL removeItem(); @@ -321,7 +321,7 @@ class LLFolderBridge : public LLInvFVBridge virtual BOOL copyToClipboard() const; static void createWearable(LLFolderBridge* bridge, EWearableType type); - static void createWearable(LLUUID parent_folder_id, EWearableType type); + static void createWearable(const LLUUID &parent_folder_id, EWearableType type); LLViewerInventoryCategory* getCategory() const; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 77121bd922c..75218e98e0a 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -317,10 +317,6 @@ const std::string& get_item_icon_name(LLAssetType::EType asset_type, case LLAssetType::AT_GESTURE: idx = GESTURE_ICON_NAME; break; - case LLAssetType::AT_FAVORITE: - //TODO - need bette idx - idx = LANDMARK_ICON_NAME; - break; case LLAssetType::AT_LINK: idx = LINKITEM_ICON_NAME; break; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 23439191f3d..baf34b42ff3 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -49,6 +49,7 @@ #include "llinventoryfunctions.h" #include "llinventorypanel.h" #include "llfloaterinventory.h" +#include "llviewerfoldertype.h" #include "llviewerinventory.h" #include "llviewermessage.h" #include "llviewerwindow.h" @@ -316,7 +317,7 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id) // specifies 'type' as what it defaults to containing. The category is // not necessarily only for that type. *NOTE: This will create a new // inventory category on the fly if one does not exist. -LLUUID LLInventoryModel::findCategoryUUIDForType(LLAssetType::EType t, bool create_folder) +const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder) { const LLUUID &rv = findCatUUID(t); if(rv.isNull() && isInventoryUsable() && create_folder) @@ -332,10 +333,10 @@ LLUUID LLInventoryModel::findCategoryUUIDForType(LLAssetType::EType t, bool crea // Internal method which looks for a category with the specified // preferred type. Returns LLUUID::null if not found. -const LLUUID &LLInventoryModel::findCatUUID(LLAssetType::EType preferred_type) const +const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type) const { const LLUUID &root_id = gInventory.getRootFolderID(); - if(LLAssetType::AT_CATEGORY == preferred_type) + if(LLFolderType::FT_CATEGORY == preferred_type) { return root_id; } @@ -363,7 +364,7 @@ const LLUUID &LLInventoryModel::findCatUUID(LLAssetType::EType preferred_type) c // version will take care of details like what the name should be // based on preferred type. Returns the UUID of the new category. LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, - LLAssetType::EType preferred_type, + LLFolderType::EType preferred_type, const std::string& pname) { LLUUID id; @@ -373,9 +374,9 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, return id; } - if(preferred_type == LLAssetType::AT_SIMSTATE) + if(LLFolderType::lookup(preferred_type) == LLFolderType::badLookup()) { - lldebugs << "Attempt to create simstate category." << llendl; + lldebugs << "Attempt to create undefined category." << llendl; return id; } @@ -387,7 +388,7 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, } else { - name.assign(LLAssetType::lookupCategoryName(preferred_type)); + name.assign(LLViewerFolderType::lookupNewCategoryName(preferred_type)); } // Add the category to the internal representation @@ -451,7 +452,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id, // Start with categories if(!include_trash) { - const LLUUID trash_id = findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = findCategoryUUIDForType(LLFolderType::FT_TRASH); if(trash_id.notNull() && (trash_id == id)) return; } @@ -485,7 +486,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id, if (item->getActualType() == LLAssetType::AT_LINK_FOLDER) { LLViewerInventoryCategory *linked_cat = item->getLinkedCategory(); - if (linked_cat && linked_cat->getPreferredType() != LLAssetType::AT_OUTFIT) + if (linked_cat && linked_cat->getPreferredType() != LLFolderType::FT_OUTFIT) // BAP - was // LLAssetType::lookupIsEnsembleCategoryType(linked_cat->getPreferredType())) // Change back once ensemble typing is in place. @@ -665,7 +666,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item) if(item->getParentUUID().isNull()) { - LLUUID category_id = findCategoryUUIDForType(new_item->getType()); + const LLUUID category_id = findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(new_item->getType())); new_item->setParent(category_id); item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, category_id); if( item_array ) @@ -689,7 +690,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item) LLUUID parent_id = item->getParentUUID(); if(parent_id == CATEGORIZE_LOST_AND_FOUND_ID) { - parent_id = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + parent_id = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); new_item->setParent(parent_id); } item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, parent_id); @@ -702,7 +703,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item) // Whoops! No such parent, make one. llinfos << "Lost item: " << new_item->getUUID() << " - " << new_item->getName() << llendl; - parent_id = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + parent_id = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); new_item->setParent(parent_id); item_array = get_ptr_in_map(mParentChildItemTree, parent_id); if(item_array) @@ -1184,7 +1185,7 @@ void LLInventoryModel::mock(const LLUUID& root_id) root_id, LLUUID::null, LLAssetType::AT_CATEGORY, - LLAssetType::lookupCategoryName(LLAssetType::AT_ROOT_CATEGORY), + LLFolderType::lookupNewCategoryName(LLFolderType::FT_ROOT_CATEGORY), gAgent.getID()); addCategory(cat); gInventory.buildParentChildMap(); @@ -1342,7 +1343,7 @@ void fetchDescendentsResponder::result(const LLSD& content) item_it != folder_sd["items"].endArray(); ++item_it) { - LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + const LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); if (lost_uuid.notNull()) { LLSD item = *item_it; @@ -2049,11 +2050,11 @@ bool LLInventoryModel::loadSkeleton( cat->setUUID(folder_id.asUUID()); cat->setParent(parent_id.asUUID()); - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + LLFolderType::EType preferred_type = LLFolderType::FT_NONE; LLSD type_default = (*it)["type_default"]; if(type_default.isDefined()) { - preferred_type = (LLAssetType::EType)type_default.asInteger(); + preferred_type = (LLFolderType::EType)type_default.asInteger(); } cat->setPreferredType(preferred_type); cat->setVersion(version.asInteger()); @@ -2400,12 +2401,12 @@ void LLInventoryModel::buildParentChildMap() << cat->getName() << llendl; ++lost; // plop it into the lost & found. - LLAssetType::EType pref = cat->getPreferredType(); - if(LLAssetType::AT_NONE == pref) + LLFolderType::EType pref = cat->getPreferredType(); + if(LLFolderType::FT_NONE == pref) { - cat->setParent(findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND)); + cat->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND)); } - else if(LLAssetType::AT_CATEGORY == pref) + else if(LLFolderType::FT_CATEGORY == pref) { // it's the root cat->setParent(LLUUID::null); @@ -2464,7 +2465,7 @@ void LLInventoryModel::buildParentChildMap() ++lost; // plop it into the lost & found. // - item->setParent(findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND)); + item->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND)); // move it later using a special message to move items. If // we update server here, the client might crash. //item->updateServer(); @@ -2485,7 +2486,7 @@ void LLInventoryModel::buildParentChildMap() llwarns << "Found " << lost << " lost items." << llendl; LLMessageSystem* msg = gMessageSystem; BOOL start_new_message = TRUE; - LLUUID lnf = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + const LLUUID lnf = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); for(std::vector<LLUUID>::iterator it = lost_item_ids.begin() ; it < lost_item_ids.end(); ++it) { if(start_new_message) @@ -2938,7 +2939,7 @@ void LLInventoryModel::processUpdateInventoryFolder(LLMessageSystem* msg, lastfolder = tfolder; tfolder->unpackMessage(msg, _PREHASH_FolderData, i); // make sure it's not a protected folder - tfolder->setPreferredType(LLAssetType::AT_NONE); + tfolder->setPreferredType(LLFolderType::FT_NONE); folders.push_back(tfolder); // examine update for changes. LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID()); @@ -3325,31 +3326,31 @@ void LLInventoryModel::processMoveInventoryItem(LLMessageSystem* msg, void**) //---------------------------------------------------------------------------- -// Trash: LLAssetType::AT_TRASH, "ConfirmEmptyTrash" -// Lost&Found: LLAssetType::AT_LOST_AND_FOUND, "ConfirmEmptyLostAndFound" +// Trash: LLFolderType::FT_TRASH, "ConfirmEmptyTrash" +// Lost&Found: LLFolderType::FT_LOST_AND_FOUND, "ConfirmEmptyLostAndFound" -bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLAssetType::EType folder_type) +bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type) { S32 option = LLNotification::getSelectedOption(notification, response); if (option == 0) // YES { - LLUUID folder_id = findCategoryUUIDForType(folder_type); + const LLUUID folder_id = findCategoryUUIDForType(preferred_type); purgeDescendentsOf(folder_id); notifyObservers(); } return false; } -void LLInventoryModel::emptyFolderType(const std::string notification, LLAssetType::EType folder_type) +void LLInventoryModel::emptyFolderType(const std::string notification, LLFolderType::EType preferred_type) { if (!notification.empty()) { LLNotifications::instance().add(notification, LLSD(), LLSD(), - boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, folder_type)); + boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, preferred_type)); } else { - LLUUID folder_id = findCategoryUUIDForType(folder_type); + const LLUUID folder_id = findCategoryUUIDForType(preferred_type); purgeDescendentsOf(folder_id); notifyObservers(); } @@ -3360,7 +3361,7 @@ void LLInventoryModel::emptyFolderType(const std::string notification, LLAssetTy void LLInventoryModel::removeItem(const LLUUID& item_id) { LLViewerInventoryItem* item = getItem(item_id); - const LLUUID new_parent = findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID new_parent = findCategoryUUIDForType(LLFolderType::FT_TRASH); if (item && item->getParentUUID() != new_parent) { LLInventoryModel::update_list_t update; diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index d51460b374c..aba0a619dba 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -34,6 +34,7 @@ #define LL_LLINVENTORYMODEL_H #include "llassettype.h" +#include "llfoldertype.h" #include "lldarray.h" #include "llframetimer.h" #include "llhttpclient.h" @@ -280,7 +281,7 @@ class LLInventoryModel // SDK: Added flag to specify whether the folder should be created if not found. This fixes the horrible // multiple trash can bug. - LLUUID findCategoryUUIDForType(LLAssetType::EType preferred_type, bool create_folder = true); + const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true); // Call this method when it's time to update everyone on a new // state, by default, the inventory model will not update @@ -329,7 +330,7 @@ class LLInventoryModel // category. If you want to use the default name based on type, // pass in a NULL to the 'name parameter. LLUUID createNewCategory(const LLUUID& parent_id, - LLAssetType::EType preferred_type, + LLFolderType::EType preferred_type, const std::string& name); // methods to load up inventory skeleton & meat. These are used @@ -385,9 +386,9 @@ class LLInventoryModel bool isCategoryComplete(const LLUUID& cat_id) const; // callbacks - // Trigger a notification and empty the folder type (AT_TRASH or AT_LOST_AND_FOUND) if confirmed - void emptyFolderType(const std::string notification, LLAssetType::EType folder_type); - bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLAssetType::EType folder_type); + // Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed + void emptyFolderType(const std::string notification, LLFolderType::EType folder_type); + bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type); // Utility Functions void removeItem(const LLUUID& item_id); @@ -431,7 +432,7 @@ class LLInventoryModel // // Internal method which looks for a category with the specified // preferred type. Returns LLUUID::null if not found - const LLUUID &findCatUUID(LLAssetType::EType preferred_type) const; + const LLUUID &findCatUUID(LLFolderType::EType preferred_type) const; // Empty the entire contents void empty(); diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index d1ca0efed35..178e7d0823e 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -78,6 +78,7 @@ #include "lltabcontainer.h" #include "lltooldraganddrop.h" #include "lluictrlfactory.h" +#include "llviewerfoldertype.h" #include "llviewerinventory.h" #include "llviewermessage.h" #include "llviewerobjectlist.h" @@ -110,8 +111,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) : // contex menu callbacks mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2)); - mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); - mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND)); mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2)); mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2)); mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this)); @@ -169,19 +170,19 @@ BOOL LLInventoryPanel::postBuild() // determine the root folder, if any, so inventory contents show just the children // of that folder (i.e. not including the folder itself). - const LLAssetType::EType preferred_type = LLAssetType::lookupHumanReadable(mStartFolderString); + const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString); - if ("inventory" == mStartFolderString) + if ("INVENTORY" == mStartFolderString) { mStartFolderID = gInventory.getRootFolderID(); } - else if ("library" == mStartFolderString) + else if ("LIBRARY" == mStartFolderString) { mStartFolderID = gInventory.getLibraryRootFolderID(); } else { - mStartFolderID = (preferred_type != LLAssetType::AT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); + mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); } // build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback @@ -192,7 +193,7 @@ BOOL LLInventoryPanel::postBuild() } // bit of a hack to make sure the inventory is open. - mFolders->openFolder(preferred_type != LLAssetType::AT_NONE ? LLAssetType::lookupCategoryName(preferred_type) : "My Inventory"); + mFolders->openFolder(preferred_type != LLFolderType::FT_NONE ? LLViewerFolderType::lookupNewCategoryName(preferred_type) : "My Inventory"); if (mSortOrderSetting != INHERIT_SORT_ORDER) { @@ -382,6 +383,19 @@ void LLInventoryPanel::modelChanged(U32 mask) view_item->getParentFolder()->extractItem(view_item); view_item->addToFolder(new_parent, mFolders); } +/* + on the other side in case Inventory Panel has content of the any folder + it is possible that item moved to some folder which is absent in current + Panel. For ex. removing item (via moving to trash). + In this case we need to check if new parent is other then inventory start folder + and simply remove its View from the hierarchy. + See details in EXT-2098. +*/ + // So, let check if item was moved into folder out of this Inventory Panel. + else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID) + { + view_item->getParentFolder()->extractItem(view_item); + } } } else @@ -650,7 +664,7 @@ void LLInventoryPanel::openAllFolders() mFolders->arrangeAll(); } -void LLInventoryPanel::openDefaultFolderForType(LLAssetType::EType type) +void LLInventoryPanel::openDefaultFolderForType(LLFolderType::EType type) { LLUUID category_id = mInventory->findCategoryUUIDForType(type); LLOpenFolderByID opener(category_id); diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 997678a4784..9f74fad5c1c 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -122,7 +122,7 @@ class LLInventoryPanel : public LLPanel // Call this method to set the selection. void openAllFolders(); - void openDefaultFolderForType(LLAssetType::EType); + void openDefaultFolderForType(LLFolderType::EType); void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus); void setSelectCallback(const LLFolderView::signal_t::slot_type& cb) { if (mFolders) mFolders->setSelectCallback(cb); } void clearSelection(); diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp index 0b07dd4f212..b1829b39459 100644 --- a/indra/newview/lllandmarkactions.cpp +++ b/indra/newview/lllandmarkactions.cpp @@ -135,13 +135,13 @@ use_substring(if_use_substring) // Returns true if the given inventory item is a landmark pointing to the current parcel. // Used to find out if there is at least one landmark from current parcel. -class LLFistAgentParcelLandmark : public LLInventoryCollectFunctor +class LLFirstAgentParcelLandmark : public LLInventoryCollectFunctor { private: bool mFounded;// to avoid unnecessary check public: - LLFistAgentParcelLandmark(): mFounded(false){} + LLFirstAgentParcelLandmark(): mFounded(false){} /*virtual*/ bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) { @@ -165,8 +165,7 @@ static void fetch_landmarks(LLInventoryModel::cat_array_t& cats, LLInventoryCollectFunctor& add) { // Look in "My Favorites" - LLUUID favorites_folder_id = - gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + const LLUUID favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); gInventory.collectDescendentsIf(favorites_folder_id, cats, items, @@ -174,8 +173,7 @@ static void fetch_landmarks(LLInventoryModel::cat_array_t& cats, add); // Look in "Landmarks" - LLUUID landmarks_folder_id = - gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + const LLUUID landmarks_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); gInventory.collectDescendentsIf(landmarks_folder_id, cats, items, @@ -202,7 +200,7 @@ bool LLLandmarkActions::landmarkAlreadyExists() //static bool LLLandmarkActions::hasParcelLandmark() { - LLFistAgentParcelLandmark get_first_agent_landmark; + LLFirstAgentParcelLandmark get_first_agent_landmark; LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; fetch_landmarks(cats, items, get_first_agent_landmark); @@ -287,7 +285,7 @@ void LLLandmarkActions::createLandmarkHere() LLAgentUI::buildLocationString(landmark_name, LLAgentUI::LOCATION_FORMAT_LANDMARK); LLAgentUI::buildLocationString(landmark_desc, LLAgentUI::LOCATION_FORMAT_FULL); - LLUUID folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); createLandmarkHere(landmark_name, landmark_desc, folder_id); } diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h index 312426cab01..1c524c820c9 100644 --- a/indra/newview/lllandmarkactions.h +++ b/indra/newview/lllandmarkactions.h @@ -55,7 +55,7 @@ class LLLandmarkActions static bool landmarkAlreadyExists(); /** - * @brief Checks whether landmark exists for current parcel. + * @brief Checks whether landmark exists for current agent parcel. */ static bool hasParcelLandmark(); diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index e63daac4afb..b35fd6134b7 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -50,6 +50,7 @@ #include "llslurl.h" #include "llurlsimstring.h" #include "llviewerinventory.h" +#include "llviewermenu.h" #include "llviewerparcelmgr.h" #include "llworldmap.h" #include "llappviewer.h" @@ -271,6 +272,12 @@ void LLNavigationBar::draw() LLPanel::draw(); } +BOOL LLNavigationBar::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ + show_navbar_context_menu(this,x,y); + return TRUE; +} + void LLNavigationBar::onBackButtonClicked() { LLTeleportHistory::getInstance()->goBack(); diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 04707d8d48a..52f5a827e4b 100644 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -54,6 +54,7 @@ class LLNavigationBar virtual ~LLNavigationBar(); /*virtual*/ void draw(); + /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); /*virtual*/ BOOL postBuild(); void handleLoginComplete(); diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 12638ab8551..81d033d7f98 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -97,14 +97,39 @@ BOOL LLNearbyChat::postBuild() if (getDockControl() == NULL) { setDockControl(new LLDockControl( - LLBottomTray::getInstance()->getNearbyChatBar(), this, - getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1))); + LLBottomTray::getInstance()->getNearbyChatBar(), this, + getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1))); } return true; } +void LLNearbyChat::applySavedVariables() +{ + + if (mRectControl.size() > 1) + { + const LLRect& rect = LLUI::sSettingGroups["floater"]->getRect(mRectControl); + reshape(rect.getWidth(), rect.getHeight()); + setRect(rect); + } + + + if(!LLUI::sSettingGroups["floater"]->controlExists(mDocStateControl)) + { + setDocked(true); + } + else + { + if (mDocStateControl.size() > 1) + { + bool dockState = LLUI::sSettingGroups["floater"]->getBOOL(mDocStateControl); + setDocked(dockState); + } + } +} + LLColor4 nearbychat_get_text_color(const LLChat& chat) { LLColor4 text_color; @@ -265,11 +290,5 @@ void LLNearbyChat::getAllowedRect(LLRect& rect) { rect = gViewerWindow->getWorldViewRect(); } -void LLNearbyChat::setVisible (BOOL visible) -{ - LLDockableFloater::setVisible(visible); -} -void LLNearbyChat::toggleWindow() -{ -} + diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 20cbf7537d6..cb4654654a9 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -52,16 +52,15 @@ class LLNearbyChat: public LLDockableFloater void onNearbyChatContextMenuItemClicked(const LLSD& userdata); bool onNearbyChatCheckContextMenuItem(const LLSD& userdata); - void setDocked (bool docked, bool pop_on_undock); - void toggleWindow (); + void setDocked (bool docked, bool pop_on_undock = true); /*virtual*/ void onOpen (const LLSD& key); - virtual void setVisible (BOOL visible); - virtual void setRect (const LLRect &rect); private: + virtual void applySavedVariables(); + void getAllowedRect (LLRect& rect); void onNearbySpeakers (); diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 32dc5e59278..d7a5ff289c2 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -77,6 +77,10 @@ LLGestureComboBox::LLGestureComboBox(const LLGestureComboBox::Params& p) // refresh list from current active gestures refreshGestures(); + + // This forces using of halign from xml, since LLComboBox + // sets it to LLFontGL::LEFT, if text entry is disabled + mButton->setHAlign(p.drop_down_button.font_halign); } LLGestureComboBox::~LLGestureComboBox() @@ -207,6 +211,7 @@ LLNearbyChatBar::LLNearbyChatBar() : LLPanel() , mChatBox(NULL) { + mSpeakerMgr = LLLocalSpeakerMgr::getInstance(); } //virtual @@ -516,8 +521,8 @@ void LLNearbyChatBar::displaySpeakingIndicator() LLUUID id; id.setNull(); - mSpeakerMgr.update(TRUE); - mSpeakerMgr.getSpeakerList(&speaker_list, FALSE); + mSpeakerMgr->update(TRUE); + mSpeakerMgr->getSpeakerList(&speaker_list, FALSE); for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i) { diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index 06204e6367b..0307eee7bf0 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -127,7 +127,7 @@ class LLNearbyChatBar LLLineEditor* mChatBox; LLTalkButton* mTalkBtn; LLOutputMonitorCtrl* mOutputMonitor; - LLActiveSpeakerMgr mSpeakerMgr; + LLLocalSpeakerMgr* mSpeakerMgr; }; #endif diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp index 8bac9937f0d..39381e3faae 100644 --- a/indra/newview/lloutputmonitorctrl.cpp +++ b/indra/newview/lloutputmonitorctrl.cpp @@ -80,7 +80,8 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p) mImageLevel2(p.image_level_2), mImageLevel3(p.image_level_3), mAutoUpdate(p.auto_update), - mSpeakerId(p.speaker_id) + mSpeakerId(p.speaker_id), + mIsAgentControl(false) { //static LLUIColor output_monitor_muted_color = LLUIColorTable::instance().getColor("OutputMonitorMutedColor", LLColor4::orange); //static LLUIColor output_monitor_overdriven_color = LLUIColorTable::instance().getColor("OutputMonitorOverdrivenColor", LLColor4::red); @@ -132,7 +133,14 @@ void LLOutputMonitorCtrl::draw() if (getVisible() && mAutoUpdate && !mIsMuted && mSpeakerId.notNull()) { setPower(gVoiceClient->getCurrentPower(mSpeakerId)); - setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId)); + if(mIsAgentControl) + { + setIsTalking(gVoiceClient->getUserPTTState()); + } + else + { + setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId)); + } } LLPointer<LLUIImage> icon; diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h index 7a7b8bc3a18..85ea552a572 100644 --- a/indra/newview/lloutputmonitorctrl.h +++ b/indra/newview/lloutputmonitorctrl.h @@ -81,6 +81,8 @@ class LLOutputMonitorCtrl // For the current user, need to know the PTT state to show // correct button image. + void setIsAgentControl(bool val) { mIsAgentControl = val; } + void setIsTalking(bool val) { mIsTalking = val; } void setSpeakerId(const LLUUID& speaker_id); @@ -100,6 +102,7 @@ class LLOutputMonitorCtrl F32 mPower; + bool mIsAgentControl; bool mIsMuted; bool mIsTalking; LLPointer<LLUIImage> mImageMute; diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index c28792a711d..9d591ef43d1 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -59,6 +59,7 @@ #include "lltoolcomp.h" #include "lltoolmgr.h" #include "lltrans.h" +#include "llviewerassettype.h" #include "llviewerobject.h" #include "llviewerregion.h" #include "llviewerwindow.h" @@ -167,7 +168,7 @@ void LLPanelContents::onClickNewScript(void *userdata) PERM_NONE, PERM_MOVE | PERM_TRANSFER); std::string desc; - LLAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc); + LLViewerAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc); LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem( LLUUID::null, diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index b54975b76b6..21e88b6d07c 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -112,21 +112,32 @@ BOOL LLPanelIMControlPanel::postBuild() childSetAction("add_friend_btn", boost::bind(&LLPanelIMControlPanel::onAddFriendButtonClicked, this)); childSetAction("share_btn", boost::bind(&LLPanelIMControlPanel::onShareButtonClicked, this)); + childSetAction("teleport_btn", boost::bind(&LLPanelIMControlPanel::onTeleportButtonClicked, this)); + childSetAction("pay_btn", boost::bind(&LLPanelIMControlPanel::onPayButtonClicked, this)); childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId())); return LLPanelChatControlPanel::postBuild(); } +void LLPanelIMControlPanel::onTeleportButtonClicked() +{ + LLAvatarActions::offerTeleport(mAvatarID); +} +void LLPanelIMControlPanel::onPayButtonClicked() +{ + LLAvatarActions::pay(mAvatarID); +} + void LLPanelIMControlPanel::onViewProfileButtonClicked() { - LLAvatarActions::showProfile(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId()); + LLAvatarActions::showProfile(mAvatarID); } void LLPanelIMControlPanel::onAddFriendButtonClicked() { LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon"); std::string full_name = avatar_icon->getFirstName() + " " + avatar_icon->getLastName(); - LLAvatarActions::requestFriendshipDialog(avatar_icon->getAvatarId(), full_name); + LLAvatarActions::requestFriendshipDialog(mAvatarID, full_name); } void LLPanelIMControlPanel::onShareButtonClicked() @@ -140,12 +151,12 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) LLIMModel& im_model = LLIMModel::instance(); - LLUUID avatar_id = im_model.getOtherParticipantID(session_id); + mAvatarID = im_model.getOtherParticipantID(session_id); // Disable "Add friend" button for friends. - childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(avatar_id)); + childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID)); - getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(avatar_id); + getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID); // Disable profile button if participant is not realy SL avatar LLIMModel::LLIMSession* im_session = @@ -188,6 +199,20 @@ void LLPanelGroupControlPanel::onGroupInfoButtonClicked() LLGroupActions::show(mGroupID); } +void LLPanelGroupControlPanel::onSortMenuItemClicked(const LLSD& userdata) +{ + // TODO: Check this code when when sort order menu will be added. (EM) + if (false && !mParticipantList) + return; + + std::string chosen_item = userdata.asString(); + + if (chosen_item == "sort_name") + { + mParticipantList->setSortOrder(LLParticipantList::E_SORT_BY_NAME); + } + +} void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id) { diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index d25f33935a3..fa101f42803 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -73,6 +73,8 @@ class LLPanelIMControlPanel : public LLPanelChatControlPanel void onViewProfileButtonClicked(); void onAddFriendButtonClicked(); void onShareButtonClicked(); + void onTeleportButtonClicked(); + void onPayButtonClicked(); LLUUID mAvatarID; }; @@ -97,6 +99,7 @@ class LLPanelGroupControlPanel : public LLPanelChatControlPanel private: void onGroupInfoButtonClicked(); + void onSortMenuItemClicked(const LLSD& userdata); }; class LLPanelAdHocControlPanel : public LLPanelGroupControlPanel diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp new file mode 100644 index 00000000000..1152ca68736 --- /dev/null +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -0,0 +1,437 @@ +/** + * @file llpanellandmarkinfo.cpp + * @brief Displays landmark info in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpanellandmarkinfo.h" + +#include "llinventory.h" + +#include "llcombobox.h" +#include "lllineeditor.h" +#include "lltextbox.h" +#include "lltexteditor.h" +#include "lltrans.h" + +#include "llagent.h" +#include "llagentui.h" +#include "llinventorymodel.h" +#include "lllandmarkactions.h" +#include "llviewerinventory.h" +#include "llviewerparcelmgr.h" +#include "llviewerregion.h" + +//---------------------------------------------------------------------------- +// Aux types and methods +//---------------------------------------------------------------------------- + +typedef std::pair<LLUUID, std::string> folder_pair_t; + +static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right); +static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats); + +static LLRegisterPanelClassWrapper<LLPanelLandmarkInfo> t_landmark_info("panel_landmark_info"); + +LLPanelLandmarkInfo::LLPanelLandmarkInfo() +: LLPanelPlaceInfo() +{} + +// virtual +LLPanelLandmarkInfo::~LLPanelLandmarkInfo() +{} + +// virtual +BOOL LLPanelLandmarkInfo::postBuild() +{ + LLPanelPlaceInfo::postBuild(); + + mOwner = getChild<LLTextBox>("owner"); + mCreator = getChild<LLTextBox>("creator"); + mCreated = getChild<LLTextBox>("created"); + + mTitleEditor = getChild<LLLineEditor>("title_editor"); + mNotesEditor = getChild<LLTextEditor>("notes_editor"); + mFolderCombo = getChild<LLComboBox>("folder_combo"); + + return TRUE; +} + +// virtual +void LLPanelLandmarkInfo::resetLocation() +{ + LLPanelPlaceInfo::resetLocation(); + + std::string not_available = getString("not_available"); + mCreator->setText(not_available); + mOwner->setText(not_available); + mCreated->setText(not_available); + mTitleEditor->setText(LLStringUtil::null); + mNotesEditor->setText(LLStringUtil::null); +} + +// virtual +void LLPanelLandmarkInfo::setInfoType(INFO_TYPE type) +{ + LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel"); + + bool is_info_type_create_landmark = type == CREATE_LANDMARK; + bool is_info_type_landmark = type == LANDMARK; + + landmark_info_panel->setVisible(is_info_type_landmark); + + getChild<LLTextBox>("folder_label")->setVisible(is_info_type_create_landmark); + mFolderCombo->setVisible(is_info_type_create_landmark); + + switch(type) + { + case CREATE_LANDMARK: + mCurrentTitle = getString("title_create_landmark"); + + mTitleEditor->setEnabled(TRUE); + mNotesEditor->setEnabled(TRUE); + break; + + case LANDMARK: + default: + mCurrentTitle = getString("title_landmark"); + + mTitleEditor->setEnabled(FALSE); + mNotesEditor->setEnabled(FALSE); + break; + } + + populateFoldersList(); + + LLPanelPlaceInfo::setInfoType(type); +} + +// virtual +void LLPanelLandmarkInfo::processParcelInfo(const LLParcelData& parcel_data) +{ + LLPanelPlaceInfo::processParcelInfo(parcel_data); + + // HACK: Flag 0x2 == adult region, + // Flag 0x1 == mature region, otherwise assume PG + std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG); + if (parcel_data.flags & 0x2) + { + rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT); + } + else if (parcel_data.flags & 0x1) + { + rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); + } + + mMaturityRatingText->setValue(rating); + + S32 region_x; + S32 region_y; + S32 region_z; + + // If the region position is zero, grab position from the global + if(mPosRegion.isExactlyZero()) + { + region_x = llround(parcel_data.global_x) % REGION_WIDTH_UNITS; + region_y = llround(parcel_data.global_y) % REGION_WIDTH_UNITS; + region_z = llround(parcel_data.global_z); + } + else + { + region_x = llround(mPosRegion.mV[VX]); + region_y = llround(mPosRegion.mV[VY]); + region_z = llround(mPosRegion.mV[VZ]); + } + + if (mInfoType == CREATE_LANDMARK) + { + if (parcel_data.name.empty()) + { + mTitleEditor->setText(llformat("%s (%d, %d, %d)", + parcel_data.sim_name.c_str(), region_x, region_y, region_z)); + } + else + { + mTitleEditor->setText(parcel_data.name); + } + + std::string desc; + LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, gAgent.getPositionAgent()); + mNotesEditor->setText(desc); + + if (!LLLandmarkActions::landmarkAlreadyExists()) + { + createLandmark(mFolderCombo->getValue().asUUID()); + } + } +} + +void LLPanelLandmarkInfo::displayItemInfo(const LLInventoryItem* pItem) +{ + if (!pItem) + return; + + if(!gCacheName) + return; + + const LLPermissions& perm = pItem->getPermissions(); + + ////////////////// + // CREATOR NAME // + ////////////////// + if (pItem->getCreatorUUID().notNull()) + { + std::string name; + LLUUID creator_id = pItem->getCreatorUUID(); + if (!gCacheName->getFullName(creator_id, name)) + { + gCacheName->get(creator_id, FALSE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mCreator, _2, _3)); + } + mCreator->setText(name); + } + else + { + mCreator->setText(getString("unknown")); + } + + //////////////// + // OWNER NAME // + //////////////// + if(perm.isOwned()) + { + std::string name; + if (perm.isGroupOwned()) + { + LLUUID group_id = perm.getGroup(); + if (!gCacheName->getGroupName(group_id, name)) + { + gCacheName->get(group_id, TRUE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mOwner, _2, _3)); + } + } + else + { + LLUUID owner_id = perm.getOwner(); + if (!gCacheName->getFullName(owner_id, name)) + { + gCacheName->get(owner_id, FALSE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mOwner, _2, _3)); + } + } + mOwner->setText(name); + } + else + { + mOwner->setText(getString("public")); + } + + ////////////////// + // ACQUIRE DATE // + ////////////////// + time_t time_utc = pItem->getCreationDate(); + if (0 == time_utc) + { + mCreated->setText(getString("unknown")); + } + else + { + std::string timeStr = getString("acquired_date"); + LLSD substitution; + substitution["datetime"] = (S32) time_utc; + LLStringUtil::format (timeStr, substitution); + mCreated->setText(timeStr); + } + + mTitleEditor->setText(pItem->getName()); + mNotesEditor->setText(pItem->getDescription()); +} + +void LLPanelLandmarkInfo::toggleLandmarkEditMode(BOOL enabled) +{ + // If switching to edit mode while creating landmark + // the "Create Landmark" title remains. + if (enabled && mInfoType != CREATE_LANDMARK) + { + mTitle->setText(getString("title_edit_landmark")); + } + else + { + mTitle->setText(mCurrentTitle); + } + + if (mNotesEditor->getReadOnly() == (enabled == TRUE)) + { + mTitleEditor->setEnabled(enabled); + mNotesEditor->setReadOnly(!enabled); + mFolderCombo->setVisible(enabled); + getChild<LLTextBox>("folder_label")->setVisible(enabled); + + // HACK: To change the text color in a text editor + // when it was enabled/disabled we set the text once again. + mNotesEditor->setText(mNotesEditor->getText()); + } +} + +const std::string& LLPanelLandmarkInfo::getLandmarkTitle() const +{ + return mTitleEditor->getText(); +} + +const std::string LLPanelLandmarkInfo::getLandmarkNotes() const +{ + return mNotesEditor->getText(); +} + +const LLUUID LLPanelLandmarkInfo::getLandmarkFolder() const +{ + return mFolderCombo->getValue().asUUID(); +} + +BOOL LLPanelLandmarkInfo::setLandmarkFolder(const LLUUID& id) +{ + return mFolderCombo->setCurrentByID(id); +} + +void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id) +{ + std::string name = mTitleEditor->getText(); + std::string desc = mNotesEditor->getText(); + + LLStringUtil::trim(name); + LLStringUtil::trim(desc); + + // If typed name is empty use the parcel name instead. + if (name.empty()) + { + name = mParcelName->getText(); + + // If no parcel exists use the region name instead. + if (name.empty()) + { + name = mRegionName->getText(); + } + } + + LLStringUtil::replaceChar(desc, '\n', ' '); + // If no folder chosen use the "Landmarks" folder. + LLLandmarkActions::createLandmarkHere(name, desc, + folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK)); +} + +// static +std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCategory* cat) +{ + std::string name = cat->getName(); + LLUUID parent_id; + + // translate category name, if it's right below the root + // FIXME: it can throw notification about non existent string in strings.xml + if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID()) + { + LLTrans::findString(name, "InvFolder " + name); + } + + // we don't want "My Inventory" to appear in the name + while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID()) + { + cat = gInventory.getCategory(parent_id); + name = cat->getName() + "/" + name; + } + + return name; +} + +void LLPanelLandmarkInfo::populateFoldersList() +{ + // Collect all folders that can contain landmarks. + LLInventoryModel::cat_array_t cats; + collectLandmarkFolders(cats); + + mFolderCombo->removeall(); + + // Put the "Landmarks" folder first in list. + LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id); + if (!cat) + { + llwarns << "Cannot find the landmarks folder" << llendl; + } + std::string cat_full_name = getFullFolderName(cat); + mFolderCombo->add(cat_full_name, cat->getUUID()); + + typedef std::vector<folder_pair_t> folder_vec_t; + folder_vec_t folders; + // Sort the folders by their full name. + for (S32 i = 0; i < cats.count(); i++) + { + cat = cats.get(i); + cat_full_name = getFullFolderName(cat); + folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name)); + } + sort(folders.begin(), folders.end(), cmp_folders); + + // Finally, populate the combobox. + for (folder_vec_t::const_iterator it = folders.begin(); it != folders.end(); it++) + mFolderCombo->add(it->second, LLSD(it->first)); +} + +static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right) +{ + return left.second < right.second; +} + +static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats) +{ + LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + + // Add descendent folders of the "Landmarks" category. + LLInventoryModel::item_array_t items; // unused + LLIsType is_category(LLAssetType::AT_CATEGORY); + gInventory.collectDescendentsIf( + landmarks_id, + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + is_category); + + // Add the "My Favorites" category. + LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id); + if (!favorites_cat) + { + llwarns << "Cannot find the favorites folder" << llendl; + } + else + { + cats.put(favorites_cat); + } +} diff --git a/indra/newview/llpanellandmarkinfo.h b/indra/newview/llpanellandmarkinfo.h new file mode 100644 index 00000000000..03377986b31 --- /dev/null +++ b/indra/newview/llpanellandmarkinfo.h @@ -0,0 +1,85 @@ +/** + * @file llpanellandmarkinfo.h + * @brief Displays landmark info in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELLANDMARKINFO_H +#define LL_LLPANELLANDMARKINFO_H + +#include "llpanelplaceinfo.h" + +class LLComboBox; +class LLLineEditor; +class LLTextEditor; + +class LLPanelLandmarkInfo : public LLPanelPlaceInfo +{ +public: + LLPanelLandmarkInfo(); + /*virtual*/ ~LLPanelLandmarkInfo(); + + /*virtual*/ BOOL postBuild(); + + /*virtual*/ void resetLocation(); + + /*virtual*/ void setInfoType(INFO_TYPE type); + + /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); + + // Displays landmark owner, creator and creation date info. + void displayItemInfo(const LLInventoryItem* pItem); + + void toggleLandmarkEditMode(BOOL enabled); + + const std::string& getLandmarkTitle() const; + const std::string getLandmarkNotes() const; + const LLUUID getLandmarkFolder() const; + + // Select current landmark folder in combobox. + BOOL setLandmarkFolder(const LLUUID& id); + + // Create a landmark for the current location + // in a folder specified by folder_id. + void createLandmark(const LLUUID& folder_id); + + static std::string getFullFolderName(const LLViewerInventoryCategory* cat); + +private: + void populateFoldersList(); + + LLTextBox* mOwner; + LLTextBox* mCreator; + LLTextBox* mCreated; + LLLineEditor* mTitleEditor; + LLTextEditor* mNotesEditor; + LLComboBox* mFolderCombo; +}; + +#endif // LL_LLPANELLANDMARKINFO_H diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 91e1590dc3e..6d6fd38ccee 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -553,14 +553,16 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const std::string command_name = userdata.asString(); if("add_landmark" == command_name) { - if(LLLandmarkActions::landmarkAlreadyExists()) + LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos(); + if(landmark) + { + LLSideTray::getInstance()->showPanel("panel_places", + LLSD().insert("type", "landmark").insert("id",landmark->getUUID())); + } + else { - std::string location; - LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_FULL); - llwarns<<" Landmark already exists at location: "<< location<<llendl; - return; + LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); } - LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark")); } else if ("category" == command_name) { @@ -584,7 +586,7 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const menu_create_inventory_item(mCurrentSelectedList->getRootFolder(), dynamic_cast<LLFolderBridge*> (folder_bridge), LLSD( "category"), gInventory.findCategoryUUIDForType( - LLAssetType::AT_LANDMARK)); + LLFolderType::FT_LANDMARK)); } } } @@ -616,19 +618,21 @@ void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const void LLLandmarksPanel::onFoldingAction(const LLSD& userdata) { - if(!mCurrentSelectedList) return; - - LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); + LLFolderView* landmarks_folder = mLandmarksInventoryPanel->getRootFolder(); + LLFolderView* fav_folder = mFavoritesInventoryPanel->getRootFolder(); std::string command_name = userdata.asString(); if ("expand_all" == command_name) { - root_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); - root_folder->arrangeAll(); + landmarks_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); + fav_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); + landmarks_folder->arrangeAll(); + fav_folder->arrangeAll(); } else if ("collapse_all" == command_name) { - root_folder->closeAllFolders(); + landmarks_folder->closeAllFolders(); + fav_folder->closeAllFolders(); } else if ( "sort_by_date" == command_name) { @@ -639,6 +643,9 @@ void LLLandmarksPanel::onFoldingAction(const LLSD& userdata) } else { + if(!mCurrentSelectedList) return; + + LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); root_folder->doToSelected(&gInventory, userdata); } } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 617445a27f2..25be09fa24a 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -84,8 +84,8 @@ LLPanelMainInventory::LLPanelMainInventory() // Menu Callbacks (non contex menus) mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2)); mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this)); - mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); - mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND)); mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2)); mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this)); mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this)); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 68181f12b94..79b33e29f52 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -60,6 +60,7 @@ #include "llsidetray.h" #include "llstatusbar.h" #include "lltrans.h" +#include "llviewerassettype.h" #include "llviewerregion.h" #include "llviewerobjectlist.h" #include "llviewermessage.h" @@ -102,7 +103,7 @@ class LLTaskInvFVBridge : public LLFolderViewEventListener virtual const std::string& getName() const; virtual const std::string& getDisplayName() const; virtual PermissionMask getPermissionMask() const { return PERM_NONE; } - /*virtual*/ LLAssetType::EType getPreferredType() const { return LLAssetType::AT_NONE; } + /*virtual*/ LLFolderType::EType getPreferredType() const { return LLFolderType::FT_NONE; } virtual const LLUUID& getUUID() const { return mUUID; } virtual time_t getCreationDate() const; virtual LLUIImagePtr getIcon() const; @@ -275,7 +276,7 @@ bool LLTaskInvFVBridge::commitBuyItem(const LLSD& notification, const LLSD& resp msg->addUUIDFast(_PREHASH_ObjectID, notification["payload"]["task_id"].asUUID()); msg->addUUIDFast(_PREHASH_ItemID, notification["payload"]["item_id"].asUUID()); msg->addUUIDFast(_PREHASH_FolderID, - gInventory.findCategoryUUIDForType((LLAssetType::EType)notification["payload"]["type"].asInteger())); + gInventory.findCategoryUUIDForType((LLFolderType::EType)notification["payload"]["type"].asInteger())); msg->sendReliable(object->getRegion()->getHost()); } return false; @@ -573,7 +574,7 @@ BOOL LLTaskInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const // || gAgent.isGodlike()) { - *type = LLAssetType::lookupDragAndDropType(inv->getType()); + *type = LLViewerAssetType::lookupDragAndDropType(inv->getType()); *id = inv->getUUID(); return TRUE; @@ -778,7 +779,7 @@ BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const // || gAgent.isGodlike()) { - *type = LLAssetType::lookupDragAndDropType(inv->getType()); + *type = LLViewerAssetType::lookupDragAndDropType(inv->getType()); *id = inv->getUUID(); return TRUE; @@ -1461,7 +1462,6 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory* item->getFlags()); break; case LLAssetType::AT_CATEGORY: - case LLAssetType::AT_FAVORITE: new_bridge = new LLTaskCategoryBridge(panel, object->getUUID(), object->getName()); @@ -1503,8 +1503,8 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par { // Setup context menu callbacks mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2)); - mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); - mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND)); mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&do_nothing)); mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing)); mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing)); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 4580eeb336a..2f8fae0f5de 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -42,6 +42,7 @@ #include "llpanelpeople.h" // newview +#include "llaccordionctrl.h" #include "llaccordionctrltab.h" #include "llagent.h" #include "llavataractions.h" @@ -516,6 +517,9 @@ BOOL LLPanelPeople::postBuild() // call this method in case some list is empty and buttons can be in inconsistent state updateButtons(); + mOnlineFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2)); + mAllFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2)); + return TRUE; } @@ -560,6 +564,8 @@ void LLPanelPeople::updateFriendList() mOnlineFriendList->setDirty(); mAllFriendList->setDirty(); + + showFriendsAccordionsIfNeeded(); } void LLPanelPeople::updateNearbyList() @@ -797,14 +803,15 @@ void LLPanelPeople::reSelectedCurrentTab() void LLPanelPeople::onFilterEdit(const std::string& search_string) { - if (mFilterSubString == search_string) - return; + std::string search_upper = search_string; + // Searches are case-insensitive + LLStringUtil::toUpper(search_upper); + LLStringUtil::trimHead(search_upper); - mFilterSubString = search_string; + if (mFilterSubString == search_upper) + return; - // Searches are case-insensitive - LLStringUtil::toUpper(mFilterSubString); - LLStringUtil::trimHead(mFilterSubString); + mFilterSubString = search_upper; // Apply new filter. mNearbyList->setNameFilter(mFilterSubString); @@ -812,6 +819,8 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string) mAllFriendList->setNameFilter(mFilterSubString); mRecentList->setNameFilter(mFilterSubString); mGroupList->setNameFilter(mFilterSubString); + + showFriendsAccordionsIfNeeded(); } void LLPanelPeople::onTabSelected(const LLSD& param) @@ -1124,3 +1133,49 @@ void LLPanelPeople::onOpen(const LLSD& key) else reSelectedCurrentTab(); } + +void LLPanelPeople::showAccordion(const std::string name, bool show) +{ + if(name.empty()) + { + llwarns << "No name provided" << llendl; + return; + } + + LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(name); + tab->setVisible(show); + if(show) + { + // expand accordion + tab->changeOpenClose(false); + } +} + +void LLPanelPeople::showFriendsAccordionsIfNeeded() +{ + if(FRIENDS_TAB_NAME == getActiveTabName()) + { + // Expand and show accordions if needed, else - hide them + showAccordion("tab_online", mOnlineFriendList->filterHasMatches()); + showAccordion("tab_all", mAllFriendList->filterHasMatches()); + + // Rearrange accordions + LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); + accordion->arrange(); + } +} + +void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param) +{ + if(ctrl == mOnlineFriendList) + { + showAccordion("tab_online", param.asInteger()); + } + else if(ctrl == mAllFriendList) + { + showAccordion("tab_all", param.asInteger()); + } + + LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); + accordion->arrange(); +} diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index dc0aaeb70f1..9bf9befe906 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -124,6 +124,12 @@ class LLPanelPeople : public LLPanel void onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list); + void showAccordion(const std::string name, bool show); + + void showFriendsAccordionsIfNeeded(); + + void onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param); + LLFilterEditor* mFilterEditor; LLTabContainer* mTabContainer; LLAvatarList* mOnlineFriendList; diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index 34644cfe42d..2c5f4b5afaa 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -1,6 +1,6 @@ /** * @file llpanelplaceinfo.cpp - * @brief Displays place information in Side Tray. + * @brief Base class for place information in Side Tray. * * $LicenseInfo:firstyear=2009&license=viewergpl$ * @@ -39,66 +39,34 @@ #include "llsecondlifeurls.h" #include "llinventory.h" -#include "llparcel.h" -#include "llqueryflags.h" +#include "llsdutil_math.h" -#include "llbutton.h" -#include "llcombobox.h" -#include "lliconctrl.h" #include "llscrollcontainer.h" #include "lltextbox.h" -#include "lltrans.h" -#include "llaccordionctrl.h" -#include "llaccordionctrltab.h" #include "llagent.h" -#include "llagentui.h" -#include "llappviewer.h" #include "llavatarpropertiesprocessor.h" -#include "llcallbacklist.h" #include "llexpandabletextbox.h" #include "llfloaterworldmap.h" -#include "llfloaterbuycurrency.h" #include "llinventorymodel.h" -#include "lllandmarkactions.h" #include "llpanelpick.h" #include "lltexturectrl.h" -#include "llstatusbar.h" #include "llviewerinventory.h" #include "llviewerparcelmgr.h" #include "llviewerregion.h" -#include "llviewercontrol.h" #include "llviewertexteditor.h" #include "llworldmap.h" -#include "llsdutil_math.h" - -//---------------------------------------------------------------------------- -// Aux types and methods -//---------------------------------------------------------------------------- - -typedef std::pair<LLUUID, std::string> folder_pair_t; - -static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right); -static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats); - -static LLRegisterPanelClassWrapper<LLPanelPlaceInfo> t_place_info("panel_place_info"); LLPanelPlaceInfo::LLPanelPlaceInfo() : LLPanel(), mParcelID(), mRequestedID(), mPosRegion(), - mLandmarkID(), - mMinHeight(0), - mScrollingPanel(NULL), - mInfoPanel(NULL), - mMediaPanel(NULL), - mForSalePanel(NULL), - mYouAreHerePanel(NULL), - mSelectedParcelID(-1) + mMinHeight(0) {} +//virtual LLPanelPlaceInfo::~LLPanelPlaceInfo() { if (mParcelID.notNull()) @@ -107,220 +75,41 @@ LLPanelPlaceInfo::~LLPanelPlaceInfo() } } +//virtual BOOL LLPanelPlaceInfo::postBuild() { - mTitle = getChild<LLTextBox>("panel_title"); + mTitle = getChild<LLTextBox>("title"); mCurrentTitle = mTitle->getText(); - mForSalePanel = getChild<LLPanel>("for_sale_panel"); - mYouAreHerePanel = getChild<LLPanel>("here_panel"); - gIdleCallbacks.addFunction(&LLPanelPlaceInfo::updateYouAreHereBanner, this); - - //Icon value should contain sale price of last selected parcel. - mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")-> - setMouseDownCallback(boost::bind(&LLPanelPlaceInfo::onForSaleBannerClick, this)); - mSnapshotCtrl = getChild<LLTextureCtrl>("logo"); mRegionName = getChild<LLTextBox>("region_title"); mParcelName = getChild<LLTextBox>("parcel_title"); mDescEditor = getChild<LLExpandableTextBox>("description"); mMaturityRatingText = getChild<LLTextBox>("maturity_value"); - mParcelOwner = getChild<LLTextBox>("owner_value"); - mLastVisited = getChild<LLTextBox>("last_visited_value"); - - mRatingText = getChild<LLTextBox>("rating_value"); - mVoiceText = getChild<LLTextBox>("voice_value"); - mFlyText = getChild<LLTextBox>("fly_value"); - mPushText = getChild<LLTextBox>("push_value"); - mBuildText = getChild<LLTextBox>("build_value"); - mScriptsText = getChild<LLTextBox>("scripts_value"); - mDamageText = getChild<LLTextBox>("damage_value"); - - mRegionNameText = getChild<LLTextBox>("region_name"); - mRegionTypeText = getChild<LLTextBox>("region_type"); - mRegionRatingText = getChild<LLTextBox>("region_rating"); - mRegionOwnerText = getChild<LLTextBox>("region_owner"); - mRegionGroupText = getChild<LLTextBox>("region_group"); - - mEstateNameText = getChild<LLTextBox>("estate_name"); - mEstateRatingText = getChild<LLTextBox>("estate_rating"); - mEstateOwnerText = getChild<LLTextBox>("estate_owner"); - mCovenantText = getChild<LLTextEditor>("covenant"); - - mSalesPriceText = getChild<LLTextBox>("sales_price"); - mAreaText = getChild<LLTextBox>("area"); - mTrafficText = getChild<LLTextBox>("traffic"); - mPrimitivesText = getChild<LLTextBox>("primitives"); - mParcelScriptsText = getChild<LLTextBox>("parcel_scripts"); - mTerraformLimitsText = getChild<LLTextBox>("terraform_limits"); - mSubdivideText = getChild<LLTextEditor>("subdivide"); - mResaleText = getChild<LLTextEditor>("resale"); - mSaleToText = getChild<LLTextBox>("sale_to"); - mOwner = getChild<LLTextBox>("owner"); - mCreator = getChild<LLTextBox>("creator"); - mCreated = getChild<LLTextBox>("created"); - - mTitleEditor = getChild<LLLineEditor>("title_editor"); - mNotesEditor = getChild<LLTextEditor>("notes_editor"); - mFolderCombo = getChild<LLComboBox>("folder_combo"); - - LLScrollContainer* scroll_container = getChild<LLScrollContainer>("scroll_container"); + LLScrollContainer* scroll_container = getChild<LLScrollContainer>("place_scroll"); scroll_container->setBorderVisible(FALSE); mMinHeight = scroll_container->getScrolledViewRect().getHeight(); - mScrollingPanel = getChild<LLPanel>("scrolling_panel"); - mInfoPanel = getChild<LLPanel>("info_panel"); - mMediaPanel = getChild<LLMediaPanel>("media_panel"); - if (!mMediaPanel) - return FALSE; - return TRUE; } -void LLPanelPlaceInfo::displayItemInfo(const LLInventoryItem* pItem) -{ - if (!pItem) - return; - - mLandmarkID = pItem->getUUID(); - - if(!gCacheName) - return; - - const LLPermissions& perm = pItem->getPermissions(); - - ////////////////// - // CREATOR NAME // - ////////////////// - if (pItem->getCreatorUUID().notNull()) - { - std::string name; - LLUUID creator_id = pItem->getCreatorUUID(); - if (!gCacheName->getFullName(creator_id, name)) - { - gCacheName->get(creator_id, FALSE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mCreator, _2, _3)); - } - mCreator->setText(name); - } - else - { - mCreator->setText(getString("unknown")); - } - - //////////////// - // OWNER NAME // - //////////////// - if(perm.isOwned()) - { - std::string name; - if (perm.isGroupOwned()) - { - LLUUID group_id = perm.getGroup(); - if (!gCacheName->getGroupName(group_id, name)) - { - gCacheName->get(group_id, TRUE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mOwner, _2, _3)); - } - } - else - { - LLUUID owner_id = perm.getOwner(); - if (!gCacheName->getFullName(owner_id, name)) - { - gCacheName->get(owner_id, FALSE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mOwner, _2, _3)); - } - } - mOwner->setText(name); - } - else - { - mOwner->setText(getString("public")); - } - - ////////////////// - // ACQUIRE DATE // - ////////////////// - time_t time_utc = pItem->getCreationDate(); - if (0 == time_utc) - { - mCreated->setText(getString("unknown")); - } - else - { - std::string timeStr = getString("acquired_date"); - LLSD substitution; - substitution["datetime"] = (S32) time_utc; - LLStringUtil::format (timeStr, substitution); - mCreated->setText(timeStr); - } - - mTitleEditor->setText(pItem->getName()); - mNotesEditor->setText(pItem->getDescription()); -} - -void LLPanelPlaceInfo::nameUpdatedCallback( - LLTextBox* text, - const std::string& first, - const std::string& last) -{ - text->setText(first + " " + last); -} - +//virtual void LLPanelPlaceInfo::resetLocation() { mParcelID.setNull(); mRequestedID.setNull(); - mLandmarkID.setNull(); mPosRegion.clearVec(); - mForSalePanel->setVisible(FALSE); - mYouAreHerePanel->setVisible(FALSE); + std::string not_available = getString("not_available"); mMaturityRatingText->setValue(not_available); - mParcelOwner->setValue(not_available); - mLastVisited->setValue(not_available); mRegionName->setText(not_available); mParcelName->setText(not_available); mDescEditor->setText(not_available); - mCreator->setText(not_available); - mOwner->setText(not_available); - mCreated->setText(not_available); - mTitleEditor->setText(LLStringUtil::null); - mNotesEditor->setText(LLStringUtil::null); + mSnapshotCtrl->setImageAssetID(LLUUID::null); mSnapshotCtrl->setFallbackImageName("default_land_picture.j2c"); - - mRatingText->setText(not_available); - mVoiceText->setText(not_available); - mFlyText->setText(not_available); - mPushText->setText(not_available); - mBuildText->setText(not_available); - mParcelScriptsText->setText(not_available); - mDamageText->setText(not_available); - - mRegionNameText->setValue(not_available); - mRegionTypeText->setValue(not_available); - mRegionRatingText->setValue(not_available); - mRegionOwnerText->setValue(not_available); - mRegionGroupText->setValue(not_available); - - mEstateNameText->setValue(not_available); - mEstateRatingText->setValue(not_available); - mEstateOwnerText->setValue(not_available); - mCovenantText->setValue(not_available); - - mSalesPriceText->setValue(not_available); - mAreaText->setValue(not_available); - mTrafficText->setValue(not_available); - mPrimitivesText->setValue(not_available); - mParcelScriptsText->setValue(not_available); - mTerraformLimitsText->setValue(not_available); - mSubdivideText->setValue(not_available); - mResaleText->setValue(not_available); - mSaleToText->setValue(not_available); } //virtual @@ -330,108 +119,55 @@ void LLPanelPlaceInfo::setParcelID(const LLUUID& parcel_id) sendParcelInfoRequest(); } +//virtual void LLPanelPlaceInfo::setInfoType(INFO_TYPE type) { - LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel"); - LLPanel* landmark_edit_panel = getChild<LLPanel>("landmark_edit_panel"); - - bool is_info_type_agent = type == AGENT; - bool is_info_type_create_landmark = type == CREATE_LANDMARK; - bool is_info_type_landmark = type == LANDMARK; - bool is_info_type_teleport_history = type == TELEPORT_HISTORY; - - getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent); - mMaturityRatingText->setVisible(!is_info_type_agent); - - getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent); - mParcelOwner->setVisible(is_info_type_agent); - - getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history); - mLastVisited->setVisible(is_info_type_teleport_history); - - landmark_info_panel->setVisible(is_info_type_landmark); - landmark_edit_panel->setVisible(is_info_type_landmark || is_info_type_create_landmark); - - getChild<LLTextBox>("folder_lable")->setVisible(is_info_type_create_landmark); - mFolderCombo->setVisible(is_info_type_create_landmark); - - getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent); - - switch(type) - { - case CREATE_LANDMARK: - mCurrentTitle = getString("title_create_landmark"); - - mTitleEditor->setEnabled(TRUE); - mNotesEditor->setEnabled(TRUE); - - populateFoldersList(); - break; - - case AGENT: - case PLACE: - mCurrentTitle = getString("title_place"); - - if (!isMediaPanelVisible()) - { - mTitle->setText(mCurrentTitle); - } - break; - - case LANDMARK: - mCurrentTitle = getString("title_landmark"); - - mTitleEditor->setEnabled(FALSE); - mNotesEditor->setEnabled(FALSE); - - populateFoldersList(); - break; - - case TELEPORT_HISTORY: - mCurrentTitle = getString("title_teleport_history"); - break; - } - - if (type != AGENT) - toggleMediaPanel(FALSE); + mTitle->setText(mCurrentTitle); mInfoType = type; } -BOOL LLPanelPlaceInfo::isMediaPanelVisible() +void LLPanelPlaceInfo::sendParcelInfoRequest() { - if (!mMediaPanel) - return FALSE; + if (mParcelID != mRequestedID) + { + LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this); + LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID); - return mMediaPanel->getVisible(); + mRequestedID = mParcelID; + } } -void LLPanelPlaceInfo::toggleMediaPanel(BOOL visible) +void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id, + const LLVector3d& pos_global) { - if (!mMediaPanel) - return; + LLViewerRegion* region = gAgent.getRegion(); + if (!region) + return; + + mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), + (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), + (F32)pos_global.mdV[VZ]); - if (visible) + LLSD body; + std::string url = region->getCapability("RemoteParcelRequest"); + if (!url.empty()) { - mTitle->setText(getString("title_media")); + body["location"] = ll_sd_from_vector3(mPosRegion); + if (!region_id.isNull()) + { + body["region_id"] = region_id; + } + if (!pos_global.isExactlyZero()) + { + U64 region_handle = to_region_handle(pos_global); + body["region_handle"] = ll_sd_from_U64(region_handle); + } + LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle())); } else { - mTitle->setText(mCurrentTitle); - } - - mInfoPanel->setVisible(!visible); - mMediaPanel->setVisible(visible); -} - -void LLPanelPlaceInfo::sendParcelInfoRequest() -{ - if (mParcelID != mRequestedID) - { - LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this); - LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID); - - mRequestedID = mParcelID; + mDescEditor->setText(getString("server_update_text")); } } @@ -473,27 +209,6 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data) mDescEditor->setText(parcel_data.desc); } - // HACK: Flag 0x2 == adult region, - // Flag 0x1 == mature region, otherwise assume PG - std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG); - if (parcel_data.flags & 0x2) - { - rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT); - } - else if (parcel_data.flags & 0x1) - { - rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); - } - - mMaturityRatingText->setValue(rating); - mRatingText->setValue(rating); - - //update for_sale banner, here we should use DFQ_FOR_SALE instead of PF_FOR_SALE - //because we deal with remote parcel response format - bool is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) && - mInfoType == AGENT ? TRUE : FALSE; - mForSalePanel->setVisible(is_for_sale); - S32 region_x; S32 region_y; S32 region_z; @@ -521,408 +236,25 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data) { mParcelName->setText(getString("not_available")); } - - if (mInfoType == CREATE_LANDMARK) - { - if (parcel_data.name.empty()) - { - mTitleEditor->setText(llformat("%s (%d, %d, %d)", - parcel_data.sim_name.c_str(), region_x, region_y, region_z)); - } - else - { - mTitleEditor->setText(parcel_data.name); - } - - // FIXME: Creating landmark works only for current agent location. - std::string desc; - LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, gAgent.getPositionAgent()); - mNotesEditor->setText(desc); - - if (!LLLandmarkActions::landmarkAlreadyExists()) - { - createLandmark(mFolderCombo->getValue().asUUID()); - } - } } -void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id, - const LLVector3d& pos_global) +// virtual +void LLPanelPlaceInfo::handleVisibilityChange(BOOL new_visibility) { - LLViewerRegion* region = gAgent.getRegion(); - if (!region) - return; - - mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), - (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), - (F32)pos_global.mdV[VZ]); - - LLSD body; - std::string url = region->getCapability("RemoteParcelRequest"); - if (!url.empty()) - { - body["location"] = ll_sd_from_vector3(mPosRegion); - if (!region_id.isNull()) - { - body["region_id"] = region_id; - } - if (!pos_global.isExactlyZero()) - { - U64 region_handle = to_region_handle(pos_global); - body["region_handle"] = ll_sd_from_U64(region_handle); - } - LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle())); - } - else - { - mDescEditor->setText(getString("server_update_text")); - } -} + LLPanel::handleVisibilityChange(new_visibility); -void LLPanelPlaceInfo::displaySelectedParcelInfo(LLParcel* parcel, - LLViewerRegion* region, - const LLVector3d& pos_global, - bool is_current_parcel) -{ - if (!region || !parcel) + LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); + if (!parcel_mgr) return; - // send EstateCovenantInfo message - LLMessageSystem *msg = gMessageSystem; - msg->newMessage("EstateCovenantRequest"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); - msg->sendReliable(region->getHost()); - - LLParcelData parcel_data; - - // HACK: Converting sim access flags to the format - // returned by remote parcel response. - switch(region->getSimAccess()) - { - case SIM_ACCESS_MATURE: - parcel_data.flags = 0x1; - break; - - case SIM_ACCESS_ADULT: - parcel_data.flags = 0x2; - break; - - default: - parcel_data.flags = 0; - } - parcel_data.desc = parcel->getDesc(); - parcel_data.name = parcel->getName(); - parcel_data.sim_name = region->getName(); - parcel_data.snapshot_id = parcel->getSnapshotID(); - mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), - (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), - (F32)pos_global.mdV[VZ]); - parcel_data.global_x = pos_global.mdV[VX]; - parcel_data.global_y = pos_global.mdV[VY]; - parcel_data.global_z = pos_global.mdV[VZ]; - - std::string on = getString("on"); - std::string off = getString("off"); - - // Processing parcel characteristics - if (parcel->getParcelFlagAllowVoice()) - { - mVoiceText->setText(on); - } - else - { - mVoiceText->setText(off); - } - - if (!region->getBlockFly() && parcel->getAllowFly()) - { - mFlyText->setText(on); - } - else - { - mFlyText->setText(off); - } - - if (region->getRestrictPushObject() || parcel->getRestrictPushObject()) - { - mPushText->setText(off); - } - else - { - mPushText->setText(on); - } - - if (parcel->getAllowModify()) - { - mBuildText->setText(on); - } - else - { - mBuildText->setText(off); - } - - if((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) || - (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) || - !parcel->getAllowOtherScripts()) - { - mScriptsText->setText(off); - } - else - { - mScriptsText->setText(on); - } - - if (region->getAllowDamage() || parcel->getAllowDamage()) - { - mDamageText->setText(on); - } - else - { - mDamageText->setText(off); - } - - mRegionNameText->setText(region->getName()); - mRegionTypeText->setText(region->getSimProductName()); - mRegionRatingText->setText(region->getSimAccessString()); - - // Determine parcel owner - if (parcel->isPublic()) - { - mParcelOwner->setText(getString("public")); - mRegionOwnerText->setText(getString("public")); - } - else - { - if (parcel->getIsGroupOwned()) - { - mRegionOwnerText->setText(getString("group_owned_text")); - - if(!parcel->getGroupID().isNull()) - { - // FIXME: Using parcel group as region group. - gCacheName->get(parcel->getGroupID(), TRUE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mRegionGroupText, _2, _3)); - - gCacheName->get(parcel->getGroupID(), TRUE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mParcelOwner, _2, _3)); - } - else - { - std::string owner = getString("none_text"); - mRegionGroupText->setText(owner); - mParcelOwner->setText(owner); - } - } - else - { - // Figure out the owner's name - gCacheName->get(parcel->getOwnerID(), FALSE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mParcelOwner, _2, _3)); - gCacheName->get(region->getOwner(), FALSE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mRegionOwnerText, _2, _3)); - } - - if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus()) - { - mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text")); - } - } - - mEstateRatingText->setText(region->getSimAccessString()); - - S32 area; - S32 claim_price; - S32 rent_price; - F32 dwell; - BOOL for_sale = parcel->getForSale(); - LLViewerParcelMgr::getInstance()->getDisplayInfo(&area, - &claim_price, - &rent_price, - &for_sale, - &dwell); - if (for_sale) - { - // Adding "For Sale" flag in remote parcel response format. - parcel_data.flags |= DFQ_FOR_SALE; - - const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); - if(auth_buyer_id.notNull()) - { - gCacheName->get(auth_buyer_id, TRUE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mSaleToText, _2, _3)); - - // Show sales info to a specific person or a group he belongs to. - if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id)) - { - for_sale = FALSE; - } - } - else - { - mSaleToText->setText(getString("anyone")); - } - - const U8* sign = (U8*)getString("price_text").c_str(); - const U8* sqm = (U8*)getString("area_text").c_str(); - - mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice())); - mAreaText->setText(llformat("%d %s", area, sqm)); - mTrafficText->setText(llformat("%.0f", dwell)); - - // Can't have more than region max tasks, regardless of parcel - // object bonus factor. - S32 primitives = llmin(llround(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()), - (S32)region->getMaxTasks()); - - const U8* available = (U8*)getString("available").c_str(); - const U8* allocated = (U8*)getString("allocated").c_str(); - - mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated)); - - if (parcel->getAllowOtherScripts()) - { - mParcelScriptsText->setText(getString("all_residents_text")); - } - else if (parcel->getAllowGroupScripts()) - { - mParcelScriptsText->setText(getString("group_text")); - } - else - { - mParcelScriptsText->setText(off); - } - - mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off); - - if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) - { - mSubdivideText->setText(getString("can_change")); - } - else - { - mSubdivideText->setText(getString("can_not_change")); - } - if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) - { - mResaleText->setText(getString("can_not_resell")); - } - else - { - mResaleText->setText(getString("can_resell")); - } - } - - mSelectedParcelID = parcel->getLocalID(); - mLastSelectedRegionID = region->getRegionID(); - processParcelInfo(parcel_data); - - mYouAreHerePanel->setVisible(is_current_parcel); - getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale); -} - -void LLPanelPlaceInfo::updateEstateName(const std::string& name) -{ - mEstateNameText->setText(name); -} - -void LLPanelPlaceInfo::updateEstateOwnerName(const std::string& name) -{ - mEstateOwnerText->setText(name); -} - -void LLPanelPlaceInfo::updateCovenantText(const std::string &text) -{ - mCovenantText->setText(text); -} - -void LLPanelPlaceInfo::updateLastVisitedText(const LLDate &date) -{ - if (date.isNull()) - { - mLastVisited->setText(getString("unknown")); - } - else - { - std::string timeStr = getString("acquired_date"); - LLSD substitution; - substitution["datetime"] = (S32) date.secondsSinceEpoch(); - LLStringUtil::format (timeStr, substitution); - mLastVisited->setText(timeStr); - } -} - -void LLPanelPlaceInfo::toggleLandmarkEditMode(BOOL enabled) -{ - // If switching to edit mode while creating landmark - // the "Create Landmark" title remains. - if (enabled && mInfoType != CREATE_LANDMARK) - { - mTitle->setText(getString("title_edit_landmark")); - } - else - { - mTitle->setText(mCurrentTitle); - } - - if (mNotesEditor->getReadOnly() == (enabled == TRUE)) - { - mTitleEditor->setEnabled(enabled); - mNotesEditor->setReadOnly(!enabled); - mFolderCombo->setVisible(enabled); - getChild<LLTextBox>("folder_lable")->setVisible(enabled); - - // HACK: To change the text color in a text editor - // when it was enabled/disabled we set the text once again. - mNotesEditor->setText(mNotesEditor->getText()); - } -} - -const std::string& LLPanelPlaceInfo::getLandmarkTitle() const -{ - return mTitleEditor->getText(); -} - -const std::string LLPanelPlaceInfo::getLandmarkNotes() const -{ - return mNotesEditor->getText(); -} - -const LLUUID LLPanelPlaceInfo::getLandmarkFolder() const -{ - return mFolderCombo->getValue().asUUID(); -} - -BOOL LLPanelPlaceInfo::setLandmarkFolder(const LLUUID& id) -{ - return mFolderCombo->setCurrentByID(id); -} - -void LLPanelPlaceInfo::createLandmark(const LLUUID& folder_id) -{ - std::string name = mTitleEditor->getText(); - std::string desc = mNotesEditor->getText(); - - LLStringUtil::trim(name); - LLStringUtil::trim(desc); - - // If typed name is empty use the parcel name instead. - if (name.empty()) + // Remove land selection when panel hides. + if (!new_visibility) { - name = mParcelName->getText(); - - // If no parcel exists use the region name instead. - if (name.empty()) + if (!parcel_mgr->selectionEmpty()) { - name = mRegionName->getText(); + parcel_mgr->deselectLand(); } } - - LLStringUtil::replaceChar(desc, '\n', ' '); - // If no folder chosen use the "Landmarks" folder. - LLLandmarkActions::createLandmarkHere(name, desc, - folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK)); } void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel) @@ -942,159 +274,10 @@ void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel->setPickData(&data); } -// virtual -void LLPanelPlaceInfo::handleVisibilityChange (BOOL new_visibility) -{ - LLPanel::handleVisibilityChange(new_visibility); - - LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); - if (!parcel_mgr) - return; - - // Remove land selection when panel hides. - if (!new_visibility) - { - if (!parcel_mgr->selectionEmpty()) - { - parcel_mgr->deselectLand(); - } - } -} - -void LLPanelPlaceInfo::populateFoldersList() +// static +void LLPanelPlaceInfo::nameUpdatedCallback(LLTextBox* text, + const std::string& first, + const std::string& last) { - // Collect all folders that can contain landmarks. - LLInventoryModel::cat_array_t cats; - collectLandmarkFolders(cats); - - mFolderCombo->removeall(); - - // Put the "Landmarks" folder first in list. - LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); - const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id); - if (!cat) - { - llwarns << "Cannot find the landmarks folder" << llendl; - } - std::string cat_full_name = getFullFolderName(cat); - mFolderCombo->add(cat_full_name, cat->getUUID()); - - typedef std::vector<folder_pair_t> folder_vec_t; - folder_vec_t folders; - // Sort the folders by their full name. - for (S32 i = 0; i < cats.count(); i++) - { - cat = cats.get(i); - cat_full_name = getFullFolderName(cat); - folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name)); - } - sort(folders.begin(), folders.end(), cmp_folders); - - // Finally, populate the combobox. - for (folder_vec_t::const_iterator it = folders.begin(); it != folders.end(); it++) - mFolderCombo->add(it->second, LLSD(it->first)); -} - -//static -void LLPanelPlaceInfo::updateYouAreHereBanner(void* userdata) -{ - //YouAreHere Banner should be displayed only for selected places, - // If you want to display it for landmark or teleport history item, you should check by mParcelId - - LLPanelPlaceInfo* self = static_cast<LLPanelPlaceInfo*>(userdata); - if(!self->getVisible()) - return; - if(!gDisconnected) - { - static F32 radius = gSavedSettings.getF32("YouAreHereDistance"); - - BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID && - LLAgentUI::checkAgentDistance(self->mPosRegion, radius); - - self->mYouAreHerePanel->setVisible(display_banner); - } -} - -void LLPanelPlaceInfo::onForSaleBannerClick() -{ - LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance(); - LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection(); - LLViewerRegion* selected_region = mgr->getSelectionRegion(); - if(!hParcel.isNull() && selected_region) - { - if(hParcel->getParcel()->getLocalID() == mSelectedParcelID && - mLastSelectedRegionID ==selected_region->getRegionID()) - { - if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0) - { - LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice()); - } - else - { - LLViewerParcelMgr::getInstance()->startBuyLand(); - } - } - else - { - LL_WARNS("Places") << "User is trying to buy remote parcel.Operation is not supported"<< LL_ENDL; - } - - } - - -} - -/*static*/ -std::string LLPanelPlaceInfo::getFullFolderName(const LLViewerInventoryCategory* cat) -{ - std::string name = cat->getName(); - LLUUID parent_id; - - // translate category name, if it's right below the root - // FIXME: it can throw notification about non existent string in strings.xml - if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID()) - { - LLTrans::findString(name, "InvFolder " + name); - } - - // we don't want "My Inventory" to appear in the name - while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID()) - { - cat = gInventory.getCategory(parent_id); - name = cat->getName() + "/" + name; - } - - return name; -} - -static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right) -{ - return left.second < right.second; -} - -static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats) -{ - LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); - - // Add descendent folders of the "Landmarks" category. - LLInventoryModel::item_array_t items; // unused - LLIsType is_category(LLAssetType::AT_CATEGORY); - gInventory.collectDescendentsIf( - landmarks_id, - cats, - items, - LLInventoryModel::EXCLUDE_TRASH, - is_category); - - // Add the "My Favorites" category. - LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); - LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id); - if (!favorites_cat) - { - llwarns << "Cannot find the favorites folder" << llendl; - } - else - { - cats.put(favorites_cat); - } + text->setText(first + " " + last); } diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h index 07a2434d59f..c9e13475428 100644 --- a/indra/newview/llpanelplaceinfo.h +++ b/indra/newview/llpanelplaceinfo.h @@ -1,6 +1,6 @@ /** * @file llpanelplaceinfo.h - * @brief Displays place information in Side Tray. + * @brief Base class for place information in Side Tray. * * $LicenseInfo:firstyear=2009&license=viewergpl$ * @@ -38,19 +38,13 @@ #include "v3dmath.h" #include "lluuid.h" -#include "llpanelmedia.h" #include "llremoteparcelrequest.h" -class LLButton; -class LLComboBox; class LLExpandableTextBox; class LLInventoryItem; -class LLLineEditor; class LLPanelPickEdit; class LLParcel; -class LLIconCtrl; class LLTextBox; -class LLTextEditor; class LLTextureCtrl; class LLViewerRegion; class LLViewerInventoryCategory; @@ -74,30 +68,18 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver // Ignore all old location information, useful if you are // recycling an existing dialog and need to clear it. - void resetLocation(); + virtual void resetLocation(); // Sends a request for data about the given parcel, which will // only update the location if there is none already available. /*virtual*/ void setParcelID(const LLUUID& parcel_id); - // Depending on how the panel was triggered - // (from landmark or current location, or other) + // Depending on how the panel was triggered + // (from landmark or current location, or other) // sets a corresponding title and contents. - void setInfoType(INFO_TYPE type); - - // Create a landmark for the current location - // in a folder specified by folder_id. - void createLandmark(const LLUUID& folder_id); - - // Create a pick for the location specified - // by global_pos. - void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel); - - BOOL isMediaPanelVisible(); - void toggleMediaPanel(BOOL visible); - void displayItemInfo(const LLInventoryItem* pItem); - /*virtual*/ void setErrorStatus(U32 status, const std::string& reason); + virtual void setInfoType(INFO_TYPE type); + // Requests remote parcel info by parcel ID. void sendParcelInfoRequest(); // Displays information about a remote parcel. @@ -105,109 +87,37 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver void displayParcelInfo(const LLUUID& region_id, const LLVector3d& pos_global); - // Displays information about the currently selected parcel - // without sending a request to the server. - // If is_current_parcel true shows "You Are Here" banner. - void displaySelectedParcelInfo(LLParcel* parcel, - LLViewerRegion* region, - const LLVector3d& pos_global, - bool is_current_parcel); - - void updateEstateName(const std::string& name); - void updateEstateOwnerName(const std::string& name); - void updateCovenantText(const std::string &text); - void updateLastVisitedText(const LLDate &date); - - void nameUpdatedCallback(LLTextBox* text, - const std::string& first, - const std::string& last); - - void toggleLandmarkEditMode(BOOL enabled); - - const std::string& getLandmarkTitle() const; - const std::string getLandmarkNotes() const; - const LLUUID getLandmarkFolder() const; - - // Select current landmark folder in combobox. - BOOL setLandmarkFolder(const LLUUID& id); + /*virtual*/ void setErrorStatus(U32 status, const std::string& reason); /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); + /*virtual*/ void handleVisibilityChange (BOOL new_visibility); - - static std::string getFullFolderName(const LLViewerInventoryCategory* cat); -private: + // Create a pick for the location specified + // by global_pos. + void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel); - void populateFoldersList(); - static void updateYouAreHereBanner(void*);// added to gIdleCallbacks - void onForSaleBannerClick(); +protected: + static void nameUpdatedCallback(LLTextBox* text, + const std::string& first, + const std::string& last); /** * mParcelID is valid only for remote places, in other cases it's null. See resetLocation() */ - LLUUID mParcelID; - LLUUID mRequestedID; - LLUUID mLandmarkID; - LLVector3 mPosRegion; - std::string mCurrentTitle; - S32 mMinHeight; - INFO_TYPE mInfoType; - - /** - * Hold last displayed parcel. Needs for YouAreHere banner. - */ - S32 mSelectedParcelID; - LLUUID mLastSelectedRegionID; - - LLTextBox* mTitle; - LLPanel* mForSalePanel; - LLPanel* mYouAreHerePanel; - LLTextureCtrl* mSnapshotCtrl; - LLTextBox* mRegionName; - LLTextBox* mParcelName; - LLExpandableTextBox*mDescEditor; - LLTextBox* mMaturityRatingText; - LLTextBox* mParcelOwner; - LLTextBox* mLastVisited; - - LLTextBox* mRatingText; - LLTextBox* mVoiceText; - LLTextBox* mFlyText; - LLTextBox* mPushText; - LLTextBox* mBuildText; - LLTextBox* mScriptsText; - LLTextBox* mDamageText; - - LLTextBox* mRegionNameText; - LLTextBox* mRegionTypeText; - LLTextBox* mRegionRatingText; - LLTextBox* mRegionOwnerText; - LLTextBox* mRegionGroupText; - - LLTextBox* mEstateNameText; - LLTextBox* mEstateRatingText; - LLTextBox* mEstateOwnerText; - LLTextEditor* mCovenantText; - - LLTextBox* mSalesPriceText; - LLTextBox* mAreaText; - LLTextBox* mTrafficText; - LLTextBox* mPrimitivesText; - LLTextBox* mParcelScriptsText; - LLTextBox* mTerraformLimitsText; - LLTextEditor* mSubdivideText; - LLTextEditor* mResaleText; - LLTextBox* mSaleToText; - - LLTextBox* mOwner; - LLTextBox* mCreator; - LLTextBox* mCreated; - LLLineEditor* mTitleEditor; - LLTextEditor* mNotesEditor; - LLComboBox* mFolderCombo; - LLPanel* mScrollingPanel; - LLPanel* mInfoPanel; - LLMediaPanel* mMediaPanel; + LLUUID mParcelID; + LLUUID mRequestedID; + LLVector3 mPosRegion; + std::string mCurrentTitle; + S32 mMinHeight; + INFO_TYPE mInfoType; + + LLTextBox* mTitle; + LLTextureCtrl* mSnapshotCtrl; + LLTextBox* mRegionName; + LLTextBox* mParcelName; + LLExpandableTextBox* mDescEditor; + LLTextBox* mMaturityRatingText; }; #endif // LL_LLPANELPLACEINFO_H diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp new file mode 100644 index 00000000000..9ba72fe6cff --- /dev/null +++ b/indra/newview/llpanelplaceprofile.cpp @@ -0,0 +1,541 @@ +/** + * @file llpanelplaceprofile.cpp + * @brief Displays place profile in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpanelplaceprofile.h" + +#include "llparcel.h" + +#include "llqueryflags.h" + +#include "lliconctrl.h" +#include "lllineeditor.h" +#include "lltextbox.h" +#include "lltexteditor.h" + +#include "llaccordionctrl.h" +#include "llaccordionctrltab.h" +#include "llagent.h" +#include "llagentui.h" +#include "llappviewer.h" +#include "llcallbacklist.h" +#include "llfloaterbuycurrency.h" +#include "llstatusbar.h" +#include "llviewercontrol.h" +#include "llviewerparcelmgr.h" +#include "llviewerregion.h" + +static LLRegisterPanelClassWrapper<LLPanelPlaceProfile> t_place_profile("panel_place_profile"); + +LLPanelPlaceProfile::LLPanelPlaceProfile() +: LLPanelPlaceInfo(), + mForSalePanel(NULL), + mYouAreHerePanel(NULL), + mSelectedParcelID(-1) +{} + +// virtual +LLPanelPlaceProfile::~LLPanelPlaceProfile() +{} + +// virtual +BOOL LLPanelPlaceProfile::postBuild() +{ + LLPanelPlaceInfo::postBuild(); + + mForSalePanel = getChild<LLPanel>("for_sale_panel"); + mYouAreHerePanel = getChild<LLPanel>("here_panel"); + gIdleCallbacks.addFunction(&LLPanelPlaceProfile::updateYouAreHereBanner, this); + + //Icon value should contain sale price of last selected parcel. + mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")-> + setMouseDownCallback(boost::bind(&LLPanelPlaceProfile::onForSaleBannerClick, this)); + + mParcelOwner = getChild<LLTextBox>("owner_value"); + mLastVisited = getChild<LLTextBox>("last_visited_value"); + + mRatingText = getChild<LLTextBox>("rating_value"); + mVoiceText = getChild<LLTextBox>("voice_value"); + mFlyText = getChild<LLTextBox>("fly_value"); + mPushText = getChild<LLTextBox>("push_value"); + mBuildText = getChild<LLTextBox>("build_value"); + mScriptsText = getChild<LLTextBox>("scripts_value"); + mDamageText = getChild<LLTextBox>("damage_value"); + + mRegionNameText = getChild<LLTextBox>("region_name"); + mRegionTypeText = getChild<LLTextBox>("region_type"); + mRegionRatingText = getChild<LLTextBox>("region_rating"); + mRegionOwnerText = getChild<LLTextBox>("region_owner"); + mRegionGroupText = getChild<LLTextBox>("region_group"); + + mEstateNameText = getChild<LLTextBox>("estate_name"); + mEstateRatingText = getChild<LLTextBox>("estate_rating"); + mEstateOwnerText = getChild<LLTextBox>("estate_owner"); + mCovenantText = getChild<LLTextEditor>("covenant"); + + mSalesPriceText = getChild<LLTextBox>("sales_price"); + mAreaText = getChild<LLTextBox>("area"); + mTrafficText = getChild<LLTextBox>("traffic"); + mPrimitivesText = getChild<LLTextBox>("primitives"); + mParcelScriptsText = getChild<LLTextBox>("parcel_scripts"); + mTerraformLimitsText = getChild<LLTextBox>("terraform_limits"); + mSubdivideText = getChild<LLTextEditor>("subdivide"); + mResaleText = getChild<LLTextEditor>("resale"); + mSaleToText = getChild<LLTextBox>("sale_to"); + + return TRUE; +} + +// virtual +void LLPanelPlaceProfile::resetLocation() +{ + LLPanelPlaceInfo::resetLocation(); + + mForSalePanel->setVisible(FALSE); + mYouAreHerePanel->setVisible(FALSE); + + std::string not_available = getString("not_available"); + mParcelOwner->setValue(not_available); + mLastVisited->setValue(not_available); + + mRatingText->setText(not_available); + mVoiceText->setText(not_available); + mFlyText->setText(not_available); + mPushText->setText(not_available); + mBuildText->setText(not_available); + mParcelScriptsText->setText(not_available); + mDamageText->setText(not_available); + + mRegionNameText->setValue(not_available); + mRegionTypeText->setValue(not_available); + mRegionRatingText->setValue(not_available); + mRegionOwnerText->setValue(not_available); + mRegionGroupText->setValue(not_available); + + mEstateNameText->setValue(not_available); + mEstateRatingText->setValue(not_available); + mEstateOwnerText->setValue(not_available); + mCovenantText->setValue(not_available); + + mSalesPriceText->setValue(not_available); + mAreaText->setValue(not_available); + mTrafficText->setValue(not_available); + mPrimitivesText->setValue(not_available); + mParcelScriptsText->setValue(not_available); + mTerraformLimitsText->setValue(not_available); + mSubdivideText->setValue(not_available); + mResaleText->setValue(not_available); + mSaleToText->setValue(not_available); +} + +// virtual +void LLPanelPlaceProfile::setInfoType(INFO_TYPE type) +{ + bool is_info_type_agent = type == AGENT; + bool is_info_type_teleport_history = type == TELEPORT_HISTORY; + + getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent); + mMaturityRatingText->setVisible(!is_info_type_agent); + + getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent); + mParcelOwner->setVisible(is_info_type_agent); + + getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history); + mLastVisited->setVisible(is_info_type_teleport_history); + + getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent); + + switch(type) + { + case AGENT: + case PLACE: + default: + mCurrentTitle = getString("title_place"); + break; + + case TELEPORT_HISTORY: + mCurrentTitle = getString("title_teleport_history"); + break; + } + + LLPanelPlaceInfo::setInfoType(type); +} + +// virtual +void LLPanelPlaceProfile::processParcelInfo(const LLParcelData& parcel_data) +{ + LLPanelPlaceInfo::processParcelInfo(parcel_data); + + // HACK: Flag 0x2 == adult region, + // Flag 0x1 == mature region, otherwise assume PG + std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG); + if (parcel_data.flags & 0x2) + { + rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT); + } + else if (parcel_data.flags & 0x1) + { + rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); + } + + mMaturityRatingText->setValue(rating); + mRatingText->setValue(rating); + + //update for_sale banner, here we should use DFQ_FOR_SALE instead of PF_FOR_SALE + //because we deal with remote parcel response format + bool is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) && + mInfoType == AGENT ? TRUE : FALSE; + mForSalePanel->setVisible(is_for_sale); +} + +void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, + LLViewerRegion* region, + const LLVector3d& pos_global, + bool is_current_parcel) +{ + if (!region || !parcel) + return; + + // send EstateCovenantInfo message + LLMessageSystem *msg = gMessageSystem; + msg->newMessage("EstateCovenantRequest"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); + msg->sendReliable(region->getHost()); + + LLParcelData parcel_data; + + // HACK: Converting sim access flags to the format + // returned by remote parcel response. + switch(region->getSimAccess()) + { + case SIM_ACCESS_MATURE: + parcel_data.flags = 0x1; + break; + + case SIM_ACCESS_ADULT: + parcel_data.flags = 0x2; + break; + + default: + parcel_data.flags = 0; + } + parcel_data.desc = parcel->getDesc(); + parcel_data.name = parcel->getName(); + parcel_data.sim_name = region->getName(); + parcel_data.snapshot_id = parcel->getSnapshotID(); + mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), + (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), + (F32)pos_global.mdV[VZ]); + parcel_data.global_x = pos_global.mdV[VX]; + parcel_data.global_y = pos_global.mdV[VY]; + parcel_data.global_z = pos_global.mdV[VZ]; + + std::string on = getString("on"); + std::string off = getString("off"); + + // Processing parcel characteristics + if (parcel->getParcelFlagAllowVoice()) + { + mVoiceText->setText(on); + } + else + { + mVoiceText->setText(off); + } + + if (!region->getBlockFly() && parcel->getAllowFly()) + { + mFlyText->setText(on); + } + else + { + mFlyText->setText(off); + } + + if (region->getRestrictPushObject() || parcel->getRestrictPushObject()) + { + mPushText->setText(off); + } + else + { + mPushText->setText(on); + } + + if (parcel->getAllowModify()) + { + mBuildText->setText(on); + } + else + { + mBuildText->setText(off); + } + + if((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) || + (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) || + !parcel->getAllowOtherScripts()) + { + mScriptsText->setText(off); + } + else + { + mScriptsText->setText(on); + } + + if (region->getAllowDamage() || parcel->getAllowDamage()) + { + mDamageText->setText(on); + } + else + { + mDamageText->setText(off); + } + + mRegionNameText->setText(region->getName()); + mRegionTypeText->setText(region->getSimProductName()); + mRegionRatingText->setText(region->getSimAccessString()); + + // Determine parcel owner + if (parcel->isPublic()) + { + mParcelOwner->setText(getString("public")); + mRegionOwnerText->setText(getString("public")); + } + else + { + if (parcel->getIsGroupOwned()) + { + mRegionOwnerText->setText(getString("group_owned_text")); + + if(!parcel->getGroupID().isNull()) + { + // FIXME: Using parcel group as region group. + gCacheName->get(parcel->getGroupID(), TRUE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionGroupText, _2, _3)); + + gCacheName->get(parcel->getGroupID(), TRUE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3)); + } + else + { + std::string owner = getString("none_text"); + mRegionGroupText->setText(owner); + mParcelOwner->setText(owner); + } + } + else + { + // Figure out the owner's name + gCacheName->get(parcel->getOwnerID(), FALSE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3)); + gCacheName->get(region->getOwner(), FALSE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionOwnerText, _2, _3)); + } + + if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus()) + { + mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text")); + } + } + + mEstateRatingText->setText(region->getSimAccessString()); + + S32 area; + S32 claim_price; + S32 rent_price; + F32 dwell; + BOOL for_sale = parcel->getForSale(); + LLViewerParcelMgr::getInstance()->getDisplayInfo(&area, + &claim_price, + &rent_price, + &for_sale, + &dwell); + if (for_sale) + { + // Adding "For Sale" flag in remote parcel response format. + parcel_data.flags |= DFQ_FOR_SALE; + + const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); + if(auth_buyer_id.notNull()) + { + gCacheName->get(auth_buyer_id, TRUE, + boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mSaleToText, _2, _3)); + + // Show sales info to a specific person or a group he belongs to. + if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id)) + { + for_sale = FALSE; + } + } + else + { + mSaleToText->setText(getString("anyone")); + } + + const U8* sign = (U8*)getString("price_text").c_str(); + const U8* sqm = (U8*)getString("area_text").c_str(); + + mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice())); + mAreaText->setText(llformat("%d %s", area, sqm)); + mTrafficText->setText(llformat("%.0f", dwell)); + + // Can't have more than region max tasks, regardless of parcel + // object bonus factor. + S32 primitives = llmin(llround(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()), + (S32)region->getMaxTasks()); + + const U8* available = (U8*)getString("available").c_str(); + const U8* allocated = (U8*)getString("allocated").c_str(); + + mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated)); + + if (parcel->getAllowOtherScripts()) + { + mParcelScriptsText->setText(getString("all_residents_text")); + } + else if (parcel->getAllowGroupScripts()) + { + mParcelScriptsText->setText(getString("group_text")); + } + else + { + mParcelScriptsText->setText(off); + } + + mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off); + + if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) + { + mSubdivideText->setText(getString("can_change")); + } + else + { + mSubdivideText->setText(getString("can_not_change")); + } + if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) + { + mResaleText->setText(getString("can_not_resell")); + } + else + { + mResaleText->setText(getString("can_resell")); + } + } + + mSelectedParcelID = parcel->getLocalID(); + mLastSelectedRegionID = region->getRegionID(); + processParcelInfo(parcel_data); + + mYouAreHerePanel->setVisible(is_current_parcel); + getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale); +} + +void LLPanelPlaceProfile::updateEstateName(const std::string& name) +{ + mEstateNameText->setText(name); +} + +void LLPanelPlaceProfile::updateEstateOwnerName(const std::string& name) +{ + mEstateOwnerText->setText(name); +} + +void LLPanelPlaceProfile::updateCovenantText(const std::string &text) +{ + mCovenantText->setText(text); +} + +void LLPanelPlaceProfile::updateLastVisitedText(const LLDate &date) +{ + if (date.isNull()) + { + mLastVisited->setText(getString("unknown")); + } + else + { + std::string timeStr = getString("acquired_date"); + LLSD substitution; + substitution["datetime"] = (S32) date.secondsSinceEpoch(); + LLStringUtil::format (timeStr, substitution); + mLastVisited->setText(timeStr); + } +} + +void LLPanelPlaceProfile::onForSaleBannerClick() +{ + LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance(); + LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection(); + LLViewerRegion* selected_region = mgr->getSelectionRegion(); + if(!hParcel.isNull() && selected_region) + { + if(hParcel->getParcel()->getLocalID() == mSelectedParcelID && + mLastSelectedRegionID ==selected_region->getRegionID()) + { + if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0) + { + LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice()); + } + else + { + LLViewerParcelMgr::getInstance()->startBuyLand(); + } + } + else + { + LL_WARNS("Places") << "User is trying to buy remote parcel.Operation is not supported"<< LL_ENDL; + } + + } +} + +// static +void LLPanelPlaceProfile::updateYouAreHereBanner(void* userdata) +{ + //YouAreHere Banner should be displayed only for selected places, + // If you want to display it for landmark or teleport history item, you should check by mParcelId + + LLPanelPlaceProfile* self = static_cast<LLPanelPlaceProfile*>(userdata); + if(!self->getVisible()) + return; + + if(!gDisconnected) + { + static F32 radius = gSavedSettings.getF32("YouAreHereDistance"); + + BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID && + LLAgentUI::checkAgentDistance(self->mPosRegion, radius); + + self->mYouAreHerePanel->setVisible(display_banner); + } +} diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h new file mode 100644 index 00000000000..d8e4bcb6bdb --- /dev/null +++ b/indra/newview/llpanelplaceprofile.h @@ -0,0 +1,114 @@ +/** + * @file llpanelplaceprofile.h + * @brief Displays place profile in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELPLACEPROFILE_H +#define LL_LLPANELPLACEPROFILE_H + +#include "llpanelplaceinfo.h" + +class LLTextEditor; + +class LLPanelPlaceProfile : public LLPanelPlaceInfo +{ +public: + LLPanelPlaceProfile(); + /*virtual*/ ~LLPanelPlaceProfile(); + + /*virtual*/ BOOL postBuild(); + + /*virtual*/ void resetLocation(); + + /*virtual*/ void setInfoType(INFO_TYPE type); + + /*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); + + // Displays information about the currently selected parcel + // without sending a request to the server. + // If is_current_parcel true shows "You Are Here" banner. + void displaySelectedParcelInfo(LLParcel* parcel, + LLViewerRegion* region, + const LLVector3d& pos_global, + bool is_current_parcel); + + void updateEstateName(const std::string& name); + void updateEstateOwnerName(const std::string& name); + void updateCovenantText(const std::string &text); + void updateLastVisitedText(const LLDate &date); + +private: + void onForSaleBannerClick(); + + static void updateYouAreHereBanner(void*);// added to gIdleCallbacks + + /** + * Holds last displayed parcel. Needed for YouAreHere banner. + */ + S32 mSelectedParcelID; + LLUUID mLastSelectedRegionID; + + LLPanel* mForSalePanel; + LLPanel* mYouAreHerePanel; + + LLTextBox* mParcelOwner; + LLTextBox* mLastVisited; + + LLTextBox* mRatingText; + LLTextBox* mVoiceText; + LLTextBox* mFlyText; + LLTextBox* mPushText; + LLTextBox* mBuildText; + LLTextBox* mScriptsText; + LLTextBox* mDamageText; + + LLTextBox* mRegionNameText; + LLTextBox* mRegionTypeText; + LLTextBox* mRegionRatingText; + LLTextBox* mRegionOwnerText; + LLTextBox* mRegionGroupText; + + LLTextBox* mEstateNameText; + LLTextBox* mEstateRatingText; + LLTextBox* mEstateOwnerText; + LLTextEditor* mCovenantText; + + LLTextBox* mSalesPriceText; + LLTextBox* mAreaText; + LLTextBox* mTrafficText; + LLTextBox* mPrimitivesText; + LLTextBox* mParcelScriptsText; + LLTextBox* mTerraformLimitsText; + LLTextEditor* mSubdivideText; + LLTextEditor* mResaleText; + LLTextBox* mSaleToText; +}; + +#endif // LL_LLPANELPLACEPROFILE_H diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index b2e9110e966..66efb96fc74 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -57,9 +57,10 @@ #include "llinventorymodel.h" #include "lllandmarkactions.h" #include "lllandmarklist.h" -#include "llpanelplaceinfo.h" +#include "llpanellandmarkinfo.h" #include "llpanellandmarks.h" #include "llpanelpick.h" +#include "llpanelplaceprofile.h" #include "llpanelteleporthistory.h" #include "llteleporthistorystorage.h" #include "lltoggleablemenu.h" @@ -121,7 +122,8 @@ LLPanelPlaces::LLPanelPlaces() mFilterSubString(LLStringUtil::null), mActivePanel(NULL), mFilterEditor(NULL), - mPlaceInfo(NULL), + mPlaceProfile(NULL), + mLandmarkInfo(NULL), mPickPanel(NULL), mItem(NULL), mPlaceMenu(NULL), @@ -135,7 +137,7 @@ LLPanelPlaces::LLPanelPlaces() gInventory.addObserver(mInventoryObserver); LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback( - boost::bind(&LLPanelPlaces::onAgentParcelChange, this)); + boost::bind(&LLPanelPlaces::updateVerbs, this)); //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() } @@ -206,25 +208,32 @@ BOOL LLPanelPlaces::postBuild() mFilterEditor->setCommitCallback(boost::bind(&LLPanelPlaces::onFilterEdit, this, _2, false)); } - mPlaceInfo = getChild<LLPanelPlaceInfo>("panel_place_info"); + mPlaceProfile = getChild<LLPanelPlaceProfile>("panel_place_profile"); + mLandmarkInfo = getChild<LLPanelLandmarkInfo>("panel_landmark_info"); + if (!mPlaceProfile || !mLandmarkInfo) + return FALSE; - LLButton* back_btn = mPlaceInfo->getChild<LLButton>("back_btn"); + LLButton* back_btn = mPlaceProfile->getChild<LLButton>("back_btn"); back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); - LLLineEditor* title_editor = mPlaceInfo->getChild<LLLineEditor>("title_editor"); + back_btn = mLandmarkInfo->getChild<LLButton>("back_btn"); + back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); + + LLLineEditor* title_editor = mLandmarkInfo->getChild<LLLineEditor>("title_editor"); title_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this), NULL); - LLTextEditor* notes_editor = mPlaceInfo->getChild<LLTextEditor>("notes_editor"); + LLTextEditor* notes_editor = mLandmarkInfo->getChild<LLTextEditor>("notes_editor"); notes_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); - LLComboBox* folder_combo = mPlaceInfo->getChild<LLComboBox>("folder_combo"); + LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo"); folder_combo->setSelectionCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); + return TRUE; } void LLPanelPlaces::onOpen(const LLSD& key) { - if(mPlaceInfo == NULL || key.size() == 0) + if(!mPlaceProfile || !mLandmarkInfo || key.size() == 0) return; mFilterEditor->clear(); @@ -239,11 +248,11 @@ void LLPanelPlaces::onOpen(const LLSD& key) if (mPlaceInfoType == AGENT_INFO_TYPE) { - mPlaceInfo->setInfoType(LLPanelPlaceInfo::AGENT); + mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT); } else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) { - mPlaceInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK); + mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK); if (key.has("x") && key.has("y") && key.has("z")) { @@ -256,11 +265,11 @@ void LLPanelPlaces::onOpen(const LLSD& key) mPosGlobal = gAgent.getPositionGlobal(); } - mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal); + mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal); } else if (mPlaceInfoType == LANDMARK_INFO_TYPE) { - mPlaceInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); + mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); LLInventoryItem* item = gInventory.getItem(key["id"].asUUID()); if (!item) @@ -270,17 +279,12 @@ void LLPanelPlaces::onOpen(const LLSD& key) } else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) { - if (mPlaceInfo->isMediaPanelVisible()) - { - toggleMediaPanel(); - } - mPosGlobal = LLVector3d(key["x"].asReal(), key["y"].asReal(), key["z"].asReal()); - mPlaceInfo->setInfoType(LLPanelPlaceInfo::PLACE); - mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal); + mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE); + mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); } else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) { @@ -291,9 +295,9 @@ void LLPanelPlaces::onOpen(const LLSD& key) mPosGlobal = hist_items[index].mGlobalPos; - mPlaceInfo->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); - mPlaceInfo->updateLastVisitedText(hist_items[index].mDate); - mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal); + mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); + mPlaceProfile->updateLastVisitedText(hist_items[index].mDate); + mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); } LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); @@ -321,7 +325,7 @@ void LLPanelPlaces::onOpen(const LLSD& key) void LLPanelPlaces::setItem(LLInventoryItem* item) { - if (!mPlaceInfo || !item) + if (!mLandmarkInfo || !item) return; mItem = item; @@ -351,19 +355,19 @@ void LLPanelPlaces::setItem(LLInventoryItem* item) if (is_landmark_editable) { - if(!mPlaceInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull()) + if(!mLandmarkInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull()) { const LLViewerInventoryCategory* cat = gInventory.getCategory(mItem->getParentUUID()); - if(cat) + if (cat) { - std::string cat_fullname = LLPanelPlaceInfo::getFullFolderName(cat); - LLComboBox* folderList = mPlaceInfo->getChild<LLComboBox>("folder_combo"); - folderList->add(cat_fullname, cat->getUUID(),ADD_TOP); + std::string cat_fullname = LLPanelLandmarkInfo::getFullFolderName(cat); + LLComboBox* folderList = mLandmarkInfo->getChild<LLComboBox>("folder_combo"); + folderList->add(cat_fullname, cat->getUUID(), ADD_TOP); } } } - mPlaceInfo->displayItemInfo(mItem); + mLandmarkInfo->displayItemInfo(mItem); LLLandmark* lm = gLandmarkList.getAsset(mItem->getAssetUUID(), boost::bind(&LLPanelPlaces::onLandmarkLoaded, this, _1)); @@ -375,13 +379,13 @@ void LLPanelPlaces::setItem(LLInventoryItem* item) void LLPanelPlaces::onLandmarkLoaded(LLLandmark* landmark) { - if (!mPlaceInfo) + if (!mLandmarkInfo) return; LLUUID region_id; landmark->getRegionID(region_id); landmark->getGlobalPos(mPosGlobal); - mPlaceInfo->displayParcelInfo(region_id, mPosGlobal); + mLandmarkInfo->displayParcelInfo(region_id, mPosGlobal); } void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_filter) @@ -418,10 +422,8 @@ void LLPanelPlaces::onShareButtonClicked() void LLPanelPlaces::onTeleportButtonClicked() { - if (!mPlaceInfo) - return; - - if (mPlaceInfo->getVisible()) + LLPanelPlaceInfo* panel = getCurrentInfoPanel(); + if (panel && panel->getVisible()) { if (mPlaceInfoType == LANDMARK_INFO_TYPE) { @@ -450,10 +452,8 @@ void LLPanelPlaces::onTeleportButtonClicked() void LLPanelPlaces::onShowOnMapButtonClicked() { - if (!mPlaceInfo) - return; - - if (mPlaceInfo->getVisible()) + LLPanelPlaceInfo* panel = getCurrentInfoPanel(); + if (panel && panel->getVisible()) { LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); if(!worldmap_instance) @@ -496,31 +496,31 @@ void LLPanelPlaces::onShowOnMapButtonClicked() void LLPanelPlaces::onEditButtonClicked() { - if (!mPlaceInfo || isLandmarkEditModeOn) + if (!mLandmarkInfo || isLandmarkEditModeOn) return; isLandmarkEditModeOn = true; - mPlaceInfo->toggleLandmarkEditMode(TRUE); + mLandmarkInfo->toggleLandmarkEditMode(TRUE); updateVerbs(); } void LLPanelPlaces::onSaveButtonClicked() { - if (!mPlaceInfo || mItem.isNull()) + if (!mLandmarkInfo || mItem.isNull()) return; - std::string current_title_value = mPlaceInfo->getLandmarkTitle(); + std::string current_title_value = mLandmarkInfo->getLandmarkTitle(); std::string item_title_value = mItem->getName(); - std::string current_notes_value = mPlaceInfo->getLandmarkNotes(); + std::string current_notes_value = mLandmarkInfo->getLandmarkNotes(); std::string item_notes_value = mItem->getDescription(); LLStringUtil::trim(current_title_value); LLStringUtil::trim(current_notes_value); LLUUID item_id = mItem->getUUID(); - LLUUID folder_id = mPlaceInfo->getLandmarkFolder(); + LLUUID folder_id = mLandmarkInfo->getLandmarkFolder(); LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(mItem); @@ -553,7 +553,7 @@ void LLPanelPlaces::onSaveButtonClicked() void LLPanelPlaces::onCancelButtonClicked() { - if (!mPlaceInfo) + if (!mLandmarkInfo) return; if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) @@ -562,13 +562,13 @@ void LLPanelPlaces::onCancelButtonClicked() } else { - mPlaceInfo->toggleLandmarkEditMode(FALSE); + mLandmarkInfo->toggleLandmarkEditMode(FALSE); isLandmarkEditModeOn = false; updateVerbs(); // Reload the landmark properties. - mPlaceInfo->displayItemInfo(mItem); + mLandmarkInfo->displayItemInfo(mItem); } } @@ -597,7 +597,7 @@ void LLPanelPlaces::onOverflowButtonClicked() if (mItem.notNull()) { const LLUUID& item_id = mItem->getUUID(); - const LLUUID& trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); is_landmark_removable = gInventory.isObjectDescendentOf(item_id, gInventory.getRootFolderID()) && !gInventory.isObjectDescendentOf(item_id, trash_id); } @@ -652,9 +652,6 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param) } else if (item == "pick") { - if (!mPlaceInfo) - return; - if (mPickPanel == NULL) { mPickPanel = LLPanelPickEdit::create(); @@ -667,7 +664,12 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param) togglePickPanel(TRUE); mPickPanel->onOpen(LLSD()); - mPlaceInfo->createPick(mPosGlobal, mPickPanel); + + LLPanelPlaceInfo* panel = getCurrentInfoPanel(); + if (panel) + { + panel->createPick(mPosGlobal, mPickPanel); + } LLRect rect = getRect(); mPickPanel->reshape(rect.getWidth(), rect.getHeight()); @@ -677,7 +679,7 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param) { if ( mItem.notNull() ) { - LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + const LLUUID& favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); if ( favorites_id.notNull() ) { copy_inventory_item(gAgent.getID(), @@ -694,39 +696,16 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param) void LLPanelPlaces::onBackButtonClicked() { - if (!mPlaceInfo) - return; - - if (mPlaceInfo->isMediaPanelVisible()) - { - toggleMediaPanel(); - } - else - { - togglePlaceInfoPanel(FALSE); + togglePlaceInfoPanel(FALSE); - // Resetting mPlaceInfoType when Place Info panel is closed. - mPlaceInfoType = LLStringUtil::null; + // Resetting mPlaceInfoType when Place Info panel is closed. + mPlaceInfoType = LLStringUtil::null; - isLandmarkEditModeOn = false; - } + isLandmarkEditModeOn = false; updateVerbs(); } -void LLPanelPlaces::toggleMediaPanel() -{ - if (!mPlaceInfo) - return; - - mPlaceInfo->toggleMediaPanel(!mPlaceInfo->isMediaPanelVisible()); - - // Refresh the current place info because - // the media panel controls can't refer to - // the remote parcel media. - onOpen(LLSD().insert("type", AGENT_INFO_TYPE)); -} - void LLPanelPlaces::togglePickPanel(BOOL visible) { setAllChildrenVisible(this, !visible); @@ -737,26 +716,50 @@ void LLPanelPlaces::togglePickPanel(BOOL visible) void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible) { - if (!mPlaceInfo) + if (!mPlaceProfile || !mLandmarkInfo) return; - mPlaceInfo->setVisible(visible); mFilterEditor->setVisible(!visible); mTabContainer->setVisible(!visible); - if (visible) + if (mPlaceInfoType == AGENT_INFO_TYPE || + mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || + mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) { - mPlaceInfo->resetLocation(); + mPlaceProfile->setVisible(visible); - LLRect rect = getRect(); - LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); - mPlaceInfo->reshape(new_rect.getWidth(),new_rect.getHeight()); + if (visible) + { + mPlaceProfile->resetLocation(); + + LLRect rect = getRect(); + LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); + mPlaceProfile->reshape(new_rect.getWidth(), new_rect.getHeight()); + + mLandmarkInfo->setVisible(FALSE); + } + } + else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || + mPlaceInfoType == LANDMARK_INFO_TYPE) + { + mLandmarkInfo->setVisible(visible); + + if (visible) + { + mLandmarkInfo->resetLocation(); + + LLRect rect = getRect(); + LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); + mLandmarkInfo->reshape(new_rect.getWidth(), new_rect.getHeight()); + + mPlaceProfile->setVisible(FALSE); + } } } void LLPanelPlaces::changedParcelSelection() { - if (!mPlaceInfo) + if (!mPlaceProfile) return; LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); @@ -782,8 +785,8 @@ void LLPanelPlaces::changedParcelSelection() } } - mPlaceInfo->resetLocation(); - mPlaceInfo->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel); + mPlaceProfile->resetLocation(); + mPlaceProfile->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel); updateVerbs(); } @@ -830,30 +833,22 @@ void LLPanelPlaces::changedInventory(U32 mask) gInventory.removeObserver(mInventoryObserver); } -void LLPanelPlaces::onAgentParcelChange() +void LLPanelPlaces::updateVerbs() { - if (!mPlaceInfo) - return; + bool is_place_info_visible; - if (mPlaceInfo->isMediaPanelVisible()) + LLPanelPlaceInfo* panel = getCurrentInfoPanel(); + if (panel) { - onOpen(LLSD().insert("type", AGENT_INFO_TYPE)); + is_place_info_visible = panel->getVisible(); } else { - updateVerbs(); + is_place_info_visible = false; } -} -void LLPanelPlaces::updateVerbs() -{ - if (!mPlaceInfo) - return; - - bool is_place_info_visible = mPlaceInfo->getVisible(); bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE; bool is_create_landmark_visible = mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE; - bool is_media_panel_visible = mPlaceInfo->isMediaPanelVisible(); mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); @@ -864,7 +859,7 @@ void LLPanelPlaces::updateVerbs() mCancelBtn->setVisible(isLandmarkEditModeOn); mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn); - mOverflowBtn->setEnabled(is_place_info_visible && !is_media_panel_visible && !is_create_landmark_visible); + mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible); if (is_place_info_visible) { @@ -872,16 +867,13 @@ void LLPanelPlaces::updateVerbs() { // We don't need to teleport to the current location // so check if the location is not within the current parcel. - mTeleportBtn->setEnabled(!is_media_panel_visible && - !mPosGlobal.isExactlyZero() && + mTeleportBtn->setEnabled(!mPosGlobal.isExactlyZero() && !LLViewerParcelMgr::getInstance()->inAgentParcel(mPosGlobal)); } else if (mPlaceInfoType == LANDMARK_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) { mTeleportBtn->setEnabled(TRUE); } - - mShowOnMapBtn->setEnabled(!is_media_panel_visible); } else { @@ -890,6 +882,23 @@ void LLPanelPlaces::updateVerbs() } } +LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel() +{ + if (mPlaceInfoType == AGENT_INFO_TYPE || + mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || + mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) + { + return mPlaceProfile; + } + else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || + mPlaceInfoType == LANDMARK_INFO_TYPE) + { + return mLandmarkInfo; + } + + return NULL; +} + static bool is_agent_in_selected_parcel(LLParcel* parcel) { LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index e2d281dd840..39eb5261db4 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -37,6 +37,10 @@ class LLInventoryItem; class LLFilterEditor; class LLLandmark; + +class LLPanelLandmarkInfo; +class LLPanelPlaceProfile; + class LLPanelPickEdit; class LLPanelPlaceInfo; class LLPanelPlacesTab; @@ -85,13 +89,16 @@ class LLPanelPlaces : public LLPanel void togglePickPanel(BOOL visible); void togglePlaceInfoPanel(BOOL visible); - void onAgentParcelChange(); void updateVerbs(); + LLPanelPlaceInfo* getCurrentInfoPanel(); + LLFilterEditor* mFilterEditor; LLPanelPlacesTab* mActivePanel; LLTabContainer* mTabContainer; - LLPanelPlaceInfo* mPlaceInfo; + LLPanelPlaceProfile* mPlaceProfile; + LLPanelLandmarkInfo* mLandmarkInfo; + LLPanelPickEdit* mPickPanel; LLToggleableMenu* mPlaceMenu; LLToggleableMenu* mLandmarkMenu; diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h index b59d1d42f31..45c2fc116e7 100644 --- a/indra/newview/llpanelprofileview.h +++ b/indra/newview/llpanelprofileview.h @@ -36,6 +36,8 @@ #include "llpanel.h" #include "llpanelprofile.h" #include "llavatarpropertiesprocessor.h" +#include "llagent.h" +#include "lltooldraganddrop.h" class LLPanelProfile; class LLPanelProfileTab; @@ -64,6 +66,18 @@ class LLPanelProfileView : public LLPanelProfile /*virtual*/ void togglePanel(LLPanel* panel); + BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, + BOOL drop, EDragAndDropType cargo_type, + void *cargo_data, EAcceptance *accept, + std::string& tooltip_msg) + { + LLToolDragAndDrop::handleGiveDragAndDrop(getAvatarId(), gAgent.getSessionID(), drop, + cargo_type, cargo_data, accept); + + return TRUE; + } + + protected: void onBackBtnClick(); diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index e97eb1df2b6..9450bee3153 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -32,6 +32,11 @@ #include "llviewerprecompiledheaders.h" +// common includes +#include "lltrans.h" +#include "llavataractions.h" +#include "llagent.h" + #include "llparticipantlist.h" #include "llavatarlist.h" #include "llspeakers.h" @@ -39,15 +44,18 @@ //LLParticipantList retrieves add, clear and remove events and updates view accordingly LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list): mSpeakerMgr(data_source), - mAvatarList(avatar_list) + mAvatarList(avatar_list), + mSpeakerAddListener(*this), + mSpeakerRemoveListener(*this), + mSpeakerClearListener(*this), + mSortOrder(E_SORT_BY_NAME) { - mSpeakerAddListener = new SpeakerAddListener(mAvatarList); - mSpeakerRemoveListener = new SpeakerRemoveListener(mAvatarList); - mSpeakerClearListener = new SpeakerClearListener(mAvatarList); + mSpeakerMgr->addListener(&mSpeakerAddListener, "add"); + mSpeakerMgr->addListener(&mSpeakerRemoveListener, "remove"); + mSpeakerMgr->addListener(&mSpeakerClearListener, "clear"); - mSpeakerMgr->addListener(mSpeakerAddListener, "add"); - mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove"); - mSpeakerMgr->addListener(mSpeakerClearListener, "clear"); + mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); + mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); //Lets fill avatarList with existing speakers LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); @@ -58,24 +66,33 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av { group_members.push_back((*it)->mID); } - mAvatarList->setDirty(); - mAvatarList->sortByName(); + sort(); } LLParticipantList::~LLParticipantList() { - delete mSpeakerAddListener; - delete mSpeakerRemoveListener; - delete mSpeakerClearListener; - mSpeakerAddListener = NULL; - mSpeakerRemoveListener = NULL; - mSpeakerClearListener = NULL; } -// -// LLParticipantList::SpeakerAddListener -// -bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list) +{ + LLUUID clicked_id = list->getSelectedUUID(); + + if (clicked_id.isNull() || clicked_id == gAgent.getID()) + return; + + LLAvatarActions::startIM(clicked_id); +} + +void LLParticipantList::setSortOrder(EParticipantSortOrder order) +{ + if ( mSortOrder != order ) + { + mSortOrder = order; + sort(); + } +} + +bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); LLUUID uu_id = event->getValue().asUUID(); @@ -88,15 +105,11 @@ bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::L } group_members.push_back(uu_id); - mAvatarList->setDirty(); - mAvatarList->sortByName(); + sort(); return true; } -// -// LLParticipantList::SpeakerRemoveListener -// -bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); LLAvatarList::uuid_vector_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID()); @@ -108,10 +121,7 @@ bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents return true; } -// -// LLParticipantList::SpeakerClearListener -// -bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); group_members.clear(); @@ -119,3 +129,45 @@ bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents: return true; } +void LLParticipantList::sort() +{ + if ( !mAvatarList ) + return; + + // Mark AvatarList as dirty one + mAvatarList->setDirty(); + + // TODO: Implement more sorting orders after specs updating (EM) + switch ( mSortOrder ) { + case E_SORT_BY_NAME : + mAvatarList->sortByName(); + break; + default : + llwarns << "Unrecognized sort order for " << mAvatarList->getName() << llendl; + return; + } +} + +// +// LLParticipantList::SpeakerAddListener +// +bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ + return mParent.onAddItemEvent(event, userdata); +} + +// +// LLParticipantList::SpeakerRemoveListener +// +bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ + return mParent.onRemoveItemEvent(event, userdata); +} + +// +// LLParticipantList::SpeakerClearListener +// +bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ + return mParent.onClearListEvent(event, userdata); +} diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 68aae0aee54..04d9e292568 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -38,46 +38,74 @@ class LLAvatarList; class LLParticipantList { + LOG_CLASS(LLParticipantList); public: LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list); ~LLParticipantList(); + typedef enum e_participant_sort_oder { + E_SORT_BY_NAME = 0, + } EParticipantSortOrder; + + /** + * Set and sort Avatarlist by given order + */ + void setSortOrder(EParticipantSortOrder order = E_SORT_BY_NAME); + protected: + /** + * LLSpeakerMgr event handlers + */ + bool onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + bool onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + bool onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + + /** + * Sorts the Avatarlist by stored order + */ + void sort(); //List of listeners implementing LLOldEvents::LLSimpleListener. //There is no way to handle all the events in one listener as LLSpeakerMgr registers listeners in such a way //that one listener can handle only one type of event - class SpeakerAddListener : public LLOldEvents::LLSimpleListener + class BaseSpeakerListner : public LLOldEvents::LLSimpleListener { public: - SpeakerAddListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {} + BaseSpeakerListner(LLParticipantList& parent) : mParent(parent) {} + protected: + LLParticipantList& mParent; + }; + class SpeakerAddListener : public BaseSpeakerListner + { + public: + SpeakerAddListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - LLAvatarList* mAvatarList; }; - class SpeakerRemoveListener : public LLOldEvents::LLSimpleListener + class SpeakerRemoveListener : public BaseSpeakerListner { public: - SpeakerRemoveListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {} - + SpeakerRemoveListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - LLAvatarList* mAvatarList; }; - class SpeakerClearListener : public LLOldEvents::LLSimpleListener + class SpeakerClearListener : public BaseSpeakerListner { public: - SpeakerClearListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {} - + SpeakerClearListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - LLAvatarList* mAvatarList; }; + private: + void onAvatarListDoubleClicked(LLAvatarList* list); + LLSpeakerMgr* mSpeakerMgr; - LLAvatarList* mAvatarList; + LLAvatarList* mAvatarList; + + SpeakerAddListener mSpeakerAddListener; + SpeakerRemoveListener mSpeakerRemoveListener; + SpeakerClearListener mSpeakerClearListener; - SpeakerAddListener* mSpeakerAddListener; - SpeakerRemoveListener* mSpeakerRemoveListener; - SpeakerClearListener* mSpeakerClearListener; + EParticipantSortOrder mSortOrder; }; diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index b06e70c00af..34e78b5c469 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -45,6 +45,7 @@ #include "lltooldraganddrop.h" #include "llradiogroup.h" #include "llassetstorage.h" +#include "llviewerassettype.h" #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "lldbstrings.h" @@ -317,7 +318,7 @@ BOOL LLPreview::handleHover(S32 x, S32 y, MASK mask) && LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y)) { EDragAndDropType type; - type = LLAssetType::lookupDragAndDropType(item->getType()); + type = LLViewerAssetType::lookupDragAndDropType(item->getType()); LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_LIBRARY; if(!mObjectUUID.isNull()) { @@ -406,7 +407,7 @@ void LLPreview::onDiscardBtn(void* data) */ // Move the item to the trash - LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if (item->getParentUUID() != trash_id) { LLInventoryModel::update_list_t update; diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index ab2afb80560..7b3a20d1020 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -130,10 +130,10 @@ LLPreviewGesture* LLPreviewGesture::show(const LLUUID& item_id, const LLUUID& ob preview->setObjectID(object_id); // Start speculative download of sounds and animations - LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_ANIMATION); + const LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ANIMATION); gInventory.startBackgroundFetch(animation_folder_id); - LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_SOUND); + const LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_SOUND); gInventory.startBackgroundFetch(sound_folder_id); // this will call refresh when we have everything. diff --git a/indra/newview/llresourcedata.h b/indra/newview/llresourcedata.h index 46b79150bbf..b4b90426895 100644 --- a/indra/newview/llresourcedata.h +++ b/indra/newview/llresourcedata.h @@ -39,11 +39,12 @@ struct LLResourceData { LLAssetInfo mAssetInfo; - LLAssetType::EType mPreferredLocation; + LLFolderType::EType mPreferredLocation; LLInventoryType::EType mInventoryType; U32 mNextOwnerPerm; S32 mExpectedUploadCost; void *mUserData; + static const S8 INVALID_LOCATION = -2; }; #endif diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index b8ceef08991..26e668adb5a 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -2827,7 +2827,7 @@ bool LLSelectMgr::confirmDelete(const LLSD& notification, const LLSD& response, case 0: { // TODO: Make sure you have delete permissions on all of them. - LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); // attempt to derez into the trash. LLDeRezInfo* info = new LLDeRezInfo(DRD_TRASH, trash_id); LLSelectMgr::getInstance()->sendListToRegions("DeRezObject", diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 9bdea57491a..b23e7feda23 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -334,7 +334,7 @@ void populate_favorites_bar() S32 count = lib_cats->count(); for(S32 i = 0; i < count; ++i) { - if(lib_cats->get(i)->getPreferredType() == LLAssetType::AT_LANDMARK) + if(lib_cats->get(i)->getPreferredType() == LLFolderType::FT_LANDMARK) { lib_landmarks = lib_cats->get(i)->getUUID(); break; @@ -351,7 +351,7 @@ void populate_favorites_bar() gInventory.getDirectDescendentsOf(lib_landmarks, lm_cats, lm_items); if (!lm_items) return; - LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); if (favorites_id.isNull()) { llerror("My Inventory is missing My Favorites", 0); @@ -1673,7 +1673,7 @@ bool idle_startup() gInventory.buildParentChildMap(); //all categories loaded. lets create "My Favorites" category - gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE,true); + gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true); // lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" and fill it with buddies LLFriendCardsManager::instance().syncFriendsFolder(); diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index efe88047420..de00ca8420b 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -426,7 +426,7 @@ BOOL LLFloaterTexturePicker::postBuild() mInventoryPanel->getRootFolder()->getFilter()->markDefault(); // Commented out to stop opening all folders with textures - // mInventoryPanel->openDefaultFolderForType(LLAssetType::AT_TEXTURE); + // mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_TEXTURE); // don't put keyboard focus on selected item, because the selection callback // will assume that this was user input @@ -1073,7 +1073,7 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask) { showPicker(FALSE); //grab textures first... - gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLAssetType::AT_TEXTURE)); + gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE)); //...then start full inventory fetch. gInventory.startBackgroundFetch(); handled = TRUE; diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index e78737fe0d5..f82573f46cd 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -220,7 +220,6 @@ bool LLToastGroupNotifyPanel::isAttachmentOpenable(LLAssetType::EType type) switch(type) { case LLAssetType::AT_LANDMARK: - case LLAssetType::AT_FAVORITE: case LLAssetType::AT_NOTECARD: case LLAssetType::AT_IMAGE_JPEG: case LLAssetType::AT_IMAGE_TGA: diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 9a63f07a7e5..959cb3f1822 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -92,7 +92,7 @@ class LLNoPreferredType : public LLInventoryCollectFunctor virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) { - if(cat && (cat->getPreferredType() == LLAssetType::AT_NONE)) + if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE)) { return true; } @@ -109,7 +109,7 @@ class LLNoPreferredTypeOrItem : public LLInventoryCollectFunctor LLInventoryItem* item) { if(item) return true; - if(cat && (cat->getPreferredType() == LLAssetType::AT_NONE)) + if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE)) { return true; } @@ -1317,8 +1317,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target, // Check if it's in the trash. bool is_in_trash = false; - LLUUID trash_id; - trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { is_in_trash = true; @@ -2088,7 +2087,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv( if(!item || !item->isComplete()) return ACCEPT_NO; // must not be in the trash - LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH)); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) ) { return ACCEPT_NO; @@ -2170,8 +2169,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand( } // Check if it's in the trash. - LLUUID trash_id; - trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { accept = ACCEPT_YES_SINGLE; @@ -2249,8 +2247,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject( } // Check if it's in the trash. - LLUUID trash_id; - trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { accept = ACCEPT_YES_SINGLE; @@ -2388,7 +2385,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem( if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY) { // it's in the agent inventory - LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) ) { return ACCEPT_NO; @@ -2443,7 +2440,7 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture( if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY) { // it's in the agent inventory - LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) ) { return ACCEPT_NO; @@ -2502,7 +2499,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory( if(mSource == SOURCE_AGENT) { - LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH)); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if( gInventory.isObjectDescendentOf( category->getUUID(), trash_id ) ) { return ACCEPT_NO; diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp new file mode 100644 index 00000000000..c974171c2c2 --- /dev/null +++ b/indra/newview/llviewerassettype.cpp @@ -0,0 +1,114 @@ +/** + * @file llassettype.cpp + * @brief Implementatino of LLViewerAssetType functionality. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llviewerassettype.h" +#include "lldictionary.h" +#include "llmemory.h" +#include "llsingleton.h" + +static const std::string empty_string; + +struct ViewerAssetEntry : public LLDictionaryEntry +{ + ViewerAssetEntry(EDragAndDropType dad_type // drag and drop type + ) + : + LLDictionaryEntry(empty_string), // no reverse lookup needed for now, so just leave this blank + mDadType(dad_type) + { + } + EDragAndDropType mDadType; +}; + +class LLViewerAssetDictionary : public LLSingleton<LLViewerAssetDictionary>, + public LLDictionary<LLViewerAssetType::EType, ViewerAssetEntry> +{ +public: + LLViewerAssetDictionary(); +}; + +LLViewerAssetDictionary::LLViewerAssetDictionary() +{ + // DRAG&DROP TYPE + // |--------------------| + addEntry(LLViewerAssetType::AT_TEXTURE, new ViewerAssetEntry(DAD_TEXTURE)); + addEntry(LLViewerAssetType::AT_SOUND, new ViewerAssetEntry(DAD_SOUND)); + addEntry(LLViewerAssetType::AT_CALLINGCARD, new ViewerAssetEntry(DAD_CALLINGCARD)); + addEntry(LLViewerAssetType::AT_LANDMARK, new ViewerAssetEntry(DAD_LANDMARK)); + addEntry(LLViewerAssetType::AT_SCRIPT, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_CLOTHING, new ViewerAssetEntry(DAD_CLOTHING)); + addEntry(LLViewerAssetType::AT_OBJECT, new ViewerAssetEntry(DAD_OBJECT)); + addEntry(LLViewerAssetType::AT_NOTECARD, new ViewerAssetEntry(DAD_NOTECARD)); + addEntry(LLViewerAssetType::AT_CATEGORY, new ViewerAssetEntry(DAD_CATEGORY)); + addEntry(LLViewerAssetType::AT_ROOT_CATEGORY, new ViewerAssetEntry(DAD_ROOT_CATEGORY)); + addEntry(LLViewerAssetType::AT_LSL_TEXT, new ViewerAssetEntry(DAD_SCRIPT)); + addEntry(LLViewerAssetType::AT_LSL_BYTECODE, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_TEXTURE_TGA, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_BODYPART, new ViewerAssetEntry(DAD_BODYPART)); + addEntry(LLViewerAssetType::AT_SOUND_WAV, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_IMAGE_TGA, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_IMAGE_JPEG, new ViewerAssetEntry(DAD_NONE)); + addEntry(LLViewerAssetType::AT_ANIMATION, new ViewerAssetEntry(DAD_ANIMATION)); + addEntry(LLViewerAssetType::AT_GESTURE, new ViewerAssetEntry(DAD_GESTURE)); + addEntry(LLViewerAssetType::AT_SIMSTATE, new ViewerAssetEntry(DAD_NONE)); + + addEntry(LLViewerAssetType::AT_LINK, new ViewerAssetEntry(DAD_LINK)); + addEntry(LLViewerAssetType::AT_LINK_FOLDER, new ViewerAssetEntry(DAD_LINK)); + + addEntry(LLViewerAssetType::AT_NONE, new ViewerAssetEntry(DAD_NONE)); +}; + +EDragAndDropType LLViewerAssetType::lookupDragAndDropType(EType asset_type) +{ + const LLViewerAssetDictionary *dict = LLViewerAssetDictionary::getInstance(); + const ViewerAssetEntry *entry = dict->lookup(asset_type); + if (entry) + return entry->mDadType; + else + return DAD_NONE; +} + +// Generate a good default description +void LLViewerAssetType::generateDescriptionFor(LLViewerAssetType::EType asset_type, + std::string& description) +{ + const S32 BUF_SIZE = 30; + char time_str[BUF_SIZE]; /* Flawfinder: ignore */ + time_t now; + time(&now); + memset(time_str, '\0', BUF_SIZE); + strftime(time_str, BUF_SIZE - 1, "%Y-%m-%d %H:%M:%S ", localtime(&now)); + description.assign(time_str); + description.append(LLAssetType::lookupHumanReadable(asset_type)); +} diff --git a/indra/newview/llviewerassettype.h b/indra/newview/llviewerassettype.h new file mode 100644 index 00000000000..01158885cec --- /dev/null +++ b/indra/newview/llviewerassettype.h @@ -0,0 +1,54 @@ +/** + * @file llviewerassettype.h + * @brief Declaration of LLViewerViewerAssetType. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLVIEWERASSETTYPE_H +#define LL_LLVIEWERASSETTYPE_H + +#include <string> +#include "llassettype.h" + +// This class is similar to llassettype, but contains methods +// only used by the viewer. +class LLViewerAssetType : public LLAssetType +{ +public: + // Generate a good default description. You may want to add a verb + // or agent name after this depending on your application. + static void generateDescriptionFor(LLViewerAssetType::EType asset_type, + std::string& description); + static EDragAndDropType lookupDragAndDropType(EType asset_type); +protected: + LLViewerAssetType() {} + ~LLViewerAssetType() {} +}; + +#endif // LL_LLVIEWERASSETTYPE_H diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp new file mode 100644 index 00000000000..384538364f0 --- /dev/null +++ b/indra/newview/llviewerfoldertype.cpp @@ -0,0 +1,263 @@ +/** + * @file llfoldertype.cpp + * @brief Implementation of LLViewerFolderType functionality. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llviewerfoldertype.h" +#include "lldictionary.h" +#include "llmemory.h" +#include "llvisualparam.h" + +static const std::string empty_string; + +struct ViewerFolderEntry : public LLDictionaryEntry +{ + // Constructor for non-ensembles + ViewerFolderEntry(const std::string &new_category_name, // default name when creating a new category of this type + const std::string &icon_name // name of the folder icon + ) + : + LLDictionaryEntry(empty_string), // no reverse lookup needed on non-ensembles, so just leave this blank + mIconName(icon_name), + mNewCategoryName(new_category_name) + { + mAllowedNames.clear(); + } + + // Constructor for ensembles + ViewerFolderEntry(const std::string &xui_name, // name of the xui menu item + const std::string &new_category_name, // default name when creating a new category of this type + const std::string &icon_name, // name of the folder icon + const std::string allowed_names // allowed item typenames for this folder type + ) + : + LLDictionaryEntry(xui_name), + mIconName(icon_name), + mNewCategoryName(new_category_name) + { + const std::string delims (","); + LLStringUtilBase<char>::getTokens(allowed_names, mAllowedNames, delims); + } + + bool getIsAllowedName(const std::string &name) const + { + if (mAllowedNames.empty()) + return false; + for (name_vec_t::const_iterator iter = mAllowedNames.begin(); + iter != mAllowedNames.end(); + iter++) + { + if (name == (*iter)) + return true; + } + return false; + } + const std::string mIconName; + const std::string mNewCategoryName; + typedef std::vector<std::string> name_vec_t; + name_vec_t mAllowedNames; +}; + +class LLViewerFolderDictionary : public LLSingleton<LLViewerFolderDictionary>, + public LLDictionary<LLFolderType::EType, ViewerFolderEntry> +{ +public: + LLViewerFolderDictionary(); +protected: + bool initEnsemblesFromFile(); // Reads in ensemble information from foldertypes.xml +}; + +LLViewerFolderDictionary::LLViewerFolderDictionary() +{ + initEnsemblesFromFile(); + + // NEW CATEGORY NAME FOLDER ICON NAME + // |-------------------------|---------------------------| + addEntry(LLFolderType::FT_TEXTURE, new ViewerFolderEntry("Textures", "inv_folder_texture.tga")); + addEntry(LLFolderType::FT_SOUND, new ViewerFolderEntry("Sounds", "inv_folder_sound.tga")); + addEntry(LLFolderType::FT_CALLINGCARD, new ViewerFolderEntry("Calling Cards", "inv_folder_callingcard.tga")); + addEntry(LLFolderType::FT_LANDMARK, new ViewerFolderEntry("Landmarks", "inv_folder_landmark.tga")); + addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "inv_folder_clothing.tga")); + addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "inv_folder_object.tga")); + addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "inv_folder_notecard.tga")); + addEntry(LLFolderType::FT_CATEGORY, new ViewerFolderEntry("New Folder", "inv_folder_plain_closed.tga")); + addEntry(LLFolderType::FT_ROOT_CATEGORY, new ViewerFolderEntry("Inventory", "")); + addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "inv_folder_script.tga")); + addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "inv_folder_bodypart.tga")); + addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "inv_folder_trash.tga")); + addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new ViewerFolderEntry("Photo Album", "inv_folder_snapshot.tga")); + addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "inv_folder_lostandfound.tga")); + addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "inv_folder_animation.tga")); + addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "inv_folder_gesture.tga")); + addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorite", "inv_folder_plain_closed.tga")); + + addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "inv_folder_current_outfit.tga")); + addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "inv_folder_outfit.tga")); + addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "inv_folder_my_outfits.tga")); + addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "inv_folder_inbox.tga")); + + addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "inv_folder_plain_closed.tga")); +} + +bool LLViewerFolderDictionary::initEnsemblesFromFile() +{ + std::string xml_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"foldertypes.xml"); + LLXmlTree folder_def; + if (!folder_def.parseFile(xml_filename)) + { + llerrs << "Failed to parse folders file " << xml_filename << llendl; + return false; + } + + LLXmlTreeNode* rootp = folder_def.getRoot(); + for (LLXmlTreeNode* ensemble = rootp->getFirstChild(); + ensemble; + ensemble = rootp->getNextChild()) + { + if (!ensemble->hasName("ensemble")) + { + llwarns << "Invalid ensemble definition node " << ensemble->getName() << llendl; + continue; + } + + S32 ensemble_type; + static LLStdStringHandle ensemble_num_string = LLXmlTree::addAttributeString("foldertype_num"); + if (!ensemble->getFastAttributeS32(ensemble_num_string, ensemble_type)) + { + llwarns << "No ensemble type defined" << llendl; + continue; + } + + + if (ensemble_type < S32(LLFolderType::FT_ENSEMBLE_START) || ensemble_type > S32(LLFolderType::FT_ENSEMBLE_END)) + { + llwarns << "Exceeded maximum ensemble index" << LLFolderType::FT_ENSEMBLE_END << llendl; + break; + } + + std::string xui_name; + static LLStdStringHandle xui_name_string = LLXmlTree::addAttributeString("xui_name"); + if (!ensemble->getFastAttributeString(xui_name_string, xui_name)) + { + llwarns << "No xui name defined" << llendl; + continue; + } + + std::string icon_name; + static LLStdStringHandle icon_name_string = LLXmlTree::addAttributeString("icon_name"); + if (!ensemble->getFastAttributeString(icon_name_string, icon_name)) + { + llwarns << "No ensemble icon name defined" << llendl; + continue; + } + + std::string allowed_names; + static LLStdStringHandle allowed_names_string = LLXmlTree::addAttributeString("allowed"); + if (!ensemble->getFastAttributeString(allowed_names_string, allowed_names)) + { + } + + // Add the entry and increment the asset number. + const static std::string new_ensemble_name = "New Ensemble"; + addEntry(LLFolderType::EType(ensemble_type), new ViewerFolderEntry(xui_name, new_ensemble_name, icon_name, allowed_names)); + } + + return true; +} + + +const std::string &LLViewerFolderType::lookupXUIName(LLFolderType::EType folder_type) +{ + const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type); + if (entry) + { + return entry->mName; + } + return badLookup(); +} + +LLFolderType::EType LLViewerFolderType::lookupTypeFromXUIName(const std::string &name) +{ + return LLViewerFolderDictionary::getInstance()->lookup(name); +} + +const std::string &LLViewerFolderType::lookupIconName(LLFolderType::EType folder_type) +{ + const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type); + if (entry) + { + return entry->mIconName; + } + return badLookup(); +} + +const std::string &LLViewerFolderType::lookupNewCategoryName(LLFolderType::EType folder_type) +{ + const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type); + if (entry) + { + return entry->mNewCategoryName; + } + return badLookup(); +} + +LLFolderType::EType LLViewerFolderType::lookupTypeFromNewCategoryName(const std::string& name) +{ + for (LLViewerFolderDictionary::const_iterator iter = LLViewerFolderDictionary::getInstance()->begin(); + iter != LLViewerFolderDictionary::getInstance()->end(); + iter++) + { + const ViewerFolderEntry *entry = iter->second; + if (entry->mNewCategoryName == name) + { + return iter->first; + } + } + return FT_NONE; +} + + +U64 LLViewerFolderType::lookupValidFolderTypes(const std::string& item_name) +{ + U64 matching_folders = 0; + for (LLViewerFolderDictionary::const_iterator iter = LLViewerFolderDictionary::getInstance()->begin(); + iter != LLViewerFolderDictionary::getInstance()->end(); + iter++) + { + const ViewerFolderEntry *entry = iter->second; + if (entry->getIsAllowedName(item_name)) + { + matching_folders |= 1LL << iter->first; + } + } + return matching_folders; +} diff --git a/indra/newview/llviewerfoldertype.h b/indra/newview/llviewerfoldertype.h new file mode 100644 index 00000000000..a6aea62b2a3 --- /dev/null +++ b/indra/newview/llviewerfoldertype.h @@ -0,0 +1,57 @@ +/** + * @file llviewerfoldertype.h + * @brief Declaration of LLAssetType. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLVIEWERFOLDERTYPE_H +#define LL_LLVIEWERFOLDERTYPE_H + +#include <string> +#include "llfoldertype.h" + +// This class is similar to llfoldertype, but contains methods +// only used by the viewer. This also handles ensembles. +class LLViewerFolderType : public LLFolderType +{ +public: + static const std::string& lookupXUIName(EType folder_type); // name used by the UI + static LLFolderType::EType lookupTypeFromXUIName(const std::string& name); + + static const std::string& lookupIconName(EType asset_type); // folder icon name + static const std::string& lookupNewCategoryName(EType folder_type); // default name when creating new category + static LLFolderType::EType lookupTypeFromNewCategoryName(const std::string& name); // default name when creating new category + + static U64 lookupValidFolderTypes(const std::string& item_name); // which folders allow an item of this type? +protected: + LLViewerFolderType() {} + ~LLViewerFolderType() {} +}; + +#endif // LL_LLVIEWERFOLDERTYPE_H diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 470739baa90..1d62ead8437 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -37,7 +37,7 @@ #include "indra_constants.h" #include "llagent.h" -#include "llfoldertype.h" +#include "llviewerfoldertype.h" #include "llfolderview.h" #include "llviewercontrol.h" #include "llconsole.h" @@ -48,6 +48,7 @@ #include "llinventorybridge.h" #include "llfloaterinventory.h" +#include "llviewerassettype.h" #include "llviewerregion.h" #include "llviewerobjectlist.h" #include "llpreviewgesture.h" @@ -359,7 +360,7 @@ void LLViewerInventoryItem::updateParentOnServer(BOOL restamp) const LLViewerInventoryCategory::LLViewerInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid, - LLAssetType::EType pref, + LLFolderType::EType pref, const std::string& name, const LLUUID& owner_id) : LLInventoryCategory(uuid, parent_uuid, pref, name), @@ -416,7 +417,7 @@ void LLViewerInventoryCategory::updateServer(BOOL is_new) const { // communicate that change with the server. - if (LLAssetType::lookupIsProtectedCategoryType(mPreferredType)) + if (LLFolderType::lookupIsProtectedType(mPreferredType)) { LLNotifications::instance().add("CannotModifyProtectedCategories"); return; @@ -440,7 +441,7 @@ void LLViewerInventoryCategory::removeFromServer( void ) llinfos << "Removing inventory category " << mUUID << " from server." << llendl; // communicate that change with the server. - if(LLAssetType::lookupIsProtectedCategoryType(mPreferredType)) + if(LLFolderType::lookupIsProtectedType(mPreferredType)) { LLNotifications::instance().add("CannotRemoveProtectedCategories"); return; @@ -543,7 +544,7 @@ bool LLViewerInventoryCategory::importFileLocal(LLFILE* fp) } else if(0 == strcmp("pref_type", keyword)) { - mPreferredType = LLAssetType::lookup(valuestr); + mPreferredType = LLFolderType::lookup(valuestr); } else if(0 == strcmp("name", keyword)) { @@ -581,7 +582,7 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const mParentUUID.toString(uuid_str); fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str()); fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); - fprintf(fp, "\t\tpref_type\t%s\n", LLAssetType::lookup(mPreferredType)); + fprintf(fp, "\t\tpref_type\t%s\n", LLFolderType::lookup(mPreferredType).c_str()); fprintf(fp, "\t\tname\t%s|\n", mName.c_str()); mOwnerID.toString(uuid_str); fprintf(fp, "\t\towner_id\t%s\n", uuid_str.c_str()); @@ -592,8 +593,8 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const void LLViewerInventoryCategory::determineFolderType() { - LLAssetType::EType original_type = getPreferredType(); - if (LLAssetType::lookupIsProtectedCategoryType(original_type)) + LLFolderType::EType original_type = getPreferredType(); + if (LLFolderType::lookupIsProtectedType(original_type)) return; U64 folder_valid = 0; @@ -616,28 +617,28 @@ void LLViewerInventoryCategory::determineFolderType() { const EWearableType wearable_type = item->getWearableType(); const std::string& wearable_name = LLWearableDictionary::getTypeName(wearable_type); - U64 valid_folder_types = LLFolderType::lookupValidFolderTypes(wearable_name); + U64 valid_folder_types = LLViewerFolderType::lookupValidFolderTypes(wearable_name); folder_valid |= valid_folder_types; folder_invalid |= ~valid_folder_types; } } - for (U8 i = LLAssetType::AT_FOLDER_ENSEMBLE_START; i <= LLAssetType::AT_FOLDER_ENSEMBLE_END; i++) + for (U8 i = LLFolderType::FT_ENSEMBLE_START; i <= LLFolderType::FT_ENSEMBLE_END; i++) { if ((folder_valid & (1LL << i)) && !(folder_invalid & (1LL << i))) { - changeType((LLAssetType::EType)i); + changeType((LLFolderType::EType)i); return; } } } - if (LLAssetType::lookupIsEnsembleCategoryType(original_type)) + if (LLFolderType::lookupIsEnsembleType(original_type)) { - changeType(LLAssetType::AT_NONE); + changeType(LLFolderType::FT_NONE); } } -void LLViewerInventoryCategory::changeType(LLAssetType::EType new_folder_type) +void LLViewerInventoryCategory::changeType(LLFolderType::EType new_folder_type) { const LLUUID &folder_id = getUUID(); const LLUUID &parent_id = getParentUUID(); @@ -948,7 +949,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecar body["notecard-id"] = notecard_inv_id; body["object-id"] = object_id; body["item-id"] = src->getUUID(); - body["folder-id"] = gInventory.findCategoryUUIDForType(src->getType()); + body["folder-id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType())); body["callback-id"] = (LLSD::Integer)callback_id; request["message"] = "CopyInventoryFromNotecard"; @@ -964,7 +965,7 @@ void create_new_item(const std::string& name, U32 next_owner_perm) { std::string desc; - LLAssetType::generateDescriptionFor(asset_type, desc); + LLViewerAssetType::generateDescriptionFor(asset_type, desc); next_owner_perm = (next_owner_perm) ? next_owner_perm : PERM_MOVE | PERM_TRANSFER; @@ -989,19 +990,14 @@ const std::string NEW_LSL_NAME = "New Script"; // *TODO:Translate? (probably not const std::string NEW_NOTECARD_NAME = "New Note"; // *TODO:Translate? (probably not) const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probably not) +// ! REFACTOR ! Really need to refactor this so that it's not a bunch of if-then statements... void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid) { - std::string type = userdata.asString(); + std::string type_name = userdata.asString(); - if (("category" == type) || ("current" == type) || ("outfit" == type) || ("my_otfts" == type) ) + if (("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name)) { - LLAssetType::EType a_type = LLAssetType::AT_NONE; - if ("current" == type) - a_type = LLAssetType::AT_CURRENT_OUTFIT; - if ("outfit" == type) - a_type = LLAssetType::AT_OUTFIT; - if ("my_otfts" == type) - a_type = LLAssetType::AT_MY_OUTFITS; + LLFolderType::EType preferred_type = LLFolderType::lookup(type_name); LLUUID parent_id; if (bridge) @@ -1017,100 +1013,100 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co parent_id = gInventory.getRootFolderID(); } - LLUUID category = gInventory.createNewCategory(parent_id, a_type, LLStringUtil::null); + LLUUID category = gInventory.createNewCategory(parent_id, preferred_type, LLStringUtil::null); gInventory.notifyObservers(); folder->setSelectionByID(category, TRUE); } - else if ("lsl" == type) + else if ("lsl" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_LSL_TEXT); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_LSL_TEXT); create_new_item(NEW_LSL_NAME, parent_id, LLAssetType::AT_LSL_TEXT, LLInventoryType::IT_LSL, PERM_MOVE | PERM_TRANSFER); } - else if ("notecard" == type) + else if ("notecard" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_NOTECARD); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_NOTECARD); create_new_item(NEW_NOTECARD_NAME, parent_id, LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, PERM_ALL); } - else if ("gesture" == type) + else if ("gesture" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_GESTURE); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE); create_new_item(NEW_GESTURE_NAME, parent_id, LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, PERM_ALL); } - else if ("shirt" == type) + else if ("shirt" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_SHIRT); } - else if ("pants" == type) + else if ("pants" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_PANTS); } - else if ("shoes" == type) + else if ("shoes" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_SHOES); } - else if ("socks" == type) + else if ("socks" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_SOCKS); } - else if ("jacket" == type) + else if ("jacket" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_JACKET); } - else if ("skirt" == type) + else if ("skirt" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_SKIRT); } - else if ("gloves" == type) + else if ("gloves" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_GLOVES); } - else if ("undershirt" == type) + else if ("undershirt" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_UNDERSHIRT); } - else if ("underpants" == type) + else if ("underpants" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); LLFolderBridge::createWearable(parent_id, WT_UNDERPANTS); } - else if ("shape" == type) + else if ("shape" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART); LLFolderBridge::createWearable(parent_id, WT_SHAPE); } - else if ("skin" == type) + else if ("skin" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART); LLFolderBridge::createWearable(parent_id, WT_SKIN); } - else if ("hair" == type) + else if ("hair" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART); LLFolderBridge::createWearable(parent_id, WT_HAIR); } - else if ("eyes" == type) + else if ("eyes" == type_name) { - LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); + const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART); LLFolderBridge::createWearable(parent_id, WT_EYES); } diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index d523bf28594..529425aa258 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -185,7 +185,7 @@ class LLViewerInventoryCategory : public LLInventoryCategory public: LLViewerInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid, - LLAssetType::EType preferred_type, + LLFolderType::EType preferred_type, const std::string& name, const LLUUID& owner_id); LLViewerInventoryCategory(const LLUUID& owner_id); @@ -221,7 +221,7 @@ class LLViewerInventoryCategory : public LLInventoryCategory bool exportFileLocal(LLFILE* fp) const; bool importFileLocal(LLFILE* fp); void determineFolderType(); - void changeType(LLAssetType::EType new_folder_type); + void changeType(LLFolderType::EType new_folder_type); protected: LLUUID mOwnerID; S32 mVersion; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 23ceb1e72d9..9a98264847d 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -4176,12 +4176,10 @@ void handle_take_copy() { if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return; - LLUUID category_id = - gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); + const LLUUID category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); derez_objects(DRD_ACQUIRE_TO_AGENT_INVENTORY, category_id); } - // You can return an object to its owner if it is on your land. class LLObjectReturn : public view_listener_t { @@ -4262,7 +4260,7 @@ class LLObjectEnableReturn : public view_listener_t void force_take_copy(void*) { if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return; - const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); + const LLUUID category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); derez_objects(DRD_FORCE_TO_GOD_INVENTORY, category_id); } @@ -4323,8 +4321,7 @@ void handle_take() if(category_id.notNull()) { // check trash - LLUUID trash; - trash = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if(category_id == trash || gInventory.isObjectDescendentOf(category_id, trash)) { category_id.setNull(); @@ -4340,7 +4337,7 @@ void handle_take() } if(category_id.isNull()) { - category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); + category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); } LLSD payload; payload["folder_id"] = category_id; @@ -6919,7 +6916,7 @@ void handle_grab_texture(void* data) LL_INFOS("texture") << "Adding baked texture " << asset_id << " to inventory." << llendl; LLAssetType::EType asset_type = LLAssetType::AT_TEXTURE; LLInventoryType::EType inv_type = LLInventoryType::IT_TEXTURE; - LLUUID folder_id(gInventory.findCategoryUUIDForType(asset_type)); + const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(asset_type)); if(folder_id.notNull()) { std::string name = "Unknown"; diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index d3a9e1cef8a..d17c7e486fe 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -319,7 +319,7 @@ class LLFileUploadBulk : public view_listener_t LLAssetStorage::LLStoreAssetCallback callback = NULL; S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); void *userdata = NULL; - upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, + upload_new_resource(filename, asset_name, asset_name, 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), display_name, callback, expected_upload_cost, userdata); @@ -493,7 +493,7 @@ void handle_compress_image(void*) void upload_new_resource(const std::string& src_filename, std::string name, std::string desc, S32 compression_info, - LLAssetType::EType destination_folder_type, + LLFolderType::EType destination_folder_type, LLInventoryType::EType inv_type, U32 next_owner_perms, U32 group_perms, @@ -810,7 +810,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt if(result >= 0) { - LLAssetType::EType dest_loc = (data->mPreferredLocation == LLAssetType::AT_NONE) ? data->mAssetInfo.mType : data->mPreferredLocation; + LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation; if (LLAssetType::AT_SOUND == data->mAssetInfo.mType || LLAssetType::AT_TEXTURE == data->mAssetInfo.mType || @@ -856,7 +856,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt { // Actually add the upload to inventory llinfos << "Adding " << uuid << " to inventory." << llendl; - LLUUID folder_id(gInventory.findCategoryUUIDForType(dest_loc)); + const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc); if(folder_id.notNull()) { U32 next_owner_perms = data->mNextOwnerPerm; @@ -903,7 +903,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt LLAssetStorage::LLStoreAssetCallback callback = NULL; void *userdata = NULL; upload_new_resource(next_file, asset_name, asset_name, // file - 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, + 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, PERM_NONE, PERM_NONE, PERM_NONE, display_name, callback, @@ -915,7 +915,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type, std::string name, std::string desc, S32 compression_info, - LLAssetType::EType destination_folder_type, + LLFolderType::EType destination_folder_type, LLInventoryType::EType inv_type, U32 next_owner_perms, U32 group_perms, @@ -973,14 +973,14 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty llinfos << "Name: " << name << llendl; llinfos << "Desc: " << desc << llendl; llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl; - lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type) << llendl; + lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << llendl; lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl; std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory"); if (!url.empty()) { llinfos << "New Agent Inventory via capability" << llendl; LLSD body; - body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type); + body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type); body["asset_type"] = LLAssetType::lookup(asset_type); body["inventory_type"] = LLInventoryType::lookup(inv_type); body["name"] = name; diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index bf21292082b..da78537a295 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -33,7 +33,7 @@ #ifndef LLVIEWERMENUFILE_H #define LLVIEWERMENUFILE_H -#include "llassettype.h" +#include "llfoldertype.h" #include "llinventorytype.h" class LLTransactionID; @@ -45,7 +45,7 @@ void upload_new_resource(const std::string& src_filename, std::string name, std::string desc, S32 compression_info, - LLAssetType::EType destination_folder_type, + LLFolderType::EType destination_folder_type, LLInventoryType::EType inv_type, U32 next_owner_perms, U32 group_perms, @@ -60,7 +60,7 @@ void upload_new_resource(const LLTransactionID &tid, std::string name, std::string desc, S32 compression_info, - LLAssetType::EType destination_folder_type, + LLFolderType::EType destination_folder_type, LLInventoryType::EType inv_type, U32 next_owner_perms, U32 group_perms, diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index ff1c7b526f6..d8e6c52c8cc 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -140,7 +140,7 @@ #include "llgroupactions.h" #include "llagentui.h" #include "llpanelblockedlist.h" -#include "llpanelplaceinfo.h" +#include "llpanelplaceprofile.h" #include <boost/tokenizer.hpp> #include <boost/algorithm/string/split.hpp> @@ -209,7 +209,6 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] = bool friendship_offer_callback(const LLSD& notification, const LLSD& response) { S32 option = LLNotification::getSelectedOption(notification, response); - LLUUID fid; LLMessageSystem* msg = gMessageSystem; const LLSD& payload = notification["payload"]; @@ -219,10 +218,11 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response) switch(option) { case 0: + { // accept LLAvatarTracker::formFriendship(payload["from_id"]); - fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + const LLUUID fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); // This will also trigger an onlinenotification if the user is online msg->newMessageFast(_PREHASH_AcceptFriendship); @@ -235,7 +235,9 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response) msg->addUUIDFast(_PREHASH_FolderID, fid); msg->sendReliable(LLHost(payload["sender"].asString())); break; + } case 1: + { // decline // We no longer notify other viewers, but we DO still send // the rejection to the simulator to delete the pending userop. @@ -247,6 +249,7 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response) msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]); msg->sendReliable(LLHost(payload["sender"].asString())); break; + } default: // close button probably, possibly timed out break; @@ -767,8 +770,7 @@ class LLDiscardAgentOffer : public LLInventoryFetchComboObserver virtual void done() { LL_DEBUGS("Messaging") << "LLDiscardAgentOffer::done()" << LL_ENDL; - LLUUID trash_id; - trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); bool notify = false; if(trash_id.notNull() && mObjectID.notNull()) { @@ -875,7 +877,7 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name) { std::vector<LLUUID>::const_iterator it = items.begin(); std::vector<LLUUID>::const_iterator end = items.end(); - LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH)); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); LLInventoryItem* item; for(; it != end; ++it) { @@ -946,13 +948,12 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name) } //Trash Check - LLUUID trash_id; - trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id)) { return; } - LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND); //BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view); BOOL user_is_away = gAwayTimer.getStarted(); @@ -1716,7 +1717,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) info->mFromGroup = from_group; info->mTransactionID = session_id; info->mType = (LLAssetType::EType) asset_type; - info->mFolderID = gInventory.findCategoryUUIDForType(info->mType); + info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType)); std::string from_name; from_name += "A group member named "; @@ -1850,7 +1851,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) info->mFromID = from_id; info->mFromGroup = from_group; info->mTransactionID = session_id; - info->mFolderID = gInventory.findCategoryUUIDForType(info->mType); + info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType)); if (dialog == IM_TASK_INVENTORY_OFFERED) { @@ -2144,7 +2145,7 @@ bool callingcard_offer_callback(const LLSD& notification, const LLSD& response) msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); msg->nextBlockFast(_PREHASH_TransactionBlock); msg->addUUIDFast(_PREHASH_TransactionID, notification["payload"]["transaction_id"].asUUID()); - fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); + fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); msg->nextBlockFast(_PREHASH_FolderData); msg->addUUIDFast(_PREHASH_FolderID, fid); msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); @@ -2597,11 +2598,10 @@ BOOL LLPostTeleportNotifiers::tick() { // get callingcards and landmarks available to the user arriving. LLInventoryFetchDescendentsObserver::folder_ref_t folders; - LLUUID folder_id; - folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); - if(folder_id.notNull()) - folders.push_back(folder_id); - folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); + const LLUUID callingcard_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); + if(callingcard_id.notNull()) + folders.push_back(callingcard_id); + const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); if(folder_id.notNull()) folders.push_back(folder_id); if(!folders.empty()) @@ -4819,7 +4819,7 @@ void container_inventory_arrived(LLViewerObject* object, // create a new inventory category to put this in LLUUID cat_id; cat_id = gInventory.createNewCategory(gInventory.getRootFolderID(), - LLAssetType::AT_NONE, + LLFolderType::FT_NONE, LLTrans::getString("AcquiredItems")); InventoryObjectList::const_iterator it = inventory->begin(); @@ -4869,7 +4869,7 @@ void container_inventory_arrived(LLViewerObject* object, } LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it)); - LLUUID category = gInventory.findCategoryUUIDForType(item->getType()); + const LLUUID category = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType())); LLUUID item_id; item_id.generate(); @@ -5549,7 +5549,7 @@ void process_covenant_reply(LLMessageSystem* msg, void**) LLPanelLandCovenant::updateEstateOwnerName(owner_name); LLFloaterBuyLand::updateEstateOwnerName(owner_name); - LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info"); + LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile"); if (panel) { panel->updateEstateName(estate_name); @@ -5683,7 +5683,7 @@ void onCovenantLoadComplete(LLVFS *vfs, LLPanelLandCovenant::updateCovenantText(covenant_text); LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid); - LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info"); + LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile"); if (panel) { panel->updateCovenantText(covenant_text); diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 5c40f2a5402..90dff465c94 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -62,6 +62,7 @@ #include "lltooltip.h" #include "lltrans.h" #include "lluictrlfactory.h" +#include "llviewerassettype.h" #include "llviewercontrol.h" #include "llviewerinventory.h" #include "llviewertexturelist.h" @@ -505,19 +506,17 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const } break; - case LLAssetType::AT_SOUND: img_name = "Inv_Sound"; break; + case LLAssetType::AT_SOUND: img_name = "Inv_Sound"; break; case LLAssetType::AT_CLOTHING: img_name = "Inv_Clothing"; break; - case LLAssetType::AT_OBJECT: img_name = "Inv_Object"; break; + case LLAssetType::AT_OBJECT: img_name = "Inv_Object"; break; case LLAssetType::AT_CALLINGCARD: img_name = "Inv_CallingCard"; break; - case LLAssetType::AT_LANDMARK: img_name = "Inv_Landmark"; break; + case LLAssetType::AT_LANDMARK: img_name = "Inv_Landmark"; break; case LLAssetType::AT_NOTECARD: img_name = "Inv_Notecard"; break; case LLAssetType::AT_LSL_TEXT: img_name = "Inv_Script"; break; - case LLAssetType::AT_BODYPART: img_name = "Inv_Skin"; break; - case LLAssetType::AT_ANIMATION: img_name = "Inv_Animation";break; - case LLAssetType::AT_GESTURE: img_name = "Inv_Gesture"; break; - //TODO need img_name - case LLAssetType::AT_FAVORITE: img_name = "Inv_Landmark"; break; - default: llassert(0); + case LLAssetType::AT_BODYPART: img_name = "Inv_Skin"; break; + case LLAssetType::AT_ANIMATION: img_name = "Inv_Animation"; break; + case LLAssetType::AT_GESTURE: img_name = "Inv_Gesture"; break; + default: llassert(0); } return LLUI::getUIImage(img_name); @@ -732,11 +731,10 @@ BOOL LLViewerTextEditor::handleHover(S32 x, S32 y, MASK mask) if( LLToolDragAndDrop::getInstance()->isOverThreshold( screen_x, screen_y ) ) { LLToolDragAndDrop::getInstance()->beginDrag( - LLAssetType::lookupDragAndDropType( mDragItem->getType() ), + LLViewerAssetType::lookupDragAndDropType( mDragItem->getType() ), mDragItem->getUUID(), LLToolDragAndDrop::SOURCE_NOTECARD, mPreviewID, mObjectID); - return LLToolDragAndDrop::getInstance()->handleHover( x, y, mask ); } getWindow()->setCursor(UI_CURSOR_HAND); diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index a964f431719..e7a43924db7 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -41,53 +41,22 @@ #include "llvoavatarself.h" #include "llvoavatar.h" -#include <stdio.h> -#include <ctype.h> - -#include "llaudioengine.h" -#include "noise.h" +#include "pipeline.h" -// TODO: Seraph - Remove unnecessary headers. These are copied from llvoavatar.h. #include "llagent.h" // Get state values from here #include "llagentwearables.h" -#include "llviewercontrol.h" -#include "lldrawpoolavatar.h" -#include "lldriverparam.h" -#include "lleditingmotion.h" -#include "llemote.h" -#include "llface.h" -#include "llfirstuse.h" -#include "llheadrotmotion.h" #include "llhudeffecttrail.h" #include "llhudmanager.h" -#include "llkeyframefallmotion.h" -#include "llkeyframestandmotion.h" -#include "llkeyframewalkmotion.h" -#include "llmutelist.h" #include "llselectmgr.h" -#include "llsprite.h" -#include "lltargetingmotion.h" -#include "lltexlayer.h" -#include "lltexglobalcolor.h" #include "lltoolgrab.h" // for needsRenderBeam #include "lltoolmgr.h" // for needsRenderBeam #include "lltoolmorph.h" #include "lltrans.h" #include "llviewercamera.h" -#include "llviewertexturelist.h" #include "llviewermenu.h" #include "llviewerobjectlist.h" -#include "llviewerparcelmgr.h" #include "llviewerstats.h" -#include "llvovolume.h" -#include "llworld.h" -#include "pipeline.h" -#include "llviewershadermgr.h" -#include "llsky.h" -#include "llanimstatelabels.h" -#include "llgesturemgr.h" //needed to trigger the voice gesticulations -#include "llvoiceclient.h" -#include "llvoicevisualizer.h" // Ventrella +#include "llviewerregion.h" #include "llappearancemgr.h" #if LL_MSVC diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index f2cf84c2281..4288e4e6fd8 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -1123,7 +1123,7 @@ void LLWearable::saveNewAsset() const { llinfos << "Update Agent Inventory via capability" << llendl; LLSD body; - body["folder_id"] = gInventory.findCategoryUUIDForType(getAssetType()); + body["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetToFolderType(getAssetType())); body["asset_type"] = LLAssetType::lookup(getAssetType()); body["inventory_type"] = LLInventoryType::lookup(LLInventoryType::IT_WEARABLE); body["name"] = getName(); diff --git a/indra/newview/skins/default/textures/inv_folder_inbox.tga b/indra/newview/skins/default/textures/inv_folder_inbox.tga new file mode 100644 index 0000000000000000000000000000000000000000..04539c2cc4f002c9c1c4724215e5b7cf08cfb177 GIT binary patch literal 2085 zcmeHF!A`<J5M4AHk9>fKet>f010<nM6C<Rk@xY~Nuo|!!T2CB$X+NS#6Am0oNjUUJ z`U(7kM~>sZRfwUbA~8l2HhG<$H#7UTvr}RRY`My;%%l@WL_Y$4EbRj5voIthO}`E3 zE$dUh3Hc}d$|8pYdYO7&t0)TDwoScWF9Yz17u8#qMU%;dMxzmp$77n!X2QY;k9bkN zX__KGiXsYvfHX}L7Cz2H9RIlK{*L2N9LLmdx2amKlIMBC!UvCdk-jX;RIAm<_kBu| zgr?J}u<*enUZjtnx~@yZ;gGuBuIM2weDH{G(#IQagFOAB`N4eUfy=FCAMwRvvC@YI zAnHEm>~ntJK2KvgV|n?1fqO0S8}8RX=z#j9n;oU256+|u!+5d#_l~4mMkRCg`H__2 z)`@HFrhcoo)W+5MovdEgD{T8gXsjQ$_kXnmP5sewq}D_KS!xdYyGb9O9={i62jLCQ C7t+N5 literal 0 HcmV?d00001 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 26d2f4e497f..88aca005cfe 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -3,7 +3,7 @@ legacy_header_height="18" background_visible="true" follows="left|top|right|bottom" - height="270" + height="359" layout="topleft" left="0" name="panel_im" @@ -12,13 +12,13 @@ can_dock="true" can_minimize="true" visible="true" - width="365" + width="400" can_resize="true" min_width="200" min_height="150"> <layout_stack follows="left|top|right|bottom" - height="255" - width="365" + height="344" + width="400" layout="topleft" orientation="horizontal" name="im_panels" @@ -28,13 +28,13 @@ name="panel_im_control_panel" layout="topleft" top_delta="-3" - width="146" - height="255" + height="344" follows="left" label="IM Control Panel" + auto_resize="false" user_resize="false" /> - <layout_panel height="255" - width="200" + <layout_panel height="344" + width="235" left_delta="146" top="0" user_resize="false"> @@ -56,14 +56,14 @@ length="1" follows="left|top|right|bottom" font="SansSerif" - height="205" + height="290" layout="topleft" name="chat_history" parse_highlights="true" allow_html="true" - width="195"> + width="230"> </chat_history> - <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="190"> + <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="225"> </line_editor> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml index 6b13e2f1c7c..e2ae81e0b93 100644 --- a/indra/newview/skins/default/xui/en/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml @@ -128,6 +128,8 @@ left_delta="110" tab_stop="false" width="18" /> + <!-- Overlapping buttons for default actions + llinspectavatar.cpp makes visible the most likely default action --> <button follows="bottom|left" height="23" @@ -136,6 +138,16 @@ top="246" name="add_friend_btn" width="100" /> + <button + follows="bottom|left" + height="23" + label="IM" + left_delta="0" + top_delta="0" + name="im_btn" + width="100" + commit_callback.function="InspectAvatar.IM" + /> <menu_button follows="top|left" height="18" diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml index 6049476a43f..8ee67b9a020 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml @@ -7,7 +7,6 @@ name="Gear Menu"> <menu_item_call label="View Profile" - layout="topleft" enabled="true" name="view_profile"> <menu_item_call.on_click @@ -15,49 +14,42 @@ </menu_item_call> <menu_item_call label="Add Friend" - layout="topleft" name="add_friend"> <menu_item_call.on_click function="InspectAvatar.AddFriend"/> </menu_item_call> <menu_item_call label="IM" - layout="topleft" name="im"> <menu_item_call.on_click function="InspectAvatar.IM"/> </menu_item_call> <menu_item_call label="Call" - layout="topleft" enabled="true" name="call"> </menu_item_call> <menu_item_call label="Teleport" - layout="topleft" name="teleport"> <menu_item_call.on_click function="InspectAvatar.Teleport"/> </menu_item_call> <menu_item_call label="Invite to Group" - layout="topleft" name="invite_to_group"> <menu_item_call.on_click function="InspectAvatar.InviteToGroup"/> </menu_item_call> - <menu_item_separator layout="topleft" /> + <menu_item_separator /> <menu_item_call label="Block" - layout="topleft" name="block"> <menu_item_call.on_click function="InspectAvatar.Block"/> </menu_item_call> <menu_item_call label="Report" - layout="topleft" name="report"> <menu_item_call.on_click function="InspectAvatar.Report"/> @@ -88,7 +80,6 @@ </menu_item_call> <menu_item_call label="Find On Map" - layout="topleft" name="find_on_map"> <menu_item_call.on_click function="InspectAvatar.FindOnMap"/> @@ -97,16 +88,14 @@ </menu_item_call> <menu_item_call label="Zoom In" - layout="topleft" name="zoom_in"> <menu_item_call.on_click function="InspectAvatar.ZoomIn"/> </menu_item_call> <menu_item_call label="Pay" - layout="topleft" name="pay"> <menu_item_call.on_click function="InspectAvatar.Pay"/> </menu_item_call> -</menu> \ No newline at end of file +</menu> diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml index 19c2bf34969..ce5ee83f556 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml @@ -7,7 +7,6 @@ name="Gear Menu"> <menu_item_call label="Stand Up" - layout="topleft" enabled="true" name="stand_up"> <menu_item_call.on_click @@ -18,7 +17,6 @@ </menu_item_call> <menu_item_call label="My Appearance" - layout="topleft" name="my_appearance"> <menu_item_call.on_click function="ShowFloater" @@ -28,7 +26,6 @@ </menu_item_call> <menu_item_call label="My Profile" - layout="topleft" enabled="true" name="my_profile"> <menu_item_call.on_click @@ -37,7 +34,6 @@ </menu_item_call> <menu_item_call label="My Friends" - layout="topleft" name="my_friends"> <menu_item_call.on_click function="Self.Friends" @@ -45,9 +41,8 @@ </menu_item_call> <menu_item_call label="My Groups" - layout="topleft" name="my_groups"> <menu_item_call.on_click function="Self.Groups" /> </menu_item_call> -</menu> \ No newline at end of file +</menu> diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml index f50acc224f0..87c4e2787f4 100644 --- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="panel_im_control_panel" - width="146" + width="180" height="215" border="false"> <avatar_list @@ -16,10 +16,11 @@ show_info_btn="false" show_profile_btn="false" top="10" - width="140" /> + width="180" /> <button name="call_btn" label="Call" + left_delta="27" width="125" height="20" /> <button diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 61bd1d186e5..b5051523e59 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -60,7 +60,7 @@ min_width="96" name="speak_panel" user_resize="false"> - <chiclet_talk + <talk_button follows="right" height="23" speak_button.tab_stop="true" @@ -93,7 +93,7 @@ min_width="76" name="gesture_panel" user_resize="false"> - <button + <gesture_combo_box follows="right" height="23" label="Gesture" diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index 9ed510dff3e..3358015335d 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="panel_im_control_panel" - width="146" + width="180" height="238" border="false"> <avatar_list @@ -16,11 +16,11 @@ show_info_btn="false" show_profile_btn="false" top="10" - width="140" /> + width="180" /> <button name="group_info_btn" label="Group Info" - left_delta="3" + left_delta="27" width="125" height="20" /> <button diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index a85c55f9b2c..4f24c7a745b 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -1,14 +1,14 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel follows="all" - height="412" + height="380" label="General" class="panel_group_general" layout="topleft" left="0" top="0" name="general_tab" - width="313"> + width="303"> <panel.string name="help_text"> The General tab contains general information about this group, a list of members, general Group Preferences and member options. @@ -41,7 +41,7 @@ Hover your mouse over the options for more help. draw_heading="true" follows="left|top" heading_height="16" - height="160" + height="130" layout="topleft" left_delta="0" name="visible_members" diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index d8d47c40084..ab0f956da0b 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -5,7 +5,7 @@ background_visible="true" height="570" label="Group Info" layout="topleft" - min_height="350" + min_height="425" left="0" top="20" name="GroupInfo" @@ -47,7 +47,7 @@ background_visible="true" text_color="white" top="0" value="(Loading...)" - use_elipsis="true" + use_ellipses="true" width="300" /> <line_editor follows="left|top" @@ -60,7 +60,7 @@ background_visible="true" top_delta="5" width="250" height="20" - visible="true" /> + visible="false" /> <texture_picker follows="left|top" height="113" @@ -112,33 +112,46 @@ background_visible="true" left_delta="0" top_pad="6" height="23" - label="Join now!" - label_selected="Join now!" + label="JOIN NOW!" name="btn_join" visible="true" width="120" /> <accordion follows="all" - height="405" + height="425" layout="topleft" left="0" + multiple_expansion="false" name="groups_accordion" - top_pad="20" - width="333"> + top_pad="15" + width="336"> <accordion_tab can_resize="false" + expanded="true" layout="topleft" name="tab_general" title="General"> - <panel - border="false" - filename="panel_group_general.xml" + <scroll_container + color="DkGray2" + opaque="true" + height="323" + follows="all" layout="topleft" left="0" - help_topic="group_general_tab" - name="general_tab" top="0" - width="333" /> + name="general_scroll" + reserve_scroll_corner="false" + width="333"> + <panel + border="false" + filename="panel_group_general.xml" + layout="topleft" + left="0" + help_topic="group_general_tab" + name="general_tab" + top="0" + width="303" /> + </scroll_container> </accordion_tab> <accordion_tab can_resize="false" @@ -146,15 +159,27 @@ background_visible="true" layout="topleft" name="tab_roles" title="Roles"> - <panel - border="false" - filename="panel_group_roles.xml" - layout="topleft" - left="0" - help_topic="group_roles_tab" - name="roles_tab" - top="0" - width="333" /> + <scroll_container + color="DkGray2" + opaque="true" + height="323" + follows="all" + layout="topleft" + left="0" + top="0" + name="roles_scroll" + reserve_scroll_corner="false" + width="333"> + <panel + border="false" + filename="panel_group_roles.xml" + layout="topleft" + left="0" + help_topic="group_roles_tab" + name="roles_tab" + top="0" + width="303" /> + </scroll_container> </accordion_tab> <accordion_tab can_resize="false" @@ -162,21 +187,45 @@ background_visible="true" layout="topleft" name="tab_notices" title="Notices"> + <scroll_container + color="DkGray2" + opaque="true" + height="323" + follows="all" + layout="topleft" + left="0" + top="0" + name="notices_scroll" + reserve_scroll_corner="false" + width="333"> <panel + border="false" filename="panel_group_notices.xml" layout="topleft" left="0" help_topic="group_notices_tab" name="notices_tab" top="0" - width="333" /> + width="303" /> + </scroll_container> </accordion_tab> - <accordion_tab + <accordion_tab can_resize="false" expanded="false" layout="topleft" name="tab_notices" title="Land/Assets"> + <scroll_container + color="DkGray2" + opaque="true" + height="323" + follows="all" + layout="topleft" + left="0" + top="0" + name="land_scroll" + reserve_scroll_corner="false" + width="333"> <panel border="false" filename="panel_group_land_money.xml" @@ -185,41 +234,43 @@ background_visible="true" help_topic="group_land_money_tab" name="land_money_tab" top="0" - width="333" /> + width="313" /> + </scroll_container> </accordion_tab> </accordion> - <button + <button follows="top|left" - height="20" + height="22" image_overlay="Refresh_Off" layout="topleft" + left="5" name="btn_refresh" picture_style="true" - left="5" - width="20" /> - <button - height="20" - font="SansSerifSmall" - label="Save" - label_selected="Save" - name="btn_apply" - left_pad="5" - width="65" /> - <button + top_pad="-15" + width="23" /> + <button height="20" label="Create" - label_selected="Create" + label_selected="New group" name="btn_create" - left_pad="5" + left_pad="10" visible="false" - width="65" /> - <button - left_pad="5" + width="100" /> + <!-- <button + left_pad="10" height="20" label="Cancel" label_selected="Cancel" name="btn_cancel" visible="false" + width="65" />--> + <button + height="20" + font="SansSerifSmall" + label="Save" + label_selected="Save" + name="btn_apply" + left_pad="10" + right="-10" width="65" /> - </panel> \ No newline at end of file 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 c81c7113ae2..99fc39c466a 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 @@ -1,25 +1,25 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - border="true" + border="false" follows="all" height="510" label="Land & L$" layout="topleft" left="1" name="land_money_tab" - top="490" - width="280"> + top="0" + width="313"> <panel.string name="help_text"> - Parcels owned by the group are listed along with contribution details. A warning appears until the Total Land in Use is less than or equal to the Total Contribution. The Planning, Details, and Sales tabs provide information about the group's finances. + Parcels owned by a group are listed along with contribution details. A warning appears until the Total Land in Use is less than or = to the Total Contribution. </panel.string> <panel.string name="cant_view_group_land_text"> - You do not have permission to view group owned land. + You don't have permission to view group owned land </panel.string> <panel.string name="cant_view_group_accounting_text"> - You do not have permission to view the group's accounting information. + You don't have permission to view the group's accounting information. </panel.string> <panel.string name="loading_txt"> @@ -27,7 +27,7 @@ </panel.string> <panel.string name="land_contrib_error"> - Unable to set your land contribution. + Unable to set your land contribution </panel.string> <!-- <text type="string" @@ -44,29 +44,29 @@ <scroll_list draw_heading="true" follows="top" - heading_height="14" - height="100" + heading_height="20" + height="150" layout="topleft" - left="5" + left="0" name="group_parcel_list" - top_pad="10" - width="265"> + top_pad="0" + width="313"> <scroll_list.columns label="Parcel" name="name" - width="67" /> + width="78" /> <scroll_list.columns label="Region" name="location" - width="72" /> + width="78" /> <scroll_list.columns label="Type" name="type" - width="60" /> + width="70" /> <scroll_list.columns label="Area" name="area" - width="20" /> + width="50" /> <scroll_list.columns label="" name="hidden" @@ -74,14 +74,14 @@ </scroll_list> <button follows="top" - height="20" + height="23" label="Map" label_selected="Map" layout="topleft" - left="150" name="map_button" - top_pad="10" - width="125" + right="-10" + top_pad="5" + width="95" enabled="false" /> <text type="string" @@ -91,11 +91,12 @@ layout="topleft" left="5" name="total_contributed_land_label" - top_pad="10" + top_pad="0" width="130"> Total Contribution: </text> <text + text_color="EmphasisColor" type="string" follows="left|top" height="16" @@ -119,6 +120,7 @@ Total Land In Use: </text> <text + text_color="EmphasisColor" type="string" follows="left|top" height="16" @@ -142,6 +144,7 @@ Land Available: </text> <text + text_color="EmphasisColor" type="string" follows="left|top" height="16" @@ -168,19 +171,19 @@ border_style="line" border_thickness="1" follows="left|top" - height="16" + height="19" layout="topleft" left_pad="5" max_length="10" name="your_contribution_line_editor" - top_delta="-2" + top_delta="0" width="95" /> <text type="string" follows="left|top" height="16" layout="topleft" - left_pad="5" + left_pad="3" name="your_contribution_units" top_delta="2"> m² @@ -193,13 +196,13 @@ layout="topleft" left="140" name="your_contribution_max_value" - top_pad="0" + top_pad="2" width="95"> ([AMOUNT] max) </text> <icon height="16" - image_name="smicon_warn.tga" + image_name="notify_next" layout="topleft" left="9" name="group_over_limit_icon" @@ -211,14 +214,14 @@ type="string" word_wrap="true" font="SansSerifSmall" - height="40" + height="35" layout="topleft" - left_pad="5" + left_pad="0" name="group_over_limit_text" - text_color="GroupOverTierColor" + text_color="EmphasisColor" top_delta="0" - width="250"> - Group members must contribute more land credits to support land in use. + width="290"> + Group members must contribute more land credits to support land in use </text> <text type="string" @@ -242,128 +245,126 @@ name="group_money_tab_container" tab_position="top" tab_height="20" - top_pad="10" - width="265"> + top_pad="2" + tab_min_width="70" + width="300"> <panel - border="true" + border="false" follows="all" height="180" - label="Planning" + label="PLANNING" layout="topleft" - left="1" + left="0" help_topic="group_money_planning_tab" name="group_money_planning_tab" top="5" - width="265"> + width="300"> <text_editor type="string" - bg_readonly_color="0.784314 0.819608 0.8 1" follows="all" - font="Monospace" - height="168" + font="SansSerif" + height="140" layout="topleft" - left="8" + left="0" max_length="4096" name="group_money_planning_text" - top="5" - width="250" + top="0" + width="300" word_wrap="true"> - Computing... + Loading... </text_editor> </panel> <panel - border="true" - follows="left|top|right|bottom" + border="false" + follows="all" height="180" - label="Details" + label="DETAILS" layout="topleft" - left_delta="0" + left="0" help_topic="group_money_details_tab" name="group_money_details_tab" - top_delta="0" - width="265"> + top="5" + width="300"> <text_editor type="string" - bg_readonly_color="0.784314 0.819608 0.8 1" follows="all" - font="Monospace" height="140" layout="topleft" - left="8" + left="0" max_length="4096" name="group_money_details_text" - top="7" - width="250" + top="0" + width="300" word_wrap="true"> - Computing... + Loading... </text_editor> - <button - height="20" - label="< Earlier" - label_selected="< Earlier" - layout="topleft" - left="5" - name="earlier_details_button" - tool_tip="Go back in time" - top_pad="10" - width="125" /> <button - height="20" - label="Later >" - label_selected="Later >" - layout="topleft" - left_pad="5" + follows="left|top" + height="23" + image_overlay="Arrow_Left_Off" + layout="topleft" + name="earlier_details_button" + picture_style="true" + tool_tip="Back" + top_pad="3" + right="-35" + width="31" /> + <button + follows="left|top" + height="23" + image_overlay="Arrow_Right_Off" + layout="topleft" + left_pad="10" name="later_details_button" - tool_tip="Go forward in time" - top_delta="0" - width="125" /> + picture_style="true" + tool_tip="Next" + width="31" /> </panel> <panel - border="true" - follows="left|top|right|bottom" + border="false" + follows="all" height="180" - label="Sales" + label="SALES" layout="topleft" left_delta="0" help_topic="group_money_sales_tab" name="group_money_sales_tab" top_delta="-1" - width="265"> + width="300"> <text_editor type="string" - bg_readonly_color="0.784314 0.819608 0.8 1" follows="all" - font="Monospace" height="140" layout="topleft" - left="8" + left="0" max_length="4096" name="group_money_sales_text" - top="7" - width="250" + top="0" + width="300" word_wrap="true"> - Computing... + Loading... </text_editor> - <button - height="20" - label="< Earlier" - label_selected="< Earlier" - layout="topleft" - left="5" - name="earlier_sales_button" - tool_tip="Go back in time" - top_pad="10" - width="125" /> - <button - height="20" - label="Later >" - label_selected="Later >" - layout="topleft" - left_pad="5" + <button + follows="left|top" + height="23" + image_overlay="Arrow_Left_Off" + layout="topleft" + name="earlier_sales_button" + picture_style="true" + tool_tip="Back" + top_pad="3" + right="-35" + width="31" /> + <button + follows="left|top" + height="23" + image_overlay="Arrow_Right_Off" + layout="topleft" + left_pad="10" name="later_sales_button" - tool_tip="Go forward in time" - top_delta="0" - width="125" /> + picture_style="true" + tool_tip="Next" + width="31" /> </panel> </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 0e4d490369a..bfb49a60c25 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -1,14 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - border="true" follows="all" height="485" label="Notices" layout="topleft" - left="1" + left="0" name="notices_tab" - top="485" - width="280"> + top="0" + width="313"> <panel.string name="help_text"> Notices are a quick way to communicate across a @@ -20,60 +19,48 @@ the General tab. </panel.string> <panel.string name="no_notices_text"> - There are no past notices. + There are no past notices </panel.string> - <!--<text - follows="left|top" - type="string" - font="SansSerifBig" - height="16" - layout="topleft" - left="10" - name="lbl" - top_pad="10" - width="269"> - Group Notices Archive - </text> --> <text follows="left|top" type="string" word_wrap="true" - height="40" + height="30" layout="topleft" - left_delta="10" + left="10" name="lbl2" - text_color="EmphasisColor" - top_pad="10" - width="270"> - Notices are kept for 14 days. Notice lists are limited to 200 notices per group on a daily basis. + top="5" + width="300"> + Notices are kept for 14 days +Groups are limited to 200 notices/group daily </text> <scroll_list follows="left|top" column_padding="0" draw_heading="true" - heading_height="14" - height="109" + heading_height="16" + height="125" layout="topleft" - left_delta="0" + left="0" name="notice_list" top_pad="0" - width="265"> + width="303"> <scroll_list.columns label="" name="icon" - width="16" /> + width="20" /> <scroll_list.columns label="Subject" name="subject" - width="100" /> + width="125" /> <scroll_list.columns label="From" name="from" - width="83" /> + width="90" /> <scroll_list.columns label="Date" name="date" - width="50" /> + width="30" /> <scroll_list.columns name="sort" width="-1" /> @@ -84,39 +71,42 @@ the General tab. layout="topleft" name="notice_list_none_found" visible="false"> - None found. + None found </text> - <button - follows="left|top" - height="20" - font="SansSerifSmall" - label="New Notice" - label_selected="Create New Notice" - layout="topleft" - left_delta="0" - name="create_new_notice" - top_delta="4" - width="125" /> - <button - follows="left|top" - height="20" - font="SansSerifSmall" - label="Refresh" - label_selected="Refresh List" + <button + follows="bottom|left" + height="18" + image_selected="AddItem_Press" + image_unselected="AddItem_Off" + image_disabled="AddItem_Disabled" + layout="topleft" + label="Create a new notice" + left="15" + name="create_new_notice" + picture_style="true" + tool_tip="Create a new notice" + top_delta="-5" + width="18" /> + <button + follows="top|left" + height="22" + image_overlay="Refresh_Off" layout="topleft" - left_pad="12" name="refresh_notices" - top_delta="0" - width="125" /> + picture_style="true" + right="-5" + top_delta="5" + width="23" /> <panel follows="left|top" - height="268" + height="300" label="Create New Notice" layout="topleft" left="0" - name="panel_create_new_notice" top_pad="10" - width="265"> + visible="false" + name="panel_create_new_notice" + width="303"> <text follows="left|top" type="string" @@ -127,30 +117,16 @@ the General tab. mouse_opaque="false" name="lbl" text_color="EmphasisColor" - top_pad="0" - width="265"> + top="0" + width="200"> Create a Notice </text> - <text - follows="left|top" - type="string" - word_wrap="true" - height="90" - layout="topleft" - left_delta="0" - name="lbl2" - text_color="EmphasisColor" - top_pad="4" - width="195"> - You can add a single item to a notice by dragging it from your inventory to this panel. Attached items must be copiable and transferrable, and you can't send a folder. - </text> <text follows="left|top" type="string" halign="left" height="16" layout="topleft" - left_delta="0" name="lbl3" top_pad="10" width="60"> @@ -164,8 +140,7 @@ the General tab. left_pad="3" max_length="63" name="create_subject" - top_delta="-1" - width="200" /> + width="220" /> <text follows="left|top" type="string" @@ -174,106 +149,100 @@ the General tab. layout="topleft" left="10" name="lbl4" - top_pad="10" + top_pad="5" width="60"> Message: </text> <text_editor - height="75" + height="90" layout="topleft" left_pad="3" max_length="511" name="create_message" top_delta="0" - width="200" + width="220" word_wrap="true" /> <text follows="left|top" type="string" halign="left" - height="16" + height="14" layout="topleft" left="10" name="lbl5" - top_pad="10" - width="60"> + width="200"> Attach: </text> <line_editor enabled="false" - height="16" + height="19" layout="topleft" - left_pad="3" - max_length="63" + max_length="90" mouse_opaque="false" name="create_inventory_name" - top_delta="0" - width="200" /> + top_pad="2" + width="285" /> + <text + text_color="EmphasisColor" + follows="left|top" + type="string" + halign="right" + height="34" + layout="topleft" + left="10" + name="string" + top_pad="15" + word_wrap="true" + width="150"> + Drag here to attach something -- > + </text> <icon - height="16" + height="72" + image_name="DropTarget" layout="topleft" - left_delta="0" - name="create_inv_icon" - top_delta="0" - width="16" /> + left_pad="10" + mouse_opaque="true" + name="drop_icon" + top_delta="-10" + width="72" /> <button follows="left|top" - height="20" - font="SansSerifSmall" - label="Remove Attachment" - label_selected="Remove Attachment" + height="23" + label="Remove" layout="topleft" - left="10" + left="70" name="remove_attachment" - top_pad="10" - width="135" /> + top_delta="45" + width="90" /> <button follows="left|top" - height="20" - font="SansSerifSmall" + height="23" label="Send" label_selected="Send Notice" layout="topleft" - left_delta="138" + right="-10" + top_pad="20" name="send_notice" - top_delta="0" - width="125" /> - <panel - bevel_style="in" - border="true" - height="71" - layout="topleft" - left="200" - name="drop_target2" - top="20" - width="71" /> - <icon - height="59" - image_name="icon_groupnoticeinventory.tga" - layout="topleft" - left_delta="6" - mouse_opaque="true" - name="drop_icon" - top="26" - width="59" /> - <group_drop_target + width="100" /> + <group_drop_target height="466" - layout="topleft" + top="0" left="0" + layout="topleft" name="drop_target" tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." - top="-198" - width="280" /> + width="295" /> </panel> <panel follows="left|top" - height="268" + height="300" label="View Past Notice" layout="topleft" left="0" + visible="true" name="panel_view_past_notice" - top="197" - width="265"> + top="180" + width="303"> <text type="string" font="SansSerifBig" @@ -294,9 +263,9 @@ the General tab. layout="topleft" left_delta="0" name="lbl2" - top_pad="4" + top_pad="2" width="265"> - To send a new notice, click the 'New Notice' button above. + To send a new notice, click the + button </text> <text type="string" @@ -305,7 +274,7 @@ the General tab. layout="topleft" left_delta="0" name="lbl3" - top_pad="24" + top_pad="15" visible="false" width="60"> Subject: @@ -336,13 +305,13 @@ the General tab. </text> <text_editor enabled="false" - height="150" + height="205" layout="topleft" left="10" max_length="511" name="view_message" top_delta="-35" - width="260" + width="285" word_wrap="true" /> <line_editor enabled="false" @@ -353,7 +322,7 @@ the General tab. mouse_opaque="false" name="view_inventory_name" top_pad="10" - width="260" /> + width="285" /> <icon height="16" layout="topleft" @@ -363,14 +332,12 @@ the General tab. width="16" /> <button follows="left|top" - height="20" - font="SansSerifSmall" - label="Open Attachment" - label_selected="Open Attachment" + height="23" + label="Open attachment" layout="topleft" - left_delta="0" + right="-10" name="open_attachment" - top_pad="10" + top_pad="5" width="135" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index e87859f788a..5ed464bcec8 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel border="false" - height="412" + height="552" label="Members & Roles" layout="topleft" left="0" @@ -18,158 +18,28 @@ </panel.string> <panel.string name="help_text" /> - <!--<panel - follows="left|top" - height="80" - layout="topleft" - left="10" - name="members_header" - top_pad="10" - width="270"> - <text - type="string" - font="SansSerifBig" - height="16" - layout="topleft" - left="0" - name="static" - top="0" - width="270"> - Members & Roles - </text> - <text - type="string" - word_wrap="true" - height="40" - layout="topleft" - left_delta="0" - name="static2" - top_pad="4" - width="270"> - Group Members are assigned Roles with Abilities. These settings can easily be customized, allowing for greater organization and flexibility. - </text> - </panel> - <panel - follows="left|top" - height="24" - layout="topleft" - left_delta="0" - name="roles_header" - top_delta="0" - visible="false" - width="270"> - <text - type="string" - font="SansSerifBig" - height="16" - layout="topleft" - left="0" - name="static" - top="0" - width="270"> - Roles - </text> - <text - type="string" - word_wrap="true" - height="40" - layout="topleft" - left_delta="0" - name="role_properties_modifiable" - top_pad="4" - visible="false" - width="270"> - Select a Role below. You can modify its Name, Description and Member Title. - </text> - <text - type="string" - word_wrap="true" - height="40" - layout="topleft" - left_delta="0" - name="role_properties_not_modifiable" - top_delta="0" - width="270"> - Select a Role below to see its properties, Members and allowed Abilities. - </text> - <text - type="string" - word_wrap="true" - height="16" - layout="topleft" - left_delta="0" - name="role_actions_modifiable" - top_delta="24" - visible="false" - width="270"> - You can also assign Abilities to the Role. - </text> - <text - type="string" - word_wrap="true" - height="16" - layout="topleft" - left_delta="0" - name="role_actions_not_modifiable" - top_delta="0" - width="270"> - You may view, but not modify, assigned Abilities. - </text> - </panel> - <panel - follows="left|top" - height="24" - layout="topleft" - left_delta="0" - name="actions_header" - top_delta="0" - visible="false" - width="270"> - <text - type="string" - font="SansSerifBig" - height="16" - layout="topleft" - left="0" - name="static" - top="0" - width="270"> - Abilities - </text> - <text - type="string" - word_wrap="true" - height="40" - layout="topleft" - left_delta="0" - name="static2" - top_pad="4" - width="270"> - You can view an Ability's Description and which Roles and Members can execute the Ability. - </text> - </panel> --> <tab_container - border="true" + border="false" follows="left|top" - height="260" + height="245" halign="center" layout="topleft" left="5" name="roles_tab_container" tab_position="top" tab_height="20" - top="0" + tab_min_width="96" + top="3" width="303"> <panel border="false" - height="260" - label="Members" + height="220" + label="MEMBERS" layout="topleft" - left="1" + left="0" help_topic="roles_members_tab" name="members_sub_tab" tool_tip="Members" - top="17" class="panel_group_members_subtab" width="300"> <panel.string @@ -187,8 +57,7 @@ clicking on their names. follows="left|top|right" max_length="250" label="Filter Members" - name="filter_input" - font="SansSerif" /> + name="filter_input" /> <!-- <button enabled="false" font="SansSerifSmall" @@ -229,6 +98,7 @@ clicking on their names. font="SansSerifSmall" label="Invite" layout="topleft" + left="5" name="member_invite" top_pad="3" width="100" /> @@ -238,8 +108,10 @@ clicking on their names. label="Eject" layout="topleft" left_pad="5" + right="-5" name="member_eject" width="100" /> + <!--What is this?--> <icon height="16" image_name="Inv_FolderClosed" @@ -250,15 +122,14 @@ clicking on their names. </panel> <panel border="false" - height="164" - label="Roles" + height="220" + label="ROLES" layout="topleft" - left_delta="0" + left="0" help_topic="roles_roles_tab" name="roles_sub_tab" class="panel_group_roles_subtab" - top="17" - width="265"> + width="300"> <panel.string name="help_text"> Roles have a title and an allowed list of Abilities @@ -282,40 +153,19 @@ including the Everyone and Owner Roles. name="power_partial_icon"> checkbox_enabled_false.tga </panel.string> - <filter_editor - layout="topleft" - top="10" - left="4" - width="260" - height="20" - follows="left|top|right" - max_length="250" - label="Filter Roles" - name="filter_input" - font="SansSerif" /> - <!--<line_editor - border_style="line" - border_thickness="1" - follows="left|top" - height="16" - layout="topleft" - left="4" - max_length="63" - name="search_text" - top="10" - width="90" /> - <button - font="SansSerifSmall" - height="20" - label="Search" - layout="topleft" - left_pad="5" - name="search_button" - top_delta="-2" - width="80" /> + <filter_editor + layout="topleft" + top="10" + left="4" + width="280" + height="20" + follows="left|top|right" + max_length="250" + label="Filter Roles" + name="filter_input" /> + <!-- <button enabled="false" - font="SansSerifSmall" height="20" label="Show All" layout="topleft" @@ -326,11 +176,13 @@ including the Everyone and Owner Roles. <scroll_list column_padding="0" draw_heading="true" + draw_stripes="false" follows="left|top" heading_height="20" height="150" layout="topleft" - left="4" + search_column="1" + left="0" name="role_list" top_pad="4" width="300"> @@ -352,7 +204,7 @@ including the Everyone and Owner Roles. font="SansSerifSmall" label="Add Role" layout="topleft" - left_delta="0" + left="5" name="role_create" top_pad="6" width="125" /> @@ -362,20 +214,20 @@ including the Everyone and Owner Roles. label="Delete Role" layout="topleft" left_pad="5" + right="-5" name="role_delete" top_delta="0" width="125" /> </panel> <panel border="false" - height="164" - label="Abilities" + height="220" + label="ABILITIES" layout="topleft" - left_delta="0" + left="0" help_topic="roles_actions_tab" name="actions_sub_tab" class="panel_group_actions_subtab" - top="17" tool_tip="You can view an Ability's Description and which Roles and Members can execute the Ability." width="300"> <panel.string @@ -383,37 +235,17 @@ including the Everyone and Owner Roles. Abilities allow Members in Roles to do specific things in this group. There's a broad variety of Abilities. </panel.string> - <filter_editor - layout="topleft" - top="10" - left="4" - width="255" - height="20" - follows="left|top|right" - max_length="250" - label="Filter Abilities" - name="filter_input" - font="SansSerif" /> - <!--<line_editor - border_style="line" - border_thickness="1" - follows="left|top" - height="16" - layout="topleft" - left="4" - max_length="63" - name="search_text" - top="10" - width="90" /> - <button - font="SansSerifSmall" - height="20" - label="Search" - layout="topleft" - left_pad="5" - name="search_button" - top_delta="-2" - width="80" /> + <filter_editor + layout="topleft" + top="10" + left="4" + width="280" + height="20" + follows="left|top|right" + max_length="250" + label="Filter Abilities" + name="filter_input" /> + <!-- <button enabled="false" font="SansSerifSmall" @@ -428,19 +260,19 @@ things in this group. There's a broad variety of Abilities. column_padding="0" draw_stripes="false" follows="left|top" - height="100" + height="160" layout="topleft" - left="6" + left="0" multi_select="true" name="action_list" search_column="1" tool_tip="Select an Ability to view more details" top_pad="6" - width="255"> + width="300"> <scroll_list.columns label="" name="icon" - width="18" /> + width="16" /> <scroll_list.columns label="" name="action" @@ -448,7 +280,7 @@ things in this group. There's a broad variety of Abilities. </scroll_list> <icon height="16" - image_name="inv_folder_plain_closed.tga" + image_name="Inv_FolderClosed" layout="topleft" name="power_folder_icon" visible="false" @@ -456,105 +288,93 @@ things in this group. There's a broad variety of Abilities. </panel> </tab_container> <panel - height="150" + height="252" layout="topleft" follows="left|top" left="10" name="members_footer" - top_pad="2" + top_pad="10" + top_delta="0" width="300"> <text type="string" - font="SansSerif" height="16" layout="topleft" follows="left|top" left="0" name="static" - top_pad="0" - width="100"> + top_pad="5" + width="295"> Assigned Roles </text> - <text - type="string" - font="SansSerif" - height="16" - layout="topleft" - follows="left|top" - left_pad="35" - name="static2" - top_delta="0" - width="100"> - Allowed Abilities - </text> <scroll_list draw_stripes="false" follows="left|top" - height="150" + height="80" layout="topleft" left="0" name="member_assigned_roles" - top_pad="5" - width="130"> + top_pad="0" + width="295"> <scroll_list.columns label="" name="checkbox" - width="18" /> + width="30" /> <scroll_list.columns label="" name="role" - width="107" /> + width="265" /> </scroll_list> - <scroll_list - draw_stripes="false" - height="150" + <text + type="string" + height="16" layout="topleft" follows="left|top" - left_pad="5" + left="0" + name="static2" + top_pad="5" + width="295"> + Allowed Abilities + </text> + <scroll_list + draw_stripes="false" + height="80" + layout="topleft" + left="0" name="member_allowed_actions" + search_column="2" tool_tip="For details of each allowed ability see the abilities tab" - top_delta="0" - width="130"> + top_pad="0" + width="295"> <scroll_list.columns label="" name="icon" - width="14" /> + width="20" /> <scroll_list.columns label="" name="action" - width="126" /> + width="275" /> </scroll_list> </panel> <panel - height="252" + height="297" layout="topleft" - left_delta="0" + left="10" name="roles_footer" top_delta="0" + top="245" visible="false" - width="270"> + width="300"> <text type="string" - font="SansSerif" height="16" layout="topleft" left="0" name="static" top="0" - width="100"> + width="140"> Name </text> - <text - type="string" - font="SansSerif" - height="16" - layout="topleft" - left_pad="35" - name="static2" - top_delta="0" - width="100"> - Description - </text> <line_editor type="string" border_style="line" @@ -563,21 +383,19 @@ things in this group. There's a broad variety of Abilities. height="20" layout="topleft" left="0" - max_length="20" + max_length="295" name="role_name" top_pad="0" - width="130"> + width="295"> Employees </line_editor> <text type="string" - font="SansSerif" height="16" layout="topleft" - left_delta="0" name="static3" - top_pad="10" - width="100"> + top_pad="5" + width="295"> Title </text> <line_editor @@ -587,158 +405,159 @@ things in this group. There's a broad variety of Abilities. follows="left|top" height="20" layout="topleft" - left_delta="0" - max_length="20" + max_length="295" name="role_title" top_pad="0" - width="130"> - (waiting) + width="295"> + (waiting) </line_editor> + <text + type="string" + height="16" + layout="topleft" + left="0" + name="static2" + top_pad="5" + width="100"> + Description + </text> <text_editor type="string" halign="left" - height="48" + height="35" layout="topleft" - left="135" - max_length="254" + left="0" + max_length="295" name="role_description" - top="16" - width="130" + top_pad="0" + width="295" word_wrap="true"> - (waiting) + (waiting) </text_editor> <text type="string" - font="SansSerif" height="16" layout="topleft" + follows="left|top" left="0" - name="static4" - top="85" - width="120"> - Assigned Members - </text> - <text - type="string" - font="SansSerif" - height="16" - layout="topleft" - left_pad="15" - name="static5" - tool_tip="A list of abilities the currently selected role can perform" - top_delta="0" - width="100"> - Allowed Abilities + name="static" + top_pad="5" + width="295"> + Assigned Roles </text> <name_list draw_stripes="false" - height="150" + height="50" layout="topleft" left="0" name="role_assigned_members" top_pad="0" - width="130" /> + width="295" /> <check_box - height="16" - label="Members are visible" + height="15" + label="Reveal members" layout="topleft" - left_delta="0" name="role_visible_in_list" tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group." - top_pad="10" - width="130" /> + top_pad="3" + width="290" /> + <text + type="string" + height="16" + layout="topleft" + follows="left|top" + left="0" + name="static2" + top_pad="5" + width="295"> + Allowed Abilities + </text> <scroll_list draw_stripes="false" - height="150" + height="50" layout="topleft" - left="135" + left="0" name="role_allowed_actions" search_column="2" tool_tip="For details of each allowed ability see the abilities tab" - top="101" - width="130"> + top_pad="0" + width="295"> <scroll_list.columns label="" name="icon" - width="2" /> + width="20" /> <scroll_list.columns label="" name="checkbox" - width="16" /> + width="20" /> <scroll_list.columns label="" name="action" - width="220" /> + width="250" /> </scroll_list> </panel> <panel - height="215" + height="303" layout="topleft" - left_delta="0" + left="10" name="actions_footer" top_delta="0" + top="245" visible="false" - width="265"> + width="300"> <text type="string" - font="SansSerif" height="16" layout="topleft" - left="0" name="static" - top="0" width="200"> - Description + Ability description </text> <text_editor type="string" enabled="false" halign="left" - height="48" + height="80" layout="topleft" left_delta="0" max_length="512" name="action_description" top_pad="0" - width="265" + width="295" word_wrap="true"> This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner. </text_editor> <text type="string" - font="SansSerif" height="16" layout="topleft" left_delta="0" name="static2" - top_pad="10" - width="125"> - Roles with Ability + top_pad="5" + width="295"> + Roles with this ability </text> - <text + <scroll_list + height="60" + layout="topleft" + left="0" + name="action_roles" + top_pad="0" + width="295" /> + <text type="string" - font="SansSerif" height="16" layout="topleft" - left_pad="10" name="static3" - top_delta="0" - width="125"> - Members with Ability + top_pad="5" + width="295"> + Members with this ability </text> - <scroll_list - height="150" - layout="topleft" - left="0" - name="action_roles" - top="90" - width="130" /> <name_list - height="150" + height="100" layout="topleft" - left_pad="5" name="action_members" - top_delta="0" - width="130" /> + top_pad="0" + width="295" /> </panel> </panel> 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 c4cdaa41f97..0dd38784263 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 @@ -1,30 +1,35 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel name="panel_im_control_panel" - width="125" - height="248" + width="128" + height="327" border="false"> <avatar_icon name="avatar_icon" - width="96" - height="96" /> + follows="left|top" + left_delta="3" + width="125" + height="125" /> <button name="view_profile_btn" + follows="left|bottom" label="View Profile" - left_delta="3" width="125" height="20" /> <button name="add_friend_btn" + follows="left|bottom" label="Add Friend" width="125" height="20" /> <button name="call_btn" + follows="left|bottom" label="Call" width="125" height="20" /> <button + follows="left|bottom" height="20" label="End Call" name="end_call_btn" @@ -33,15 +38,27 @@ <button enabled="false" + follows="left|bottom" name="voice_ctrls_btn" label="Open Voice Controls" width="125" height="20" visible="false"/> + <button name="teleport_btn" + follows="left|bottom" + label="Teleport" + width="125" + height="20" /> <button name="share_btn" + follows="left|bottom" label="Share" width="125" height="20" /> + <button name="pay_btn" + follows="left|bottom" + label="Pay" + width="125" + height="20" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml new file mode 100644 index 00000000000..03ba7f7c81f --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -0,0 +1,257 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="570" + layout="topleft" + left="0" + min_height="350" + name="landmark_info" + top="20" + width="330"> + <string + name="title_create_landmark" + value="Create Landmark" /> + <string + name="title_edit_landmark" + value="Edit Landmark" /> + <string + name="title_landmark" + value="Landmark" /> + <string + name="not_available" + value="(N\A)" /> + <string + name="unknown" + value="(unknown)" /> + <string + name="public" + value="(public)" /> + <string + name="server_update_text"> + Place information not available without server update. + </string> + <string + name="server_error_text"> + Information about this location is unavailable at this time, please try again later. + </string> + <string + name="server_forbidden_text"> + Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner. + </string> + <string + name="acquired_date"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </string> + <button + follows="top|right" + height="23" + image_overlay="BackArrow_Off" + layout="topleft" + left="10" + name="back_btn" + picture_style="true" + tab_stop="false" + top="0" + width="23" /> + <text + follows="top|left|right" + font="SansSerifHugeBold" + height="26" + layout="topleft" + left_pad="10" + name="title" + text_color="white" + top="0" + use_ellipses="true" + value="Place Profile" + width="275" /> + <scroll_container + color="DkGray2" + follows="all" + height="533" + layout="topleft" + left="10" + name="place_scroll" + opaque="true" + top_pad="5" + width="313"> + <panel + bg_alpha_color="DkGray2" + follows="all" + height="533" + layout="topleft" + left="0" + min_height="300" + name="scrolling_panel" + top="0" + width="313"> + <texture_picker + enabled="false" + follows="top|left" + height="190" + layout="topleft" + left="10" + name="logo" + top="10" + width="290" /> + <text + follows="left|top|right" + font="SansSerifLarge" + height="14" + layout="topleft" + left="10" + name="region_title" + text_color="white" + top_pad="5" + use_ellipses="true" + value="SampleRegion" + width="290" /> + <text + follows="left|top|right" + height="14" + layout="topleft" + left="10" + name="parcel_title" + top_pad="4" + use_ellipses="true" + value="SampleParcel, Name Long (145, 228, 26)" + width="285" /> + <expandable_text + follows="left|top|right" + height="50" + layout="topleft" + left="5" + name="description" + top_pad="10" + value="Du waltz die spritz" + width="300" /> + <panel + follows="left|top|right" + height="55" + layout="topleft" + left="10" + name="landmark_info_panel" + top_pad="10" + width="290"> + <text + follows="left|top" + height="15" + layout="topleft" + left="0" + name="owner_label" + top_pad="10" + value="Owner:" + width="90" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="70" + name="owner" + top_delta="0" + width="200" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="0" + name="creator_label" + value="Creator:" + width="90" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="70" + name="creator" + top_delta="0" + width="200" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="0" + name="created_label" + value="Created:" + width="50" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="70" + name="created" + top_delta="0" + width="200" /> + </panel> + <panel + follows="left|top|right" + height="210" + layout="topleft" + left="10" + name="landmark_edit_panel" + width="290"> + <text + follows="left|top" + height="15" + layout="topleft" + left="0" + name="title_label" + top_pad="10" + value="Title:" + width="290" /> + <line_editor + background_image_disabled="task_panel_background.png" + follows="left|top|right" + height="22" + layout="topleft" + left="0" + max_length="63" + name="title_editor" + prevalidate_callback="ascii" + text_readonly_color="white" + top_pad="5" + width="290" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="0" + name="notes_label" + top_pad="10" + value="My notes:" + width="290" /> + <text_editor + bg_readonly_color="DkGray2" + follows="all" + height="70" + layout="topleft" + left="0" + max_length="127" + name="notes_editor" + read_only="true" + text_readonly_color="white" + top_pad="5" + width="290" + wrap="true" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="0" + name="folder_label" + top_pad="15" + value="Landmark location:" + width="290" /> + <combo_box + follows="bottom|left|right" + height="20" + layout="topleft" + left="0" + name="folder_combo" + top_pad="5" + width="200" /> + </panel> + </panel> + </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index 5293043ba7d..91fcf4b5f23 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -31,7 +31,7 @@ left="0" mouse_opaque="true" name="favorites_list" - start_folder="favorite" + start_folder="Favorite" width="380"/> </accordion_tab> <accordion_tab @@ -47,7 +47,7 @@ left="0" mouse_opaque="true" name="landmarks_list" - start_folder="landmark" + start_folder="Landmarks" width="380"/> </accordion_tab> <accordion_tab @@ -63,13 +63,13 @@ left="0" mouse_opaque="true" name="my_inventory_list" - start_folder="inventory" + start_folder="INVENTORY" width="380"/> - </accordion_tab> - <accordion_tab - layout="topleft" - name="tab_library" - title="Library"> + </accordion_tab> + <accordion_tab + layout="topleft" + name="tab_library" + title="Library"> <inventory_subtree_panel allow_multi_select="true" border="true" @@ -79,7 +79,7 @@ left="0" mouse_opaque="true" name="library_list" - start_folder="library" + start_folder="LIBRARY" width="380"/> </accordion_tab> </accordion> 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 2182163da5b..555fedb1ffb 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 @@ -42,13 +42,17 @@ width="20" /> <button follows="right" + is_toggle="true" width="45" top="0" layout="topleft" left_pad="8" label="Log" height="23" + name="show_nearby_chat" tool_tip="Show/hide nearby chat log"> - <button.commit_callback function="Floater.Toggle" parameter="nearby_chat"/> + <button.init_callback + function="Button.SetDockableFloaterToggle" + parameter="nearby_chat" /> </button> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml index a67ae59b4a4..3cc9c3f38a0 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml @@ -30,7 +30,7 @@ text_color="white" top="0" value="Pick Info" - use_elipsis="true" + use_ellipses="true" width="275" /> <scroll_container color="DkGray2" diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml new file mode 100644 index 00000000000..7e073f064d7 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -0,0 +1,979 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="570" + layout="topleft" + left="0" + min_height="350" + name="place_profile" + top="20" + width="330"> + <string + name="on" + value="On" /> + <string + name="off" + value="Off" /> + <string + name="anyone" + value="Anyone" /> + <string + name="available" + value="available" /> + <string + name="allocated" + value="allocated" /> + <string + name="title_place" + value="Place Profile" /> + <string + name="title_teleport_history" + value="Teleport History Location" /> + <string + name="not_available" + value="(N\A)" /> + <string + name="unknown" + value="(unknown)" /> + <string + name="public" + value="(public)" /> + <string + name="none_text" + value="(none)" /> + <string + name="sale_pending_text" + value="(Sale Pending)" /> + <string + name="group_owned_text" + value="(Group Owned)" /> + <string + name="price_text" + value="L$" /> + <string + name="area_text" + value="m²" /> + <string + name="all_residents_text" + value="All Residents" /> + <string + name="group_text" + value="Group" /> + <string + name="can_resell"> + Purchased land in this region may be resold. + </string> + <string + name="can_not_resell"> + Purchased land in this region may not be resold. + </string> + <string + name="can_change"> + Purchased land in this region may be joined or subdivided. + </string> + <string + name="can_not_change"> + Purchased land in this region may not be joined or subdivided. + </string> + <string + name="server_update_text"> + Place information not available without server update. + </string> + <string + name="server_error_text"> + Information about this location is unavailable at this time, please try again later. + </string> + <string + name="server_forbidden_text"> + Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner. + </string> + <string + name="acquired_date"> + [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] + </string> + <button + follows="top|right" + height="23" + image_overlay="BackArrow_Off" + layout="topleft" + left="10" + name="back_btn" + picture_style="true" + tab_stop="false" + top="0" + width="23" /> + <text + follows="top|left|right" + font="SansSerifHugeBold" + height="26" + layout="topleft" + left_pad="10" + name="title" + text_color="white" + top="0" + use_ellipses="true" + value="Place Profile" + width="275" /> + <scroll_container + color="DkGray2" + follows="all" + height="533" + layout="topleft" + left="10" + name="place_scroll" + opaque="true" + top_pad="5" + width="313"> + <panel + bg_alpha_color="DkGray2" + follows="all" + height="533" + layout="topleft" + left="0" + min_height="300" + name="scrolling_panel" + top="0" + value=">" + width="313"> + <texture_picker + enabled="false" + follows="top|left" + height="190" + layout="topleft" + left="10" + name="logo" + top="10" + width="290" /> + <layout_stack + border_size="0" + clip="false" + follows="all" + height="50" + layout="topleft" + mouse_opaque="false" + name="panel_stack" + orientation="horizontal" + top_pad="-65" + width="100"> + <layout_panel + follows="left|right" + height="50" + layout="topleft" + left="0" + min_height="50" + min_width="50" + mouse_opaque="false" + name="here_panel" + top="0" + user_resize="false" + width="60"> + <icon + follows="top|left" + height="50" + image_name="YouAreHere_Badge" + layout="topleft" + left="0" + name="icon_you_are_here" + top="0" + width="50" /> + </layout_panel> + <layout_panel + follows="left|right" + height="60" + layout="topleft" + min_height="50" + min_width="60" + mouse_opaque="false" + name="for_sale_panel" + top="0" + user_resize="false" + width="60"> + <icon + follows="top|left" + height="50" + image_name="ForSale_Badge" + layout="topleft" + left="10" + name="icon_for_sale" + top="0" + width="50" /> + </layout_panel> + </layout_stack> + <text + follows="left|top|right" + font="SansSerifLarge" + height="14" + layout="topleft" + left="10" + name="region_title" + text_color="white" + top_pad="5" + use_ellipses="true" + value="SampleRegion" + width="290" /> + <!-- <icon + follows="top|right" + height="16" + image_name="Icon_For_Sale" + layout="topleft" + left="3" + mouse_opaque="true" + name="icon_for_sale" + width="16" />--> + <text + follows="left|top|right" + height="14" + layout="topleft" + left="10" + name="parcel_title" + top_pad="4" + use_ellipses="true" + value="SampleParcel, Name Long (145, 228, 26)" + width="285" /> + <expandable_text + follows="left|top|right" + height="50" + layout="topleft" + left="5" + name="description" + top_pad="10" + value="Du waltz die spritz" + width="300" /> + <text + follows="left|top" + height="14" + layout="topleft" + left="10" + name="owner_label" + text_color="White" + top_pad="0" + value="Owner:" + width="90" /> + <!--TODO: HOOK THIS NAME UP WITH AN INSPECTOR --> + <text + follows="left|top|right" + height="14" + layout="topleft" + left_pad="1" + name="owner_value" + top_delta="0" + value="Alex Superduperlongenamenton" + width="205" /> + <accordion + follows="all" + height="230" + layout="topleft" + left="0" + name="advanced_info_accordion" + top_pad="10" + width="313"> + <accordion_tab + layout="topleft" + name="parcel_characteristics_tab" + title="Parcel"> + <scroll_container + color="DkGray2" + follows="all" + height="132" + layout="topleft" + left="0" + name="parcel_scroll" + opaque="true" + top="0" + width="290"> + <panel + follows="all" + height="165" + layout="topleft" + left="0" + top="0" + width="275"> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_M" + layout="topleft" + left="20" + name="icon_M" + top="0" + width="18" /> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_R" + layout="topleft" + left="20" + name="icon_R" + top="0" + width="18" /> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_PG" + layout="topleft" + left="20" + name="icon_PG" + top="0" + visible="false" + width="18" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="8" + name="rating_label" + value="Rating:" + width="80" /> + <text + follows="right|top" + height="16" + layout="topleft" + left_pad="0" + name="rating_value" + top_delta="0" + value="Mature" + width="120" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Voice" + layout="topleft" + left="20" + name="icon_Voice" + top_pad="5" + width="22" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_VoiceNo" + layout="topleft" + left="20" + name="icon_VoiceNo" + top_delta="0" + visible="false" + width="22" /> + <text + follows="left|top" + height="18" + layout="topleft" + left_pad="8" + name="voice_label" + top_delta="0" + value="Voice:" + width="76" /> + <text + follows="right|top" + height="18" + layout="topleft" + left_pad="0" + name="voice_value" + top_delta="0" + value="On" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Fly" + layout="topleft" + left="20" + name="icon_Fly" + top_pad="3" + width="22" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_FlyNo" + layout="topleft" + left="20" + name="icon_FlyNo" + top_delta="0" + visible="false" + width="22" /> + <text + follows="left|top" + height="16" + layout="topleft" + left_pad="8" + name="fly_label" + value="Fly:" + width="76" /> + <text + follows="right|top" + height="16" + layout="topleft" + left_pad="0" + name="fly_value" + top_delta="0" + value="On" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Push" + layout="topleft" + left="20" + name="icon_Push" + top_pad="3" + visible="false" + width="22" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_PushNo" + layout="topleft" + left="20" + name="icon_PushNo" + top_delta="0" + width="22" /> + <text + follows="left|top" + height="14" + layout="topleft" + left_pad="8" + name="push_label" + value="Push:" + width="76" /> + <text + follows="right|top" + height="14" + layout="topleft" + left_pad="0" + name="push_value" + top_delta="0" + value="Off" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Build" + layout="topleft" + left="20" + name="icon_Build" + top_pad="3" + width="22" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_BuildNo" + layout="topleft" + left="20" + name="icon_BuildNo" + top_delta="0" + visible="false" /> + <text + follows="left|top" + height="14" + layout="topleft" + left_pad="8" + name="build_label" + value="Build:" + width="76" /> + <text + follows="right|top" + height="15" + layout="topleft" + left_pad="0" + name="build_value" + top_delta="0" + value="On" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Scripts" + layout="topleft" + left="20" + name="icon_Scripts" + top_pad="3" + width="22" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_ScriptsNo" + layout="topleft" + left="20" + name="icon_ScriptsNo" + top_delta="0" + visible="false" /> + <text + follows="left|top" + height="14" + layout="topleft" + left_pad="8" + name="scripts_label" + value="Scripts:" + width="76" /> + <text + follows="right|top" + height="14" + layout="topleft" + left_pad="0" + name="scripts_value" + top_delta="0" + value="On" + width="60" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_Damage" + layout="topleft" + left="20" + name="icon_Damage" + top_pad="7" + visible="false" + width="22" /> + <icon + follows="top|left" + height="18" + image_name="parcel_drk_DamageNo" + layout="topleft" + left="20" + name="icon_DamageNo" + top_delta="0" /> + <text + follows="left|top" + height="14" + layout="topleft" + left_pad="8" + name="damage_label" + value="Damage:" + width="76" /> + <text + follows="right|top" + height="14" + layout="topleft" + left_pad="0" + name="damage_value" + top_delta="0" + value="Off" + width="60" /> + <button + follows="bottom|right" + height="19" + label="About Land" + layout="topleft" + name="about_land_btn" + right="-5" + tab_stop="false" + top="138" + width="90"> + <click_callback + function="ShowFloater" + parameter="about_land" /> + </button> + </panel> + </scroll_container> + </accordion_tab> + <accordion_tab + expanded="false" + layout="topleft" + name="region_information_tab" + title="Region"> + <panel + follows="all" + height="125" + layout="topleft" + left="0" + top="0" + width="290"> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="region_name_label" + top_pad="5" + value="Region:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left_pad="0" + name="region_name" + top_delta="0" + value="Mooseland" + width="195" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="region_type_label" + top_pad="5" + value="Type:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left_pad="0" + name="region_type" + top_delta="0" + value="Moose" + width="195" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="region_rating_label" + top_pad="7" + value="Rating:" + width="80" /> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_M" + layout="topleft" + left_pad="0" + name="icon_M" + width="18" /> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_R" + layout="topleft" + left_delta="0" + name="icon_R" + top_delta="0" + visible="false" + width="18" /> + <icon + follows="top|left" + height="16" + image_name="parcel_drk_PG" + layout="topleft" + left_delta="0" + name="icon_PG" + top_delta="0" + visible="false" + width="18" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left_pad="10" + name="region_rating" + value="Explicit" + width="100" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="region_owner_label" + top_pad="5" + value="Owner:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left_pad="0" + name="region_owner" + top_delta="0" + value="moose Van Moose" + width="195" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="region_group_label" + top_pad="5" + value="Group:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left_pad="0" + name="region_group" + top_delta="0" + use_ellipses="true" + width="195"> + The Mighty Moose of mooseville soundvillemoose + </text> + <button + follows="bottom|right" + height="19" + label="Region/Estate" + layout="topleft" + name="region_info_btn" + right="-5" + tab_stop="false" + width="105"> + <click_callback + function="ShowFloater" + parameter="region_info" /> + </button> + </panel> + </accordion_tab> + <accordion_tab + expanded="false" + layout="topleft" + name="estate_information_tab" + title="Estate"> + <panel + follows="all" + height="189" + layout="topleft" + left="0" + top="0" + width="290"> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="estate_name_label" + top_pad="5" + value="Estate:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="90" + name="estate_name" + top_delta="0" + width="160" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="estate_rating_label" + top_pad="5" + value="Rating:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="90" + name="estate_rating" + top_delta="0" + width="160" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="estate_owner_label" + top_pad="5" + value="Owner:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="90" + name="estate_owner" + top_delta="0" + width="160" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="covenant_label" + top_pad="5" + value="Covenant:" + width="220" /> + <text_editor + bg_focus_color="DkGray2" + bg_readonly_color="DkGray2" + follows="left|top|right" + handle_edit_keys_directly="true" + height="90" + layout="topleft" + left="10" + max_length="65535" + name="covenant" + read_only="true" + top_pad="0" + width="280" /> + </panel> + </accordion_tab> + <accordion_tab + expanded="false" + layout="topleft" + name="sales_tab" + title="For Sale"> + <panel + follows="all" + height="300" + layout="topleft" + left="0" + top="0" + width="290"> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="sales_price_label" + top_pad="5" + value="Price:" + width="100" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="110" + name="sales_price" + top_delta="0" + width="140" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="area_label" + top_pad="5" + value="Area:" + width="100" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="110" + name="area" + top_delta="0" + width="140" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="traffic_label" + top_pad="5" + value="Traffic:" + width="100" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="110" + name="traffic" + top_delta="0" + width="140" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="primitives_label" + top_pad="5" + value="Primitives:" + width="100" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="110" + name="primitives" + top_delta="0" + width="140" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="parcel_scripts_label" + top_pad="5" + value="Scripts:" + width="100" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="110" + name="parcel_scripts" + top_delta="0" + width="140" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="terraform_limits_label" + top_pad="5" + value="Terraform limits:" + width="100" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="110" + name="terraform_limits" + top_delta="0" + width="140" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="subdivide_label" + top_pad="5" + value="Subdivide/Join ability:" + width="220" /> + <text_editor + bg_focus_color="DkGray2" + bg_readonly_color="DkGray2" + follows="left|top|right" + height="45" + layout="topleft" + left="10" + max_length="65535" + name="subdivide" + read_only="true" + top_pad="5" + width="245" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="resale_label" + top_pad="5" + value="ReSale ability:" + width="80" /> + <text_editor + bg_focus_color="DkGray2" + bg_readonly_color="DkGray2" + follows="left|top|right" + height="45" + layout="topleft" + left="10" + max_length="65535" + name="resale" + read_only="true" + top_pad="5" + width="245" /> + <text + follows="left|top" + height="15" + layout="topleft" + left="10" + name="sale_to_label" + top_pad="5" + value="For sale to:" + width="80" /> + <text + follows="left|top|right" + height="15" + layout="topleft" + left="90" + name="sale_to" + top_delta="0" + width="160" /> + </panel> + </accordion_tab> + </accordion> + </panel> + </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index 5aa53ab46b1..87ac5be74a1 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -40,14 +40,26 @@ background_visible="true" top_pad="10" width="313" /> <panel - class="panel_place_info" - filename="panel_place_info.xml" + class="panel_place_profile" + filename="panel_place_profile.xml" follows="all" height="533" layout="topleft" left="0" help_topic="places_info_tab" - name="panel_place_info" + name="panel_place_profile" + top="5" + visible="false" + width="313" /> + <panel + class="panel_landmark_info" + filename="panel_landmark_info.xml" + follows="all" + height="533" + layout="topleft" + left="0" + help_topic="places_info_tab" + name="panel_landmark_info" top="5" visible="false" width="313" /> diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 5af7d7d6744..c3a92f9d9ae 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -157,7 +157,7 @@ value="http://librarianavengers.org" width="280" word_wrap="false" - use_elipsis="true" + use_ellipses="true" /> <text follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml index 195b7315313..4b2e901718e 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -36,7 +36,7 @@ text_color="white" top="0" value="(Loading...)" - use_elipsis="true" + use_ellipses="true" width="275" /> <text follows="top|left" diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml index ab4ad940893..6171be034f4 100644 --- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml @@ -15,14 +15,14 @@ image_disabled_selected="ComboButton_Disabled_Selected" /> <gesture_combo_box.drop_down_button name="Drop Down Button" label="" + halign="center" hover_glow_amount="0.15" font="SansSerif" scale_image="true" - pad_right="24" - image_unselected="DropDown_Off" - image_selected="DropDown_Selected" - image_disabled="DropDown_Disabled" - image_disabled_selected="DropDown_Disabled_Selected" /> + image_unselected="PushButton_Off" + image_selected="PushButton_Selected" + image_disabled="PushButton_Disabled" + image_disabled_selected="PushButton_Selected_Disabled" /> <gesture_combo_box.combo_list bg_writeable_color="MenuDefaultBgColor" scroll_bar_bg_visible="true" /> <gesture_combo_box.combo_editor name="Combo Text Entry" diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml new file mode 100644 index 00000000000..725492052ca --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- Derives from LLUICtrl --> +<talk_button> + <!-- To make speak button look green when selected set: + image_selected="SegmentedBtn_Left_Selected" + image_unselected="SegmentedBtn_Left_Off" + --> + <speak_button + name="left" + label="Speak" + label_selected="Speak" + font="SansSerifSmall" + tab_stop="false" + is_toggle="true" + picture_style="true" + /> + <show_button + name="right" + label="" + left="0" + top="0" + right="20" + bottom="0" + tab_stop="false" + is_toggle="true" + picture_style="true" + image_selected="ComboButton_Selected" + image_unselected="ComboButton_Off" + /> + <monitor + name="monitor" + left="0" + top="18" + right="18" + bottom="0" + /> +</talk_button> -- GitLab From dc365be4d23d8070a4f9e670918dbe8ccbe8cc79 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Wed, 4 Nov 2009 18:03:04 -0500 Subject: [PATCH 140/306] For EXT-1985: Clothing previously taken off is re-worn when creating a new clothing item in appearance mode. General problem with failing to update the COF when clothing items were removed. Added hook in removeWearableFinal, which should guarantee that we're always removing clothing links when we need to. --- indra/newview/llagentwearables.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 4b3d27767c8..7d215b57781 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1393,6 +1393,7 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem const LLUUID &item_id = getWearableItemID(type,i); popWearable(type,i); gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); + LLAppearanceManager::removeItemLinks(item_id,false); //queryWearableCache(); // moved below if (old_wearable) @@ -1409,6 +1410,7 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem const LLUUID &item_id = getWearableItemID(type,index); popWearable(type, index); gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); + LLAppearanceManager::removeItemLinks(item_id,false); //queryWearableCache(); // moved below -- GitLab From 0520ad677a380e81f6d166bfbcbed23333533b77 Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Wed, 4 Nov 2009 15:06:56 -0800 Subject: [PATCH 141/306] EXT-1739 Preferences > Sounds > Device settings -- Input/Output controls don't work EXT-2073 Need ability to change font style of tab headers EXT-1505 Kill text drop shadow on Menu and Tabs reviewed by Richard --- indra/llui/llmenugl.cpp | 24 +++--------- indra/llui/lltabcontainer.cpp | 4 +- .../newview/llfloatervoicedevicesettings.cpp | 17 +++++++++ indra/newview/llfloatervoicedevicesettings.h | 2 + .../xui/en/panel_preferences_sound.xml | 37 ++++++++++++------- .../default/xui/en/widgets/tab_container.xml | 1 + 6 files changed, 52 insertions(+), 33 deletions(-) diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 91e7e46195d..36d8e5ed715 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -459,12 +459,6 @@ void LLMenuItemGL::draw( void ) LLColor4 color; - LLFontGL::ShadowType shadow_style = LLFontGL::NO_SHADOW; - if (getEnabled() && !mDrawTextDisabled ) - { - shadow_style = LLFontGL::DROP_SHADOW_SOFT; - } - if ( getEnabled() && getHighlight() ) { color = mHighlightForeground.get(); @@ -482,26 +476,26 @@ void LLMenuItemGL::draw( void ) if (mBriefItem) { mFont->render( mLabel, 0, BRIEF_PAD_PIXELS / 2, 0, color, - LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style ); + LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL); } else { if( !mDrawBoolLabel.empty() ) { mFont->render( mDrawBoolLabel.getWString(), 0, (F32)LEFT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color, - LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style, S32_MAX, S32_MAX, NULL, FALSE ); + LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); } mFont->render( mLabel.getWString(), 0, (F32)LEFT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color, - LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style, S32_MAX, S32_MAX, NULL, FALSE ); + LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); if( !mDrawAccelLabel.empty() ) { mFont->render( mDrawAccelLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color, - LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style, S32_MAX, S32_MAX, NULL, FALSE ); + LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); } if( !mDrawBranchLabel.empty() ) { mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color, - LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style, S32_MAX, S32_MAX, NULL, FALSE ); + LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); } } @@ -1460,12 +1454,6 @@ void LLMenuItemBranchDownGL::draw( void ) gl_rect_2d( 0, getRect().getHeight(), getRect().getWidth(), 0 ); } - LLFontGL::ShadowType shadow_style = LLFontGL::NO_SHADOW; - if (getEnabled() && !getDrawTextDisabled() ) - { - shadow_style = LLFontGL::DROP_SHADOW_SOFT; - } - LLColor4 color; if (getHighlight()) { @@ -1480,7 +1468,7 @@ void LLMenuItemBranchDownGL::draw( void ) color = mDisabledColor.get(); } getFont()->render( mLabel.getWString(), 0, (F32)getRect().getWidth() / 2.f, (F32)LABEL_BOTTOM_PAD_PIXELS, color, - LLFontGL::HCENTER, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style ); + LLFontGL::HCENTER, LLFontGL::BOTTOM, LLFontGL::NORMAL); // underline navigation key only when keyboard navigation has been initiated diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index cde4c755184..04c57dcb4e1 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -155,7 +155,7 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p) mTotalTabWidth(0), mTabPosition(p.tab_position), mFontHalign(p.font_halign), - mFont(p.font.isProvided() ? p.font() : (mIsVertical ? LLFontGL::getFontSansSerif() : LLFontGL::getFontSansSerifSmall())), + mFont(p.font), mFirstTabParams(p.first_tab), mMiddleTabParams(p.middle_tab), mLastTabParams(p.last_tab) @@ -946,6 +946,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) p.scale_image(true); p.font_halign = mFontHalign; p.tab_stop(false); + p.label_shadow(false); if (indent) { p.pad_left(indent); @@ -965,6 +966,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) p.image_unselected(tab_img); p.image_selected(tab_selected_img); p.tab_stop(false); + p.label_shadow(false); // Try to squeeze in a bit more text p.pad_left(4); p.pad_right(2); diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llfloatervoicedevicesettings.cpp index aca9198f59a..bbeb2871714 100644 --- a/indra/newview/llfloatervoicedevicesettings.cpp +++ b/indra/newview/llfloatervoicedevicesettings.cpp @@ -49,6 +49,9 @@ #include "lluictrlfactory.h" +static LLRegisterPanelClassWrapper<LLPanelVoiceDeviceSettings> t_panel_group_general("panel_voice_device_settings"); + + LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings() : LLPanel() { @@ -82,8 +85,22 @@ BOOL LLPanelVoiceDeviceSettings::postBuild() return TRUE; } +// virtual +void LLPanelVoiceDeviceSettings::handleVisibilityChange ( BOOL new_visibility ) +{ + if (new_visibility) + { + initialize(); + } + else + { + cleanup(); + } +} void LLPanelVoiceDeviceSettings::draw() { + refresh(); + // let user know that volume indicator is not yet available bool is_in_tuning_mode = gVoiceClient->inTuningMode(); childSetVisible("wait_text", !is_in_tuning_mode); diff --git a/indra/newview/llfloatervoicedevicesettings.h b/indra/newview/llfloatervoicedevicesettings.h index f1603dc4144..d67283d0a22 100644 --- a/indra/newview/llfloatervoicedevicesettings.h +++ b/indra/newview/llfloatervoicedevicesettings.h @@ -50,6 +50,8 @@ class LLPanelVoiceDeviceSettings : public LLPanel void initialize(); void cleanup(); + /*virtual*/ void handleVisibilityChange ( BOOL new_visibility ); + protected: static void onCommitInputDevice(LLUICtrl* ctrl, void* user_data); static void onCommitOutputDevice(LLUICtrl* ctrl, void* user_data); diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 832c9775ce2..c1df7bd5013 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -336,19 +336,20 @@ top_delta="19" width="200" /> </radio_group> - <button - control_name="ShowDeviceSettings" - follows="left|bottom" - height="19" - is_toggle="true" - label="Input / Output Devices" - layout="topleft" - left="165" - top_pad="12" - name="device_settings_btn" - width="190" /> + <button + control_name="ShowDeviceSettings" + follows="left|bottom" + height="19" + is_toggle="true" + label="Input / Output Devices" + layout="topleft" + left="165" + top_pad="12" + name="device_settings_btn" + width="190"> + </button> <panel - background_visible="true" + background_visible="true" bg_alpha_color="DkGray" visiblity_control="ShowDeviceSettings" border="false" @@ -357,8 +358,13 @@ label="DeviceSettings" layout="topleft" left="0" - name="Device Settings" + name="device_settings_panel" + class="panel_voice_device_settings" width="501"> + <panel.string + name="default_text"> + Default + </panel.string> <icon height="18" image_name="Microphone_On" @@ -382,6 +388,7 @@ </text> <combo_box height="19" + control_name="VoiceInputAudioDevice" layout="topleft" left="165" max_chars="128" @@ -400,7 +407,8 @@ width="200"> My volume: </text> - <slider + <slider_bar + control_name="AudioLevelMic" follows="left|top" height="17" increment="0.05" @@ -492,6 +500,7 @@ Output </text> <combo_box + control_name="VoiceOutputAudioDevice" height="19" layout="topleft" left="165" diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml index fe2f1423b74..f1401140deb 100644 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -2,6 +2,7 @@ <tab_container tab_min_width="60" tab_max_width="150" font_halign="center" + font="SansSerif" tab_height="21"> <first_tab tab_top_image_unselected="TabTop_Left_Off" tab_top_image_selected="TabTop_Left_Selected" -- GitLab From 5c2d187d6fb296876c2c3cba5817c749598f4283 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Wed, 4 Nov 2009 18:58:27 -0500 Subject: [PATCH 142/306] Small cleanup in LLAgentWearables.cpp --- indra/newview/llagentwearables.cpp | 6 +- indra/newview/llagentwearables.h | 6 +- indra/newview/llviewermenu.cpp | 102 +++-------------------------- 3 files changed, 15 insertions(+), 99 deletions(-) diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 7d215b57781..d8aca860d58 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1724,10 +1724,8 @@ void LLAgentWearables::queryWearableCache() // MULTI_WEARABLE: need a way to specify by wearable rather than by type. // User has picked "remove from avatar" from a menu. // static -void LLAgentWearables::userRemoveWearable(void* userdata) +void LLAgentWearables::userRemoveWearable(EWearableType& type) { - EWearableType type = (EWearableType)(intptr_t)userdata; - if (!(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR)) //&& //!((!gAgent.isTeen()) && (type==WT_UNDERPANTS || type==WT_UNDERSHIRT))) { @@ -1737,7 +1735,7 @@ void LLAgentWearables::userRemoveWearable(void* userdata) } // static -void LLAgentWearables::userRemoveAllClothes(void* userdata) +void LLAgentWearables::userRemoveAllClothes() { // We have to do this up front to avoid having to deal with the case of multiple wearables being dirty. if (gFloaterCustomize) diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 97de785c871..317f4a7e4fb 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -191,9 +191,9 @@ class LLAgentWearables //-------------------------------------------------------------------- public: // MULTI-WEARABLE: assuming one wearable per type. Need upstream changes. - static void userRemoveWearable(void* userdata); // userdata is EWearableType - static void userRemoveAllClothes(void* userdata); // userdata is NULL - + static void userRemoveWearable(EWearableType& type); + static void userRemoveAllClothes(); + typedef std::vector<LLViewerObject*> llvo_vec_t; static void userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 23ceb1e72d9..c85ed46cd60 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -7461,52 +7461,10 @@ class LLEditEnableTakeOff : public view_listener_t bool handleEvent(const LLSD& userdata) { std::string clothing = userdata.asString(); - bool new_value = false; - if (clothing == "shirt") - { - new_value = LLAgentWearables::selfHasWearable(WT_SHIRT); - } - if (clothing == "pants") - { - new_value = LLAgentWearables::selfHasWearable(WT_PANTS); - } - if (clothing == "shoes") - { - new_value = LLAgentWearables::selfHasWearable(WT_SHOES); - } - if (clothing == "socks") - { - new_value = LLAgentWearables::selfHasWearable(WT_SOCKS); - } - if (clothing == "jacket") - { - new_value = LLAgentWearables::selfHasWearable(WT_JACKET); - } - if (clothing == "gloves") - { - new_value = LLAgentWearables::selfHasWearable(WT_GLOVES); - } - if (clothing == "undershirt") - { - new_value = LLAgentWearables::selfHasWearable(WT_UNDERSHIRT); - } - if (clothing == "underpants") - { - new_value = LLAgentWearables::selfHasWearable(WT_UNDERPANTS); - } - if (clothing == "skirt") - { - new_value = LLAgentWearables::selfHasWearable(WT_SKIRT); - } - if (clothing == "alpha") - { - new_value = LLAgentWearables::selfHasWearable(WT_ALPHA); - } - if (clothing == "tattoo") - { - new_value = LLAgentWearables::selfHasWearable(WT_TATTOO); - } - return new_value; + EWearableType type = LLWearableDictionary::typeNameToType(clothing); + if (type >= WT_SHAPE && type < WT_COUNT) + return LLAgentWearables::selfHasWearable(type); + return false; } }; @@ -7515,53 +7473,13 @@ class LLEditTakeOff : public view_listener_t bool handleEvent(const LLSD& userdata) { std::string clothing = userdata.asString(); - if (clothing == "shirt") - { - LLAgentWearables::userRemoveWearable((void*)WT_SHIRT); - } - else if (clothing == "pants") - { - LLAgentWearables::userRemoveWearable((void*)WT_PANTS); - } - else if (clothing == "shoes") - { - LLAgentWearables::userRemoveWearable((void*)WT_SHOES); - } - else if (clothing == "socks") - { - LLAgentWearables::userRemoveWearable((void*)WT_SOCKS); - } - else if (clothing == "jacket") - { - LLAgentWearables::userRemoveWearable((void*)WT_JACKET); - } - else if (clothing == "gloves") - { - LLAgentWearables::userRemoveWearable((void*)WT_GLOVES); - } - else if (clothing == "undershirt") - { - LLAgentWearables::userRemoveWearable((void*)WT_UNDERSHIRT); - } - else if (clothing == "underpants") - { - LLAgentWearables::userRemoveWearable((void*)WT_UNDERPANTS); - } - else if (clothing == "skirt") - { - LLAgentWearables::userRemoveWearable((void*)WT_SKIRT); - } - else if (clothing == "alpha") - { - LLAgentWearables::userRemoveWearable((void*)WT_ALPHA); - } - else if (clothing == "tattoo") - { - LLAgentWearables::userRemoveWearable((void*)WT_TATTOO); - } - else if (clothing == "all") + if (clothing == "all") + LLAgentWearables::userRemoveAllClothes(); + else { - LLAgentWearables::userRemoveAllClothes(NULL); + EWearableType type = LLWearableDictionary::typeNameToType(clothing); + if (type >= WT_SHAPE && type < WT_COUNT) + LLAgentWearables::userRemoveWearable(type); } return true; } -- GitLab From 0bd2567bf5648808a95c7826581199bb371597cb Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Wed, 4 Nov 2009 15:59:04 -0800 Subject: [PATCH 143/306] Fix for DEV-42076 (media controls should not fade out while mouse is hovered over them). Updated LLPanelPrimMediaControls::isMouseOver() to do the right thing with the new structure of the panel. --- indra/newview/llpanelprimmediacontrols.cpp | 33 +++++++++++++--------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 58ca481b77b..0b2a7e8756b 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -691,24 +691,31 @@ bool LLPanelPrimMediaControls::isMouseOver() getWindow()->getCursorPosition(&cursor_pos_window); getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl); - LLPanel* controls_panel = NULL; - controls_panel = getChild<LLPanel>("media_hover_controls"); - if(controls_panel && !controls_panel->getVisible()) - { - // The hover controls aren't visible -- use the focused controls instead. - controls_panel = getChild<LLPanel>("media_focused_controls"); - } + LLView* controls_view = NULL; + controls_view = getChild<LLView>("media_controls"); - if(controls_panel && controls_panel->getVisible()) + if(controls_view && controls_view->getVisible()) { - controls_panel->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y); + controls_view->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y); - LLView *hit_child = controls_panel->childFromPoint(x, y); - if(hit_child) + LLView *hit_child = controls_view->childFromPoint(x, y); + if(hit_child && hit_child->getVisible()) { // This was useful for debugging both coordinate translation and view hieararchy problems... -// llinfos << "mouse coords: " << x << ", " << y << " hit child " << hit_child->getName() << llendl; - result = true; + // llinfos << "mouse coords: " << x << ", " << y << " hit child " << hit_child->getName() << llendl; + + // This will be a direct child of the LLLayoutStack, which should be a layout_panel. + // These may not shown/hidden by the logic in updateShape(), so we need to do another hit test on the children of the layout panel, + // which are the actual controls. + hit_child->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y); + + LLView *hit_child_2 = hit_child->childFromPoint(x, y); + if(hit_child_2 && hit_child_2->getVisible()) + { + // This was useful for debugging both coordinate translation and view hieararchy problems... + // llinfos << " mouse coords: " << x << ", " << y << " hit child 2 " << hit_child_2->getName() << llendl; + result = true; + } } } } -- GitLab From 33eac5dc0a1dfc0624dcfc75bec35155fbb9c917 Mon Sep 17 00:00:00 2001 From: Rick Pasetto <rick@lindenlab.com> Date: Wed, 4 Nov 2009 16:11:39 -0800 Subject: [PATCH 144/306] Fix typo in XUI file that broke media controls --- .../newview/skins/default/xui/en/panel_prim_media_controls.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index 7b34e2931ee..d384abf038a 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -254,7 +254,7 @@ image_selected="button_anim_pause.tga" image_unselected="button_anim_pause.tga" layout="topleft" - tool_tip = "Pause media" + tool_tip = "Pause media"> <button.commit_callback function="MediaCtrl.Pause" /> </button> -- GitLab From c527ade45beb1db2e1801646945812344a520ed0 Mon Sep 17 00:00:00 2001 From: "Eric M. Tulla (BigPapi)" <tulla@lindenlab.com> Date: Wed, 4 Nov 2009 19:27:00 -0500 Subject: [PATCH 145/306] Fix for DEV-32672 / VWR-13349. Prim move grid display wasn't mipmapping properly. --- indra/newview/llmaniptranslate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 2153f77336e..f1b3a37677a 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -163,7 +163,7 @@ void LLManipTranslate::restoreGL() GLuint* d = new GLuint[rez*rez]; - gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex->getTexName()); + gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex->getTexName(), true); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR); while (rez >= 1) -- GitLab From 1f0848969c6464648c6c60b771037f7a9eb98cad Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Wed, 4 Nov 2009 16:33:08 -0800 Subject: [PATCH 146/306] converted all floater titles to uppercase --- indra/newview/skins/default/xui/da/floater_about.xml | 2 +- indra/newview/skins/default/xui/da/floater_about_land.xml | 2 +- indra/newview/skins/default/xui/da/floater_auction.xml | 2 +- indra/newview/skins/default/xui/da/floater_avatar_picker.xml | 2 +- .../newview/skins/default/xui/da/floater_avatar_textures.xml | 2 +- indra/newview/skins/default/xui/da/floater_beacons.xml | 2 +- indra/newview/skins/default/xui/da/floater_build_options.xml | 2 +- indra/newview/skins/default/xui/da/floater_bulk_perms.xml | 2 +- indra/newview/skins/default/xui/da/floater_bumps.xml | 2 +- indra/newview/skins/default/xui/da/floater_buy_contents.xml | 2 +- indra/newview/skins/default/xui/da/floater_buy_currency.xml | 2 +- indra/newview/skins/default/xui/da/floater_buy_land.xml | 2 +- indra/newview/skins/default/xui/da/floater_buy_object.xml | 2 +- indra/newview/skins/default/xui/da/floater_choose_group.xml | 2 +- indra/newview/skins/default/xui/da/floater_color_picker.xml | 2 +- indra/newview/skins/default/xui/da/floater_customize.xml | 2 +- .../skins/default/xui/da/floater_day_cycle_options.xml | 2 +- .../newview/skins/default/xui/da/floater_device_settings.xml | 2 +- indra/newview/skins/default/xui/da/floater_env_settings.xml | 2 +- indra/newview/skins/default/xui/da/floater_font_test.xml | 2 +- indra/newview/skins/default/xui/da/floater_gesture.xml | 2 +- .../skins/default/xui/da/floater_hardware_settings.xml | 2 +- indra/newview/skins/default/xui/da/floater_hud.xml | 2 +- indra/newview/skins/default/xui/da/floater_inspect.xml | 2 +- indra/newview/skins/default/xui/da/floater_inventory.xml | 2 +- .../default/xui/da/floater_inventory_item_properties.xml | 2 +- .../skins/default/xui/da/floater_inventory_view_finder.xml | 2 +- indra/newview/skins/default/xui/da/floater_joystick.xml | 2 +- indra/newview/skins/default/xui/da/floater_lagmeter.xml | 2 +- indra/newview/skins/default/xui/da/floater_land_holdings.xml | 2 +- indra/newview/skins/default/xui/da/floater_live_lsleditor.xml | 2 +- indra/newview/skins/default/xui/da/floater_lsl_guide.xml | 2 +- indra/newview/skins/default/xui/da/floater_media_browser.xml | 2 +- indra/newview/skins/default/xui/da/floater_mem_leaking.xml | 2 +- indra/newview/skins/default/xui/da/floater_mute_object.xml | 2 +- indra/newview/skins/default/xui/da/floater_my_friends.xml | 2 +- indra/newview/skins/default/xui/da/floater_openobject.xml | 2 +- indra/newview/skins/default/xui/da/floater_perm_prefs.xml | 2 +- indra/newview/skins/default/xui/da/floater_postcard.xml | 2 +- indra/newview/skins/default/xui/da/floater_preferences.xml | 2 +- .../skins/default/xui/da/floater_preview_classified.xml | 2 +- indra/newview/skins/default/xui/da/floater_preview_event.xml | 2 +- .../newview/skins/default/xui/da/floater_preview_notecard.xml | 2 +- indra/newview/skins/default/xui/da/floater_region_info.xml | 2 +- indra/newview/skins/default/xui/da/floater_report_abuse.xml | 2 +- indra/newview/skins/default/xui/da/floater_script_debug.xml | 2 +- indra/newview/skins/default/xui/da/floater_script_preview.xml | 2 +- indra/newview/skins/default/xui/da/floater_script_queue.xml | 2 +- indra/newview/skins/default/xui/da/floater_script_search.xml | 2 +- indra/newview/skins/default/xui/da/floater_sell_land.xml | 2 +- indra/newview/skins/default/xui/da/floater_settings_debug.xml | 2 +- indra/newview/skins/default/xui/da/floater_snapshot.xml | 2 +- indra/newview/skins/default/xui/da/floater_sound_preview.xml | 2 +- indra/newview/skins/default/xui/da/floater_statistics.xml | 2 +- indra/newview/skins/default/xui/da/floater_telehub.xml | 2 +- indra/newview/skins/default/xui/da/floater_texture_ctrl.xml | 2 +- indra/newview/skins/default/xui/da/floater_tools.xml | 2 +- indra/newview/skins/default/xui/da/floater_top_objects.xml | 2 +- indra/newview/skins/default/xui/da/floater_water.xml | 2 +- .../skins/default/xui/da/floater_windlight_options.xml | 2 +- indra/newview/skins/default/xui/da/floater_world_map.xml | 2 +- indra/newview/skins/default/xui/de/floater_about.xml | 2 +- indra/newview/skins/default/xui/de/floater_about_land.xml | 2 +- indra/newview/skins/default/xui/de/floater_auction.xml | 2 +- indra/newview/skins/default/xui/de/floater_avatar_picker.xml | 2 +- .../newview/skins/default/xui/de/floater_avatar_textures.xml | 2 +- indra/newview/skins/default/xui/de/floater_beacons.xml | 2 +- indra/newview/skins/default/xui/de/floater_build_options.xml | 2 +- indra/newview/skins/default/xui/de/floater_bulk_perms.xml | 2 +- indra/newview/skins/default/xui/de/floater_bumps.xml | 2 +- indra/newview/skins/default/xui/de/floater_buy_contents.xml | 2 +- indra/newview/skins/default/xui/de/floater_buy_currency.xml | 2 +- indra/newview/skins/default/xui/de/floater_buy_land.xml | 2 +- indra/newview/skins/default/xui/de/floater_buy_object.xml | 2 +- indra/newview/skins/default/xui/de/floater_choose_group.xml | 2 +- indra/newview/skins/default/xui/de/floater_color_picker.xml | 2 +- indra/newview/skins/default/xui/de/floater_customize.xml | 2 +- .../skins/default/xui/de/floater_day_cycle_options.xml | 2 +- .../newview/skins/default/xui/de/floater_device_settings.xml | 2 +- indra/newview/skins/default/xui/de/floater_env_settings.xml | 2 +- indra/newview/skins/default/xui/de/floater_font_test.xml | 2 +- indra/newview/skins/default/xui/de/floater_gesture.xml | 2 +- indra/newview/skins/default/xui/de/floater_god_tools.xml | 2 +- .../skins/default/xui/de/floater_hardware_settings.xml | 2 +- indra/newview/skins/default/xui/de/floater_hud.xml | 2 +- indra/newview/skins/default/xui/de/floater_inspect.xml | 2 +- indra/newview/skins/default/xui/de/floater_inventory.xml | 2 +- .../default/xui/de/floater_inventory_item_properties.xml | 2 +- .../skins/default/xui/de/floater_inventory_view_finder.xml | 2 +- indra/newview/skins/default/xui/de/floater_joystick.xml | 2 +- indra/newview/skins/default/xui/de/floater_lagmeter.xml | 2 +- indra/newview/skins/default/xui/de/floater_land_holdings.xml | 2 +- indra/newview/skins/default/xui/de/floater_live_lsleditor.xml | 2 +- indra/newview/skins/default/xui/de/floater_lsl_guide.xml | 2 +- indra/newview/skins/default/xui/de/floater_media_browser.xml | 2 +- indra/newview/skins/default/xui/de/floater_mem_leaking.xml | 2 +- indra/newview/skins/default/xui/de/floater_mute_object.xml | 2 +- indra/newview/skins/default/xui/de/floater_my_friends.xml | 2 +- indra/newview/skins/default/xui/de/floater_notification.xml | 2 +- .../skins/default/xui/de/floater_notifications_console.xml | 2 +- indra/newview/skins/default/xui/de/floater_openobject.xml | 2 +- indra/newview/skins/default/xui/de/floater_perm_prefs.xml | 2 +- indra/newview/skins/default/xui/de/floater_post_process.xml | 2 +- indra/newview/skins/default/xui/de/floater_postcard.xml | 2 +- indra/newview/skins/default/xui/de/floater_preferences.xml | 2 +- .../skins/default/xui/de/floater_preview_classified.xml | 2 +- indra/newview/skins/default/xui/de/floater_preview_event.xml | 2 +- .../newview/skins/default/xui/de/floater_preview_notecard.xml | 2 +- indra/newview/skins/default/xui/de/floater_region_info.xml | 2 +- indra/newview/skins/default/xui/de/floater_report_abuse.xml | 2 +- indra/newview/skins/default/xui/de/floater_script_debug.xml | 2 +- indra/newview/skins/default/xui/de/floater_script_preview.xml | 2 +- indra/newview/skins/default/xui/de/floater_script_queue.xml | 2 +- indra/newview/skins/default/xui/de/floater_script_search.xml | 2 +- indra/newview/skins/default/xui/de/floater_sell_land.xml | 2 +- indra/newview/skins/default/xui/de/floater_settings_debug.xml | 2 +- indra/newview/skins/default/xui/de/floater_snapshot.xml | 2 +- indra/newview/skins/default/xui/de/floater_sound_preview.xml | 2 +- indra/newview/skins/default/xui/de/floater_statistics.xml | 2 +- indra/newview/skins/default/xui/de/floater_telehub.xml | 2 +- indra/newview/skins/default/xui/de/floater_texture_ctrl.xml | 2 +- indra/newview/skins/default/xui/de/floater_tools.xml | 2 +- indra/newview/skins/default/xui/de/floater_top_objects.xml | 2 +- indra/newview/skins/default/xui/de/floater_water.xml | 2 +- .../skins/default/xui/de/floater_windlight_options.xml | 2 +- indra/newview/skins/default/xui/de/floater_world_map.xml | 2 +- indra/newview/skins/default/xui/en/floater_aaa.xml | 2 +- indra/newview/skins/default/xui/en/floater_about.xml | 2 +- indra/newview/skins/default/xui/en/floater_about_land.xml | 4 ++-- indra/newview/skins/default/xui/en/floater_activeim.xml | 2 +- indra/newview/skins/default/xui/en/floater_auction.xml | 2 +- indra/newview/skins/default/xui/en/floater_avatar_picker.xml | 2 +- .../newview/skins/default/xui/en/floater_avatar_textures.xml | 2 +- indra/newview/skins/default/xui/en/floater_beacons.xml | 2 +- indra/newview/skins/default/xui/en/floater_build_options.xml | 2 +- indra/newview/skins/default/xui/en/floater_bulk_perms.xml | 2 +- indra/newview/skins/default/xui/en/floater_bumps.xml | 2 +- indra/newview/skins/default/xui/en/floater_buy_contents.xml | 2 +- indra/newview/skins/default/xui/en/floater_buy_currency.xml | 2 +- indra/newview/skins/default/xui/en/floater_buy_land.xml | 2 +- indra/newview/skins/default/xui/en/floater_buy_object.xml | 2 +- indra/newview/skins/default/xui/en/floater_choose_group.xml | 2 +- indra/newview/skins/default/xui/en/floater_color_picker.xml | 2 +- indra/newview/skins/default/xui/en/floater_customize.xml | 2 +- .../skins/default/xui/en/floater_day_cycle_options.xml | 2 +- .../newview/skins/default/xui/en/floater_device_settings.xml | 4 ++-- indra/newview/skins/default/xui/en/floater_env_settings.xml | 2 +- indra/newview/skins/default/xui/en/floater_font_test.xml | 2 +- indra/newview/skins/default/xui/en/floater_gesture.xml | 2 +- indra/newview/skins/default/xui/en/floater_god_tools.xml | 2 +- .../skins/default/xui/en/floater_hardware_settings.xml | 2 +- indra/newview/skins/default/xui/en/floater_help_browser.xml | 2 +- indra/newview/skins/default/xui/en/floater_hud.xml | 2 +- indra/newview/skins/default/xui/en/floater_incoming_call.xml | 2 +- indra/newview/skins/default/xui/en/floater_inspect.xml | 2 +- indra/newview/skins/default/xui/en/floater_inventory.xml | 2 +- .../default/xui/en/floater_inventory_item_properties.xml | 2 +- .../skins/default/xui/en/floater_inventory_view_finder.xml | 2 +- indra/newview/skins/default/xui/en/floater_joystick.xml | 2 +- indra/newview/skins/default/xui/en/floater_lagmeter.xml | 2 +- indra/newview/skins/default/xui/en/floater_land_holdings.xml | 2 +- indra/newview/skins/default/xui/en/floater_live_lsleditor.xml | 4 ++-- indra/newview/skins/default/xui/en/floater_lsl_guide.xml | 2 +- indra/newview/skins/default/xui/en/floater_media_browser.xml | 2 +- indra/newview/skins/default/xui/en/floater_media_settings.xml | 2 +- indra/newview/skins/default/xui/en/floater_mem_leaking.xml | 2 +- indra/newview/skins/default/xui/en/floater_mute_object.xml | 4 ++-- indra/newview/skins/default/xui/en/floater_my_friends.xml | 2 +- indra/newview/skins/default/xui/en/floater_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/en/floater_notification.xml | 2 +- .../skins/default/xui/en/floater_notifications_console.xml | 2 +- indra/newview/skins/default/xui/en/floater_openobject.xml | 2 +- indra/newview/skins/default/xui/en/floater_perm_prefs.xml | 2 +- indra/newview/skins/default/xui/en/floater_post_process.xml | 2 +- indra/newview/skins/default/xui/en/floater_postcard.xml | 2 +- indra/newview/skins/default/xui/en/floater_preferences.xml | 2 +- .../skins/default/xui/en/floater_preview_classified.xml | 2 +- indra/newview/skins/default/xui/en/floater_preview_event.xml | 4 ++-- .../skins/default/xui/en/floater_preview_gesture_info.xml | 4 ++-- .../skins/default/xui/en/floater_preview_gesture_shortcut.xml | 4 ++-- .../skins/default/xui/en/floater_preview_gesture_steps.xml | 4 ++-- .../newview/skins/default/xui/en/floater_preview_notecard.xml | 2 +- indra/newview/skins/default/xui/en/floater_region_info.xml | 2 +- indra/newview/skins/default/xui/en/floater_report_abuse.xml | 2 +- .../skins/default/xui/en/floater_script_debug_panel.xml | 4 ++-- indra/newview/skins/default/xui/en/floater_script_preview.xml | 2 +- indra/newview/skins/default/xui/en/floater_script_queue.xml | 2 +- indra/newview/skins/default/xui/en/floater_script_search.xml | 2 +- indra/newview/skins/default/xui/en/floater_search.xml | 2 +- indra/newview/skins/default/xui/en/floater_sell_land.xml | 2 +- indra/newview/skins/default/xui/en/floater_settings_debug.xml | 2 +- indra/newview/skins/default/xui/en/floater_snapshot.xml | 2 +- indra/newview/skins/default/xui/en/floater_sound_preview.xml | 2 +- indra/newview/skins/default/xui/en/floater_statistics.xml | 2 +- indra/newview/skins/default/xui/en/floater_stats.xml | 2 +- indra/newview/skins/default/xui/en/floater_telehub.xml | 2 +- .../newview/skins/default/xui/en/floater_test_inspectors.xml | 2 +- indra/newview/skins/default/xui/en/floater_test_widgets.xml | 2 +- indra/newview/skins/default/xui/en/floater_texture_ctrl.xml | 2 +- indra/newview/skins/default/xui/en/floater_tools.xml | 2 +- indra/newview/skins/default/xui/en/floater_top_objects.xml | 2 +- indra/newview/skins/default/xui/en/floater_ui_preview.xml | 2 +- indra/newview/skins/default/xui/en/floater_water.xml | 2 +- .../skins/default/xui/en/floater_windlight_options.xml | 2 +- indra/newview/skins/default/xui/en/floater_world_map.xml | 2 +- indra/newview/skins/default/xui/es/floater_about.xml | 2 +- indra/newview/skins/default/xui/es/floater_about_land.xml | 2 +- indra/newview/skins/default/xui/es/floater_auction.xml | 2 +- indra/newview/skins/default/xui/es/floater_avatar_picker.xml | 2 +- .../newview/skins/default/xui/es/floater_avatar_textures.xml | 2 +- indra/newview/skins/default/xui/es/floater_beacons.xml | 2 +- indra/newview/skins/default/xui/es/floater_build_options.xml | 2 +- indra/newview/skins/default/xui/es/floater_bulk_perms.xml | 2 +- indra/newview/skins/default/xui/es/floater_bumps.xml | 2 +- indra/newview/skins/default/xui/es/floater_buy_contents.xml | 2 +- indra/newview/skins/default/xui/es/floater_buy_currency.xml | 2 +- indra/newview/skins/default/xui/es/floater_buy_land.xml | 2 +- indra/newview/skins/default/xui/es/floater_buy_object.xml | 2 +- indra/newview/skins/default/xui/es/floater_choose_group.xml | 2 +- indra/newview/skins/default/xui/es/floater_color_picker.xml | 2 +- indra/newview/skins/default/xui/es/floater_customize.xml | 2 +- .../skins/default/xui/es/floater_day_cycle_options.xml | 2 +- .../newview/skins/default/xui/es/floater_device_settings.xml | 2 +- indra/newview/skins/default/xui/es/floater_env_settings.xml | 2 +- indra/newview/skins/default/xui/es/floater_font_test.xml | 2 +- indra/newview/skins/default/xui/es/floater_gesture.xml | 2 +- indra/newview/skins/default/xui/es/floater_god_tools.xml | 2 +- .../skins/default/xui/es/floater_hardware_settings.xml | 2 +- indra/newview/skins/default/xui/es/floater_hud.xml | 2 +- indra/newview/skins/default/xui/es/floater_inspect.xml | 2 +- indra/newview/skins/default/xui/es/floater_inventory.xml | 2 +- .../default/xui/es/floater_inventory_item_properties.xml | 2 +- .../skins/default/xui/es/floater_inventory_view_finder.xml | 2 +- indra/newview/skins/default/xui/es/floater_joystick.xml | 2 +- indra/newview/skins/default/xui/es/floater_lagmeter.xml | 2 +- indra/newview/skins/default/xui/es/floater_land_holdings.xml | 2 +- indra/newview/skins/default/xui/es/floater_live_lsleditor.xml | 2 +- indra/newview/skins/default/xui/es/floater_lsl_guide.xml | 2 +- indra/newview/skins/default/xui/es/floater_media_browser.xml | 2 +- indra/newview/skins/default/xui/es/floater_mem_leaking.xml | 2 +- indra/newview/skins/default/xui/es/floater_mute_object.xml | 2 +- indra/newview/skins/default/xui/es/floater_my_friends.xml | 2 +- indra/newview/skins/default/xui/es/floater_openobject.xml | 2 +- indra/newview/skins/default/xui/es/floater_perm_prefs.xml | 2 +- indra/newview/skins/default/xui/es/floater_post_process.xml | 2 +- indra/newview/skins/default/xui/es/floater_postcard.xml | 2 +- indra/newview/skins/default/xui/es/floater_preferences.xml | 2 +- .../skins/default/xui/es/floater_preview_classified.xml | 2 +- indra/newview/skins/default/xui/es/floater_preview_event.xml | 2 +- .../newview/skins/default/xui/es/floater_preview_notecard.xml | 2 +- indra/newview/skins/default/xui/es/floater_region_info.xml | 2 +- indra/newview/skins/default/xui/es/floater_report_abuse.xml | 2 +- indra/newview/skins/default/xui/es/floater_script_debug.xml | 2 +- indra/newview/skins/default/xui/es/floater_script_preview.xml | 2 +- indra/newview/skins/default/xui/es/floater_script_queue.xml | 2 +- indra/newview/skins/default/xui/es/floater_script_search.xml | 2 +- indra/newview/skins/default/xui/es/floater_sell_land.xml | 2 +- indra/newview/skins/default/xui/es/floater_settings_debug.xml | 2 +- indra/newview/skins/default/xui/es/floater_snapshot.xml | 2 +- indra/newview/skins/default/xui/es/floater_sound_preview.xml | 2 +- indra/newview/skins/default/xui/es/floater_statistics.xml | 2 +- indra/newview/skins/default/xui/es/floater_telehub.xml | 2 +- indra/newview/skins/default/xui/es/floater_texture_ctrl.xml | 2 +- indra/newview/skins/default/xui/es/floater_tools.xml | 2 +- indra/newview/skins/default/xui/es/floater_top_objects.xml | 2 +- indra/newview/skins/default/xui/es/floater_water.xml | 2 +- .../skins/default/xui/es/floater_windlight_options.xml | 2 +- indra/newview/skins/default/xui/es/floater_world_map.xml | 2 +- indra/newview/skins/default/xui/fr/floater_about.xml | 2 +- indra/newview/skins/default/xui/fr/floater_about_land.xml | 2 +- indra/newview/skins/default/xui/fr/floater_auction.xml | 2 +- indra/newview/skins/default/xui/fr/floater_avatar_picker.xml | 2 +- .../newview/skins/default/xui/fr/floater_avatar_textures.xml | 2 +- indra/newview/skins/default/xui/fr/floater_beacons.xml | 2 +- indra/newview/skins/default/xui/fr/floater_build_options.xml | 2 +- indra/newview/skins/default/xui/fr/floater_bulk_perms.xml | 2 +- indra/newview/skins/default/xui/fr/floater_bumps.xml | 2 +- indra/newview/skins/default/xui/fr/floater_buy_contents.xml | 2 +- indra/newview/skins/default/xui/fr/floater_buy_currency.xml | 2 +- indra/newview/skins/default/xui/fr/floater_buy_land.xml | 2 +- indra/newview/skins/default/xui/fr/floater_buy_object.xml | 2 +- indra/newview/skins/default/xui/fr/floater_choose_group.xml | 2 +- indra/newview/skins/default/xui/fr/floater_color_picker.xml | 2 +- indra/newview/skins/default/xui/fr/floater_customize.xml | 2 +- .../skins/default/xui/fr/floater_day_cycle_options.xml | 2 +- .../newview/skins/default/xui/fr/floater_device_settings.xml | 2 +- indra/newview/skins/default/xui/fr/floater_env_settings.xml | 2 +- indra/newview/skins/default/xui/fr/floater_font_test.xml | 2 +- indra/newview/skins/default/xui/fr/floater_gesture.xml | 2 +- indra/newview/skins/default/xui/fr/floater_god_tools.xml | 2 +- .../skins/default/xui/fr/floater_hardware_settings.xml | 2 +- indra/newview/skins/default/xui/fr/floater_hud.xml | 2 +- indra/newview/skins/default/xui/fr/floater_inspect.xml | 2 +- indra/newview/skins/default/xui/fr/floater_inventory.xml | 2 +- .../default/xui/fr/floater_inventory_item_properties.xml | 2 +- .../skins/default/xui/fr/floater_inventory_view_finder.xml | 2 +- indra/newview/skins/default/xui/fr/floater_joystick.xml | 2 +- indra/newview/skins/default/xui/fr/floater_lagmeter.xml | 2 +- indra/newview/skins/default/xui/fr/floater_land_holdings.xml | 2 +- indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml | 2 +- indra/newview/skins/default/xui/fr/floater_lsl_guide.xml | 2 +- indra/newview/skins/default/xui/fr/floater_media_browser.xml | 2 +- indra/newview/skins/default/xui/fr/floater_mem_leaking.xml | 2 +- indra/newview/skins/default/xui/fr/floater_mute_object.xml | 2 +- indra/newview/skins/default/xui/fr/floater_my_friends.xml | 2 +- indra/newview/skins/default/xui/fr/floater_notification.xml | 2 +- .../skins/default/xui/fr/floater_notifications_console.xml | 2 +- indra/newview/skins/default/xui/fr/floater_openobject.xml | 2 +- indra/newview/skins/default/xui/fr/floater_perm_prefs.xml | 2 +- indra/newview/skins/default/xui/fr/floater_post_process.xml | 2 +- indra/newview/skins/default/xui/fr/floater_postcard.xml | 2 +- indra/newview/skins/default/xui/fr/floater_preferences.xml | 2 +- .../skins/default/xui/fr/floater_preview_classified.xml | 2 +- indra/newview/skins/default/xui/fr/floater_preview_event.xml | 2 +- .../newview/skins/default/xui/fr/floater_preview_notecard.xml | 2 +- indra/newview/skins/default/xui/fr/floater_region_info.xml | 2 +- indra/newview/skins/default/xui/fr/floater_report_abuse.xml | 2 +- indra/newview/skins/default/xui/fr/floater_script_debug.xml | 2 +- indra/newview/skins/default/xui/fr/floater_script_preview.xml | 2 +- indra/newview/skins/default/xui/fr/floater_script_queue.xml | 2 +- indra/newview/skins/default/xui/fr/floater_script_search.xml | 2 +- indra/newview/skins/default/xui/fr/floater_sell_land.xml | 2 +- indra/newview/skins/default/xui/fr/floater_settings_debug.xml | 2 +- indra/newview/skins/default/xui/fr/floater_snapshot.xml | 2 +- indra/newview/skins/default/xui/fr/floater_sound_preview.xml | 2 +- indra/newview/skins/default/xui/fr/floater_statistics.xml | 2 +- indra/newview/skins/default/xui/fr/floater_telehub.xml | 2 +- indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml | 2 +- indra/newview/skins/default/xui/fr/floater_tools.xml | 2 +- indra/newview/skins/default/xui/fr/floater_top_objects.xml | 2 +- indra/newview/skins/default/xui/fr/floater_water.xml | 2 +- .../skins/default/xui/fr/floater_windlight_options.xml | 2 +- indra/newview/skins/default/xui/fr/floater_world_map.xml | 2 +- indra/newview/skins/default/xui/it/floater_about.xml | 2 +- indra/newview/skins/default/xui/it/floater_about_land.xml | 2 +- indra/newview/skins/default/xui/it/floater_auction.xml | 2 +- indra/newview/skins/default/xui/it/floater_avatar_picker.xml | 2 +- .../newview/skins/default/xui/it/floater_avatar_textures.xml | 2 +- indra/newview/skins/default/xui/it/floater_beacons.xml | 2 +- indra/newview/skins/default/xui/it/floater_build_options.xml | 2 +- indra/newview/skins/default/xui/it/floater_bulk_perms.xml | 2 +- indra/newview/skins/default/xui/it/floater_bumps.xml | 2 +- indra/newview/skins/default/xui/it/floater_buy_contents.xml | 2 +- indra/newview/skins/default/xui/it/floater_buy_currency.xml | 2 +- indra/newview/skins/default/xui/it/floater_buy_land.xml | 2 +- indra/newview/skins/default/xui/it/floater_buy_object.xml | 2 +- indra/newview/skins/default/xui/it/floater_choose_group.xml | 2 +- indra/newview/skins/default/xui/it/floater_color_picker.xml | 2 +- indra/newview/skins/default/xui/it/floater_customize.xml | 2 +- .../skins/default/xui/it/floater_day_cycle_options.xml | 2 +- .../newview/skins/default/xui/it/floater_device_settings.xml | 2 +- indra/newview/skins/default/xui/it/floater_env_settings.xml | 2 +- indra/newview/skins/default/xui/it/floater_font_test.xml | 2 +- indra/newview/skins/default/xui/it/floater_gesture.xml | 2 +- .../skins/default/xui/it/floater_hardware_settings.xml | 2 +- indra/newview/skins/default/xui/it/floater_hud.xml | 2 +- indra/newview/skins/default/xui/it/floater_inspect.xml | 2 +- indra/newview/skins/default/xui/it/floater_inventory.xml | 2 +- .../default/xui/it/floater_inventory_item_properties.xml | 2 +- .../skins/default/xui/it/floater_inventory_view_finder.xml | 2 +- indra/newview/skins/default/xui/it/floater_joystick.xml | 2 +- indra/newview/skins/default/xui/it/floater_lagmeter.xml | 2 +- indra/newview/skins/default/xui/it/floater_land_holdings.xml | 2 +- indra/newview/skins/default/xui/it/floater_live_lsleditor.xml | 2 +- indra/newview/skins/default/xui/it/floater_lsl_guide.xml | 2 +- indra/newview/skins/default/xui/it/floater_media_browser.xml | 2 +- indra/newview/skins/default/xui/it/floater_mem_leaking.xml | 2 +- indra/newview/skins/default/xui/it/floater_mute_object.xml | 2 +- indra/newview/skins/default/xui/it/floater_my_friends.xml | 2 +- indra/newview/skins/default/xui/it/floater_openobject.xml | 2 +- indra/newview/skins/default/xui/it/floater_perm_prefs.xml | 2 +- indra/newview/skins/default/xui/it/floater_post_process.xml | 2 +- indra/newview/skins/default/xui/it/floater_postcard.xml | 2 +- indra/newview/skins/default/xui/it/floater_preferences.xml | 2 +- .../skins/default/xui/it/floater_preview_classified.xml | 2 +- indra/newview/skins/default/xui/it/floater_preview_event.xml | 2 +- .../newview/skins/default/xui/it/floater_preview_notecard.xml | 2 +- indra/newview/skins/default/xui/it/floater_region_info.xml | 2 +- indra/newview/skins/default/xui/it/floater_report_abuse.xml | 2 +- indra/newview/skins/default/xui/it/floater_script_debug.xml | 2 +- indra/newview/skins/default/xui/it/floater_script_preview.xml | 2 +- indra/newview/skins/default/xui/it/floater_script_queue.xml | 2 +- indra/newview/skins/default/xui/it/floater_script_search.xml | 2 +- indra/newview/skins/default/xui/it/floater_sell_land.xml | 2 +- indra/newview/skins/default/xui/it/floater_settings_debug.xml | 2 +- indra/newview/skins/default/xui/it/floater_snapshot.xml | 2 +- indra/newview/skins/default/xui/it/floater_sound_preview.xml | 2 +- indra/newview/skins/default/xui/it/floater_statistics.xml | 2 +- indra/newview/skins/default/xui/it/floater_telehub.xml | 2 +- indra/newview/skins/default/xui/it/floater_texture_ctrl.xml | 2 +- indra/newview/skins/default/xui/it/floater_tools.xml | 2 +- indra/newview/skins/default/xui/it/floater_top_objects.xml | 2 +- indra/newview/skins/default/xui/it/floater_water.xml | 2 +- .../skins/default/xui/it/floater_windlight_options.xml | 2 +- indra/newview/skins/default/xui/it/floater_world_map.xml | 2 +- indra/newview/skins/default/xui/ja/floater_about.xml | 2 +- .../newview/skins/default/xui/ja/floater_device_settings.xml | 2 +- .../skins/default/xui/ja/floater_inventory_view_finder.xml | 2 +- indra/newview/skins/default/xui/ja/floater_lsl_guide.xml | 2 +- indra/newview/skins/default/xui/ja/floater_script_debug.xml | 2 +- indra/newview/skins/default/xui/ja/floater_sound_preview.xml | 2 +- indra/newview/skins/default/xui/nl/floater_about.xml | 2 +- indra/newview/skins/default/xui/nl/floater_about_land.xml | 2 +- indra/newview/skins/default/xui/nl/floater_auction.xml | 2 +- indra/newview/skins/default/xui/nl/floater_beacons.xml | 2 +- indra/newview/skins/default/xui/nl/floater_bulk_perms.xml | 2 +- indra/newview/skins/default/xui/nl/floater_bumps.xml | 2 +- indra/newview/skins/default/xui/nl/floater_buy_contents.xml | 2 +- indra/newview/skins/default/xui/nl/floater_buy_currency.xml | 2 +- indra/newview/skins/default/xui/nl/floater_buy_land.xml | 2 +- indra/newview/skins/default/xui/nl/floater_buy_object.xml | 2 +- indra/newview/skins/default/xui/nl/floater_choose_group.xml | 2 +- indra/newview/skins/default/xui/nl/floater_color_picker.xml | 2 +- indra/newview/skins/default/xui/nl/floater_customize.xml | 2 +- indra/newview/skins/default/xui/nl/floater_env_settings.xml | 2 +- indra/newview/skins/default/xui/nl/floater_font_test.xml | 2 +- indra/newview/skins/default/xui/nl/floater_gesture.xml | 2 +- indra/newview/skins/default/xui/nl/floater_hud.xml | 2 +- indra/newview/skins/default/xui/nl/floater_inspect.xml | 2 +- indra/newview/skins/default/xui/nl/floater_inventory.xml | 2 +- indra/newview/skins/default/xui/nl/floater_joystick.xml | 2 +- indra/newview/skins/default/xui/nl/floater_lagmeter.xml | 2 +- indra/newview/skins/default/xui/nl/floater_lsl_guide.xml | 2 +- indra/newview/skins/default/xui/nl/floater_mem_leaking.xml | 2 +- indra/newview/skins/default/xui/nl/floater_mute_object.xml | 2 +- indra/newview/skins/default/xui/nl/floater_my_friends.xml | 2 +- indra/newview/skins/default/xui/nl/floater_openobject.xml | 2 +- indra/newview/skins/default/xui/nl/floater_perm_prefs.xml | 2 +- indra/newview/skins/default/xui/nl/floater_post_process.xml | 2 +- indra/newview/skins/default/xui/nl/floater_postcard.xml | 2 +- indra/newview/skins/default/xui/nl/floater_preferences.xml | 2 +- indra/newview/skins/default/xui/nl/floater_region_info.xml | 2 +- indra/newview/skins/default/xui/nl/floater_report_abuse.xml | 2 +- indra/newview/skins/default/xui/nl/floater_script_debug.xml | 2 +- indra/newview/skins/default/xui/nl/floater_script_queue.xml | 2 +- indra/newview/skins/default/xui/nl/floater_sell_land.xml | 2 +- indra/newview/skins/default/xui/nl/floater_snapshot.xml | 2 +- indra/newview/skins/default/xui/nl/floater_statistics.xml | 2 +- indra/newview/skins/default/xui/nl/floater_telehub.xml | 2 +- indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml | 2 +- indra/newview/skins/default/xui/nl/floater_tools.xml | 2 +- indra/newview/skins/default/xui/nl/floater_top_objects.xml | 2 +- indra/newview/skins/default/xui/nl/floater_water.xml | 2 +- indra/newview/skins/default/xui/nl/floater_world_map.xml | 2 +- indra/newview/skins/default/xui/pl/floater_about_land.xml | 2 +- indra/newview/skins/default/xui/pl/floater_auction.xml | 2 +- indra/newview/skins/default/xui/pl/floater_avatar_picker.xml | 2 +- .../newview/skins/default/xui/pl/floater_avatar_textures.xml | 2 +- indra/newview/skins/default/xui/pl/floater_beacons.xml | 2 +- indra/newview/skins/default/xui/pl/floater_build_options.xml | 2 +- indra/newview/skins/default/xui/pl/floater_bulk_perms.xml | 2 +- indra/newview/skins/default/xui/pl/floater_bumps.xml | 2 +- indra/newview/skins/default/xui/pl/floater_buy_contents.xml | 2 +- indra/newview/skins/default/xui/pl/floater_buy_currency.xml | 2 +- indra/newview/skins/default/xui/pl/floater_buy_land.xml | 2 +- indra/newview/skins/default/xui/pl/floater_buy_object.xml | 2 +- indra/newview/skins/default/xui/pl/floater_choose_group.xml | 2 +- indra/newview/skins/default/xui/pl/floater_color_picker.xml | 2 +- indra/newview/skins/default/xui/pl/floater_customize.xml | 2 +- .../skins/default/xui/pl/floater_day_cycle_options.xml | 2 +- .../newview/skins/default/xui/pl/floater_device_settings.xml | 2 +- indra/newview/skins/default/xui/pl/floater_env_settings.xml | 2 +- indra/newview/skins/default/xui/pl/floater_font_test.xml | 2 +- indra/newview/skins/default/xui/pl/floater_gesture.xml | 2 +- indra/newview/skins/default/xui/pl/floater_god_tools.xml | 2 +- .../skins/default/xui/pl/floater_hardware_settings.xml | 2 +- indra/newview/skins/default/xui/pl/floater_hud.xml | 2 +- indra/newview/skins/default/xui/pl/floater_inspect.xml | 2 +- indra/newview/skins/default/xui/pl/floater_inventory.xml | 2 +- .../default/xui/pl/floater_inventory_item_properties.xml | 2 +- .../skins/default/xui/pl/floater_inventory_view_finder.xml | 2 +- indra/newview/skins/default/xui/pl/floater_joystick.xml | 4 ++-- indra/newview/skins/default/xui/pl/floater_lagmeter.xml | 2 +- indra/newview/skins/default/xui/pl/floater_land_holdings.xml | 2 +- indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml | 2 +- indra/newview/skins/default/xui/pl/floater_lsl_guide.xml | 2 +- indra/newview/skins/default/xui/pl/floater_media_browser.xml | 2 +- indra/newview/skins/default/xui/pl/floater_mem_leaking.xml | 2 +- indra/newview/skins/default/xui/pl/floater_mute_object.xml | 2 +- indra/newview/skins/default/xui/pl/floater_my_friends.xml | 2 +- indra/newview/skins/default/xui/pl/floater_openobject.xml | 2 +- indra/newview/skins/default/xui/pl/floater_perm_prefs.xml | 2 +- indra/newview/skins/default/xui/pl/floater_post_process.xml | 2 +- indra/newview/skins/default/xui/pl/floater_postcard.xml | 2 +- indra/newview/skins/default/xui/pl/floater_preferences.xml | 2 +- .../skins/default/xui/pl/floater_preview_classified.xml | 2 +- indra/newview/skins/default/xui/pl/floater_preview_event.xml | 2 +- .../newview/skins/default/xui/pl/floater_preview_notecard.xml | 2 +- indra/newview/skins/default/xui/pl/floater_region_info.xml | 2 +- indra/newview/skins/default/xui/pl/floater_report_abuse.xml | 2 +- indra/newview/skins/default/xui/pl/floater_script_debug.xml | 2 +- indra/newview/skins/default/xui/pl/floater_script_preview.xml | 2 +- indra/newview/skins/default/xui/pl/floater_script_queue.xml | 2 +- indra/newview/skins/default/xui/pl/floater_script_search.xml | 2 +- indra/newview/skins/default/xui/pl/floater_sell_land.xml | 2 +- indra/newview/skins/default/xui/pl/floater_settings_debug.xml | 2 +- indra/newview/skins/default/xui/pl/floater_snapshot.xml | 2 +- indra/newview/skins/default/xui/pl/floater_sound_preview.xml | 2 +- indra/newview/skins/default/xui/pl/floater_statistics.xml | 2 +- indra/newview/skins/default/xui/pl/floater_telehub.xml | 2 +- indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml | 2 +- indra/newview/skins/default/xui/pl/floater_tools.xml | 2 +- indra/newview/skins/default/xui/pl/floater_top_objects.xml | 2 +- indra/newview/skins/default/xui/pl/floater_water.xml | 2 +- .../skins/default/xui/pl/floater_windlight_options.xml | 2 +- indra/newview/skins/default/xui/pl/floater_world_map.xml | 2 +- indra/newview/skins/default/xui/pt/floater_about.xml | 2 +- indra/newview/skins/default/xui/pt/floater_about_land.xml | 2 +- indra/newview/skins/default/xui/pt/floater_auction.xml | 2 +- indra/newview/skins/default/xui/pt/floater_avatar_picker.xml | 2 +- .../newview/skins/default/xui/pt/floater_avatar_textures.xml | 2 +- indra/newview/skins/default/xui/pt/floater_beacons.xml | 2 +- indra/newview/skins/default/xui/pt/floater_build_options.xml | 2 +- indra/newview/skins/default/xui/pt/floater_bulk_perms.xml | 2 +- indra/newview/skins/default/xui/pt/floater_bumps.xml | 2 +- indra/newview/skins/default/xui/pt/floater_buy_contents.xml | 2 +- indra/newview/skins/default/xui/pt/floater_buy_currency.xml | 2 +- indra/newview/skins/default/xui/pt/floater_buy_land.xml | 2 +- indra/newview/skins/default/xui/pt/floater_buy_object.xml | 2 +- indra/newview/skins/default/xui/pt/floater_choose_group.xml | 2 +- indra/newview/skins/default/xui/pt/floater_color_picker.xml | 2 +- indra/newview/skins/default/xui/pt/floater_customize.xml | 2 +- .../skins/default/xui/pt/floater_day_cycle_options.xml | 2 +- .../newview/skins/default/xui/pt/floater_device_settings.xml | 2 +- indra/newview/skins/default/xui/pt/floater_env_settings.xml | 2 +- indra/newview/skins/default/xui/pt/floater_font_test.xml | 2 +- indra/newview/skins/default/xui/pt/floater_gesture.xml | 2 +- indra/newview/skins/default/xui/pt/floater_god_tools.xml | 2 +- .../skins/default/xui/pt/floater_hardware_settings.xml | 2 +- indra/newview/skins/default/xui/pt/floater_hud.xml | 2 +- indra/newview/skins/default/xui/pt/floater_inspect.xml | 2 +- indra/newview/skins/default/xui/pt/floater_inventory.xml | 2 +- .../default/xui/pt/floater_inventory_item_properties.xml | 2 +- .../skins/default/xui/pt/floater_inventory_view_finder.xml | 2 +- indra/newview/skins/default/xui/pt/floater_joystick.xml | 2 +- indra/newview/skins/default/xui/pt/floater_lagmeter.xml | 2 +- indra/newview/skins/default/xui/pt/floater_land_holdings.xml | 2 +- indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml | 2 +- indra/newview/skins/default/xui/pt/floater_lsl_guide.xml | 2 +- indra/newview/skins/default/xui/pt/floater_media_browser.xml | 2 +- indra/newview/skins/default/xui/pt/floater_mem_leaking.xml | 2 +- indra/newview/skins/default/xui/pt/floater_mute_object.xml | 2 +- indra/newview/skins/default/xui/pt/floater_my_friends.xml | 2 +- indra/newview/skins/default/xui/pt/floater_openobject.xml | 2 +- indra/newview/skins/default/xui/pt/floater_perm_prefs.xml | 2 +- indra/newview/skins/default/xui/pt/floater_post_process.xml | 2 +- indra/newview/skins/default/xui/pt/floater_postcard.xml | 2 +- indra/newview/skins/default/xui/pt/floater_preferences.xml | 2 +- .../skins/default/xui/pt/floater_preview_classified.xml | 2 +- indra/newview/skins/default/xui/pt/floater_preview_event.xml | 2 +- .../newview/skins/default/xui/pt/floater_preview_notecard.xml | 2 +- indra/newview/skins/default/xui/pt/floater_region_info.xml | 2 +- indra/newview/skins/default/xui/pt/floater_report_abuse.xml | 2 +- indra/newview/skins/default/xui/pt/floater_script_debug.xml | 2 +- indra/newview/skins/default/xui/pt/floater_script_preview.xml | 2 +- indra/newview/skins/default/xui/pt/floater_script_queue.xml | 2 +- indra/newview/skins/default/xui/pt/floater_script_search.xml | 2 +- indra/newview/skins/default/xui/pt/floater_sell_land.xml | 2 +- indra/newview/skins/default/xui/pt/floater_settings_debug.xml | 2 +- indra/newview/skins/default/xui/pt/floater_snapshot.xml | 2 +- indra/newview/skins/default/xui/pt/floater_sound_preview.xml | 2 +- indra/newview/skins/default/xui/pt/floater_statistics.xml | 2 +- indra/newview/skins/default/xui/pt/floater_telehub.xml | 2 +- indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml | 2 +- indra/newview/skins/default/xui/pt/floater_tools.xml | 2 +- indra/newview/skins/default/xui/pt/floater_top_objects.xml | 2 +- indra/newview/skins/default/xui/pt/floater_water.xml | 2 +- .../skins/default/xui/pt/floater_windlight_options.xml | 2 +- indra/newview/skins/default/xui/pt/floater_world_map.xml | 2 +- 569 files changed, 579 insertions(+), 579 deletions(-) diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml index 81d4d3fdfdb..f0c9c45d041 100644 --- a/indra/newview/skins/default/xui/da/floater_about.xml +++ b/indra/newview/skins/default/xui/da/floater_about.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_about" title="Om [APP_NAME]"> +<floater name="floater_about" title="OM [APP_NAME]"> <tab_container name="about_tab"> <panel name="credits_panel"> <text_editor name="credits_editor"> diff --git a/indra/newview/skins/default/xui/da/floater_about_land.xml b/indra/newview/skins/default/xui/da/floater_about_land.xml index c4cf722159c..cb5d618dde2 100644 --- a/indra/newview/skins/default/xui/da/floater_about_land.xml +++ b/indra/newview/skins/default/xui/da/floater_about_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="Om land"> +<floater name="floaterland" title="OM LAND"> <tab_container name="landtab"> <panel label="Generelt" name="land_general_panel"> <text name="Name:"> diff --git a/indra/newview/skins/default/xui/da/floater_auction.xml b/indra/newview/skins/default/xui/da/floater_auction.xml index f981242f8a9..8f793557bea 100644 --- a/indra/newview/skins/default/xui/da/floater_auction.xml +++ b/indra/newview/skins/default/xui/da/floater_auction.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_auction" title="Start Linden land salg"> +<floater name="floater_auction" title="START LINDEN LAND SALG"> <check_box label="Vis ogsÃ¥ gul aftegning af omrÃ¥de" name="fence_check" /> <button label="Foto" label_selected="Foto" name="snapshot_btn" /> <button label="OK" label_selected="OK" name="ok_btn" /> diff --git a/indra/newview/skins/default/xui/da/floater_avatar_picker.xml b/indra/newview/skins/default/xui/da/floater_avatar_picker.xml index f93f0a35254..0ddb6e9dbe5 100644 --- a/indra/newview/skins/default/xui/da/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/da/floater_avatar_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="Vælg beboer"> +<floater name="avatarpicker" title="VÆLG BEBOER"> <tab_container name="ResidentChooserTabs"> <panel label="Søg" name="SearchPanel"> <text name="InstructSearchResidentName"> diff --git a/indra/newview/skins/default/xui/da/floater_avatar_textures.xml b/indra/newview/skins/default/xui/da/floater_avatar_textures.xml index e3a736b200d..27bfa367f65 100644 --- a/indra/newview/skins/default/xui/da/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/da/floater_avatar_textures.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="avatar_texture_debug" title="Avatar teksturer"> +<floater name="avatar_texture_debug" title="AVATAR TEKSTURER"> <text name="baked_label"> Faste teksturer </text> diff --git a/indra/newview/skins/default/xui/da/floater_beacons.xml b/indra/newview/skins/default/xui/da/floater_beacons.xml index 318a23df4c0..18bc7aeb31d 100644 --- a/indra/newview/skins/default/xui/da/floater_beacons.xml +++ b/indra/newview/skins/default/xui/da/floater_beacons.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="beacons" title="Pejlelys"> +<floater name="beacons" title="PEJLELYS"> <panel name="beacons_panel"> <check_box label="Kun scriptede objekter med "rør"" name="touch_only" /> <check_box label="Scriptede objekter" name="scripted" /> diff --git a/indra/newview/skins/default/xui/da/floater_build_options.xml b/indra/newview/skins/default/xui/da/floater_build_options.xml index 3b3e14ad642..7eb0d4c035c 100644 --- a/indra/newview/skins/default/xui/da/floater_build_options.xml +++ b/indra/newview/skins/default/xui/da/floater_build_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="build options floater" title="Gitter indstillinger"> +<floater name="build options floater" title="GITTER INDSTILLINGER"> <spinner label="Gitter enhed (meter)" name="GridResolution" width="200" label_width="136"/> <spinner label="Gitter rækkevidde (meter)" name="GridDrawSize" width="200" label_width="136"/> <check_box label="Aktiver lÃ¥sning til under-enheder" name="GridSubUnit" /> diff --git a/indra/newview/skins/default/xui/da/floater_bulk_perms.xml b/indra/newview/skins/default/xui/da/floater_bulk_perms.xml index 77ae7fe0608..9cf44d64791 100644 --- a/indra/newview/skins/default/xui/da/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/da/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="Masse-ændring af rettigheder pÃ¥ indhold"> +<floater name="floaterbulkperms" title="MASSE-ÆNDRING AF RETTIGHEDER PÃ… INDHOLD"> <text name="applyto"> Indholdstyper </text> diff --git a/indra/newview/skins/default/xui/da/floater_bumps.xml b/indra/newview/skins/default/xui/da/floater_bumps.xml index 62a1cd9e5c8..704e6c36085 100644 --- a/indra/newview/skins/default/xui/da/floater_bumps.xml +++ b/indra/newview/skins/default/xui/da/floater_bumps.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_bumps" title="Bump, skub & slag"> +<floater name="floater_bumps" title="BUMP, SKUB & SLAG"> <string name="none_detected"> Ingen registreret </string> diff --git a/indra/newview/skins/default/xui/da/floater_buy_contents.xml b/indra/newview/skins/default/xui/da/floater_buy_contents.xml index c9df548747a..8dccf32304d 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_contents.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_buy_contents" title="Køb indhold"> +<floater name="floater_buy_contents" title="KØB INDHOLD"> <text name="contains_text"> [NAME] indeholder: </text> diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml index 1c5876572b5..a2b6dec91c5 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="buy currency" title="Køb valuta"> +<floater name="buy currency" title="KØB VALUTA"> <text name="info_buying"> Køber valuta: </text> diff --git a/indra/newview/skins/default/xui/da/floater_buy_land.xml b/indra/newview/skins/default/xui/da/floater_buy_land.xml index 1d42ffb45a8..71e6eaa7f7d 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy land" title="Køb land"> +<floater name="buy land" title="KØB LAND"> <text name="region_name_label"> Region: </text> diff --git a/indra/newview/skins/default/xui/da/floater_buy_object.xml b/indra/newview/skins/default/xui/da/floater_buy_object.xml index f0e22c8eeea..266753902ba 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="contents" title="Køb kopi af objekt"> +<floater name="contents" title="KØB KOPI AF OBJEKT"> <text name="contents_text"> og dets indhold: </text> diff --git a/indra/newview/skins/default/xui/da/floater_choose_group.xml b/indra/newview/skins/default/xui/da/floater_choose_group.xml index 01c5bf33672..9f02f281db3 100644 --- a/indra/newview/skins/default/xui/da/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/da/floater_choose_group.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="groups" title="Grupper"> +<floater name="groups" title="GRUPPER"> <text name="groupdesc"> Vælg en gruppe: </text> diff --git a/indra/newview/skins/default/xui/da/floater_color_picker.xml b/indra/newview/skins/default/xui/da/floater_color_picker.xml index c8e1fc813b4..d0a47b76e03 100644 --- a/indra/newview/skins/default/xui/da/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/da/floater_color_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="ColorPicker" title="Farve vælger"> +<floater name="ColorPicker" title="FARVE VÆLGER"> <text name="r_val_text"> Rød: </text> diff --git a/indra/newview/skins/default/xui/da/floater_customize.xml b/indra/newview/skins/default/xui/da/floater_customize.xml index b434bea1ced..b2409f16822 100644 --- a/indra/newview/skins/default/xui/da/floater_customize.xml +++ b/indra/newview/skins/default/xui/da/floater_customize.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="Appearance" width="509"> +<floater name="floater customize" title="APPEARANCE" width="509"> <tab_container name="customize tab container" width="507"> <placeholder label="Krops Dele" name="body_parts_placeholder"/> <panel label="Kropsbygning" name="Shape"> diff --git a/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml index 0ca7874c37b..94cf4546e31 100644 --- a/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Day Cycle Floater" title="Dag cyklus opsætning"> +<floater name="Day Cycle Floater" title="DAG CYKLUS OPSÆTNING"> <tab_container name="Day Cycle Tabs"> <panel label="Dag cyklus" name="Day Cycle"> <button label="?" name="WLDayCycleHelp" /> diff --git a/indra/newview/skins/default/xui/da/floater_device_settings.xml b/indra/newview/skins/default/xui/da/floater_device_settings.xml index 28afd7c459b..5e53a697f2f 100644 --- a/indra/newview/skins/default/xui/da/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/da/floater_device_settings.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_device_settings" title="Stemme chat indstillinger" /> +<floater name="floater_device_settings" title="STEMME CHAT INDSTILLINGER" /> diff --git a/indra/newview/skins/default/xui/da/floater_env_settings.xml b/indra/newview/skins/default/xui/da/floater_env_settings.xml index 907771c67a2..6c5b6d3b6b1 100644 --- a/indra/newview/skins/default/xui/da/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/da/floater_env_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Environment Editor Floater" title="Redigering af omgivelser"> +<floater name="Environment Editor Floater" title="REDIGERING AF OMGIVELSER"> <text name="EnvTimeText"> Tid pÃ¥ dagen </text> diff --git a/indra/newview/skins/default/xui/da/floater_font_test.xml b/indra/newview/skins/default/xui/da/floater_font_test.xml index 7d8ef1b3105..591d07188cf 100644 --- a/indra/newview/skins/default/xui/da/floater_font_test.xml +++ b/indra/newview/skins/default/xui/da/floater_font_test.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Font test"> +<floater name="contents" title="FONT TEST"> <text name="linea"> OverrideTest, skal vises her som fonten 'Times'. (Fra default/xui/en-us) </text> diff --git a/indra/newview/skins/default/xui/da/floater_gesture.xml b/indra/newview/skins/default/xui/da/floater_gesture.xml index 800693ea8c3..11ecc8bd9a8 100644 --- a/indra/newview/skins/default/xui/da/floater_gesture.xml +++ b/indra/newview/skins/default/xui/da/floater_gesture.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="gestures" title="Aktive bevægelser"> +<floater name="gestures" title="AKTIVE BEVÆGELSER"> <text name="help_label"> Dobbelt-klik pÃ¥ en bevægelse for at afspille animation og lyd. </text> diff --git a/indra/newview/skins/default/xui/da/floater_hardware_settings.xml b/indra/newview/skins/default/xui/da/floater_hardware_settings.xml index dcc1b8d2e8e..fc1231ceef0 100644 --- a/indra/newview/skins/default/xui/da/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/da/floater_hardware_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Hardware Settings Floater" title="Hardware opsætning"> +<floater name="Hardware Settings Floater" title="HARDWARE OPSÆTNING"> <text name="Filtering:"> Filtrering: </text> diff --git a/indra/newview/skins/default/xui/da/floater_hud.xml b/indra/newview/skins/default/xui/da/floater_hud.xml index 0f11e2346da..18584e57cae 100644 --- a/indra/newview/skins/default/xui/da/floater_hud.xml +++ b/indra/newview/skins/default/xui/da/floater_hud.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_hud" title="Tutorial" /> +<floater name="floater_hud" title="TUTORIAL" /> diff --git a/indra/newview/skins/default/xui/da/floater_inspect.xml b/indra/newview/skins/default/xui/da/floater_inspect.xml index 56c3f6f7844..0610e9408fb 100644 --- a/indra/newview/skins/default/xui/da/floater_inspect.xml +++ b/indra/newview/skins/default/xui/da/floater_inspect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="inspect" title="Inspecér objekter"> +<floater name="inspect" title="INSPECÉR OBJEKTER"> <scroll_list name="object_list" tool_tip="Vælg et objekt fra listen for at markere det"> <column label="Objekt navn" name="object_name"/> <column label="Objekt ejer" name="owner_name"/> diff --git a/indra/newview/skins/default/xui/da/floater_inventory.xml b/indra/newview/skins/default/xui/da/floater_inventory.xml index 0b931bd7f46..8bfe7164d0c 100644 --- a/indra/newview/skins/default/xui/da/floater_inventory.xml +++ b/indra/newview/skins/default/xui/da/floater_inventory.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Inventory" title="Beholdning"> +<floater name="Inventory" title="BEHOLDNING"> <search_editor label="Skriv her for at søge" name="inventory search editor" /> <tab_container name="inventory filter tabs"> <inventory_panel label="Alle ting" name="All Items" /> diff --git a/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml index 9f28440fb0c..fbcf202c54d 100644 --- a/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="item properties" title="Egenskaber for Objekt i Beholdning"> +<floater name="item properties" title="EGENSKABER FOR OBJEKT I BEHOLDNING"> <text name="LabelItemNameTitle"> Navn: </text> diff --git a/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml index 60a7d78aead..af2910fe589 100644 --- a/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/da/floater_inventory_view_finder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Inventory Finder" title="inventory_recent_items"> +<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS"> <check_box label="Animation" name="check_animation" /> <check_box label="Visitkort" name="check_calling_card" /> <check_box label="Tøj" name="check_clothing" /> diff --git a/indra/newview/skins/default/xui/da/floater_joystick.xml b/indra/newview/skins/default/xui/da/floater_joystick.xml index 280650a04b2..4954b7b619e 100644 --- a/indra/newview/skins/default/xui/da/floater_joystick.xml +++ b/indra/newview/skins/default/xui/da/floater_joystick.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Joystick" title="Joystick opsætning"> +<floater name="Joystick" title="JOYSTICK OPSÆTNING"> <check_box name="enable_joystick" label="Aktiver Joystick:"/> <spinner label="X akse mapping" name="JoystickAxis1"/> <spinner label="Y akse mapping" name="JoystickAxis2"/> diff --git a/indra/newview/skins/default/xui/da/floater_lagmeter.xml b/indra/newview/skins/default/xui/da/floater_lagmeter.xml index 7e7c2dc0d3e..bcf15ea9262 100644 --- a/indra/newview/skins/default/xui/da/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/da/floater_lagmeter.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_lagmeter" title="Lag mÃ¥ler"> +<floater name="floater_lagmeter" title="LAG MÃ…LER"> <button label="" label_selected="" name="client_lagmeter" tool_tip="Status for klient lag"/> <text name="client"> Klient: diff --git a/indra/newview/skins/default/xui/da/floater_land_holdings.xml b/indra/newview/skins/default/xui/da/floater_land_holdings.xml index bd623e7b757..39c906eb183 100644 --- a/indra/newview/skins/default/xui/da/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/da/floater_land_holdings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="Mit land"> +<floater name="land holdings floater" title="MIT LAND"> <scroll_list name="parcel list"> <column label="Navn" name="name"/> <column label="Region" name="location"/> diff --git a/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml index 112dc70e452..cfc5fb8860b 100644 --- a/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="Script: Nyt script"> +<floater name="script ed float" title="SCRIPT: NYT SCRIPT"> <button label="Nulstil" label_selected="Reset" name="Reset" /> <check_box label="Kører" name="running" /> <check_box label="Mono" name="mono" /> diff --git a/indra/newview/skins/default/xui/da/floater_lsl_guide.xml b/indra/newview/skins/default/xui/da/floater_lsl_guide.xml index d3454098591..ebc86c5c732 100644 --- a/indra/newview/skins/default/xui/da/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/da/floater_lsl_guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="LSL Wiki"> +<floater name="script ed float" title="LSL WIKI"> <check_box label="Følg markøreren" name="lock_check" /> <combo_box label="LÃ¥s" name="history_combo" left_delta="114" width="70"/> <button label="Tilbage" name="back_btn" /> diff --git a/indra/newview/skins/default/xui/da/floater_media_browser.xml b/indra/newview/skins/default/xui/da/floater_media_browser.xml index 50004cfa0c1..47667973ba3 100644 --- a/indra/newview/skins/default/xui/da/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/da/floater_media_browser.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_about" title="Medie vælger"> +<floater name="floater_about" title="MEDIE VÆLGER"> <layout_stack name="stack1"> <layout_panel name="nav_controls"> <button label="Tilbage" name="back" /> diff --git a/indra/newview/skins/default/xui/da/floater_mem_leaking.xml b/indra/newview/skins/default/xui/da/floater_mem_leaking.xml index 6d5b5bc0cec..e7ad821d408 100644 --- a/indra/newview/skins/default/xui/da/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/da/floater_mem_leaking.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="MemLeak" title="Memory Leaking Simulation"> +<floater name="MemLeak" title="MEMORY LEAKING SIMULATION"> <spinner label="Leaking Speed (bytes per frame):" name="leak_speed" /> <spinner label="Max Leaked Memory (MB):" name="max_leak" /> <text name="total_leaked_label"> diff --git a/indra/newview/skins/default/xui/da/floater_mute_object.xml b/indra/newview/skins/default/xui/da/floater_mute_object.xml index e64557b177e..4145918b495 100644 --- a/indra/newview/skins/default/xui/da/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/da/floater_mute_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="mute by name" title="Bloker objekt via navn"> +<floater name="mute by name" title="BLOKER OBJEKT VIA NAVN"> <text name="message"> Blokering via navn har ikke betydning for lyde. Du skal skrive det præcise navn pÃ¥ objektet. diff --git a/indra/newview/skins/default/xui/da/floater_my_friends.xml b/indra/newview/skins/default/xui/da/floater_my_friends.xml index 687266a08a1..54b401076cd 100644 --- a/indra/newview/skins/default/xui/da/floater_my_friends.xml +++ b/indra/newview/skins/default/xui/da/floater_my_friends.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_my_friends" title="Kontakter"> +<floater name="floater_my_friends" title="KONTAKTER"> <tab_container name="friends_and_groups"> <panel label="Venner" name="friends_panel" /> <panel label="Grupper" name="groups_panel" /> diff --git a/indra/newview/skins/default/xui/da/floater_openobject.xml b/indra/newview/skins/default/xui/da/floater_openobject.xml index d37e3177fa1..5875b7a967f 100644 --- a/indra/newview/skins/default/xui/da/floater_openobject.xml +++ b/indra/newview/skins/default/xui/da/floater_openobject.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="objectcontents" title="Objekt indhold"> +<floater name="objectcontents" title="OBJEKT INDHOLD"> <text name="object_name"> [DESC]: </text> diff --git a/indra/newview/skins/default/xui/da/floater_perm_prefs.xml b/indra/newview/skins/default/xui/da/floater_perm_prefs.xml index f4b9b0a664e..69a8d3af94f 100644 --- a/indra/newview/skins/default/xui/da/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/da/floater_perm_prefs.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="perm prefs" title="Standard tilladelser ved hentning"> +<floater name="perm prefs" title="STANDARD TILLADELSER VED HENTNING"> <panel label="Tilladelser" name="permissions"> <button label="?" label_selected="?" name="help"/> <check_box label="Del med gruppe" name="share_with_group"/> diff --git a/indra/newview/skins/default/xui/da/floater_postcard.xml b/indra/newview/skins/default/xui/da/floater_postcard.xml index 24d45062ae7..cd61e7ac975 100644 --- a/indra/newview/skins/default/xui/da/floater_postcard.xml +++ b/indra/newview/skins/default/xui/da/floater_postcard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Postcard" title="E-mail billede"> +<floater name="Postcard" title="E-MAIL BILLEDE"> <text name="to_label"> Send til: </text> diff --git a/indra/newview/skins/default/xui/da/floater_preferences.xml b/indra/newview/skins/default/xui/da/floater_preferences.xml index 26e932e3ccb..e251c9ad2c6 100644 --- a/indra/newview/skins/default/xui/da/floater_preferences.xml +++ b/indra/newview/skins/default/xui/da/floater_preferences.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Preferences" title="Indstillinger"> +<floater name="Preferences" title="INDSTILLINGER"> <button label="OK" label_selected="OK" name="OK" /> <button label="Annullér" label_selected="Annullér" name="Cancel" /> <button label="Gem" label_selected="Gem" name="Apply" /> diff --git a/indra/newview/skins/default/xui/da/floater_preview_classified.xml b/indra/newview/skins/default/xui/da/floater_preview_classified.xml index 6cc4c139f1e..cf2d14b80a4 100644 --- a/indra/newview/skins/default/xui/da/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/da/floater_preview_classified.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="classified_preview" title="Annonce information" /> +<floater name="classified_preview" title="ANNONCE INFORMATION" /> diff --git a/indra/newview/skins/default/xui/da/floater_preview_event.xml b/indra/newview/skins/default/xui/da/floater_preview_event.xml index f1be35e1c3f..584085fea0b 100644 --- a/indra/newview/skins/default/xui/da/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/da/floater_preview_event.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="event_preview" title="Event information" /> +<floater name="event_preview" title="EVENT INFORMATION" /> diff --git a/indra/newview/skins/default/xui/da/floater_preview_notecard.xml b/indra/newview/skins/default/xui/da/floater_preview_notecard.xml index 68d04d6f9b8..7258824878d 100644 --- a/indra/newview/skins/default/xui/da/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/da/floater_preview_notecard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview notecard" title="Note:"> +<floater name="preview notecard" title="NOTE:"> <button label="Gem" label_selected="Gem" name="Save"/> <text name="desc txt"> Beskrivelse: diff --git a/indra/newview/skins/default/xui/da/floater_region_info.xml b/indra/newview/skins/default/xui/da/floater_region_info.xml index 9f6e326cf33..5c95c8ed5ef 100644 --- a/indra/newview/skins/default/xui/da/floater_region_info.xml +++ b/indra/newview/skins/default/xui/da/floater_region_info.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="regioninfo" title="Region/Estate" /> +<floater name="regioninfo" title="REGION/ESTATE" /> diff --git a/indra/newview/skins/default/xui/da/floater_report_abuse.xml b/indra/newview/skins/default/xui/da/floater_report_abuse.xml index 01f152c43ad..6f1e2884eb6 100644 --- a/indra/newview/skins/default/xui/da/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/da/floater_report_abuse.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="Rapportér misbrug"> +<floater name="floater_report_abuse" title="RAPPORTÉR MISBRUG"> <texture_picker label="" name="screenshot"/> <check_box label="Inkludér billede" name="screen_check"/> <text name="reporter_title"> diff --git a/indra/newview/skins/default/xui/da/floater_script_debug.xml b/indra/newview/skins/default/xui/da/floater_script_debug.xml index 17e14cd9b95..df60a2e23f1 100644 --- a/indra/newview/skins/default/xui/da/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/da/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <multi_floater name="script debug floater" title="Script advarsel/fejl"> <tab_container name="Preview Tabs"> - <floater label="Script" name="all_scripts" title="[All scripts]" /> + <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]" /> </tab_container> </multi_floater> diff --git a/indra/newview/skins/default/xui/da/floater_script_preview.xml b/indra/newview/skins/default/xui/da/floater_script_preview.xml index 6990e8db0ee..ede277bbd22 100644 --- a/indra/newview/skins/default/xui/da/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/da/floater_script_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview lsl text" title="Script: Rotation Script"> +<floater name="preview lsl text" title="SCRIPT: ROTATION SCRIPT"> <text name="desc txt"> Beskrivelse: </text> diff --git a/indra/newview/skins/default/xui/da/floater_script_queue.xml b/indra/newview/skins/default/xui/da/floater_script_queue.xml index 47dbf534bd0..3f54c924267 100644 --- a/indra/newview/skins/default/xui/da/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/da/floater_script_queue.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="queue" title="Nulstil forløb"> +<floater name="queue" title="NULSTIL FORLØB"> <button label="Luk" label_selected="Luk" name="close" /> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_script_search.xml b/indra/newview/skins/default/xui/da/floater_script_search.xml index d4dae8951f3..62f311be6e9 100644 --- a/indra/newview/skins/default/xui/da/floater_script_search.xml +++ b/indra/newview/skins/default/xui/da/floater_script_search.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script search" title="Script søgning"> +<floater name="script search" title="SCRIPT SØGNING"> <check_box label="Store/smÃ¥ bogstaver har ingen betydning" name="case_text" /> <button label="Søg" label_selected="Søg" name="search_btn" /> <button label="Erstat" label_selected="Erstat" name="replace_btn" /> diff --git a/indra/newview/skins/default/xui/da/floater_sell_land.xml b/indra/newview/skins/default/xui/da/floater_sell_land.xml index 87023b4f640..fcbe0abe081 100644 --- a/indra/newview/skins/default/xui/da/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/da/floater_sell_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="sell land" title="Sælg land"> +<floater name="sell land" title="SÆLG LAND"> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <text name="info_parcel_label"> diff --git a/indra/newview/skins/default/xui/da/floater_settings_debug.xml b/indra/newview/skins/default/xui/da/floater_settings_debug.xml index 60f99deae2e..c1429ed3a36 100644 --- a/indra/newview/skins/default/xui/da/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/da/floater_settings_debug.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="settings_debug" title="Tekniske indstillinger"> +<floater name="settings_debug" title="TEKNISKE INDSTILLINGER"> <combo_box name="boolean_combo"> <combo_box.item name="TRUE" label="TRUE (Valgt)" /> <combo_box.item name="FALSE" label="FALSE (Fravalgt)" /> diff --git a/indra/newview/skins/default/xui/da/floater_snapshot.xml b/indra/newview/skins/default/xui/da/floater_snapshot.xml index d7a51798907..3eed869db44 100644 --- a/indra/newview/skins/default/xui/da/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/da/floater_snapshot.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="Se foto"> +<floater name="Snapshot" title="SE FOTO"> <text name="type_label"> Hvor skal foto hen? </text> diff --git a/indra/newview/skins/default/xui/da/floater_sound_preview.xml b/indra/newview/skins/default/xui/da/floater_sound_preview.xml index 606d290e1db..e54bdf4f42c 100644 --- a/indra/newview/skins/default/xui/da/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/da/floater_sound_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Sound Preview" title="sound.wav"> +<floater name="Sound Preview" title="SOUND.WAV"> <text name="name_label"> Navn: </text> diff --git a/indra/newview/skins/default/xui/da/floater_statistics.xml b/indra/newview/skins/default/xui/da/floater_statistics.xml index 0443553d509..8c33f3ecb35 100644 --- a/indra/newview/skins/default/xui/da/floater_statistics.xml +++ b/indra/newview/skins/default/xui/da/floater_statistics.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="Statistik"/> +<floater name="stats floater" title="STATISTIK"/> diff --git a/indra/newview/skins/default/xui/da/floater_telehub.xml b/indra/newview/skins/default/xui/da/floater_telehub.xml index cd1fb338311..bf31da95158 100644 --- a/indra/newview/skins/default/xui/da/floater_telehub.xml +++ b/indra/newview/skins/default/xui/da/floater_telehub.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="telehub" title="Telehub"> +<floater name="telehub" title="TELEHUB"> <text name="status_text_connected"> Telehub forbundet til objekt [OBJECT] </text> diff --git a/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml index c35e3aec4c8..4167e2938aa 100644 --- a/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="texture picker" title="Vælg: Tekstur"> +<floater name="texture picker" title="VÆLG: TEKSTUR"> <string name="choose_picture"> Klik for at vælge et billede </string> diff --git a/indra/newview/skins/default/xui/da/floater_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml index e50494ff9ed..c3287bac84e 100644 --- a/indra/newview/skins/default/xui/da/floater_tools.xml +++ b/indra/newview/skins/default/xui/da/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="Byg"> +<floater name="toolbox floater" title="" short_title="BYG"> <button label="" label_selected="" name="button focus" tool_tip="Fokus"/> <button label="" label_selected="" name="button move" tool_tip="Flyt"/> <button label="" label_selected="" name="button edit" tool_tip="Redigér"/> diff --git a/indra/newview/skins/default/xui/da/floater_top_objects.xml b/indra/newview/skins/default/xui/da/floater_top_objects.xml index dc4605cc121..0cfbe77def7 100644 --- a/indra/newview/skins/default/xui/da/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/da/floater_top_objects.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="top_objects" title="Indlæser..."> +<floater name="top_objects" title="INDLÆSER..."> <text name="title_text"> Henter... </text> diff --git a/indra/newview/skins/default/xui/da/floater_water.xml b/indra/newview/skins/default/xui/da/floater_water.xml index 33a10579abb..63880b4a690 100644 --- a/indra/newview/skins/default/xui/da/floater_water.xml +++ b/indra/newview/skins/default/xui/da/floater_water.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Water Floater" title="Avanceret opsætning af vand"> +<floater name="Water Floater" title="AVANCERET OPSÆTNING AF VAND"> <text name="KeyFramePresetsText"> Vand opsætninger: </text> diff --git a/indra/newview/skins/default/xui/da/floater_windlight_options.xml b/indra/newview/skins/default/xui/da/floater_windlight_options.xml index 9754b1f0743..4786609b539 100644 --- a/indra/newview/skins/default/xui/da/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/da/floater_windlight_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="WindLight floater" title="Avanceret opsætning for himmel"> +<floater name="WindLight floater" title="AVANCERET OPSÆTNING FOR HIMMEL"> <text name="KeyFramePresetsText"> Faste indstillinger: </text> diff --git a/indra/newview/skins/default/xui/da/floater_world_map.xml b/indra/newview/skins/default/xui/da/floater_world_map.xml index d4b58f62329..62930716ce4 100644 --- a/indra/newview/skins/default/xui/da/floater_world_map.xml +++ b/indra/newview/skins/default/xui/da/floater_world_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="worldmap" title="Verdenskort"> +<floater name="worldmap" title="VERDENSKORT"> <tab_container name="maptab"> <panel label="Objekter" name="objects_mapview"/> <panel label="Terræn" name="terrain_mapview"/> diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml index d36f5a43f6c..6e51fe3e2dd 100644 --- a/indra/newview/skins/default/xui/de/floater_about.xml +++ b/indra/newview/skins/default/xui/de/floater_about.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_about" title="Ãœber [APP_NAME]"> +<floater name="floater_about" title="ÃœBER [APP_NAME]"> <tab_container name="about_tab"> <panel name="credits_panel"> <text_editor name="credits_editor"> 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 853302d15c4..ceb831c12de 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="Land-Info"> +<floater name="floaterland" title="LAND-INFO"> <tab_container name="landtab"> <panel label="Allgemein" name="land_general_panel"> <text name="Name:"> diff --git a/indra/newview/skins/default/xui/de/floater_auction.xml b/indra/newview/skins/default/xui/de/floater_auction.xml index 42f6a07dc37..9d0db766c9e 100644 --- a/indra/newview/skins/default/xui/de/floater_auction.xml +++ b/indra/newview/skins/default/xui/de/floater_auction.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_auction" title="Linden-Landverkauf starten"> +<floater name="floater_auction" title="LINDEN-LANDVERKAUF STARTEN"> <check_box label="Gelben Auswahlrahmen einschließen" name="fence_check" /> <button label="Foto" label_selected="Foto" name="snapshot_btn" /> <button label="OK" label_selected="OK" name="ok_btn" /> diff --git a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml index c546d91d72c..e1ea7926944 100644 --- a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="Einwohner auswählen"> +<floater name="avatarpicker" title="EINWOHNER AUSWÄHLEN"> <tab_container name="ResidentChooserTabs"> <panel label="Suchen" name="SearchPanel"> <text name="InstructSearchResidentName"> diff --git a/indra/newview/skins/default/xui/de/floater_avatar_textures.xml b/indra/newview/skins/default/xui/de/floater_avatar_textures.xml index 823d6de78b8..3072735c669 100644 --- a/indra/newview/skins/default/xui/de/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/de/floater_avatar_textures.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatar_texture_debug" title="Avatar-Texturen"> +<floater name="avatar_texture_debug" title="AVATAR-TEXTUREN"> <text name="label"> Gebackene Texturen </text> diff --git a/indra/newview/skins/default/xui/de/floater_beacons.xml b/indra/newview/skins/default/xui/de/floater_beacons.xml index 0992727e730..58e2e2681f4 100644 --- a/indra/newview/skins/default/xui/de/floater_beacons.xml +++ b/indra/newview/skins/default/xui/de/floater_beacons.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="Beacons"> +<floater name="beacons" title="BEACONS"> <panel name="beacons_panel"> <check_box label="Auf Berührung beschränkte Skriptobjekte" name="touch_only"/> <check_box label="Skripting-Objekte" name="scripted"/> diff --git a/indra/newview/skins/default/xui/de/floater_build_options.xml b/indra/newview/skins/default/xui/de/floater_build_options.xml index de3617ed258..58f117f6b16 100644 --- a/indra/newview/skins/default/xui/de/floater_build_options.xml +++ b/indra/newview/skins/default/xui/de/floater_build_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="build options floater" title="Rasteroptionen"> +<floater name="build options floater" title="RASTEROPTIONEN"> <spinner label="Rastereinheit (Meter)" name="GridResolution" /> <spinner label="Rastergröße (Meter)" name="GridDrawSize" /> <check_box label="Einrasten von Untereinheiten aktivieren" name="GridSubUnit" /> diff --git a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml index f058a0ed967..fff6aa4b73e 100644 --- a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="Mehrere Inhaltsberechtigungen ändern"> +<floater name="floaterbulkperms" title="MEHRERE INHALTSBERECHTIGUNGEN ÄNDERN"> <text name="applyto"> Inhaltsarten </text> diff --git a/indra/newview/skins/default/xui/de/floater_bumps.xml b/indra/newview/skins/default/xui/de/floater_bumps.xml index 7b21042c2b3..b7909bf02d8 100644 --- a/indra/newview/skins/default/xui/de/floater_bumps.xml +++ b/indra/newview/skins/default/xui/de/floater_bumps.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_bumps" title="Rempler, Stöße und Schläge"> +<floater name="floater_bumps" title="REMPLER, STÖßE UND SCHLÄGE"> <text name="none_detected"> Nicht erkannt </text> diff --git a/indra/newview/skins/default/xui/de/floater_buy_contents.xml b/indra/newview/skins/default/xui/de/floater_buy_contents.xml index 01858b3c364..47ea6a1bd44 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_contents.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_buy_contents" title="Inhalte kaufen" min_width="300"> +<floater name="floater_buy_contents" title="INHALTE KAUFEN" min_width="300"> <text name="contains_text"> [NAME] enthält: </text> diff --git a/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml index 787f4698540..05750a17820 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="buy currency" title="Geld kaufen"> +<floater name="buy currency" title="GELD KAUFEN"> <text name="info_buying"> Kaufe Geld: </text> diff --git a/indra/newview/skins/default/xui/de/floater_buy_land.xml b/indra/newview/skins/default/xui/de/floater_buy_land.xml index e0abf8fae97..72a35db78c8 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy land" title="Land kaufen"> +<floater name="buy land" title="LAND KAUFEN"> <text name="region_name_label"> Region: </text> diff --git a/indra/newview/skins/default/xui/de/floater_buy_object.xml b/indra/newview/skins/default/xui/de/floater_buy_object.xml index 3cfa59ff06d..df6bf76240d 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="contents" title="Objektkopie kaufen"> +<floater name="contents" title="OBJEKTKOPIE KAUFEN"> <text name="contents_text"> samt Inhalt: </text> diff --git a/indra/newview/skins/default/xui/de/floater_choose_group.xml b/indra/newview/skins/default/xui/de/floater_choose_group.xml index dd29aa75501..398645347bd 100644 --- a/indra/newview/skins/default/xui/de/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/de/floater_choose_group.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="groups" title="Gruppen"> +<floater name="groups" title="GRUPPEN"> <text name="groupdesc"> Gruppe wählen: </text> diff --git a/indra/newview/skins/default/xui/de/floater_color_picker.xml b/indra/newview/skins/default/xui/de/floater_color_picker.xml index fa2f616249d..47f256918a0 100644 --- a/indra/newview/skins/default/xui/de/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/de/floater_color_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="ColorPicker" title="Farbauswahl"> +<floater name="ColorPicker" title="FARBAUSWAHL"> <text name="r_val_text"> Rot: </text> diff --git a/indra/newview/skins/default/xui/de/floater_customize.xml b/indra/newview/skins/default/xui/de/floater_customize.xml index 06b53dd8b48..f1ecd21c014 100644 --- a/indra/newview/skins/default/xui/de/floater_customize.xml +++ b/indra/newview/skins/default/xui/de/floater_customize.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="Aussehen"> +<floater name="floater customize" title="AUSSEHEN"> <tab_container name="customize tab container"> <placeholder label="Körperteile" name="body_parts_placeholder"/> <panel label="Form" name="Shape"> diff --git a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml index d5a216a0b56..7f4dc4a79e9 100644 --- a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Day Cycle Floater" title="Tageszyklus-Editor"> +<floater name="Day Cycle Floater" title="TAGESZYKLUS-EDITOR"> <tab_container name="Day Cycle Tabs"> <panel label="Tageszyklus" name="Day Cycle"> <button label=" ?" name="WLDayCycleHelp" /> diff --git a/indra/newview/skins/default/xui/de/floater_device_settings.xml b/indra/newview/skins/default/xui/de/floater_device_settings.xml index 734f4e942cd..9108f3c2e5d 100644 --- a/indra/newview/skins/default/xui/de/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/de/floater_device_settings.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_device_settings" title="Geräte-Einstellungen für Voice-Chat" /> +<floater name="floater_device_settings" title="GERÄTE-EINSTELLUNGEN FÃœR VOICE-CHAT" /> diff --git a/indra/newview/skins/default/xui/de/floater_env_settings.xml b/indra/newview/skins/default/xui/de/floater_env_settings.xml index 3717ff6a48e..c9afcc84710 100644 --- a/indra/newview/skins/default/xui/de/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/de/floater_env_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Environment Editor Floater" title="Umwelt-Editor"> +<floater name="Environment Editor Floater" title="UMWELT-EDITOR"> <text name="EnvTimeText"> Tageszeit </text> diff --git a/indra/newview/skins/default/xui/de/floater_font_test.xml b/indra/newview/skins/default/xui/de/floater_font_test.xml index 54278fc094a..522d966431a 100644 --- a/indra/newview/skins/default/xui/de/floater_font_test.xml +++ b/indra/newview/skins/default/xui/de/floater_font_test.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Schriftart-Test"> +<floater name="contents" title="SCHRIFTART-TEST"> <text name="linea"> OverrideTest, sollte hier als Times angezeigt werden. (Aus default/xui/en-us) </text> diff --git a/indra/newview/skins/default/xui/de/floater_gesture.xml b/indra/newview/skins/default/xui/de/floater_gesture.xml index bdee3b86648..aff0a9b92dc 100644 --- a/indra/newview/skins/default/xui/de/floater_gesture.xml +++ b/indra/newview/skins/default/xui/de/floater_gesture.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="gestures" title="Aktive Gesten"> +<floater name="gestures" title="AKTIVE GESTEN"> <text name="help_label"> Doppelklicken Sie auf eine Geste, um Animationen und Sound abzuspielen. </text> diff --git a/indra/newview/skins/default/xui/de/floater_god_tools.xml b/indra/newview/skins/default/xui/de/floater_god_tools.xml index c7cfb5d9d3d..f93a9b94761 100644 --- a/indra/newview/skins/default/xui/de/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_god_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="godtools floater" title="Gott-Werkzeuge"> +<floater name="godtools floater" title="GOTT-WERKZEUGE"> <tab_container name="GodTools Tabs"> <panel label="Raster" name="grid"> <button label="Alle Benutzer hinauswerfen" label_selected="Alle Benutzer hinauswerfen" diff --git a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml index 4051776b0d6..68f7d6872e8 100644 --- a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Hardware Settings Floater" title="Hardware-Einstellungen"> +<floater name="Hardware Settings Floater" title="HARDWARE-EINSTELLUNGEN"> <text name="Filtering:"> Filtern: </text> diff --git a/indra/newview/skins/default/xui/de/floater_hud.xml b/indra/newview/skins/default/xui/de/floater_hud.xml index 0f11e2346da..18584e57cae 100644 --- a/indra/newview/skins/default/xui/de/floater_hud.xml +++ b/indra/newview/skins/default/xui/de/floater_hud.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_hud" title="Tutorial" /> +<floater name="floater_hud" title="TUTORIAL" /> diff --git a/indra/newview/skins/default/xui/de/floater_inspect.xml b/indra/newview/skins/default/xui/de/floater_inspect.xml index f8c9b628243..f9421788bd7 100644 --- a/indra/newview/skins/default/xui/de/floater_inspect.xml +++ b/indra/newview/skins/default/xui/de/floater_inspect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="inspect" title="Objekt prüfen" min_width="450" > +<floater name="inspect" title="OBJEKT PRÃœFEN" min_width="450" > <scroll_list name="object_list" tool_tip="Wählen Sie ein Objekt aus dieser Liste, um es in der Second Life-Welt zu markieren"> <column label="Objektname" name="object_name" /> diff --git a/indra/newview/skins/default/xui/de/floater_inventory.xml b/indra/newview/skins/default/xui/de/floater_inventory.xml index c8c67240d87..6444e878820 100644 --- a/indra/newview/skins/default/xui/de/floater_inventory.xml +++ b/indra/newview/skins/default/xui/de/floater_inventory.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Inventory" title="Inventar"> +<floater name="Inventory" title="INVENTAR"> <search_editor label="Suchanfrage hier eintippen" name="inventory search editor" /> <tab_container name="inventory filter tabs"> <inventory_panel label="Alle Objekte" name="All Items" /> diff --git a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml index 3e79a31abd0..ef85efdae0d 100644 --- a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="item properties" title="Inventarobjekt-Eigenschaften"> +<floater name="item properties" title="INVENTAROBJEKT-EIGENSCHAFTEN"> <text name="LabelItemNameTitle"> Name: </text> diff --git a/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml index 2f2eb5aa8d9..8dfffe06d19 100644 --- a/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/de/floater_inventory_view_finder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Inventory Finder" title="inventar_letzte_objekte"> +<floater name="Inventory Finder" title="INVENTAR_LETZTE_OBJEKTE"> <check_box label="Animation" name="check_animation" /> <check_box label="Visitenkarten" name="check_calling_card" /> <check_box label="Kleidung" name="check_clothing" /> diff --git a/indra/newview/skins/default/xui/de/floater_joystick.xml b/indra/newview/skins/default/xui/de/floater_joystick.xml index ccf6f14eade..9507d063d12 100644 --- a/indra/newview/skins/default/xui/de/floater_joystick.xml +++ b/indra/newview/skins/default/xui/de/floater_joystick.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Joystick" title="Joystick-Konfiguration"> +<floater name="Joystick" title="JOYSTICK-KONFIGURATION"> <check_box name="enable_joystick" width="80" label="Joystick aktivieren:"/> <text left="140" name="joystick_type" width="360"/> <spinner label="X-Achse" name="JoystickAxis1"/> diff --git a/indra/newview/skins/default/xui/de/floater_lagmeter.xml b/indra/newview/skins/default/xui/de/floater_lagmeter.xml index 4dd9fd6c76d..9468557fc48 100644 --- a/indra/newview/skins/default/xui/de/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/de/floater_lagmeter.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_lagmeter" title="Lag-Anzeige"> +<floater name="floater_lagmeter" title="LAG-ANZEIGE"> <button name="client_lagmeter" tool_tip="Client-Lag-Status" /> <text name="client"> Client: diff --git a/indra/newview/skins/default/xui/de/floater_land_holdings.xml b/indra/newview/skins/default/xui/de/floater_land_holdings.xml index 68549033829..39752111177 100644 --- a/indra/newview/skins/default/xui/de/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/de/floater_land_holdings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="Mein Land"> +<floater name="land holdings floater" title="MEIN LAND"> <scroll_list name="parcel list"> <column label="Parzellenname" name="name"/> <column label="Region" name="location"/> diff --git a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml index 8d499bc3003..5afeb033951 100644 --- a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="Skript: Neues Skript"> +<floater name="script ed float" title="SKRIPT: NEUES SKRIPT"> <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Reset" /> <check_box label="Läuft" name="running" /> <check_box label="Mono" name="mono" /> diff --git a/indra/newview/skins/default/xui/de/floater_lsl_guide.xml b/indra/newview/skins/default/xui/de/floater_lsl_guide.xml index d7f56b302df..dd6d559c404 100644 --- a/indra/newview/skins/default/xui/de/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/de/floater_lsl_guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="LSL-Wiki"> +<floater name="script ed float" title="LSL-WIKI"> <check_box label="Cursor folgen" name="lock_check" /> <combo_box label="Sperren" name="history_combo" /> <button label="Zurück" name="back_btn" /> diff --git a/indra/newview/skins/default/xui/de/floater_media_browser.xml b/indra/newview/skins/default/xui/de/floater_media_browser.xml index ee2532127eb..a16c2408fec 100644 --- a/indra/newview/skins/default/xui/de/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/de/floater_media_browser.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_about" title="Medienbrowser"> +<floater name="floater_about" title="MEDIENBROWSER"> <layout_stack name="stack1"> <layout_panel name="nav_controls"> <button label="Zurück" name="back" /> diff --git a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml index 0b77a7fe9df..44249a6075e 100644 --- a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="MemLeak" title="Speicherverlust-Simulation"> +<floater name="MemLeak" title="SPEICHERVERLUST-SIMULATION"> <spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed" /> <spinner label="Max. Speicherverlust (MB):" name="max_leak" /> <text name="total_leaked_label"> diff --git a/indra/newview/skins/default/xui/de/floater_mute_object.xml b/indra/newview/skins/default/xui/de/floater_mute_object.xml index 60c6ff008cb..8cc8a565233 100644 --- a/indra/newview/skins/default/xui/de/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/de/floater_mute_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="mute by name" title="Objekt nach Name stummschalten"> +<floater name="mute by name" title="OBJEKT NACH NAME STUMMSCHALTEN"> <text name="message"> Stummschalten nach Name betrifft nur Chat und IM, keine Sounds. Sie müssen den Objektnamen exakt angeben. diff --git a/indra/newview/skins/default/xui/de/floater_my_friends.xml b/indra/newview/skins/default/xui/de/floater_my_friends.xml index fc24bcece43..30614b75785 100644 --- a/indra/newview/skins/default/xui/de/floater_my_friends.xml +++ b/indra/newview/skins/default/xui/de/floater_my_friends.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_my_friends" title="Kontakte"> +<floater name="floater_my_friends" title="KONTAKTE"> <tab_container name="friends_and_groups"> <panel label="Freunde" name="friends_panel" /> <panel label="Gruppen" name="groups_panel" /> diff --git a/indra/newview/skins/default/xui/de/floater_notification.xml b/indra/newview/skins/default/xui/de/floater_notification.xml index 48ff900d5a9..48a26a0e986 100644 --- a/indra/newview/skins/default/xui/de/floater_notification.xml +++ b/indra/newview/skins/default/xui/de/floater_notification.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="notification" title="Konsole: Meldungen"> +<floater name="notification" title="KONSOLE: MELDUNGEN"> <text_editor name="payload"> Wird geladen... </text_editor> diff --git a/indra/newview/skins/default/xui/de/floater_notifications_console.xml b/indra/newview/skins/default/xui/de/floater_notifications_console.xml index a1cd69899c4..0c075dd63af 100644 --- a/indra/newview/skins/default/xui/de/floater_notifications_console.xml +++ b/indra/newview/skins/default/xui/de/floater_notifications_console.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="notifications_console" title="Konsole: Meldungen"> +<floater name="notifications_console" title="KONSOLE: MELDUNGEN"> <combo_box label="Meldungsart auswählen" name="notification_types" width="412" /> <button label="Hinzufügen" name="add_notification" left="417" width="78" /> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_openobject.xml b/indra/newview/skins/default/xui/de/floater_openobject.xml index fa465c08c74..d7575876e18 100644 --- a/indra/newview/skins/default/xui/de/floater_openobject.xml +++ b/indra/newview/skins/default/xui/de/floater_openobject.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="objectcontents" title="Objektinhalte"> +<floater name="objectcontents" title="OBJEKTINHALTE"> <text name="object_name"> [DESC]: </text> diff --git a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml index 83ec725487f..3641f41b8c9 100644 --- a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="perm prefs" title="Hochlade-Berechtigungen (Standard)"> +<floater name="perm prefs" title="HOCHLADE-BERECHTIGUNGEN (STANDARD)"> <panel label="Berechtigungen" name="permissions"> <button label="?" label_selected="?" name="help"/> <check_box label="Mit Gruppe teilen" name="share_with_group"/> diff --git a/indra/newview/skins/default/xui/de/floater_post_process.xml b/indra/newview/skins/default/xui/de/floater_post_process.xml index e10806d2551..a6ed8cc3df9 100644 --- a/indra/newview/skins/default/xui/de/floater_post_process.xml +++ b/indra/newview/skins/default/xui/de/floater_post_process.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Post-Process Floater" title="Post-Processing-Einstellungen"> +<floater name="Post-Process Floater" title="POST-PROCESSING-EINSTELLUNGEN"> <tab_container name="Post-Process Tabs"> <panel label="Farbfilter" name="wmiColorFilterPanel"> <check_box label="Ein" name="wmiColorFilterToggle" /> diff --git a/indra/newview/skins/default/xui/de/floater_postcard.xml b/indra/newview/skins/default/xui/de/floater_postcard.xml index 27557046600..fc552339d3b 100644 --- a/indra/newview/skins/default/xui/de/floater_postcard.xml +++ b/indra/newview/skins/default/xui/de/floater_postcard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Postcard" title="Foto per E-Mail senden"> +<floater name="Postcard" title="FOTO PER E-MAIL SENDEN"> <text name="to_label"> E-Mail des Empfängers: </text> diff --git a/indra/newview/skins/default/xui/de/floater_preferences.xml b/indra/newview/skins/default/xui/de/floater_preferences.xml index 5f68282b9fc..02aa440be75 100644 --- a/indra/newview/skins/default/xui/de/floater_preferences.xml +++ b/indra/newview/skins/default/xui/de/floater_preferences.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Preferences" title="Einstellungen"> +<floater name="Preferences" title="EINSTELLUNGEN"> <button label="OK" label_selected="OK" name="OK" /> <button label="Abbrechen" label_selected="Abbrechen" name="Cancel" /> <button label="Ãœbernehmen" label_selected="Ãœbernehmen" name="Apply" /> diff --git a/indra/newview/skins/default/xui/de/floater_preview_classified.xml b/indra/newview/skins/default/xui/de/floater_preview_classified.xml index 2257785fdac..be702145c37 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_classified.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="classified_preview" title="Vertrauliche Informationen" /> +<floater name="classified_preview" title="VERTRAULICHE INFORMATIONEN" /> diff --git a/indra/newview/skins/default/xui/de/floater_preview_event.xml b/indra/newview/skins/default/xui/de/floater_preview_event.xml index 75e1113eff0..21e8c67787d 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_event.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="event_preview" title="Event-Informationen" /> +<floater name="event_preview" title="EVENT-INFORMATIONEN" /> diff --git a/indra/newview/skins/default/xui/de/floater_preview_notecard.xml b/indra/newview/skins/default/xui/de/floater_preview_notecard.xml index da90d66e4df..2c3258440f2 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_notecard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview notecard" title="Hinweis:"> +<floater name="preview notecard" title="HINWEIS:"> <button label="Speichern" label_selected="Speichern" name="Save" /> <text name="desc txt"> Beschreibung: diff --git a/indra/newview/skins/default/xui/de/floater_region_info.xml b/indra/newview/skins/default/xui/de/floater_region_info.xml index 4c28c7f5b0e..e7dd09d4dab 100644 --- a/indra/newview/skins/default/xui/de/floater_region_info.xml +++ b/indra/newview/skins/default/xui/de/floater_region_info.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="regioninfo" title="Region/Grundstück" /> +<floater name="regioninfo" title="REGION/GRUNDSTÃœCK" /> diff --git a/indra/newview/skins/default/xui/de/floater_report_abuse.xml b/indra/newview/skins/default/xui/de/floater_report_abuse.xml index a8df587cfad..a5dd9fa4b19 100644 --- a/indra/newview/skins/default/xui/de/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/de/floater_report_abuse.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="Missbrauch melden"> +<floater name="floater_report_abuse" title="MISSBRAUCH MELDEN"> <texture_picker label="" name="screenshot"/> <check_box bottom_delta="-20" label="Screenshot einschließen" name="screen_check"/> <text name="reporter_title"> diff --git a/indra/newview/skins/default/xui/de/floater_script_debug.xml b/indra/newview/skins/default/xui/de/floater_script_debug.xml index f8c1543fdd4..585a6c36eaa 100644 --- a/indra/newview/skins/default/xui/de/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/de/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <multi_floater name="script debug floater" title="Skriptwarnung/Fehler"> <tab_container name="Preview Tabs"> - <floater label="Skript" name="all_scripts" title="[All scripts]" /> + <floater label="Skript" name="all_scripts" title="[ALL SCRIPTS]" /> </tab_container> </multi_floater> diff --git a/indra/newview/skins/default/xui/de/floater_script_preview.xml b/indra/newview/skins/default/xui/de/floater_script_preview.xml index 3ab5732055f..be6017cff51 100644 --- a/indra/newview/skins/default/xui/de/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_script_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview lsl text" title="Skript: Rotationsskript"> +<floater name="preview lsl text" title="SKRIPT: ROTATIONSSKRIPT"> <text name="desc txt"> Beschreibung: </text> diff --git a/indra/newview/skins/default/xui/de/floater_script_queue.xml b/indra/newview/skins/default/xui/de/floater_script_queue.xml index 63d5ef24788..b2011a4dfb4 100644 --- a/indra/newview/skins/default/xui/de/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/de/floater_script_queue.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="queue" title="Rückgängig"> +<floater name="queue" title="RÃœCKGÄNGIG"> <button label="Schließen" label_selected="Schließen" name="close" left="215" width="72"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_script_search.xml b/indra/newview/skins/default/xui/de/floater_script_search.xml index bd934274566..aae302e2306 100644 --- a/indra/newview/skins/default/xui/de/floater_script_search.xml +++ b/indra/newview/skins/default/xui/de/floater_script_search.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script search" title="Skriptsuche"> +<floater name="script search" title="SKRIPTSUCHE"> <check_box label="Groß-/Kleinschreibung irrelevant" name="case_text" /> <button label="Suchen" label_selected="Suchen" name="search_btn" /> <button label="Ersetzen" label_selected="Ersetzen" name="replace_btn" /> diff --git a/indra/newview/skins/default/xui/de/floater_sell_land.xml b/indra/newview/skins/default/xui/de/floater_sell_land.xml index 1499bb01521..47ab51d5027 100644 --- a/indra/newview/skins/default/xui/de/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/de/floater_sell_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="sell land" title="Land verkaufen"> +<floater name="sell land" title="LAND VERKAUFEN"> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <text name="info_parcel_label"> diff --git a/indra/newview/skins/default/xui/de/floater_settings_debug.xml b/indra/newview/skins/default/xui/de/floater_settings_debug.xml index 034cfca017f..ea3295797d3 100644 --- a/indra/newview/skins/default/xui/de/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/de/floater_settings_debug.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="settings_debug" title="Debug-Einstellungen"> +<floater name="settings_debug" title="DEBUG-EINSTELLUNGEN"> <combo_box name="boolean_combo"> <combo_box.item name="TRUE" label="WAHR" /> <combo_box.item name="FALSE" label="FALSCH" /> diff --git a/indra/newview/skins/default/xui/de/floater_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml index bc8a1f42f12..64db511aa9f 100644 --- a/indra/newview/skins/default/xui/de/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="Foto-Vorschau"> +<floater name="Snapshot" title="FOTO-VORSCHAU"> <text name="type_label"> Zweck des Fotos </text> diff --git a/indra/newview/skins/default/xui/de/floater_sound_preview.xml b/indra/newview/skins/default/xui/de/floater_sound_preview.xml index 1e5ac179b5b..14126b6a44c 100644 --- a/indra/newview/skins/default/xui/de/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_sound_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Sound Preview" title="sound.wav"> +<floater name="Sound Preview" title="SOUND.WAV"> <text name="name_label"> Name: </text> diff --git a/indra/newview/skins/default/xui/de/floater_statistics.xml b/indra/newview/skins/default/xui/de/floater_statistics.xml index 26e976a59c1..506c18bd98e 100644 --- a/indra/newview/skins/default/xui/de/floater_statistics.xml +++ b/indra/newview/skins/default/xui/de/floater_statistics.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="Statistikleiste"/> +<floater name="stats floater" title="STATISTIKLEISTE"/> diff --git a/indra/newview/skins/default/xui/de/floater_telehub.xml b/indra/newview/skins/default/xui/de/floater_telehub.xml index 264411c1665..2ba4e575a8e 100644 --- a/indra/newview/skins/default/xui/de/floater_telehub.xml +++ b/indra/newview/skins/default/xui/de/floater_telehub.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="telehub" title="Telehub" min_height="310" height="310" > +<floater name="telehub" title="TELEHUB" min_height="310" height="310" > <text name="status_text_connected"> Telehub verbunden mit Objekt [OBJECT] </text> diff --git a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml index fff6ab5c746..7e2fc26fdfb 100644 --- a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="texture picker" title="Auswählen: Textur"> +<floater name="texture picker" title="AUSWÄHLEN: TEXTUR"> <string name="choose_picture"> Zum Auswählen eines Bildes hier klicken </string> diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index 2815fd34a24..6bad64324b9 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="Bauen"> +<floater name="toolbox floater" title="" short_title="BAUEN"> <button label="" label_selected="" name="button focus" tool_tip="Fokus"/> <button label="" label_selected="" name="button move" tool_tip="Verschieben"/> <button label="" label_selected="" name="button edit" tool_tip="Bearbeiten"/> diff --git a/indra/newview/skins/default/xui/de/floater_top_objects.xml b/indra/newview/skins/default/xui/de/floater_top_objects.xml index f9e7becee1c..082eb8894df 100644 --- a/indra/newview/skins/default/xui/de/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/de/floater_top_objects.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="top_objects" title="wird geladen..."> +<floater name="top_objects" title="WIRD GELADEN..."> <text name="title_text"> Wird geladen... </text> diff --git a/indra/newview/skins/default/xui/de/floater_water.xml b/indra/newview/skins/default/xui/de/floater_water.xml index 95b469434a2..0880470c58e 100644 --- a/indra/newview/skins/default/xui/de/floater_water.xml +++ b/indra/newview/skins/default/xui/de/floater_water.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Water Floater" title="Erweiterter Wasser-Editor"> +<floater name="Water Floater" title="ERWEITERTER WASSER-EDITOR"> <text name="KeyFramePresetsText"> Voreinstellungen: </text> diff --git a/indra/newview/skins/default/xui/de/floater_windlight_options.xml b/indra/newview/skins/default/xui/de/floater_windlight_options.xml index 8df412dab64..df0b513a85a 100644 --- a/indra/newview/skins/default/xui/de/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/de/floater_windlight_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="WindLight floater" title="Erweiterter Himmel-Editor"> +<floater name="WindLight floater" title="ERWEITERTER HIMMEL-EDITOR"> <text name="KeyFramePresetsText"> Voreinstellungen: </text> diff --git a/indra/newview/skins/default/xui/de/floater_world_map.xml b/indra/newview/skins/default/xui/de/floater_world_map.xml index d3366e58712..665eafe5b87 100644 --- a/indra/newview/skins/default/xui/de/floater_world_map.xml +++ b/indra/newview/skins/default/xui/de/floater_world_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="worldmap" title="Weltkarte"> +<floater name="worldmap" title="WELTKARTE"> <tab_container name="maptab"> <panel label="Objekte" name="objects_mapview"/> <panel label="Terrain" name="terrain_mapview"/> diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml index 3789369e743..4d5268681b6 100644 --- a/indra/newview/skins/default/xui/en/floater_aaa.xml +++ b/indra/newview/skins/default/xui/en/floater_aaa.xml @@ -7,7 +7,7 @@ help_topic="floater_aaa" save_rect="true" can_resize="true" - title="About [APP_NAME]" + title="ABOUT [APP_NAME]" width="470"> <text_editor follows="left|top|right|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index 3f2636ae52c..c74b1929b47 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -6,7 +6,7 @@ name="floater_about" help_topic="floater_about" save_rect="true" - title="About [APP_NAME]" + title="ABOUT [APP_NAME]" width="470"> <floater.string name="AboutHeader"> 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 1def98d1bba..615d1bf18d4 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater can_tear_off="false" height="420" @@ -6,7 +6,7 @@ name="floaterland" help_topic="floaterland" save_rect="true" - title="About Land" + title="ABOUT LAND" width="460"> <floater.string name="Minutes"> diff --git a/indra/newview/skins/default/xui/en/floater_activeim.xml b/indra/newview/skins/default/xui/en/floater_activeim.xml index 1bc9cde0442..96fe0aa70c1 100644 --- a/indra/newview/skins/default/xui/en/floater_activeim.xml +++ b/indra/newview/skins/default/xui/en/floater_activeim.xml @@ -30,4 +30,4 @@ name="chiclet_row_panel_list" width="318"/> </scroll_container> -</floater> \ No newline at end of file +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_auction.xml b/indra/newview/skins/default/xui/en/floater_auction.xml index aae6508041f..9c6d114c4ca 100644 --- a/indra/newview/skins/default/xui/en/floater_auction.xml +++ b/indra/newview/skins/default/xui/en/floater_auction.xml @@ -8,7 +8,7 @@ min_width="420" name="floater_auction" help_topic="floater_auction" - title="Start Linden Land Sale" + title="START LINDEN LAND SALE" width="420"> <floater.string name="already for sale"> diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml index 592cf7e8fd5..a0f9bb59fd2 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml @@ -8,7 +8,7 @@ min_width="265" name="avatarpicker" help_topic="avatarpicker" - title="Choose Resident" + title="CHOOSE RESIDENT" width="265"> <floater.string name="not_found"> diff --git a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml index 4f2a36e5182..a0cb94eb691 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml @@ -5,7 +5,7 @@ layout="topleft" name="avatar_texture_debug" help_topic="avatar_texture_debug" - title="Avatar Textures" + title="AVATAR TEXTURES" width="1250"> <floater.string name="InvalidAvatar"> diff --git a/indra/newview/skins/default/xui/en/floater_beacons.xml b/indra/newview/skins/default/xui/en/floater_beacons.xml index 1c83799e721..c8f6c613af2 100644 --- a/indra/newview/skins/default/xui/en/floater_beacons.xml +++ b/indra/newview/skins/default/xui/en/floater_beacons.xml @@ -8,7 +8,7 @@ save_rect="true" save_visibility="true" single_instance="true" - title="Beacons" + title="BEACONS" width="240"> <panel follows="left|top|right|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_build_options.xml b/indra/newview/skins/default/xui/en/floater_build_options.xml index bddbbdd3b2f..f0e678af003 100644 --- a/indra/newview/skins/default/xui/en/floater_build_options.xml +++ b/indra/newview/skins/default/xui/en/floater_build_options.xml @@ -7,7 +7,7 @@ name="build options floater" help_topic="build_options_floater" save_rect="true" - title="Grid Options" + title="GRID OPTIONS" width="264"> <spinner control_name="GridResolution" diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml index 02958bee743..7ae079f553a 100644 --- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml @@ -6,7 +6,7 @@ layout="topleft" name="floaterbulkperms" help_topic="floaterbulkperms" - title="Edit Content Permissions" + title="EDIT CONTENT PERMISSIONS" width="270"> <floater.string name="nothing_to_modify_text"> diff --git a/indra/newview/skins/default/xui/en/floater_bumps.xml b/indra/newview/skins/default/xui/en/floater_bumps.xml index 2917096f3ce..303c28d7c88 100644 --- a/indra/newview/skins/default/xui/en/floater_bumps.xml +++ b/indra/newview/skins/default/xui/en/floater_bumps.xml @@ -6,7 +6,7 @@ name="floater_bumps" help_topic="floater_bumps" save_rect="true" - title="Bumps, Pushes & Hits" + title="BUMPS, PUSHES & HITS" width="400"> <floater.string name="none_detected"> diff --git a/indra/newview/skins/default/xui/en/floater_buy_contents.xml b/indra/newview/skins/default/xui/en/floater_buy_contents.xml index aacc3ad8d0c..833e8beb8d4 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_contents.xml @@ -9,7 +9,7 @@ name="floater_buy_contents" help_topic="floater_buy_contents" save_rect="true" - title="Buy Contents" + title="BUY CONTENTS" width="280"> <floater.string name="no_copy_text"> diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml index 88712bda5e6..75711cdf89e 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml @@ -4,7 +4,7 @@ can_minimize="false" height="275" layout="topleft" - title="Buy L$" + title="BUY L$" name="buy currency" help_topic="buy_linden_dollars" single_instance="true" diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml index 83145491324..0f710a8047b 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml @@ -7,7 +7,7 @@ name="buy land" help_topic="buy_land" single_instance="true" - title="Buy Land" + title="BUY LAND" width="740"> <floater.string name="can_resell"> diff --git a/indra/newview/skins/default/xui/en/floater_buy_object.xml b/indra/newview/skins/default/xui/en/floater_buy_object.xml index 49ea3f5dd15..f0e5e300109 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_object.xml @@ -10,7 +10,7 @@ help_topic="contents" save_rect="true" single_instance="true" - title="Buy Copy of Object" + title="BUY COPY OF OBJECT" width="280"> <floater.string name="title_buy_text"> diff --git a/indra/newview/skins/default/xui/en/floater_choose_group.xml b/indra/newview/skins/default/xui/en/floater_choose_group.xml index 8b34fda96c6..dc1ee5f24e2 100644 --- a/indra/newview/skins/default/xui/en/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/en/floater_choose_group.xml @@ -5,7 +5,7 @@ layout="topleft" name="groups" help_topic="groups" - title="Groups" + title="GROUPS" width="280"> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_color_picker.xml b/indra/newview/skins/default/xui/en/floater_color_picker.xml index 7c6376d84a6..e4b9d3f6bc7 100644 --- a/indra/newview/skins/default/xui/en/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_color_picker.xml @@ -7,7 +7,7 @@ layout="topleft" name="ColorPicker" help_topic="colorpicker" - title="Color Picker" + title="COLOR PICKER" width="440"> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml index c021dd79de1..a6dcb45e7a1 100644 --- a/indra/newview/skins/default/xui/en/floater_customize.xml +++ b/indra/newview/skins/default/xui/en/floater_customize.xml @@ -9,7 +9,7 @@ name="floater customize" help_topic="floater_customize" save_rect="true" - title="Appearance" + title="APPEARANCE" top_delta="-185" width="494"> <tab_container diff --git a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml index b0d636445d5..35f3e643c38 100644 --- a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml @@ -6,7 +6,7 @@ name="Day Cycle Floater" help_topic="day_cycle_floater" save_rect="true" - title="Day Cycle Editor" + title="DAY CYCLE EDITOR" width="646"> <tab_container follows="left|top" diff --git a/indra/newview/skins/default/xui/en/floater_device_settings.xml b/indra/newview/skins/default/xui/en/floater_device_settings.xml index 2b23980423c..91a7a678da1 100644 --- a/indra/newview/skins/default/xui/en/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_device_settings.xml @@ -1,11 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" height="260" layout="topleft" name="floater_device_settings" help_topic="floater_device_settings" - title="Voice Chat Device Settings" + title="VOICE CHAT DEVICE SETTINGS" width="405"> <panel bottom="260" diff --git a/indra/newview/skins/default/xui/en/floater_env_settings.xml b/indra/newview/skins/default/xui/en/floater_env_settings.xml index 7c22311f66a..5233cb023d4 100644 --- a/indra/newview/skins/default/xui/en/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_env_settings.xml @@ -6,7 +6,7 @@ name="Environment Editor Floater" help_topic="environment_editor_floater" save_rect="true" - title="Environment Editor" + title="ENVIRONMENT EDITOR" width="600"> <floater.string name="timeStr"> diff --git a/indra/newview/skins/default/xui/en/floater_font_test.xml b/indra/newview/skins/default/xui/en/floater_font_test.xml index 8b14f691d68..3ab19ec9d92 100644 --- a/indra/newview/skins/default/xui/en/floater_font_test.xml +++ b/indra/newview/skins/default/xui/en/floater_font_test.xml @@ -8,7 +8,7 @@ min_width="154" name="contents" help_topic="contents" - title="Font Test" + title="FONT TEST" width="500"> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml index 90b3339225e..b23482655cf 100644 --- a/indra/newview/skins/default/xui/en/floater_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_gesture.xml @@ -5,7 +5,7 @@ height="465" name="gestures" help_topic="gestures" - title="Gestures" + title="GESTURES" background_visible="true" follows="all" label="Places" diff --git a/indra/newview/skins/default/xui/en/floater_god_tools.xml b/indra/newview/skins/default/xui/en/floater_god_tools.xml index 97cb6e259c4..79eed52fbfa 100644 --- a/indra/newview/skins/default/xui/en/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml @@ -5,7 +5,7 @@ layout="topleft" name="godtools floater" help_topic="godtools_floater" - title="God Tools" + title="GOD TOOLS" width="400"> <tab_container follows="left|top" diff --git a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml index cd98f219184..1e2440580e1 100644 --- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml @@ -5,7 +5,7 @@ layout="topleft" name="Hardware Settings Floater" help_topic="hardware_settings_floater" - title="Hardware Settings" + title="HARDWARE SETTINGS" width="500"> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_help_browser.xml b/indra/newview/skins/default/xui/en/floater_help_browser.xml index d2fe8d0e6d7..f50ff01230c 100644 --- a/indra/newview/skins/default/xui/en/floater_help_browser.xml +++ b/indra/newview/skins/default/xui/en/floater_help_browser.xml @@ -10,7 +10,7 @@ help_topic="floater_help_browser" save_rect="true" single_instance="true" - title="Help Browser" + title="HELP BROWSER" width="620"> <floater.string name="home_page_url"> diff --git a/indra/newview/skins/default/xui/en/floater_hud.xml b/indra/newview/skins/default/xui/en/floater_hud.xml index 6e8950c49a4..99a6a95828e 100644 --- a/indra/newview/skins/default/xui/en/floater_hud.xml +++ b/indra/newview/skins/default/xui/en/floater_hud.xml @@ -8,7 +8,7 @@ help_topic="floater_hud" save_rect="true" save_visibility="true" - title="Tutorial" + title="TUTORIAL" width="362"> <web_browser border_visible="false" diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml index dcb93c6e2fa..16873df3101 100644 --- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml @@ -8,7 +8,7 @@ layout="topleft" name="incoming call" help_topic="incoming_call" - title="Unknown Person is calling" + title="UNKNOWN PERSON IS CALLING" width="240"> <floater.string name="anonymous"> diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml index 9f7723c51bf..3f7642fafef 100644 --- a/indra/newview/skins/default/xui/en/floater_inspect.xml +++ b/indra/newview/skins/default/xui/en/floater_inspect.xml @@ -9,7 +9,7 @@ name="inspect" help_topic="inspect" save_rect="true" - title="Inspect Objects" + title="INSPECT OBJECTS" width="400"> <floater.string name="timeStamp"> diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml index 3e19bdee0fe..30639f955f4 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory.xml @@ -12,7 +12,7 @@ save_rect="true" save_visibility="true" single_instance="true" - title="Inventory" + title="INVENTORY" width="467"> <floater.string name="Title"> diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml index 4f0609c7f8a..4ca6002c13e 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml @@ -7,7 +7,7 @@ name="item properties" help_topic="item_properties" save_rect="true" - title="Inventory Item Properties" + title="INVENTORY ITEM PROPERTIES" width="350"> <floater.string name="unknown"> diff --git a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml index 0042f97a8ee..90fee857fbb 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml @@ -6,7 +6,7 @@ layout="topleft" name="Inventory Finder" help_topic="inventory_finder" - title="inventory_recent_items" + title="INVENTORY_RECENT_ITEMS" width="280"> <icon height="16" diff --git a/indra/newview/skins/default/xui/en/floater_joystick.xml b/indra/newview/skins/default/xui/en/floater_joystick.xml index e2da059ace1..4d67e4c343c 100644 --- a/indra/newview/skins/default/xui/en/floater_joystick.xml +++ b/indra/newview/skins/default/xui/en/floater_joystick.xml @@ -5,7 +5,7 @@ layout="topleft" name="Joystick" help_topic="joystick" - title="Joystick Configuration" + title="JOYSTICK CONFIGURATION" width="550"> <floater.string name="NoDevice"> diff --git a/indra/newview/skins/default/xui/en/floater_lagmeter.xml b/indra/newview/skins/default/xui/en/floater_lagmeter.xml index c4b9463927c..19f5155f884 100644 --- a/indra/newview/skins/default/xui/en/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/en/floater_lagmeter.xml @@ -6,7 +6,7 @@ name="floater_lagmeter" help_topic="floater_lagmeter" save_rect="true" - title="Lag Meter" + title="LAG METER" width="350"> <floater.string name="max_title_msg"> diff --git a/indra/newview/skins/default/xui/en/floater_land_holdings.xml b/indra/newview/skins/default/xui/en/floater_land_holdings.xml index 85f0e6411bf..2c04a946131 100644 --- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml @@ -166,4 +166,4 @@ width="290"> [AREA] m² </text> -</floater> \ No newline at end of file +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml index 93bbb0107ee..e94717fe324 100644 --- a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" bevel_style="none" @@ -12,7 +12,7 @@ name="script ed float" help_topic="script_ed_float" save_rect="true" - title="Script: New Script" + title="SCRIPT: NEW SCRIPT" width="500"> <floater.string name="not_allowed"> diff --git a/indra/newview/skins/default/xui/en/floater_lsl_guide.xml b/indra/newview/skins/default/xui/en/floater_lsl_guide.xml index 4dcf1686053..a5b477313cc 100644 --- a/indra/newview/skins/default/xui/en/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/en/floater_lsl_guide.xml @@ -10,7 +10,7 @@ name="script ed float" help_topic="script_ed_float" save_rect="true" - title="LSL Wiki" + title="LSL WIKI" width="370"> <check_box follows="top|left" diff --git a/indra/newview/skins/default/xui/en/floater_media_browser.xml b/indra/newview/skins/default/xui/en/floater_media_browser.xml index bc590dc6120..d6b20c80159 100644 --- a/indra/newview/skins/default/xui/en/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/en/floater_media_browser.xml @@ -10,7 +10,7 @@ help_topic="floater_about" save_rect="true" single_instance="true" - title="Media Browser" + title="MEDIA BROWSER" width="820"> <floater.string name="home_page_url"> diff --git a/indra/newview/skins/default/xui/en/floater_media_settings.xml b/indra/newview/skins/default/xui/en/floater_media_settings.xml index 4218c154081..6b884d46a77 100644 --- a/indra/newview/skins/default/xui/en/floater_media_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_media_settings.xml @@ -17,7 +17,7 @@ mouse_opaque="true" name="Medis Settings" help_topic = "media_settings" - title="Media Settings"> + title="MEDIA SETTINGS"> <button bottom="-525" enabled="true" diff --git a/indra/newview/skins/default/xui/en/floater_mem_leaking.xml b/indra/newview/skins/default/xui/en/floater_mem_leaking.xml index 560acafd4f8..28a29c42aac 100644 --- a/indra/newview/skins/default/xui/en/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/en/floater_mem_leaking.xml @@ -7,7 +7,7 @@ layout="topleft" name="MemLeak" help_topic="memleak" - title="Simulate a Memory Leak" + title="SIMULATE A MEMORY LEAK" width="350"> <spinner decimal_digits="0" diff --git a/indra/newview/skins/default/xui/en/floater_mute_object.xml b/indra/newview/skins/default/xui/en/floater_mute_object.xml index 33b1dac8a55..454b1c43b2d 100644 --- a/indra/newview/skins/default/xui/en/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/en/floater_mute_object.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" can_minimize="false" @@ -6,7 +6,7 @@ layout="topleft" name="block by name" help_topic="mute_by_name" - title="Block object by name" + title="BLOCK OBJECT BY NAME" width="375"> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_my_friends.xml b/indra/newview/skins/default/xui/en/floater_my_friends.xml index 689221b9c79..e7efcc78444 100644 --- a/indra/newview/skins/default/xui/en/floater_my_friends.xml +++ b/indra/newview/skins/default/xui/en/floater_my_friends.xml @@ -11,7 +11,7 @@ help_topic="floater_my_friends" save_rect="true" single_instance="true" - title="Contacts" + title="CONTACTS" width="395"> <tab_container follows="all" diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml index e7c5bf85857..7f58ea132ea 100644 --- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml @@ -13,7 +13,7 @@ name="nearby_chat" help_topic="nearby_chat" save_rect="true" - title="Nearby Chat" + title="NEARBY CHAT" save_dock_state="true" save_visibility="true" single_instance="true" diff --git a/indra/newview/skins/default/xui/en/floater_notification.xml b/indra/newview/skins/default/xui/en/floater_notification.xml index f9cb22055ae..1f9ddecac27 100644 --- a/indra/newview/skins/default/xui/en/floater_notification.xml +++ b/indra/newview/skins/default/xui/en/floater_notification.xml @@ -6,7 +6,7 @@ layout="topleft" min_height="50" name="notification" - title="Notifications Console" + title="NOTIFICATIONS CONSOLE" width="200"> <text_editor type="string" diff --git a/indra/newview/skins/default/xui/en/floater_notifications_console.xml b/indra/newview/skins/default/xui/en/floater_notifications_console.xml index 03a2aad96d4..ca81b9bcf0f 100644 --- a/indra/newview/skins/default/xui/en/floater_notifications_console.xml +++ b/indra/newview/skins/default/xui/en/floater_notifications_console.xml @@ -8,7 +8,7 @@ name="notifications_console" help_topic="notifications_console" single_instance="true" - title="Notifications Console" + title="NOTIFICATIONS CONSOLE" width="500"> <combo_box follows="left|right|top" diff --git a/indra/newview/skins/default/xui/en/floater_openobject.xml b/indra/newview/skins/default/xui/en/floater_openobject.xml index af8aadf0e0b..3fd118df1c3 100644 --- a/indra/newview/skins/default/xui/en/floater_openobject.xml +++ b/indra/newview/skins/default/xui/en/floater_openobject.xml @@ -10,7 +10,7 @@ name="objectcontents" help_topic="objectcontents" save_rect="true" - title="Object Contents" + title="OBJECT CONTENTS" width="300"> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml index 0967706cc29..6faab84159d 100644 --- a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml @@ -6,7 +6,7 @@ name="perm prefs" help_topic="perm_prefs" save_rect="true" - title="Default Upload Permissions" + title="DEFAULT UPLOAD PERMISSIONS" width="315"> <panel follows="left|top|right|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_post_process.xml b/indra/newview/skins/default/xui/en/floater_post_process.xml index 46554beedea..05559adf89b 100644 --- a/indra/newview/skins/default/xui/en/floater_post_process.xml +++ b/indra/newview/skins/default/xui/en/floater_post_process.xml @@ -5,7 +5,7 @@ layout="topleft" name="Post-Process Floater" help_topic="post_process_floater" - title="Post-Process Settings" + title="POST-PROCESS SETTINGS" width="400"> <tab_container follows="left|top" diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml index b13bd1740cd..3a7b6cc8323 100644 --- a/indra/newview/skins/default/xui/en/floater_postcard.xml +++ b/indra/newview/skins/default/xui/en/floater_postcard.xml @@ -10,7 +10,7 @@ min_width="450" name="Postcard" help_topic="postcard" - title="Email Snapshot" + title="EMAIL SNAPSHOT" width="450"> <floater.string name="default_subject"> diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index d2a2a7ce023..d182cdc6bbd 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -9,7 +9,7 @@ name="Preferences" help_topic="preferences" single_instance="true" - title="Preferences" + title="PREFERENCES" width="620"> <button follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_preview_classified.xml b/indra/newview/skins/default/xui/en/floater_preview_classified.xml index 7c8c6d72077..2017cf2bd10 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_classified.xml @@ -7,7 +7,7 @@ name="classified_preview" help_topic="classified_preview" save_rect="true" - title="Classified Information" + title="CLASSIFIED INFORMATION" width="440"> <floater.string name="Title"> diff --git a/indra/newview/skins/default/xui/en/floater_preview_event.xml b/indra/newview/skins/default/xui/en/floater_preview_event.xml index f5ab8c95d71..a4066b34c56 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_event.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" auto_tile="true" @@ -7,7 +7,7 @@ name="event_preview" help_topic="event_preview" save_rect="true" - title="Event Information" + title="EVENT INFORMATION" width="440"> <floater.string name="Title"> diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture_info.xml index fc838f27b4b..66408a50572 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture_info.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_gesture_info.xml @@ -8,7 +8,7 @@ name="Gesture" help_topic="gesture" save_rect="true" - title="Gesture Shortcut" + title="GESTURE SHORTCUT" width="260"> <scroll_list follows="top|left" @@ -54,4 +54,4 @@ name="save_btn" top_delta="0" width="80" /--> -</floater> \ No newline at end of file +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture_shortcut.xml index b489ae2e771..26252a7a16d 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture_shortcut.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_gesture_shortcut.xml @@ -8,7 +8,7 @@ name="Gesture" help_topic="gesture" save_rect="true" - title="Gesture Shortcut" + title="GESTURE SHORTCUT" width="260"> <text type="string" @@ -85,4 +85,4 @@ tool_tip="Replace the trigger word(s) with these words. For example, trigger 'hello' replace with 'howdy' will turn the chat 'I wanted to say hello' into 'I wanted to say howdy' as well as playing the gesture" top_delta="-4" width="135" /> -</floater> \ No newline at end of file +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture_steps.xml index 8a07f3ad1ed..34f707cd2ae 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture_steps.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_gesture_steps.xml @@ -8,7 +8,7 @@ name="Gesture" help_topic="gesture" save_rect="true" - title="Gesture Shortcut" + title="GESTURE SHORTCUT" width="260"> <scroll_list follows="top|left" @@ -239,4 +239,4 @@ unless you add wait steps. name="wait_time_editor" top_delta="0" width="50" /--> -</floater> \ No newline at end of file +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml index b44de8e1782..06dbdc95393 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml @@ -11,7 +11,7 @@ min_width="234" name="preview notecard" help_topic="preview_notecard" - title="Note:" + title="NOTE:" width="400"> <floater.string name="no_object"> diff --git a/indra/newview/skins/default/xui/en/floater_region_info.xml b/indra/newview/skins/default/xui/en/floater_region_info.xml index ae01d0bdf43..9bb30f8e86d 100644 --- a/indra/newview/skins/default/xui/en/floater_region_info.xml +++ b/indra/newview/skins/default/xui/en/floater_region_info.xml @@ -6,7 +6,7 @@ layout="topleft" name="regioninfo" save_rect="true" - title="Region/Estate" + title="REGION/ESTATE" width="480"> <tab_container bottom="512" diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml index 0b61dcef583..696233676cd 100644 --- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml @@ -5,7 +5,7 @@ layout="topleft" name="floater_report_abuse" help_topic="floater_report_abuse" - title="Report Abuse" + title="REPORT ABUSE" width="333"> <floater.string name="Screenshot"> diff --git a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml index 0029fcb09b5..bd9925be1da 100644 --- a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml +++ b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml @@ -7,8 +7,8 @@ layout="topleft" name="script" help_topic="script" - short_title="[All scripts]" - title="[All scripts]" + short_title="[ALL SCRIPTS]" + title="[ALL SCRIPTS]" width="440"> <text_editor bottom="197" diff --git a/indra/newview/skins/default/xui/en/floater_script_preview.xml b/indra/newview/skins/default/xui/en/floater_script_preview.xml index c29a2f4516c..bb0702c3531 100644 --- a/indra/newview/skins/default/xui/en/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_script_preview.xml @@ -11,7 +11,7 @@ name="preview lsl text" help_topic="preview_lsl_text" save_rect="true" - title="Script: Rotation Script" + title="SCRIPT: ROTATION SCRIPT" top_delta="0" width="500"> <floater.string diff --git a/indra/newview/skins/default/xui/en/floater_script_queue.xml b/indra/newview/skins/default/xui/en/floater_script_queue.xml index 8a442524266..60a26fcf1d4 100644 --- a/indra/newview/skins/default/xui/en/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/en/floater_script_queue.xml @@ -8,7 +8,7 @@ name="queue" help_topic="queue" save_rect="true" - title="Reset Progress" + title="RESET PROGRESS" width="300"> <floater.string name="Starting"> diff --git a/indra/newview/skins/default/xui/en/floater_script_search.xml b/indra/newview/skins/default/xui/en/floater_script_search.xml index 79c4438dd6b..ade0156bc79 100644 --- a/indra/newview/skins/default/xui/en/floater_script_search.xml +++ b/indra/newview/skins/default/xui/en/floater_script_search.xml @@ -6,7 +6,7 @@ layout="topleft" name="script search" help_topic="script_search" - title="Script Search" + title="SCRIPT SEARCH" width="300"> <check_box control_name="LSLFindCaseInsensitivity" diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index 2f4d7c50a16..f7ba719dc26 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -10,7 +10,7 @@ help_topic="floater_search" save_rect="true" single_instance="true" - title="Search [SECOND_LIFE]" + title="SEARCH [SECOND_LIFE]" width="620"> <floater.string name="search_url"> diff --git a/indra/newview/skins/default/xui/en/floater_sell_land.xml b/indra/newview/skins/default/xui/en/floater_sell_land.xml index 8fedd0a89f0..45d59e280bd 100644 --- a/indra/newview/skins/default/xui/en/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml @@ -7,7 +7,7 @@ name="sell land" help_topic="sell_land" single_instance="true" - title="Sell Land" + title="SELL LAND" width="313"> <scroll_container color="DkGray2" diff --git a/indra/newview/skins/default/xui/en/floater_settings_debug.xml b/indra/newview/skins/default/xui/en/floater_settings_debug.xml index 02b3cee97c2..ffb11f3f18f 100644 --- a/indra/newview/skins/default/xui/en/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/en/floater_settings_debug.xml @@ -6,7 +6,7 @@ layout="topleft" name="settings_debug" help_topic="settings_debug" - title="Debug Settings" + title="DEBUG SETTINGS" width="350"> <combo_box allow_text_entry="true" diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 4f2be37ade6..95a40e27f75 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -8,7 +8,7 @@ name="Snapshot" help_topic="snapshot" save_rect="true" - title="Snapshot Preview" + title="SNAPSHOT PREVIEW" width="215"> <floater.string name="unknown"> diff --git a/indra/newview/skins/default/xui/en/floater_sound_preview.xml b/indra/newview/skins/default/xui/en/floater_sound_preview.xml index 6145b722f1c..ca54ee66049 100644 --- a/indra/newview/skins/default/xui/en/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_sound_preview.xml @@ -5,7 +5,7 @@ layout="topleft" name="Sound Preview" help_topic="sound_preview" - title="sound.wav" + title="SOUND.WAV" width="300"> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_statistics.xml b/indra/newview/skins/default/xui/en/floater_statistics.xml index ab783b0735a..3a4e8451411 100644 --- a/indra/newview/skins/default/xui/en/floater_statistics.xml +++ b/indra/newview/skins/default/xui/en/floater_statistics.xml @@ -8,5 +8,5 @@ mouse_opaque="false" name="stats floater" help_topic="stats_floater" - title="Statistics" + title="STATISTICS" width="250" /> diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml index bdc28742814..68a4867167f 100644 --- a/indra/newview/skins/default/xui/en/floater_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_stats.xml @@ -9,7 +9,7 @@ help_topic="statistics" save_rect="true" save_visibility="true" - title="Statistics" + title="STATISTICS" width="250"> <scroll_container follows="top|left|bottom|right" diff --git a/indra/newview/skins/default/xui/en/floater_telehub.xml b/indra/newview/skins/default/xui/en/floater_telehub.xml index faf1a378f25..cc0ab8c57e8 100644 --- a/indra/newview/skins/default/xui/en/floater_telehub.xml +++ b/indra/newview/skins/default/xui/en/floater_telehub.xml @@ -5,7 +5,7 @@ layout="topleft" name="telehub" help_topic="telehub" - title="Telehub" + title="TELEHUB" width="280"> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml index c954607ffe7..9143048aeb8 100644 --- a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml +++ b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml @@ -6,7 +6,7 @@ layout="topleft" name="floater_test_inspectors" help_topic="floater_test_inspectors" - title="Test Inspectors" + title="TEST INSPECTORS" width="400"> <text height="20" diff --git a/indra/newview/skins/default/xui/en/floater_test_widgets.xml b/indra/newview/skins/default/xui/en/floater_test_widgets.xml index 129fd863dd4..718d724aa6a 100644 --- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml +++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml @@ -18,7 +18,7 @@ legacy_header_height="18" can_dock="true" can_resize="true" - title="Test Floater" + title="TEST FLOATER" height="500" min_width="850" min_height="500" diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml index 7b0baa5de22..88afa549725 100644 --- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml @@ -9,7 +9,7 @@ min_width="410" name="texture picker" help_topic="texture_picker" - title="Pick: Texture" + title="PICK: TEXTURE" width="410"> <floater.string name="choose_picture"> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 0614653d76f..c33d7cf31d8 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -9,7 +9,7 @@ name="toolbox floater" help_topic="toolbox_floater" save_rect="true" - short_title="Build Tools" + short_title="BUILD TOOLS" single_instance="true" sound_flags="0" width="280"> diff --git a/indra/newview/skins/default/xui/en/floater_top_objects.xml b/indra/newview/skins/default/xui/en/floater_top_objects.xml index 2f53422d513..d2db26daec5 100644 --- a/indra/newview/skins/default/xui/en/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/en/floater_top_objects.xml @@ -8,7 +8,7 @@ min_width="450" name="top_objects" help_topic="top_objects" - title="loading..." + title="LOADING..." width="550"> <floater.string name="top_scripts_title"> diff --git a/indra/newview/skins/default/xui/en/floater_ui_preview.xml b/indra/newview/skins/default/xui/en/floater_ui_preview.xml index 380e51977f2..8b2136c2dc4 100644 --- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml @@ -9,7 +9,7 @@ name="gui_preview_tool" help_topic="gui_preview_tool" single_instance="true" - title="XUI Preview Tool" + title="XUI PREVIEW TOOL" width="750"> <panel bottom="640" diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml index 012b69c3e3f..a6876dcf7d3 100644 --- a/indra/newview/skins/default/xui/en/floater_water.xml +++ b/indra/newview/skins/default/xui/en/floater_water.xml @@ -6,7 +6,7 @@ name="Water Floater" help_topic="water_floater" save_rect="true" - title="Advanced Water Editor" + title="ADVANCED WATER EDITOR" width="700"> <floater.string name="WLDefaultWaterNames"> diff --git a/indra/newview/skins/default/xui/en/floater_windlight_options.xml b/indra/newview/skins/default/xui/en/floater_windlight_options.xml index fd905d7a14e..0cb7814c6a4 100644 --- a/indra/newview/skins/default/xui/en/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/en/floater_windlight_options.xml @@ -6,7 +6,7 @@ name="WindLight floater" help_topic="windlight_floater" save_rect="true" - title="Advanced Sky Editor" + title="ADVANCED SKY EDITOR" width="700"> <floater.string name="WLDefaultSkyNames"> diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index 93755fa2532..f5ae611f937 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -13,7 +13,7 @@ save_rect="true" save_visibility="true" single_instance="true" - title="World Map" + title="WORLD MAP" width="800"> <tab_container follows="left|top|right|bottom" diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml index 071d5055699..5545ab29e0c 100644 --- a/indra/newview/skins/default/xui/es/floater_about.xml +++ b/indra/newview/skins/default/xui/es/floater_about.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="Acerca de [APP_NAME]"> +<floater name="floater_about" title="ACERCA DE [APP_NAME]"> <tab_container name="about_tab"> <panel name="credits_panel"> <text_editor name="credits_editor"> 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 bc775c1b1c1..7575df4b98f 100644 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="Acerca del terreno"> +<floater name="floaterland" title="ACERCA DEL TERRENO"> <tab_container name="landtab"> <panel label="General" name="land_general_panel"> <text name="Name:"> diff --git a/indra/newview/skins/default/xui/es/floater_auction.xml b/indra/newview/skins/default/xui/es/floater_auction.xml index c6d89891bca..5196ac0b78c 100644 --- a/indra/newview/skins/default/xui/es/floater_auction.xml +++ b/indra/newview/skins/default/xui/es/floater_auction.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="Empezar venta de terreno Linden"> +<floater name="floater_auction" title="EMPEZAR VENTA DE TERRENO LINDEN"> <check_box label="Incluir la valla amarilla de selección" name="fence_check"/> <button label="Foto" label_selected="Foto" name="snapshot_btn"/> <button label="OK" label_selected="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/es/floater_avatar_picker.xml b/indra/newview/skins/default/xui/es/floater_avatar_picker.xml index 68a56ac6782..df0147b191a 100644 --- a/indra/newview/skins/default/xui/es/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/es/floater_avatar_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="Elegir a un residente"> +<floater name="avatarpicker" title="ELEGIR A UN RESIDENTE"> <tab_container name="ResidentChooserTabs"> <panel label="Buscar" name="SearchPanel"> <text name="InstructSearchResidentName"> diff --git a/indra/newview/skins/default/xui/es/floater_avatar_textures.xml b/indra/newview/skins/default/xui/es/floater_avatar_textures.xml index 6344768c7f3..8febe4b0a9d 100644 --- a/indra/newview/skins/default/xui/es/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/es/floater_avatar_textures.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatar_texture_debug" title="Texturas del avatar"> +<floater name="avatar_texture_debug" title="TEXTURAS DEL AVATAR"> <text name="baked_label"> Texturas predeterminadas </text> diff --git a/indra/newview/skins/default/xui/es/floater_beacons.xml b/indra/newview/skins/default/xui/es/floater_beacons.xml index 9282cb04a69..2df90bc911f 100644 --- a/indra/newview/skins/default/xui/es/floater_beacons.xml +++ b/indra/newview/skins/default/xui/es/floater_beacons.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="Balizas"> +<floater name="beacons" title="BALIZAS"> <panel name="beacons_panel"> <check_box label="Objetos con script sólo al tocarlos" name="touch_only"/> <check_box label="Objetos con script" name="scripted"/> diff --git a/indra/newview/skins/default/xui/es/floater_build_options.xml b/indra/newview/skins/default/xui/es/floater_build_options.xml index c3e4acacf09..3d839bf645f 100644 --- a/indra/newview/skins/default/xui/es/floater_build_options.xml +++ b/indra/newview/skins/default/xui/es/floater_build_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="build options floater" title="Opciones de la cuadrÃcula"> +<floater name="build options floater" title="OPCIONES DE LA CUADRÃCULA"> <spinner label="Unidad de la cuadrÃcula (metros)" name="GridResolution" width="250" label_width="192"/> <spinner label="Graduación de la cuadrÃcula (metros)" name="GridDrawSize" width="250" label_width="192"/> <check_box label="Activar subunidades" name="GridSubUnit"/> diff --git a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml index 32517130743..0553f4c6725 100644 --- a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="Cambio masivo de los permisos del contenido"> +<floater name="floaterbulkperms" title="CAMBIO MASIVO DE LOS PERMISOS DEL CONTENIDO"> <text name="applyto"> Tipos de contenido </text> diff --git a/indra/newview/skins/default/xui/es/floater_bumps.xml b/indra/newview/skins/default/xui/es/floater_bumps.xml index ed43e936880..0522f788bbd 100644 --- a/indra/newview/skins/default/xui/es/floater_bumps.xml +++ b/indra/newview/skins/default/xui/es/floater_bumps.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_bumps" title="Choques, empujones, e impactos"> +<floater name="floater_bumps" title="CHOQUES, EMPUJONES, E IMPACTOS"> <text name="none_detected"> No se han detectado </text> diff --git a/indra/newview/skins/default/xui/es/floater_buy_contents.xml b/indra/newview/skins/default/xui/es/floater_buy_contents.xml index 2346798f94a..c4d269ff391 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_contents.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_buy_contents" title="Comprar el contenido"> +<floater name="floater_buy_contents" title="COMPRAR EL CONTENIDO"> <text name="contains_text"> [NAME] contiene: </text> diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml index a01e07e694b..af542acbcef 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy currency" title="Comprar dinero"> +<floater name="buy currency" title="COMPRAR DINERO"> <text name="info_buying"> Comprando dinero: </text> diff --git a/indra/newview/skins/default/xui/es/floater_buy_land.xml b/indra/newview/skins/default/xui/es/floater_buy_land.xml index 7ee15955eb3..7ff45fcf799 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy land" title="Comprar terreno"> +<floater name="buy land" title="COMPRAR TERRENO"> <text name="region_name_label"> Región: </text> diff --git a/indra/newview/skins/default/xui/es/floater_buy_object.xml b/indra/newview/skins/default/xui/es/floater_buy_object.xml index 8e713f362b4..26696bc8682 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Comprar una copia del objeto"> +<floater name="contents" title="COMPRAR UNA COPIA DEL OBJETO"> <text name="contents_text"> y sus contenidos: </text> diff --git a/indra/newview/skins/default/xui/es/floater_choose_group.xml b/indra/newview/skins/default/xui/es/floater_choose_group.xml index 71331abb654..a5967b814eb 100644 --- a/indra/newview/skins/default/xui/es/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/es/floater_choose_group.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="groups" title="Grupos"> +<floater name="groups" title="GRUPOS"> <text name="groupdesc"> Elegir un grupo: </text> diff --git a/indra/newview/skins/default/xui/es/floater_color_picker.xml b/indra/newview/skins/default/xui/es/floater_color_picker.xml index 616c373d187..4395ee6890e 100644 --- a/indra/newview/skins/default/xui/es/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/es/floater_color_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="ColorPicker" title="Paleta de colores"> +<floater name="ColorPicker" title="PALETA DE COLORES"> <text name="r_val_text"> Rojo: </text> diff --git a/indra/newview/skins/default/xui/es/floater_customize.xml b/indra/newview/skins/default/xui/es/floater_customize.xml index 1322b9a5cf2..94452dae6b0 100644 --- a/indra/newview/skins/default/xui/es/floater_customize.xml +++ b/indra/newview/skins/default/xui/es/floater_customize.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="Apariencia" width="527"> +<floater name="floater customize" title="APARIENCIA" width="527"> <tab_container name="customize tab container" width="525"> <placeholder label="Partes del cuerpo" name="body_parts_placeholder"/> <panel label="Forma" name="Shape" width="389"> diff --git a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml index 9ee7fc3ead2..fc2b12d1e46 100644 --- a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Day Cycle Floater" title="Editor del ciclo de un dÃa"> +<floater name="Day Cycle Floater" title="EDITOR DEL CICLO DE UN DÃA"> <tab_container name="Day Cycle Tabs"> <panel label="Ciclo de un dÃa" name="Day Cycle"> <button label="?" name="WLDayCycleHelp"/> diff --git a/indra/newview/skins/default/xui/es/floater_device_settings.xml b/indra/newview/skins/default/xui/es/floater_device_settings.xml index e8989f44ef8..eadf04a4170 100644 --- a/indra/newview/skins/default/xui/es/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/es/floater_device_settings.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_device_settings" title="Configuración de los dispositivos del chat de voz"/> +<floater name="floater_device_settings" title="CONFIGURACIÓN DE LOS DISPOSITIVOS DEL CHAT DE VOZ"/> diff --git a/indra/newview/skins/default/xui/es/floater_env_settings.xml b/indra/newview/skins/default/xui/es/floater_env_settings.xml index 65710fc5ed7..5d6ba47daf1 100644 --- a/indra/newview/skins/default/xui/es/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/es/floater_env_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Environment Editor Floater" title="Editor del entorno"> +<floater name="Environment Editor Floater" title="EDITOR DEL ENTORNO"> <text name="EnvTimeText"> Duración de un dÃa diff --git a/indra/newview/skins/default/xui/es/floater_font_test.xml b/indra/newview/skins/default/xui/es/floater_font_test.xml index e6b8087b607..9a665321a46 100644 --- a/indra/newview/skins/default/xui/es/floater_font_test.xml +++ b/indra/newview/skins/default/xui/es/floater_font_test.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Prueba de fuentes"> +<floater name="contents" title="PRUEBA DE FUENTES"> <text name="linea"> OverrideTest, deberÃa de aparecer aquà en Times. (Desde default/xui/en-us) </text> diff --git a/indra/newview/skins/default/xui/es/floater_gesture.xml b/indra/newview/skins/default/xui/es/floater_gesture.xml index e7f1a7aca27..496881f2d23 100644 --- a/indra/newview/skins/default/xui/es/floater_gesture.xml +++ b/indra/newview/skins/default/xui/es/floater_gesture.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="gestures" title="Gestos disponibles"> +<floater name="gestures" title="GESTOS DISPONIBLES"> <text name="help_label"> Pulse dos veces en un gesto para reproducir las animaciones y sonidos. diff --git a/indra/newview/skins/default/xui/es/floater_god_tools.xml b/indra/newview/skins/default/xui/es/floater_god_tools.xml index ea2571ecb88..78ec76e32bc 100644 --- a/indra/newview/skins/default/xui/es/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_god_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="godtools floater" title="Herramientas de Dios"> +<floater name="godtools floater" title="HERRAMIENTAS DE DIOS"> <tab_container name="GodTools Tabs"> <panel label="Red" name="grid"> <button label="Expulsar a todos los usuarios" diff --git a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml index 29750ee7371..9418252036e 100644 --- a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Hardware Settings Floater" title="Configuración del hardware"> +<floater name="Hardware Settings Floater" title="CONFIGURACIÓN DEL HARDWARE"> <text name="Filtering:"> Filtrado: </text> diff --git a/indra/newview/skins/default/xui/es/floater_hud.xml b/indra/newview/skins/default/xui/es/floater_hud.xml index d31bcedf05e..e458913452f 100644 --- a/indra/newview/skins/default/xui/es/floater_hud.xml +++ b/indra/newview/skins/default/xui/es/floater_hud.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_hud" title="Tutorial"/> +<floater name="floater_hud" title="TUTORIAL"/> diff --git a/indra/newview/skins/default/xui/es/floater_inspect.xml b/indra/newview/skins/default/xui/es/floater_inspect.xml index 026081bc042..3c8b38648f6 100644 --- a/indra/newview/skins/default/xui/es/floater_inspect.xml +++ b/indra/newview/skins/default/xui/es/floater_inspect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="inspect" title="Examinar objetos" min_width="450"> +<floater name="inspect" title="EXAMINAR OBJETOS" min_width="450"> <scroll_list name="object_list" tool_tip="Seleccione un objeto de esta lista para realzarlo en el mundo"> <column label="Nombre del objeto" name="object_name"/> <column label="Propietario" name="owner_name"/> diff --git a/indra/newview/skins/default/xui/es/floater_inventory.xml b/indra/newview/skins/default/xui/es/floater_inventory.xml index 7da14c0579d..8d16d6089ee 100644 --- a/indra/newview/skins/default/xui/es/floater_inventory.xml +++ b/indra/newview/skins/default/xui/es/floater_inventory.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory" title="Inventario"> +<floater name="Inventory" title="INVENTARIO"> <search_editor label="Escriba aquà para buscar" name="inventory search editor"/> <tab_container name="inventory filter tabs"> <inventory_panel label="Todos los Ãtems" name="All Items"/> diff --git a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml index 4df3ca2cf6f..7abdfceb94e 100644 --- a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="item properties" title="Propiedades del Ãtem del inventario"> +<floater name="item properties" title="PROPIEDADES DEL ÃTEM DEL INVENTARIO"> <text name="LabelItemNameTitle"> Nombre: </text> diff --git a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml index 7cd787bfb51..0cbee11bfb8 100644 --- a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory Finder" title="Ãtems_recientes_del_inventario"> +<floater name="Inventory Finder" title="ÃTEMS_RECIENTES_DEL_INVENTARIO"> <check_box label="Animaciones" name="check_animation"/> <check_box label="Tarjetas de visita" name="check_calling_card"/> <check_box label="Ropa" name="check_clothing"/> diff --git a/indra/newview/skins/default/xui/es/floater_joystick.xml b/indra/newview/skins/default/xui/es/floater_joystick.xml index 2e0fb87744b..75c53dd646f 100644 --- a/indra/newview/skins/default/xui/es/floater_joystick.xml +++ b/indra/newview/skins/default/xui/es/floater_joystick.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Joystick" title="Configuración del joystick"> +<floater name="Joystick" title="CONFIGURACIÓN DEL JOYSTICK"> <check_box name="enable_joystick" label="Activar el joystick:"/> <text left="140" name="joystick_type" width="360"/> <spinner label="Mapping: eje X" name="JoystickAxis1" label_width="118" width="161"/> diff --git a/indra/newview/skins/default/xui/es/floater_lagmeter.xml b/indra/newview/skins/default/xui/es/floater_lagmeter.xml index 1af0bb065cb..54c4ce8c6ac 100644 --- a/indra/newview/skins/default/xui/es/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/es/floater_lagmeter.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_lagmeter" title="Medidor del lag"> +<floater name="floater_lagmeter" title="MEDIDOR DEL LAG"> <button label="" label_selected="" name="client_lagmeter" tool_tip="Estado del lag del cliente"/> <text name="client"> Cliente: diff --git a/indra/newview/skins/default/xui/es/floater_land_holdings.xml b/indra/newview/skins/default/xui/es/floater_land_holdings.xml index 5df319905df..bcdebf45884 100644 --- a/indra/newview/skins/default/xui/es/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/es/floater_land_holdings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="Mi terreno"> +<floater name="land holdings floater" title="MI TERRENO"> <scroll_list name="parcel list"> <column label="Nombre de la parcela" name="name"/> <column label="Región" name="location"/> diff --git a/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml index 226c3482af2..02be809319f 100644 --- a/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="Script: script nuevo"> +<floater name="script ed float" title="SCRIPT: SCRIPT NUEVO"> <button label="Reiniciar" label_selected="Reiniciar" name="Reset"/> <check_box label="Ejecutándose" name="running" left="4"/> <check_box label="Mono" name="mono" left="106"/> diff --git a/indra/newview/skins/default/xui/es/floater_lsl_guide.xml b/indra/newview/skins/default/xui/es/floater_lsl_guide.xml index 859a2d38124..0cde2fe5bc9 100644 --- a/indra/newview/skins/default/xui/es/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/es/floater_lsl_guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="Wiki de LSL"> +<floater name="script ed float" title="WIKI DE LSL"> <check_box label="Seguir al cursor" name="lock_check"/> <combo_box label="Bloquear" name="history_combo" left_delta="120" width="70"/> <button label="Atrás" name="back_btn" left_delta="75"/> diff --git a/indra/newview/skins/default/xui/es/floater_media_browser.xml b/indra/newview/skins/default/xui/es/floater_media_browser.xml index 79c8980c025..ff50b56a32f 100644 --- a/indra/newview/skins/default/xui/es/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/es/floater_media_browser.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="Navegador"> +<floater name="floater_about" title="NAVEGADOR"> <layout_stack name="stack1"> <layout_panel name="nav_controls"> <button label="Atrás" name="back" width="75"/> diff --git a/indra/newview/skins/default/xui/es/floater_mem_leaking.xml b/indra/newview/skins/default/xui/es/floater_mem_leaking.xml index a2791d64327..6d5e987409e 100644 --- a/indra/newview/skins/default/xui/es/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/es/floater_mem_leaking.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="MemLeak" title="Prueba de la fuga de memoria"> +<floater name="MemLeak" title="PRUEBA DE LA FUGA DE MEMORIA"> <spinner label="Velocidad de la fuga (bites por fotograma):" name="leak_speed"/> <spinner label="Fuga de memoria máx. (MB):" name="max_leak"/> <text name="total_leaked_label"> diff --git a/indra/newview/skins/default/xui/es/floater_mute_object.xml b/indra/newview/skins/default/xui/es/floater_mute_object.xml index 0cf38c09ee0..390333cd1d5 100644 --- a/indra/newview/skins/default/xui/es/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/es/floater_mute_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="mute by name" title="Ignorar un objeto según su nombre"> +<floater name="mute by name" title="IGNORAR UN OBJETO SEGÚN SU NOMBRE"> <text name="message" bottom_delta="-40"> Ignorar según el nombre sólo afecta al chat y los MI del objeto, no a sus sonidos. diff --git a/indra/newview/skins/default/xui/es/floater_my_friends.xml b/indra/newview/skins/default/xui/es/floater_my_friends.xml index d555eed305f..07f362560b9 100644 --- a/indra/newview/skins/default/xui/es/floater_my_friends.xml +++ b/indra/newview/skins/default/xui/es/floater_my_friends.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_my_friends" title="Contactos"> +<floater name="floater_my_friends" title="CONTACTOS"> <tab_container name="friends_and_groups"> <panel label="Amigos" name="friends_panel"/> <panel label="Grupos" name="groups_panel"/> diff --git a/indra/newview/skins/default/xui/es/floater_openobject.xml b/indra/newview/skins/default/xui/es/floater_openobject.xml index 60487b829c5..89c79e88339 100644 --- a/indra/newview/skins/default/xui/es/floater_openobject.xml +++ b/indra/newview/skins/default/xui/es/floater_openobject.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="objectcontents" title="Contenido del objeto"> +<floater name="objectcontents" title="CONTENIDO DEL OBJETO"> <text name="object_name"> [DESC]: </text> diff --git a/indra/newview/skins/default/xui/es/floater_perm_prefs.xml b/indra/newview/skins/default/xui/es/floater_perm_prefs.xml index 4a3977be3d4..7d3c8e62f3d 100644 --- a/indra/newview/skins/default/xui/es/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/es/floater_perm_prefs.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="perm prefs" title="Permisos de subida por defecto"> +<floater name="perm prefs" title="PERMISOS DE SUBIDA POR DEFECTO"> <panel label="Permisos" name="permissions"> <button label="?" label_selected="?" name="help"/> <check_box label="Compartir con el grupo" name="share_with_group"/> diff --git a/indra/newview/skins/default/xui/es/floater_post_process.xml b/indra/newview/skins/default/xui/es/floater_post_process.xml index acac2b2bf91..5c62ccde360 100644 --- a/indra/newview/skins/default/xui/es/floater_post_process.xml +++ b/indra/newview/skins/default/xui/es/floater_post_process.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Post-Process Floater" title="Configuración del procesamiento"> +<floater name="Post-Process Floater" title="CONFIGURACIÓN DEL PROCESAMIENTO"> <tab_container name="Post-Process Tabs"> <panel label="Color del filtro" name="wmiColorFilterPanel"> <check_box label="Activar" name="wmiColorFilterToggle"/> diff --git a/indra/newview/skins/default/xui/es/floater_postcard.xml b/indra/newview/skins/default/xui/es/floater_postcard.xml index 6a9811c0583..ace3204cc7b 100644 --- a/indra/newview/skins/default/xui/es/floater_postcard.xml +++ b/indra/newview/skins/default/xui/es/floater_postcard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Postcard" title="Foto por correo electrónico"> +<floater name="Postcard" title="FOTO POR CORREO ELECTRÓNICO"> <text name="to_label"> Correo electrónico del destinatario: diff --git a/indra/newview/skins/default/xui/es/floater_preferences.xml b/indra/newview/skins/default/xui/es/floater_preferences.xml index df7fc93dd9e..5fe4ae3b64c 100644 --- a/indra/newview/skins/default/xui/es/floater_preferences.xml +++ b/indra/newview/skins/default/xui/es/floater_preferences.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Preferences" title="Preferencias" min_width="350" width="646"> +<floater name="Preferences" title="PREFERENCIAS" min_width="350" width="646"> <button label="OK" label_selected="OK" name="OK"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> <button label="Aplicar" label_selected="Aplicar" name="Apply"/> diff --git a/indra/newview/skins/default/xui/es/floater_preview_classified.xml b/indra/newview/skins/default/xui/es/floater_preview_classified.xml index f2fa38ead83..8114c7f3c2b 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_classified.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="Información clasificada"/> +<floater name="classified_preview" title="INFORMACIÓN CLASIFICADA"/> diff --git a/indra/newview/skins/default/xui/es/floater_preview_event.xml b/indra/newview/skins/default/xui/es/floater_preview_event.xml index 7f727b05024..04cb0de4d40 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_event.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="Información de eventos"/> +<floater name="event_preview" title="INFORMACIÓN DE EVENTOS"/> diff --git a/indra/newview/skins/default/xui/es/floater_preview_notecard.xml b/indra/newview/skins/default/xui/es/floater_preview_notecard.xml index 4d11520335e..35f795a7ec8 100644 --- a/indra/newview/skins/default/xui/es/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/es/floater_preview_notecard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview notecard" title="Nota:"> +<floater name="preview notecard" title="NOTA:"> <button label="Guardar" label_selected="Guardar" name="Save"/> <text name="desc txt"> Descripción: diff --git a/indra/newview/skins/default/xui/es/floater_region_info.xml b/indra/newview/skins/default/xui/es/floater_region_info.xml index b5a85378c20..46d0839238d 100644 --- a/indra/newview/skins/default/xui/es/floater_region_info.xml +++ b/indra/newview/skins/default/xui/es/floater_region_info.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="regioninfo" title="Región/Estado"/> +<floater name="regioninfo" title="REGIÓN/ESTADO"/> diff --git a/indra/newview/skins/default/xui/es/floater_report_abuse.xml b/indra/newview/skins/default/xui/es/floater_report_abuse.xml index 8ae8c212e6a..a075c512470 100644 --- a/indra/newview/skins/default/xui/es/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/es/floater_report_abuse.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="Denuncia de Infracción"> +<floater name="floater_report_abuse" title="DENUNCIA DE INFRACCIÓN"> <texture_picker label="" name="screenshot"/> <check_box label="Incluir una captura de pantalla" name="screen_check"/> <text name="reporter_title"> diff --git a/indra/newview/skins/default/xui/es/floater_script_debug.xml b/indra/newview/skins/default/xui/es/floater_script_debug.xml index e9b66c74d20..e7eddfd9f33 100644 --- a/indra/newview/skins/default/xui/es/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/es/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="script debug floater" title="Alerta/Error de los scripts"> <tab_container name="Preview Tabs"> - <floater label="Script" name="all_scripts" title="[All scripts]"/> + <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]"/> </tab_container> </multi_floater> diff --git a/indra/newview/skins/default/xui/es/floater_script_preview.xml b/indra/newview/skins/default/xui/es/floater_script_preview.xml index 0d8cd0b4068..79984e7bc11 100644 --- a/indra/newview/skins/default/xui/es/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/es/floater_script_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview lsl text" title="Script: script de rotación"> +<floater name="preview lsl text" title="SCRIPT: SCRIPT DE ROTACIÓN"> <text name="desc txt"> Descripción: </text> diff --git a/indra/newview/skins/default/xui/es/floater_script_queue.xml b/indra/newview/skins/default/xui/es/floater_script_queue.xml index dcd2bfe5b0c..ace596cd9a1 100644 --- a/indra/newview/skins/default/xui/es/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/es/floater_script_queue.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="queue" title="Reinicio"> +<floater name="queue" title="REINICIO"> <button label="Cerrar" label_selected="Cerrar" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_script_search.xml b/indra/newview/skins/default/xui/es/floater_script_search.xml index 3c8dc2fe9c1..a59f258a18e 100644 --- a/indra/newview/skins/default/xui/es/floater_script_search.xml +++ b/indra/newview/skins/default/xui/es/floater_script_search.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script search" title="Buscar en el script" width="320"> +<floater name="script search" title="BUSCAR EN EL SCRIPT" width="320"> <check_box label="Indiferente mays./mins." name="case_text" left="75"/> <button label="Buscar" label_selected="Buscar" name="search_btn" width="85"/> <button label="Reemplazar" label_selected="Reemplazar" name="replace_btn" left="100" width="85"/> diff --git a/indra/newview/skins/default/xui/es/floater_sell_land.xml b/indra/newview/skins/default/xui/es/floater_sell_land.xml index bce13c1e338..c6e87462504 100644 --- a/indra/newview/skins/default/xui/es/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/es/floater_sell_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="sell land" title="Vender el terreno"> +<floater name="sell land" title="VENDER EL TERRENO"> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <text name="info_parcel_label"> diff --git a/indra/newview/skins/default/xui/es/floater_settings_debug.xml b/indra/newview/skins/default/xui/es/floater_settings_debug.xml index 1d5ad2f34cd..0e8e6bdfd29 100644 --- a/indra/newview/skins/default/xui/es/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/es/floater_settings_debug.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="settings_debug" title="Configuración del depurador"> +<floater name="settings_debug" title="CONFIGURACIÓN DEL DEPURADOR"> <combo_box name="boolean_combo"> <combo_box.item name="TRUE" label="TRUE" /> <combo_box.item name="FALSE" label="FALSE" /> diff --git a/indra/newview/skins/default/xui/es/floater_snapshot.xml b/indra/newview/skins/default/xui/es/floater_snapshot.xml index c1ace235030..afea6c09fef 100644 --- a/indra/newview/skins/default/xui/es/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/es/floater_snapshot.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="Vista previa de la foto"> +<floater name="Snapshot" title="VISTA PREVIA DE LA FOTO"> <text name="type_label"> Destino de la foto </text> diff --git a/indra/newview/skins/default/xui/es/floater_sound_preview.xml b/indra/newview/skins/default/xui/es/floater_sound_preview.xml index e69ac101234..8b8d9f13ced 100644 --- a/indra/newview/skins/default/xui/es/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/es/floater_sound_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Sound Preview" title="sound.wav"> +<floater name="Sound Preview" title="SOUND.WAV"> <text name="name_label"> Nombre: </text> diff --git a/indra/newview/skins/default/xui/es/floater_statistics.xml b/indra/newview/skins/default/xui/es/floater_statistics.xml index 6e644cacf1f..c9b0a76df0c 100644 --- a/indra/newview/skins/default/xui/es/floater_statistics.xml +++ b/indra/newview/skins/default/xui/es/floater_statistics.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="EstadÃsticas"/> +<floater name="stats floater" title="ESTADÃSTICAS"/> diff --git a/indra/newview/skins/default/xui/es/floater_telehub.xml b/indra/newview/skins/default/xui/es/floater_telehub.xml index 74084e9db9f..b2dddfb7f7f 100644 --- a/indra/newview/skins/default/xui/es/floater_telehub.xml +++ b/indra/newview/skins/default/xui/es/floater_telehub.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="telehub" title="Punto de Teleporte" min_height="310" height="310"> +<floater name="telehub" title="PUNTO DE TELEPORTE" min_height="310" height="310"> <text name="status_text_connected"> Punto de Teleporte conectado al objeto [OBJECT] </text> diff --git a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml index 8b661a6041a..09d6e7e4aa3 100644 --- a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="Elegir: Textura"> +<floater name="texture picker" title="ELEGIR: TEXTURA"> <string name="choose_picture"> Pulse para elegir una imagen </string> diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index da842d22c62..24db352ac42 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="Construir" width="288"> +<floater name="toolbox floater" title="" short_title="CONSTRUIR" width="288"> <button label="" label_selected="" name="button focus" tool_tip="Visión"/> <button label="" label_selected="" name="button move" tool_tip="Mover"/> <button label="" label_selected="" name="button edit" tool_tip="Editar"/> diff --git a/indra/newview/skins/default/xui/es/floater_top_objects.xml b/indra/newview/skins/default/xui/es/floater_top_objects.xml index 95f2c39d423..29ae9991af5 100644 --- a/indra/newview/skins/default/xui/es/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/es/floater_top_objects.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="top_objects" title="cargando..."> +<floater name="top_objects" title="CARGANDO..."> <text name="title_text"> Cargando... </text> diff --git a/indra/newview/skins/default/xui/es/floater_water.xml b/indra/newview/skins/default/xui/es/floater_water.xml index 934fc7882b7..c86e49a3554 100644 --- a/indra/newview/skins/default/xui/es/floater_water.xml +++ b/indra/newview/skins/default/xui/es/floater_water.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Water Floater" title="Editor avanzado del agua"> +<floater name="Water Floater" title="EDITOR AVANZADO DEL AGUA"> <text name="KeyFramePresetsText"> Agua predefinida: </text> diff --git a/indra/newview/skins/default/xui/es/floater_windlight_options.xml b/indra/newview/skins/default/xui/es/floater_windlight_options.xml index e240dea0b5c..0697f05553f 100644 --- a/indra/newview/skins/default/xui/es/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/es/floater_windlight_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="WindLight floater" title="Editor avanzado del cielo"> +<floater name="WindLight floater" title="EDITOR AVANZADO DEL CIELO"> <text name="KeyFramePresetsText"> Cielos definidos: </text> diff --git a/indra/newview/skins/default/xui/es/floater_world_map.xml b/indra/newview/skins/default/xui/es/floater_world_map.xml index 6521e72d5a4..4d7337bef74 100644 --- a/indra/newview/skins/default/xui/es/floater_world_map.xml +++ b/indra/newview/skins/default/xui/es/floater_world_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="worldmap" title="Mapa del Mundo"> +<floater name="worldmap" title="MAPA DEL MUNDO"> <tab_container name="maptab"> <panel label="Objetos" name="objects_mapview"/> <panel label="Terreno" name="terrain_mapview"/> diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml index 7b918be075e..53e48352f10 100644 --- a/indra/newview/skins/default/xui/fr/floater_about.xml +++ b/indra/newview/skins/default/xui/fr/floater_about.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="A propos de [APP_NAME]"> +<floater name="floater_about" title="A PROPOS DE [APP_NAME]"> <tab_container name="about_tab"> <panel name="credits_panel"> <text_editor name="credits_editor"> 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 f2d2dbfa078..0729c79cbb8 100644 --- a/indra/newview/skins/default/xui/fr/floater_about_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="À propos du terrain"> +<floater name="floaterland" title="À PROPOS DU TERRAIN"> <tab_container name="landtab"> <panel label="Général" name="land_general_panel"> <text name="Name:"> diff --git a/indra/newview/skins/default/xui/fr/floater_auction.xml b/indra/newview/skins/default/xui/fr/floater_auction.xml index 4bdf9df1beb..3ec95a60c58 100644 --- a/indra/newview/skins/default/xui/fr/floater_auction.xml +++ b/indra/newview/skins/default/xui/fr/floater_auction.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_auction" title="Commencer la vente de terrain Linden"> +<floater name="floater_auction" title="COMMENCER LA VENTE DE TERRAIN LINDEN"> <check_box label="Inclure le marquage de sélection jaune" name="fence_check" /> <combo_box name="saletype_combo"> <combo_box.item name="Auction" label="Enchères" /> diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml index 01b4c944f3c..c713d3e9305 100644 --- a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="Choisir le résident"> +<floater name="avatarpicker" title="CHOISIR LE RÉSIDENT"> <tab_container name="ResidentChooserTabs"> <panel label="Rechercher" name="SearchPanel"> <text name="InstructSearchResidentName"> diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml index f4e3a1615c2..569126f3ecb 100644 --- a/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatar_texture_debug" title="Textures de l'avatar"> +<floater name="avatar_texture_debug" title="TEXTURES DE L'AVATAR"> <text name="label"> Textures fixées </text> diff --git a/indra/newview/skins/default/xui/fr/floater_beacons.xml b/indra/newview/skins/default/xui/fr/floater_beacons.xml index 0b060983eea..4f5c5d442f5 100644 --- a/indra/newview/skins/default/xui/fr/floater_beacons.xml +++ b/indra/newview/skins/default/xui/fr/floater_beacons.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="Balises"> +<floater name="beacons" title="BALISES"> <panel name="beacons_panel"> <check_box label="Objets scriptés avec Toucher uniquement" name="touch_only"/> <check_box label="Objets scriptés" name="scripted"/> diff --git a/indra/newview/skins/default/xui/fr/floater_build_options.xml b/indra/newview/skins/default/xui/fr/floater_build_options.xml index 3451c2de4c7..76e8e2f6375 100644 --- a/indra/newview/skins/default/xui/fr/floater_build_options.xml +++ b/indra/newview/skins/default/xui/fr/floater_build_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="build options floater" title="Options de la grille"> +<floater name="build options floater" title="OPTIONS DE LA GRILLE"> <spinner label="Unité (mètres)" name="GridResolution" /> <spinner label="Mesures (mètres)" name="GridDrawSize" /> <check_box label="Activer la fixation des sous-unités" name="GridSubUnit" /> diff --git a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml index b868aa33adc..98b7faa2ccc 100644 --- a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="Changement des droits relatifs au contenu"> +<floater name="floaterbulkperms" title="CHANGEMENT DES DROITS RELATIFS AU CONTENU"> <text name="applyto"> Types de contenu </text> diff --git a/indra/newview/skins/default/xui/fr/floater_bumps.xml b/indra/newview/skins/default/xui/fr/floater_bumps.xml index e12c7ed17d6..e439c30524f 100644 --- a/indra/newview/skins/default/xui/fr/floater_bumps.xml +++ b/indra/newview/skins/default/xui/fr/floater_bumps.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_bumps" title="Collisions, coups et bousculades"> +<floater name="floater_bumps" title="COLLISIONS, COUPS ET BOUSCULADES"> <text name="none_detected"> Aucun détecté </text> diff --git a/indra/newview/skins/default/xui/fr/floater_buy_contents.xml b/indra/newview/skins/default/xui/fr/floater_buy_contents.xml index 916b270500b..e8b47f53656 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_contents.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_buy_contents" title="Acheter ce contenu"> +<floater name="floater_buy_contents" title="ACHETER CE CONTENU"> <text name="contains_text"> [NAME] contient : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml index 85d67218d3e..9112d30be27 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy currency" title="Acheter des L$"> +<floater name="buy currency" title="ACHETER DES L$"> <text left="5" name="info_buying"> Achat de L$ : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_buy_land.xml b/indra/newview/skins/default/xui/fr/floater_buy_land.xml index aaf1577114b..2b930988471 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy land" title="Acheter le terrain"> +<floater name="buy land" title="ACHETER LE TERRAIN"> <text name="region_name_label"> Région : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_buy_object.xml b/indra/newview/skins/default/xui/fr/floater_buy_object.xml index 9e0ce25b975..893d559e6e8 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Acheter une copie de l'objet"> +<floater name="contents" title="ACHETER UNE COPIE DE L'OBJET"> <text name="contents_text"> et ses contenus : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_choose_group.xml b/indra/newview/skins/default/xui/fr/floater_choose_group.xml index ade440f2962..15cdd4d332b 100644 --- a/indra/newview/skins/default/xui/fr/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/fr/floater_choose_group.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="groups" title="Groupes"> +<floater name="groups" title="GROUPES"> <text name="groupdesc"> Choisissez un groupe : </text> 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 94bcad070e8..996f3e9b073 100644 --- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="ColorPicker" title="Choix de texture et de couleur"> +<floater name="ColorPicker" title="CHOIX DE TEXTURE ET DE COULEUR"> <text name="r_val_text"> Rouge : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_customize.xml b/indra/newview/skins/default/xui/fr/floater_customize.xml index 1250c46933f..bf70c5415ee 100644 --- a/indra/newview/skins/default/xui/fr/floater_customize.xml +++ b/indra/newview/skins/default/xui/fr/floater_customize.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="Apparence" width="548"> +<floater name="floater customize" title="APPARENCE" width="548"> <tab_container name="customize tab container" tab_min_width="150" width="546"> <placeholder label="Parties du corps" name="body_parts_placeholder"/> <panel label="Silhouette" left="154" name="Shape" width="389"> diff --git a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml index 11035398982..0b36b7b8ca7 100644 --- a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Day Cycle Floater" title="Editeur du cycle du jour"> +<floater name="Day Cycle Floater" title="EDITEUR DU CYCLE DU JOUR"> <tab_container name="Day Cycle Tabs"> <panel label="Cycle du jour" name="Day Cycle"> <button label="?" name="WLDayCycleHelp" /> diff --git a/indra/newview/skins/default/xui/fr/floater_device_settings.xml b/indra/newview/skins/default/xui/fr/floater_device_settings.xml index 656f1c4fbab..5374b4e5934 100644 --- a/indra/newview/skins/default/xui/fr/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/fr/floater_device_settings.xml @@ -1,3 +1,3 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater name="floater_device_settings" - title="Paramètres du matériel utilisé pour le chat vocal" /> + title="PARAMÈTRES DU MATÉRIEL UTILISÉ POUR LE CHAT VOCAL" /> diff --git a/indra/newview/skins/default/xui/fr/floater_env_settings.xml b/indra/newview/skins/default/xui/fr/floater_env_settings.xml index 1d14142dd30..7d6de114be3 100644 --- a/indra/newview/skins/default/xui/fr/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/fr/floater_env_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Environment Editor Floater" title="Éditeur d'environnement"> +<floater name="Environment Editor Floater" title="ÉDITEUR D'ENVIRONNEMENT"> <text bottom="-45" name="EnvTimeText"> Heure de la journée diff --git a/indra/newview/skins/default/xui/fr/floater_font_test.xml b/indra/newview/skins/default/xui/fr/floater_font_test.xml index 11eb11a0d79..3a32e8adc51 100644 --- a/indra/newview/skins/default/xui/fr/floater_font_test.xml +++ b/indra/newview/skins/default/xui/fr/floater_font_test.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Test de la police"> +<floater name="contents" title="TEST DE LA POLICE"> <text name="linea"> OverrideTest, Times-BOLD doit être sélectionné ici. (De default/xui/fr) </text> diff --git a/indra/newview/skins/default/xui/fr/floater_gesture.xml b/indra/newview/skins/default/xui/fr/floater_gesture.xml index 4411fee480a..b3026478ff4 100644 --- a/indra/newview/skins/default/xui/fr/floater_gesture.xml +++ b/indra/newview/skins/default/xui/fr/floater_gesture.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="gestures" title="Gestes utilisés"> +<floater name="gestures" title="GESTES UTILISÉS"> <text name="help_label"> Double-cliquez sur un geste pour jouer les animations et les sons. diff --git a/indra/newview/skins/default/xui/fr/floater_god_tools.xml b/indra/newview/skins/default/xui/fr/floater_god_tools.xml index 461956ff34a..33cb43f7ac7 100644 --- a/indra/newview/skins/default/xui/fr/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_god_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="godtools floater" title="Outils divins"> +<floater name="godtools floater" title="OUTILS DIVINS"> <tab_container name="GodTools Tabs"> <panel label="Grille" name="grid"> <button label="Éjecter tous" label_selected="Éjecter tous" name="Kick all users" width="175" /> diff --git a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml index 11d7fc28e94..6c1ea09c903 100644 --- a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Hardware Settings Floater" title="Configuration du matériel"> +<floater name="Hardware Settings Floater" title="CONFIGURATION DU MATÉRIEL"> <text name="Filtering:"> Filtres : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_hud.xml b/indra/newview/skins/default/xui/fr/floater_hud.xml index 55c8b57ae2f..13ca0e87706 100644 --- a/indra/newview/skins/default/xui/fr/floater_hud.xml +++ b/indra/newview/skins/default/xui/fr/floater_hud.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_hud" title="Didacticiel" /> +<floater name="floater_hud" title="DIDACTICIEL" /> diff --git a/indra/newview/skins/default/xui/fr/floater_inspect.xml b/indra/newview/skins/default/xui/fr/floater_inspect.xml index f140c66de0b..944a157f172 100644 --- a/indra/newview/skins/default/xui/fr/floater_inspect.xml +++ b/indra/newview/skins/default/xui/fr/floater_inspect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="inspect" title="Inspecter les objets"> +<floater name="inspect" title="INSPECTER LES OBJETS"> <scroll_list name="object_list" tool_tip="Sélectionner un objet de la liste pour le mettre en surbrillance dans le Monde."> <column label="Nom" name="object_name" /> diff --git a/indra/newview/skins/default/xui/fr/floater_inventory.xml b/indra/newview/skins/default/xui/fr/floater_inventory.xml index 7173025d18e..a83a95fa755 100644 --- a/indra/newview/skins/default/xui/fr/floater_inventory.xml +++ b/indra/newview/skins/default/xui/fr/floater_inventory.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory" title="Inventaire"> +<floater name="Inventory" title="INVENTAIRE"> <search_editor label="Saisissez votre recherche ici" name="inventory search editor"/> <tab_container name="inventory filter tabs"> <inventory_panel label="Tous les objets" name="All Items"/> diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml index ec83d5bcaa2..2885a7e316a 100644 --- a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="item properties" title="Propriétés de l'objet de l'inventaire"> +<floater name="item properties" title="PROPRIÉTÉS DE L'OBJET DE L'INVENTAIRE"> <text name="LabelItemNameTitle"> Nom : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml index 634bb6e2e98..8fb8d3c6f43 100644 --- a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory Finder" title="inventory_recent_items"> +<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS"> <check_box label="Animations" name="check_animation"/> <check_box label="Cartes de visite" name="check_calling_card"/> <check_box label="Habits" name="check_clothing"/> diff --git a/indra/newview/skins/default/xui/fr/floater_joystick.xml b/indra/newview/skins/default/xui/fr/floater_joystick.xml index 75800847d72..546c95de4ca 100644 --- a/indra/newview/skins/default/xui/fr/floater_joystick.xml +++ b/indra/newview/skins/default/xui/fr/floater_joystick.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Joystick" title="Configuration du joystick"> +<floater name="Joystick" title="CONFIGURATION DU JOYSTICK"> <check_box name="enable_joystick" label="Activer :"/> <spinner label="Mapping axe des X " name="JoystickAxis1"/> <spinner label="Mapping axe des Y" name="JoystickAxis2"/> diff --git a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml index 54069c9c49c..593ad903b90 100644 --- a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_lagmeter" title="Mesure du lag"> +<floater name="floater_lagmeter" title="MESURE DU LAG"> <button name="client_lagmeter" tool_tip="Statut du lag client"/> <text name="client"> Client : diff --git a/indra/newview/skins/default/xui/fr/floater_land_holdings.xml b/indra/newview/skins/default/xui/fr/floater_land_holdings.xml index 9c4f4ee966b..17adafa8d9f 100644 --- a/indra/newview/skins/default/xui/fr/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/fr/floater_land_holdings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="Mes terrains"> +<floater name="land holdings floater" title="MES TERRAINS"> <scroll_list name="parcel list"> <column label="Nom de la parcelle" name="name"/> <column label="Région" name="location"/> diff --git a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml index e2e2a9af9a0..76db22cea43 100644 --- a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="Script : Nouveau script"> +<floater name="script ed float" title="SCRIPT : NOUVEAU SCRIPT"> <button label="Réinitialiser" label_selected="Réinitialiser" name="Reset" width="100" left="390"/> <check_box label="Exécution en cours" name="running" left="4"/> <check_box label="Mono" name="mono" left="130"/> diff --git a/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml b/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml index 5dc0fa76a35..2e3d88264e9 100644 --- a/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="Wiki LSL"> +<floater name="script ed float" title="WIKI LSL"> <check_box label="Suivre le curseur" name="lock_check" /> <combo_box label="Verrouiller" name="history_combo" left_delta="120" width="70"/> <button label="Précédente" name="back_btn" left_delta="75"/> diff --git a/indra/newview/skins/default/xui/fr/floater_media_browser.xml b/indra/newview/skins/default/xui/fr/floater_media_browser.xml index e75b45c43a2..5a787a6bf9d 100644 --- a/indra/newview/skins/default/xui/fr/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/fr/floater_media_browser.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="Navigateur"> +<floater name="floater_about" title="NAVIGATEUR"> <layout_stack name="stack1"> <layout_panel name="nav_controls"> <button label="Précédente" name="back" width="75"/> diff --git a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml index 8ee3a23b95f..e62aad6cd38 100644 --- a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="MemLeak" title="Simulation fuite mémoire"> +<floater name="MemLeak" title="SIMULATION FUITE MÉMOIRE"> <spinner label="Vitesse de la fuite (octets) :" name="leak_speed" /> <spinner label="Max mémoire perdue (Mo) :" name="max_leak" /> <text name="total_leaked_label"> diff --git a/indra/newview/skins/default/xui/fr/floater_mute_object.xml b/indra/newview/skins/default/xui/fr/floater_mute_object.xml index 23d351f32de..aae5770d51a 100644 --- a/indra/newview/skins/default/xui/fr/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/fr/floater_mute_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="mute by name" title="Ignorer les objets par nom"> +<floater name="mute by name" title="IGNORER LES OBJETS PAR NOM"> <text name="message"> Cette fonction ne marche que pour les chats et les IM, pas les sons. Saisissez le nom exact de l'objet. diff --git a/indra/newview/skins/default/xui/fr/floater_my_friends.xml b/indra/newview/skins/default/xui/fr/floater_my_friends.xml index 911647d8be5..841a42a0ea1 100644 --- a/indra/newview/skins/default/xui/fr/floater_my_friends.xml +++ b/indra/newview/skins/default/xui/fr/floater_my_friends.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_my_friends" title="Contacts"> +<floater name="floater_my_friends" title="CONTACTS"> <tab_container name="friends_and_groups"> <panel label="Amis" name="friends_panel" /> <panel label="Groupes" name="groups_panel" /> diff --git a/indra/newview/skins/default/xui/fr/floater_notification.xml b/indra/newview/skins/default/xui/fr/floater_notification.xml index 7ca2dc3a642..62727da0075 100644 --- a/indra/newview/skins/default/xui/fr/floater_notification.xml +++ b/indra/newview/skins/default/xui/fr/floater_notification.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="notification" title="Console de notifications"> +<floater name="notification" title="CONSOLE DE NOTIFICATIONS"> <text_editor name="payload"> Chargement.. </text_editor> diff --git a/indra/newview/skins/default/xui/fr/floater_notifications_console.xml b/indra/newview/skins/default/xui/fr/floater_notifications_console.xml index 7262fe8fe2d..fd3782bac2c 100644 --- a/indra/newview/skins/default/xui/fr/floater_notifications_console.xml +++ b/indra/newview/skins/default/xui/fr/floater_notifications_console.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="notifications_console" title="Console de notifications"> +<floater name="notifications_console" title="CONSOLE DE NOTIFICATIONS"> <combo_box label="Sélectionner le type de notification" name="notification_types" width="412"/> <button label="Ajouter" name="add_notification" left="417" width="78"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_openobject.xml b/indra/newview/skins/default/xui/fr/floater_openobject.xml index 3761200d488..5ffa2f236d6 100644 --- a/indra/newview/skins/default/xui/fr/floater_openobject.xml +++ b/indra/newview/skins/default/xui/fr/floater_openobject.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="objectcontents" title="Contenu des objets"> +<floater name="objectcontents" title="CONTENU DES OBJETS"> <text name="object_name"> [DESC]: </text> diff --git a/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml b/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml index 9ea970d89dc..4b885f3afbe 100644 --- a/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="perm prefs" title="Droits par défaut"> +<floater name="perm prefs" title="DROITS PAR DÉFAUT"> <panel label="Droits" name="permissions"> <button label="?" label_selected="?" name="help"/> <check_box label="Partager avec le groupe" name="share_with_group"/> diff --git a/indra/newview/skins/default/xui/fr/floater_post_process.xml b/indra/newview/skins/default/xui/fr/floater_post_process.xml index 52afb340a6e..a22c7512e51 100644 --- a/indra/newview/skins/default/xui/fr/floater_post_process.xml +++ b/indra/newview/skins/default/xui/fr/floater_post_process.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Post-Process Floater" title="Paramètres post-traitement"> +<floater name="Post-Process Floater" title="PARAMÈTRES POST-TRAITEMENT"> <tab_container name="Post-Process Tabs"> <panel label="Filtre couleur" name="wmiColorFilterPanel"> <check_box label="Activer" name="wmiColorFilterToggle" /> diff --git a/indra/newview/skins/default/xui/fr/floater_postcard.xml b/indra/newview/skins/default/xui/fr/floater_postcard.xml index ab21d7423a5..9c998c1838b 100644 --- a/indra/newview/skins/default/xui/fr/floater_postcard.xml +++ b/indra/newview/skins/default/xui/fr/floater_postcard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Postcard" title="Envoyer la photo par e-mail"> +<floater name="Postcard" title="ENVOYER LA PHOTO PAR E-MAIL"> <text name="to_label" width="135"> E-mail du destinataire : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_preferences.xml b/indra/newview/skins/default/xui/fr/floater_preferences.xml index 9dab4d642cc..ccd29a01dca 100644 --- a/indra/newview/skins/default/xui/fr/floater_preferences.xml +++ b/indra/newview/skins/default/xui/fr/floater_preferences.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Preferences" title="Préférences" min_width="330" width="626"> +<floater name="Preferences" title="PRÉFÉRENCES" min_width="330" width="626"> <button label="À propos" label_selected="À propos" name="About..." /> <button label="OK" label_selected="OK" name="OK" /> <button label="Annuler" label_selected="Annuler" name="Cancel" /> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_classified.xml b/indra/newview/skins/default/xui/fr/floater_preview_classified.xml index 1b6f26150d3..436a386dc8e 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_classified.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="classified_preview" title="Informations sur la petite annonce" /> +<floater name="classified_preview" title="INFORMATIONS SUR LA PETITE ANNONCE" /> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_event.xml b/indra/newview/skins/default/xui/fr/floater_preview_event.xml index e7fc2aa8dda..30eeeec70db 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_event.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="event_preview" title="Informations sur l'événement" /> +<floater name="event_preview" title="INFORMATIONS SUR L'ÉVÉNEMENT" /> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml index a23b906df6e..ea524422369 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview notecard" title="Remarque :"> +<floater name="preview notecard" title="REMARQUE :"> <button label="Enregistrer" label_selected="Enregistrer" name="Save" /> <text name="desc txt"> Description : diff --git a/indra/newview/skins/default/xui/fr/floater_region_info.xml b/indra/newview/skins/default/xui/fr/floater_region_info.xml index d69f212b866..3ec1ebf7e6e 100644 --- a/indra/newview/skins/default/xui/fr/floater_region_info.xml +++ b/indra/newview/skins/default/xui/fr/floater_region_info.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="regioninfo" title="Région et domaine"/> +<floater name="regioninfo" title="RÉGION ET DOMAINE"/> diff --git a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml index 687b3068e63..be97165a3e9 100644 --- a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="Signaler une infraction"> +<floater name="floater_report_abuse" title="SIGNALER UNE INFRACTION"> <texture_picker label="" name="screenshot"/> <check_box label="Inclure une capture d'écran" name="screen_check"/> <text name="reporter_title" width="60"> diff --git a/indra/newview/skins/default/xui/fr/floater_script_debug.xml b/indra/newview/skins/default/xui/fr/floater_script_debug.xml index 3664222fd2d..e257aac6c42 100644 --- a/indra/newview/skins/default/xui/fr/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/fr/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <multi_floater name="script debug floater" title="Erreurs/alertes de scripts"> <tab_container name="Preview Tabs"> - <floater label="Script" name="all_scripts" title="[All scripts]" /> + <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]" /> </tab_container> </multi_floater> diff --git a/indra/newview/skins/default/xui/fr/floater_script_preview.xml b/indra/newview/skins/default/xui/fr/floater_script_preview.xml index b767081625a..43541e8de31 100644 --- a/indra/newview/skins/default/xui/fr/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_script_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview lsl text" title="Script : Script de rotation"> +<floater name="preview lsl text" title="SCRIPT : SCRIPT DE ROTATION"> <text name="desc txt"> Description : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_script_queue.xml b/indra/newview/skins/default/xui/fr/floater_script_queue.xml index 55487f75db0..d5f39e7acef 100644 --- a/indra/newview/skins/default/xui/fr/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/fr/floater_script_queue.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="queue" title="Réinitialiser progression"> +<floater name="queue" title="RÉINITIALISER PROGRESSION"> <button label="Fermer" label_selected="Fermer" name="close" /> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_script_search.xml b/indra/newview/skins/default/xui/fr/floater_script_search.xml index 6f912026c46..49b0ffe542c 100644 --- a/indra/newview/skins/default/xui/fr/floater_script_search.xml +++ b/indra/newview/skins/default/xui/fr/floater_script_search.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script search" title="Recherche de scripts" width="320"> +<floater name="script search" title="RECHERCHE DE SCRIPTS" width="320"> <check_box label="Non sensible à la casse" name="case_text" left="75"/> <button label="Rechercher" label_selected="Rechercher" name="search_btn" width="96"/> <button label="Remplacer" label_selected="Remplacer" name="replace_btn" left="111" width="96"/> diff --git a/indra/newview/skins/default/xui/fr/floater_sell_land.xml b/indra/newview/skins/default/xui/fr/floater_sell_land.xml index 643a9435db4..81c3ccc79ab 100644 --- a/indra/newview/skins/default/xui/fr/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_sell_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="sell land" title="Vendre terrain"> +<floater name="sell land" title="VENDRE TERRAIN"> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <text name="info_parcel_label"> diff --git a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml index e67b8e2f797..f0781d0b321 100644 --- a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="settings_debug" title="Paramétrages du mode Debug"> +<floater name="settings_debug" title="PARAMÉTRAGES DU MODE DEBUG"> <combo_box name="boolean_combo"> <combo_box.item name="TRUE" label="TRUE" /> <combo_box.item name="FALSE" label="FALSE" /> diff --git a/indra/newview/skins/default/xui/fr/floater_snapshot.xml b/indra/newview/skins/default/xui/fr/floater_snapshot.xml index 49c6ff04a6c..a28e64f7aff 100644 --- a/indra/newview/skins/default/xui/fr/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/fr/floater_snapshot.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="Prévisualiser la photo" width="247"> +<floater name="Snapshot" title="PRÉVISUALISER LA PHOTO" width="247"> <text name="type_label"> Destination de la photo </text> diff --git a/indra/newview/skins/default/xui/fr/floater_sound_preview.xml b/indra/newview/skins/default/xui/fr/floater_sound_preview.xml index 1ab3a4a7147..9e2b30b3f62 100644 --- a/indra/newview/skins/default/xui/fr/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_sound_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Sound Preview" title="sound.wav"> +<floater name="Sound Preview" title="SOUND.WAV"> <text name="name_label"> Nom : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_statistics.xml b/indra/newview/skins/default/xui/fr/floater_statistics.xml index 0768c3ace49..a2e3c199ab7 100644 --- a/indra/newview/skins/default/xui/fr/floater_statistics.xml +++ b/indra/newview/skins/default/xui/fr/floater_statistics.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="Statistiques"/> +<floater name="stats floater" title="STATISTIQUES"/> diff --git a/indra/newview/skins/default/xui/fr/floater_telehub.xml b/indra/newview/skins/default/xui/fr/floater_telehub.xml index e6201785bde..c89eea517e6 100644 --- a/indra/newview/skins/default/xui/fr/floater_telehub.xml +++ b/indra/newview/skins/default/xui/fr/floater_telehub.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="telehub" title="Téléhub" min_height="310" height="310" > +<floater name="telehub" title="TÉLÉHUB" min_height="310" height="310" > <text name="status_text_connected"> Téléhub connecté à l'objet [OBJECT] </text> diff --git a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml index fa8b65d8a5a..ff84025a441 100644 --- a/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/fr/floater_texture_ctrl.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="Texture"> +<floater name="texture picker" title="TEXTURE"> <string name="choose_picture"> Cliquez pour sélectionner une image </string> diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index e8db326e156..3638c3fb425 100644 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="Construire"> +<floater name="toolbox floater" title="" short_title="CONSTRUIRE"> <button label="" label_selected="" name="button focus" tool_tip="Mise au point"/> <button label="" label_selected="" name="button move" tool_tip="Déplacer"/> <button label="" label_selected="" name="button edit" tool_tip="Modifier"/> diff --git a/indra/newview/skins/default/xui/fr/floater_top_objects.xml b/indra/newview/skins/default/xui/fr/floater_top_objects.xml index 69a3d0cd18a..479559367f8 100644 --- a/indra/newview/skins/default/xui/fr/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/fr/floater_top_objects.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="top_objects" title="en cours de chargement..."> +<floater name="top_objects" title="EN COURS DE CHARGEMENT..."> <text name="title_text"> Chargement... </text> diff --git a/indra/newview/skins/default/xui/fr/floater_water.xml b/indra/newview/skins/default/xui/fr/floater_water.xml index 9b77c2450d9..3de5fee0ced 100644 --- a/indra/newview/skins/default/xui/fr/floater_water.xml +++ b/indra/newview/skins/default/xui/fr/floater_water.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Water Floater" title="Éditeur d'eau avancé"> +<floater name="Water Floater" title="ÉDITEUR D'EAU AVANCé"> <text name="KeyFramePresetsText"> Préréglages eau : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml index d1a62dc6bc9..4ff55d87b68 100644 --- a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="WindLight floater" title="Éditeur de ciel avancé" width="706"> +<floater name="WindLight floater" title="ÉDITEUR DE CIEL AVANCÉ" width="706"> <text name="KeyFramePresetsText"> Préréglages ciel : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_world_map.xml b/indra/newview/skins/default/xui/fr/floater_world_map.xml index ec2db5f163f..1f76202dee4 100644 --- a/indra/newview/skins/default/xui/fr/floater_world_map.xml +++ b/indra/newview/skins/default/xui/fr/floater_world_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="worldmap" title="Carte du monde"> +<floater name="worldmap" title="CARTE DU MONDE"> <tab_container name="maptab" width="955"> <panel label="Objets" name="objects_mapview" width="953"/> <panel label="Terrain" name="terrain_mapview" width="953"/> diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml index 2c913759302..a5aff9d4864 100644 --- a/indra/newview/skins/default/xui/it/floater_about.xml +++ b/indra/newview/skins/default/xui/it/floater_about.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="Informazioni su [APP_NAME]"> +<floater name="floater_about" title="INFORMAZIONI SU [APP_NAME]"> <tab_container name="about_tab"> <panel name="credits_panel"> <text_editor name="credits_editor"> 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 ede581c5edc..f2bd150ad7b 100644 --- a/indra/newview/skins/default/xui/it/floater_about_land.xml +++ b/indra/newview/skins/default/xui/it/floater_about_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="Informazioni sul terreno"> +<floater name="floaterland" title="INFORMAZIONI SUL TERRENO"> <tab_container name="landtab"> <panel label="Generale" name="land_general_panel"> <text name="Name:"> diff --git a/indra/newview/skins/default/xui/it/floater_auction.xml b/indra/newview/skins/default/xui/it/floater_auction.xml index edbb9ab9a93..bba76a83cc6 100644 --- a/indra/newview/skins/default/xui/it/floater_auction.xml +++ b/indra/newview/skins/default/xui/it/floater_auction.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="Inizia a vendere terra Linden"> +<floater name="floater_auction" title="INIZIA A VENDERE TERRA LINDEN"> <check_box label="Includi barriere di selezione gialle" name="fence_check"/> <button label="Fotografia" label_selected="Fotografia" name="snapshot_btn"/> <button label="OK" label_selected="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml index a223e30fb56..89a61eeca8c 100644 --- a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="Scegli residente"> +<floater name="avatarpicker" title="SCEGLI RESIDENTE"> <tab_container name="ResidentChooserTabs"> <panel label="Cerca" name="SearchPanel"> <text name="InstructSearchResidentName"> diff --git a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml index 281f436224b..f55b23af355 100644 --- a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatar_texture_debug" title="Texture dell'Avatar"> +<floater name="avatar_texture_debug" title="TEXTURE DELL'AVATAR"> <text name="baked_label"> Texture Visualizzate </text> diff --git a/indra/newview/skins/default/xui/it/floater_beacons.xml b/indra/newview/skins/default/xui/it/floater_beacons.xml index 035b073729b..126c03e8556 100644 --- a/indra/newview/skins/default/xui/it/floater_beacons.xml +++ b/indra/newview/skins/default/xui/it/floater_beacons.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="Segnali luminosi"> +<floater name="beacons" title="SEGNALI LUMINOSI"> <panel name="beacons_panel"> <check_box label="Oggetti scriptati con solo 'tocca' abilitato" name="touch_only"/> <check_box label="Oggetti scriptati" name="scripted"/> diff --git a/indra/newview/skins/default/xui/it/floater_build_options.xml b/indra/newview/skins/default/xui/it/floater_build_options.xml index 2c60aeda2b2..c6ee0f79176 100644 --- a/indra/newview/skins/default/xui/it/floater_build_options.xml +++ b/indra/newview/skins/default/xui/it/floater_build_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="build options floater" title="Opzioni della griglia"> +<floater name="build options floater" title="OPZIONI DELLA GRIGLIA"> <spinner label="Unità di misura della griglia (metri)" name="GridResolution" width="250" label_width="192"/> <spinner label="Estensione della griglia (metri)" name="GridDrawSize" width="250" label_width="192"/> <check_box label="Abilita sotto-unità di movimento" name="GridSubUnit"/> diff --git a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml index 7ca57f34b32..7f5b68279e9 100644 --- a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="Modifica in massa i permessi del contenuto"> +<floater name="floaterbulkperms" title="MODIFICA IN MASSA I PERMESSI DEL CONTENUTO"> <text name="applyto"> Tipi di contenuto </text> diff --git a/indra/newview/skins/default/xui/it/floater_bumps.xml b/indra/newview/skins/default/xui/it/floater_bumps.xml index d9ce29fa08a..23fa1a41a69 100644 --- a/indra/newview/skins/default/xui/it/floater_bumps.xml +++ b/indra/newview/skins/default/xui/it/floater_bumps.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_bumps" title="Collisioni, spinte e colpi"> +<floater name="floater_bumps" title="COLLISIONI, SPINTE E COLPI"> <string name="none_detected"> Nessuno rilevato </string> diff --git a/indra/newview/skins/default/xui/it/floater_buy_contents.xml b/indra/newview/skins/default/xui/it/floater_buy_contents.xml index 2836f989704..1a6f64c07e4 100644 --- a/indra/newview/skins/default/xui/it/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/it/floater_buy_contents.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_buy_contents" title="Compra i contenuti"> +<floater name="floater_buy_contents" title="COMPRA I CONTENUTI"> <text name="contains_text"> [NAME] contiene: </text> diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency.xml b/indra/newview/skins/default/xui/it/floater_buy_currency.xml index a24f0dbe7a3..6b881683f13 100644 --- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy currency" title="Acquista valuta"> +<floater name="buy currency" title="ACQUISTA VALUTA"> <text name="info_buying"> Acquistando valuta: </text> diff --git a/indra/newview/skins/default/xui/it/floater_buy_land.xml b/indra/newview/skins/default/xui/it/floater_buy_land.xml index d6036c19dd6..b5d7ba07637 100644 --- a/indra/newview/skins/default/xui/it/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/it/floater_buy_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy land" title="Compra terra"> +<floater name="buy land" title="COMPRA TERRA"> <text name="region_name_label"> Regione: </text> diff --git a/indra/newview/skins/default/xui/it/floater_buy_object.xml b/indra/newview/skins/default/xui/it/floater_buy_object.xml index 90ff84a89c7..e99d4323670 100644 --- a/indra/newview/skins/default/xui/it/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/it/floater_buy_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Compra una copia dell'oggetto"> +<floater name="contents" title="COMPRA UNA COPIA DELL'OGGETTO"> <text name="contents_text"> e dei suoi contenuti: </text> diff --git a/indra/newview/skins/default/xui/it/floater_choose_group.xml b/indra/newview/skins/default/xui/it/floater_choose_group.xml index 3b5fc79bd87..00f2692295d 100644 --- a/indra/newview/skins/default/xui/it/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/it/floater_choose_group.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="groups" title="Gruppi"> +<floater name="groups" title="GRUPPI"> <text name="groupdesc"> Scegli un gruppo: </text> diff --git a/indra/newview/skins/default/xui/it/floater_color_picker.xml b/indra/newview/skins/default/xui/it/floater_color_picker.xml index 1e6d7bc3f09..297b006e725 100644 --- a/indra/newview/skins/default/xui/it/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/it/floater_color_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="ColorPicker" title="Tavolozza colori"> +<floater name="ColorPicker" title="TAVOLOZZA COLORI"> <text name="r_val_text"> Rosso: </text> diff --git a/indra/newview/skins/default/xui/it/floater_customize.xml b/indra/newview/skins/default/xui/it/floater_customize.xml index eac673e004d..ad6111718af 100644 --- a/indra/newview/skins/default/xui/it/floater_customize.xml +++ b/indra/newview/skins/default/xui/it/floater_customize.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="Aspetto fisico" width="551"> +<floater name="floater customize" title="ASPETTO FISICO" width="551"> <tab_container name="customize tab container" tab_min_width="120" width="549"> <placeholder label="Parti del corpo" name="body_parts_placeholder"/> <panel label="Forma del corpo" name="Shape" left="124" width="389"> diff --git a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml index 4c62d4f5a24..7d50e322c04 100644 --- a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Day Cycle Floater" title="Editor delle ciclo giorno/notte"> +<floater name="Day Cycle Floater" title="EDITOR DELLE CICLO GIORNO/NOTTE"> <tab_container name="Day Cycle Tabs"> <panel label="Ciclo giorno/notte" name="Day Cycle"> <button label="?" name="WLDayCycleHelp"/> diff --git a/indra/newview/skins/default/xui/it/floater_device_settings.xml b/indra/newview/skins/default/xui/it/floater_device_settings.xml index cbf965bf93d..932978809d5 100644 --- a/indra/newview/skins/default/xui/it/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/it/floater_device_settings.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_device_settings" title="Impostazioni dispositivi Voice Chat"/> +<floater name="floater_device_settings" title="IMPOSTAZIONI DISPOSITIVI VOICE CHAT"/> diff --git a/indra/newview/skins/default/xui/it/floater_env_settings.xml b/indra/newview/skins/default/xui/it/floater_env_settings.xml index 36f97bda81f..32858d18cdc 100644 --- a/indra/newview/skins/default/xui/it/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/it/floater_env_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Environment Editor Floater" title="Editor dell'ambiente"> +<floater name="Environment Editor Floater" title="EDITOR DELL'AMBIENTE"> <text name="EnvTimeText"> Ora del giorno diff --git a/indra/newview/skins/default/xui/it/floater_font_test.xml b/indra/newview/skins/default/xui/it/floater_font_test.xml index 27b87a931d6..859c068b11b 100644 --- a/indra/newview/skins/default/xui/it/floater_font_test.xml +++ b/indra/newview/skins/default/xui/it/floater_font_test.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Tipo di carattere per test"> +<floater name="contents" title="TIPO DI CARATTERE PER TEST"> <text name="linea"> OverrideTest, dovrebbe apparire qui come Times. (Dal default/xui/en-us) </text> diff --git a/indra/newview/skins/default/xui/it/floater_gesture.xml b/indra/newview/skins/default/xui/it/floater_gesture.xml index 997e13ecb50..91b7381d13d 100644 --- a/indra/newview/skins/default/xui/it/floater_gesture.xml +++ b/indra/newview/skins/default/xui/it/floater_gesture.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="gestures" title="Gesture attive"> +<floater name="gestures" title="GESTURE ATTIVE"> <text name="help_label"> Fai doppio click su una gesture per azionare animazioni e suoni. diff --git a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml index 688f9137a25..cdf3e970a66 100644 --- a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Hardware Settings Floater" title="Impostazioni Hardware"> +<floater name="Hardware Settings Floater" title="IMPOSTAZIONI HARDWARE"> <text name="Filtering:"> Filtraggio: </text> diff --git a/indra/newview/skins/default/xui/it/floater_hud.xml b/indra/newview/skins/default/xui/it/floater_hud.xml index d31bcedf05e..e458913452f 100644 --- a/indra/newview/skins/default/xui/it/floater_hud.xml +++ b/indra/newview/skins/default/xui/it/floater_hud.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_hud" title="Tutorial"/> +<floater name="floater_hud" title="TUTORIAL"/> diff --git a/indra/newview/skins/default/xui/it/floater_inspect.xml b/indra/newview/skins/default/xui/it/floater_inspect.xml index 6028c40557c..1a4e6c3c1bd 100644 --- a/indra/newview/skins/default/xui/it/floater_inspect.xml +++ b/indra/newview/skins/default/xui/it/floater_inspect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="inspect" title="Ispeziona oggetti" min_width="450"> +<floater name="inspect" title="ISPEZIONA OGGETTI" min_width="450"> <scroll_list name="object_list" tool_tip="Seleziona un oggetto da questo elenco per evidenziarlo inworld"> <column label="Nome dell'oggetto" name="object_name"/> <column label="Proprietario" name="owner_name"/> diff --git a/indra/newview/skins/default/xui/it/floater_inventory.xml b/indra/newview/skins/default/xui/it/floater_inventory.xml index f21f2134976..e3325463d6c 100644 --- a/indra/newview/skins/default/xui/it/floater_inventory.xml +++ b/indra/newview/skins/default/xui/it/floater_inventory.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory" title="Inventario"> +<floater name="Inventory" title="INVENTARIO"> <search_editor label="Scrivi qui per cercare" name="inventory search editor"/> <tab_container name="inventory filter tabs"> <inventory_panel label="Tutti gli elementi" name="All Items"/> diff --git a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml index e32f57e9f4e..8860fd82076 100644 --- a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="item properties" title="Proprietà dell'oggetto nell'inventario"> +<floater name="item properties" title="PROPRIETÀ DELL'OGGETTO NELL'INVENTARIO"> <text name="LabelItemNameTitle"> Nome: </text> diff --git a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml index c2c05b4023d..b5a17b2fc17 100644 --- a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory Finder" title="Inventario_Cose_recenti" width="165"> +<floater name="Inventory Finder" title="INVENTARIO_COSE_RECENTI" width="165"> <check_box label="Animazioni" name="check_animation"/> <check_box label="Biglietti da visita" name="check_calling_card"/> <check_box label="Abiti" name="check_clothing"/> diff --git a/indra/newview/skins/default/xui/it/floater_joystick.xml b/indra/newview/skins/default/xui/it/floater_joystick.xml index b7b76639107..d74ff9bfb49 100644 --- a/indra/newview/skins/default/xui/it/floater_joystick.xml +++ b/indra/newview/skins/default/xui/it/floater_joystick.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Joystick" title="Configurazione Joystick"> +<floater name="Joystick" title="CONFIGURAZIONE JOYSTICK"> <check_box name="enable_joystick" label="Abilita Joystick:"/> <text left="120" name="joystick_type" width="380"/> <spinner label="Mapping: asse X" name="JoystickAxis1" label_width="140" width="180" left="12"/> diff --git a/indra/newview/skins/default/xui/it/floater_lagmeter.xml b/indra/newview/skins/default/xui/it/floater_lagmeter.xml index af70ad9d310..5ed748da69e 100644 --- a/indra/newview/skins/default/xui/it/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/it/floater_lagmeter.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_lagmeter" title="Misuratore del lag"> +<floater name="floater_lagmeter" title="MISURATORE DEL LAG"> <button label="" label_selected="" name="client_lagmeter" tool_tip="Stato del lag del programma in locale"/> <text left="30" name="client_lag_cause" right="-10" /> <text left="30" name="network_lag_cause" right="-10" /> diff --git a/indra/newview/skins/default/xui/it/floater_land_holdings.xml b/indra/newview/skins/default/xui/it/floater_land_holdings.xml index 85661c28d72..8a6689f6afc 100644 --- a/indra/newview/skins/default/xui/it/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/it/floater_land_holdings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="Il mio terreno"> +<floater name="land holdings floater" title="IL MIO TERRENO"> <scroll_list name="parcel list"> <column label="Nome del terreno" name="name"/> <column label="Regione" name="location"/> diff --git a/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml index bb1f6116cf9..bd50ad3df7e 100644 --- a/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="Script: Nuovo script"> +<floater name="script ed float" title="SCRIPT: NUOVO SCRIPT"> <button label="Ripristina" label_selected="Ripristina" name="Reset"/> <check_box label="In esecuzione" name="running" left="4"/> <check_box label="Mono" name="mono" left="106"/> diff --git a/indra/newview/skins/default/xui/it/floater_lsl_guide.xml b/indra/newview/skins/default/xui/it/floater_lsl_guide.xml index ec62dd087d2..4241a32ec1b 100644 --- a/indra/newview/skins/default/xui/it/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/it/floater_lsl_guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="LSL Wiki"> +<floater name="script ed float" title="LSL WIKI"> <check_box label="Segui il cursore" name="lock_check"/> <combo_box label="Blocca" name="history_combo" left_delta="120" width="70"/> <button label="Indietro" name="back_btn" left_delta="75"/> diff --git a/indra/newview/skins/default/xui/it/floater_media_browser.xml b/indra/newview/skins/default/xui/it/floater_media_browser.xml index 4d3462b3484..7a5f9c9fcbc 100644 --- a/indra/newview/skins/default/xui/it/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/it/floater_media_browser.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="Browser multimediale"> +<floater name="floater_about" title="BROWSER MULTIMEDIALE"> <layout_stack name="stack1"> <layout_panel name="nav_controls"> <button label="Indietro" name="back" width="75"/> diff --git a/indra/newview/skins/default/xui/it/floater_mem_leaking.xml b/indra/newview/skins/default/xui/it/floater_mem_leaking.xml index 4bd0e6ae6b7..d1809531574 100644 --- a/indra/newview/skins/default/xui/it/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/it/floater_mem_leaking.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="MemLeak" title="Simulazione di perdità di memoria"> +<floater name="MemLeak" title="SIMULAZIONE DI PERDITÀ DI MEMORIA"> <spinner label="Perdità di velocità (bytes per frame):" name="leak_speed"/> <spinner label="Memoria Persa Max (MB):" name="max_leak"/> <text name="total_leaked_label"> diff --git a/indra/newview/skins/default/xui/it/floater_mute_object.xml b/indra/newview/skins/default/xui/it/floater_mute_object.xml index 6bacdcab416..a72bfe96815 100644 --- a/indra/newview/skins/default/xui/it/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/it/floater_mute_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="mute by name" title="Ignora l'oggetto dal nome"> +<floater name="mute by name" title="IGNORA L'OGGETTO DAL NOME"> <text name="message"> Ignora per nome ha effetti sull'oggetto in chat e IM, non nei suoni. Devi scrivere esattamente il nome dell'oggetto. diff --git a/indra/newview/skins/default/xui/it/floater_my_friends.xml b/indra/newview/skins/default/xui/it/floater_my_friends.xml index a77b8aff80f..faeba0a6d9a 100644 --- a/indra/newview/skins/default/xui/it/floater_my_friends.xml +++ b/indra/newview/skins/default/xui/it/floater_my_friends.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_my_friends" title="Contatti"> +<floater name="floater_my_friends" title="CONTATTI"> <tab_container name="friends_and_groups"> <panel label="Amici" name="friends_panel"/> <panel label="Gruppi" name="groups_panel"/> diff --git a/indra/newview/skins/default/xui/it/floater_openobject.xml b/indra/newview/skins/default/xui/it/floater_openobject.xml index d04a6f36327..0c2029e18e4 100644 --- a/indra/newview/skins/default/xui/it/floater_openobject.xml +++ b/indra/newview/skins/default/xui/it/floater_openobject.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="objectcontents" title="Contenuto dell'oggetto"> +<floater name="objectcontents" title="CONTENUTO DELL'OGGETTO"> <text name="object_name"> [DESC]: </text> diff --git a/indra/newview/skins/default/xui/it/floater_perm_prefs.xml b/indra/newview/skins/default/xui/it/floater_perm_prefs.xml index 8037481f37e..46de31455bb 100644 --- a/indra/newview/skins/default/xui/it/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/it/floater_perm_prefs.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="perm prefs" title="Permessi di base di importazione"> +<floater name="perm prefs" title="PERMESSI DI BASE DI IMPORTAZIONE"> <panel label="Permessi" name="permissions"> <button label="?" label_selected="?" name="help"/> <check_box label="Condividi con il gruppo" name="share_with_group"/> diff --git a/indra/newview/skins/default/xui/it/floater_post_process.xml b/indra/newview/skins/default/xui/it/floater_post_process.xml index 226970041b2..3aa8b291017 100644 --- a/indra/newview/skins/default/xui/it/floater_post_process.xml +++ b/indra/newview/skins/default/xui/it/floater_post_process.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Post-Process Floater" title="Impostazioni di post-produzione"> +<floater name="Post-Process Floater" title="IMPOSTAZIONI DI POST-PRODUZIONE"> <tab_container name="Post-Process Tabs"> <panel label="Filtro Colore" name="wmiColorFilterPanel"> <check_box label="Abilita" name="wmiColorFilterToggle"/> diff --git a/indra/newview/skins/default/xui/it/floater_postcard.xml b/indra/newview/skins/default/xui/it/floater_postcard.xml index 5132771acc8..5ea3b634d44 100644 --- a/indra/newview/skins/default/xui/it/floater_postcard.xml +++ b/indra/newview/skins/default/xui/it/floater_postcard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Postcard" title="Invia la fotografia via email"> +<floater name="Postcard" title="INVIA LA FOTOGRAFIA VIA EMAIL"> <text name="to_label" width="135"> Email del destinatario: </text> diff --git a/indra/newview/skins/default/xui/it/floater_preferences.xml b/indra/newview/skins/default/xui/it/floater_preferences.xml index 6277300bee5..172449554d3 100644 --- a/indra/newview/skins/default/xui/it/floater_preferences.xml +++ b/indra/newview/skins/default/xui/it/floater_preferences.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Preferences" title="Preferenze" min_width="350" width="646"> +<floater name="Preferences" title="PREFERENZE" min_width="350" width="646"> <button label="OK" label_selected="OK" name="OK"/> <button label="Annulla" label_selected="Annulla" name="Cancel"/> <button label="Applica" label_selected="Applica" name="Apply"/> diff --git a/indra/newview/skins/default/xui/it/floater_preview_classified.xml b/indra/newview/skins/default/xui/it/floater_preview_classified.xml index f78c70b1fe0..5819bd37a53 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_classified.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="Informazione Riservata"/> +<floater name="classified_preview" title="INFORMAZIONE RISERVATA"/> diff --git a/indra/newview/skins/default/xui/it/floater_preview_event.xml b/indra/newview/skins/default/xui/it/floater_preview_event.xml index 7cc99a9fea6..dca38c363f6 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_event.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="Informazione sull'evento"/> +<floater name="event_preview" title="INFORMAZIONE SULL'EVENTO"/> diff --git a/indra/newview/skins/default/xui/it/floater_preview_notecard.xml b/indra/newview/skins/default/xui/it/floater_preview_notecard.xml index b0608c8546e..81a51223b05 100644 --- a/indra/newview/skins/default/xui/it/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/it/floater_preview_notecard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview notecard" title="Nota:"> +<floater name="preview notecard" title="NOTA:"> <button label="Salva" label_selected="Salva" name="Save"/> <text name="desc txt"> Descrizione: diff --git a/indra/newview/skins/default/xui/it/floater_region_info.xml b/indra/newview/skins/default/xui/it/floater_region_info.xml index a802550bf4a..a715cf1f06c 100644 --- a/indra/newview/skins/default/xui/it/floater_region_info.xml +++ b/indra/newview/skins/default/xui/it/floater_region_info.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="regioninfo" title="Regione/Proprietà "/> +<floater name="regioninfo" title="REGIONE/PROPRIETÀ"/> diff --git a/indra/newview/skins/default/xui/it/floater_report_abuse.xml b/indra/newview/skins/default/xui/it/floater_report_abuse.xml index c67fc69db6d..4b969354fed 100644 --- a/indra/newview/skins/default/xui/it/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/it/floater_report_abuse.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="Denuncia di Abuso"> +<floater name="floater_report_abuse" title="DENUNCIA DI ABUSO"> <check_box label="Includi una fotografia" name="screen_check"/> <text name="reporter_title"> Segnalato da: diff --git a/indra/newview/skins/default/xui/it/floater_script_debug.xml b/indra/newview/skins/default/xui/it/floater_script_debug.xml index 66e0af264f0..89bf80da5ed 100644 --- a/indra/newview/skins/default/xui/it/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/it/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="script debug floater" title="Avvisi/Errori Script"> <tab_container name="Preview Tabs"> - <floater label="Script" name="all_scripts" title="[All scripts]"/> + <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]"/> </tab_container> </multi_floater> diff --git a/indra/newview/skins/default/xui/it/floater_script_preview.xml b/indra/newview/skins/default/xui/it/floater_script_preview.xml index 20af60b2d49..934ffd53958 100644 --- a/indra/newview/skins/default/xui/it/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/it/floater_script_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview lsl text" title="Script: Script di rotazione"> +<floater name="preview lsl text" title="SCRIPT: SCRIPT DI ROTAZIONE"> <text name="desc txt"> Descrizione: </text> diff --git a/indra/newview/skins/default/xui/it/floater_script_queue.xml b/indra/newview/skins/default/xui/it/floater_script_queue.xml index e5b38fea62f..37eb3e4bbfb 100644 --- a/indra/newview/skins/default/xui/it/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/it/floater_script_queue.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="queue" title="Progressione reset"> +<floater name="queue" title="PROGRESSIONE RESET"> <button label="Chiudi" label_selected="Chiudi" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_script_search.xml b/indra/newview/skins/default/xui/it/floater_script_search.xml index 470fb761351..e5f923f7a3f 100644 --- a/indra/newview/skins/default/xui/it/floater_script_search.xml +++ b/indra/newview/skins/default/xui/it/floater_script_search.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script search" title="Cerca Script" width="320"> +<floater name="script search" title="CERCA SCRIPT" width="320"> <check_box label="Senza distinzione tra maiuscole e minuscole" name="case_text" left="65"/> <button label="Cerca" label_selected="Cerca" name="search_btn" width="85"/> <button label="Sostituisci" label_selected="Sostituisci" name="replace_btn" left="100" width="85"/> diff --git a/indra/newview/skins/default/xui/it/floater_sell_land.xml b/indra/newview/skins/default/xui/it/floater_sell_land.xml index 79dd2c5abf1..91712a706bb 100644 --- a/indra/newview/skins/default/xui/it/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/it/floater_sell_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="sell land" title="Vendi terra"> +<floater name="sell land" title="VENDI TERRA"> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <text name="info_parcel_label"> diff --git a/indra/newview/skins/default/xui/it/floater_settings_debug.xml b/indra/newview/skins/default/xui/it/floater_settings_debug.xml index 6dd1b7978de..aec3c8aa9d4 100644 --- a/indra/newview/skins/default/xui/it/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/it/floater_settings_debug.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="settings_debug" title="Configurazioni per il debug"> +<floater name="settings_debug" title="CONFIGURAZIONI PER IL DEBUG"> <combo_box name="boolean_combo"> <combo_box.item name="TRUE" label="VERO"/> <combo_box.item name="FALSE" label="FALSO"/> diff --git a/indra/newview/skins/default/xui/it/floater_snapshot.xml b/indra/newview/skins/default/xui/it/floater_snapshot.xml index 808158ff7e7..e226ce6ffe4 100644 --- a/indra/newview/skins/default/xui/it/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/it/floater_snapshot.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="Anteprima della fotografia" width="247"> +<floater name="Snapshot" title="ANTEPRIMA DELLA FOTOGRAFIA" width="247"> <text name="type_label"> Destinazione della fotografia </text> diff --git a/indra/newview/skins/default/xui/it/floater_sound_preview.xml b/indra/newview/skins/default/xui/it/floater_sound_preview.xml index 86117329839..221e5e5b531 100644 --- a/indra/newview/skins/default/xui/it/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/it/floater_sound_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Sound Preview" title="sound.wav"> +<floater name="Sound Preview" title="SOUND.WAV"> <text name="name_label"> Nome: </text> diff --git a/indra/newview/skins/default/xui/it/floater_statistics.xml b/indra/newview/skins/default/xui/it/floater_statistics.xml index 6083949b8c1..00df1ff9949 100644 --- a/indra/newview/skins/default/xui/it/floater_statistics.xml +++ b/indra/newview/skins/default/xui/it/floater_statistics.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="Statistiche"/> +<floater name="stats floater" title="STATISTICHE"/> diff --git a/indra/newview/skins/default/xui/it/floater_telehub.xml b/indra/newview/skins/default/xui/it/floater_telehub.xml index 0c5199dbc7f..de5c32574f4 100644 --- a/indra/newview/skins/default/xui/it/floater_telehub.xml +++ b/indra/newview/skins/default/xui/it/floater_telehub.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="telehub" title="Telehub" min_height="310" height="310" width="286"> +<floater name="telehub" title="TELEHUB" min_height="310" height="310" width="286"> <text name="status_text_connected"> Telehub connesso all'oggetto [OBJECT] </text> diff --git a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml index 65bc8ba41db..836f85b48c4 100644 --- a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="Preferiti: Immagine"> +<floater name="texture picker" title="PREFERITI: IMMAGINE"> <string name="choose_picture"> Clicca per scegliere l'immagine </string> diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml index 8fc1818ccc1..8e6f27e162f 100644 --- a/indra/newview/skins/default/xui/it/floater_tools.xml +++ b/indra/newview/skins/default/xui/it/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="Costruisci" width="288"> +<floater name="toolbox floater" title="" short_title="COSTRUISCI" width="288"> <button label="" label_selected="" name="button focus" tool_tip="Focus"/> <button label="" label_selected="" name="button move" tool_tip="Muoviti"/> <button label="" label_selected="" name="button edit" tool_tip="Modifica"/> diff --git a/indra/newview/skins/default/xui/it/floater_top_objects.xml b/indra/newview/skins/default/xui/it/floater_top_objects.xml index 470e21769c8..9b406199e91 100644 --- a/indra/newview/skins/default/xui/it/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/it/floater_top_objects.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="top_objects" title="In caricamento..."> +<floater name="top_objects" title="IN CARICAMENTO..."> <text name="title_text"> In caricamento... </text> diff --git a/indra/newview/skins/default/xui/it/floater_water.xml b/indra/newview/skins/default/xui/it/floater_water.xml index 33f91ed1c88..13db1d4589b 100644 --- a/indra/newview/skins/default/xui/it/floater_water.xml +++ b/indra/newview/skins/default/xui/it/floater_water.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Water Floater" title="Editor avanzato dell'acqua"> +<floater name="Water Floater" title="EDITOR AVANZATO DELL'ACQUA"> <text name="KeyFramePresetsText" width="224"> Impostazioni predeterminate dell'acqua: </text> diff --git a/indra/newview/skins/default/xui/it/floater_windlight_options.xml b/indra/newview/skins/default/xui/it/floater_windlight_options.xml index 5076c777dc1..e86d656e392 100644 --- a/indra/newview/skins/default/xui/it/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/it/floater_windlight_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="WindLight floater" title="Editor avanzato del cielo"> +<floater name="WindLight floater" title="EDITOR AVANZATO DEL CIELO"> <text name="KeyFramePresetsText"> Cieli predefiniti: </text> diff --git a/indra/newview/skins/default/xui/it/floater_world_map.xml b/indra/newview/skins/default/xui/it/floater_world_map.xml index e19335fe07f..6fb7b93bc71 100644 --- a/indra/newview/skins/default/xui/it/floater_world_map.xml +++ b/indra/newview/skins/default/xui/it/floater_world_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="worldmap" title="Mappa"> +<floater name="worldmap" title="MAPPA"> <tab_container name="maptab"> <panel label="Oggetti" name="objects_mapview"/> <panel label="Terreno" name="terrain_mapview"/> diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml index a9b3d81a3b1..834d49e169b 100644 --- a/indra/newview/skins/default/xui/ja/floater_about.xml +++ b/indra/newview/skins/default/xui/ja/floater_about.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater name="floater_about" title="[APP_NAME]ã«ã¤ã„ã¦"> <tab_container name="about_tab"> <panel name="credits_panel"> diff --git a/indra/newview/skins/default/xui/ja/floater_device_settings.xml b/indra/newview/skins/default/xui/ja/floater_device_settings.xml index 5c258df9fd0..f189acf1011 100644 --- a/indra/newview/skins/default/xui/ja/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/ja/floater_device_settings.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_device_settings" title="ボイスãƒãƒ£ãƒƒãƒˆæ©Ÿå™¨ã®è¨å®š" /> \ No newline at end of file +<floater name="floater_device_settings" title="ボイスãƒãƒ£ãƒƒãƒˆæ©Ÿå™¨ã®è¨å®š" /> diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml index d4037487b70..22008099250 100644 --- a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Inventory Finder" title="inventory_recent_items"> +<floater name="Inventory Finder" title="INVENTORY_RECENT_ITEMS"> <check_box label="アニメーション" name="check_animation" /> <check_box label="コーリング・カード" name="check_calling_card" /> <check_box label="æœ" name="check_clothing" /> diff --git a/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml b/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml index 55eba966dca..e535fc731f8 100644 --- a/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="LSL Wiki"> +<floater name="script ed float" title="LSL WIKI"> <check_box label="カーソルを追ã†" name="lock_check" /> <combo_box label="ãƒãƒƒã‚¯" name="history_combo" /> <button label="戻る" name="back_btn" /> diff --git a/indra/newview/skins/default/xui/ja/floater_script_debug.xml b/indra/newview/skins/default/xui/ja/floater_script_debug.xml index dd934e3592f..0ac7a988e04 100644 --- a/indra/newview/skins/default/xui/ja/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/ja/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <multi_floater name="script debug floater" title="スクリプトè¦å‘Šï¼ã‚¨ãƒ©ãƒ¼"> <tab_container name="Preview Tabs"> - <floater label="スクリプト" name="all_scripts" title="[All scripts]" /> + <floater label="スクリプト" name="all_scripts" title="[ALL SCRIPTS]" /> </tab_container> </multi_floater> diff --git a/indra/newview/skins/default/xui/ja/floater_sound_preview.xml b/indra/newview/skins/default/xui/ja/floater_sound_preview.xml index b2479143899..d5109fe539c 100644 --- a/indra/newview/skins/default/xui/ja/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_sound_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Sound Preview" title="sound.wav"> +<floater name="Sound Preview" title="SOUND.WAV"> <text name="name_label"> åå‰ï¼š </text> diff --git a/indra/newview/skins/default/xui/nl/floater_about.xml b/indra/newview/skins/default/xui/nl/floater_about.xml index 9ad947df662..0c57a22be1f 100644 --- a/indra/newview/skins/default/xui/nl/floater_about.xml +++ b/indra/newview/skins/default/xui/nl/floater_about.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="Over [APP_NAME]"> +<floater name="floater_about" title="OVER [APP_NAME]"> <tab_container name="about_tab"> <panel name="credits_panel"> <text_editor name="credits_editor"> diff --git a/indra/newview/skins/default/xui/nl/floater_about_land.xml b/indra/newview/skins/default/xui/nl/floater_about_land.xml index 6aa80c00dbe..3a77de70d28 100644 --- a/indra/newview/skins/default/xui/nl/floater_about_land.xml +++ b/indra/newview/skins/default/xui/nl/floater_about_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="Over land"> +<floater name="floaterland" title="OVER LAND"> <tab_container name="landtab"> <panel label="Algemeen" name="land_general_panel"> <text name="Name:"> diff --git a/indra/newview/skins/default/xui/nl/floater_auction.xml b/indra/newview/skins/default/xui/nl/floater_auction.xml index eb061e028d5..611024699be 100644 --- a/indra/newview/skins/default/xui/nl/floater_auction.xml +++ b/indra/newview/skins/default/xui/nl/floater_auction.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="Start Linden Land Verkoop"> +<floater name="floater_auction" title="START LINDEN LAND VERKOOP"> <check_box label="Voeg geel selectie kader toe" name="fence_check"/> <button label="Foto" label_selected="Foto" name="snapshot_btn"/> <button label="OK" label_selected="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/nl/floater_beacons.xml b/indra/newview/skins/default/xui/nl/floater_beacons.xml index 84196ac14f6..ecc485e354b 100644 --- a/indra/newview/skins/default/xui/nl/floater_beacons.xml +++ b/indra/newview/skins/default/xui/nl/floater_beacons.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="Bakens"> +<floater name="beacons" title="BAKENS"> <panel name="beacons_panel"> <check_box label="Gescripte objecten met alleen Aanraken" name="touch_only"/> <check_box label="Gescripte objecten" name="scripted"/> diff --git a/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml b/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml index 7f35ec45a97..5374ffc26ab 100644 --- a/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/nl/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="Bulk wijzigen inhoud permissies"> +<floater name="floaterbulkperms" title="BULK WIJZIGEN INHOUD PERMISSIES"> <text name="applyto"> Inhoud Typen </text> diff --git a/indra/newview/skins/default/xui/nl/floater_bumps.xml b/indra/newview/skins/default/xui/nl/floater_bumps.xml index 9dbfe405aa4..df9a99d62ef 100644 --- a/indra/newview/skins/default/xui/nl/floater_bumps.xml +++ b/indra/newview/skins/default/xui/nl/floater_bumps.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_bumps" title="Botsingen, duwen & slaan"> +<floater name="floater_bumps" title="BOTSINGEN, DUWEN & SLAAN"> <string name="none_detected"> Geen gedetecteerd </string> diff --git a/indra/newview/skins/default/xui/nl/floater_buy_contents.xml b/indra/newview/skins/default/xui/nl/floater_buy_contents.xml index df0614b3d2c..4c0ff7d04a0 100644 --- a/indra/newview/skins/default/xui/nl/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/nl/floater_buy_contents.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_buy_contents" title="Koop inhoud"> +<floater name="floater_buy_contents" title="KOOP INHOUD"> <text name="contains_text"> [NAME] bevat: </text> diff --git a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml index 9f740b86c84..b6fc743abe0 100644 --- a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy currency" title="Koop valuta"> +<floater name="buy currency" title="KOOP VALUTA"> <text name="info_buying"> Valuta kopen </text> diff --git a/indra/newview/skins/default/xui/nl/floater_buy_land.xml b/indra/newview/skins/default/xui/nl/floater_buy_land.xml index 1bb02cc7d06..04990e78dbc 100644 --- a/indra/newview/skins/default/xui/nl/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/nl/floater_buy_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy land" title="Koop land"> +<floater name="buy land" title="KOOP LAND"> <text name="region_name_label"> Regio: </text> diff --git a/indra/newview/skins/default/xui/nl/floater_buy_object.xml b/indra/newview/skins/default/xui/nl/floater_buy_object.xml index c83f2008c61..5d2d9dd3d01 100644 --- a/indra/newview/skins/default/xui/nl/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/nl/floater_buy_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Koop een kopie van object"> +<floater name="contents" title="KOOP EEN KOPIE VAN OBJECT"> <text name="contents_text"> en zijn inhoud: </text> diff --git a/indra/newview/skins/default/xui/nl/floater_choose_group.xml b/indra/newview/skins/default/xui/nl/floater_choose_group.xml index 3f6ce44cfdc..8d54d62d2d0 100644 --- a/indra/newview/skins/default/xui/nl/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/nl/floater_choose_group.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="groups" title="Groepen"> +<floater name="groups" title="GROEPEN"> <text name="groupdesc"> Kies een groep: </text> diff --git a/indra/newview/skins/default/xui/nl/floater_color_picker.xml b/indra/newview/skins/default/xui/nl/floater_color_picker.xml index a357e874f7c..9b61af07102 100644 --- a/indra/newview/skins/default/xui/nl/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/nl/floater_color_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="ColorPicker" title="Kleurkiezer"> +<floater name="ColorPicker" title="KLEURKIEZER"> <text name="r_val_text"> Rood: </text> diff --git a/indra/newview/skins/default/xui/nl/floater_customize.xml b/indra/newview/skins/default/xui/nl/floater_customize.xml index 99a109ab782..4de26347e13 100644 --- a/indra/newview/skins/default/xui/nl/floater_customize.xml +++ b/indra/newview/skins/default/xui/nl/floater_customize.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="Uiterlijk" width="551"> +<floater name="floater customize" title="UITERLIJK" width="551"> <tab_container name="customize tab container" tab_min_width="120" width="549"> <placeholder label="Lichaamsdelen" name="body_parts_placeholder"/> <panel label="Postuur" name="Shape" left="124" width="389"> diff --git a/indra/newview/skins/default/xui/nl/floater_env_settings.xml b/indra/newview/skins/default/xui/nl/floater_env_settings.xml index d66c0b22056..3c207040d22 100644 --- a/indra/newview/skins/default/xui/nl/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/nl/floater_env_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Environment Editor Floater" title="Omgeving editor"> +<floater name="Environment Editor Floater" title="OMGEVING EDITOR"> <text bottom="-42" name="EnvTimeText"> Tijd van de dag diff --git a/indra/newview/skins/default/xui/nl/floater_font_test.xml b/indra/newview/skins/default/xui/nl/floater_font_test.xml index 8e8b07ee1a5..31e53e7fba9 100644 --- a/indra/newview/skins/default/xui/nl/floater_font_test.xml +++ b/indra/newview/skins/default/xui/nl/floater_font_test.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Lettertypetest"> +<floater name="contents" title="LETTERTYPETEST"> <text name="linea"> Overschrijf test, zou hier moeten verschijnen als Times (vanuit default/xui/en-us). </text> diff --git a/indra/newview/skins/default/xui/nl/floater_gesture.xml b/indra/newview/skins/default/xui/nl/floater_gesture.xml index d38972d5fe0..4fa994c69ec 100644 --- a/indra/newview/skins/default/xui/nl/floater_gesture.xml +++ b/indra/newview/skins/default/xui/nl/floater_gesture.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="gestures" title="Actieve gebaren"> +<floater name="gestures" title="ACTIEVE GEBAREN"> <text name="help_label"> Dubbelklik een gebaar om animaties en geluiden af te spelen </text> diff --git a/indra/newview/skins/default/xui/nl/floater_hud.xml b/indra/newview/skins/default/xui/nl/floater_hud.xml index 9da732ff2f3..8ef7de1b02b 100644 --- a/indra/newview/skins/default/xui/nl/floater_hud.xml +++ b/indra/newview/skins/default/xui/nl/floater_hud.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_hud" title="Handleiding"/> +<floater name="floater_hud" title="HANDLEIDING"/> diff --git a/indra/newview/skins/default/xui/nl/floater_inspect.xml b/indra/newview/skins/default/xui/nl/floater_inspect.xml index 96c9d59f905..6a0885b57f5 100644 --- a/indra/newview/skins/default/xui/nl/floater_inspect.xml +++ b/indra/newview/skins/default/xui/nl/floater_inspect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="inspect" title="Objecten inspecteren"> +<floater name="inspect" title="OBJECTEN INSPECTEREN"> <scroll_list name="object_list" tool_tip="Selecteer een object van deze lijst om het in-wereld te markeren"> <column label="Objectnaam" name="object_name"/> <column label="Eigenaar" name="owner_name"/> diff --git a/indra/newview/skins/default/xui/nl/floater_inventory.xml b/indra/newview/skins/default/xui/nl/floater_inventory.xml index 272fa3c899d..a69039d811e 100644 --- a/indra/newview/skins/default/xui/nl/floater_inventory.xml +++ b/indra/newview/skins/default/xui/nl/floater_inventory.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory" title="Inventaris"> +<floater name="Inventory" title="INVENTARIS"> <search_editor label="Typ hier om te zoeken" name="inventory search editor"/> <tab_container name="inventory filter tabs"> <inventory_panel label="Alle items" name="All Items"/> diff --git a/indra/newview/skins/default/xui/nl/floater_joystick.xml b/indra/newview/skins/default/xui/nl/floater_joystick.xml index ccc39034f5e..505e3cd719d 100644 --- a/indra/newview/skins/default/xui/nl/floater_joystick.xml +++ b/indra/newview/skins/default/xui/nl/floater_joystick.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Joystick" title="Joystick configuratie"> +<floater name="Joystick" title="JOYSTICK CONFIGURATIE"> <check_box name="enable_joystick" width="80" label="Joystick inschakelen:"/> <text left="146" name="joystick_type" width="360"/> <spinner label="X-as mapping" name="JoystickAxis1"/> diff --git a/indra/newview/skins/default/xui/nl/floater_lagmeter.xml b/indra/newview/skins/default/xui/nl/floater_lagmeter.xml index e8b1fb14bc4..e3943c2470f 100644 --- a/indra/newview/skins/default/xui/nl/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/nl/floater_lagmeter.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_lagmeter" title="Lag meter"> +<floater name="floater_lagmeter" title="LAG METER"> <button label="" label_selected="" name="client_lagmeter" tool_tip="Client lag status"/> <text name="client"> Client: diff --git a/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml b/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml index 556d151c8c7..27b3ff834ee 100644 --- a/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/nl/floater_lsl_guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="LSL Wiki"> +<floater name="script ed float" title="LSL WIKI"> <check_box label="Volg cursor" name="lock_check"/> <combo_box label="Vergrendelen" name="history_combo"/> <button label="Terug" name="back_btn"/> diff --git a/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml b/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml index 1c7e070e4a0..d0b25587b68 100644 --- a/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/nl/floater_mem_leaking.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="MemLeak" title="Geheugenlek simulatie"> +<floater name="MemLeak" title="GEHEUGENLEK SIMULATIE"> <spinner label="Leksnelheid (bytes per frame):" name="leak_speed"/> <spinner label="Max gelekt geheugen (MB):" name="max_leak"/> <text name="total_leaked_label"> diff --git a/indra/newview/skins/default/xui/nl/floater_mute_object.xml b/indra/newview/skins/default/xui/nl/floater_mute_object.xml index ca3b34c3a2e..7a34be1bd7c 100644 --- a/indra/newview/skins/default/xui/nl/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/nl/floater_mute_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="mute by name" title="Negeer object op naam"> +<floater name="mute by name" title="NEGEER OBJECT OP NAAM"> <text name="message" bottom_delta="-40"> Negeer op naam heeft alleen invloed op object chat en IM, niet op geluiden. U dient de naam van het object diff --git a/indra/newview/skins/default/xui/nl/floater_my_friends.xml b/indra/newview/skins/default/xui/nl/floater_my_friends.xml index ed81e6baf9a..8d709d3c004 100644 --- a/indra/newview/skins/default/xui/nl/floater_my_friends.xml +++ b/indra/newview/skins/default/xui/nl/floater_my_friends.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_my_friends" title="Contacten"> +<floater name="floater_my_friends" title="CONTACTEN"> <tab_container name="friends_and_groups"> <panel label="Vrienden" name="friends_panel"/> <panel label="Groepen" name="groups_panel"/> diff --git a/indra/newview/skins/default/xui/nl/floater_openobject.xml b/indra/newview/skins/default/xui/nl/floater_openobject.xml index 10b502be1cb..832c63403d9 100644 --- a/indra/newview/skins/default/xui/nl/floater_openobject.xml +++ b/indra/newview/skins/default/xui/nl/floater_openobject.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="objectcontents" title="Object inhoud"> +<floater name="objectcontents" title="OBJECT INHOUD"> <text name="object_name"> [DESC]: </text> diff --git a/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml b/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml index c1c94922861..f946c42678c 100644 --- a/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/nl/floater_perm_prefs.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="perm prefs" title="Standaard upload Permissies"> +<floater name="perm prefs" title="STANDAARD UPLOAD PERMISSIES"> <panel label="Permissies" name="permissions"> <button label="?" label_selected="?" name="help"/> <check_box label="Delen met groep" name="share_with_group"/> diff --git a/indra/newview/skins/default/xui/nl/floater_post_process.xml b/indra/newview/skins/default/xui/nl/floater_post_process.xml index 45fc211aeb4..e627f81a70a 100644 --- a/indra/newview/skins/default/xui/nl/floater_post_process.xml +++ b/indra/newview/skins/default/xui/nl/floater_post_process.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Post-Process Floater" title="Nabewerkinginstellingen"> +<floater name="Post-Process Floater" title="NABEWERKINGINSTELLINGEN"> <tab_container name="Post-Process Tabs"> <panel label="Kleurfilter" name="wmiColorFilterPanel"> <check_box label="Inschakelen" name="wmiColorFilterToggle"/> diff --git a/indra/newview/skins/default/xui/nl/floater_postcard.xml b/indra/newview/skins/default/xui/nl/floater_postcard.xml index a6d10f2244a..c2d092fdd46 100644 --- a/indra/newview/skins/default/xui/nl/floater_postcard.xml +++ b/indra/newview/skins/default/xui/nl/floater_postcard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Postcard" title="Email foto"> +<floater name="Postcard" title="EMAIL FOTO"> <text name="to_label"> Ontvanger e-mail: </text> diff --git a/indra/newview/skins/default/xui/nl/floater_preferences.xml b/indra/newview/skins/default/xui/nl/floater_preferences.xml index 25984ee65a2..6fc8005fd24 100644 --- a/indra/newview/skins/default/xui/nl/floater_preferences.xml +++ b/indra/newview/skins/default/xui/nl/floater_preferences.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Preferences" title="Voorkeuren"> +<floater name="Preferences" title="VOORKEUREN"> <button label="OK" label_selected="OK" name="OK"/> <button label="Annuleren" label_selected="Annuleren" name="Cancel"/> <button label="Toepassen" label_selected="Toepassen" name="Apply"/> diff --git a/indra/newview/skins/default/xui/nl/floater_region_info.xml b/indra/newview/skins/default/xui/nl/floater_region_info.xml index 3d4386bc163..0a98da3b4e0 100644 --- a/indra/newview/skins/default/xui/nl/floater_region_info.xml +++ b/indra/newview/skins/default/xui/nl/floater_region_info.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="regioninfo" title="Regio/estate"/> +<floater name="regioninfo" title="REGIO/ESTATE"/> diff --git a/indra/newview/skins/default/xui/nl/floater_report_abuse.xml b/indra/newview/skins/default/xui/nl/floater_report_abuse.xml index 012198d7b6f..19b11ede0a9 100644 --- a/indra/newview/skins/default/xui/nl/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/nl/floater_report_abuse.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="Misbruik rapporteren"> +<floater name="floater_report_abuse" title="MISBRUIK RAPPORTEREN"> <check_box label="Voeg schermafbeelding toe" name="screen_check"/> <text name="reporter_title" width="110"> Rapporteur: diff --git a/indra/newview/skins/default/xui/nl/floater_script_debug.xml b/indra/newview/skins/default/xui/nl/floater_script_debug.xml index df9531473e4..15e57f30d66 100644 --- a/indra/newview/skins/default/xui/nl/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/nl/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="script debug floater" title="Script waarschuwing/fout"> <tab_container name="Preview Tabs"> - <floater label="Script" name="all_scripts" title="[All scripts]"/> + <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]"/> </tab_container> </multi_floater> diff --git a/indra/newview/skins/default/xui/nl/floater_script_queue.xml b/indra/newview/skins/default/xui/nl/floater_script_queue.xml index 38c227e53c2..f79ad8faf3c 100644 --- a/indra/newview/skins/default/xui/nl/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/nl/floater_script_queue.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="queue" title="Voortgang opnieuw instellen"> +<floater name="queue" title="VOORTGANG OPNIEUW INSTELLEN"> <button label="Sluiten" label_selected="Sluiten" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/nl/floater_sell_land.xml b/indra/newview/skins/default/xui/nl/floater_sell_land.xml index 3981f3ccc23..468a383cfc0 100644 --- a/indra/newview/skins/default/xui/nl/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/nl/floater_sell_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="sell land" title="Verkoop land"> +<floater name="sell land" title="VERKOOP LAND"> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <text name="info_parcel_label"> diff --git a/indra/newview/skins/default/xui/nl/floater_snapshot.xml b/indra/newview/skins/default/xui/nl/floater_snapshot.xml index c7174d42f3c..251f3690da0 100644 --- a/indra/newview/skins/default/xui/nl/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/nl/floater_snapshot.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="Fotovoorbeeld"> +<floater name="Snapshot" title="FOTOVOORBEELD"> <text name="type_label"> Fotobestemming </text> diff --git a/indra/newview/skins/default/xui/nl/floater_statistics.xml b/indra/newview/skins/default/xui/nl/floater_statistics.xml index b899c32a56c..7684a73663b 100644 --- a/indra/newview/skins/default/xui/nl/floater_statistics.xml +++ b/indra/newview/skins/default/xui/nl/floater_statistics.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="Statistieken"/> +<floater name="stats floater" title="STATISTIEKEN"/> diff --git a/indra/newview/skins/default/xui/nl/floater_telehub.xml b/indra/newview/skins/default/xui/nl/floater_telehub.xml index 8fe8e06c03a..7b745d967c9 100644 --- a/indra/newview/skins/default/xui/nl/floater_telehub.xml +++ b/indra/newview/skins/default/xui/nl/floater_telehub.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="telehub" title="Telehub" width="292"> +<floater name="telehub" title="TELEHUB" width="292"> <text name="status_text_connected"> Telehub verbonden met object [OBJECT] </text> diff --git a/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml index 13a68747c6f..c8caa8caf49 100644 --- a/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/nl/floater_texture_ctrl.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="Kies: Textuur"> +<floater name="texture picker" title="KIES: TEXTUUR"> <string name="choose_picture"> Klik om een afbeelding te kiezen </string> diff --git a/indra/newview/skins/default/xui/nl/floater_tools.xml b/indra/newview/skins/default/xui/nl/floater_tools.xml index cb0c1ad89a9..f79d3dbd6b9 100644 --- a/indra/newview/skins/default/xui/nl/floater_tools.xml +++ b/indra/newview/skins/default/xui/nl/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="Bouwen" width="288"> +<floater name="toolbox floater" title="" short_title="BOUWEN" width="288"> <button label="" label_selected="" name="button focus" tool_tip="Focus"/> <button label="" label_selected="" name="button move" tool_tip="Verplaats"/> <button label="" label_selected="" name="button edit" tool_tip="Bewerk"/> diff --git a/indra/newview/skins/default/xui/nl/floater_top_objects.xml b/indra/newview/skins/default/xui/nl/floater_top_objects.xml index cc252352ebc..2bbb701df8d 100644 --- a/indra/newview/skins/default/xui/nl/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/nl/floater_top_objects.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="top_objects" title="laden…"> +<floater name="top_objects" title="LADEN…"> <text name="title_text"> Laden… </text> diff --git a/indra/newview/skins/default/xui/nl/floater_water.xml b/indra/newview/skins/default/xui/nl/floater_water.xml index 2238008fd80..1fb1ca241b9 100644 --- a/indra/newview/skins/default/xui/nl/floater_water.xml +++ b/indra/newview/skins/default/xui/nl/floater_water.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Water Floater" title="Geavanceerde water editor"> +<floater name="Water Floater" title="GEAVANCEERDE WATER EDITOR"> <combo_box bottom="-50" height="18" left_delta="116" name="WaterPresetsCombo" width="150" /> <text name="KeyFramePresetsText"> Watervoorinstellingen diff --git a/indra/newview/skins/default/xui/nl/floater_world_map.xml b/indra/newview/skins/default/xui/nl/floater_world_map.xml index e1eebaf92f3..bc14f92126b 100644 --- a/indra/newview/skins/default/xui/nl/floater_world_map.xml +++ b/indra/newview/skins/default/xui/nl/floater_world_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="worldmap" title="Wereldkaart"> +<floater name="worldmap" title="WERELDKAART"> <tab_container name="maptab"> <panel label="Objecten" name="objects_mapview"/> <panel label="Terrein" name="terrain_mapview"/> diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml index 83d4b717a76..d456ea26b42 100755 --- a/indra/newview/skins/default/xui/pl/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="O PosiadÅ‚oÅ›ci"> +<floater name="floaterland" title="O POSIADÅOÅšCI"> <tab_container name="landtab"> <panel label="Ogólne" name="land_general_panel"> <text name="Name:"> diff --git a/indra/newview/skins/default/xui/pl/floater_auction.xml b/indra/newview/skins/default/xui/pl/floater_auction.xml index 65a1bb85ea6..37e35ed1e96 100755 --- a/indra/newview/skins/default/xui/pl/floater_auction.xml +++ b/indra/newview/skins/default/xui/pl/floater_auction.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_auction" title="Rozpocznij Sprzedaż PosiadÅ‚oÅ›ci"> +<floater name="floater_auction" title="ROZPOCZNIJ SPRZEDAÅ» POSIADÅOÅšCI"> <check_box label="ZawierajÄ…c żółte ogrodzenie" name="fence_check" /> <button label="ZdjÄ™ce" label_selected="ZdjÄ™ce" name="snapshot_btn" /> <button label="OK" label_selected="OK" name="ok_btn" /> diff --git a/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml b/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml index cf4dcb91bf7..8c09f7294ca 100755 --- a/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="Wybierz Rezydenta"> +<floater name="avatarpicker" title="WYBIERZ REZYDENTA"> <tab_container name="ResidentChooserTabs"> <panel label="Znajdź" name="SearchPanel"> <text name="InstructSearchResidentName"> diff --git a/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml b/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml index b27c90b8f2f..dce2330807f 100755 --- a/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="avatar_texture_debug" title="Tekstury Awatara"> +<floater name="avatar_texture_debug" title="TEKSTURY AWATARA"> <text name="baked_label"> Tekstury Renderowane </text> diff --git a/indra/newview/skins/default/xui/pl/floater_beacons.xml b/indra/newview/skins/default/xui/pl/floater_beacons.xml index fd12d135959..6e7013f2d74 100644 --- a/indra/newview/skins/default/xui/pl/floater_beacons.xml +++ b/indra/newview/skins/default/xui/pl/floater_beacons.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="Emitery"> +<floater name="beacons" title="EMITERY"> <panel name="beacons_panel"> <check_box label="Obiekty Dotykalne" name="touch_only"/> <check_box label="Obiekty Skryptowane" name="scripted"/> diff --git a/indra/newview/skins/default/xui/pl/floater_build_options.xml b/indra/newview/skins/default/xui/pl/floater_build_options.xml index 7cbc4106144..f538be218cf 100755 --- a/indra/newview/skins/default/xui/pl/floater_build_options.xml +++ b/indra/newview/skins/default/xui/pl/floater_build_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="build options floater" title="Opcje Siatki"> +<floater name="build options floater" title="OPCJE SIATKI"> <spinner label="Jednostka Siatki (metry)" name="GridResolution" /> <spinner label="Rozmiary Siatki (metry)" name="GridDrawSize" /> <check_box label="UdostÄ™pnij Podjednostkowe Dopasowywanie" name="GridSubUnit" /> diff --git a/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml b/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml index a99acdb2385..f06615642ee 100644 --- a/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="Hurtowa zmiana praw zawartoÅ›ci"> +<floater name="floaterbulkperms" title="HURTOWA ZMIANA PRAW ZAWARTOÅšCI"> <text name="applyto"> Rodzaj ZawartoÅ›ci </text> diff --git a/indra/newview/skins/default/xui/pl/floater_bumps.xml b/indra/newview/skins/default/xui/pl/floater_bumps.xml index 365268dbd67..10f9d73284f 100755 --- a/indra/newview/skins/default/xui/pl/floater_bumps.xml +++ b/indra/newview/skins/default/xui/pl/floater_bumps.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_bumps" title="Zderzenia, PopchniÄ™cia, Uderzenia"> +<floater name="floater_bumps" title="ZDERZENIA, POPCHNIĘCIA, UDERZENIA"> <string name="none_detected"> Brak </string> diff --git a/indra/newview/skins/default/xui/pl/floater_buy_contents.xml b/indra/newview/skins/default/xui/pl/floater_buy_contents.xml index 395bcb4ea9c..ebe1c9dfd89 100755 --- a/indra/newview/skins/default/xui/pl/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_contents.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_buy_contents" title="Kup Zawartość"> +<floater name="floater_buy_contents" title="KUP ZAWARTOŚĆ"> <text name="contains_text"> [NAME] zawiera: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml index a5c0a2498ab..b0b8935433c 100755 --- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="buy currency" title="Kup $L"> +<floater name="buy currency" title="KUP $L"> <text name="info_buying"> Kup L$: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_buy_land.xml b/indra/newview/skins/default/xui/pl/floater_buy_land.xml index ff371b38c08..648888828be 100755 --- a/indra/newview/skins/default/xui/pl/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy land" title="Buy Land"> +<floater name="buy land" title="BUY LAND"> <text name="region_name_label"> Region: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_buy_object.xml b/indra/newview/skins/default/xui/pl/floater_buy_object.xml index b0868a46a24..bad79822286 100755 --- a/indra/newview/skins/default/xui/pl/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="contents" title="Kup kopiÄ™ obiektu"> +<floater name="contents" title="KUP KOPIĘ OBIEKTU"> <text name="contents_text"> i jej zawartość: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_choose_group.xml b/indra/newview/skins/default/xui/pl/floater_choose_group.xml index 789c40e48c6..72b66170948 100755 --- a/indra/newview/skins/default/xui/pl/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/pl/floater_choose_group.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="groups" title="Grupy"> +<floater name="groups" title="GRUPY"> <text name="groupdesc"> Wybierz grupÄ™: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_color_picker.xml b/indra/newview/skins/default/xui/pl/floater_color_picker.xml index d6ffe1837ab..904a2cc2704 100755 --- a/indra/newview/skins/default/xui/pl/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/pl/floater_color_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="ColorPicker" title="Wybór Koloru"> +<floater name="ColorPicker" title="WYBÓR KOLORU"> <text name="r_val_text"> Czerwony: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_customize.xml b/indra/newview/skins/default/xui/pl/floater_customize.xml index 64d9300621c..0c01d15faff 100755 --- a/indra/newview/skins/default/xui/pl/floater_customize.xml +++ b/indra/newview/skins/default/xui/pl/floater_customize.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="WyglÄ…d"> +<floater name="floater customize" title="WYGLÄ„D"> <tab_container name="customize tab container"> <placeholder label="Części CiaÅ‚a" name="body_parts_placeholder"/> <panel label="KsztaÅ‚t" name="Shape"> diff --git a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml index ea8db99570f..6671bb853e4 100755 --- a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Day Cycle Floater" title="Edytor Cyklu Dnia"> +<floater name="Day Cycle Floater" title="EDYTOR CYKLU DNIA"> <tab_container name="Day Cycle Tabs"> <panel label="Cykl Dnia" name="Day Cycle"> <button label="?" name="WLDayCycleHelp" /> diff --git a/indra/newview/skins/default/xui/pl/floater_device_settings.xml b/indra/newview/skins/default/xui/pl/floater_device_settings.xml index 0122aa819eb..e79478731d1 100755 --- a/indra/newview/skins/default/xui/pl/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/pl/floater_device_settings.xml @@ -1,3 +1,3 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater name="floater_device_settings" - title="Ustawienia UrzÄ…dzeÅ„ Komunikacji GÅ‚osowej" /> + title="USTAWIENIA URZÄ„DZEŃ KOMUNIKACJI GÅOSOWEJ" /> diff --git a/indra/newview/skins/default/xui/pl/floater_env_settings.xml b/indra/newview/skins/default/xui/pl/floater_env_settings.xml index 3e0809b193d..e197d94b271 100755 --- a/indra/newview/skins/default/xui/pl/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/pl/floater_env_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Environment Editor Floater" title="Edytor Åšrodowiska"> +<floater name="Environment Editor Floater" title="EDYTOR ÅšRODOWISKA"> <text name="EnvTimeText"> Czas </text> diff --git a/indra/newview/skins/default/xui/pl/floater_font_test.xml b/indra/newview/skins/default/xui/pl/floater_font_test.xml index 586d2690b3c..019cee3e1e5 100644 --- a/indra/newview/skins/default/xui/pl/floater_font_test.xml +++ b/indra/newview/skins/default/xui/pl/floater_font_test.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Czcionka Tekstu"> +<floater name="contents" title="CZCIONKA TEKSTU"> <text name="linea"> OverrideTest, powinno wyÅ›wietlać siÄ™ jako Times. (From default/xui/en-us) </text> diff --git a/indra/newview/skins/default/xui/pl/floater_gesture.xml b/indra/newview/skins/default/xui/pl/floater_gesture.xml index a05408dfc5c..4685eb6afe6 100755 --- a/indra/newview/skins/default/xui/pl/floater_gesture.xml +++ b/indra/newview/skins/default/xui/pl/floater_gesture.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="gestures" title="Aktywne Gesty"> +<floater name="gestures" title="AKTYWNE GESTY"> <text name="help_label"> Kliknij podwójnie by aktywować gÅ‚os i animacjÄ™ gestu. </text> diff --git a/indra/newview/skins/default/xui/pl/floater_god_tools.xml b/indra/newview/skins/default/xui/pl/floater_god_tools.xml index df821f3b6d0..a3ccffac033 100755 --- a/indra/newview/skins/default/xui/pl/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_god_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="godtools floater" title="Boskie NarzÄ™dzia"> +<floater name="godtools floater" title="BOSKIE NARZĘDZIA"> <tab_container name="GodTools Tabs"> <panel label="Grid" name="grid"> <button width="205" label="UsuÅ„ wszystkich użytkowników" label_selected="UsuÅ„ wszystkich użytkowników" name="Kick all users"/> diff --git a/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml index f1e6e5ea9e2..39695a67b6c 100755 --- a/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Hardware Settings Floater" title="Ustawienia SprzÄ™towe"> +<floater name="Hardware Settings Floater" title="USTAWIENIA SPRZĘTOWE"> <text name="Filtering:"> Filtrowanie: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_hud.xml b/indra/newview/skins/default/xui/pl/floater_hud.xml index 916473f063d..ff2d702132d 100755 --- a/indra/newview/skins/default/xui/pl/floater_hud.xml +++ b/indra/newview/skins/default/xui/pl/floater_hud.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_hud" title="Samouczek" /> +<floater name="floater_hud" title="SAMOUCZEK" /> diff --git a/indra/newview/skins/default/xui/pl/floater_inspect.xml b/indra/newview/skins/default/xui/pl/floater_inspect.xml index 1efdced5278..c98e0541d82 100755 --- a/indra/newview/skins/default/xui/pl/floater_inspect.xml +++ b/indra/newview/skins/default/xui/pl/floater_inspect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="inspect" title="Inspekcja Obiektów"> +<floater name="inspect" title="INSPEKCJA OBIEKTÓW"> <scroll_list name="object_list" tool_tip=""> <column label="Nazwa" name="object_name" /> <column label="WÅ‚aÅ›ciciel" name="owner_name" /> diff --git a/indra/newview/skins/default/xui/pl/floater_inventory.xml b/indra/newview/skins/default/xui/pl/floater_inventory.xml index 6df978de695..157be76c4d5 100755 --- a/indra/newview/skins/default/xui/pl/floater_inventory.xml +++ b/indra/newview/skins/default/xui/pl/floater_inventory.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory" title="Moja Szafa"> +<floater name="Inventory" title="MOJA SZAFA"> <search_editor label="Wyszukiwarka" name="inventory search editor"/> <tab_container name="inventory filter tabs"> <inventory_panel label="Wszystkie Obiekty" name="All Items"/> diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml index c32d1eeabfb..665172dd49a 100755 --- a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="item properties" title="WÅ‚aÅ›ciwoÅ›ci Obiektów w Szafie"> +<floater name="item properties" title="WÅAÅšCIWOÅšCI OBIEKTÓW W SZAFIE"> <text name="LabelItemNameTitle"> Nazwa: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml index 2224c026ef0..9204262304d 100755 --- a/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Inventory Finder" title="Nowe Obiekty"> +<floater name="Inventory Finder" title="NOWE OBIEKTY"> <check_box label="Animacje" name="check_animation" /> <check_box label="Wizytówki" name="check_calling_card" /> <check_box label="Ubrania" name="check_clothing" /> diff --git a/indra/newview/skins/default/xui/pl/floater_joystick.xml b/indra/newview/skins/default/xui/pl/floater_joystick.xml index 2ab92dfbb7b..22ac458b85d 100755 --- a/indra/newview/skins/default/xui/pl/floater_joystick.xml +++ b/indra/newview/skins/default/xui/pl/floater_joystick.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Joystick" width="590" title="Konfiguracja Joysticka"> +<floater name="Joystick" width="590" title="KONFIGURACJA JOYSTICKA"> <check_box name="enable_joystick" label="Aktywuj Joystick:"/> <text left="130" name="joystick_type" width="360"/> <spinner label="Kalibracja Osi X" left="20" width="170" label_width="130" name="JoystickAxis1"/> @@ -116,4 +116,4 @@ <string name="NoDevice"> brak podÅ‚Ä…cznego urzÄ…dzenia </string> -</floater> \ No newline at end of file +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml index 949289594e0..69d563bdbab 100755 --- a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_lagmeter" title="Pomiar Lagów"> +<floater name="floater_lagmeter" title="POMIAR LAGÓW"> <button label="" label_selected="" name="client_lagmeter" tool_tip="Status lagów klienta" /> <text name="client"> diff --git a/indra/newview/skins/default/xui/pl/floater_land_holdings.xml b/indra/newview/skins/default/xui/pl/floater_land_holdings.xml index 29268f0e976..13e6a8b16de 100755 --- a/indra/newview/skins/default/xui/pl/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/pl/floater_land_holdings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="Moja posiadÅ‚ość"> +<floater name="land holdings floater" title="MOJA POSIADÅOŚĆ"> <scroll_list name="parcel list"> <column label="Nazwa posiadÅ‚oÅ›ci" name="name"/> <column label="Region" name="location"/> diff --git a/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml index 94efd7afcb3..8120ff8c777 100755 --- a/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="Skrypt: Nowy Skrypt"> +<floater name="script ed float" title="SKRYPT: NOWY SKRYPT"> <button label="Zresetuj" label_selected="Zresetuj" name="Reset" /> <check_box label="WÅ‚Ä…cz" name="running" /> <check_box label="Mono" name="mono" /> diff --git a/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml b/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml index a0fa00dffea..5601aa44649 100755 --- a/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="LSL Wiki"> +<floater name="script ed float" title="LSL WIKI"> <check_box label="Idź za kursorem" name="lock_check" /> <combo_box label="Zablokuj" name="history_combo" /> <button label="Wróć" name="back_btn" /> diff --git a/indra/newview/skins/default/xui/pl/floater_media_browser.xml b/indra/newview/skins/default/xui/pl/floater_media_browser.xml index 2fb4287d900..74210c75e59 100755 --- a/indra/newview/skins/default/xui/pl/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/pl/floater_media_browser.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_about" title="PrzeglÄ…darka Mediów"> +<floater name="floater_about" title="PRZEGLÄ„DARKA MEDIÓW"> <layout_stack name="stack1"> <layout_panel name="nav_controls"> <button label="Wróć" name="back" /> diff --git a/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml b/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml index fe977e96c5d..88a878af725 100755 --- a/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="MemLeak" title="Symulacja Przecieków Alokacji PamiÄ™ci"> +<floater name="MemLeak" title="SYMULACJA PRZECIEKÓW ALOKACJI PAMIĘCI"> <spinner label="PrÄ™dkość Przecieków (byty na klatkÄ™):" name="leak_speed" /> <spinner label="Max Przecieki (MB):" name="max_leak" /> <text name="total_leaked_label"> diff --git a/indra/newview/skins/default/xui/pl/floater_mute_object.xml b/indra/newview/skins/default/xui/pl/floater_mute_object.xml index 310810db76a..dd30f749e30 100755 --- a/indra/newview/skins/default/xui/pl/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/pl/floater_mute_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="mute by name" title="Wycisz Obiekt WedÅ‚ug Nazwy" height="160" min_height="160" > +<floater name="mute by name" title="WYCISZ OBIEKT WEDÅUG NAZWY" height="160" min_height="160" > <text name="message"> Wyciszenie obiektu jest skuteczne jedynie na czacie oraz w wiadomoÅ›ciach IM. Nie obejmuje natomiast dźwiÄ™ków. diff --git a/indra/newview/skins/default/xui/pl/floater_my_friends.xml b/indra/newview/skins/default/xui/pl/floater_my_friends.xml index cc5f1f2a01b..0bcf6ba4d50 100755 --- a/indra/newview/skins/default/xui/pl/floater_my_friends.xml +++ b/indra/newview/skins/default/xui/pl/floater_my_friends.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_my_friends" title="Kontakty"> +<floater name="floater_my_friends" title="KONTAKTY"> <tab_container name="friends_and_groups"> <panel label="Znajomi" name="friends_panel" /> <panel label="Grupy" name="groups_panel" /> diff --git a/indra/newview/skins/default/xui/pl/floater_openobject.xml b/indra/newview/skins/default/xui/pl/floater_openobject.xml index 0470f4d6dcf..fbbed0f11df 100755 --- a/indra/newview/skins/default/xui/pl/floater_openobject.xml +++ b/indra/newview/skins/default/xui/pl/floater_openobject.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="objectcontents" title="Zawartość Obiektu"> +<floater name="objectcontents" title="ZAWARTOŚĆ OBIEKTU"> <text name="object_name"> [DESC]: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml b/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml index dd7cbe1f799..834552e2b00 100644 --- a/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="perm prefs" title="Prawa DomyÅ›lne"> +<floater name="perm prefs" title="PRAWA DOMYÅšLNE"> <panel label="Prawa" name="permissions"> <button label="?" label_selected="?" name="help"/> <check_box label="UdostÄ™pnij grupie" name="share_with_group"/> diff --git a/indra/newview/skins/default/xui/pl/floater_post_process.xml b/indra/newview/skins/default/xui/pl/floater_post_process.xml index 0081d1d3a7e..6bd91f97b1b 100755 --- a/indra/newview/skins/default/xui/pl/floater_post_process.xml +++ b/indra/newview/skins/default/xui/pl/floater_post_process.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Post-Process Floater" title="Ustawienia Przetwarzania KoÅ„cowego"> +<floater name="Post-Process Floater" title="USTAWIENIA PRZETWARZANIA KOŃCOWEGO"> <tab_container name="Post-Process Tabs"> <panel label="Kolor Filtru" name="wmiColorFilterPanel"> <check_box label="UdostÄ™pnij" name="wmiColorFilterToggle" /> diff --git a/indra/newview/skins/default/xui/pl/floater_postcard.xml b/indra/newview/skins/default/xui/pl/floater_postcard.xml index e5bdaf2ba99..8f4018924d0 100755 --- a/indra/newview/skins/default/xui/pl/floater_postcard.xml +++ b/indra/newview/skins/default/xui/pl/floater_postcard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Postcard" title="WyÅ›lij PocztówkÄ™"> +<floater name="Postcard" title="WYÅšLIJ POCZTÓWKĘ"> <text name="to_label"> Email Odbiorcy: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_preferences.xml b/indra/newview/skins/default/xui/pl/floater_preferences.xml index 380738425ef..2be663283fb 100755 --- a/indra/newview/skins/default/xui/pl/floater_preferences.xml +++ b/indra/newview/skins/default/xui/pl/floater_preferences.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Preferences" title="Ustawienia"> +<floater name="Preferences" title="USTAWIENIA"> <button label="OK" label_selected="OK" name="OK" /> <button label="Anuluj" label_selected="Anuluj" name="Cancel" /> <button label="Zastosuj" label_selected="Zastosuj" name="Apply" /> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_classified.xml b/indra/newview/skins/default/xui/pl/floater_preview_classified.xml index cc7d2761178..eae9ba2690f 100755 --- a/indra/newview/skins/default/xui/pl/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_classified.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="classified_preview" title="Reklama" /> +<floater name="classified_preview" title="REKLAMA" /> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_event.xml b/indra/newview/skins/default/xui/pl/floater_preview_event.xml index 75e17f6fa26..9fc0ff4da61 100755 --- a/indra/newview/skins/default/xui/pl/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_event.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="event_preview" title="Informacje o Imprezie" /> +<floater name="event_preview" title="INFORMACJE O IMPREZIE" /> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml b/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml index 0b3b9063c42..b9f80490ab0 100755 --- a/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview notecard" title="Nota:"> +<floater name="preview notecard" title="NOTA:"> <button label="Zapisz" label_selected="Zapisz" name="Save" /> <text name="desc txt"> Opis: diff --git a/indra/newview/skins/default/xui/pl/floater_region_info.xml b/indra/newview/skins/default/xui/pl/floater_region_info.xml index 6e632fd9c31..ca3c1391db1 100755 --- a/indra/newview/skins/default/xui/pl/floater_region_info.xml +++ b/indra/newview/skins/default/xui/pl/floater_region_info.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="regioninfo" title="Region/MajÄ…tek" /> +<floater name="regioninfo" title="REGION/MAJÄ„TEK" /> diff --git a/indra/newview/skins/default/xui/pl/floater_report_abuse.xml b/indra/newview/skins/default/xui/pl/floater_report_abuse.xml index 853c669adef..c1efcffb1e3 100755 --- a/indra/newview/skins/default/xui/pl/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/pl/floater_report_abuse.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="Raport o Nadużyciu"> +<floater name="floater_report_abuse" title="RAPORT O NADUÅ»YCIU"> <texture_picker label="" name="screenshot"/> <check_box label="ZaÅ‚Ä…cz zdjÄ™cie ekranu" name="screen_check"/> <text name="reporter_title"> diff --git a/indra/newview/skins/default/xui/pl/floater_script_debug.xml b/indra/newview/skins/default/xui/pl/floater_script_debug.xml index b41add82465..714a6002628 100755 --- a/indra/newview/skins/default/xui/pl/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/pl/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <multi_floater name="script debug floater" title="Ostrzeżenie/BÅ‚Ä…d Skryptu"> <tab_container name="Preview Tabs"> - <floater label="Skrypt" name="all_scripts" title="[All scripts]" /> + <floater label="Skrypt" name="all_scripts" title="[ALL SCRIPTS]" /> </tab_container> </multi_floater> diff --git a/indra/newview/skins/default/xui/pl/floater_script_preview.xml b/indra/newview/skins/default/xui/pl/floater_script_preview.xml index ca3fde33e7c..e3e72e15a3d 100755 --- a/indra/newview/skins/default/xui/pl/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/pl/floater_script_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview lsl text" title="Skrypt: Skrypt Obrotu"> +<floater name="preview lsl text" title="SKRYPT: SKRYPT OBROTU"> <text name="desc txt"> Opis: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_script_queue.xml b/indra/newview/skins/default/xui/pl/floater_script_queue.xml index 70d4669a077..7655f5fcace 100755 --- a/indra/newview/skins/default/xui/pl/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/pl/floater_script_queue.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="queue" title="Zresetuj PracÄ™ w Toku"> +<floater name="queue" title="ZRESETUJ PRACĘ W TOKU"> <button label="Zamknij" label_selected="Zamknij" name="close" /> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_script_search.xml b/indra/newview/skins/default/xui/pl/floater_script_search.xml index 50a9de15005..255ab4264c0 100755 --- a/indra/newview/skins/default/xui/pl/floater_script_search.xml +++ b/indra/newview/skins/default/xui/pl/floater_script_search.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script search" title="Szukaj Skryptu"> +<floater name="script search" title="SZUKAJ SKRYPTU"> <check_box label="CapsLoock Nieaktywny" name="case_text" /> <button label="Szukaj" label_selected="Szukaj" name="search_btn" /> <button label="ZamieÅ„" label_selected="ZamieÅ„" name="replace_btn" /> diff --git a/indra/newview/skins/default/xui/pl/floater_sell_land.xml b/indra/newview/skins/default/xui/pl/floater_sell_land.xml index 579dcd6745d..a306ec2c346 100755 --- a/indra/newview/skins/default/xui/pl/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_sell_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="sell land" title="Sell Land"> +<floater name="sell land" title="SELL LAND"> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <text name="info_parcel_label"> diff --git a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml index 99fa444a1bc..f87e2edecc2 100755 --- a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="settings_debug" title="Ustawienia Usuwania BÅ‚Ä™dów"> +<floater name="settings_debug" title="USTAWIENIA USUWANIA BÅĘDÓW"> <combo_box name="boolean_combo"> <combo_box.item name="TRUE" label="PRAWDA" /> <combo_box.item name="FALSE" label="NIEPRAWDA" /> diff --git a/indra/newview/skins/default/xui/pl/floater_snapshot.xml b/indra/newview/skins/default/xui/pl/floater_snapshot.xml index 4945cf64132..c807087170a 100755 --- a/indra/newview/skins/default/xui/pl/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/pl/floater_snapshot.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="WyglÄ…d ZdjÄ™cia"> +<floater name="Snapshot" title="WYGLÄ„D ZDJĘCIA"> <text name="type_label"> Lokacja zapisu </text> diff --git a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml index 2461aebbcf1..0826508fd6c 100755 --- a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Sound Preview" title="dźwiÄ™k.wav"> +<floater name="Sound Preview" title="DŹWIĘK.WAV"> <text name="name_label"> Opis: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_statistics.xml b/indra/newview/skins/default/xui/pl/floater_statistics.xml index 933801bbda2..b7025e484d5 100644 --- a/indra/newview/skins/default/xui/pl/floater_statistics.xml +++ b/indra/newview/skins/default/xui/pl/floater_statistics.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="Statystyki"/> +<floater name="stats floater" title="STATYSTYKI"/> diff --git a/indra/newview/skins/default/xui/pl/floater_telehub.xml b/indra/newview/skins/default/xui/pl/floater_telehub.xml index 917ab95eccb..9f564452a92 100755 --- a/indra/newview/skins/default/xui/pl/floater_telehub.xml +++ b/indra/newview/skins/default/xui/pl/floater_telehub.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="telehub" title="ObsÅ‚uga Teleportera" min_height="300" height="300" > +<floater name="telehub" title="OBSÅUGA TELEPORTERA" min_height="300" height="300" > <text name="status_text_connected" width="250"> Teleporter poÅ‚Ä…czony z obiektem [OBJECT] </text> diff --git a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml index 6d4df12e4bb..48366e2b645 100755 --- a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="Wybór Tekstury"> +<floater name="texture picker" title="WYBÓR TEKSTURY"> <string name="choose_picture"> Kliknij by wybrać obraz </string> diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml index c9e7a7e9eb8..e898c283c58 100755 --- a/indra/newview/skins/default/xui/pl/floater_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="Buduj"> +<floater name="toolbox floater" title="" short_title="BUDUJ"> <button label="" label_selected="" name="button focus" tool_tip="Zbliżenie"/> <button label="" label_selected="" name="button move" tool_tip="PrzesuniÄ™cie"/> <button label="" label_selected="" name="button edit" tool_tip="Edycja"/> diff --git a/indra/newview/skins/default/xui/pl/floater_top_objects.xml b/indra/newview/skins/default/xui/pl/floater_top_objects.xml index 44d838035d1..e7299b0abb8 100755 --- a/indra/newview/skins/default/xui/pl/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/pl/floater_top_objects.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="top_objects" title="Åadowanie..."> +<floater name="top_objects" title="ÅADOWANIE..."> <text name="title_text"> Åadowanie... </text> diff --git a/indra/newview/skins/default/xui/pl/floater_water.xml b/indra/newview/skins/default/xui/pl/floater_water.xml index a22b5809dc1..7333633c1d7 100755 --- a/indra/newview/skins/default/xui/pl/floater_water.xml +++ b/indra/newview/skins/default/xui/pl/floater_water.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Water Floater" title="Zaawansowany Edytor Wody"> +<floater name="Water Floater" title="ZAAWANSOWANY EDYTOR WODY"> <text name="KeyFramePresetsText"> Ustawienia Wody: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml b/indra/newview/skins/default/xui/pl/floater_windlight_options.xml index 94c20c06f72..86ef9300da3 100755 --- a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/pl/floater_windlight_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="WindLight floater" title="Zaawansowany Edytor Nieba"> +<floater name="WindLight floater" title="ZAAWANSOWANY EDYTOR NIEBA"> <text name="KeyFramePresetsText"> Ustawienia Nieba: </text> diff --git a/indra/newview/skins/default/xui/pl/floater_world_map.xml b/indra/newview/skins/default/xui/pl/floater_world_map.xml index 65f1c8ae592..36e3b0651bf 100755 --- a/indra/newview/skins/default/xui/pl/floater_world_map.xml +++ b/indra/newview/skins/default/xui/pl/floater_world_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="worldmap" title="Mapa Åšwiata"> +<floater name="worldmap" title="MAPA ÅšWIATA"> <tab_container name="maptab"> <panel label="Obiekty" name="objects_mapview"/> <panel label="Teren" name="terrain_mapview"/> diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml index 12cc879cbc4..9c19b128937 100644 --- a/indra/newview/skins/default/xui/pt/floater_about.xml +++ b/indra/newview/skins/default/xui/pt/floater_about.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="Sobre o [APP_NAME]"> +<floater name="floater_about" title="SOBRE O [APP_NAME]"> <tab_container name="about_tab"> <panel name="credits_panel"> <text_editor name="credits_editor"> 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 417d24608e4..19981cf48cc 100644 --- a/indra/newview/skins/default/xui/pt/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="Sobre o Terreno"> +<floater name="floaterland" title="SOBRE O TERRENO"> <tab_container name="landtab"> <panel label="Geral" name="land_general_panel"> <text name="Name:"> diff --git a/indra/newview/skins/default/xui/pt/floater_auction.xml b/indra/newview/skins/default/xui/pt/floater_auction.xml index 48e0b924006..34cd17d781b 100644 --- a/indra/newview/skins/default/xui/pt/floater_auction.xml +++ b/indra/newview/skins/default/xui/pt/floater_auction.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="Iniciar a venda de terrenos da Linden"> +<floater name="floater_auction" title="INICIAR A VENDA DE TERRENOS DA LINDEN"> <check_box label="Incluir marcador de seleção amarelo" name="fence_check"/> <button label="Foto" label_selected="Foto" name="snapshot_btn"/> <button label="OK" label_selected="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml b/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml index 4e1598c8faf..186ef30e1b4 100644 --- a/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="Escolha o Residente" min_width="285" width="285"> +<floater name="avatarpicker" title="ESCOLHA O RESIDENTE" min_width="285" width="285"> <tab_container name="ResidentChooserTabs" width="275"> <panel label="Buscar" name="SearchPanel"> <text name="InstructSearchResidentName"> diff --git a/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml b/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml index db0023d748b..04a78efb124 100644 --- a/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml +++ b/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatar_texture_debug" title="Texturas do Avatar"> +<floater name="avatar_texture_debug" title="TEXTURAS DO AVATAR"> <text name="baked_label"> Texturas sobrepostas </text> diff --git a/indra/newview/skins/default/xui/pt/floater_beacons.xml b/indra/newview/skins/default/xui/pt/floater_beacons.xml index edd1e080948..82f055745fb 100644 --- a/indra/newview/skins/default/xui/pt/floater_beacons.xml +++ b/indra/newview/skins/default/xui/pt/floater_beacons.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="Balizas"> +<floater name="beacons" title="BALIZAS"> <panel name="beacons_panel"> <check_box label="Objetos programados com toque apenas" name="touch_only"/> <check_box label="Objetos programados" name="scripted"/> diff --git a/indra/newview/skins/default/xui/pt/floater_build_options.xml b/indra/newview/skins/default/xui/pt/floater_build_options.xml index ebc9d0f0c8d..bce78fad217 100644 --- a/indra/newview/skins/default/xui/pt/floater_build_options.xml +++ b/indra/newview/skins/default/xui/pt/floater_build_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="build options floater" title="Opções de grade"> +<floater name="build options floater" title="OPÇÕES DE GRADE"> <spinner label="Uni. Grade (metros)" name="GridResolution" width="180" label_width="122"/> <spinner label="Ext. da Grade (metros)" name="GridDrawSize" width="180" label_width="122"/> <check_box label="Habilitar ajuste de sub-grade" name="GridSubUnit"/> diff --git a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml index c064d24f962..7443e197214 100644 --- a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="Mudança conjunta das permissões de conteúdo"> +<floater name="floaterbulkperms" title="MUDANÇA CONJUNTA DAS PERMISSÕES DE CONTEÚDO"> <text name="applyto"> Tipos de Conteúdo </text> diff --git a/indra/newview/skins/default/xui/pt/floater_bumps.xml b/indra/newview/skins/default/xui/pt/floater_bumps.xml index 0bc25462759..1833cd4335b 100644 --- a/indra/newview/skins/default/xui/pt/floater_bumps.xml +++ b/indra/newview/skins/default/xui/pt/floater_bumps.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_bumps" title="Colisões, impulsos e batidas"> +<floater name="floater_bumps" title="COLISÕES, IMPULSOS E BATIDAS"> <text name="none_detected"> Nada detectado </text> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_contents.xml b/indra/newview/skins/default/xui/pt/floater_buy_contents.xml index 3e8713d59ef..322a07575a3 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_contents.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_buy_contents" title="Comprar conteúdo"> +<floater name="floater_buy_contents" title="COMPRAR CONTEÚDO"> <text name="contains_text"> [NAME] contém: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml index 42ba2054757..ceeb070c4e4 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy currency" title="Comprar Dinheiro"> +<floater name="buy currency" title="COMPRAR DINHEIRO"> <text name="info_buying"> Comprando Dinheiro: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_land.xml b/indra/newview/skins/default/xui/pt/floater_buy_land.xml index 2caf057283f..6e502ad6e56 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="buy land" title="Comprar terra"> +<floater name="buy land" title="COMPRAR TERRA"> <text name="region_name_label"> Região: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_object.xml b/indra/newview/skins/default/xui/pt/floater_buy_object.xml index b8e10854718..e9968ed8f81 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Comprar cópia do objeto"> +<floater name="contents" title="COMPRAR CÓPIA DO OBJETO"> <text name="contents_text"> e seus conteúdos: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_choose_group.xml b/indra/newview/skins/default/xui/pt/floater_choose_group.xml index 449d5787160..ae395734e9f 100644 --- a/indra/newview/skins/default/xui/pt/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/pt/floater_choose_group.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="groups" title="Grupos"> +<floater name="groups" title="GRUPOS"> <text name="groupdesc"> Escolha um grupo: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_color_picker.xml b/indra/newview/skins/default/xui/pt/floater_color_picker.xml index 76da972b5d8..6a4263f4ff3 100644 --- a/indra/newview/skins/default/xui/pt/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/pt/floater_color_picker.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="ColorPicker" title="Seletor de Cor"> +<floater name="ColorPicker" title="SELETOR DE COR"> <text name="r_val_text"> Vermelho: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_customize.xml b/indra/newview/skins/default/xui/pt/floater_customize.xml index 4bced69664e..55946933e7c 100644 --- a/indra/newview/skins/default/xui/pt/floater_customize.xml +++ b/indra/newview/skins/default/xui/pt/floater_customize.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="Aparência" width="546"> +<floater name="floater customize" title="APARÊNCIA" width="546"> <tab_container name="customize tab container" tab_min_width="115" width="544"> <placeholder label="Partes de corpo" name="body_parts_placeholder"/> <panel label="Forma" name="Shape"> diff --git a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml index f02cca9c254..42f34a3d827 100644 --- a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Day Cycle Floater" title="Editor de ciclo de dia"> +<floater name="Day Cycle Floater" title="EDITOR DE CICLO DE DIA"> <tab_container name="Day Cycle Tabs"> <panel label="Ciclo do dia" name="Day Cycle"> <button label="?" name="WLDayCycleHelp"/> diff --git a/indra/newview/skins/default/xui/pt/floater_device_settings.xml b/indra/newview/skins/default/xui/pt/floater_device_settings.xml index 9ce773116c4..fa4da834b87 100644 --- a/indra/newview/skins/default/xui/pt/floater_device_settings.xml +++ b/indra/newview/skins/default/xui/pt/floater_device_settings.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_device_settings" title="Ajustes do Dispositivo de Conversa por Voz"/> +<floater name="floater_device_settings" title="AJUSTES DO DISPOSITIVO DE CONVERSA POR VOZ"/> diff --git a/indra/newview/skins/default/xui/pt/floater_env_settings.xml b/indra/newview/skins/default/xui/pt/floater_env_settings.xml index d3ed760551b..4a43801b48f 100644 --- a/indra/newview/skins/default/xui/pt/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/pt/floater_env_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Environment Editor Floater" title="Editor do Ambiente"> +<floater name="Environment Editor Floater" title="EDITOR DO AMBIENTE"> <text name="EnvTimeText"> Hora do Dia </text> diff --git a/indra/newview/skins/default/xui/pt/floater_font_test.xml b/indra/newview/skins/default/xui/pt/floater_font_test.xml index eb52d3341d9..c506cdb12d6 100644 --- a/indra/newview/skins/default/xui/pt/floater_font_test.xml +++ b/indra/newview/skins/default/xui/pt/floater_font_test.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="Teste de Fonte"> +<floater name="contents" title="TESTE DE FONTE"> <text name="linea"> OverrideTest, deveria aparecer aqui como Times. (De default/xui/en-us) </text> diff --git a/indra/newview/skins/default/xui/pt/floater_gesture.xml b/indra/newview/skins/default/xui/pt/floater_gesture.xml index ac50f32dd14..b0bc42685d5 100644 --- a/indra/newview/skins/default/xui/pt/floater_gesture.xml +++ b/indra/newview/skins/default/xui/pt/floater_gesture.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="gestures" title="Gestos Ativos"> +<floater name="gestures" title="GESTOS ATIVOS"> <text name="help_label"> Clicar duas vezes no gesto para executar animações e sons. </text> diff --git a/indra/newview/skins/default/xui/pt/floater_god_tools.xml b/indra/newview/skins/default/xui/pt/floater_god_tools.xml index 9406658f62d..4b7b2eb34ee 100644 --- a/indra/newview/skins/default/xui/pt/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/pt/floater_god_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="godtools floater" title="Ferramentas de Deus"> +<floater name="godtools floater" title="FERRAMENTAS DE DEUS"> <tab_container name="GodTools Tabs"> <panel label="Grade" name="grid"> <button label="Desconectar todos os usuários" label_selected="Desconectar todos os usuários" name="Kick all users"/> diff --git a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml index 0f9c1fd4871..8921e6ea125 100644 --- a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Hardware Settings Floater" title="Ajustes de Hardware"> +<floater name="Hardware Settings Floater" title="AJUSTES DE HARDWARE"> <text name="Filtering:"> Filtragem: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_hud.xml b/indra/newview/skins/default/xui/pt/floater_hud.xml index d31bcedf05e..e458913452f 100644 --- a/indra/newview/skins/default/xui/pt/floater_hud.xml +++ b/indra/newview/skins/default/xui/pt/floater_hud.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_hud" title="Tutorial"/> +<floater name="floater_hud" title="TUTORIAL"/> diff --git a/indra/newview/skins/default/xui/pt/floater_inspect.xml b/indra/newview/skins/default/xui/pt/floater_inspect.xml index f3c23f008e6..97c2c6eaeb8 100644 --- a/indra/newview/skins/default/xui/pt/floater_inspect.xml +++ b/indra/newview/skins/default/xui/pt/floater_inspect.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="inspect" title="Inspecionar Objeto" min_width="450"> +<floater name="inspect" title="INSPECIONAR OBJETO" min_width="450"> <scroll_list name="object_list" tool_tip="Selecione um objeto nesta lista para destacá-lo in-world"> <column label="Nome do Objeto" name="object_name"/> <column label="Proprietário" name="owner_name"/> diff --git a/indra/newview/skins/default/xui/pt/floater_inventory.xml b/indra/newview/skins/default/xui/pt/floater_inventory.xml index 8a06fefe3c2..1c2a3a92339 100644 --- a/indra/newview/skins/default/xui/pt/floater_inventory.xml +++ b/indra/newview/skins/default/xui/pt/floater_inventory.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory" title="Inventário"> +<floater name="Inventory" title="INVENTÃRIO"> <search_editor label="Escreva aqui para busca" name="inventory search editor"/> <tab_container name="inventory filter tabs"> <inventory_panel label="Todos os Itens" name="All Items"/> diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml index 69752253b6d..2a6b02f9c27 100644 --- a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="item properties" title="Propriedades do Item de Inventário"> +<floater name="item properties" title="PROPRIEDADES DO ITEM DE INVENTÃRIO"> <text name="LabelItemNameTitle"> Nome: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml index 83df449ae6f..57cdd50dcca 100644 --- a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Inventory Finder" title="itens_de_inventário_recentes" width="165"> +<floater name="Inventory Finder" title="ITENS_DE_INVENTÃRIO_RECENTES" width="165"> <check_box label="Animação" name="check_animation"/> <check_box label="Cartões de chamadas" name="check_calling_card"/> <check_box label="Roupas" name="check_clothing"/> diff --git a/indra/newview/skins/default/xui/pt/floater_joystick.xml b/indra/newview/skins/default/xui/pt/floater_joystick.xml index ac7b7fd02a0..0793a0b161d 100644 --- a/indra/newview/skins/default/xui/pt/floater_joystick.xml +++ b/indra/newview/skins/default/xui/pt/floater_joystick.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Joystick" title="Configuração do Joystick"> +<floater name="Joystick" title="CONFIGURAÇÃO DO JOYSTICK"> <check_box name="enable_joystick" label="Habilitar Joystick:"/> <text left="135" name="joystick_type" width="360"/> <spinner label="Mapeamento: eixo X" name="JoystickAxis1" label_width="124" width="164"/> diff --git a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml index 6657641992b..27286334386 100644 --- a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml +++ b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_lagmeter" title="Medidor de Atraso"> +<floater name="floater_lagmeter" title="MEDIDOR DE ATRASO"> <button label="" label_selected="" name="client_lagmeter" tool_tip="Status de atraso no Cliente"/> <text left="30" name="client_lag_cause" right="-10" /> <text left="30" name="network_lag_cause" right="-10" /> diff --git a/indra/newview/skins/default/xui/pt/floater_land_holdings.xml b/indra/newview/skins/default/xui/pt/floater_land_holdings.xml index 4734d665efb..d8588e2f05c 100644 --- a/indra/newview/skins/default/xui/pt/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/pt/floater_land_holdings.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="Meu terreno"> +<floater name="land holdings floater" title="MEU TERRENO"> <scroll_list name="parcel list"> <column label="Nome do Lote" name="name"/> <column label="Região" name="location"/> diff --git a/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml index d2654de5898..c0b726c476b 100644 --- a/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script ed float" title="Script: Novo Script"> +<floater name="script ed float" title="SCRIPT: NOVO SCRIPT"> <button label="Resetar" label_selected="Resetar" name="Reset"/> <check_box label="Correndo" name="running"/> <check_box label="Mono" name="mono" left="86"/> diff --git a/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml b/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml index 4f60ef23a61..49a9e7fcf5d 100644 --- a/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml +++ b/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="LSL Wiki"> +<floater name="script ed float" title="LSL WIKI"> <check_box label="Seguir o Cursor" name="lock_check" /> <combo_box label="Bloquear" name="history_combo" left_delta="120" width="70"/> <button label="Anterior" name="back_btn" left_delta="75"/> diff --git a/indra/newview/skins/default/xui/pt/floater_media_browser.xml b/indra/newview/skins/default/xui/pt/floater_media_browser.xml index cfaec5b410c..3437dfcdba3 100644 --- a/indra/newview/skins/default/xui/pt/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/pt/floater_media_browser.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater min_width="477" name="floater_about" title="Navegador de MÃdia" width="570"> +<floater min_width="477" name="floater_about" title="NAVEGADOR DE MÃDIA" width="570"> <layout_stack name="stack1" width="550"> <layout_panel name="nav_controls"> <button label="Para trás" name="back" width="75"/> diff --git a/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml b/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml index 374592f0e2a..4f93eb90e56 100644 --- a/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="MemLeak" title="Simulação de Perda de Memória"> +<floater name="MemLeak" title="SIMULAÇÃO DE PERDA DE MEMÓRIA"> <spinner label="Velocidade da Perda (bytes por quadro):" name="leak_speed"/> <spinner label="Máximo de Memória Perdida (MB):" name="max_leak"/> <text name="total_leaked_label"> diff --git a/indra/newview/skins/default/xui/pt/floater_mute_object.xml b/indra/newview/skins/default/xui/pt/floater_mute_object.xml index 7ec0051a7d5..cc669951c3f 100644 --- a/indra/newview/skins/default/xui/pt/floater_mute_object.xml +++ b/indra/newview/skins/default/xui/pt/floater_mute_object.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="mute by name" title="Silenciar objeto pelo nome"> +<floater name="mute by name" title="SILENCIAR OBJETO PELO NOME"> <text name="message"> Silenciar pelo nome afeta apenas conversa de objeto e MI, não sons. Você deve digitar o nome exato do objeto. diff --git a/indra/newview/skins/default/xui/pt/floater_my_friends.xml b/indra/newview/skins/default/xui/pt/floater_my_friends.xml index a78b255f8ab..68f2a19998d 100644 --- a/indra/newview/skins/default/xui/pt/floater_my_friends.xml +++ b/indra/newview/skins/default/xui/pt/floater_my_friends.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_my_friends" title="Contatos"> +<floater name="floater_my_friends" title="CONTATOS"> <tab_container name="friends_and_groups"> <panel label="Amigos" name="friends_panel"/> <panel label="Grupos" name="groups_panel"/> diff --git a/indra/newview/skins/default/xui/pt/floater_openobject.xml b/indra/newview/skins/default/xui/pt/floater_openobject.xml index d3b72b4b18a..0dc2852bac3 100644 --- a/indra/newview/skins/default/xui/pt/floater_openobject.xml +++ b/indra/newview/skins/default/xui/pt/floater_openobject.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="objectcontents" title="Conteúdo do objeto"> +<floater name="objectcontents" title="CONTEÚDO DO OBJETO"> <text name="object_name"> [DESC]: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_perm_prefs.xml b/indra/newview/skins/default/xui/pt/floater_perm_prefs.xml index 9bb7f04256f..33a0d6a456b 100644 --- a/indra/newview/skins/default/xui/pt/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/pt/floater_perm_prefs.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="perm prefs" title="Permissões Padrão de Upload"> +<floater name="perm prefs" title="PERMISSÕES PADRÃO DE UPLOAD"> <panel label="Permissões" name="permissions"> <button label="?" label_selected="?" name="help"/> <check_box label="Compartilhar com o grupo" name="share_with_group"/> diff --git a/indra/newview/skins/default/xui/pt/floater_post_process.xml b/indra/newview/skins/default/xui/pt/floater_post_process.xml index 8f5f5db7430..d4f2e96539a 100644 --- a/indra/newview/skins/default/xui/pt/floater_post_process.xml +++ b/indra/newview/skins/default/xui/pt/floater_post_process.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Post-Process Floater" title="Ajustes de Pós-processamento"> +<floater name="Post-Process Floater" title="AJUSTES DE PÓS-PROCESSAMENTO"> <tab_container name="Post-Process Tabs"> <panel label="Filtro de Cor" name="wmiColorFilterPanel"> <check_box label="Habilitar" name="wmiColorFilterToggle"/> diff --git a/indra/newview/skins/default/xui/pt/floater_postcard.xml b/indra/newview/skins/default/xui/pt/floater_postcard.xml index 62fd050ea47..cf63726df2a 100644 --- a/indra/newview/skins/default/xui/pt/floater_postcard.xml +++ b/indra/newview/skins/default/xui/pt/floater_postcard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Postcard" title="Foto por email"> +<floater name="Postcard" title="FOTO POR EMAIL"> <text name="to_label" width="135"> Email do Destinatário: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_preferences.xml b/indra/newview/skins/default/xui/pt/floater_preferences.xml index 0e9ef768b5a..d2c3c791601 100644 --- a/indra/newview/skins/default/xui/pt/floater_preferences.xml +++ b/indra/newview/skins/default/xui/pt/floater_preferences.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Preferences" title="Preferências" min_width="332" width="628"> +<floater name="Preferences" title="PREFERÊNCIAS" min_width="332" width="628"> <button label="OK" label_selected="OK" name="OK"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> <button label="Aplicar" label_selected="Aplicar" name="Apply"/> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_classified.xml b/indra/newview/skins/default/xui/pt/floater_preview_classified.xml index 4c583c28fb1..0e8814b9f8a 100644 --- a/indra/newview/skins/default/xui/pt/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/pt/floater_preview_classified.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="Informação do Anúncio Classificado"/> +<floater name="classified_preview" title="INFORMAÇÃO DO ANÚNCIO CLASSIFICADO"/> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_event.xml b/indra/newview/skins/default/xui/pt/floater_preview_event.xml index 3c8ebcf95a9..c03feacf0cf 100644 --- a/indra/newview/skins/default/xui/pt/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/pt/floater_preview_event.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="Informação do Evento"/> +<floater name="event_preview" title="INFORMAÇÃO DO EVENTO"/> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml b/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml index e0a133d8ab6..6f8944942a1 100644 --- a/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="preview notecard" title="Nota:"> +<floater name="preview notecard" title="NOTA:"> <button label="Salvar" label_selected="Salvar" name="Save"/> <text name="desc txt"> Descrição: diff --git a/indra/newview/skins/default/xui/pt/floater_region_info.xml b/indra/newview/skins/default/xui/pt/floater_region_info.xml index fe228ab405f..cc5e0d59d45 100644 --- a/indra/newview/skins/default/xui/pt/floater_region_info.xml +++ b/indra/newview/skins/default/xui/pt/floater_region_info.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="regioninfo" title="Região/Propriedade"/> +<floater name="regioninfo" title="REGIÃO/PROPRIEDADE"/> diff --git a/indra/newview/skins/default/xui/pt/floater_report_abuse.xml b/indra/newview/skins/default/xui/pt/floater_report_abuse.xml index 51d7ef8190b..0d226a9502f 100644 --- a/indra/newview/skins/default/xui/pt/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/pt/floater_report_abuse.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="Reportar abuso"> +<floater name="floater_report_abuse" title="REPORTAR ABUSO"> <check_box label="Incluir cópia da tela" name="screen_check"/> <text name="reporter_title"> Denunciador: diff --git a/indra/newview/skins/default/xui/pt/floater_script_debug.xml b/indra/newview/skins/default/xui/pt/floater_script_debug.xml index d7a9bc6f879..6d1d981ca7b 100644 --- a/indra/newview/skins/default/xui/pt/floater_script_debug.xml +++ b/indra/newview/skins/default/xui/pt/floater_script_debug.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <multi_floater name="script debug floater" title="Aviso de script/erro"> <tab_container name="Preview Tabs"> - <floater label="Script" name="all_scripts" title="[All scripts]"/> + <floater label="Script" name="all_scripts" title="[ALL SCRIPTS]"/> </tab_container> </multi_floater> diff --git a/indra/newview/skins/default/xui/pt/floater_script_preview.xml b/indra/newview/skins/default/xui/pt/floater_script_preview.xml index 2a7680565f5..3c0570791c1 100644 --- a/indra/newview/skins/default/xui/pt/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/pt/floater_script_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview lsl text" title="Script: Rotation Script"> +<floater name="preview lsl text" title="SCRIPT: ROTATION SCRIPT"> <text name="desc txt"> Descrição: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_script_queue.xml b/indra/newview/skins/default/xui/pt/floater_script_queue.xml index 7b35226bdb4..6e0e174c079 100644 --- a/indra/newview/skins/default/xui/pt/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/pt/floater_script_queue.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="queue" title="Resetar Progresso"> +<floater name="queue" title="RESETAR PROGRESSO"> <button label="Fechar" label_selected="Fechar" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_script_search.xml b/indra/newview/skins/default/xui/pt/floater_script_search.xml index c904c0f816f..3a62f1711f2 100644 --- a/indra/newview/skins/default/xui/pt/floater_script_search.xml +++ b/indra/newview/skins/default/xui/pt/floater_script_search.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="script search" title="Busca de Script" width="320"> +<floater name="script search" title="BUSCA DE SCRIPT" width="320"> <check_box label="Não diferenciar Maiúsculas de Minúsculas" name="case_text" left="75"/> <button label="Buscar" label_selected="Buscar" name="search_btn" width="85"/> <button label="Substituir" label_selected="Substituir" name="replace_btn" left="100" width="85"/> diff --git a/indra/newview/skins/default/xui/pt/floater_sell_land.xml b/indra/newview/skins/default/xui/pt/floater_sell_land.xml index d3581405ffe..f58c4098ef4 100644 --- a/indra/newview/skins/default/xui/pt/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_sell_land.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="sell land" title="Vender terreno"> +<floater name="sell land" title="VENDER TERRENO"> <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <text name="info_parcel_label"> diff --git a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml index f7b468bb220..394a9771e0c 100644 --- a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="settings_debug" title="Configurações de Debug"> +<floater name="settings_debug" title="CONFIGURAÇÕES DE DEBUG"> <combo_box name="boolean_combo"> <combo_box.item name="TRUE" label="VERDADEIRO" /> <combo_box.item name="FALSE" label="FALSO" /> diff --git a/indra/newview/skins/default/xui/pt/floater_snapshot.xml b/indra/newview/skins/default/xui/pt/floater_snapshot.xml index a924706cb99..c3c4c73a89d 100644 --- a/indra/newview/skins/default/xui/pt/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/pt/floater_snapshot.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Snapshot" title="Prévia da foto"> +<floater name="Snapshot" title="PRÉVIA DA FOTO"> <text name="type_label"> Destino da foto </text> diff --git a/indra/newview/skins/default/xui/pt/floater_sound_preview.xml b/indra/newview/skins/default/xui/pt/floater_sound_preview.xml index df76499f42b..d5d252c0ddd 100644 --- a/indra/newview/skins/default/xui/pt/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/pt/floater_sound_preview.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Sound Preview" title="sound.wav"> +<floater name="Sound Preview" title="SOUND.WAV"> <text name="name_label"> Nome: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_statistics.xml b/indra/newview/skins/default/xui/pt/floater_statistics.xml index d26c7081cc9..c56c9fb2e05 100644 --- a/indra/newview/skins/default/xui/pt/floater_statistics.xml +++ b/indra/newview/skins/default/xui/pt/floater_statistics.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="StatÃstica"/> +<floater name="stats floater" title="STATÃSTICA"/> diff --git a/indra/newview/skins/default/xui/pt/floater_telehub.xml b/indra/newview/skins/default/xui/pt/floater_telehub.xml index 11886c7cabf..5c775ab45d0 100644 --- a/indra/newview/skins/default/xui/pt/floater_telehub.xml +++ b/indra/newview/skins/default/xui/pt/floater_telehub.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="telehub" title="Telehub" min_height="310" height="310" width="286"> +<floater name="telehub" title="TELEHUB" min_height="310" height="310" width="286"> <text name="status_text_connected"> Telehub conectado ao objeto [OBJECT] </text> diff --git a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml index 784540a48e6..b63c4a9bbf3 100644 --- a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="texture picker" title="Pegar: Textura"> +<floater name="texture picker" title="PEGAR: TEXTURA"> <string name="choose_picture"> Clique para escolher uma imagem </string> diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml index d7227deacc1..b9ab0186066 100644 --- a/indra/newview/skins/default/xui/pt/floater_tools.xml +++ b/indra/newview/skins/default/xui/pt/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="Construir" width="288"> +<floater name="toolbox floater" title="" short_title="CONSTRUIR" width="288"> <button label="" label_selected="" name="button focus" tool_tip="Foco"/> <button label="" label_selected="" name="button move" tool_tip="Mover"/> <button label="" label_selected="" name="button edit" tool_tip="Editar"/> diff --git a/indra/newview/skins/default/xui/pt/floater_top_objects.xml b/indra/newview/skins/default/xui/pt/floater_top_objects.xml index cd94b51b167..15e69c450cc 100644 --- a/indra/newview/skins/default/xui/pt/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/pt/floater_top_objects.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="top_objects" title="Carregando..."> +<floater name="top_objects" title="CARREGANDO..."> <text name="title_text"> Carregando... </text> diff --git a/indra/newview/skins/default/xui/pt/floater_water.xml b/indra/newview/skins/default/xui/pt/floater_water.xml index ceb4414058e..bad9aa0943c 100644 --- a/indra/newview/skins/default/xui/pt/floater_water.xml +++ b/indra/newview/skins/default/xui/pt/floater_water.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Water Floater" title="Editor de Ãgua Avançado"> +<floater name="Water Floater" title="EDITOR DE ÃGUA AVANÇADO"> <text name="KeyFramePresetsText" width="154"> Pré-configurações da Ãgua: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml index 0de8bd22f8b..951e37a1a65 100644 --- a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="WindLight floater" title="Editor de Céu Avançado"> +<floater name="WindLight floater" title="EDITOR DE CÉU AVANÇADO"> <text name="KeyFramePresetsText" width="130"> Pré-definições de Céu: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_world_map.xml b/indra/newview/skins/default/xui/pt/floater_world_map.xml index 056d1215202..034602d6ea6 100644 --- a/indra/newview/skins/default/xui/pt/floater_world_map.xml +++ b/indra/newview/skins/default/xui/pt/floater_world_map.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="worldmap" title="Mapa Mundi"> +<floater name="worldmap" title="MAPA MUNDI"> <tab_container name="maptab"> <panel label="Objetos" name="objects_mapview"/> <panel label="Terreno" name="terrain_mapview"/> -- GitLab From b03ccaec164ea01e87d8bf6d9a507a0606151ab6 Mon Sep 17 00:00:00 2001 From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com> Date: Wed, 4 Nov 2009 19:39:50 -0500 Subject: [PATCH 147/306] Changed rollover graphic on Favorites links. http://jira.secondlife.com/browse/EXT-2218 --- .../textures/navbar/Favorite_Link_Over.png | Bin 0 -> 191 bytes indra/newview/skins/default/textures/textures.xml | 5 +---- .../skins/default/xui/en/favorites_bar_button.xml | 8 ++++---- 3 files changed, 5 insertions(+), 8 deletions(-) create mode 100644 indra/newview/skins/default/textures/navbar/Favorite_Link_Over.png diff --git a/indra/newview/skins/default/textures/navbar/Favorite_Link_Over.png b/indra/newview/skins/default/textures/navbar/Favorite_Link_Over.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f126f9692110c2f8ecb9f6c80e85c05d947e65 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^6+q0-!3HGtow-*7DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MTwp+jv*Dd-dx_udBA|jCD4^+y5^q$dQm5rm{>g7a_pmh z%$?U0SFdt&v5DIM<npz9(eqcTe&4XV{>ID)QPUsn;x1-t;7nke!Jr1BBod04?B*QY mcKLw!?;WkNxx4BZ*%;!zxiST&3(o{v#^CAd=d#Wzp$PyfZbe=I literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 4aafe462b79..8be90cb03ee 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -89,6 +89,7 @@ <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" /> <texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" /> <texture name="Favorite_Star_Over" file_name="navbar/Favorite_Star_Over.png" preload="false" /> + <texture name="Favorite_Link_Over" file_name="navbar/Favorite_Link_Over.png" preload="false" /> <texture name="FileMenu_BarSelect" file_name="navbar/FileMenu_BarSelect.png" preload="false" scale.left="2" scale.top="0" scale.right="2" scale.bottom="0" /> <texture name="FileMenu_BG" file_name="navbar/FileMenu_BG.png" preload="false" /> @@ -396,10 +397,6 @@ <texture name="TabIcon_Home_Off" file_name="taskpanel/TabIcon_Home_Off.png" preload="false" /> <texture name="TabIcon_Home_Over" file_name="taskpanel/TabIcon_Home_Over.png" preload="false" /> <texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" /> - <texture name="TabIcon_Inventory_Large" file_name="taskpanel/TabIcon_Inventory_Large.png" preload="false" /> - <texture name="TabIcon_Inventory_Off" file_name="taskpanel/TabIcon_Inventory_Off.png" preload="false" /> - <texture name="TabIcon_Inventory_Over" file_name="taskpanel/TabIcon_Inventory_Over.png" preload="false" /> - <texture name="TabIcon_Inventory_Selected" file_name="taskpanel/TabIcon_Inventory_Selected.png" preload="false" /> <texture name="TabIcon_Me_Large" file_name="taskpanel/TabIcon_Me_Large.png" preload="false" /> <texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" /> <texture name="TabIcon_Me_Over" file_name="taskpanel/TabIcon_Me_Over.png" preload="false" /> diff --git a/indra/newview/skins/default/xui/en/favorites_bar_button.xml b/indra/newview/skins/default/xui/en/favorites_bar_button.xml index c35cbb15393..361f5a7bc82 100644 --- a/indra/newview/skins/default/xui/en/favorites_bar_button.xml +++ b/indra/newview/skins/default/xui/en/favorites_bar_button.xml @@ -9,10 +9,10 @@ image_disabled_selected="transparent.j2c" image_selected="transparent.j2c" image_unselected="transparent.j2c" - image_hover_selected="FileMenu_BarSelect" - image_hover_unselected="FileMenu_BarSelect" - image_pressed="FileMenu_BarSelect" - image_pressed_selected="FileMenu_BarSelect" + image_hover_selected="Favorite_Link_Over" + image_hover_unselected="Favorite_Link_Over" + image_pressed="Favorite_Link_Over" + image_pressed_selected="Favorite_Link_Over" hover_glow_amount="0.15" layout="topleft" left="0" -- GitLab From 4656c5671cfe523e351b5c91ae45d5026fb69e04 Mon Sep 17 00:00:00 2001 From: Erica <erica@lindenlab.com> Date: Wed, 4 Nov 2009 17:09:37 -0800 Subject: [PATCH 148/306] EXT-2220 Make envelope icon for unread messages --- .../textures/bottomtray/Notices_Unread.png | Bin 0 -> 333 bytes .../newview/skins/default/textures/textures.xml | 7 ++++++- .../skins/default/xui/en/panel_bottomtray.xml | 15 +++++++++------ 3 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 indra/newview/skins/default/textures/bottomtray/Notices_Unread.png diff --git a/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png b/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png new file mode 100644 index 0000000000000000000000000000000000000000..98f1f04b9a70d6eeb129a0f0355d220518b03d33 GIT binary patch literal 333 zcmV-T0kZyyP)<h;3K|Lk000e1NJLTq000yK000gM0{{R37#hsN0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUyW>8F2MVgwLl$4Z?j*gg^n1O+To12@# z!NGulfQyTZwY9alxVV*-mAbmRmX?-{jg7Xpwuy;}mzS5Orly{ro{^D}kB^U%l9Ir{ zz?__%ii(P&qN2CAx1F7xpP!$rtE-urnZm-tprD{nWGd<a004bSL_t(|+FZ)*7J?uY zMA5kjN~vXO-w@pQf5{Mp)bnfBUW4}f-Sr+oAHS_0HSF`Su?GzVHkY;5le_`UraJ%a zE(L7BwYIbIjBMO7SucgNoG^T&x+dC!;oEtS<`gYs_;xm1L2LS#sFD>73bhzRap61^ fH1RIdKLG{+f;}BglI|l300000NkvXXu0mjfpaz$X literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 8be90cb03ee..2b9ebd05730 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -89,7 +89,6 @@ <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" /> <texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" /> <texture name="Favorite_Star_Over" file_name="navbar/Favorite_Star_Over.png" preload="false" /> - <texture name="Favorite_Link_Over" file_name="navbar/Favorite_Link_Over.png" preload="false" /> <texture name="FileMenu_BarSelect" file_name="navbar/FileMenu_BarSelect.png" preload="false" scale.left="2" scale.top="0" scale.right="2" scale.bottom="0" /> <texture name="FileMenu_BG" file_name="navbar/FileMenu_BG.png" preload="false" /> @@ -234,6 +233,8 @@ <texture name="NearbyVoice_Lvl3" file_name="bottomtray/NearbyVoice_Lvl3.png" preload="false" /> <texture name="NearbyVoice_On" file_name="bottomtray/NearbyVoice_On.png" preload="false" /> + <texture name="Notices_Unread" file_name="bottomtray/Notices_Unread.png" preload="true" /> + <texture name="Object_Cone" file_name="build/Object_Cone.png" preload="false" /> <texture name="Object_Cube" file_name="build/Object_Cube.png" preload="false" /> <texture name="Object_Cylinder" file_name="build/Object_Cylinder.png" preload="false" /> @@ -397,6 +398,10 @@ <texture name="TabIcon_Home_Off" file_name="taskpanel/TabIcon_Home_Off.png" preload="false" /> <texture name="TabIcon_Home_Over" file_name="taskpanel/TabIcon_Home_Over.png" preload="false" /> <texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" /> + <texture name="TabIcon_Inventory_Large" file_name="taskpanel/TabIcon_Inventory_Large.png" preload="false" /> + <texture name="TabIcon_Inventory_Off" file_name="taskpanel/TabIcon_Inventory_Off.png" preload="false" /> + <texture name="TabIcon_Inventory_Over" file_name="taskpanel/TabIcon_Inventory_Over.png" preload="false" /> + <texture name="TabIcon_Inventory_Selected" file_name="taskpanel/TabIcon_Inventory_Selected.png" preload="false" /> <texture name="TabIcon_Me_Large" file_name="taskpanel/TabIcon_Me_Large.png" preload="false" /> <texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" /> <texture name="TabIcon_Me_Over" file_name="taskpanel/TabIcon_Me_Over.png" preload="false" /> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 3149a1f7b39..1da5f0e74d2 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -60,7 +60,7 @@ min_width="96" name="speak_panel" user_resize="false"> - <talk_button + <chiclet_talk follows="right" height="23" speak_button.tab_stop="true" @@ -93,7 +93,7 @@ min_width="76" name="gesture_panel" user_resize="false"> - <gesture_combo_box + <button follows="right" height="23" label="Gesture" @@ -258,11 +258,11 @@ user_resize="false"> <chiclet_notification follows="right" - height="25" + height="23" layout="topleft" left="0" name="sys_well" - top="3" + top="4" width="34"> <button auto_resize="true" @@ -271,7 +271,10 @@ follows="right" flash_color="EmphasisColor" name="Unread" - image_overlay="Widget_UpArrow" /> + picture_style="true" + image_overlay="Notices_Unread" + width="20" + /> <unread_notifications width="34" height="23" @@ -288,6 +291,6 @@ layout="topleft" right="-1" top="0" - width="10"/> + width="26"/> </layout_stack> </panel> \ No newline at end of file -- GitLab From 7615ec497e7b69c8eefbf8ef1a464eaa22e77bf1 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Wed, 4 Nov 2009 20:30:11 -0500 Subject: [PATCH 149/306] EXT-2216 : Task properties sidepanel EXT-2224 : Edit item then delete item -- edit panel still active EXT-2228 : Buy/Pay/Open buttons for Task sidepanel --HG-- branch : avatar-pipeline --- indra/newview/llfloaterinspect.cpp | 25 - indra/newview/llinventorybridge.cpp | 10310 +++++++++++------------ indra/newview/llsidepanelinventory.cpp | 2 + indra/newview/llsidepaneliteminfo.cpp | 10 +- indra/newview/llsidepaneltaskinfo.cpp | 204 +- indra/newview/llsidepaneltaskinfo.h | 44 +- indra/newview/llviewermenu.cpp | 19 +- indra/newview/llviewermenu.h | 1 + 8 files changed, 5294 insertions(+), 5321 deletions(-) diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp index e26937e93ff..13ca7638c52 100644 --- a/indra/newview/llfloaterinspect.cpp +++ b/indra/newview/llfloaterinspect.cpp @@ -88,32 +88,7 @@ LLFloaterInspect::~LLFloaterInspect(void) } //sInstance = NULL; } -/* -BOOL LLFloaterInspect::isVisible() -{ - return (!!sInstance); -}*/ -/* -void LLFloaterInspect::show(void* ignored) -{ - // setForceSelection ensures that the pie menu does not deselect things when it - // looses the focus (this can happen with "select own objects only" enabled - // VWR-1471 - BOOL forcesel = LLSelectMgr::getInstance()->setForceSelection(TRUE); - - if (!sInstance) // first use - { - sInstance = new LLFloaterInspect; - } - sInstance->openFloater(); - LLToolMgr::getInstance()->setTransientTool(LLToolCompInspect::getInstance()); - LLSelectMgr::getInstance()->setForceSelection(forcesel); // restore previouis value - - sInstance->mObjectSelection = LLSelectMgr::getInstance()->getSelection(); - sInstance->refresh(); -} -*/ void LLFloaterInspect::onOpen(const LLSD& key) { BOOL forcesel = LLSelectMgr::getInstance()->setForceSelection(TRUE); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index b9775cf0e9c..f46bbbe1884 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1,5155 +1,5155 @@ -/** - * @file llinventorybridge.cpp - * @brief Implementation of the Inventory-Folder-View-Bridge classes. - * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include <utility> // for std::pair<> - -#include "llfloaterinventory.h" -#include "llinventorybridge.h" - -#include "message.h" - -#include "llagent.h" -#include "llagentwearables.h" -#include "llcallingcard.h" -#include "llcheckboxctrl.h" // for radio buttons -#include "llfloaterreg.h" -#include "llradiogroup.h" -#include "llspinctrl.h" -#include "lltextbox.h" -#include "llui.h" - -#include "llviewercontrol.h" -#include "llfirstuse.h" -#include "llfoldertype.h" -#include "llfloaterchat.h" -#include "llfloatercustomize.h" -#include "llfloaterproperties.h" -#include "llfloaterworldmap.h" -#include "llfocusmgr.h" -#include "llfolderview.h" -#include "llfriendcard.h" -#include "llavataractions.h" -#include "llgesturemgr.h" -#include "lliconctrl.h" -#include "llinventoryfunctions.h" -#include "llinventorymodel.h" -#include "llinventorypanel.h" -#include "llinventoryclipboard.h" -#include "lllineeditor.h" -#include "llmenugl.h" -#include "llpreviewanim.h" -#include "llpreviewgesture.h" -#include "llpreviewnotecard.h" -#include "llpreviewscript.h" -#include "llpreviewsound.h" -#include "llpreviewtexture.h" -#include "llresmgr.h" -#include "llscrollcontainer.h" -#include "llimview.h" -#include "lltooldraganddrop.h" -#include "llviewertexturelist.h" -#include "llviewerinventory.h" -#include "llviewerobjectlist.h" -#include "llviewerwindow.h" -#include "llvoavatar.h" -#include "llwearable.h" -#include "llwearablelist.h" -#include "llviewermessage.h" -#include "llviewerregion.h" -#include "llvoavatarself.h" -#include "lltabcontainer.h" -#include "lluictrlfactory.h" -#include "llselectmgr.h" -#include "llsidetray.h" -#include "llfloateropenobject.h" -#include "lltrans.h" -#include "llappearancemgr.h" - -using namespace LLOldEvents; - -// Helpers -// bug in busy count inc/dec right now, logic is complex... do we really need it? -void inc_busy_count() -{ -// gViewerWindow->getWindow()->incBusyCount(); -// check balance of these calls if this code is changed to ever actually -// *do* something! -} -void dec_busy_count() -{ -// gViewerWindow->getWindow()->decBusyCount(); -// check balance of these calls if this code is changed to ever actually -// *do* something! -} - -// Function declarations -void wear_add_inventory_item_on_avatar(LLInventoryItem* item); -void remove_inventory_category_from_avatar(LLInventoryCategory* category); -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id); -bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*); -bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response); - -std::string ICON_NAME[ICON_NAME_COUNT] = -{ - "Inv_Texture", - "Inv_Sound", - "Inv_CallingCard", - "Inv_CallingCard", - "Inv_Landmark", - "Inv_Landmark", - "Inv_Script", - "Inv_Clothing", - "Inv_Object", - "Inv_Object", - "Inv_Notecard", - "Inv_Skin", - "Inv_Snapshot", - - "Inv_BodyShape", - "Inv_Skin", - "Inv_Hair", - "Inv_Eye", - "Inv_Shirt", - "Inv_Pants", - "Inv_Shoe", - "Inv_Socks", - "Inv_Jacket", - "Inv_Gloves", - "Inv_Undershirt", - "Inv_Underpants", - "Inv_Skirt", - "Inv_Alpha", - "Inv_Tattoo", - - "Inv_Animation", - "Inv_Gesture", - - "inv_item_linkitem.tga", - "inv_item_linkfolder.tga" -}; - - -// +=================================================+ -// | LLInventoryPanelObserver | -// +=================================================+ -void LLInventoryPanelObserver::changed(U32 mask) -{ - mIP->modelChanged(mask); -} - - -// +=================================================+ -// | LLInvFVBridge | -// +=================================================+ - -LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : -mUUID(uuid), mInvType(LLInventoryType::IT_NONE) -{ - mInventoryPanel = inventory->getHandle(); -} - -const std::string& LLInvFVBridge::getName() const -{ - LLInventoryObject* obj = getInventoryObject(); - if(obj) - { - return obj->getName(); - } - return LLStringUtil::null; -} - -const std::string& LLInvFVBridge::getDisplayName() const -{ - return getName(); -} - -// Folders have full perms -PermissionMask LLInvFVBridge::getPermissionMask() const -{ - - return PERM_ALL; -} - -// virtual -LLAssetType::EType LLInvFVBridge::getPreferredType() const -{ - return LLAssetType::AT_NONE; -} - - -// Folders don't have creation dates. -time_t LLInvFVBridge::getCreationDate() const -{ - return 0; -} - -// Can be destoryed (or moved to trash) -BOOL LLInvFVBridge::isItemRemovable() -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - if(model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) - { - return TRUE; - } - return FALSE; -} - -// Sends an update to all link items that point to the base item. -void LLInvFVBridge::renameLinkedItems(const LLUUID &item_id, const std::string& new_name) -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - - LLInventoryItem* itemp = model->getItem(mUUID); - if (!itemp) return; - - if (itemp->getIsLinkType()) - { - return; - } - - LLInventoryModel::item_array_t item_array = model->collectLinkedItems(item_id); - for (LLInventoryModel::item_array_t::iterator iter = item_array.begin(); - iter != item_array.end(); - iter++) - { - LLViewerInventoryItem *linked_item = (*iter); - if (linked_item->getUUID() == item_id) continue; - - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(linked_item); - new_item->rename(new_name); - new_item->updateServer(FALSE); - model->updateItem(new_item); - // model->addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID()); - } - model->notifyObservers(); -} - -// Can be moved to another folder -BOOL LLInvFVBridge::isItemMovable() const -{ - return TRUE; -} - -/*virtual*/ -/** - * @brief Adds this item into clipboard storage - */ -void LLInvFVBridge::cutToClipboard() -{ - if(isItemMovable()) - { - LLInventoryClipboard::instance().cut(mUUID); - } -} -// *TODO: make sure this does the right thing -void LLInvFVBridge::showProperties() -{ - LLSD key; - key["id"] = mUUID; - LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); - - // LLFloaterReg::showInstance("properties", mUUID); -} - -void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) -{ - // Deactivate gestures when moving them into Trash - LLInvFVBridge* bridge; - LLInventoryModel* model = getInventoryModel(); - LLViewerInventoryItem* item = NULL; - LLViewerInventoryCategory* cat = NULL; - LLInventoryModel::cat_array_t descendent_categories; - LLInventoryModel::item_array_t descendent_items; - S32 count = batch.count(); - S32 i,j; - for(i = 0; i < count; ++i) - { - bridge = (LLInvFVBridge*)(batch.get(i)); - if(!bridge || !bridge->isItemRemovable()) continue; - item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); - if (item) - { - if(LLAssetType::AT_GESTURE == item->getType()) - { - LLGestureManager::instance().deactivateGesture(item->getUUID()); - } - } - } - for(i = 0; i < count; ++i) - { - bridge = (LLInvFVBridge*)(batch.get(i)); - if(!bridge || !bridge->isItemRemovable()) continue; - cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); - if (cat) - { - gInventory.collectDescendents( cat->getUUID(), descendent_categories, descendent_items, FALSE ); - for (j=0; j<descendent_items.count(); j++) - { - if(LLAssetType::AT_GESTURE == descendent_items[j]->getType()) - { - LLGestureManager::instance().deactivateGesture(descendent_items[j]->getUUID()); - } - } - } - } - removeBatchNoCheck(batch); -} - -void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch) -{ - // this method moves a bunch of items and folders to the trash. As - // per design guidelines for the inventory model, the message is - // built and the accounting is performed first. After all of that, - // we call LLInventoryModel::moveObject() to move everything - // around. - LLInvFVBridge* bridge; - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLMessageSystem* msg = gMessageSystem; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - LLViewerInventoryItem* item = NULL; - LLViewerInventoryCategory* cat = NULL; - std::vector<LLUUID> move_ids; - LLInventoryModel::update_map_t update; - bool start_new_message = true; - S32 count = batch.count(); - S32 i; - for(i = 0; i < count; ++i) - { - bridge = (LLInvFVBridge*)(batch.get(i)); - if(!bridge || !bridge->isItemRemovable()) continue; - item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); - if(item) - { - if(item->getParentUUID() == trash_id) continue; - move_ids.push_back(item->getUUID()); - LLPreview::hide(item->getUUID()); - --update[item->getParentUUID()]; - ++update[trash_id]; - if(start_new_message) - { - start_new_message = false; - msg->newMessageFast(_PREHASH_MoveInventoryItem); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addBOOLFast(_PREHASH_Stamp, TRUE); - } - msg->nextBlockFast(_PREHASH_InventoryData); - msg->addUUIDFast(_PREHASH_ItemID, item->getUUID()); - msg->addUUIDFast(_PREHASH_FolderID, trash_id); - msg->addString("NewName", NULL); - if(msg->isSendFullFast(_PREHASH_InventoryData)) - { - start_new_message = true; - gAgent.sendReliableMessage(); - gInventory.accountForUpdate(update); - update.clear(); - } - } - } - if(!start_new_message) - { - start_new_message = true; - gAgent.sendReliableMessage(); - gInventory.accountForUpdate(update); - update.clear(); - } - for(i = 0; i < count; ++i) - { - bridge = (LLInvFVBridge*)(batch.get(i)); - if(!bridge || !bridge->isItemRemovable()) continue; - cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); - if(cat) - { - if(cat->getParentUUID() == trash_id) continue; - move_ids.push_back(cat->getUUID()); - --update[cat->getParentUUID()]; - ++update[trash_id]; - if(start_new_message) - { - start_new_message = false; - msg->newMessageFast(_PREHASH_MoveInventoryFolder); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addBOOL("Stamp", TRUE); - } - msg->nextBlockFast(_PREHASH_InventoryData); - msg->addUUIDFast(_PREHASH_FolderID, cat->getUUID()); - msg->addUUIDFast(_PREHASH_ParentID, trash_id); - if(msg->isSendFullFast(_PREHASH_InventoryData)) - { - start_new_message = true; - gAgent.sendReliableMessage(); - gInventory.accountForUpdate(update); - update.clear(); - } - } - } - if(!start_new_message) - { - gAgent.sendReliableMessage(); - gInventory.accountForUpdate(update); - } - - // move everything. - std::vector<LLUUID>::iterator it = move_ids.begin(); - std::vector<LLUUID>::iterator end = move_ids.end(); - for(; it != end; ++it) - { - gInventory.moveObject((*it), trash_id); - } - - // notify inventory observers. - model->notifyObservers(); -} - -BOOL LLInvFVBridge::isClipboardPasteable() const -{ - if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) - { - return FALSE; - } - LLInventoryModel* model = getInventoryModel(); - if (!model) - { - return FALSE; - } - - const LLUUID &agent_id = gAgent.getID(); - - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - for(S32 i = 0; i < count; i++) - { - const LLUUID &item_id = objects.get(i); - - // Can't paste folders - const LLInventoryCategory *cat = model->getCategory(item_id); - if (cat) - { - return FALSE; - } - - const LLInventoryItem *item = model->getItem(item_id); - if (item) - { - if (!item->getPermissions().allowCopyBy(agent_id)) - { - return FALSE; - } - } - } - return TRUE; -} - -BOOL LLInvFVBridge::isClipboardPasteableAsLink() const -{ - if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) - { - return FALSE; - } - const LLInventoryModel* model = getInventoryModel(); - if (!model) - { - return FALSE; - } - - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - for(S32 i = 0; i < count; i++) - { - const LLInventoryItem *item = model->getItem(objects.get(i)); - if (item) - { - if (!LLAssetType::lookupCanLink(item->getActualType())) - { - return FALSE; - } - } - const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i)); - if (cat && !LLAssetType::lookupCanLink(cat->getPreferredType())) - { - return FALSE; - } - } - return TRUE; -} - -void hide_context_entries(LLMenuGL& menu, - const std::vector<std::string> &entries_to_show, - const std::vector<std::string> &disabled_entries) -{ - const LLView::child_list_t *list = menu.getChildList(); - - LLView::child_list_t::const_iterator itor; - for (itor = list->begin(); itor != list->end(); ++itor) - { - std::string name = (*itor)->getName(); - - // descend into split menus: - LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(*itor); - if ((name == "More") && branchp) - { - hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries); - } - - - bool found = false; - std::vector<std::string>::const_iterator itor2; - for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2) - { - if (*itor2 == name) - { - found = true; - } - } - if (!found) - { - (*itor)->setVisible(FALSE); - } - else - { - for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2) - { - if (*itor2 == name) - { - (*itor)->setEnabled(FALSE); - } - } - } - } -} - -// Helper for commonly-used entries -void LLInvFVBridge::getClipboardEntries(bool show_asset_id, - std::vector<std::string> &items, - std::vector<std::string> &disabled_items, U32 flags) -{ - items.push_back(std::string("Rename")); - if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Rename")); - } - - if (show_asset_id) - { - items.push_back(std::string("Copy Asset UUID")); - if ( (! ( isItemPermissive() || gAgent.isGodlike() ) ) - || (flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Copy Asset UUID")); - } - } - - items.push_back(std::string("Copy Separator")); - - items.push_back(std::string("Copy")); - if (!isItemCopyable()) - { - disabled_items.push_back(std::string("Copy")); - } - - items.push_back(std::string("Paste")); - if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Paste")); - } - - items.push_back(std::string("Paste As Link")); - if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Paste As Link")); - } - items.push_back(std::string("Paste Separator")); - - items.push_back(std::string("Delete")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Delete")); - } - - // If multiple items are selected, disable properties (if it exists). - if ((flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Properties")); - } -} - -void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("PurgeItem")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("PurgeItem")); - } - items.push_back(std::string("RestoreItem")); - } - else - { - items.push_back(std::string("Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - hide_context_entries(menu, items, disabled_items); -} - -// *TODO: remove this -BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const -{ - BOOL rv = FALSE; - - const LLInventoryObject* obj = getInventoryObject(); - - if(obj) - { - *type = LLAssetType::lookupDragAndDropType(obj->getActualType()); - if(*type == DAD_NONE) - { - return FALSE; - } - - *id = obj->getUUID(); - //object_ids.put(obj->getUUID()); - - if (*type == DAD_CATEGORY) - { - gInventory.startBackgroundFetch(obj->getUUID()); - } - - rv = TRUE; - } - - return rv; -} - -LLInventoryObject* LLInvFVBridge::getInventoryObject() const -{ - LLInventoryObject* obj = NULL; - LLInventoryModel* model = getInventoryModel(); - if(model) - { - obj = (LLInventoryObject*)model->getObject(mUUID); - } - return obj; -} - -LLInventoryModel* LLInvFVBridge::getInventoryModel() const -{ - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - return panel ? panel->getModel() : NULL; -} - -BOOL LLInvFVBridge::isInTrash() const -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - return model->isObjectDescendentOf(mUUID, trash_id); -} - -BOOL LLInvFVBridge::isLinkedObjectInTrash() const -{ - if (isInTrash()) return TRUE; - - const LLInventoryObject *obj = getInventoryObject(); - if (obj && obj->getIsLinkType()) - { - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id); - } - return FALSE; -} - -BOOL LLInvFVBridge::isAgentInventory() const -{ - const LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - if(gInventory.getRootFolderID() == mUUID) return TRUE; - return model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); -} - -BOOL LLInvFVBridge::isCOFFolder() const -{ - const LLInventoryModel* model = getInventoryModel(); - if(!model) return TRUE; - const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); - if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id)) - { - return TRUE; - } - return FALSE; -} - -BOOL LLInvFVBridge::isItemPermissive() const -{ - return FALSE; -} - -// static -void LLInvFVBridge::changeItemParent(LLInventoryModel* model, - LLViewerInventoryItem* item, - const LLUUID& new_parent, - BOOL restamp) -{ - if(item->getParentUUID() != new_parent) - { - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->setParent(new_parent); - new_item->updateParentOnServer(restamp); - model->updateItem(new_item); - model->notifyObservers(); - } -} - -// static -void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model, - LLViewerInventoryCategory* cat, - const LLUUID& new_parent, - BOOL restamp) -{ - if(cat->getParentUUID() != new_parent) - { - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - - LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); - new_cat->setParent(new_parent); - new_cat->updateParentOnServer(restamp); - model->updateCategory(new_cat); - model->notifyObservers(); - } -} - - -const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type) -{ - const std::string rv= LLInventoryType::lookup(inv_type); - if(rv.empty()) - { - return std::string("<invalid>"); - } - return rv; -} - -LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, - LLAssetType::EType actual_asset_type, - LLInventoryType::EType inv_type, - LLInventoryPanel* inventory, - const LLUUID& uuid, - U32 flags) -{ - LLInvFVBridge* new_listener = NULL; - switch(asset_type) - { - case LLAssetType::AT_TEXTURE: - if(!(inv_type == LLInventoryType::IT_TEXTURE || inv_type == LLInventoryType::IT_SNAPSHOT)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLTextureBridge(inventory, uuid, inv_type); - break; - - case LLAssetType::AT_SOUND: - if(!(inv_type == LLInventoryType::IT_SOUND)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLSoundBridge(inventory, uuid); - break; - - case LLAssetType::AT_LANDMARK: - if(!(inv_type == LLInventoryType::IT_LANDMARK)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLLandmarkBridge(inventory, uuid, flags); - break; - - case LLAssetType::AT_CALLINGCARD: - if(!(inv_type == LLInventoryType::IT_CALLINGCARD)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLCallingCardBridge(inventory, uuid); - break; - - case LLAssetType::AT_SCRIPT: - if(!(inv_type == LLInventoryType::IT_LSL)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLScriptBridge(inventory, uuid); - break; - - case LLAssetType::AT_OBJECT: - if(!(inv_type == LLInventoryType::IT_OBJECT || inv_type == LLInventoryType::IT_ATTACHMENT)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLObjectBridge(inventory, uuid, inv_type, flags); - break; - - case LLAssetType::AT_NOTECARD: - if(!(inv_type == LLInventoryType::IT_NOTECARD)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLNotecardBridge(inventory, uuid); - break; - - case LLAssetType::AT_ANIMATION: - if(!(inv_type == LLInventoryType::IT_ANIMATION)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLAnimationBridge(inventory, uuid); - break; - - case LLAssetType::AT_GESTURE: - if(!(inv_type == LLInventoryType::IT_GESTURE)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLGestureBridge(inventory, uuid); - break; - - case LLAssetType::AT_LSL_TEXT: - if(!(inv_type == LLInventoryType::IT_LSL)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLLSLTextBridge(inventory, uuid); - break; - - case LLAssetType::AT_CLOTHING: - case LLAssetType::AT_BODYPART: - if(!(inv_type == LLInventoryType::IT_WEARABLE)) - { - llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; - } - new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags); - break; - case LLAssetType::AT_CATEGORY: - case LLAssetType::AT_ROOT_CATEGORY: - if (actual_asset_type == LLAssetType::AT_LINK_FOLDER) - { - // Create a link folder handler instead. - new_listener = new LLLinkFolderBridge(inventory, uuid); - break; - } - new_listener = new LLFolderBridge(inventory, uuid); - break; - case LLAssetType::AT_LINK: - // Only should happen for broken links. - new_listener = new LLLinkItemBridge(inventory, uuid); - break; - case LLAssetType::AT_LINK_FOLDER: - // Only should happen for broken links. - new_listener = new LLLinkItemBridge(inventory, uuid); - break; - default: - llinfos << "Unhandled asset type (llassetstorage.h): " - << (S32)asset_type << llendl; - break; - } - - if (new_listener) - { - new_listener->mInvType = inv_type; - } - - return new_listener; -} - -void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid) -{ - LLInventoryCategory* cat = model->getCategory(uuid); - if (cat) - { - model->purgeDescendentsOf(uuid); - model->notifyObservers(); - } - LLInventoryObject* obj = model->getObject(uuid); - if (obj) - { - model->purgeObject(uuid); - model->notifyObservers(); - } -} - -// +=================================================+ -// | InventoryFVBridgeBuilder | -// +=================================================+ -LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset_type, - LLAssetType::EType actual_asset_type, - LLInventoryType::EType inv_type, - LLInventoryPanel* inventory, - const LLUUID& uuid, - U32 flags /* = 0x00 */) const -{ - return LLInvFVBridge::createBridge(asset_type, - actual_asset_type, - inv_type, - inventory, - uuid, - flags); -} - -// +=================================================+ -// | LLItemBridge | -// +=================================================+ - -void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("goto" == action) - { - gotoItem(folder); - } - if ("open" == action) - { - openItem(); - return; - } - else if ("properties" == action) - { - showProperties(); - return; - } - else if ("purge" == action) - { - purgeItem(model, mUUID); - return; - } - else if ("restoreToWorld" == action) - { - restoreToWorld(); - return; - } - else if ("restore" == action) - { - restoreItem(); - return; - } - else if ("copy_uuid" == action) - { - // Single item only - LLInventoryItem* item = model->getItem(mUUID); - if(!item) return; - LLUUID asset_id = item->getAssetUUID(); - std::string buffer; - asset_id.toString(buffer); - - gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer)); - return; - } - else if ("copy" == action) - { - copyToClipboard(); - return; - } - else if ("paste" == action) - { - // Single item only - LLInventoryItem* itemp = model->getItem(mUUID); - if (!itemp) return; - - LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); - if (!folder_view_itemp) return; - - folder_view_itemp->getListener()->pasteFromClipboard(); - return; - } - else if ("paste_link" == action) - { - // Single item only - LLInventoryItem* itemp = model->getItem(mUUID); - if (!itemp) return; - - LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); - if (!folder_view_itemp) return; - - folder_view_itemp->getListener()->pasteLinkFromClipboard(); - return; - } -} - -void LLItemBridge::selectItem() -{ - LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); - if(item && !item->isComplete()) - { - item->fetchFromServer(); - } -} - -void LLItemBridge::restoreItem() -{ - LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); - if(item) - { - LLInventoryModel* model = getInventoryModel(); - const LLUUID new_parent = model->findCategoryUUIDForType(item->getType()); - // do not restamp on restore. - LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE); - } -} - -void LLItemBridge::restoreToWorld() -{ - LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem(); - if (itemp) - { - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("RezRestoreToWorld"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - - msg->nextBlockFast(_PREHASH_InventoryData); - itemp->packMessage(msg); - msg->sendReliable(gAgent.getRegion()->getHost()); - } - - //Similar functionality to the drag and drop rez logic - BOOL remove_from_inventory = FALSE; - - //remove local inventory copy, sim will deal with permissions and removing the item - //from the actual inventory if its a no-copy etc - if(!itemp->getPermissions().allowCopyBy(gAgent.getID())) - { - remove_from_inventory = TRUE; - } - - // Check if it's in the trash. (again similar to the normal rez logic) - const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); - if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id)) - { - remove_from_inventory = TRUE; - } - - if(remove_from_inventory) - { - gInventory.deleteObject(itemp->getUUID()); - gInventory.notifyObservers(); - } -} - -void LLItemBridge::gotoItem(LLFolderView *folder) -{ - LLInventoryObject *obj = getInventoryObject(); - if (obj && obj->getIsLinkType()) - { - LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); - if (active_panel) - { - active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO); - } - } -} - -LLUIImagePtr LLItemBridge::getIcon() const -{ - return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]); -} - -PermissionMask LLItemBridge::getPermissionMask() const -{ - LLViewerInventoryItem* item = getItem(); - PermissionMask perm_mask = 0; - if(item) - { - BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); - BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); - BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, - gAgent.getID()); - - if (copy) perm_mask |= PERM_COPY; - if (mod) perm_mask |= PERM_MODIFY; - if (xfer) perm_mask |= PERM_TRANSFER; - - } - return perm_mask; -} - -const std::string& LLItemBridge::getDisplayName() const -{ - if(mDisplayName.empty()) - { - buildDisplayName(getItem(), mDisplayName); - } - return mDisplayName; -} - -void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name) -{ - if(item) - { - name.assign(item->getName()); - } - else - { - name.assign(LLStringUtil::null); - } -} - -LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const -{ - U8 font = LLFontGL::NORMAL; - - if( gAgentWearables.isWearingItem( mUUID ) ) - { - // llinfos << "BOLD" << llendl; - font |= LLFontGL::BOLD; - } - - const LLViewerInventoryItem* item = getItem(); - if (item && item->getIsLinkType()) - { - font |= LLFontGL::ITALIC; - } - return (LLFontGL::StyleFlags)font; -} - -std::string LLItemBridge::getLabelSuffix() const -{ - // String table is loaded before login screen and inventory items are - // loaded after login, so LLTrans should be ready. - static std::string NO_COPY =LLTrans::getString("no_copy"); - static std::string NO_MOD = LLTrans::getString("no_modify"); - static std::string NO_XFER = LLTrans::getString("no_transfer"); - static std::string LINK = LLTrans::getString("link"); - static std::string BROKEN_LINK = LLTrans::getString("broken_link"); - std::string suffix; - LLInventoryItem* item = getItem(); - if(item) - { - // it's a bit confusing to put nocopy/nomod/etc on calling cards. - if(LLAssetType::AT_CALLINGCARD != item->getType() - && item->getPermissions().getOwner() == gAgent.getID()) - { - BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType()); - if (broken_link) return BROKEN_LINK; - - BOOL link = item->getIsLinkType(); - if (link) return LINK; - - BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); - if (!copy) - { - suffix += NO_COPY; - } - BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); - if (!mod) - { - suffix += NO_MOD; - } - BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, - gAgent.getID()); - if (!xfer) - { - suffix += NO_XFER; - } - } - } - return suffix; -} - -time_t LLItemBridge::getCreationDate() const -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - return item->getCreationDate(); - } - return 0; -} - - -BOOL LLItemBridge::isItemRenameable() const -{ - LLViewerInventoryItem* item = getItem(); - if(item) - { - // (For now) Don't allow calling card rename since that may confuse users as to - // what the calling card points to. - if (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD) - { - return FALSE; - } - return (item->getPermissions().allowModifyBy(gAgent.getID())); - } - return FALSE; -} - -BOOL LLItemBridge::renameItem(const std::string& new_name) -{ - if(!isItemRenameable()) - return FALSE; - LLPreview::dirty(mUUID); - LLInventoryModel* model = getInventoryModel(); - if(!model) - return FALSE; - LLViewerInventoryItem* item = getItem(); - if(item && (item->getName() != new_name)) - { - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->rename(new_name); - buildDisplayName(new_item, mDisplayName); - new_item->updateServer(FALSE); - model->updateItem(new_item); - - model->notifyObservers(); - } - // return FALSE because we either notified observers (& therefore - // rebuilt) or we didn't update. - return FALSE; -} - - -BOOL LLItemBridge::removeItem() -{ - if(!isItemRemovable()) - { - return FALSE; - } - // move it to the trash - LLPreview::hide(mUUID, TRUE); - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - LLViewerInventoryItem* item = getItem(); - - // if item is not already in trash - if(item && !model->isObjectDescendentOf(mUUID, trash_id)) - { - // move to trash, and restamp - LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE); - // delete was successful - return TRUE; - } - else - { - // tried to delete already item in trash (should purge?) - return FALSE; - } -} - -BOOL LLItemBridge::isItemCopyable() const -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - // can't copy worn objects. DEV-15183 - LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); - if( !avatarp ) - { - return FALSE; - } - - if(avatarp->isWearingAttachment(mUUID)) - { - return FALSE; - } - - // All items can be copied, not all can be pasted. - // The only time an item can't be copied is if it's a link - // return (item->getPermissions().allowCopyBy(gAgent.getID())); - if (item->getIsLinkType()) - { - return FALSE; - } - return TRUE; - } - return FALSE; -} -BOOL LLItemBridge::copyToClipboard() const -{ - if(isItemCopyable()) - { - LLInventoryClipboard::instance().add(mUUID); - return TRUE; - } - return FALSE; -} - -LLViewerInventoryItem* LLItemBridge::getItem() const -{ - LLViewerInventoryItem* item = NULL; - LLInventoryModel* model = getInventoryModel(); - if(model) - { - item = (LLViewerInventoryItem*)model->getItem(mUUID); - } - return item; -} - -BOOL LLItemBridge::isItemPermissive() const -{ - LLViewerInventoryItem* item = getItem(); - if(item) - { - U32 mask = item->getPermissions().getMaskBase(); - if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) - { - return TRUE; - } - } - return FALSE; -} - -// +=================================================+ -// | LLFolderBridge | -// +=================================================+ - -LLFolderBridge* LLFolderBridge::sSelf=NULL; - -// Can be moved to another folder -BOOL LLFolderBridge::isItemMovable() const -{ - LLInventoryObject* obj = getInventoryObject(); - if(obj) - { - return (!LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)obj)->getPreferredType())); - } - return FALSE; -} - -void LLFolderBridge::selectItem() -{ -} - - -// Can be destroyed (or moved to trash) -BOOL LLFolderBridge::isItemRemovable() -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) - { - return FALSE; - } - - if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) - { - return FALSE; - } - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( !avatar ) - { - return FALSE; - } - - LLInventoryCategory* category = model->getCategory(mUUID); - if( !category ) - { - return FALSE; - } - - if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) - { - return FALSE; - } - - LLInventoryModel::cat_array_t descendent_categories; - LLInventoryModel::item_array_t descendent_items; - gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); - - S32 i; - for( i = 0; i < descendent_categories.count(); i++ ) - { - LLInventoryCategory* category = descendent_categories[i]; - if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) - { - return FALSE; - } - } - - for( i = 0; i < descendent_items.count(); i++ ) - { - LLInventoryItem* item = descendent_items[i]; - if( (item->getType() == LLAssetType::AT_CLOTHING) || - (item->getType() == LLAssetType::AT_BODYPART) ) - { - if(gAgentWearables.isWearingItem(item->getUUID())) - { - return FALSE; - } - } - else - if( item->getType() == LLAssetType::AT_OBJECT ) - { - if(avatar->isWearingAttachment(item->getUUID())) - { - return FALSE; - } - } - } - - return TRUE; -} - -BOOL LLFolderBridge::isUpToDate() const -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); - if( !category ) - { - return FALSE; - } - - return category->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN; -} - -BOOL LLFolderBridge::isItemCopyable() const -{ - return TRUE; -} - -BOOL LLFolderBridge::copyToClipboard() const -{ - if(isItemCopyable()) - { - LLInventoryClipboard::instance().add(mUUID); - return TRUE; - } - return FALSE; -} - -BOOL LLFolderBridge::isClipboardPasteable() const -{ - if ( ! LLInvFVBridge::isClipboardPasteable() ) - return FALSE; - - // Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 - if ( LLFriendCardsManager::instance().isCategoryInFriendFolder( getCategory() ) ) - { - LLInventoryModel* model = getInventoryModel(); - if ( !model ) - { - return FALSE; - } - - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - const LLViewerInventoryCategory *current_cat = getCategory(); - - // Search for the direct descendent of current Friends subfolder among all pasted items, - // and return false if is found. - for(S32 i = objects.count() - 1; i >= 0; --i) - { - const LLUUID &obj_id = objects.get(i); - if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) - { - return FALSE; - } - } - - } - return TRUE; -} - -BOOL LLFolderBridge::isClipboardPasteableAsLink() const -{ - // Check normal paste-as-link permissions - if (!LLInvFVBridge::isClipboardPasteableAsLink()) - { - return FALSE; - } - - const LLInventoryModel* model = getInventoryModel(); - if (!model) - { - return FALSE; - } - - const LLViewerInventoryCategory *current_cat = getCategory(); - if (current_cat) - { - const BOOL is_in_friend_folder = LLFriendCardsManager::instance().isCategoryInFriendFolder( current_cat ); - const LLUUID ¤t_cat_id = current_cat->getUUID(); - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - for(S32 i = 0; i < count; i++) - { - const LLUUID &obj_id = objects.get(i); - const LLInventoryCategory *cat = model->getCategory(obj_id); - if (cat) - { - const LLUUID &cat_id = cat->getUUID(); - // Don't allow recursive pasting - if ((cat_id == current_cat_id) || - model->isObjectDescendentOf(current_cat_id, cat_id)) - { - return FALSE; - } - } - // Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 - if ( is_in_friend_folder ) - { - // If object is direct descendent of current Friends subfolder than return false. - // Note: We can't use 'const LLInventoryCategory *cat', because it may be null - // in case type of obj_id is LLInventoryItem. - if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) - { - return FALSE; - } - } - } - } - return TRUE; - -} - -BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, - BOOL drop) -{ - // This should never happen, but if an inventory item is incorrectly parented, - // the UI will get confused and pass in a NULL. - if(!inv_cat) return FALSE; - - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if(!avatar) return FALSE; - - // cannot drag categories into library - if(!isAgentInventory()) - { - return FALSE; - } - - // check to make sure source is agent inventory, and is represented there. - LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); - BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL) - && (LLToolDragAndDrop::SOURCE_AGENT == source); - - BOOL accept = FALSE; - S32 i; - LLInventoryModel::cat_array_t descendent_categories; - LLInventoryModel::item_array_t descendent_items; - if(is_agent_inventory) - { - const LLUUID& cat_id = inv_cat->getUUID(); - - // Is the destination the trash? - const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - BOOL move_is_into_trash = (mUUID == trash_id) - || model->isObjectDescendentOf(mUUID, trash_id); - BOOL is_movable = (!LLAssetType::lookupIsProtectedCategoryType(inv_cat->getPreferredType())); - LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); - BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); - BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); - if (move_is_into_current_outfit || move_is_into_outfit) - { - // BAP - restrictions? - is_movable = true; - } - - if (mUUID == gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE)) - { - is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604 - } - - if( is_movable ) - { - gInventory.collectDescendents( cat_id, descendent_categories, descendent_items, FALSE ); - - for( i = 0; i < descendent_categories.count(); i++ ) - { - LLInventoryCategory* category = descendent_categories[i]; - if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) - { - // ...can't move "special folders" like Textures - is_movable = FALSE; - break; - } - } - - if( is_movable ) - { - if( move_is_into_trash ) - { - for( i = 0; i < descendent_items.count(); i++ ) - { - LLInventoryItem* item = descendent_items[i]; - if( (item->getType() == LLAssetType::AT_CLOTHING) || - (item->getType() == LLAssetType::AT_BODYPART) ) - { - if( gAgentWearables.isWearingItem( item->getUUID() ) ) - { - is_movable = FALSE; // It's generally movable, but not into the trash! - break; - } - } - else - if( item->getType() == LLAssetType::AT_OBJECT ) - { - if( avatar->isWearingAttachment( item->getUUID() ) ) - { - is_movable = FALSE; // It's generally movable, but not into the trash! - break; - } - } - } - } - } - } - - - accept = is_movable - && (mUUID != cat_id) // Can't move a folder into itself - && (mUUID != inv_cat->getParentUUID()) // Avoid moves that would change nothing - && !(model->isObjectDescendentOf(mUUID, cat_id)); // Avoid circularity - if(accept && drop) - { - // Look for any gestures and deactivate them - if (move_is_into_trash) - { - for (i = 0; i < descendent_items.count(); i++) - { - LLInventoryItem* item = descendent_items[i]; - if (item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(item->getUUID())) - { - LLGestureManager::instance().deactivateGesture(item->getUUID()); - } - } - } - // if target is an outfit or current outfit folder we use link - if (move_is_into_current_outfit || move_is_into_outfit) - { -#if SUPPORT_ENSEMBLES - // BAP - should skip if dup. - if (move_is_into_current_outfit) - { - LLAppearanceManager::wearEnsemble(inv_cat); - } - else - { - LLPointer<LLInventoryCallback> cb = NULL; - link_inventory_item( - gAgent.getID(), - inv_cat->getUUID(), - mUUID, - inv_cat->getName(), - LLAssetType::AT_LINK_FOLDER, - cb); - } -#endif - } - else - { - - // Reparent the folder and restamp children if it's moving - // into trash. - LLInvFVBridge::changeCategoryParent( - model, - (LLViewerInventoryCategory*)inv_cat, - mUUID, - move_is_into_trash); - } - } - } - else if(LLToolDragAndDrop::SOURCE_WORLD == source) - { - // content category has same ID as object itself - LLUUID object_id = inv_cat->getUUID(); - LLUUID category_id = mUUID; - accept = move_inv_category_world_to_agent(object_id, category_id, drop); - } - return accept; -} - -void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv) -{ - const char* dialog = NULL; - if (object->flagScripted()) - { - dialog = "MoveInventoryFromScriptedObject"; - } - else - { - dialog = "MoveInventoryFromObject"; - } - LLNotifications::instance().add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv)); -} - -// Move/copy all inventory items from the Contents folder of an in-world -// object to the agent's inventory, inside a given category. -BOOL move_inv_category_world_to_agent(const LLUUID& object_id, - const LLUUID& category_id, - BOOL drop, - void (*callback)(S32, void*), - void* user_data) -{ - // Make sure the object exists. If we allowed dragging from - // anonymous objects, it would be possible to bypass - // permissions. - // content category has same ID as object itself - LLViewerObject* object = gObjectList.findObject(object_id); - if(!object) - { - llinfos << "Object not found for drop." << llendl; - return FALSE; - } - - // this folder is coming from an object, as there is only one folder in an object, the root, - // we need to collect the entire contents and handle them as a group - InventoryObjectList inventory_objects; - object->getInventoryContents(inventory_objects); - - if (inventory_objects.empty()) - { - llinfos << "Object contents not found for drop." << llendl; - return FALSE; - } - - BOOL accept = TRUE; - BOOL is_move = FALSE; - - // coming from a task. Need to figure out if the person can - // move/copy this item. - InventoryObjectList::iterator it = inventory_objects.begin(); - InventoryObjectList::iterator end = inventory_objects.end(); - for ( ; it != end; ++it) - { - // coming from a task. Need to figure out if the person can - // move/copy this item. - LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions()); - if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) - && perm.allowTransferTo(gAgent.getID()))) -// || gAgent.isGodlike()) - { - accept = TRUE; - } - else if(object->permYouOwner()) - { - // If the object cannot be copied, but the object the - // inventory is owned by the agent, then the item can be - // moved from the task to agent inventory. - is_move = TRUE; - accept = TRUE; - } - else - { - accept = FALSE; - break; - } - } - - if(drop && accept) - { - it = inventory_objects.begin(); - InventoryObjectList::iterator first_it = inventory_objects.begin(); - LLMoveInv* move_inv = new LLMoveInv; - move_inv->mObjectID = object_id; - move_inv->mCategoryID = category_id; - move_inv->mCallback = callback; - move_inv->mUserData = user_data; - - for ( ; it != end; ++it) - { - two_uuids_t two(category_id, (*it)->getUUID()); - move_inv->mMoveList.push_back(two); - } - - if(is_move) - { - // Callback called from within here. - warn_move_inventory(object, move_inv); - } - else - { - LLNotification::Params params("MoveInventoryFromObject"); - params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); - LLNotifications::instance().forceResponse(params, 0); - } - } - return accept; -} - -bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat, - LLInventoryItem* item) -{ - // Valid COF items are: - // - links to wearables (body parts or clothing) - // - links to attachments - // - links to gestures - // - links to ensemble folders - LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem(); // BAP - safe? - if (linked_item) - { - LLAssetType::EType type = linked_item->getType(); - return (type == LLAssetType::AT_CLOTHING || - type == LLAssetType::AT_BODYPART || - type == LLAssetType::AT_GESTURE || - type == LLAssetType::AT_OBJECT); - } - else - { - LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe? - // BAP remove AT_NONE support after ensembles are fully working? - return (linked_category && - ((linked_category->getPreferredType() == LLAssetType::AT_NONE) || - (LLAssetType::lookupIsEnsembleCategoryType(linked_category->getPreferredType())))); - } -} - - -bool LLFindWearables::operator()(LLInventoryCategory* cat, - LLInventoryItem* item) -{ - if(item) - { - if((item->getType() == LLAssetType::AT_CLOTHING) - || (item->getType() == LLAssetType::AT_BODYPART)) - { - return TRUE; - } - } - return FALSE; -} - - - -//Used by LLFolderBridge as callback for directory recursion. -class LLRightClickInventoryFetchObserver : public LLInventoryFetchObserver -{ -public: - LLRightClickInventoryFetchObserver() : - mCopyItems(false) - { }; - LLRightClickInventoryFetchObserver(const LLUUID& cat_id, bool copy_items) : - mCatID(cat_id), - mCopyItems(copy_items) - { }; - virtual void done() - { - // we've downloaded all the items, so repaint the dialog - LLFolderBridge::staticFolderOptionsMenu(); - - gInventory.removeObserver(this); - delete this; - } - - -protected: - LLUUID mCatID; - bool mCopyItems; - -}; - -//Used by LLFolderBridge as callback for directory recursion. -class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver -{ -public: - LLRightClickInventoryFetchDescendentsObserver(bool copy_items) : mCopyItems(copy_items) {} - ~LLRightClickInventoryFetchDescendentsObserver() {} - virtual void done(); -protected: - bool mCopyItems; -}; - -void LLRightClickInventoryFetchDescendentsObserver::done() -{ - // Avoid passing a NULL-ref as mCompleteFolders.front() down to - // gInventory.collectDescendents() - if( mCompleteFolders.empty() ) - { - llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl; - dec_busy_count(); - gInventory.removeObserver(this); - delete this; - return; - } - - // What we do here is get the complete information on the items in - // the library, and set up an observer that will wait for that to - // happen. - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - gInventory.collectDescendents(mCompleteFolders.front(), - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH); - S32 count = item_array.count(); -#if 0 // HACK/TODO: Why? - // This early causes a giant menu to get produced, and doesn't seem to be needed. - if(!count) - { - llwarns << "Nothing fetched in category " << mCompleteFolders.front() - << llendl; - dec_busy_count(); - gInventory.removeObserver(this); - delete this; - return; - } -#endif - - LLRightClickInventoryFetchObserver* outfit; - outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems); - LLInventoryFetchObserver::item_ref_t ids; - for(S32 i = 0; i < count; ++i) - { - ids.push_back(item_array.get(i)->getUUID()); - } - - // clean up, and remove this as an observer since the call to the - // outfit could notify observers and throw us into an infinite - // loop. - dec_busy_count(); - gInventory.removeObserver(this); - delete this; - - // increment busy count and either tell the inventory to check & - // call done, or add this object to the inventory for observation. - inc_busy_count(); - - // do the fetch - outfit->fetchItems(ids); - outfit->done(); //Not interested in waiting and this will be right 99% of the time. -//Uncomment the following code for laggy Inventory UI. -/* if(outfit->isEverythingComplete()) - { - // everything is already here - call done. - outfit->done(); - } - else - { - // it's all on it's way - add an observer, and the inventory - // will call done for us when everything is here. - gInventory.addObserver(outfit); - }*/ -} - - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryWearObserver -// -// Observer for "copy and wear" operation to support knowing -// when the all of the contents have been added to inventory. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLInventoryCopyAndWearObserver : public LLInventoryObserver -{ -public: - LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {} - virtual ~LLInventoryCopyAndWearObserver() {} - virtual void changed(U32 mask); - -protected: - LLUUID mCatID; - int mContentsCount; - BOOL mFolderAdded; -}; - - - -void LLInventoryCopyAndWearObserver::changed(U32 mask) -{ - if((mask & (LLInventoryObserver::ADD)) != 0) - { - if (!mFolderAdded) - { - const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); - - std::set<LLUUID>::const_iterator id_it = changed_items.begin(); - std::set<LLUUID>::const_iterator id_end = changed_items.end(); - for (;id_it != id_end; ++id_it) - { - if ((*id_it) == mCatID) - { - mFolderAdded = TRUE; - break; - } - } - } - - if (mFolderAdded) - { - LLViewerInventoryCategory* category = gInventory.getCategory(mCatID); - - if (NULL == category) - { - llwarns << "gInventory.getCategory(" << mCatID - << ") was NULL" << llendl; - } - else - { - if (category->getDescendentCount() == - mContentsCount) - { - gInventory.removeObserver(this); - LLAppearanceManager::wearInventoryCategory(category, FALSE, TRUE); - delete this; - } - } - } - - } -} - - - -void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("open" == action) - { - openItem(); - return; - } - else if ("paste" == action) - { - pasteFromClipboard(); - return; - } - else if ("paste_link" == action) - { - pasteLinkFromClipboard(); - return; - } - else if ("properties" == action) - { - showProperties(); - return; - } - else if ("replaceoutfit" == action) - { - modifyOutfit(FALSE); - return; - } -#if SUPPORT_ENSEMBLES - else if ("wearasensemble" == action) - { - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLViewerInventoryCategory* cat = getCategory(); - if(!cat) return; - LLAppearanceManager::wearEnsemble(cat,true); - return; - } -#endif - else if ("addtooutfit" == action) - { - modifyOutfit(TRUE); - return; - } - else if ("copy" == action) - { - copyToClipboard(); - return; - } - else if ("removefromoutfit" == action) - { - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLViewerInventoryCategory* cat = getCategory(); - if(!cat) return; - - remove_inventory_category_from_avatar ( cat ); - return; - } - else if ("purge" == action) - { - purgeItem(model, mUUID); - return; - } - else if ("restore" == action) - { - restoreItem(); - return; - } -} - -void LLFolderBridge::openItem() -{ - lldebugs << "LLFolderBridge::openItem()" << llendl; - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - bool fetching_inventory = model->fetchDescendentsOf(mUUID); - // Only change folder type if we have the folder contents. - if (!fetching_inventory) - { - // Disabling this for now, it's causing crash when new items are added to folders - // since folder type may change before new item item has finished processing. - // determineFolderType(); - } -} - -void LLFolderBridge::closeItem() -{ - determineFolderType(); -} - -void LLFolderBridge::determineFolderType() -{ - if (isUpToDate()) - { - LLInventoryModel* model = getInventoryModel(); - LLViewerInventoryCategory* category = model->getCategory(mUUID); - category->determineFolderType(); - } -} - -BOOL LLFolderBridge::isItemRenameable() const -{ - LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory(); - if(cat && !LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType()) - && (cat->getOwnerID() == gAgent.getID())) - { - return TRUE; - } - return FALSE; -} - -void LLFolderBridge::restoreItem() -{ - LLViewerInventoryCategory* cat; - cat = (LLViewerInventoryCategory*)getCategory(); - if(cat) - { - LLInventoryModel* model = getInventoryModel(); - LLUUID new_parent = model->findCategoryUUIDForType(cat->getType()); - // do not restamp children on restore - LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE); - } -} - -LLAssetType::EType LLFolderBridge::getPreferredType() const -{ - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; - LLViewerInventoryCategory* cat = getCategory(); - if(cat) - { - preferred_type = cat->getPreferredType(); - } - - return preferred_type; -} - -// Icons for folders are based on the preferred type -LLUIImagePtr LLFolderBridge::getIcon() const -{ - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; - LLViewerInventoryCategory* cat = getCategory(); - if(cat) - { - preferred_type = cat->getPreferredType(); - } - return getIcon(preferred_type); -} - -LLUIImagePtr LLFolderBridge::getIcon(LLAssetType::EType preferred_type) -{ - // we only have one folder image now - return LLUI::getUIImage("Inv_FolderClosed"); -} - -BOOL LLFolderBridge::renameItem(const std::string& new_name) -{ - if(!isItemRenameable()) - return FALSE; - LLInventoryModel* model = getInventoryModel(); - if(!model) - return FALSE; - LLViewerInventoryCategory* cat = getCategory(); - if(cat && (cat->getName() != new_name)) - { - LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); - new_cat->rename(new_name); - new_cat->updateServer(FALSE); - model->updateCategory(new_cat); - - model->notifyObservers(); - } - // return FALSE because we either notified observers (& therefore - // rebuilt) or we didn't update. - return FALSE; -} - -BOOL LLFolderBridge::removeItem() -{ - if(!isItemRemovable()) - { - return FALSE; - } - // move it to the trash - LLPreview::hide(mUUID); - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - - // Look for any gestures and deactivate them - LLInventoryModel::cat_array_t descendent_categories; - LLInventoryModel::item_array_t descendent_items; - gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); - - S32 i; - for (i = 0; i < descendent_items.count(); i++) - { - LLInventoryItem* item = descendent_items[i]; - if (item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(item->getUUID())) - { - LLGestureManager::instance().deactivateGesture(item->getUUID()); - } - } - - // go ahead and do the normal remove if no 'last calling - // cards' are being removed. - LLViewerInventoryCategory* cat = getCategory(); - if(cat) - { - LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE); - } - - return TRUE; -} - -void LLFolderBridge::pasteFromClipboard() -{ - LLInventoryModel* model = getInventoryModel(); - if(model && isClipboardPasteable()) - { - LLInventoryItem* item = NULL; - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - const LLUUID parent_id(mUUID); - for(S32 i = 0; i < count; i++) - { - item = model->getItem(objects.get(i)); - if (item) - { - if(LLInventoryClipboard::instance().isCutMode()) - { - // move_inventory_item() is not enough, - //we have to update inventory locally too - changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE); - } - else - { - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - parent_id, - std::string(), - LLPointer<LLInventoryCallback>(NULL)); - } - } - } - } -} - -void LLFolderBridge::pasteLinkFromClipboard() -{ - const LLInventoryModel* model = getInventoryModel(); - if(model) - { - LLDynamicArray<LLUUID> objects; - LLInventoryClipboard::instance().retrieve(objects); - S32 count = objects.count(); - LLUUID parent_id(mUUID); - for(S32 i = 0; i < count; i++) - { - const LLUUID &object_id = objects.get(i); -#if SUPPORT_ENSEMBLES - if (LLInventoryCategory *cat = model->getCategory(object_id)) - { - link_inventory_item( - gAgent.getID(), - cat->getUUID(), - parent_id, - cat->getName(), - LLAssetType::AT_LINK_FOLDER, - LLPointer<LLInventoryCallback>(NULL)); - } - else -#endif - if (LLInventoryItem *item = model->getItem(object_id)) - { - link_inventory_item( - gAgent.getID(), - item->getUUID(), - parent_id, - item->getName(), - LLAssetType::AT_LINK, - LLPointer<LLInventoryCallback>(NULL)); - } - } - } -} - -void LLFolderBridge::staticFolderOptionsMenu() -{ - if (!sSelf) return; - sSelf->folderOptionsMenu(); -} - -void LLFolderBridge::folderOptionsMenu() -{ - std::vector<std::string> disabled_items; - - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - - const LLInventoryCategory* category = model->getCategory(mUUID); - LLAssetType::EType type = category->getPreferredType(); - const bool is_default_folder = category && LLAssetType::lookupIsProtectedCategoryType(type); - // BAP change once we're no longer treating regular categories as ensembles. - const bool is_ensemble = category && (type == LLAssetType::AT_NONE || - LLAssetType::lookupIsEnsembleCategoryType(type)); - - // calling card related functionality for folders. - - // Only enable calling-card related options for non-default folders. - if (!is_default_folder) - { - LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); - if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard)) - { - mItems.push_back(std::string("Calling Card Separator")); - mItems.push_back(std::string("Conference Chat Folder")); - mItems.push_back(std::string("IM All Contacts In Folder")); - } - } - - // wearables related functionality for folders. - //is_wearable - LLFindWearables is_wearable; - LLIsType is_object( LLAssetType::AT_OBJECT ); - LLIsType is_gesture( LLAssetType::AT_GESTURE ); - - if (mWearables || - checkFolderForContentsOfType(model, is_wearable) || - checkFolderForContentsOfType(model, is_object) || - checkFolderForContentsOfType(model, is_gesture) ) - { - mItems.push_back(std::string("Folder Wearables Separator")); - - // Only enable add/replace outfit for non-default folders. - if (!is_default_folder) - { - mItems.push_back(std::string("Add To Outfit")); - mItems.push_back(std::string("Replace Outfit")); - } - if (is_ensemble) - { - mItems.push_back(std::string("Wear As Ensemble")); - } - mItems.push_back(std::string("Take Off Items")); - } - hide_context_entries(*mMenu, mItems, disabled_items); -} - -BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& is_type) -{ - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - model->collectDescendentsIf(mUUID, - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_type); - return ((item_array.count() > 0) ? TRUE : FALSE ); -} - -// Flags unused -void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - mItems.clear(); - mDisabledItems.clear(); - - lldebugs << "LLFolderBridge::buildContextMenu()" << llendl; -// std::vector<std::string> disabled_items; - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); - - mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point) - mDisabledItems.clear(); //adding code to clear out disabled members from previous - if (lost_and_found_id == mUUID) - { - // This is the lost+found folder. - mItems.push_back(std::string("Empty Lost And Found")); - } - - if(trash_id == mUUID) - { - // This is the trash. - mItems.push_back(std::string("Empty Trash")); - } - else if(model->isObjectDescendentOf(mUUID, trash_id)) - { - // This is a folder in the trash. - mItems.clear(); // clear any items that used to exist - mItems.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - mDisabledItems.push_back(std::string("Purge Item")); - } - - mItems.push_back(std::string("Restore Item")); - } - else if(isAgentInventory()) // do not allow creating in library - { - LLViewerInventoryCategory *cat = getCategory(); - - // BAP removed protected check to re-enable standard ops in untyped folders. - // Not sure what the right thing is to do here. - if (!isCOFFolder() && cat /*&& - LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/) - { - // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. - if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) - mItems.push_back(std::string("New Folder")); - mItems.push_back(std::string("New Script")); - mItems.push_back(std::string("New Note")); - mItems.push_back(std::string("New Gesture")); - mItems.push_back(std::string("New Clothes")); - mItems.push_back(std::string("New Body Parts")); - mItems.push_back(std::string("Change Type")); - - LLViewerInventoryCategory *cat = getCategory(); - if (cat && LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())) - { - mDisabledItems.push_back(std::string("Change Type")); - } - - getClipboardEntries(false, mItems, mDisabledItems, flags); - } - else - { - // Want some but not all of the items from getClipboardEntries for outfits. - if (cat && cat->getPreferredType()==LLAssetType::AT_OUTFIT) - { - mItems.push_back(std::string("Rename")); - mItems.push_back(std::string("Delete")); - } - } - - //Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06 - mCallingCards = mWearables = FALSE; - - LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); - if (checkFolderForContentsOfType(model, is_callingcard)) - { - mCallingCards=TRUE; - } - - LLFindWearables is_wearable; - LLIsType is_object( LLAssetType::AT_OBJECT ); - LLIsType is_gesture( LLAssetType::AT_GESTURE ); - - if (checkFolderForContentsOfType(model, is_wearable) || - checkFolderForContentsOfType(model, is_object) || - checkFolderForContentsOfType(model, is_gesture) ) - { - mWearables=TRUE; - } - - mMenu = &menu; - sSelf = this; - LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE); - - LLInventoryFetchDescendentsObserver::folder_ref_t folders; - LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); - if (category) - { - folders.push_back(category->getUUID()); - } - fetch->fetchDescendents(folders); - inc_busy_count(); - if(fetch->isEverythingComplete()) - { - // everything is already here - call done. - fetch->done(); - } - else - { - // it's all on it's way - add an observer, and the inventory - // will call done for us when everything is here. - gInventory.addObserver(fetch); - } - } - else - { - mItems.push_back(std::string("--no options--")); - mDisabledItems.push_back(std::string("--no options--")); - } - hide_context_entries(menu, mItems, mDisabledItems); -} - -BOOL LLFolderBridge::hasChildren() const -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - LLInventoryModel::EHasChildren has_children; - has_children = gInventory.categoryHasChildren(mUUID); - return has_children != LLInventoryModel::CHILDREN_NO; -} - -BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data) -{ - //llinfos << "LLFolderBridge::dragOrDrop()" << llendl; - BOOL accept = FALSE; - switch(cargo_type) - { - case DAD_TEXTURE: - case DAD_SOUND: - case DAD_CALLINGCARD: - case DAD_LANDMARK: - case DAD_SCRIPT: - case DAD_OBJECT: - case DAD_NOTECARD: - case DAD_CLOTHING: - case DAD_BODYPART: - case DAD_ANIMATION: - case DAD_GESTURE: - case DAD_LINK: - accept = dragItemIntoFolder((LLInventoryItem*)cargo_data, - drop); - break; - case DAD_CATEGORY: - if (LLFriendCardsManager::instance().isAnyFriendCategory(mUUID)) - { - accept = FALSE; - } - else - { - accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop); - } - break; - default: - break; - } - return accept; -} - -LLViewerInventoryCategory* LLFolderBridge::getCategory() const -{ - LLViewerInventoryCategory* cat = NULL; - LLInventoryModel* model = getInventoryModel(); - if(model) - { - cat = (LLViewerInventoryCategory*)model->getCategory(mUUID); - } - return cat; -} - - -// static -void LLFolderBridge::pasteClipboard(void* user_data) -{ - LLFolderBridge* self = (LLFolderBridge*)user_data; - if(self) self->pasteFromClipboard(); -} - -void LLFolderBridge::createNewCategory(void* user_data) -{ - LLFolderBridge* bridge = (LLFolderBridge*)user_data; - if(!bridge) return; - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get()); - if (!panel) return; - LLInventoryModel* model = panel->getModel(); - if(!model) return; - LLUUID id; - id = model->createNewCategory(bridge->getUUID(), - LLAssetType::AT_NONE, - LLStringUtil::null); - model->notifyObservers(); - - // At this point, the bridge has probably been deleted, but the - // view is still there. - panel->setSelection(id, TAKE_FOCUS_YES); -} - -void LLFolderBridge::createNewShirt(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHIRT); -} - -void LLFolderBridge::createNewPants(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PANTS); -} - -void LLFolderBridge::createNewShoes(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHOES); -} - -void LLFolderBridge::createNewSocks(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SOCKS); -} - -void LLFolderBridge::createNewJacket(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_JACKET); -} - -void LLFolderBridge::createNewSkirt(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIRT); -} - -void LLFolderBridge::createNewGloves(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_GLOVES); -} - -void LLFolderBridge::createNewUndershirt(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERSHIRT); -} - -void LLFolderBridge::createNewUnderpants(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS); -} - -void LLFolderBridge::createNewShape(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE); -} - -void LLFolderBridge::createNewSkin(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIN); -} - -void LLFolderBridge::createNewHair(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_HAIR); -} - -void LLFolderBridge::createNewEyes(void* user_data) -{ - LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES); -} - -// static -void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type) -{ - if(!bridge) return; - LLUUID parent_id = bridge->getUUID(); - createWearable(parent_id, type); -} - -// Separate function so can be called by global menu as well as right-click -// menu. -// static -void LLFolderBridge::createWearable(LLUUID parent_id, EWearableType type) -{ - LLWearable* wearable = LLWearableList::instance().createNewWearable(type); - LLAssetType::EType asset_type = wearable->getAssetType(); - LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE; - create_inventory_item(gAgent.getID(), gAgent.getSessionID(), - parent_id, wearable->getTransactionID(), wearable->getName(), - wearable->getDescription(), asset_type, inv_type, wearable->getType(), - wearable->getPermissions().getMaskNextOwner(), - LLPointer<LLInventoryCallback>(NULL)); -} - -void LLFolderBridge::modifyOutfit(BOOL append) -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return; - LLViewerInventoryCategory* cat = getCategory(); - if(!cat) return; - - // BAP - was: - // wear_inventory_category_on_avatar( cat, append ); - LLAppearanceManager::wearInventoryCategory( cat, FALSE, append ); -} - -// helper stuff -bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv* move_inv) -{ - LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData; - LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID); - S32 option = LLNotification::getSelectedOption(notification, response); - - if(option == 0 && object) - { - if (cat_and_wear && cat_and_wear->mWear) - { - InventoryObjectList inventory_objects; - object->getInventoryContents(inventory_objects); - int contents_count = inventory_objects.size()-1; //subtract one for containing folder - - LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count); - gInventory.addObserver(inventoryObserver); - } - - two_uuids_list_t::iterator move_it; - for (move_it = move_inv->mMoveList.begin(); - move_it != move_inv->mMoveList.end(); - ++move_it) - { - object->moveInventory(move_it->first, move_it->second); - } - - // update the UI. - dialog_refresh_all(); - } - - if (move_inv->mCallback) - { - move_inv->mCallback(option, move_inv->mUserData); - } - - delete move_inv; - return false; -} - -/* -Next functions intended to reorder items in the inventory folder and save order on server -Is now used for Favorites folder. - -*TODO: refactoring is needed with Favorites Bar functionality. Probably should be moved in LLInventoryModel -*/ -void saveItemsOrder(LLInventoryModel::item_array_t& items) -{ - int sortField = 0; - - // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field - for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) - { - LLViewerInventoryItem* item = *i; - - item->setSortField(++sortField); - item->setComplete(TRUE); - item->updateServer(FALSE); - - gInventory.updateItem(item); - } - - gInventory.notifyObservers(); -} - -LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id) -{ - LLInventoryModel::item_array_t::iterator result = items.end(); - - for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) - { - if ((*i)->getUUID() == id) - { - result = i; - break; - } - } - - return result; -} - -void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId) -{ - LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId); - LLViewerInventoryItem* destItem = gInventory.getItem(destItemId); - - items.erase(findItemByUUID(items, srcItem->getUUID())); - items.insert(findItemByUUID(items, destItem->getUUID()), srcItem); -} - -BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, - BOOL drop) -{ - LLInventoryModel* model = getInventoryModel(); - if(!model) return FALSE; - - // cannot drag into library - if(!isAgentInventory()) - { - return FALSE; - } - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if(!avatar) return FALSE; - - LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); - BOOL accept = FALSE; - LLViewerObject* object = NULL; - if(LLToolDragAndDrop::SOURCE_AGENT == source) - { - - BOOL is_movable = TRUE; - switch( inv_item->getActualType() ) - { - case LLAssetType::AT_ROOT_CATEGORY: - is_movable = FALSE; - break; - - case LLAssetType::AT_CATEGORY: - is_movable = !LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)inv_item)->getPreferredType()); - break; - default: - break; - } - - LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); - BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); - LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); - BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); - BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); - - if(is_movable && move_is_into_trash) - { - switch(inv_item->getType()) - { - case LLAssetType::AT_CLOTHING: - case LLAssetType::AT_BODYPART: - is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID()); - break; - - case LLAssetType::AT_OBJECT: - is_movable = !avatar->isWearingAttachment(inv_item->getUUID()); - break; - default: - break; - } - } - - if ( is_movable ) - { - // Don't allow creating duplicates in the Calling Card/Friends - // subfolders, see bug EXT-1599. Check is item direct descendent - // of target folder and forbid item's movement if it so. - // Note: isItemDirectDescendentOfCategory checks if - // passed category is in the Calling Card/Friends folder - is_movable = ! LLFriendCardsManager::instance() - .isObjDirectDescendentOfCategory (inv_item, getCategory()); - } - - LLUUID favorites_id = model->findCategoryUUIDForType(LLAssetType::AT_FAVORITE); - - // we can move item inside a folder only if this folder is Favorites. See EXT-719 - accept = is_movable && ((mUUID != inv_item->getParentUUID()) || (mUUID == favorites_id)); - if(accept && drop) - { - if (inv_item->getType() == LLAssetType::AT_GESTURE - && LLGestureManager::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash) - { - LLGestureManager::instance().deactivateGesture(inv_item->getUUID()); - } - // If an item is being dragged between windows, unselect - // everything in the active window so that we don't follow - // the selection to its new location (which is very - // annoying). - if (LLFloaterInventory::getActiveInventory()) - { - LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - if (active_panel && (panel != active_panel)) - { - active_panel->unSelectAll(); - } - } - - // if dragging from/into favorites folder only reorder items - if ((mUUID == inv_item->getParentUUID()) && (favorites_id == mUUID)) - { - LLInventoryModel::cat_array_t cats; - LLInventoryModel::item_array_t items; - LLIsType is_type(LLAssetType::AT_LANDMARK); - model->collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); - - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; - if (itemp) - { - LLUUID srcItemId = inv_item->getUUID(); - LLUUID destItemId = itemp->getListener()->getUUID(); - - // update order - updateItemsOrder(items, srcItemId, destItemId); - - saveItemsOrder(items); - } - } - else if (favorites_id == mUUID) // if target is the favorites folder we use copy - { - copy_inventory_item( - gAgent.getID(), - inv_item->getPermissions().getOwner(), - inv_item->getUUID(), - mUUID, - std::string(), - LLPointer<LLInventoryCallback>(NULL)); - } - else if (move_is_into_current_outfit || move_is_into_outfit) - { - // BAP - should skip if dup. - if (move_is_into_current_outfit) - { - LLAppearanceManager::wearItem(inv_item); - } - else - { - LLPointer<LLInventoryCallback> cb = NULL; - link_inventory_item( - gAgent.getID(), - inv_item->getUUID(), - mUUID, - std::string(), - LLAssetType::AT_LINK, - cb); - } - } - else - { - // restamp if the move is into the trash. - LLInvFVBridge::changeItemParent( - model, - (LLViewerInventoryItem*)inv_item, - mUUID, - move_is_into_trash); - } - } - } - else if(LLToolDragAndDrop::SOURCE_WORLD == source) - { - // Make sure the object exists. If we allowed dragging from - // anonymous objects, it would be possible to bypass - // permissions. - object = gObjectList.findObject(inv_item->getParentUUID()); - if(!object) - { - llinfos << "Object not found for drop." << llendl; - return FALSE; - } - - // coming from a task. Need to figure out if the person can - // move/copy this item. - LLPermissions perm(inv_item->getPermissions()); - BOOL is_move = FALSE; - if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) - && perm.allowTransferTo(gAgent.getID()))) -// || gAgent.isGodlike()) - - { - accept = TRUE; - } - else if(object->permYouOwner()) - { - // If the object cannot be copied, but the object the - // inventory is owned by the agent, then the item can be - // moved from the task to agent inventory. - is_move = TRUE; - accept = TRUE; - } - if(drop && accept) - { - LLMoveInv* move_inv = new LLMoveInv; - move_inv->mObjectID = inv_item->getParentUUID(); - two_uuids_t item_pair(mUUID, inv_item->getUUID()); - move_inv->mMoveList.push_back(item_pair); - move_inv->mCallback = NULL; - move_inv->mUserData = NULL; - if(is_move) - { - warn_move_inventory(object, move_inv); - } - else - { - LLNotification::Params params("MoveInventoryFromObject"); - params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); - LLNotifications::instance().forceResponse(params, 0); - } - } - - } - else if(LLToolDragAndDrop::SOURCE_NOTECARD == source) - { - accept = TRUE; - if(drop) - { - copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(), - LLToolDragAndDrop::getInstance()->getSourceID(), inv_item); - } - } - else if(LLToolDragAndDrop::SOURCE_LIBRARY == source) - { - LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item; - if(item && item->isComplete()) - { - accept = TRUE; - if(drop) - { - copy_inventory_item( - gAgent.getID(), - inv_item->getPermissions().getOwner(), - inv_item->getUUID(), - mUUID, - std::string(), - LLPointer<LLInventoryCallback>(NULL)); - } - } - } - else - { - llwarns << "unhandled drag source" << llendl; - } - return accept; -} - -// +=================================================+ -// | LLScriptBridge (DEPRECTED) | -// +=================================================+ - -LLUIImagePtr LLScriptBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); -} - -// +=================================================+ -// | LLTextureBridge | -// +=================================================+ - -LLUIImagePtr LLTextureBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_TEXTURE, mInvType, 0, FALSE); -} - -void LLTextureBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -} - -// +=================================================+ -// | LLSoundBridge | -// +=================================================+ - -LLUIImagePtr LLSoundBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE); -} - -void LLSoundBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* -// Changed this back to the way it USED to work: -// only open the preview dialog through the contextual right-click menu -// double-click just plays the sound - - LLViewerInventoryItem* item = getItem(); - if(item) - { - openSoundPreview((void*)this); - //send_uuid_sound_trigger(item->getAssetUUID(), 1.0); - } -*/ -} - -void LLSoundBridge::previewItem() -{ - LLViewerInventoryItem* item = getItem(); - if(item) - { - send_sound_trigger(item->getAssetUUID(), 1.0); - } -} - -void LLSoundBridge::openSoundPreview(void* which) -{ - LLSoundBridge *me = (LLSoundBridge *)which; - LLFloaterReg::showInstance("preview_sound", LLSD(me->mUUID), TAKE_FOCUS_YES); -} - -void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLTextureBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Sound Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - - items.push_back(std::string("Sound Separator")); - items.push_back(std::string("Sound Play")); - - hide_context_entries(menu, items, disabled_items); -} - -// +=================================================+ -// | LLLandmarkBridge | -// +=================================================+ - -LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags/* = 0x00*/) : -LLItemBridge(inventory, uuid) -{ - mVisited = FALSE; - if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED) - { - mVisited = TRUE; - } -} - -LLUIImagePtr LLLandmarkBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE); -} - -void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Landmark Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - - items.push_back(std::string("Landmark Separator")); - items.push_back(std::string("About Landmark")); - - // Disable "About Landmark" menu item for - // multiple landmarks selected. Only one landmark - // info panel can be shown at a time. - if ((flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("About Landmark")); - } - - hide_context_entries(menu, items, disabled_items); -} - -// Convenience function for the two functions below. -void teleport_via_landmark(const LLUUID& asset_id) -{ - gAgent.teleportViaLandmark( asset_id ); - - // we now automatically track the landmark you're teleporting to - // because you'll probably arrive at a telehub instead - LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance(); - if( floater_world_map ) - { - floater_world_map->trackLandmark( asset_id ); - } -} - -// virtual -void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("teleport" == action) - { - LLViewerInventoryItem* item = getItem(); - if(item) - { - teleport_via_landmark(item->getAssetUUID()); - } - } - else if ("about" == action) - { - LLViewerInventoryItem* item = getItem(); - if(item) - { - LLSD key; - key["type"] = "landmark"; - key["id"] = item->getUUID(); - - LLSideTray::getInstance()->showPanel("panel_places", key); - } - } - else - { - LLItemBridge::performAction(folder, model, action); - } -} - -static bool open_landmark_callback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotification::getSelectedOption(notification, response); - - LLUUID asset_id = notification["payload"]["asset_id"].asUUID(); - if (option == 0) - { - teleport_via_landmark(asset_id); - } - - return false; -} -static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportFromLandmark", open_landmark_callback); - - -void LLLandmarkBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* - LLViewerInventoryItem* item = getItem(); - if( item ) - { - // Opening (double-clicking) a landmark immediately teleports, - // but warns you the first time. - // open_landmark(item); - LLSD payload; - payload["asset_id"] = item->getAssetUUID(); - LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); - } -*/ -} - - -// +=================================================+ -// | LLCallingCardObserver | -// +=================================================+ -void LLCallingCardObserver::changed(U32 mask) -{ - mBridgep->refreshFolderViewItem(); -} - -// +=================================================+ -// | LLCallingCardBridge | -// +=================================================+ - -LLCallingCardBridge::LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) : - LLItemBridge(inventory, uuid) -{ - mObserver = new LLCallingCardObserver(this); - LLAvatarTracker::instance().addObserver(mObserver); -} - -LLCallingCardBridge::~LLCallingCardBridge() -{ - LLAvatarTracker::instance().removeObserver(mObserver); - delete mObserver; -} - -void LLCallingCardBridge::refreshFolderViewItem() -{ - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL; - if (itemp) - { - itemp->refresh(); - } -} - -// virtual -void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("begin_im" == action) - { - LLViewerInventoryItem *item = getItem(); - if (item && (item->getCreatorUUID() != gAgent.getID()) && - (!item->getCreatorUUID().isNull())) - { - std::string callingcard_name; - gCacheName->getFullName(item->getCreatorUUID(), callingcard_name); - gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID()); - } - } - else if ("lure" == action) - { - LLViewerInventoryItem *item = getItem(); - if (item && (item->getCreatorUUID() != gAgent.getID()) && - (!item->getCreatorUUID().isNull())) - { - LLAvatarActions::offerTeleport(item->getCreatorUUID()); - } - } - else LLItemBridge::performAction(folder, model, action); -} - -LLUIImagePtr LLCallingCardBridge::getIcon() const -{ - BOOL online = FALSE; - LLViewerInventoryItem* item = getItem(); - if(item) - { - online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()); - } - return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE); -} - -std::string LLCallingCardBridge::getLabelSuffix() const -{ - LLViewerInventoryItem* item = getItem(); - if( item && LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()) ) - { - return LLItemBridge::getLabelSuffix() + " (online)"; - } - else - { - return LLItemBridge::getLabelSuffix(); - } -} - -void LLCallingCardBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* - LLViewerInventoryItem* item = getItem(); - if(item && !item->getCreatorUUID().isNull()) - { - LLAvatarActions::showProfile(item->getCreatorUUID()); - } -*/ -} - -void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLCallingCardBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - LLInventoryItem* item = getItem(); - BOOL good_card = (item - && (LLUUID::null != item->getCreatorUUID()) - && (item->getCreatorUUID() != gAgent.getID())); - BOOL user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID())); - items.push_back(std::string("Send Instant Message Separator")); - items.push_back(std::string("Send Instant Message")); - items.push_back(std::string("Offer Teleport...")); - items.push_back(std::string("Conference Chat")); - - if (!good_card) - { - disabled_items.push_back(std::string("Send Instant Message")); - } - if (!good_card || !user_online) - { - disabled_items.push_back(std::string("Offer Teleport...")); - disabled_items.push_back(std::string("Conference Chat")); - } - } - hide_context_entries(menu, items, disabled_items); -} - -BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data) -{ - LLViewerInventoryItem* item = getItem(); - BOOL rv = FALSE; - if(item) - { - // check the type - switch(cargo_type) - { - case DAD_TEXTURE: - case DAD_SOUND: - case DAD_LANDMARK: - case DAD_SCRIPT: - case DAD_CLOTHING: - case DAD_OBJECT: - case DAD_NOTECARD: - case DAD_BODYPART: - case DAD_ANIMATION: - case DAD_GESTURE: - { - LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; - const LLPermissions& perm = inv_item->getPermissions(); - if(gInventory.getItem(inv_item->getUUID()) - && perm.allowOperationBy(PERM_TRANSFER, gAgent.getID())) - { - rv = TRUE; - if(drop) - { - LLToolDragAndDrop::giveInventory(item->getCreatorUUID(), - (LLInventoryItem*)cargo_data); - } - } - else - { - // It's not in the user's inventory (it's probably in - // an object's contents), so disallow dragging it here. - // You can't give something you don't yet have. - rv = FALSE; - } - break; - } - case DAD_CATEGORY: - { - LLInventoryCategory* inv_cat = (LLInventoryCategory*)cargo_data; - if( gInventory.getCategory( inv_cat->getUUID() ) ) - { - rv = TRUE; - if(drop) - { - LLToolDragAndDrop::giveInventoryCategory( - item->getCreatorUUID(), - inv_cat); - } - } - else - { - // It's not in the user's inventory (it's probably in - // an object's contents), so disallow dragging it here. - // You can't give something you don't yet have. - rv = FALSE; - } - break; - } - default: - break; - } - } - return rv; -} - -BOOL LLCallingCardBridge::removeItem() -{ - if (LLFriendCardsManager::instance().isItemInAnyFriendsList(getItem())) - { - LLAvatarActions::removeFriendDialog(getItem()->getCreatorUUID()); - return FALSE; - } - else - { - return LLItemBridge::removeItem(); - } -} -// +=================================================+ -// | LLNotecardBridge | -// +=================================================+ - -LLUIImagePtr LLNotecardBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE); -} - -void LLNotecardBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } - -/* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); - } -*/ -} - - -// +=================================================+ -// | LLGestureBridge | -// +=================================================+ - -LLUIImagePtr LLGestureBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE); -} - -LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const -{ - if( LLGestureManager::instance().isGestureActive(mUUID) ) - { - return LLFontGL::BOLD; - } - else - { - return LLFontGL::NORMAL; - } -} - -std::string LLGestureBridge::getLabelSuffix() const -{ - if( LLGestureManager::instance().isGestureActive(mUUID) ) - { - return LLItemBridge::getLabelSuffix() + " (active)"; - } - else - { - return LLItemBridge::getLabelSuffix(); - } -} - -// virtual -void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("activate" == action) - { - LLGestureManager::instance().activateGesture(mUUID); - - LLViewerInventoryItem* item = gInventory.getItem(mUUID); - if (!item) return; - - // Since we just changed the suffix to indicate (active) - // the server doesn't need to know, just the viewer. - gInventory.updateItem(item); - gInventory.notifyObservers(); - } - else if ("deactivate" == action) - { - LLGestureManager::instance().deactivateGesture(mUUID); - - LLViewerInventoryItem* item = gInventory.getItem(mUUID); - if (!item) return; - - // Since we just changed the suffix to indicate (active) - // the server doesn't need to know, just the viewer. - gInventory.updateItem(item); - gInventory.notifyObservers(); - } - else LLItemBridge::performAction(folder, model, action); -} - -void LLGestureBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); - preview->setFocus(TRUE); - } -*/ -} - -BOOL LLGestureBridge::removeItem() -{ - // Force close the preview window, if it exists - LLGestureManager::instance().deactivateGesture(mUUID); - return LLItemBridge::removeItem(); -} - -void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLGestureBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - items.push_back(std::string("Gesture Separator")); - items.push_back(std::string("Activate")); - items.push_back(std::string("Deactivate")); - } - hide_context_entries(menu, items, disabled_items); -} - -// +=================================================+ -// | LLAnimationBridge | -// +=================================================+ - -LLUIImagePtr LLAnimationBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); -} - -void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Animation Open")); - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - - items.push_back(std::string("Animation Separator")); - items.push_back(std::string("Animation Play")); - items.push_back(std::string("Animation Audition")); - - hide_context_entries(menu, items, disabled_items); - -} - -// virtual -void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ((action == "playworld") || (action == "playlocal")) - { - if (getItem()) - { - LLPreviewAnim::e_activation_type activate = LLPreviewAnim::NONE; - if ("playworld" == action) activate = LLPreviewAnim::PLAY; - if ("playlocal" == action) activate = LLPreviewAnim::AUDITION; - - LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID)); - if (preview) - { - preview->activate(activate); - } - } - } - else - { - LLItemBridge::performAction(folder, model, action); - } -} - -void LLAnimationBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } -/* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); - } -*/ -} - -// +=================================================+ -// | LLObjectBridge | -// +=================================================+ - -// static -LLUUID LLObjectBridge::sContextMenuItemID; - -LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) : -LLItemBridge(inventory, uuid), mInvType(type) -{ - mAttachPt = (flags & 0xff); // low bye of inventory flags - - mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE; -} - -BOOL LLObjectBridge::isItemRemovable() -{ - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if(!avatar) return FALSE; - if(avatar->isWearingAttachment(mUUID)) return FALSE; - return LLInvFVBridge::isItemRemovable(); -} - -LLUIImagePtr LLObjectBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject ); -} - -LLInventoryObject* LLObjectBridge::getObject() const -{ - LLInventoryObject* object = NULL; - LLInventoryModel* model = getInventoryModel(); - if(model) - { - object = (LLInventoryObject*)model->getObject(mUUID); - } - return object; -} - -// virtual -void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("attach" == action) - { - LLUUID object_id = mUUID; - LLViewerInventoryItem* item; - item = (LLViewerInventoryItem*)gInventory.getItem(object_id); - if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID())) - { - rez_attachment(item, NULL); - } - else if(item && item->isComplete()) - { - // must be in library. copy it to our inventory and put it on. - LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - gFocusMgr.setKeyboardFocus(NULL); - } - else if ("detach" == action) - { - LLInventoryItem* item = gInventory.getItem(mUUID); - if(item) - { - gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID()); - gMessageSystem->sendReliable( gAgent.getRegion()->getHost()); - } - // this object might have been selected, so let the selection manager know it's gone now - LLViewerObject *found_obj = - gObjectList.findObject(item->getUUID()); - if (found_obj) - { - LLSelectMgr::getInstance()->remove(found_obj); - } - else - { - llwarns << "object not found - ignoring" << llendl; - } - } - else LLItemBridge::performAction(folder, model, action); -} - -void LLObjectBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } - - LLSD key; - key["id"] = mUUID; - LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); - - /* - LLFloaterReg::showInstance("properties", mUUID); - */ -} - -LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const -{ - U8 font = LLFontGL::NORMAL; - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar && avatar->isWearingAttachment( mUUID ) ) - { - font |= LLFontGL::BOLD; - } - - LLInventoryItem* item = getItem(); - if (item && item->getIsLinkType()) - { - font |= LLFontGL::ITALIC; - } - - return (LLFontGL::StyleFlags)font; -} - -std::string LLObjectBridge::getLabelSuffix() const -{ - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar && avatar->isWearingAttachment( mUUID ) ) - { - std::string attachment_point_name = avatar->getAttachedPointName(mUUID); - LLStringUtil::toLower(attachment_point_name); - - LLStringUtil::format_map_t args; - args["[ATTACHMENT_POINT]"] = attachment_point_name.c_str(); - return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args); - } - else - { - return LLItemBridge::getLabelSuffix(); - } -} - -void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment) -{ - LLSD payload; - payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link. - - S32 attach_pt = 0; - if (gAgent.getAvatarObject() && attachment) - { - for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin(); - iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter) - { - if (iter->second == attachment) - { - attach_pt = iter->first; - break; - } - } - } - - payload["attachment_point"] = attach_pt; - -#if !ENABLE_MULTIATTACHMENTS - if (attachment && attachment->getNumObjects() > 0) - { - LLNotifications::instance().add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez); - } - else -#endif - { - LLNotifications::instance().forceResponse(LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/); - } -} - -bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response) -{ - LLVOAvatar *avatarp = gAgent.getAvatarObject(); - - if (!avatarp->canAttachMoreObjects()) - { - LLSD args; - args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS); - LLNotifications::instance().add("MaxAttachmentsOnOutfit", args); - return false; - } - - S32 option = LLNotification::getSelectedOption(notification, response); - if (option == 0/*YES*/) - { - LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID()); - - if (itemp) - { - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_ObjectData); - msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID()); - msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner()); - U8 attachment_pt = notification["payload"]["attachment_point"].asInteger(); -#if ENABLE_MULTIATTACHMENTS - attachment_pt |= ATTACHMENT_ADD; -#endif - msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt); - pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions()); - msg->addStringFast(_PREHASH_Name, itemp->getName()); - msg->addStringFast(_PREHASH_Description, itemp->getDescription()); - msg->sendReliable(gAgent.getRegion()->getHost()); - } - } - return false; -} -static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("ReplaceAttachment", confirm_replace_attachment_rez); - -void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - LLInventoryItem* item = getItem(); - if (item && item->getIsLinkType()) - { - items.push_back(std::string("Goto Link")); - } - - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - LLObjectBridge::sContextMenuItemID = mUUID; - - if(item) - { - LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); - if( !avatarp ) - { - return; - } - - if( avatarp->isWearingAttachment( mUUID ) ) - { - items.push_back(std::string("Detach From Yourself")); - } - else - if( !isInTrash() && !isLinkedObjectInTrash() ) - { - items.push_back(std::string("Attach Separator")); - items.push_back(std::string("Object Wear")); - items.push_back(std::string("Attach To")); - items.push_back(std::string("Attach To HUD")); - // commented out for DEV-32347 - //items.push_back(std::string("Restore to Last Position")); - - if (!avatarp->canAttachMoreObjects()) - { - disabled_items.push_back(std::string("Object Wear")); - disabled_items.push_back(std::string("Attach To")); - disabled_items.push_back(std::string("Attach To HUD")); - } - LLMenuGL* attach_menu = menu.findChildMenuByName("Attach To", TRUE); - LLMenuGL* attach_hud_menu = menu.findChildMenuByName("Attach To HUD", TRUE); - LLVOAvatar *avatarp = gAgent.getAvatarObject(); - if (attach_menu - && (attach_menu->getChildCount() == 0) - && attach_hud_menu - && (attach_hud_menu->getChildCount() == 0) - && avatarp) - { - for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); - iter != avatarp->mAttachmentPoints.end(); ) - { - LLVOAvatar::attachment_map_t::iterator curiter = iter++; - LLViewerJointAttachment* attachment = curiter->second; - LLMenuItemCallGL::Params p; - std::string submenu_name = attachment->getName(); - if (LLTrans::getString(submenu_name) != "") - { - p.name = (" ")+LLTrans::getString(submenu_name)+" "; - } - else - { - p.name = submenu_name; - } - LLSD cbparams; - cbparams["index"] = curiter->first; - cbparams["label"] = attachment->getName(); - p.on_click.function_name = "Inventory.AttachObject"; - p.on_click.parameter = LLSD(attachment->getName()); - p.on_enable.function_name = "Attachment.Label"; - p.on_enable.parameter = cbparams; - LLView* parent = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu; - LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent); - } - } - } - } - } - hide_context_entries(menu, items, disabled_items); -} - -BOOL LLObjectBridge::renameItem(const std::string& new_name) -{ - if(!isItemRenameable()) - return FALSE; - LLPreview::dirty(mUUID); - LLInventoryModel* model = getInventoryModel(); - if(!model) - return FALSE; - LLViewerInventoryItem* item = getItem(); - if(item && (item->getName() != new_name)) - { - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->rename(new_name); - buildDisplayName(new_item, mDisplayName); - new_item->updateServer(FALSE); - model->updateItem(new_item); - - model->notifyObservers(); - - LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); - if( avatar ) - { - LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() ); - if( obj ) - { - LLSelectMgr::getInstance()->deselectAll(); - LLSelectMgr::getInstance()->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); - LLSelectMgr::getInstance()->selectionSetObjectName( new_name ); - LLSelectMgr::getInstance()->deselectAll(); - } - } - } - // return FALSE because we either notified observers (& therefore - // rebuilt) or we didn't update. - return FALSE; -} - -// +=================================================+ -// | LLLSLTextBridge | -// +=================================================+ - -LLUIImagePtr LLLSLTextBridge::getIcon() const -{ - return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); -} - -void LLLSLTextBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } - /* - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); - } - */ -} - -// +=================================================+ -// | LLWearableBridge | -// +=================================================+ - -// *NOTE: hack to get from avatar inventory to avatar -void wear_inventory_item_on_avatar( LLInventoryItem* item ) -{ - if(item) - { - lldebugs << "wear_inventory_item_on_avatar( " << item->getName() - << " )" << llendl; - - LLAppearanceManager::wearItem(item); - } -} - -void wear_add_inventory_item_on_avatar( LLInventoryItem* item ) -{ - if(item) - { - lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName() - << " )" << llendl; - - LLWearableList::instance().getAsset(item->getAssetUUID(), - item->getName(), - item->getType(), - LLWearableBridge::onWearAddOnAvatarArrived, - new LLUUID(item->getUUID())); - } -} - -void remove_inventory_category_from_avatar( LLInventoryCategory* category ) -{ - if(!category) return; - lldebugs << "remove_inventory_category_from_avatar( " << category->getName() - << " )" << llendl; - - - if( gFloaterCustomize ) - { - gFloaterCustomize->askToSaveIfDirty( - boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID())); - } - else - { - remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); - } -} - -struct OnRemoveStruct -{ - LLUUID mUUID; - OnRemoveStruct(const LLUUID& uuid): - mUUID(uuid) - { - } -}; - -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id) -{ - - // Find all the wearables that are in the category's subtree. - lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl; - if(proceed) - { - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - LLFindWearables is_wearable; - gInventory.collectDescendentsIf(category_id, - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_wearable); - S32 i; - S32 wearable_count = item_array.count(); - - LLInventoryModel::cat_array_t obj_cat_array; - LLInventoryModel::item_array_t obj_item_array; - LLIsType is_object( LLAssetType::AT_OBJECT ); - gInventory.collectDescendentsIf(category_id, - obj_cat_array, - obj_item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_object); - S32 obj_count = obj_item_array.count(); - - // Find all gestures in this folder - LLInventoryModel::cat_array_t gest_cat_array; - LLInventoryModel::item_array_t gest_item_array; - LLIsType is_gesture( LLAssetType::AT_GESTURE ); - gInventory.collectDescendentsIf(category_id, - gest_cat_array, - gest_item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_gesture); - S32 gest_count = gest_item_array.count(); - - if (wearable_count > 0) //Loop through wearables. If worn, remove. - { - for(i = 0; i < wearable_count; ++i) - { - if( gAgentWearables.isWearingItem (item_array.get(i)->getUUID()) ) - { - LLWearableList::instance().getAsset(item_array.get(i)->getAssetUUID(), - item_array.get(i)->getName(), - item_array.get(i)->getType(), - LLWearableBridge::onRemoveFromAvatarArrived, - new OnRemoveStruct(item_array.get(i)->getUUID())); - - } - } - } - - - if (obj_count > 0) - { - for(i = 0; i < obj_count; ++i) - { - gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); - gMessageSystem->nextBlockFast(_PREHASH_ObjectData ); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item_array.get(i)->getUUID() ); - - gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); - - // this object might have been selected, so let the selection manager know it's gone now - LLViewerObject *found_obj = gObjectList.findObject( obj_item_array.get(i)->getUUID()); - if (found_obj) - { - LLSelectMgr::getInstance()->remove(found_obj); - } - else - { - llwarns << "object not found, ignoring" << llendl; - } - } - } - - if (gest_count > 0) - { - for(i = 0; i < gest_count; ++i) - { - if ( LLGestureManager::instance().isGestureActive( gest_item_array.get(i)->getUUID()) ) - { - LLGestureManager::instance().deactivateGesture( gest_item_array.get(i)->getUUID() ); - gInventory.updateItem( gest_item_array.get(i) ); - gInventory.notifyObservers(); - } - - } - } - } -} - -BOOL LLWearableBridge::renameItem(const std::string& new_name) -{ - if( gAgentWearables.isWearingItem( mUUID ) ) - { - gAgentWearables.setWearableName( mUUID, new_name ); - } - return LLItemBridge::renameItem(new_name); -} - -BOOL LLWearableBridge::isItemRemovable() -{ - if (gAgentWearables.isWearingItem(mUUID)) return FALSE; - return LLInvFVBridge::isItemRemovable(); -} - -std::string LLWearableBridge::getLabelSuffix() const -{ - if( gAgentWearables.isWearingItem( mUUID ) ) - { - return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn"); - } - else - { - return LLItemBridge::getLabelSuffix(); - } -} - -LLUIImagePtr LLWearableBridge::getIcon() const -{ - return get_item_icon(mAssetType, mInvType, mWearableType, FALSE); -} - -// virtual -void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("wear" == action) - { - wearOnAvatar(); - } - else if ("wear_add" == action) - { - wearAddOnAvatar(); - } - else if ("edit" == action) - { - editOnAvatar(); - return; - } - else if ("take_off" == action) - { - if(gAgentWearables.isWearingItem(mUUID)) - { - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLWearableList::instance().getAsset(item->getAssetUUID(), - item->getName(), - item->getType(), - LLWearableBridge::onRemoveFromAvatarArrived, - new OnRemoveStruct(mUUID)); - } - } - } - else LLItemBridge::performAction(folder, model, action); -} - -void LLWearableBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); - } - /* - if( isInTrash() ) - { - LLNotifications::instance().add("CannotWearTrash"); - } - else if(isAgentInventory()) - { - if( !gAgentWearables.isWearingItem( mUUID ) ) - { - wearOnAvatar(); - } - } - else - { - // must be in the inventory library. copy it to our inventory - // and put it on right away. - LLViewerInventoryItem* item = getItem(); - if(item && item->isComplete()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else if(item) - { - // *TODO: We should fetch the item details, and then do - // the operation above. - LLNotifications::instance().add("CannotWearInfoNotComplete"); - } - } - */ -} - -void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - lldebugs << "LLWearableBridge::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { // FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere - BOOL no_open = ((flags & SUPPRESS_OPEN_ITEM) == SUPPRESS_OPEN_ITEM); - - // If we have clothing, don't add "Open" as it's the same action as "Wear" SL-18976 - LLViewerInventoryItem* item = getItem(); - if( !no_open && item ) - { - no_open = (item->getType() == LLAssetType::AT_CLOTHING) || - (item->getType() == LLAssetType::AT_BODYPART); - } - if (!no_open) - { - items.push_back(std::string("Open")); - } - - if (item && item->getIsLinkType()) - { - items.push_back(std::string("Goto Link")); - } - - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - - items.push_back(std::string("Wearable Separator")); - - items.push_back(std::string("Wearable Wear")); - items.push_back(std::string("Wearable Add")); - items.push_back(std::string("Wearable Edit")); - - if ((flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Wearable Edit")); - } - // Don't allow items to be worn if their baseobj is in the trash. - if (isLinkedObjectInTrash()) - { - disabled_items.push_back(std::string("Wearable Wear")); - disabled_items.push_back(std::string("Wearable Add")); - disabled_items.push_back(std::string("Wearable Edit")); - } - - // Disable wear and take off based on whether the item is worn. - if(item) - { - switch (item->getType()) - { - case LLAssetType::AT_CLOTHING: - items.push_back(std::string("Take Off")); - case LLAssetType::AT_BODYPART: - if (gAgentWearables.isWearingItem(item->getUUID())) - { - disabled_items.push_back(std::string("Wearable Wear")); - disabled_items.push_back(std::string("Wearable Add")); - } - else - { - disabled_items.push_back(std::string("Take Off")); - } - break; - default: - break; - } - } - } - hide_context_entries(menu, items, disabled_items); -} - -// Called from menus -// static -BOOL LLWearableBridge::canWearOnAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return FALSE; - if(!self->isAgentInventory()) - { - LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem(); - if(!item || !item->isComplete()) return FALSE; - } - return (!gAgentWearables.isWearingItem(self->mUUID)); -} - -// Called from menus -// static -void LLWearableBridge::onWearOnAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return; - self->wearOnAvatar(); -} - -void LLWearableBridge::wearOnAvatar() -{ - // Don't wear anything until initial wearables are loaded, can - // destroy clothing items. - if (!gAgentWearables.areWearablesLoaded()) - { - LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); - return; - } - - LLViewerInventoryItem* item = getItem(); - if(item) - { - if(!isAgentInventory()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else - { - wear_inventory_item_on_avatar(item); - } - } -} - -void LLWearableBridge::wearAddOnAvatar() -{ - // Don't wear anything until initial wearables are loaded, can - // destroy clothing items. - if (!gAgentWearables.areWearablesLoaded()) - { - LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); - return; - } - - LLViewerInventoryItem* item = getItem(); - if(item) - { - if(!isAgentInventory()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else - { - wear_add_inventory_item_on_avatar(item); - } - } -} - -// static -void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata ) -{ - LLUUID* item_id = (LLUUID*) userdata; - if(wearable) - { - LLViewerInventoryItem* item = NULL; - item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); - if(item) - { - if(item->getAssetUUID() == wearable->getAssetID()) - { - gAgentWearables.setWearableItem(item, wearable); - gInventory.notifyObservers(); - //self->getFolderItem()->refreshFromRoot(); - } - else - { - llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; - } - } - } - delete item_id; -} - -// static -// BAP remove the "add" code path once everything is fully COF-ified. -void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata ) -{ - LLUUID* item_id = (LLUUID*) userdata; - if(wearable) - { - LLViewerInventoryItem* item = NULL; - item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); - if(item) - { - if(item->getAssetUUID() == wearable->getAssetID()) - { - bool do_append = true; - gAgentWearables.setWearableItem(item, wearable, do_append); - gInventory.notifyObservers(); - //self->getFolderItem()->refreshFromRoot(); - } - else - { - llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; - } - } - } - delete item_id; -} - -// static -BOOL LLWearableBridge::canEditOnAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return FALSE; - - return (gAgentWearables.isWearingItem(self->mUUID)); -} - -// static -void LLWearableBridge::onEditOnAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(self) - { - self->editOnAvatar(); - } -} - -void LLWearableBridge::editOnAvatar() -{ - const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID); - if( wearable ) - { - // Set the tab to the right wearable. - if (gFloaterCustomize) - gFloaterCustomize->setCurrentWearableType( wearable->getType() ); - - if( CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() ) - { - // Start Avatar Customization - gAgent.changeCameraToCustomizeAvatar(); - } - } -} - -// static -BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if( self && (LLAssetType::AT_BODYPART != self->mAssetType) ) - { - return gAgentWearables.isWearingItem( self->mUUID ); - } - return FALSE; -} - -// static -void LLWearableBridge::onRemoveFromAvatar(void* user_data) -{ - LLWearableBridge* self = (LLWearableBridge*)user_data; - if(!self) return; - if(gAgentWearables.isWearingItem(self->mUUID)) - { - LLViewerInventoryItem* item = self->getItem(); - if (item) - { - LLUUID parent_id = item->getParentUUID(); - LLWearableList::instance().getAsset(item->getAssetUUID(), - item->getName(), - item->getType(), - onRemoveFromAvatarArrived, - new OnRemoveStruct(LLUUID(self->mUUID))); - } - } -} - -// static -void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable, - void* userdata) -{ - OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata; - const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID); - if(wearable) - { - if( gAgentWearables.isWearingItem( item_id ) ) - { - EWearableType type = wearable->getType(); - - if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES ) ) //&& - //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) ) - { - // MULTI_WEARABLE: FIXME HACK - always remove all - bool do_remove_all = false; - gAgentWearables.removeWearable( type, do_remove_all, 0 ); - } - } - } - - // Find and remove this item from the COF. - LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::getCOF()); - llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF. - for (LLInventoryModel::item_array_t::const_iterator iter = items.begin(); - iter != items.end(); - ++iter) - { - const LLViewerInventoryItem *linked_item = (*iter); - const LLUUID &item_id = linked_item->getUUID(); - gInventory.purgeObject(item_id); - } - gInventory.notifyObservers(); - - delete on_remove_struct; -} - -LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type, - const LLUUID& uuid,LLInventoryModel* model) -{ - LLInvFVBridgeAction* action = NULL; - switch(asset_type) - { - case LLAssetType::AT_TEXTURE: - action = new LLTextureBridgeAction(uuid,model); - break; - - case LLAssetType::AT_SOUND: - action = new LLSoundBridgeAction(uuid,model); - break; - - case LLAssetType::AT_LANDMARK: - action = new LLLandmarkBridgeAction(uuid,model); - break; - - case LLAssetType::AT_CALLINGCARD: - action = new LLCallingCardBridgeAction(uuid,model); - break; - - case LLAssetType::AT_OBJECT: - action = new LLObjectBridgeAction(uuid,model); - break; - - case LLAssetType::AT_NOTECARD: - action = new LLNotecardBridgeAction(uuid,model); - break; - - case LLAssetType::AT_ANIMATION: - action = new LLAnimationBridgeAction(uuid,model); - break; - - case LLAssetType::AT_GESTURE: - action = new LLGestureBridgeAction(uuid,model); - break; - - case LLAssetType::AT_LSL_TEXT: - action = new LLLSLTextBridgeAction(uuid,model); - break; - - case LLAssetType::AT_CLOTHING: - case LLAssetType::AT_BODYPART: - action = new LLWearableBridgeAction(uuid,model); - - break; - - default: - break; - } - return action; -} - -//static -void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type, - const LLUUID& uuid,LLInventoryModel* model) -{ - LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); - if(action) - { - action->doIt(); - delete action; - } -} - -//static -void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model) -{ - LLAssetType::EType asset_type = model->getItem(uuid)->getType(); - LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); - if(action) - { - action->doIt(); - delete action; - } -} - -LLViewerInventoryItem* LLInvFVBridgeAction::getItem() const -{ - if(mModel) - return (LLViewerInventoryItem*)mModel->getItem(mUUID); - return NULL; -} - -//virtual -void LLTextureBridgeAction::doIt() -{ - if (getItem()) - { - LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - -//virtual -void LLSoundBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if(item) - { - LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLLandmarkBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if( item ) - { - // Opening (double-clicking) a landmark immediately teleports, - // but warns you the first time. - LLSD payload; - payload["asset_id"] = item->getAssetUUID(); - LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); - } - - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLCallingCardBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if(item && item->getCreatorUUID().notNull()) - { - LLAvatarActions::showProfile(item->getCreatorUUID()); - } - - LLInvFVBridgeAction::doIt(); -} - -//virtual -void -LLNotecardBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - -//virtual -void LLGestureBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); - preview->setFocus(TRUE); - } - - LLInvFVBridgeAction::doIt(); -} - -//virtual -void LLAnimationBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLObjectBridgeAction::doIt() -{ - LLFloaterReg::showInstance("properties", mUUID); - - LLInvFVBridgeAction::doIt(); -} - - -//virtual -void LLLSLTextBridgeAction::doIt() -{ - LLViewerInventoryItem* item = getItem(); - if (item) - { - LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); - } - - LLInvFVBridgeAction::doIt(); -} - - -BOOL LLWearableBridgeAction::isInTrash() const -{ - if(!mModel) return FALSE; - LLUUID trash_id = mModel->findCategoryUUIDForType(LLAssetType::AT_TRASH); - return mModel->isObjectDescendentOf(mUUID, trash_id); -} - -BOOL LLWearableBridgeAction::isAgentInventory() const -{ - if(!mModel) return FALSE; - if(gInventory.getRootFolderID() == mUUID) return TRUE; - return mModel->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); -} - -void LLWearableBridgeAction::wearOnAvatar() -{ - // Don't wear anything until initial wearables are loaded, can - // destroy clothing items. - if (!gAgentWearables.areWearablesLoaded()) - { - LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); - return; - } - - LLViewerInventoryItem* item = getItem(); - if(item) - { - if(!isAgentInventory()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else - { - wear_inventory_item_on_avatar(item); - } - } -} - -//virtual -void LLWearableBridgeAction::doIt() -{ - if(isInTrash()) - { - LLNotifications::instance().add("CannotWearTrash"); - } - else if(isAgentInventory()) - { - if(!gAgentWearables.isWearingItem(mUUID)) - { - wearOnAvatar(); - } - } - else - { - // must be in the inventory library. copy it to our inventory - // and put it on right away. - LLViewerInventoryItem* item = getItem(); - if(item && item->isComplete()) - { - LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - else if(item) - { - // *TODO: We should fetch the item details, and then do - // the operation above. - LLNotifications::instance().add("CannotWearInfoNotComplete"); - } - } - - LLInvFVBridgeAction::doIt(); -} - -// +=================================================+ -// | LLLinkItemBridge | -// +=================================================+ -// For broken links - -std::string LLLinkItemBridge::sPrefix("Link: "); - - -LLUIImagePtr LLLinkItemBridge::getIcon() const -{ - if (LLViewerInventoryItem *item = getItem()) - { - return get_item_icon(item->getActualType(), LLInventoryType::IT_NONE, 0, FALSE); - } - return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE); -} - -void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - // *TODO: Translate - lldebugs << "LLLink::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Delete")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Delete")); - } - } - hide_context_entries(menu, items, disabled_items); -} - - -// +=================================================+ -// | LLLinkBridge | -// +=================================================+ -// For broken links. - -std::string LLLinkFolderBridge::sPrefix("Link: "); - - -LLUIImagePtr LLLinkFolderBridge::getIcon() const -{ - LLAssetType::EType preferred_type = LLAssetType::AT_NONE; - if (LLViewerInventoryItem *item = getItem()) - { - if (const LLViewerInventoryCategory* cat = item->getLinkedCategory()) - { - preferred_type = cat->getPreferredType(); - } - } - return LLFolderBridge::getIcon(preferred_type); -} - -void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - // *TODO: Translate - lldebugs << "LLLink::buildContextMenu()" << llendl; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else - { - items.push_back(std::string("Goto Link")); - items.push_back(std::string("Delete")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Delete")); - } - } - hide_context_entries(menu, items, disabled_items); -} - -void LLLinkFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) -{ - if ("goto" == action) - { - gotoItem(folder); - return; - } - LLItemBridge::performAction(folder,model,action); -} - -void LLLinkFolderBridge::gotoItem(LLFolderView *folder) -{ - const LLUUID &cat_uuid = getFolderID(); - if (!cat_uuid.isNull()) - { - if (LLFolderViewItem *base_folder = folder->getItemByID(cat_uuid)) - { - if (LLInventoryModel* model = getInventoryModel()) - { - model->fetchDescendentsOf(cat_uuid); - } - base_folder->setOpen(TRUE); - folder->setSelectionFromRoot(base_folder,TRUE); - folder->scrollToShowSelection(); - } - } -} - -const LLUUID &LLLinkFolderBridge::getFolderID() const -{ - if (LLViewerInventoryItem *link_item = getItem()) - { - if (const LLViewerInventoryCategory *cat = link_item->getLinkedCategory()) - { - const LLUUID& cat_uuid = cat->getUUID(); - return cat_uuid; - } - } - return LLUUID::null; -} +/** + * @file llinventorybridge.cpp + * @brief Implementation of the Inventory-Folder-View-Bridge classes. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include <utility> // for std::pair<> + +#include "llfloaterinventory.h" +#include "llinventorybridge.h" + +#include "message.h" + +#include "llagent.h" +#include "llagentwearables.h" +#include "llcallingcard.h" +#include "llcheckboxctrl.h" // for radio buttons +#include "llfloaterreg.h" +#include "llradiogroup.h" +#include "llspinctrl.h" +#include "lltextbox.h" +#include "llui.h" + +#include "llviewercontrol.h" +#include "llfirstuse.h" +#include "llfoldertype.h" +#include "llfloaterchat.h" +#include "llfloatercustomize.h" +#include "llfloaterproperties.h" +#include "llfloaterworldmap.h" +#include "llfocusmgr.h" +#include "llfolderview.h" +#include "llfriendcard.h" +#include "llavataractions.h" +#include "llgesturemgr.h" +#include "lliconctrl.h" +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "llinventorypanel.h" +#include "llinventoryclipboard.h" +#include "lllineeditor.h" +#include "llmenugl.h" +#include "llpreviewanim.h" +#include "llpreviewgesture.h" +#include "llpreviewnotecard.h" +#include "llpreviewscript.h" +#include "llpreviewsound.h" +#include "llpreviewtexture.h" +#include "llresmgr.h" +#include "llscrollcontainer.h" +#include "llimview.h" +#include "lltooldraganddrop.h" +#include "llviewertexturelist.h" +#include "llviewerinventory.h" +#include "llviewerobjectlist.h" +#include "llviewerwindow.h" +#include "llvoavatar.h" +#include "llwearable.h" +#include "llwearablelist.h" +#include "llviewermessage.h" +#include "llviewerregion.h" +#include "llvoavatarself.h" +#include "lltabcontainer.h" +#include "lluictrlfactory.h" +#include "llselectmgr.h" +#include "llsidetray.h" +#include "llfloateropenobject.h" +#include "lltrans.h" +#include "llappearancemgr.h" + +using namespace LLOldEvents; + +// Helpers +// bug in busy count inc/dec right now, logic is complex... do we really need it? +void inc_busy_count() +{ +// gViewerWindow->getWindow()->incBusyCount(); +// check balance of these calls if this code is changed to ever actually +// *do* something! +} +void dec_busy_count() +{ +// gViewerWindow->getWindow()->decBusyCount(); +// check balance of these calls if this code is changed to ever actually +// *do* something! +} + +// Function declarations +void wear_add_inventory_item_on_avatar(LLInventoryItem* item); +void remove_inventory_category_from_avatar(LLInventoryCategory* category); +void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id); +bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*); +bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response); + +std::string ICON_NAME[ICON_NAME_COUNT] = +{ + "Inv_Texture", + "Inv_Sound", + "Inv_CallingCard", + "Inv_CallingCard", + "Inv_Landmark", + "Inv_Landmark", + "Inv_Script", + "Inv_Clothing", + "Inv_Object", + "Inv_Object", + "Inv_Notecard", + "Inv_Skin", + "Inv_Snapshot", + + "Inv_BodyShape", + "Inv_Skin", + "Inv_Hair", + "Inv_Eye", + "Inv_Shirt", + "Inv_Pants", + "Inv_Shoe", + "Inv_Socks", + "Inv_Jacket", + "Inv_Gloves", + "Inv_Undershirt", + "Inv_Underpants", + "Inv_Skirt", + "Inv_Alpha", + "Inv_Tattoo", + + "Inv_Animation", + "Inv_Gesture", + + "inv_item_linkitem.tga", + "inv_item_linkfolder.tga" +}; + + +// +=================================================+ +// | LLInventoryPanelObserver | +// +=================================================+ +void LLInventoryPanelObserver::changed(U32 mask) +{ + mIP->modelChanged(mask); +} + + +// +=================================================+ +// | LLInvFVBridge | +// +=================================================+ + +LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : +mUUID(uuid), mInvType(LLInventoryType::IT_NONE) +{ + mInventoryPanel = inventory->getHandle(); +} + +const std::string& LLInvFVBridge::getName() const +{ + LLInventoryObject* obj = getInventoryObject(); + if(obj) + { + return obj->getName(); + } + return LLStringUtil::null; +} + +const std::string& LLInvFVBridge::getDisplayName() const +{ + return getName(); +} + +// Folders have full perms +PermissionMask LLInvFVBridge::getPermissionMask() const +{ + + return PERM_ALL; +} + +// virtual +LLAssetType::EType LLInvFVBridge::getPreferredType() const +{ + return LLAssetType::AT_NONE; +} + + +// Folders don't have creation dates. +time_t LLInvFVBridge::getCreationDate() const +{ + return 0; +} + +// Can be destoryed (or moved to trash) +BOOL LLInvFVBridge::isItemRemovable() +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + if(model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) + { + return TRUE; + } + return FALSE; +} + +// Sends an update to all link items that point to the base item. +void LLInvFVBridge::renameLinkedItems(const LLUUID &item_id, const std::string& new_name) +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + + LLInventoryItem* itemp = model->getItem(mUUID); + if (!itemp) return; + + if (itemp->getIsLinkType()) + { + return; + } + + LLInventoryModel::item_array_t item_array = model->collectLinkedItems(item_id); + for (LLInventoryModel::item_array_t::iterator iter = item_array.begin(); + iter != item_array.end(); + iter++) + { + LLViewerInventoryItem *linked_item = (*iter); + if (linked_item->getUUID() == item_id) continue; + + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(linked_item); + new_item->rename(new_name); + new_item->updateServer(FALSE); + model->updateItem(new_item); + // model->addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID()); + } + model->notifyObservers(); +} + +// Can be moved to another folder +BOOL LLInvFVBridge::isItemMovable() const +{ + return TRUE; +} + +/*virtual*/ +/** + * @brief Adds this item into clipboard storage + */ +void LLInvFVBridge::cutToClipboard() +{ + if(isItemMovable()) + { + LLInventoryClipboard::instance().cut(mUUID); + } +} +// *TODO: make sure this does the right thing +void LLInvFVBridge::showProperties() +{ + LLSD key; + key["id"] = mUUID; + LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); + + LLFloaterReg::showInstance("properties", mUUID); +} + +void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) +{ + // Deactivate gestures when moving them into Trash + LLInvFVBridge* bridge; + LLInventoryModel* model = getInventoryModel(); + LLViewerInventoryItem* item = NULL; + LLViewerInventoryCategory* cat = NULL; + LLInventoryModel::cat_array_t descendent_categories; + LLInventoryModel::item_array_t descendent_items; + S32 count = batch.count(); + S32 i,j; + for(i = 0; i < count; ++i) + { + bridge = (LLInvFVBridge*)(batch.get(i)); + if(!bridge || !bridge->isItemRemovable()) continue; + item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); + if (item) + { + if(LLAssetType::AT_GESTURE == item->getType()) + { + LLGestureManager::instance().deactivateGesture(item->getUUID()); + } + } + } + for(i = 0; i < count; ++i) + { + bridge = (LLInvFVBridge*)(batch.get(i)); + if(!bridge || !bridge->isItemRemovable()) continue; + cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); + if (cat) + { + gInventory.collectDescendents( cat->getUUID(), descendent_categories, descendent_items, FALSE ); + for (j=0; j<descendent_items.count(); j++) + { + if(LLAssetType::AT_GESTURE == descendent_items[j]->getType()) + { + LLGestureManager::instance().deactivateGesture(descendent_items[j]->getUUID()); + } + } + } + } + removeBatchNoCheck(batch); +} + +void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch) +{ + // this method moves a bunch of items and folders to the trash. As + // per design guidelines for the inventory model, the message is + // built and the accounting is performed first. After all of that, + // we call LLInventoryModel::moveObject() to move everything + // around. + LLInvFVBridge* bridge; + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLMessageSystem* msg = gMessageSystem; + LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + LLViewerInventoryItem* item = NULL; + LLViewerInventoryCategory* cat = NULL; + std::vector<LLUUID> move_ids; + LLInventoryModel::update_map_t update; + bool start_new_message = true; + S32 count = batch.count(); + S32 i; + for(i = 0; i < count; ++i) + { + bridge = (LLInvFVBridge*)(batch.get(i)); + if(!bridge || !bridge->isItemRemovable()) continue; + item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID()); + if(item) + { + if(item->getParentUUID() == trash_id) continue; + move_ids.push_back(item->getUUID()); + LLPreview::hide(item->getUUID()); + --update[item->getParentUUID()]; + ++update[trash_id]; + if(start_new_message) + { + start_new_message = false; + msg->newMessageFast(_PREHASH_MoveInventoryItem); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addBOOLFast(_PREHASH_Stamp, TRUE); + } + msg->nextBlockFast(_PREHASH_InventoryData); + msg->addUUIDFast(_PREHASH_ItemID, item->getUUID()); + msg->addUUIDFast(_PREHASH_FolderID, trash_id); + msg->addString("NewName", NULL); + if(msg->isSendFullFast(_PREHASH_InventoryData)) + { + start_new_message = true; + gAgent.sendReliableMessage(); + gInventory.accountForUpdate(update); + update.clear(); + } + } + } + if(!start_new_message) + { + start_new_message = true; + gAgent.sendReliableMessage(); + gInventory.accountForUpdate(update); + update.clear(); + } + for(i = 0; i < count; ++i) + { + bridge = (LLInvFVBridge*)(batch.get(i)); + if(!bridge || !bridge->isItemRemovable()) continue; + cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID()); + if(cat) + { + if(cat->getParentUUID() == trash_id) continue; + move_ids.push_back(cat->getUUID()); + --update[cat->getParentUUID()]; + ++update[trash_id]; + if(start_new_message) + { + start_new_message = false; + msg->newMessageFast(_PREHASH_MoveInventoryFolder); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addBOOL("Stamp", TRUE); + } + msg->nextBlockFast(_PREHASH_InventoryData); + msg->addUUIDFast(_PREHASH_FolderID, cat->getUUID()); + msg->addUUIDFast(_PREHASH_ParentID, trash_id); + if(msg->isSendFullFast(_PREHASH_InventoryData)) + { + start_new_message = true; + gAgent.sendReliableMessage(); + gInventory.accountForUpdate(update); + update.clear(); + } + } + } + if(!start_new_message) + { + gAgent.sendReliableMessage(); + gInventory.accountForUpdate(update); + } + + // move everything. + std::vector<LLUUID>::iterator it = move_ids.begin(); + std::vector<LLUUID>::iterator end = move_ids.end(); + for(; it != end; ++it) + { + gInventory.moveObject((*it), trash_id); + } + + // notify inventory observers. + model->notifyObservers(); +} + +BOOL LLInvFVBridge::isClipboardPasteable() const +{ + if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) + { + return FALSE; + } + LLInventoryModel* model = getInventoryModel(); + if (!model) + { + return FALSE; + } + + const LLUUID &agent_id = gAgent.getID(); + + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + for(S32 i = 0; i < count; i++) + { + const LLUUID &item_id = objects.get(i); + + // Can't paste folders + const LLInventoryCategory *cat = model->getCategory(item_id); + if (cat) + { + return FALSE; + } + + const LLInventoryItem *item = model->getItem(item_id); + if (item) + { + if (!item->getPermissions().allowCopyBy(agent_id)) + { + return FALSE; + } + } + } + return TRUE; +} + +BOOL LLInvFVBridge::isClipboardPasteableAsLink() const +{ + if (!LLInventoryClipboard::instance().hasContents() || !isAgentInventory()) + { + return FALSE; + } + const LLInventoryModel* model = getInventoryModel(); + if (!model) + { + return FALSE; + } + + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + for(S32 i = 0; i < count; i++) + { + const LLInventoryItem *item = model->getItem(objects.get(i)); + if (item) + { + if (!LLAssetType::lookupCanLink(item->getActualType())) + { + return FALSE; + } + } + const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i)); + if (cat && !LLAssetType::lookupCanLink(cat->getPreferredType())) + { + return FALSE; + } + } + return TRUE; +} + +void hide_context_entries(LLMenuGL& menu, + const std::vector<std::string> &entries_to_show, + const std::vector<std::string> &disabled_entries) +{ + const LLView::child_list_t *list = menu.getChildList(); + + LLView::child_list_t::const_iterator itor; + for (itor = list->begin(); itor != list->end(); ++itor) + { + std::string name = (*itor)->getName(); + + // descend into split menus: + LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(*itor); + if ((name == "More") && branchp) + { + hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries); + } + + + bool found = false; + std::vector<std::string>::const_iterator itor2; + for (itor2 = entries_to_show.begin(); itor2 != entries_to_show.end(); ++itor2) + { + if (*itor2 == name) + { + found = true; + } + } + if (!found) + { + (*itor)->setVisible(FALSE); + } + else + { + for (itor2 = disabled_entries.begin(); itor2 != disabled_entries.end(); ++itor2) + { + if (*itor2 == name) + { + (*itor)->setEnabled(FALSE); + } + } + } + } +} + +// Helper for commonly-used entries +void LLInvFVBridge::getClipboardEntries(bool show_asset_id, + std::vector<std::string> &items, + std::vector<std::string> &disabled_items, U32 flags) +{ + items.push_back(std::string("Rename")); + if (!isItemRenameable() || (flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Rename")); + } + + if (show_asset_id) + { + items.push_back(std::string("Copy Asset UUID")); + if ( (! ( isItemPermissive() || gAgent.isGodlike() ) ) + || (flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Copy Asset UUID")); + } + } + + items.push_back(std::string("Copy Separator")); + + items.push_back(std::string("Copy")); + if (!isItemCopyable()) + { + disabled_items.push_back(std::string("Copy")); + } + + items.push_back(std::string("Paste")); + if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Paste")); + } + + items.push_back(std::string("Paste As Link")); + if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Paste As Link")); + } + items.push_back(std::string("Paste Separator")); + + items.push_back(std::string("Delete")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Delete")); + } + + // If multiple items are selected, disable properties (if it exists). + if ((flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Properties")); + } +} + +void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLInvFVBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("PurgeItem")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("PurgeItem")); + } + items.push_back(std::string("RestoreItem")); + } + else + { + items.push_back(std::string("Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + hide_context_entries(menu, items, disabled_items); +} + +// *TODO: remove this +BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const +{ + BOOL rv = FALSE; + + const LLInventoryObject* obj = getInventoryObject(); + + if(obj) + { + *type = LLAssetType::lookupDragAndDropType(obj->getActualType()); + if(*type == DAD_NONE) + { + return FALSE; + } + + *id = obj->getUUID(); + //object_ids.put(obj->getUUID()); + + if (*type == DAD_CATEGORY) + { + gInventory.startBackgroundFetch(obj->getUUID()); + } + + rv = TRUE; + } + + return rv; +} + +LLInventoryObject* LLInvFVBridge::getInventoryObject() const +{ + LLInventoryObject* obj = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + obj = (LLInventoryObject*)model->getObject(mUUID); + } + return obj; +} + +LLInventoryModel* LLInvFVBridge::getInventoryModel() const +{ + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + return panel ? panel->getModel() : NULL; +} + +BOOL LLInvFVBridge::isInTrash() const +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + return model->isObjectDescendentOf(mUUID, trash_id); +} + +BOOL LLInvFVBridge::isLinkedObjectInTrash() const +{ + if (isInTrash()) return TRUE; + + const LLInventoryObject *obj = getInventoryObject(); + if (obj && obj->getIsLinkType()) + { + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id); + } + return FALSE; +} + +BOOL LLInvFVBridge::isAgentInventory() const +{ + const LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + if(gInventory.getRootFolderID() == mUUID) return TRUE; + return model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); +} + +BOOL LLInvFVBridge::isCOFFolder() const +{ + const LLInventoryModel* model = getInventoryModel(); + if(!model) return TRUE; + const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id)) + { + return TRUE; + } + return FALSE; +} + +BOOL LLInvFVBridge::isItemPermissive() const +{ + return FALSE; +} + +// static +void LLInvFVBridge::changeItemParent(LLInventoryModel* model, + LLViewerInventoryItem* item, + const LLUUID& new_parent, + BOOL restamp) +{ + if(item->getParentUUID() != new_parent) + { + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); + update.push_back(new_folder); + gInventory.accountForUpdate(update); + + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->setParent(new_parent); + new_item->updateParentOnServer(restamp); + model->updateItem(new_item); + model->notifyObservers(); + } +} + +// static +void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model, + LLViewerInventoryCategory* cat, + const LLUUID& new_parent, + BOOL restamp) +{ + if(cat->getParentUUID() != new_parent) + { + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(new_parent, 1); + update.push_back(new_folder); + gInventory.accountForUpdate(update); + + LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); + new_cat->setParent(new_parent); + new_cat->updateParentOnServer(restamp); + model->updateCategory(new_cat); + model->notifyObservers(); + } +} + + +const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type) +{ + const std::string rv= LLInventoryType::lookup(inv_type); + if(rv.empty()) + { + return std::string("<invalid>"); + } + return rv; +} + +LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, + LLAssetType::EType actual_asset_type, + LLInventoryType::EType inv_type, + LLInventoryPanel* inventory, + const LLUUID& uuid, + U32 flags) +{ + LLInvFVBridge* new_listener = NULL; + switch(asset_type) + { + case LLAssetType::AT_TEXTURE: + if(!(inv_type == LLInventoryType::IT_TEXTURE || inv_type == LLInventoryType::IT_SNAPSHOT)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLTextureBridge(inventory, uuid, inv_type); + break; + + case LLAssetType::AT_SOUND: + if(!(inv_type == LLInventoryType::IT_SOUND)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLSoundBridge(inventory, uuid); + break; + + case LLAssetType::AT_LANDMARK: + if(!(inv_type == LLInventoryType::IT_LANDMARK)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLLandmarkBridge(inventory, uuid, flags); + break; + + case LLAssetType::AT_CALLINGCARD: + if(!(inv_type == LLInventoryType::IT_CALLINGCARD)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLCallingCardBridge(inventory, uuid); + break; + + case LLAssetType::AT_SCRIPT: + if(!(inv_type == LLInventoryType::IT_LSL)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLScriptBridge(inventory, uuid); + break; + + case LLAssetType::AT_OBJECT: + if(!(inv_type == LLInventoryType::IT_OBJECT || inv_type == LLInventoryType::IT_ATTACHMENT)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLObjectBridge(inventory, uuid, inv_type, flags); + break; + + case LLAssetType::AT_NOTECARD: + if(!(inv_type == LLInventoryType::IT_NOTECARD)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLNotecardBridge(inventory, uuid); + break; + + case LLAssetType::AT_ANIMATION: + if(!(inv_type == LLInventoryType::IT_ANIMATION)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLAnimationBridge(inventory, uuid); + break; + + case LLAssetType::AT_GESTURE: + if(!(inv_type == LLInventoryType::IT_GESTURE)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLGestureBridge(inventory, uuid); + break; + + case LLAssetType::AT_LSL_TEXT: + if(!(inv_type == LLInventoryType::IT_LSL)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLLSLTextBridge(inventory, uuid); + break; + + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_BODYPART: + if(!(inv_type == LLInventoryType::IT_WEARABLE)) + { + llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl; + } + new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags); + break; + case LLAssetType::AT_CATEGORY: + case LLAssetType::AT_ROOT_CATEGORY: + if (actual_asset_type == LLAssetType::AT_LINK_FOLDER) + { + // Create a link folder handler instead. + new_listener = new LLLinkFolderBridge(inventory, uuid); + break; + } + new_listener = new LLFolderBridge(inventory, uuid); + break; + case LLAssetType::AT_LINK: + // Only should happen for broken links. + new_listener = new LLLinkItemBridge(inventory, uuid); + break; + case LLAssetType::AT_LINK_FOLDER: + // Only should happen for broken links. + new_listener = new LLLinkItemBridge(inventory, uuid); + break; + default: + llinfos << "Unhandled asset type (llassetstorage.h): " + << (S32)asset_type << llendl; + break; + } + + if (new_listener) + { + new_listener->mInvType = inv_type; + } + + return new_listener; +} + +void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid) +{ + LLInventoryCategory* cat = model->getCategory(uuid); + if (cat) + { + model->purgeDescendentsOf(uuid); + model->notifyObservers(); + } + LLInventoryObject* obj = model->getObject(uuid); + if (obj) + { + model->purgeObject(uuid); + model->notifyObservers(); + } +} + +// +=================================================+ +// | InventoryFVBridgeBuilder | +// +=================================================+ +LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset_type, + LLAssetType::EType actual_asset_type, + LLInventoryType::EType inv_type, + LLInventoryPanel* inventory, + const LLUUID& uuid, + U32 flags /* = 0x00 */) const +{ + return LLInvFVBridge::createBridge(asset_type, + actual_asset_type, + inv_type, + inventory, + uuid, + flags); +} + +// +=================================================+ +// | LLItemBridge | +// +=================================================+ + +void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("goto" == action) + { + gotoItem(folder); + } + if ("open" == action) + { + openItem(); + return; + } + else if ("properties" == action) + { + showProperties(); + return; + } + else if ("purge" == action) + { + purgeItem(model, mUUID); + return; + } + else if ("restoreToWorld" == action) + { + restoreToWorld(); + return; + } + else if ("restore" == action) + { + restoreItem(); + return; + } + else if ("copy_uuid" == action) + { + // Single item only + LLInventoryItem* item = model->getItem(mUUID); + if(!item) return; + LLUUID asset_id = item->getAssetUUID(); + std::string buffer; + asset_id.toString(buffer); + + gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer)); + return; + } + else if ("copy" == action) + { + copyToClipboard(); + return; + } + else if ("paste" == action) + { + // Single item only + LLInventoryItem* itemp = model->getItem(mUUID); + if (!itemp) return; + + LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); + if (!folder_view_itemp) return; + + folder_view_itemp->getListener()->pasteFromClipboard(); + return; + } + else if ("paste_link" == action) + { + // Single item only + LLInventoryItem* itemp = model->getItem(mUUID); + if (!itemp) return; + + LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID()); + if (!folder_view_itemp) return; + + folder_view_itemp->getListener()->pasteLinkFromClipboard(); + return; + } +} + +void LLItemBridge::selectItem() +{ + LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); + if(item && !item->isComplete()) + { + item->fetchFromServer(); + } +} + +void LLItemBridge::restoreItem() +{ + LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); + if(item) + { + LLInventoryModel* model = getInventoryModel(); + const LLUUID new_parent = model->findCategoryUUIDForType(item->getType()); + // do not restamp on restore. + LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE); + } +} + +void LLItemBridge::restoreToWorld() +{ + LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem(); + if (itemp) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("RezRestoreToWorld"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + + msg->nextBlockFast(_PREHASH_InventoryData); + itemp->packMessage(msg); + msg->sendReliable(gAgent.getRegion()->getHost()); + } + + //Similar functionality to the drag and drop rez logic + BOOL remove_from_inventory = FALSE; + + //remove local inventory copy, sim will deal with permissions and removing the item + //from the actual inventory if its a no-copy etc + if(!itemp->getPermissions().allowCopyBy(gAgent.getID())) + { + remove_from_inventory = TRUE; + } + + // Check if it's in the trash. (again similar to the normal rez logic) + const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); + if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id)) + { + remove_from_inventory = TRUE; + } + + if(remove_from_inventory) + { + gInventory.deleteObject(itemp->getUUID()); + gInventory.notifyObservers(); + } +} + +void LLItemBridge::gotoItem(LLFolderView *folder) +{ + LLInventoryObject *obj = getInventoryObject(); + if (obj && obj->getIsLinkType()) + { + LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); + if (active_panel) + { + active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO); + } + } +} + +LLUIImagePtr LLItemBridge::getIcon() const +{ + return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]); +} + +PermissionMask LLItemBridge::getPermissionMask() const +{ + LLViewerInventoryItem* item = getItem(); + PermissionMask perm_mask = 0; + if(item) + { + BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); + BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); + BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, + gAgent.getID()); + + if (copy) perm_mask |= PERM_COPY; + if (mod) perm_mask |= PERM_MODIFY; + if (xfer) perm_mask |= PERM_TRANSFER; + + } + return perm_mask; +} + +const std::string& LLItemBridge::getDisplayName() const +{ + if(mDisplayName.empty()) + { + buildDisplayName(getItem(), mDisplayName); + } + return mDisplayName; +} + +void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name) +{ + if(item) + { + name.assign(item->getName()); + } + else + { + name.assign(LLStringUtil::null); + } +} + +LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const +{ + U8 font = LLFontGL::NORMAL; + + if( gAgentWearables.isWearingItem( mUUID ) ) + { + // llinfos << "BOLD" << llendl; + font |= LLFontGL::BOLD; + } + + const LLViewerInventoryItem* item = getItem(); + if (item && item->getIsLinkType()) + { + font |= LLFontGL::ITALIC; + } + return (LLFontGL::StyleFlags)font; +} + +std::string LLItemBridge::getLabelSuffix() const +{ + // String table is loaded before login screen and inventory items are + // loaded after login, so LLTrans should be ready. + static std::string NO_COPY =LLTrans::getString("no_copy"); + static std::string NO_MOD = LLTrans::getString("no_modify"); + static std::string NO_XFER = LLTrans::getString("no_transfer"); + static std::string LINK = LLTrans::getString("link"); + static std::string BROKEN_LINK = LLTrans::getString("broken_link"); + std::string suffix; + LLInventoryItem* item = getItem(); + if(item) + { + // it's a bit confusing to put nocopy/nomod/etc on calling cards. + if(LLAssetType::AT_CALLINGCARD != item->getType() + && item->getPermissions().getOwner() == gAgent.getID()) + { + BOOL broken_link = LLAssetType::lookupIsLinkType(item->getType()); + if (broken_link) return BROKEN_LINK; + + BOOL link = item->getIsLinkType(); + if (link) return LINK; + + BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID()); + if (!copy) + { + suffix += NO_COPY; + } + BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID()); + if (!mod) + { + suffix += NO_MOD; + } + BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, + gAgent.getID()); + if (!xfer) + { + suffix += NO_XFER; + } + } + } + return suffix; +} + +time_t LLItemBridge::getCreationDate() const +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + return item->getCreationDate(); + } + return 0; +} + + +BOOL LLItemBridge::isItemRenameable() const +{ + LLViewerInventoryItem* item = getItem(); + if(item) + { + // (For now) Don't allow calling card rename since that may confuse users as to + // what the calling card points to. + if (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD) + { + return FALSE; + } + return (item->getPermissions().allowModifyBy(gAgent.getID())); + } + return FALSE; +} + +BOOL LLItemBridge::renameItem(const std::string& new_name) +{ + if(!isItemRenameable()) + return FALSE; + LLPreview::dirty(mUUID); + LLInventoryModel* model = getInventoryModel(); + if(!model) + return FALSE; + LLViewerInventoryItem* item = getItem(); + if(item && (item->getName() != new_name)) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->rename(new_name); + buildDisplayName(new_item, mDisplayName); + new_item->updateServer(FALSE); + model->updateItem(new_item); + + model->notifyObservers(); + } + // return FALSE because we either notified observers (& therefore + // rebuilt) or we didn't update. + return FALSE; +} + + +BOOL LLItemBridge::removeItem() +{ + if(!isItemRemovable()) + { + return FALSE; + } + // move it to the trash + LLPreview::hide(mUUID, TRUE); + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + LLViewerInventoryItem* item = getItem(); + + // if item is not already in trash + if(item && !model->isObjectDescendentOf(mUUID, trash_id)) + { + // move to trash, and restamp + LLInvFVBridge::changeItemParent(model, item, trash_id, TRUE); + // delete was successful + return TRUE; + } + else + { + // tried to delete already item in trash (should purge?) + return FALSE; + } +} + +BOOL LLItemBridge::isItemCopyable() const +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + // can't copy worn objects. DEV-15183 + LLVOAvatarSelf *avatarp = gAgent.getAvatarObject(); + if( !avatarp ) + { + return FALSE; + } + + if(avatarp->isWearingAttachment(mUUID)) + { + return FALSE; + } + + // All items can be copied, not all can be pasted. + // The only time an item can't be copied is if it's a link + // return (item->getPermissions().allowCopyBy(gAgent.getID())); + if (item->getIsLinkType()) + { + return FALSE; + } + return TRUE; + } + return FALSE; +} +BOOL LLItemBridge::copyToClipboard() const +{ + if(isItemCopyable()) + { + LLInventoryClipboard::instance().add(mUUID); + return TRUE; + } + return FALSE; +} + +LLViewerInventoryItem* LLItemBridge::getItem() const +{ + LLViewerInventoryItem* item = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + item = (LLViewerInventoryItem*)model->getItem(mUUID); + } + return item; +} + +BOOL LLItemBridge::isItemPermissive() const +{ + LLViewerInventoryItem* item = getItem(); + if(item) + { + U32 mask = item->getPermissions().getMaskBase(); + if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) + { + return TRUE; + } + } + return FALSE; +} + +// +=================================================+ +// | LLFolderBridge | +// +=================================================+ + +LLFolderBridge* LLFolderBridge::sSelf=NULL; + +// Can be moved to another folder +BOOL LLFolderBridge::isItemMovable() const +{ + LLInventoryObject* obj = getInventoryObject(); + if(obj) + { + return (!LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)obj)->getPreferredType())); + } + return FALSE; +} + +void LLFolderBridge::selectItem() +{ +} + + +// Can be destroyed (or moved to trash) +BOOL LLFolderBridge::isItemRemovable() +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) + { + return FALSE; + } + + if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID())) + { + return FALSE; + } + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if( !avatar ) + { + return FALSE; + } + + LLInventoryCategory* category = model->getCategory(mUUID); + if( !category ) + { + return FALSE; + } + + if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) + { + return FALSE; + } + + LLInventoryModel::cat_array_t descendent_categories; + LLInventoryModel::item_array_t descendent_items; + gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); + + S32 i; + for( i = 0; i < descendent_categories.count(); i++ ) + { + LLInventoryCategory* category = descendent_categories[i]; + if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) + { + return FALSE; + } + } + + for( i = 0; i < descendent_items.count(); i++ ) + { + LLInventoryItem* item = descendent_items[i]; + if( (item->getType() == LLAssetType::AT_CLOTHING) || + (item->getType() == LLAssetType::AT_BODYPART) ) + { + if(gAgentWearables.isWearingItem(item->getUUID())) + { + return FALSE; + } + } + else + if( item->getType() == LLAssetType::AT_OBJECT ) + { + if(avatar->isWearingAttachment(item->getUUID())) + { + return FALSE; + } + } + } + + return TRUE; +} + +BOOL LLFolderBridge::isUpToDate() const +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); + if( !category ) + { + return FALSE; + } + + return category->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN; +} + +BOOL LLFolderBridge::isItemCopyable() const +{ + return TRUE; +} + +BOOL LLFolderBridge::copyToClipboard() const +{ + if(isItemCopyable()) + { + LLInventoryClipboard::instance().add(mUUID); + return TRUE; + } + return FALSE; +} + +BOOL LLFolderBridge::isClipboardPasteable() const +{ + if ( ! LLInvFVBridge::isClipboardPasteable() ) + return FALSE; + + // Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 + if ( LLFriendCardsManager::instance().isCategoryInFriendFolder( getCategory() ) ) + { + LLInventoryModel* model = getInventoryModel(); + if ( !model ) + { + return FALSE; + } + + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + const LLViewerInventoryCategory *current_cat = getCategory(); + + // Search for the direct descendent of current Friends subfolder among all pasted items, + // and return false if is found. + for(S32 i = objects.count() - 1; i >= 0; --i) + { + const LLUUID &obj_id = objects.get(i); + if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) + { + return FALSE; + } + } + + } + return TRUE; +} + +BOOL LLFolderBridge::isClipboardPasteableAsLink() const +{ + // Check normal paste-as-link permissions + if (!LLInvFVBridge::isClipboardPasteableAsLink()) + { + return FALSE; + } + + const LLInventoryModel* model = getInventoryModel(); + if (!model) + { + return FALSE; + } + + const LLViewerInventoryCategory *current_cat = getCategory(); + if (current_cat) + { + const BOOL is_in_friend_folder = LLFriendCardsManager::instance().isCategoryInFriendFolder( current_cat ); + const LLUUID ¤t_cat_id = current_cat->getUUID(); + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + for(S32 i = 0; i < count; i++) + { + const LLUUID &obj_id = objects.get(i); + const LLInventoryCategory *cat = model->getCategory(obj_id); + if (cat) + { + const LLUUID &cat_id = cat->getUUID(); + // Don't allow recursive pasting + if ((cat_id == current_cat_id) || + model->isObjectDescendentOf(current_cat_id, cat_id)) + { + return FALSE; + } + } + // Don't allow pasting duplicates to the Calling Card/Friends subfolders, see bug EXT-1599 + if ( is_in_friend_folder ) + { + // If object is direct descendent of current Friends subfolder than return false. + // Note: We can't use 'const LLInventoryCategory *cat', because it may be null + // in case type of obj_id is LLInventoryItem. + if ( LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(model->getObject(obj_id), current_cat) ) + { + return FALSE; + } + } + } + } + return TRUE; + +} + +BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, + BOOL drop) +{ + // This should never happen, but if an inventory item is incorrectly parented, + // the UI will get confused and pass in a NULL. + if(!inv_cat) return FALSE; + + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if(!avatar) return FALSE; + + // cannot drag categories into library + if(!isAgentInventory()) + { + return FALSE; + } + + // check to make sure source is agent inventory, and is represented there. + LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); + BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL) + && (LLToolDragAndDrop::SOURCE_AGENT == source); + + BOOL accept = FALSE; + S32 i; + LLInventoryModel::cat_array_t descendent_categories; + LLInventoryModel::item_array_t descendent_items; + if(is_agent_inventory) + { + const LLUUID& cat_id = inv_cat->getUUID(); + + // Is the destination the trash? + const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + BOOL move_is_into_trash = (mUUID == trash_id) + || model->isObjectDescendentOf(mUUID, trash_id); + BOOL is_movable = (!LLAssetType::lookupIsProtectedCategoryType(inv_cat->getPreferredType())); + LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); + BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); + if (move_is_into_current_outfit || move_is_into_outfit) + { + // BAP - restrictions? + is_movable = true; + } + + if (mUUID == gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE)) + { + is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604 + } + + if( is_movable ) + { + gInventory.collectDescendents( cat_id, descendent_categories, descendent_items, FALSE ); + + for( i = 0; i < descendent_categories.count(); i++ ) + { + LLInventoryCategory* category = descendent_categories[i]; + if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) + { + // ...can't move "special folders" like Textures + is_movable = FALSE; + break; + } + } + + if( is_movable ) + { + if( move_is_into_trash ) + { + for( i = 0; i < descendent_items.count(); i++ ) + { + LLInventoryItem* item = descendent_items[i]; + if( (item->getType() == LLAssetType::AT_CLOTHING) || + (item->getType() == LLAssetType::AT_BODYPART) ) + { + if( gAgentWearables.isWearingItem( item->getUUID() ) ) + { + is_movable = FALSE; // It's generally movable, but not into the trash! + break; + } + } + else + if( item->getType() == LLAssetType::AT_OBJECT ) + { + if( avatar->isWearingAttachment( item->getUUID() ) ) + { + is_movable = FALSE; // It's generally movable, but not into the trash! + break; + } + } + } + } + } + } + + + accept = is_movable + && (mUUID != cat_id) // Can't move a folder into itself + && (mUUID != inv_cat->getParentUUID()) // Avoid moves that would change nothing + && !(model->isObjectDescendentOf(mUUID, cat_id)); // Avoid circularity + if(accept && drop) + { + // Look for any gestures and deactivate them + if (move_is_into_trash) + { + for (i = 0; i < descendent_items.count(); i++) + { + LLInventoryItem* item = descendent_items[i]; + if (item->getType() == LLAssetType::AT_GESTURE + && LLGestureManager::instance().isGestureActive(item->getUUID())) + { + LLGestureManager::instance().deactivateGesture(item->getUUID()); + } + } + } + // if target is an outfit or current outfit folder we use link + if (move_is_into_current_outfit || move_is_into_outfit) + { +#if SUPPORT_ENSEMBLES + // BAP - should skip if dup. + if (move_is_into_current_outfit) + { + LLAppearanceManager::wearEnsemble(inv_cat); + } + else + { + LLPointer<LLInventoryCallback> cb = NULL; + link_inventory_item( + gAgent.getID(), + inv_cat->getUUID(), + mUUID, + inv_cat->getName(), + LLAssetType::AT_LINK_FOLDER, + cb); + } +#endif + } + else + { + + // Reparent the folder and restamp children if it's moving + // into trash. + LLInvFVBridge::changeCategoryParent( + model, + (LLViewerInventoryCategory*)inv_cat, + mUUID, + move_is_into_trash); + } + } + } + else if(LLToolDragAndDrop::SOURCE_WORLD == source) + { + // content category has same ID as object itself + LLUUID object_id = inv_cat->getUUID(); + LLUUID category_id = mUUID; + accept = move_inv_category_world_to_agent(object_id, category_id, drop); + } + return accept; +} + +void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv) +{ + const char* dialog = NULL; + if (object->flagScripted()) + { + dialog = "MoveInventoryFromScriptedObject"; + } + else + { + dialog = "MoveInventoryFromObject"; + } + LLNotifications::instance().add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv)); +} + +// Move/copy all inventory items from the Contents folder of an in-world +// object to the agent's inventory, inside a given category. +BOOL move_inv_category_world_to_agent(const LLUUID& object_id, + const LLUUID& category_id, + BOOL drop, + void (*callback)(S32, void*), + void* user_data) +{ + // Make sure the object exists. If we allowed dragging from + // anonymous objects, it would be possible to bypass + // permissions. + // content category has same ID as object itself + LLViewerObject* object = gObjectList.findObject(object_id); + if(!object) + { + llinfos << "Object not found for drop." << llendl; + return FALSE; + } + + // this folder is coming from an object, as there is only one folder in an object, the root, + // we need to collect the entire contents and handle them as a group + InventoryObjectList inventory_objects; + object->getInventoryContents(inventory_objects); + + if (inventory_objects.empty()) + { + llinfos << "Object contents not found for drop." << llendl; + return FALSE; + } + + BOOL accept = TRUE; + BOOL is_move = FALSE; + + // coming from a task. Need to figure out if the person can + // move/copy this item. + InventoryObjectList::iterator it = inventory_objects.begin(); + InventoryObjectList::iterator end = inventory_objects.end(); + for ( ; it != end; ++it) + { + // coming from a task. Need to figure out if the person can + // move/copy this item. + LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions()); + if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) + && perm.allowTransferTo(gAgent.getID()))) +// || gAgent.isGodlike()) + { + accept = TRUE; + } + else if(object->permYouOwner()) + { + // If the object cannot be copied, but the object the + // inventory is owned by the agent, then the item can be + // moved from the task to agent inventory. + is_move = TRUE; + accept = TRUE; + } + else + { + accept = FALSE; + break; + } + } + + if(drop && accept) + { + it = inventory_objects.begin(); + InventoryObjectList::iterator first_it = inventory_objects.begin(); + LLMoveInv* move_inv = new LLMoveInv; + move_inv->mObjectID = object_id; + move_inv->mCategoryID = category_id; + move_inv->mCallback = callback; + move_inv->mUserData = user_data; + + for ( ; it != end; ++it) + { + two_uuids_t two(category_id, (*it)->getUUID()); + move_inv->mMoveList.push_back(two); + } + + if(is_move) + { + // Callback called from within here. + warn_move_inventory(object, move_inv); + } + else + { + LLNotification::Params params("MoveInventoryFromObject"); + params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); + LLNotifications::instance().forceResponse(params, 0); + } + } + return accept; +} + +bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + // Valid COF items are: + // - links to wearables (body parts or clothing) + // - links to attachments + // - links to gestures + // - links to ensemble folders + LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem(); // BAP - safe? + if (linked_item) + { + LLAssetType::EType type = linked_item->getType(); + return (type == LLAssetType::AT_CLOTHING || + type == LLAssetType::AT_BODYPART || + type == LLAssetType::AT_GESTURE || + type == LLAssetType::AT_OBJECT); + } + else + { + LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe? + // BAP remove AT_NONE support after ensembles are fully working? + return (linked_category && + ((linked_category->getPreferredType() == LLAssetType::AT_NONE) || + (LLAssetType::lookupIsEnsembleCategoryType(linked_category->getPreferredType())))); + } +} + + +bool LLFindWearables::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + if(item) + { + if((item->getType() == LLAssetType::AT_CLOTHING) + || (item->getType() == LLAssetType::AT_BODYPART)) + { + return TRUE; + } + } + return FALSE; +} + + + +//Used by LLFolderBridge as callback for directory recursion. +class LLRightClickInventoryFetchObserver : public LLInventoryFetchObserver +{ +public: + LLRightClickInventoryFetchObserver() : + mCopyItems(false) + { }; + LLRightClickInventoryFetchObserver(const LLUUID& cat_id, bool copy_items) : + mCatID(cat_id), + mCopyItems(copy_items) + { }; + virtual void done() + { + // we've downloaded all the items, so repaint the dialog + LLFolderBridge::staticFolderOptionsMenu(); + + gInventory.removeObserver(this); + delete this; + } + + +protected: + LLUUID mCatID; + bool mCopyItems; + +}; + +//Used by LLFolderBridge as callback for directory recursion. +class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver +{ +public: + LLRightClickInventoryFetchDescendentsObserver(bool copy_items) : mCopyItems(copy_items) {} + ~LLRightClickInventoryFetchDescendentsObserver() {} + virtual void done(); +protected: + bool mCopyItems; +}; + +void LLRightClickInventoryFetchDescendentsObserver::done() +{ + // Avoid passing a NULL-ref as mCompleteFolders.front() down to + // gInventory.collectDescendents() + if( mCompleteFolders.empty() ) + { + llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl; + dec_busy_count(); + gInventory.removeObserver(this); + delete this; + return; + } + + // What we do here is get the complete information on the items in + // the library, and set up an observer that will wait for that to + // happen. + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + gInventory.collectDescendents(mCompleteFolders.front(), + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH); + S32 count = item_array.count(); +#if 0 // HACK/TODO: Why? + // This early causes a giant menu to get produced, and doesn't seem to be needed. + if(!count) + { + llwarns << "Nothing fetched in category " << mCompleteFolders.front() + << llendl; + dec_busy_count(); + gInventory.removeObserver(this); + delete this; + return; + } +#endif + + LLRightClickInventoryFetchObserver* outfit; + outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems); + LLInventoryFetchObserver::item_ref_t ids; + for(S32 i = 0; i < count; ++i) + { + ids.push_back(item_array.get(i)->getUUID()); + } + + // clean up, and remove this as an observer since the call to the + // outfit could notify observers and throw us into an infinite + // loop. + dec_busy_count(); + gInventory.removeObserver(this); + delete this; + + // increment busy count and either tell the inventory to check & + // call done, or add this object to the inventory for observation. + inc_busy_count(); + + // do the fetch + outfit->fetchItems(ids); + outfit->done(); //Not interested in waiting and this will be right 99% of the time. +//Uncomment the following code for laggy Inventory UI. +/* if(outfit->isEverythingComplete()) + { + // everything is already here - call done. + outfit->done(); + } + else + { + // it's all on it's way - add an observer, and the inventory + // will call done for us when everything is here. + gInventory.addObserver(outfit); + }*/ +} + + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryWearObserver +// +// Observer for "copy and wear" operation to support knowing +// when the all of the contents have been added to inventory. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryCopyAndWearObserver : public LLInventoryObserver +{ +public: + LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {} + virtual ~LLInventoryCopyAndWearObserver() {} + virtual void changed(U32 mask); + +protected: + LLUUID mCatID; + int mContentsCount; + BOOL mFolderAdded; +}; + + + +void LLInventoryCopyAndWearObserver::changed(U32 mask) +{ + if((mask & (LLInventoryObserver::ADD)) != 0) + { + if (!mFolderAdded) + { + const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); + + std::set<LLUUID>::const_iterator id_it = changed_items.begin(); + std::set<LLUUID>::const_iterator id_end = changed_items.end(); + for (;id_it != id_end; ++id_it) + { + if ((*id_it) == mCatID) + { + mFolderAdded = TRUE; + break; + } + } + } + + if (mFolderAdded) + { + LLViewerInventoryCategory* category = gInventory.getCategory(mCatID); + + if (NULL == category) + { + llwarns << "gInventory.getCategory(" << mCatID + << ") was NULL" << llendl; + } + else + { + if (category->getDescendentCount() == + mContentsCount) + { + gInventory.removeObserver(this); + LLAppearanceManager::wearInventoryCategory(category, FALSE, TRUE); + delete this; + } + } + } + + } +} + + + +void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("open" == action) + { + openItem(); + return; + } + else if ("paste" == action) + { + pasteFromClipboard(); + return; + } + else if ("paste_link" == action) + { + pasteLinkFromClipboard(); + return; + } + else if ("properties" == action) + { + showProperties(); + return; + } + else if ("replaceoutfit" == action) + { + modifyOutfit(FALSE); + return; + } +#if SUPPORT_ENSEMBLES + else if ("wearasensemble" == action) + { + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLViewerInventoryCategory* cat = getCategory(); + if(!cat) return; + LLAppearanceManager::wearEnsemble(cat,true); + return; + } +#endif + else if ("addtooutfit" == action) + { + modifyOutfit(TRUE); + return; + } + else if ("copy" == action) + { + copyToClipboard(); + return; + } + else if ("removefromoutfit" == action) + { + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLViewerInventoryCategory* cat = getCategory(); + if(!cat) return; + + remove_inventory_category_from_avatar ( cat ); + return; + } + else if ("purge" == action) + { + purgeItem(model, mUUID); + return; + } + else if ("restore" == action) + { + restoreItem(); + return; + } +} + +void LLFolderBridge::openItem() +{ + lldebugs << "LLFolderBridge::openItem()" << llendl; + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + bool fetching_inventory = model->fetchDescendentsOf(mUUID); + // Only change folder type if we have the folder contents. + if (!fetching_inventory) + { + // Disabling this for now, it's causing crash when new items are added to folders + // since folder type may change before new item item has finished processing. + // determineFolderType(); + } +} + +void LLFolderBridge::closeItem() +{ + determineFolderType(); +} + +void LLFolderBridge::determineFolderType() +{ + if (isUpToDate()) + { + LLInventoryModel* model = getInventoryModel(); + LLViewerInventoryCategory* category = model->getCategory(mUUID); + category->determineFolderType(); + } +} + +BOOL LLFolderBridge::isItemRenameable() const +{ + LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory(); + if(cat && !LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType()) + && (cat->getOwnerID() == gAgent.getID())) + { + return TRUE; + } + return FALSE; +} + +void LLFolderBridge::restoreItem() +{ + LLViewerInventoryCategory* cat; + cat = (LLViewerInventoryCategory*)getCategory(); + if(cat) + { + LLInventoryModel* model = getInventoryModel(); + LLUUID new_parent = model->findCategoryUUIDForType(cat->getType()); + // do not restamp children on restore + LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE); + } +} + +LLAssetType::EType LLFolderBridge::getPreferredType() const +{ + LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + LLViewerInventoryCategory* cat = getCategory(); + if(cat) + { + preferred_type = cat->getPreferredType(); + } + + return preferred_type; +} + +// Icons for folders are based on the preferred type +LLUIImagePtr LLFolderBridge::getIcon() const +{ + LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + LLViewerInventoryCategory* cat = getCategory(); + if(cat) + { + preferred_type = cat->getPreferredType(); + } + return getIcon(preferred_type); +} + +LLUIImagePtr LLFolderBridge::getIcon(LLAssetType::EType preferred_type) +{ + // we only have one folder image now + return LLUI::getUIImage("Inv_FolderClosed"); +} + +BOOL LLFolderBridge::renameItem(const std::string& new_name) +{ + if(!isItemRenameable()) + return FALSE; + LLInventoryModel* model = getInventoryModel(); + if(!model) + return FALSE; + LLViewerInventoryCategory* cat = getCategory(); + if(cat && (cat->getName() != new_name)) + { + LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat); + new_cat->rename(new_name); + new_cat->updateServer(FALSE); + model->updateCategory(new_cat); + + model->notifyObservers(); + } + // return FALSE because we either notified observers (& therefore + // rebuilt) or we didn't update. + return FALSE; +} + +BOOL LLFolderBridge::removeItem() +{ + if(!isItemRemovable()) + { + return FALSE; + } + // move it to the trash + LLPreview::hide(mUUID); + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + + LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + + // Look for any gestures and deactivate them + LLInventoryModel::cat_array_t descendent_categories; + LLInventoryModel::item_array_t descendent_items; + gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE ); + + S32 i; + for (i = 0; i < descendent_items.count(); i++) + { + LLInventoryItem* item = descendent_items[i]; + if (item->getType() == LLAssetType::AT_GESTURE + && LLGestureManager::instance().isGestureActive(item->getUUID())) + { + LLGestureManager::instance().deactivateGesture(item->getUUID()); + } + } + + // go ahead and do the normal remove if no 'last calling + // cards' are being removed. + LLViewerInventoryCategory* cat = getCategory(); + if(cat) + { + LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE); + } + + return TRUE; +} + +void LLFolderBridge::pasteFromClipboard() +{ + LLInventoryModel* model = getInventoryModel(); + if(model && isClipboardPasteable()) + { + LLInventoryItem* item = NULL; + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + const LLUUID parent_id(mUUID); + for(S32 i = 0; i < count; i++) + { + item = model->getItem(objects.get(i)); + if (item) + { + if(LLInventoryClipboard::instance().isCutMode()) + { + // move_inventory_item() is not enough, + //we have to update inventory locally too + changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE); + } + else + { + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + parent_id, + std::string(), + LLPointer<LLInventoryCallback>(NULL)); + } + } + } + } +} + +void LLFolderBridge::pasteLinkFromClipboard() +{ + const LLInventoryModel* model = getInventoryModel(); + if(model) + { + LLDynamicArray<LLUUID> objects; + LLInventoryClipboard::instance().retrieve(objects); + S32 count = objects.count(); + LLUUID parent_id(mUUID); + for(S32 i = 0; i < count; i++) + { + const LLUUID &object_id = objects.get(i); +#if SUPPORT_ENSEMBLES + if (LLInventoryCategory *cat = model->getCategory(object_id)) + { + link_inventory_item( + gAgent.getID(), + cat->getUUID(), + parent_id, + cat->getName(), + LLAssetType::AT_LINK_FOLDER, + LLPointer<LLInventoryCallback>(NULL)); + } + else +#endif + if (LLInventoryItem *item = model->getItem(object_id)) + { + link_inventory_item( + gAgent.getID(), + item->getUUID(), + parent_id, + item->getName(), + LLAssetType::AT_LINK, + LLPointer<LLInventoryCallback>(NULL)); + } + } + } +} + +void LLFolderBridge::staticFolderOptionsMenu() +{ + if (!sSelf) return; + sSelf->folderOptionsMenu(); +} + +void LLFolderBridge::folderOptionsMenu() +{ + std::vector<std::string> disabled_items; + + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + + const LLInventoryCategory* category = model->getCategory(mUUID); + LLAssetType::EType type = category->getPreferredType(); + const bool is_default_folder = category && LLAssetType::lookupIsProtectedCategoryType(type); + // BAP change once we're no longer treating regular categories as ensembles. + const bool is_ensemble = category && (type == LLAssetType::AT_NONE || + LLAssetType::lookupIsEnsembleCategoryType(type)); + + // calling card related functionality for folders. + + // Only enable calling-card related options for non-default folders. + if (!is_default_folder) + { + LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); + if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard)) + { + mItems.push_back(std::string("Calling Card Separator")); + mItems.push_back(std::string("Conference Chat Folder")); + mItems.push_back(std::string("IM All Contacts In Folder")); + } + } + + // wearables related functionality for folders. + //is_wearable + LLFindWearables is_wearable; + LLIsType is_object( LLAssetType::AT_OBJECT ); + LLIsType is_gesture( LLAssetType::AT_GESTURE ); + + if (mWearables || + checkFolderForContentsOfType(model, is_wearable) || + checkFolderForContentsOfType(model, is_object) || + checkFolderForContentsOfType(model, is_gesture) ) + { + mItems.push_back(std::string("Folder Wearables Separator")); + + // Only enable add/replace outfit for non-default folders. + if (!is_default_folder) + { + mItems.push_back(std::string("Add To Outfit")); + mItems.push_back(std::string("Replace Outfit")); + } + if (is_ensemble) + { + mItems.push_back(std::string("Wear As Ensemble")); + } + mItems.push_back(std::string("Take Off Items")); + } + hide_context_entries(*mMenu, mItems, disabled_items); +} + +BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& is_type) +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + model->collectDescendentsIf(mUUID, + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_type); + return ((item_array.count() > 0) ? TRUE : FALSE ); +} + +// Flags unused +void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + mItems.clear(); + mDisabledItems.clear(); + + lldebugs << "LLFolderBridge::buildContextMenu()" << llendl; +// std::vector<std::string> disabled_items; + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); + + mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point) + mDisabledItems.clear(); //adding code to clear out disabled members from previous + if (lost_and_found_id == mUUID) + { + // This is the lost+found folder. + mItems.push_back(std::string("Empty Lost And Found")); + } + + if(trash_id == mUUID) + { + // This is the trash. + mItems.push_back(std::string("Empty Trash")); + } + else if(model->isObjectDescendentOf(mUUID, trash_id)) + { + // This is a folder in the trash. + mItems.clear(); // clear any items that used to exist + mItems.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + mDisabledItems.push_back(std::string("Purge Item")); + } + + mItems.push_back(std::string("Restore Item")); + } + else if(isAgentInventory()) // do not allow creating in library + { + LLViewerInventoryCategory *cat = getCategory(); + + // BAP removed protected check to re-enable standard ops in untyped folders. + // Not sure what the right thing is to do here. + if (!isCOFFolder() && cat /*&& + LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/) + { + // Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694. + if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat)) + mItems.push_back(std::string("New Folder")); + mItems.push_back(std::string("New Script")); + mItems.push_back(std::string("New Note")); + mItems.push_back(std::string("New Gesture")); + mItems.push_back(std::string("New Clothes")); + mItems.push_back(std::string("New Body Parts")); + mItems.push_back(std::string("Change Type")); + + LLViewerInventoryCategory *cat = getCategory(); + if (cat && LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())) + { + mDisabledItems.push_back(std::string("Change Type")); + } + + getClipboardEntries(false, mItems, mDisabledItems, flags); + } + else + { + // Want some but not all of the items from getClipboardEntries for outfits. + if (cat && cat->getPreferredType()==LLAssetType::AT_OUTFIT) + { + mItems.push_back(std::string("Rename")); + mItems.push_back(std::string("Delete")); + } + } + + //Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06 + mCallingCards = mWearables = FALSE; + + LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); + if (checkFolderForContentsOfType(model, is_callingcard)) + { + mCallingCards=TRUE; + } + + LLFindWearables is_wearable; + LLIsType is_object( LLAssetType::AT_OBJECT ); + LLIsType is_gesture( LLAssetType::AT_GESTURE ); + + if (checkFolderForContentsOfType(model, is_wearable) || + checkFolderForContentsOfType(model, is_object) || + checkFolderForContentsOfType(model, is_gesture) ) + { + mWearables=TRUE; + } + + mMenu = &menu; + sSelf = this; + LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE); + + LLInventoryFetchDescendentsObserver::folder_ref_t folders; + LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID); + if (category) + { + folders.push_back(category->getUUID()); + } + fetch->fetchDescendents(folders); + inc_busy_count(); + if(fetch->isEverythingComplete()) + { + // everything is already here - call done. + fetch->done(); + } + else + { + // it's all on it's way - add an observer, and the inventory + // will call done for us when everything is here. + gInventory.addObserver(fetch); + } + } + else + { + mItems.push_back(std::string("--no options--")); + mDisabledItems.push_back(std::string("--no options--")); + } + hide_context_entries(menu, mItems, mDisabledItems); +} + +BOOL LLFolderBridge::hasChildren() const +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + LLInventoryModel::EHasChildren has_children; + has_children = gInventory.categoryHasChildren(mUUID); + return has_children != LLInventoryModel::CHILDREN_NO; +} + +BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data) +{ + //llinfos << "LLFolderBridge::dragOrDrop()" << llendl; + BOOL accept = FALSE; + switch(cargo_type) + { + case DAD_TEXTURE: + case DAD_SOUND: + case DAD_CALLINGCARD: + case DAD_LANDMARK: + case DAD_SCRIPT: + case DAD_OBJECT: + case DAD_NOTECARD: + case DAD_CLOTHING: + case DAD_BODYPART: + case DAD_ANIMATION: + case DAD_GESTURE: + case DAD_LINK: + accept = dragItemIntoFolder((LLInventoryItem*)cargo_data, + drop); + break; + case DAD_CATEGORY: + if (LLFriendCardsManager::instance().isAnyFriendCategory(mUUID)) + { + accept = FALSE; + } + else + { + accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop); + } + break; + default: + break; + } + return accept; +} + +LLViewerInventoryCategory* LLFolderBridge::getCategory() const +{ + LLViewerInventoryCategory* cat = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + cat = (LLViewerInventoryCategory*)model->getCategory(mUUID); + } + return cat; +} + + +// static +void LLFolderBridge::pasteClipboard(void* user_data) +{ + LLFolderBridge* self = (LLFolderBridge*)user_data; + if(self) self->pasteFromClipboard(); +} + +void LLFolderBridge::createNewCategory(void* user_data) +{ + LLFolderBridge* bridge = (LLFolderBridge*)user_data; + if(!bridge) return; + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(bridge->mInventoryPanel.get()); + if (!panel) return; + LLInventoryModel* model = panel->getModel(); + if(!model) return; + LLUUID id; + id = model->createNewCategory(bridge->getUUID(), + LLAssetType::AT_NONE, + LLStringUtil::null); + model->notifyObservers(); + + // At this point, the bridge has probably been deleted, but the + // view is still there. + panel->setSelection(id, TAKE_FOCUS_YES); +} + +void LLFolderBridge::createNewShirt(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHIRT); +} + +void LLFolderBridge::createNewPants(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PANTS); +} + +void LLFolderBridge::createNewShoes(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHOES); +} + +void LLFolderBridge::createNewSocks(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SOCKS); +} + +void LLFolderBridge::createNewJacket(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_JACKET); +} + +void LLFolderBridge::createNewSkirt(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIRT); +} + +void LLFolderBridge::createNewGloves(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_GLOVES); +} + +void LLFolderBridge::createNewUndershirt(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERSHIRT); +} + +void LLFolderBridge::createNewUnderpants(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS); +} + +void LLFolderBridge::createNewShape(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE); +} + +void LLFolderBridge::createNewSkin(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIN); +} + +void LLFolderBridge::createNewHair(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_HAIR); +} + +void LLFolderBridge::createNewEyes(void* user_data) +{ + LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES); +} + +// static +void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type) +{ + if(!bridge) return; + LLUUID parent_id = bridge->getUUID(); + createWearable(parent_id, type); +} + +// Separate function so can be called by global menu as well as right-click +// menu. +// static +void LLFolderBridge::createWearable(LLUUID parent_id, EWearableType type) +{ + LLWearable* wearable = LLWearableList::instance().createNewWearable(type); + LLAssetType::EType asset_type = wearable->getAssetType(); + LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE; + create_inventory_item(gAgent.getID(), gAgent.getSessionID(), + parent_id, wearable->getTransactionID(), wearable->getName(), + wearable->getDescription(), asset_type, inv_type, wearable->getType(), + wearable->getPermissions().getMaskNextOwner(), + LLPointer<LLInventoryCallback>(NULL)); +} + +void LLFolderBridge::modifyOutfit(BOOL append) +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return; + LLViewerInventoryCategory* cat = getCategory(); + if(!cat) return; + + // BAP - was: + // wear_inventory_category_on_avatar( cat, append ); + LLAppearanceManager::wearInventoryCategory( cat, FALSE, append ); +} + +// helper stuff +bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv* move_inv) +{ + LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData; + LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID); + S32 option = LLNotification::getSelectedOption(notification, response); + + if(option == 0 && object) + { + if (cat_and_wear && cat_and_wear->mWear) + { + InventoryObjectList inventory_objects; + object->getInventoryContents(inventory_objects); + int contents_count = inventory_objects.size()-1; //subtract one for containing folder + + LLInventoryCopyAndWearObserver* inventoryObserver = new LLInventoryCopyAndWearObserver(cat_and_wear->mCatID, contents_count); + gInventory.addObserver(inventoryObserver); + } + + two_uuids_list_t::iterator move_it; + for (move_it = move_inv->mMoveList.begin(); + move_it != move_inv->mMoveList.end(); + ++move_it) + { + object->moveInventory(move_it->first, move_it->second); + } + + // update the UI. + dialog_refresh_all(); + } + + if (move_inv->mCallback) + { + move_inv->mCallback(option, move_inv->mUserData); + } + + delete move_inv; + return false; +} + +/* +Next functions intended to reorder items in the inventory folder and save order on server +Is now used for Favorites folder. + +*TODO: refactoring is needed with Favorites Bar functionality. Probably should be moved in LLInventoryModel +*/ +void saveItemsOrder(LLInventoryModel::item_array_t& items) +{ + int sortField = 0; + + // current order is saved by setting incremental values (1, 2, 3, ...) for the sort field + for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) + { + LLViewerInventoryItem* item = *i; + + item->setSortField(++sortField); + item->setComplete(TRUE); + item->updateServer(FALSE); + + gInventory.updateItem(item); + } + + gInventory.notifyObservers(); +} + +LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_array_t& items, const LLUUID& id) +{ + LLInventoryModel::item_array_t::iterator result = items.end(); + + for (LLInventoryModel::item_array_t::iterator i = items.begin(); i != items.end(); ++i) + { + if ((*i)->getUUID() == id) + { + result = i; + break; + } + } + + return result; +} + +void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId) +{ + LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId); + LLViewerInventoryItem* destItem = gInventory.getItem(destItemId); + + items.erase(findItemByUUID(items, srcItem->getUUID())); + items.insert(findItemByUUID(items, destItem->getUUID()), srcItem); +} + +BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, + BOOL drop) +{ + LLInventoryModel* model = getInventoryModel(); + if(!model) return FALSE; + + // cannot drag into library + if(!isAgentInventory()) + { + return FALSE; + } + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if(!avatar) return FALSE; + + LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); + BOOL accept = FALSE; + LLViewerObject* object = NULL; + if(LLToolDragAndDrop::SOURCE_AGENT == source) + { + + BOOL is_movable = TRUE; + switch( inv_item->getActualType() ) + { + case LLAssetType::AT_ROOT_CATEGORY: + is_movable = FALSE; + break; + + case LLAssetType::AT_CATEGORY: + is_movable = !LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)inv_item)->getPreferredType()); + break; + default: + break; + } + + LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); + BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); + LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); + BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); + BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); + + if(is_movable && move_is_into_trash) + { + switch(inv_item->getType()) + { + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_BODYPART: + is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID()); + break; + + case LLAssetType::AT_OBJECT: + is_movable = !avatar->isWearingAttachment(inv_item->getUUID()); + break; + default: + break; + } + } + + if ( is_movable ) + { + // Don't allow creating duplicates in the Calling Card/Friends + // subfolders, see bug EXT-1599. Check is item direct descendent + // of target folder and forbid item's movement if it so. + // Note: isItemDirectDescendentOfCategory checks if + // passed category is in the Calling Card/Friends folder + is_movable = ! LLFriendCardsManager::instance() + .isObjDirectDescendentOfCategory (inv_item, getCategory()); + } + + LLUUID favorites_id = model->findCategoryUUIDForType(LLAssetType::AT_FAVORITE); + + // we can move item inside a folder only if this folder is Favorites. See EXT-719 + accept = is_movable && ((mUUID != inv_item->getParentUUID()) || (mUUID == favorites_id)); + if(accept && drop) + { + if (inv_item->getType() == LLAssetType::AT_GESTURE + && LLGestureManager::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash) + { + LLGestureManager::instance().deactivateGesture(inv_item->getUUID()); + } + // If an item is being dragged between windows, unselect + // everything in the active window so that we don't follow + // the selection to its new location (which is very + // annoying). + if (LLFloaterInventory::getActiveInventory()) + { + LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel(); + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + if (active_panel && (panel != active_panel)) + { + active_panel->unSelectAll(); + } + } + + // if dragging from/into favorites folder only reorder items + if ((mUUID == inv_item->getParentUUID()) && (favorites_id == mUUID)) + { + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLIsType is_type(LLAssetType::AT_LANDMARK); + model->collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); + + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; + if (itemp) + { + LLUUID srcItemId = inv_item->getUUID(); + LLUUID destItemId = itemp->getListener()->getUUID(); + + // update order + updateItemsOrder(items, srcItemId, destItemId); + + saveItemsOrder(items); + } + } + else if (favorites_id == mUUID) // if target is the favorites folder we use copy + { + copy_inventory_item( + gAgent.getID(), + inv_item->getPermissions().getOwner(), + inv_item->getUUID(), + mUUID, + std::string(), + LLPointer<LLInventoryCallback>(NULL)); + } + else if (move_is_into_current_outfit || move_is_into_outfit) + { + // BAP - should skip if dup. + if (move_is_into_current_outfit) + { + LLAppearanceManager::wearItem(inv_item); + } + else + { + LLPointer<LLInventoryCallback> cb = NULL; + link_inventory_item( + gAgent.getID(), + inv_item->getUUID(), + mUUID, + std::string(), + LLAssetType::AT_LINK, + cb); + } + } + else + { + // restamp if the move is into the trash. + LLInvFVBridge::changeItemParent( + model, + (LLViewerInventoryItem*)inv_item, + mUUID, + move_is_into_trash); + } + } + } + else if(LLToolDragAndDrop::SOURCE_WORLD == source) + { + // Make sure the object exists. If we allowed dragging from + // anonymous objects, it would be possible to bypass + // permissions. + object = gObjectList.findObject(inv_item->getParentUUID()); + if(!object) + { + llinfos << "Object not found for drop." << llendl; + return FALSE; + } + + // coming from a task. Need to figure out if the person can + // move/copy this item. + LLPermissions perm(inv_item->getPermissions()); + BOOL is_move = FALSE; + if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) + && perm.allowTransferTo(gAgent.getID()))) +// || gAgent.isGodlike()) + + { + accept = TRUE; + } + else if(object->permYouOwner()) + { + // If the object cannot be copied, but the object the + // inventory is owned by the agent, then the item can be + // moved from the task to agent inventory. + is_move = TRUE; + accept = TRUE; + } + if(drop && accept) + { + LLMoveInv* move_inv = new LLMoveInv; + move_inv->mObjectID = inv_item->getParentUUID(); + two_uuids_t item_pair(mUUID, inv_item->getUUID()); + move_inv->mMoveList.push_back(item_pair); + move_inv->mCallback = NULL; + move_inv->mUserData = NULL; + if(is_move) + { + warn_move_inventory(object, move_inv); + } + else + { + LLNotification::Params params("MoveInventoryFromObject"); + params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv)); + LLNotifications::instance().forceResponse(params, 0); + } + } + + } + else if(LLToolDragAndDrop::SOURCE_NOTECARD == source) + { + accept = TRUE; + if(drop) + { + copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(), + LLToolDragAndDrop::getInstance()->getSourceID(), inv_item); + } + } + else if(LLToolDragAndDrop::SOURCE_LIBRARY == source) + { + LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item; + if(item && item->isComplete()) + { + accept = TRUE; + if(drop) + { + copy_inventory_item( + gAgent.getID(), + inv_item->getPermissions().getOwner(), + inv_item->getUUID(), + mUUID, + std::string(), + LLPointer<LLInventoryCallback>(NULL)); + } + } + } + else + { + llwarns << "unhandled drag source" << llendl; + } + return accept; +} + +// +=================================================+ +// | LLScriptBridge (DEPRECTED) | +// +=================================================+ + +LLUIImagePtr LLScriptBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); +} + +// +=================================================+ +// | LLTextureBridge | +// +=================================================+ + +LLUIImagePtr LLTextureBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_TEXTURE, mInvType, 0, FALSE); +} + +void LLTextureBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +} + +// +=================================================+ +// | LLSoundBridge | +// +=================================================+ + +LLUIImagePtr LLSoundBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE); +} + +void LLSoundBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* +// Changed this back to the way it USED to work: +// only open the preview dialog through the contextual right-click menu +// double-click just plays the sound + + LLViewerInventoryItem* item = getItem(); + if(item) + { + openSoundPreview((void*)this); + //send_uuid_sound_trigger(item->getAssetUUID(), 1.0); + } +*/ +} + +void LLSoundBridge::previewItem() +{ + LLViewerInventoryItem* item = getItem(); + if(item) + { + send_sound_trigger(item->getAssetUUID(), 1.0); + } +} + +void LLSoundBridge::openSoundPreview(void* which) +{ + LLSoundBridge *me = (LLSoundBridge *)which; + LLFloaterReg::showInstance("preview_sound", LLSD(me->mUUID), TAKE_FOCUS_YES); +} + +void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLTextureBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Sound Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + + items.push_back(std::string("Sound Separator")); + items.push_back(std::string("Sound Play")); + + hide_context_entries(menu, items, disabled_items); +} + +// +=================================================+ +// | LLLandmarkBridge | +// +=================================================+ + +LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags/* = 0x00*/) : +LLItemBridge(inventory, uuid) +{ + mVisited = FALSE; + if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED) + { + mVisited = TRUE; + } +} + +LLUIImagePtr LLLandmarkBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE); +} + +void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + lldebugs << "LLLandmarkBridge::buildContextMenu()" << llendl; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Landmark Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + + items.push_back(std::string("Landmark Separator")); + items.push_back(std::string("About Landmark")); + + // Disable "About Landmark" menu item for + // multiple landmarks selected. Only one landmark + // info panel can be shown at a time. + if ((flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("About Landmark")); + } + + hide_context_entries(menu, items, disabled_items); +} + +// Convenience function for the two functions below. +void teleport_via_landmark(const LLUUID& asset_id) +{ + gAgent.teleportViaLandmark( asset_id ); + + // we now automatically track the landmark you're teleporting to + // because you'll probably arrive at a telehub instead + LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance(); + if( floater_world_map ) + { + floater_world_map->trackLandmark( asset_id ); + } +} + +// virtual +void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("teleport" == action) + { + LLViewerInventoryItem* item = getItem(); + if(item) + { + teleport_via_landmark(item->getAssetUUID()); + } + } + else if ("about" == action) + { + LLViewerInventoryItem* item = getItem(); + if(item) + { + LLSD key; + key["type"] = "landmark"; + key["id"] = item->getUUID(); + + LLSideTray::getInstance()->showPanel("panel_places", key); + } + } + else + { + LLItemBridge::performAction(folder, model, action); + } +} + +static bool open_landmark_callback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + + LLUUID asset_id = notification["payload"]["asset_id"].asUUID(); + if (option == 0) + { + teleport_via_landmark(asset_id); + } + + return false; +} +static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportFromLandmark", open_landmark_callback); + + +void LLLandmarkBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* + LLViewerInventoryItem* item = getItem(); + if( item ) + { + // Opening (double-clicking) a landmark immediately teleports, + // but warns you the first time. + // open_landmark(item); + LLSD payload; + payload["asset_id"] = item->getAssetUUID(); + LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); + } +*/ +} + + +// +=================================================+ +// | LLCallingCardObserver | +// +=================================================+ +void LLCallingCardObserver::changed(U32 mask) +{ + mBridgep->refreshFolderViewItem(); +} + +// +=================================================+ +// | LLCallingCardBridge | +// +=================================================+ + +LLCallingCardBridge::LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) : + LLItemBridge(inventory, uuid) +{ + mObserver = new LLCallingCardObserver(this); + LLAvatarTracker::instance().addObserver(mObserver); +} + +LLCallingCardBridge::~LLCallingCardBridge() +{ + LLAvatarTracker::instance().removeObserver(mObserver); + delete mObserver; +} + +void LLCallingCardBridge::refreshFolderViewItem() +{ + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getItemByID(mUUID) : NULL; + if (itemp) + { + itemp->refresh(); + } +} + +// virtual +void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("begin_im" == action) + { + LLViewerInventoryItem *item = getItem(); + if (item && (item->getCreatorUUID() != gAgent.getID()) && + (!item->getCreatorUUID().isNull())) + { + std::string callingcard_name; + gCacheName->getFullName(item->getCreatorUUID(), callingcard_name); + gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID()); + } + } + else if ("lure" == action) + { + LLViewerInventoryItem *item = getItem(); + if (item && (item->getCreatorUUID() != gAgent.getID()) && + (!item->getCreatorUUID().isNull())) + { + LLAvatarActions::offerTeleport(item->getCreatorUUID()); + } + } + else LLItemBridge::performAction(folder, model, action); +} + +LLUIImagePtr LLCallingCardBridge::getIcon() const +{ + BOOL online = FALSE; + LLViewerInventoryItem* item = getItem(); + if(item) + { + online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()); + } + return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE); +} + +std::string LLCallingCardBridge::getLabelSuffix() const +{ + LLViewerInventoryItem* item = getItem(); + if( item && LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()) ) + { + return LLItemBridge::getLabelSuffix() + " (online)"; + } + else + { + return LLItemBridge::getLabelSuffix(); + } +} + +void LLCallingCardBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* + LLViewerInventoryItem* item = getItem(); + if(item && !item->getCreatorUUID().isNull()) + { + LLAvatarActions::showProfile(item->getCreatorUUID()); + } +*/ +} + +void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLCallingCardBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + LLInventoryItem* item = getItem(); + BOOL good_card = (item + && (LLUUID::null != item->getCreatorUUID()) + && (item->getCreatorUUID() != gAgent.getID())); + BOOL user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID())); + items.push_back(std::string("Send Instant Message Separator")); + items.push_back(std::string("Send Instant Message")); + items.push_back(std::string("Offer Teleport...")); + items.push_back(std::string("Conference Chat")); + + if (!good_card) + { + disabled_items.push_back(std::string("Send Instant Message")); + } + if (!good_card || !user_online) + { + disabled_items.push_back(std::string("Offer Teleport...")); + disabled_items.push_back(std::string("Conference Chat")); + } + } + hide_context_entries(menu, items, disabled_items); +} + +BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data) +{ + LLViewerInventoryItem* item = getItem(); + BOOL rv = FALSE; + if(item) + { + // check the type + switch(cargo_type) + { + case DAD_TEXTURE: + case DAD_SOUND: + case DAD_LANDMARK: + case DAD_SCRIPT: + case DAD_CLOTHING: + case DAD_OBJECT: + case DAD_NOTECARD: + case DAD_BODYPART: + case DAD_ANIMATION: + case DAD_GESTURE: + { + LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; + const LLPermissions& perm = inv_item->getPermissions(); + if(gInventory.getItem(inv_item->getUUID()) + && perm.allowOperationBy(PERM_TRANSFER, gAgent.getID())) + { + rv = TRUE; + if(drop) + { + LLToolDragAndDrop::giveInventory(item->getCreatorUUID(), + (LLInventoryItem*)cargo_data); + } + } + else + { + // It's not in the user's inventory (it's probably in + // an object's contents), so disallow dragging it here. + // You can't give something you don't yet have. + rv = FALSE; + } + break; + } + case DAD_CATEGORY: + { + LLInventoryCategory* inv_cat = (LLInventoryCategory*)cargo_data; + if( gInventory.getCategory( inv_cat->getUUID() ) ) + { + rv = TRUE; + if(drop) + { + LLToolDragAndDrop::giveInventoryCategory( + item->getCreatorUUID(), + inv_cat); + } + } + else + { + // It's not in the user's inventory (it's probably in + // an object's contents), so disallow dragging it here. + // You can't give something you don't yet have. + rv = FALSE; + } + break; + } + default: + break; + } + } + return rv; +} + +BOOL LLCallingCardBridge::removeItem() +{ + if (LLFriendCardsManager::instance().isItemInAnyFriendsList(getItem())) + { + LLAvatarActions::removeFriendDialog(getItem()->getCreatorUUID()); + return FALSE; + } + else + { + return LLItemBridge::removeItem(); + } +} +// +=================================================+ +// | LLNotecardBridge | +// +=================================================+ + +LLUIImagePtr LLNotecardBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE); +} + +void LLNotecardBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } + +/* + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); + } +*/ +} + + +// +=================================================+ +// | LLGestureBridge | +// +=================================================+ + +LLUIImagePtr LLGestureBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE); +} + +LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const +{ + if( LLGestureManager::instance().isGestureActive(mUUID) ) + { + return LLFontGL::BOLD; + } + else + { + return LLFontGL::NORMAL; + } +} + +std::string LLGestureBridge::getLabelSuffix() const +{ + if( LLGestureManager::instance().isGestureActive(mUUID) ) + { + return LLItemBridge::getLabelSuffix() + " (active)"; + } + else + { + return LLItemBridge::getLabelSuffix(); + } +} + +// virtual +void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("activate" == action) + { + LLGestureManager::instance().activateGesture(mUUID); + + LLViewerInventoryItem* item = gInventory.getItem(mUUID); + if (!item) return; + + // Since we just changed the suffix to indicate (active) + // the server doesn't need to know, just the viewer. + gInventory.updateItem(item); + gInventory.notifyObservers(); + } + else if ("deactivate" == action) + { + LLGestureManager::instance().deactivateGesture(mUUID); + + LLViewerInventoryItem* item = gInventory.getItem(mUUID); + if (!item) return; + + // Since we just changed the suffix to indicate (active) + // the server doesn't need to know, just the viewer. + gInventory.updateItem(item); + gInventory.notifyObservers(); + } + else LLItemBridge::performAction(folder, model, action); +} + +void LLGestureBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); + preview->setFocus(TRUE); + } +*/ +} + +BOOL LLGestureBridge::removeItem() +{ + // Force close the preview window, if it exists + LLGestureManager::instance().deactivateGesture(mUUID); + return LLItemBridge::removeItem(); +} + +void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLGestureBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + items.push_back(std::string("Gesture Separator")); + items.push_back(std::string("Activate")); + items.push_back(std::string("Deactivate")); + } + hide_context_entries(menu, items, disabled_items); +} + +// +=================================================+ +// | LLAnimationBridge | +// +=================================================+ + +LLUIImagePtr LLAnimationBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE); +} + +void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + lldebugs << "LLAnimationBridge::buildContextMenu()" << llendl; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Animation Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + + items.push_back(std::string("Animation Separator")); + items.push_back(std::string("Animation Play")); + items.push_back(std::string("Animation Audition")); + + hide_context_entries(menu, items, disabled_items); + +} + +// virtual +void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ((action == "playworld") || (action == "playlocal")) + { + if (getItem()) + { + LLPreviewAnim::e_activation_type activate = LLPreviewAnim::NONE; + if ("playworld" == action) activate = LLPreviewAnim::PLAY; + if ("playlocal" == action) activate = LLPreviewAnim::AUDITION; + + LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID)); + if (preview) + { + preview->activate(activate); + } + } + } + else + { + LLItemBridge::performAction(folder, model, action); + } +} + +void LLAnimationBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } +/* + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); + } +*/ +} + +// +=================================================+ +// | LLObjectBridge | +// +=================================================+ + +// static +LLUUID LLObjectBridge::sContextMenuItemID; + +LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) : +LLItemBridge(inventory, uuid), mInvType(type) +{ + mAttachPt = (flags & 0xff); // low bye of inventory flags + + mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE; +} + +BOOL LLObjectBridge::isItemRemovable() +{ + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if(!avatar) return FALSE; + if(avatar->isWearingAttachment(mUUID)) return FALSE; + return LLInvFVBridge::isItemRemovable(); +} + +LLUIImagePtr LLObjectBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject ); +} + +LLInventoryObject* LLObjectBridge::getObject() const +{ + LLInventoryObject* object = NULL; + LLInventoryModel* model = getInventoryModel(); + if(model) + { + object = (LLInventoryObject*)model->getObject(mUUID); + } + return object; +} + +// virtual +void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("attach" == action) + { + LLUUID object_id = mUUID; + LLViewerInventoryItem* item; + item = (LLViewerInventoryItem*)gInventory.getItem(object_id); + if(item && gInventory.isObjectDescendentOf(object_id, gInventory.getRootFolderID())) + { + rez_attachment(item, NULL); + } + else if(item && item->isComplete()) + { + // must be in library. copy it to our inventory and put it on. + LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + gFocusMgr.setKeyboardFocus(NULL); + } + else if ("detach" == action) + { + LLInventoryItem* item = gInventory.getItem(mUUID); + if(item) + { + gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); + gMessageSystem->nextBlockFast(_PREHASH_ObjectData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + gMessageSystem->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID()); + gMessageSystem->sendReliable( gAgent.getRegion()->getHost()); + } + // this object might have been selected, so let the selection manager know it's gone now + LLViewerObject *found_obj = + gObjectList.findObject(item->getUUID()); + if (found_obj) + { + LLSelectMgr::getInstance()->remove(found_obj); + } + else + { + llwarns << "object not found - ignoring" << llendl; + } + } + else LLItemBridge::performAction(folder, model, action); +} + +void LLObjectBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } + + LLSD key; + key["id"] = mUUID; + LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); + + /* + LLFloaterReg::showInstance("properties", mUUID); + */ +} + +LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const +{ + U8 font = LLFontGL::NORMAL; + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if( avatar && avatar->isWearingAttachment( mUUID ) ) + { + font |= LLFontGL::BOLD; + } + + LLInventoryItem* item = getItem(); + if (item && item->getIsLinkType()) + { + font |= LLFontGL::ITALIC; + } + + return (LLFontGL::StyleFlags)font; +} + +std::string LLObjectBridge::getLabelSuffix() const +{ + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if( avatar && avatar->isWearingAttachment( mUUID ) ) + { + std::string attachment_point_name = avatar->getAttachedPointName(mUUID); + LLStringUtil::toLower(attachment_point_name); + + LLStringUtil::format_map_t args; + args["[ATTACHMENT_POINT]"] = attachment_point_name.c_str(); + return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args); + } + else + { + return LLItemBridge::getLabelSuffix(); + } +} + +void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment) +{ + LLSD payload; + payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link. + + S32 attach_pt = 0; + if (gAgent.getAvatarObject() && attachment) + { + for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin(); + iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter) + { + if (iter->second == attachment) + { + attach_pt = iter->first; + break; + } + } + } + + payload["attachment_point"] = attach_pt; + +#if !ENABLE_MULTIATTACHMENTS + if (attachment && attachment->getNumObjects() > 0) + { + LLNotifications::instance().add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez); + } + else +#endif + { + LLNotifications::instance().forceResponse(LLNotification::Params("ReplaceAttachment").payload(payload), 0/*YES*/); + } +} + +bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response) +{ + LLVOAvatar *avatarp = gAgent.getAvatarObject(); + + if (!avatarp->canAttachMoreObjects()) + { + LLSD args; + args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS); + LLNotifications::instance().add("MaxAttachmentsOnOutfit", args); + return false; + } + + S32 option = LLNotification::getSelectedOption(notification, response); + if (option == 0/*YES*/) + { + LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID()); + + if (itemp) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ObjectData); + msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID()); + msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner()); + U8 attachment_pt = notification["payload"]["attachment_point"].asInteger(); +#if ENABLE_MULTIATTACHMENTS + attachment_pt |= ATTACHMENT_ADD; +#endif + msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt); + pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions()); + msg->addStringFast(_PREHASH_Name, itemp->getName()); + msg->addStringFast(_PREHASH_Description, itemp->getDescription()); + msg->sendReliable(gAgent.getRegion()->getHost()); + } + } + return false; +} +static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("ReplaceAttachment", confirm_replace_attachment_rez); + +void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + LLInventoryItem* item = getItem(); + if (item && item->getIsLinkType()) + { + items.push_back(std::string("Goto Link")); + } + + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + LLObjectBridge::sContextMenuItemID = mUUID; + + if(item) + { + LLVOAvatarSelf* avatarp = gAgent.getAvatarObject(); + if( !avatarp ) + { + return; + } + + if( avatarp->isWearingAttachment( mUUID ) ) + { + items.push_back(std::string("Detach From Yourself")); + } + else + if( !isInTrash() && !isLinkedObjectInTrash() ) + { + items.push_back(std::string("Attach Separator")); + items.push_back(std::string("Object Wear")); + items.push_back(std::string("Attach To")); + items.push_back(std::string("Attach To HUD")); + // commented out for DEV-32347 + //items.push_back(std::string("Restore to Last Position")); + + if (!avatarp->canAttachMoreObjects()) + { + disabled_items.push_back(std::string("Object Wear")); + disabled_items.push_back(std::string("Attach To")); + disabled_items.push_back(std::string("Attach To HUD")); + } + LLMenuGL* attach_menu = menu.findChildMenuByName("Attach To", TRUE); + LLMenuGL* attach_hud_menu = menu.findChildMenuByName("Attach To HUD", TRUE); + LLVOAvatar *avatarp = gAgent.getAvatarObject(); + if (attach_menu + && (attach_menu->getChildCount() == 0) + && attach_hud_menu + && (attach_hud_menu->getChildCount() == 0) + && avatarp) + { + for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); + iter != avatarp->mAttachmentPoints.end(); ) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter++; + LLViewerJointAttachment* attachment = curiter->second; + LLMenuItemCallGL::Params p; + std::string submenu_name = attachment->getName(); + if (LLTrans::getString(submenu_name) != "") + { + p.name = (" ")+LLTrans::getString(submenu_name)+" "; + } + else + { + p.name = submenu_name; + } + LLSD cbparams; + cbparams["index"] = curiter->first; + cbparams["label"] = attachment->getName(); + p.on_click.function_name = "Inventory.AttachObject"; + p.on_click.parameter = LLSD(attachment->getName()); + p.on_enable.function_name = "Attachment.Label"; + p.on_enable.parameter = cbparams; + LLView* parent = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu; + LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent); + } + } + } + } + } + hide_context_entries(menu, items, disabled_items); +} + +BOOL LLObjectBridge::renameItem(const std::string& new_name) +{ + if(!isItemRenameable()) + return FALSE; + LLPreview::dirty(mUUID); + LLInventoryModel* model = getInventoryModel(); + if(!model) + return FALSE; + LLViewerInventoryItem* item = getItem(); + if(item && (item->getName() != new_name)) + { + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->rename(new_name); + buildDisplayName(new_item, mDisplayName); + new_item->updateServer(FALSE); + model->updateItem(new_item); + + model->notifyObservers(); + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if( avatar ) + { + LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() ); + if( obj ) + { + LLSelectMgr::getInstance()->deselectAll(); + LLSelectMgr::getInstance()->addAsIndividual( obj, SELECT_ALL_TES, FALSE ); + LLSelectMgr::getInstance()->selectionSetObjectName( new_name ); + LLSelectMgr::getInstance()->deselectAll(); + } + } + } + // return FALSE because we either notified observers (& therefore + // rebuilt) or we didn't update. + return FALSE; +} + +// +=================================================+ +// | LLLSLTextBridge | +// +=================================================+ + +LLUIImagePtr LLLSLTextBridge::getIcon() const +{ + return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE); +} + +void LLLSLTextBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } + /* + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); + } + */ +} + +// +=================================================+ +// | LLWearableBridge | +// +=================================================+ + +// *NOTE: hack to get from avatar inventory to avatar +void wear_inventory_item_on_avatar( LLInventoryItem* item ) +{ + if(item) + { + lldebugs << "wear_inventory_item_on_avatar( " << item->getName() + << " )" << llendl; + + LLAppearanceManager::wearItem(item); + } +} + +void wear_add_inventory_item_on_avatar( LLInventoryItem* item ) +{ + if(item) + { + lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName() + << " )" << llendl; + + LLWearableList::instance().getAsset(item->getAssetUUID(), + item->getName(), + item->getType(), + LLWearableBridge::onWearAddOnAvatarArrived, + new LLUUID(item->getUUID())); + } +} + +void remove_inventory_category_from_avatar( LLInventoryCategory* category ) +{ + if(!category) return; + lldebugs << "remove_inventory_category_from_avatar( " << category->getName() + << " )" << llendl; + + + if( gFloaterCustomize ) + { + gFloaterCustomize->askToSaveIfDirty( + boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID())); + } + else + { + remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); + } +} + +struct OnRemoveStruct +{ + LLUUID mUUID; + OnRemoveStruct(const LLUUID& uuid): + mUUID(uuid) + { + } +}; + +void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id) +{ + + // Find all the wearables that are in the category's subtree. + lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl; + if(proceed) + { + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + LLFindWearables is_wearable; + gInventory.collectDescendentsIf(category_id, + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_wearable); + S32 i; + S32 wearable_count = item_array.count(); + + LLInventoryModel::cat_array_t obj_cat_array; + LLInventoryModel::item_array_t obj_item_array; + LLIsType is_object( LLAssetType::AT_OBJECT ); + gInventory.collectDescendentsIf(category_id, + obj_cat_array, + obj_item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_object); + S32 obj_count = obj_item_array.count(); + + // Find all gestures in this folder + LLInventoryModel::cat_array_t gest_cat_array; + LLInventoryModel::item_array_t gest_item_array; + LLIsType is_gesture( LLAssetType::AT_GESTURE ); + gInventory.collectDescendentsIf(category_id, + gest_cat_array, + gest_item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_gesture); + S32 gest_count = gest_item_array.count(); + + if (wearable_count > 0) //Loop through wearables. If worn, remove. + { + for(i = 0; i < wearable_count; ++i) + { + if( gAgentWearables.isWearingItem (item_array.get(i)->getUUID()) ) + { + LLWearableList::instance().getAsset(item_array.get(i)->getAssetUUID(), + item_array.get(i)->getName(), + item_array.get(i)->getType(), + LLWearableBridge::onRemoveFromAvatarArrived, + new OnRemoveStruct(item_array.get(i)->getUUID())); + + } + } + } + + + if (obj_count > 0) + { + for(i = 0; i < obj_count; ++i) + { + gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv); + gMessageSystem->nextBlockFast(_PREHASH_ObjectData ); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item_array.get(i)->getUUID() ); + + gMessageSystem->sendReliable( gAgent.getRegion()->getHost() ); + + // this object might have been selected, so let the selection manager know it's gone now + LLViewerObject *found_obj = gObjectList.findObject( obj_item_array.get(i)->getUUID()); + if (found_obj) + { + LLSelectMgr::getInstance()->remove(found_obj); + } + else + { + llwarns << "object not found, ignoring" << llendl; + } + } + } + + if (gest_count > 0) + { + for(i = 0; i < gest_count; ++i) + { + if ( LLGestureManager::instance().isGestureActive( gest_item_array.get(i)->getUUID()) ) + { + LLGestureManager::instance().deactivateGesture( gest_item_array.get(i)->getUUID() ); + gInventory.updateItem( gest_item_array.get(i) ); + gInventory.notifyObservers(); + } + + } + } + } +} + +BOOL LLWearableBridge::renameItem(const std::string& new_name) +{ + if( gAgentWearables.isWearingItem( mUUID ) ) + { + gAgentWearables.setWearableName( mUUID, new_name ); + } + return LLItemBridge::renameItem(new_name); +} + +BOOL LLWearableBridge::isItemRemovable() +{ + if (gAgentWearables.isWearingItem(mUUID)) return FALSE; + return LLInvFVBridge::isItemRemovable(); +} + +std::string LLWearableBridge::getLabelSuffix() const +{ + if( gAgentWearables.isWearingItem( mUUID ) ) + { + return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn"); + } + else + { + return LLItemBridge::getLabelSuffix(); + } +} + +LLUIImagePtr LLWearableBridge::getIcon() const +{ + return get_item_icon(mAssetType, mInvType, mWearableType, FALSE); +} + +// virtual +void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("wear" == action) + { + wearOnAvatar(); + } + else if ("wear_add" == action) + { + wearAddOnAvatar(); + } + else if ("edit" == action) + { + editOnAvatar(); + return; + } + else if ("take_off" == action) + { + if(gAgentWearables.isWearingItem(mUUID)) + { + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLWearableList::instance().getAsset(item->getAssetUUID(), + item->getName(), + item->getType(), + LLWearableBridge::onRemoveFromAvatarArrived, + new OnRemoveStruct(mUUID)); + } + } + } + else LLItemBridge::performAction(folder, model, action); +} + +void LLWearableBridge::openItem() +{ + LLViewerInventoryItem* item = getItem(); + + if (item) + { + LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel()); + } + /* + if( isInTrash() ) + { + LLNotifications::instance().add("CannotWearTrash"); + } + else if(isAgentInventory()) + { + if( !gAgentWearables.isWearingItem( mUUID ) ) + { + wearOnAvatar(); + } + } + else + { + // must be in the inventory library. copy it to our inventory + // and put it on right away. + LLViewerInventoryItem* item = getItem(); + if(item && item->isComplete()) + { + LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + else if(item) + { + // *TODO: We should fetch the item details, and then do + // the operation above. + LLNotifications::instance().add("CannotWearInfoNotComplete"); + } + } + */ +} + +void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLWearableBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { // FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere + BOOL no_open = ((flags & SUPPRESS_OPEN_ITEM) == SUPPRESS_OPEN_ITEM); + + // If we have clothing, don't add "Open" as it's the same action as "Wear" SL-18976 + LLViewerInventoryItem* item = getItem(); + if( !no_open && item ) + { + no_open = (item->getType() == LLAssetType::AT_CLOTHING) || + (item->getType() == LLAssetType::AT_BODYPART); + } + if (!no_open) + { + items.push_back(std::string("Open")); + } + + if (item && item->getIsLinkType()) + { + items.push_back(std::string("Goto Link")); + } + + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + items.push_back(std::string("Wearable Separator")); + + items.push_back(std::string("Wearable Wear")); + items.push_back(std::string("Wearable Add")); + items.push_back(std::string("Wearable Edit")); + + if ((flags & FIRST_SELECTED_ITEM) == 0) + { + disabled_items.push_back(std::string("Wearable Edit")); + } + // Don't allow items to be worn if their baseobj is in the trash. + if (isLinkedObjectInTrash()) + { + disabled_items.push_back(std::string("Wearable Wear")); + disabled_items.push_back(std::string("Wearable Add")); + disabled_items.push_back(std::string("Wearable Edit")); + } + + // Disable wear and take off based on whether the item is worn. + if(item) + { + switch (item->getType()) + { + case LLAssetType::AT_CLOTHING: + items.push_back(std::string("Take Off")); + case LLAssetType::AT_BODYPART: + if (gAgentWearables.isWearingItem(item->getUUID())) + { + disabled_items.push_back(std::string("Wearable Wear")); + disabled_items.push_back(std::string("Wearable Add")); + } + else + { + disabled_items.push_back(std::string("Take Off")); + } + break; + default: + break; + } + } + } + hide_context_entries(menu, items, disabled_items); +} + +// Called from menus +// static +BOOL LLWearableBridge::canWearOnAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(!self) return FALSE; + if(!self->isAgentInventory()) + { + LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem(); + if(!item || !item->isComplete()) return FALSE; + } + return (!gAgentWearables.isWearingItem(self->mUUID)); +} + +// Called from menus +// static +void LLWearableBridge::onWearOnAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(!self) return; + self->wearOnAvatar(); +} + +void LLWearableBridge::wearOnAvatar() +{ + // Don't wear anything until initial wearables are loaded, can + // destroy clothing items. + if (!gAgentWearables.areWearablesLoaded()) + { + LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); + return; + } + + LLViewerInventoryItem* item = getItem(); + if(item) + { + if(!isAgentInventory()) + { + LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + else + { + wear_inventory_item_on_avatar(item); + } + } +} + +void LLWearableBridge::wearAddOnAvatar() +{ + // Don't wear anything until initial wearables are loaded, can + // destroy clothing items. + if (!gAgentWearables.areWearablesLoaded()) + { + LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); + return; + } + + LLViewerInventoryItem* item = getItem(); + if(item) + { + if(!isAgentInventory()) + { + LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + else + { + wear_add_inventory_item_on_avatar(item); + } + } +} + +// static +void LLWearableBridge::onWearOnAvatarArrived( LLWearable* wearable, void* userdata ) +{ + LLUUID* item_id = (LLUUID*) userdata; + if(wearable) + { + LLViewerInventoryItem* item = NULL; + item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); + if(item) + { + if(item->getAssetUUID() == wearable->getAssetID()) + { + gAgentWearables.setWearableItem(item, wearable); + gInventory.notifyObservers(); + //self->getFolderItem()->refreshFromRoot(); + } + else + { + llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; + } + } + } + delete item_id; +} + +// static +// BAP remove the "add" code path once everything is fully COF-ified. +void LLWearableBridge::onWearAddOnAvatarArrived( LLWearable* wearable, void* userdata ) +{ + LLUUID* item_id = (LLUUID*) userdata; + if(wearable) + { + LLViewerInventoryItem* item = NULL; + item = (LLViewerInventoryItem*)gInventory.getItem(*item_id); + if(item) + { + if(item->getAssetUUID() == wearable->getAssetID()) + { + bool do_append = true; + gAgentWearables.setWearableItem(item, wearable, do_append); + gInventory.notifyObservers(); + //self->getFolderItem()->refreshFromRoot(); + } + else + { + llinfos << "By the time wearable asset arrived, its inv item already pointed to a different asset." << llendl; + } + } + } + delete item_id; +} + +// static +BOOL LLWearableBridge::canEditOnAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(!self) return FALSE; + + return (gAgentWearables.isWearingItem(self->mUUID)); +} + +// static +void LLWearableBridge::onEditOnAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(self) + { + self->editOnAvatar(); + } +} + +void LLWearableBridge::editOnAvatar() +{ + const LLWearable* wearable = gAgentWearables.getWearableFromItemID(mUUID); + if( wearable ) + { + // Set the tab to the right wearable. + if (gFloaterCustomize) + gFloaterCustomize->setCurrentWearableType( wearable->getType() ); + + if( CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() ) + { + // Start Avatar Customization + gAgent.changeCameraToCustomizeAvatar(); + } + } +} + +// static +BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if( self && (LLAssetType::AT_BODYPART != self->mAssetType) ) + { + return gAgentWearables.isWearingItem( self->mUUID ); + } + return FALSE; +} + +// static +void LLWearableBridge::onRemoveFromAvatar(void* user_data) +{ + LLWearableBridge* self = (LLWearableBridge*)user_data; + if(!self) return; + if(gAgentWearables.isWearingItem(self->mUUID)) + { + LLViewerInventoryItem* item = self->getItem(); + if (item) + { + LLUUID parent_id = item->getParentUUID(); + LLWearableList::instance().getAsset(item->getAssetUUID(), + item->getName(), + item->getType(), + onRemoveFromAvatarArrived, + new OnRemoveStruct(LLUUID(self->mUUID))); + } + } +} + +// static +void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable, + void* userdata) +{ + OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata; + const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID); + if(wearable) + { + if( gAgentWearables.isWearingItem( item_id ) ) + { + EWearableType type = wearable->getType(); + + if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES ) ) //&& + //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) ) + { + // MULTI_WEARABLE: FIXME HACK - always remove all + bool do_remove_all = false; + gAgentWearables.removeWearable( type, do_remove_all, 0 ); + } + } + } + + // Find and remove this item from the COF. + LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::getCOF()); + llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF. + for (LLInventoryModel::item_array_t::const_iterator iter = items.begin(); + iter != items.end(); + ++iter) + { + const LLViewerInventoryItem *linked_item = (*iter); + const LLUUID &item_id = linked_item->getUUID(); + gInventory.purgeObject(item_id); + } + gInventory.notifyObservers(); + + delete on_remove_struct; +} + +LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type, + const LLUUID& uuid,LLInventoryModel* model) +{ + LLInvFVBridgeAction* action = NULL; + switch(asset_type) + { + case LLAssetType::AT_TEXTURE: + action = new LLTextureBridgeAction(uuid,model); + break; + + case LLAssetType::AT_SOUND: + action = new LLSoundBridgeAction(uuid,model); + break; + + case LLAssetType::AT_LANDMARK: + action = new LLLandmarkBridgeAction(uuid,model); + break; + + case LLAssetType::AT_CALLINGCARD: + action = new LLCallingCardBridgeAction(uuid,model); + break; + + case LLAssetType::AT_OBJECT: + action = new LLObjectBridgeAction(uuid,model); + break; + + case LLAssetType::AT_NOTECARD: + action = new LLNotecardBridgeAction(uuid,model); + break; + + case LLAssetType::AT_ANIMATION: + action = new LLAnimationBridgeAction(uuid,model); + break; + + case LLAssetType::AT_GESTURE: + action = new LLGestureBridgeAction(uuid,model); + break; + + case LLAssetType::AT_LSL_TEXT: + action = new LLLSLTextBridgeAction(uuid,model); + break; + + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_BODYPART: + action = new LLWearableBridgeAction(uuid,model); + + break; + + default: + break; + } + return action; +} + +//static +void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type, + const LLUUID& uuid,LLInventoryModel* model) +{ + LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); + if(action) + { + action->doIt(); + delete action; + } +} + +//static +void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model) +{ + LLAssetType::EType asset_type = model->getItem(uuid)->getType(); + LLInvFVBridgeAction* action = createAction(asset_type,uuid,model); + if(action) + { + action->doIt(); + delete action; + } +} + +LLViewerInventoryItem* LLInvFVBridgeAction::getItem() const +{ + if(mModel) + return (LLViewerInventoryItem*)mModel->getItem(mUUID); + return NULL; +} + +//virtual +void LLTextureBridgeAction::doIt() +{ + if (getItem()) + { + LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + +//virtual +void LLSoundBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if(item) + { + LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + + +//virtual +void LLLandmarkBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if( item ) + { + // Opening (double-clicking) a landmark immediately teleports, + // but warns you the first time. + LLSD payload; + payload["asset_id"] = item->getAssetUUID(); + LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload); + } + + LLInvFVBridgeAction::doIt(); +} + + +//virtual +void LLCallingCardBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if(item && item->getCreatorUUID().notNull()) + { + LLAvatarActions::showProfile(item->getCreatorUUID()); + } + + LLInvFVBridgeAction::doIt(); +} + +//virtual +void +LLNotecardBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + +//virtual +void LLGestureBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null); + preview->setFocus(TRUE); + } + + LLInvFVBridgeAction::doIt(); +} + +//virtual +void LLAnimationBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + + +//virtual +void LLObjectBridgeAction::doIt() +{ + LLFloaterReg::showInstance("properties", mUUID); + + LLInvFVBridgeAction::doIt(); +} + + +//virtual +void LLLSLTextBridgeAction::doIt() +{ + LLViewerInventoryItem* item = getItem(); + if (item) + { + LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES); + } + + LLInvFVBridgeAction::doIt(); +} + + +BOOL LLWearableBridgeAction::isInTrash() const +{ + if(!mModel) return FALSE; + LLUUID trash_id = mModel->findCategoryUUIDForType(LLAssetType::AT_TRASH); + return mModel->isObjectDescendentOf(mUUID, trash_id); +} + +BOOL LLWearableBridgeAction::isAgentInventory() const +{ + if(!mModel) return FALSE; + if(gInventory.getRootFolderID() == mUUID) return TRUE; + return mModel->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()); +} + +void LLWearableBridgeAction::wearOnAvatar() +{ + // Don't wear anything until initial wearables are loaded, can + // destroy clothing items. + if (!gAgentWearables.areWearablesLoaded()) + { + LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded"); + return; + } + + LLViewerInventoryItem* item = getItem(); + if(item) + { + if(!isAgentInventory()) + { + LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + else + { + wear_inventory_item_on_avatar(item); + } + } +} + +//virtual +void LLWearableBridgeAction::doIt() +{ + if(isInTrash()) + { + LLNotifications::instance().add("CannotWearTrash"); + } + else if(isAgentInventory()) + { + if(!gAgentWearables.isWearingItem(mUUID)) + { + wearOnAvatar(); + } + } + else + { + // must be in the inventory library. copy it to our inventory + // and put it on right away. + LLViewerInventoryItem* item = getItem(); + if(item && item->isComplete()) + { + LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(); + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + else if(item) + { + // *TODO: We should fetch the item details, and then do + // the operation above. + LLNotifications::instance().add("CannotWearInfoNotComplete"); + } + } + + LLInvFVBridgeAction::doIt(); +} + +// +=================================================+ +// | LLLinkItemBridge | +// +=================================================+ +// For broken links + +std::string LLLinkItemBridge::sPrefix("Link: "); + + +LLUIImagePtr LLLinkItemBridge::getIcon() const +{ + if (LLViewerInventoryItem *item = getItem()) + { + return get_item_icon(item->getActualType(), LLInventoryType::IT_NONE, 0, FALSE); + } + return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE); +} + +void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + // *TODO: Translate + lldebugs << "LLLink::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Delete")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Delete")); + } + } + hide_context_entries(menu, items, disabled_items); +} + + +// +=================================================+ +// | LLLinkBridge | +// +=================================================+ +// For broken links. + +std::string LLLinkFolderBridge::sPrefix("Link: "); + + +LLUIImagePtr LLLinkFolderBridge::getIcon() const +{ + LLAssetType::EType preferred_type = LLAssetType::AT_NONE; + if (LLViewerInventoryItem *item = getItem()) + { + if (const LLViewerInventoryCategory* cat = item->getLinkedCategory()) + { + preferred_type = cat->getPreferredType(); + } + } + return LLFolderBridge::getIcon(preferred_type); +} + +void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + // *TODO: Translate + lldebugs << "LLLink::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Goto Link")); + items.push_back(std::string("Delete")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Delete")); + } + } + hide_context_entries(menu, items, disabled_items); +} + +void LLLinkFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("goto" == action) + { + gotoItem(folder); + return; + } + LLItemBridge::performAction(folder,model,action); +} + +void LLLinkFolderBridge::gotoItem(LLFolderView *folder) +{ + const LLUUID &cat_uuid = getFolderID(); + if (!cat_uuid.isNull()) + { + if (LLFolderViewItem *base_folder = folder->getItemByID(cat_uuid)) + { + if (LLInventoryModel* model = getInventoryModel()) + { + model->fetchDescendentsOf(cat_uuid); + } + base_folder->setOpen(TRUE); + folder->setSelectionFromRoot(base_folder,TRUE); + folder->scrollToShowSelection(); + } + } +} + +const LLUUID &LLLinkFolderBridge::getFolderID() const +{ + if (LLViewerInventoryItem *link_item = getItem()) + { + if (const LLViewerInventoryCategory *cat = link_item->getLinkedCategory()) + { + const LLUUID& cat_uuid = cat->getUUID(); + return cat_uuid; + } + } + return LLUUID::null; +} diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index c4779cd29a8..3a1b354c502 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -40,6 +40,7 @@ #include "llsidepaneliteminfo.h" #include "llsidepaneltaskinfo.h" #include "lltabcontainer.h" +#include "llselectmgr.h" static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); @@ -119,6 +120,7 @@ void LLSidepanelInventory::onOpen(const LLSD& key) } if (key.has("task")) { + mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection()); showTaskInfoPanel(); } } diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index d36ffc9a9cc..9d2960fbed1 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -151,8 +151,16 @@ void LLSidepanelItemInfo::refresh() refreshFromItem(item); updateVerbs(); } + else + { + if (getIsEditing()) + { + setIsEditing(FALSE); + return; + } + } - if (!getIsEditing() || !item) + if (!getIsEditing()) { const std::string no_item_names[]={ "LabelItemName", diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 3608e2c097e..4284c95b130 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -61,6 +61,7 @@ #include "llavataractions.h" #include "llnamebox.h" #include "llviewercontrol.h" +#include "llviewermenu.h" #include "lluictrlfactory.h" #include "llspinctrl.h" #include "roles_constants.h" @@ -84,39 +85,17 @@ BOOL LLSidepanelTaskInfo::postBuild() mOpenBtn = getChild<LLButton>("open_btn"); mOpenBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onOpenButtonClicked, this)); - mBuildBtn = getChild<LLButton>("build_btn"); - mBuildBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuildButtonClicked, this)); + mPayBtn = getChild<LLButton>("pay_btn"); + mPayBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onPayButtonClicked, this)); mBuyBtn = getChild<LLButton>("buy_btn"); mBuyBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuyButtonClicked, this)); - childSetCommitCallback("Object Name",LLSidepanelTaskInfo::onCommitName,this); childSetPrevalidate("Object Name",LLLineEditor::prevalidatePrintableNotPipe); - childSetCommitCallback("Object Description",LLSidepanelTaskInfo::onCommitDesc,this); childSetPrevalidate("Object Description",LLLineEditor::prevalidatePrintableNotPipe); - - getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this)); - - childSetCommitCallback("checkbox share with group",LLSidepanelTaskInfo::onCommitGroupShare,this); - - childSetAction("button deed",LLSidepanelTaskInfo::onClickDeedToGroup,this); - - childSetCommitCallback("checkbox allow everyone move",LLSidepanelTaskInfo::onCommitEveryoneMove,this); - - childSetCommitCallback("checkbox allow everyone copy",LLSidepanelTaskInfo::onCommitEveryoneCopy,this); - - childSetCommitCallback("checkbox for sale",LLSidepanelTaskInfo::onCommitSaleInfo,this); - - childSetCommitCallback("sale type",LLSidepanelTaskInfo::onCommitSaleType,this); +// getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this)); +// childSetAction("button deed",LLSidepanelTaskInfo::onClickDeedToGroup,this); - childSetCommitCallback("Edit Cost", LLSidepanelTaskInfo::onCommitSaleInfo, this); - - childSetCommitCallback("checkbox next owner can modify",LLSidepanelTaskInfo::onCommitNextOwnerModify,this); - childSetCommitCallback("checkbox next owner can copy",LLSidepanelTaskInfo::onCommitNextOwnerCopy,this); - childSetCommitCallback("checkbox next owner can transfer",LLSidepanelTaskInfo::onCommitNextOwnerTransfer,this); - childSetCommitCallback("clickaction",LLSidepanelTaskInfo::onCommitClickAction,this); - childSetCommitCallback("search_check",LLSidepanelTaskInfo::onCommitIncludeInSearch,this); - mLabelGroupName = getChild<LLNameBox>("Group Name Proxy"); return TRUE; @@ -146,16 +125,16 @@ void LLSidepanelTaskInfo::refresh() BtnDeedToGroup->setLabelUnselected(deedText); } BOOL root_selected = TRUE; - LLSelectNode* nodep = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(); - S32 object_count = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount(); + LLSelectNode* nodep = mObjectSelection->getFirstRootNode(); + S32 object_count = mObjectSelection->getRootObjectCount(); if(!nodep || 0 == object_count) { - nodep = LLSelectMgr::getInstance()->getSelection()->getFirstNode(); - object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); + nodep = mObjectSelection->getFirstNode(); + object_count = mObjectSelection->getObjectCount(); root_selected = FALSE; } - //BOOL attachment_selected = LLSelectMgr::getInstance()->getSelection()->isAttachment(); + //BOOL attachment_selected = mObjectSelection->isAttachment(); //attachment_selected = false; LLViewerObject* objectp = NULL; if(nodep) objectp = nodep->getObject(); @@ -245,7 +224,7 @@ void LLSidepanelTaskInfo::refresh() BOOL is_one_object = (object_count == 1); // BUG: fails if a root and non-root are both single-selected. - BOOL is_perm_modify = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode() + BOOL is_perm_modify = (mObjectSelection->getFirstRootNode() && LLSelectMgr::getInstance()->selectGetRootsModify()) || LLSelectMgr::getInstance()->selectGetModify(); const LLFocusableElement* keyboard_focus_view = gFocusMgr.getKeyboardFocus(); @@ -789,6 +768,32 @@ void LLSidepanelTaskInfo::refresh() childSetEnabled("label click action",is_perm_modify && all_volume); childSetEnabled("clickaction",is_perm_modify && all_volume); + if (!getIsEditing()) + { + const std::string no_item_names[]={ + "Object Name", + "Object Description", + "button set group", + "checkbox share with group", + "button deed", + "checkbox allow everyone move", + "checkbox allow everyone copy", + "checkbox for sale", + "sale type", + "Edit Cost", + "checkbox next owner can modify", + "checkbox next owner can copy", + "checkbox next owner can transfer", + "clickaction", + "search_check", + "perm_modify", + "Group Name", + }; + for(size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t) + { + childSetEnabled(no_item_names[t],false); + } + } updateVerbs(); } @@ -856,7 +861,7 @@ static bool callback_deed_to_group(const LLSD& notification, const LLSD& respons return false; } -void LLSidepanelTaskInfo::onClickDeedToGroup(void* data) +void LLSidepanelTaskInfo::onClickDeedToGroup() { LLNotifications::instance().add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group); } @@ -865,98 +870,72 @@ void LLSidepanelTaskInfo::onClickDeedToGroup(void* data) /// Permissions checkboxes ///---------------------------------------------------------------------------- -// static -void LLSidepanelTaskInfo::onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm) +void LLSidepanelTaskInfo::onCommitPerm(LLCheckBoxCtrl *ctrl, U8 field, U32 perm) { - LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(); + LLViewerObject* object = mObjectSelection->getFirstRootObject(); if(!object) return; - // Checkbox will have toggled itself - // LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data; - LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; - BOOL new_state = check->get(); - + BOOL new_state = ctrl->get(); LLSelectMgr::getInstance()->selectionSetObjectPermissions(field, new_state, perm); } -// static -void LLSidepanelTaskInfo::onCommitGroupShare(LLUICtrl *ctrl, void *data) +void LLSidepanelTaskInfo::onCommitGroupShare() { - onCommitPerm(ctrl, data, PERM_GROUP, PERM_MODIFY | PERM_MOVE | PERM_COPY); + LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox share with group"); + onCommitPerm(ctrl, PERM_GROUP, PERM_MODIFY | PERM_MOVE | PERM_COPY); } -// static -void LLSidepanelTaskInfo::onCommitEveryoneMove(LLUICtrl *ctrl, void *data) +void LLSidepanelTaskInfo::onCommitEveryoneMove() { - onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_MOVE); + LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox allow everyone move"); + onCommitPerm(ctrl, PERM_EVERYONE, PERM_MOVE); } -// static -void LLSidepanelTaskInfo::onCommitEveryoneCopy(LLUICtrl *ctrl, void *data) +void LLSidepanelTaskInfo::onCommitEveryoneCopy() { - onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_COPY); + LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox allow everyone copy"); + onCommitPerm(ctrl, PERM_EVERYONE, PERM_COPY); } -// static -void LLSidepanelTaskInfo::onCommitNextOwnerModify(LLUICtrl* ctrl, void* data) +void LLSidepanelTaskInfo::onCommitNextOwnerModify() { - //llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerModify" << llendl; - onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_MODIFY); + LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox next owner can modify"); + onCommitPerm(ctrl, PERM_NEXT_OWNER, PERM_MODIFY); } -// static -void LLSidepanelTaskInfo::onCommitNextOwnerCopy(LLUICtrl* ctrl, void* data) +void LLSidepanelTaskInfo::onCommitNextOwnerCopy() { - //llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerCopy" << llendl; - onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_COPY); + LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox next owner can copy"); + onCommitPerm(ctrl, PERM_NEXT_OWNER, PERM_COPY); } -// static -void LLSidepanelTaskInfo::onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data) +void LLSidepanelTaskInfo::onCommitNextOwnerTransfer() { - //llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerTransfer" << llendl; - onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_TRANSFER); + LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox next owner can transfer"); + onCommitPerm(ctrl, PERM_NEXT_OWNER, PERM_TRANSFER); } -// static -void LLSidepanelTaskInfo::onCommitName(LLUICtrl*, void* data) +void LLSidepanelTaskInfo::onCommitName() { - //llinfos << "LLSidepanelTaskInfo::onCommitName()" << llendl; - LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data; - LLLineEditor* tb = self->getChild<LLLineEditor>("Object Name"); - if(tb) - { - LLSelectMgr::getInstance()->selectionSetObjectName(tb->getText()); -// LLSelectMgr::getInstance()->selectionSetObjectName(self->mLabelObjectName->getText()); - } + LLLineEditor* tb = getChild<LLLineEditor>("Object Name"); + LLSelectMgr::getInstance()->selectionSetObjectName(tb->getText()); } - -// static -void LLSidepanelTaskInfo::onCommitDesc(LLUICtrl*, void* data) +void LLSidepanelTaskInfo::onCommitDesc() { - //llinfos << "LLSidepanelTaskInfo::onCommitDesc()" << llendl; - LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data; - LLLineEditor* le = self->getChild<LLLineEditor>("Object Description"); - if(le) - { - LLSelectMgr::getInstance()->selectionSetObjectDescription(le->getText()); - } + LLLineEditor* le = getChild<LLLineEditor>("Object Description"); + LLSelectMgr::getInstance()->selectionSetObjectDescription(le->getText()); } -// static -void LLSidepanelTaskInfo::onCommitSaleInfo(LLUICtrl*, void* data) +void LLSidepanelTaskInfo::onCommitSaleInfo() { - LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data; - self->setAllSaleInfo(); + setAllSaleInfo(); } -// static -void LLSidepanelTaskInfo::onCommitSaleType(LLUICtrl*, void* data) +void LLSidepanelTaskInfo::onCommitSaleType() { - LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data; - self->setAllSaleInfo(); + setAllSaleInfo(); } void LLSidepanelTaskInfo::setAllSaleInfo() @@ -1009,12 +988,8 @@ struct LLSelectionPayable : public LLSelectedObjectFunctor }; // static -void LLSidepanelTaskInfo::onCommitClickAction(LLUICtrl* ctrl, void*) +void LLSidepanelTaskInfo::onCommitClickAction(U8 click_action) { - LLComboBox* box = (LLComboBox*)ctrl; - if (!box) return; - - U8 click_action = (U8)box->getCurrentIndex(); if (click_action == CLICK_ACTION_BUY) { LLSaleInfo sale_info; @@ -1026,7 +1001,7 @@ void LLSidepanelTaskInfo::onCommitClickAction(LLUICtrl* ctrl, void*) // Set click action back to its old value U8 click_action = 0; LLSelectMgr::getInstance()->selectionGetClickAction(&click_action); - box->setCurrentByIndex((S32)click_action); +// box->setCurrentByIndex((S32)click_action); return; } @@ -1035,7 +1010,7 @@ void LLSidepanelTaskInfo::onCommitClickAction(LLUICtrl* ctrl, void*) { // Verify object has script with money() handler LLSelectionPayable payable; - bool can_pay = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&payable); + bool can_pay = mObjectSelection->applyToObjects(&payable); if (!can_pay) { // Warn, but do it anyway. @@ -1046,12 +1021,10 @@ void LLSidepanelTaskInfo::onCommitClickAction(LLUICtrl* ctrl, void*) } // static -void LLSidepanelTaskInfo::onCommitIncludeInSearch(LLUICtrl* ctrl, void*) +void LLSidepanelTaskInfo::onCommitIncludeInSearch() { - LLCheckBoxCtrl* box = (LLCheckBoxCtrl*)ctrl; - llassert(box); - - LLSelectMgr::getInstance()->selectionSetIncludeInSearch(box->get()); + LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("search_check"); + LLSelectMgr::getInstance()->selectionSetIncludeInSearch(ctrl->get()); } // virtual @@ -1060,24 +1033,47 @@ void LLSidepanelTaskInfo::updateVerbs() LLSidepanelInventorySubpanel::updateVerbs(); mOpenBtn->setVisible(!getIsEditing()); - mBuildBtn->setVisible(!getIsEditing()); + mPayBtn->setVisible(!getIsEditing()); mBuyBtn->setVisible(!getIsEditing()); + + mOpenBtn->setEnabled(enable_object_open()); } void LLSidepanelTaskInfo::onOpenButtonClicked() { + if (enable_object_open()) + { + handle_object_open(); + } } -void LLSidepanelTaskInfo::onBuildButtonClicked() +void LLSidepanelTaskInfo::onPayButtonClicked() { + onCommitClickAction(CLICK_ACTION_PAY); } void LLSidepanelTaskInfo::onBuyButtonClicked() { + onCommitClickAction(CLICK_ACTION_BUY); } // virtual void LLSidepanelTaskInfo::save() { + onCommitGroupShare(); + onCommitEveryoneMove(); + onCommitEveryoneCopy(); + onCommitNextOwnerModify(); + onCommitNextOwnerCopy(); + onCommitNextOwnerTransfer(); + onCommitName(); + onCommitDesc(); + onCommitSaleInfo(); + onCommitSaleType(); + onCommitIncludeInSearch(); } +void LLSidepanelTaskInfo::setObjectSelection(LLObjectSelectionHandle selection) +{ + mObjectSelection = selection; +} diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h index aea65c11706..25a9e2d5772 100644 --- a/indra/newview/llsidepaneltaskinfo.h +++ b/indra/newview/llsidepaneltaskinfo.h @@ -35,6 +35,7 @@ #include "llsidepanelinventorysubpanel.h" #include "lluuid.h" +#include "llselectmgr.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLSidepanelTaskInfo @@ -43,6 +44,7 @@ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLNameBox; +class LLCheckBoxCtrl; class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel { @@ -52,6 +54,8 @@ class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel /*virtual*/ BOOL postBuild(); + void setObjectSelection(LLObjectSelectionHandle selection); + protected: /*virtual*/ void refresh(); // refresh all labels as needed /*virtual*/ void save(); @@ -62,29 +66,25 @@ class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel static void onClickRelease(void*); void onClickGroup(); void cbGroupID(LLUUID group_id); - static void onClickDeedToGroup(void*); - - static void onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm); - - static void onCommitGroupShare(LLUICtrl *ctrl, void *data); - static void onCommitEveryoneMove(LLUICtrl *ctrl, void *data); - static void onCommitEveryoneCopy(LLUICtrl *ctrl, void *data); + void onClickDeedToGroup(); + void onCommitPerm(LLCheckBoxCtrl* ctrl, U8 field, U32 perm); + void onCommitGroupShare(); + void onCommitEveryoneMove(); + void onCommitEveryoneCopy(); + void onCommitNextOwnerModify(); + void onCommitNextOwnerCopy(); + void onCommitNextOwnerTransfer(); + void onCommitName(); + void onCommitDesc(); + void onCommitSaleInfo(); + void onCommitSaleType(); + + void onCommitClickAction(U8 click_action); + void onCommitIncludeInSearch(); - static void onCommitNextOwnerModify(LLUICtrl* ctrl, void* data); - static void onCommitNextOwnerCopy(LLUICtrl* ctrl, void* data); - static void onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data); - - static void onCommitName(LLUICtrl* ctrl, void* data); - static void onCommitDesc(LLUICtrl* ctrl, void* data); - - static void onCommitSaleInfo(LLUICtrl* ctrl, void* data); - static void onCommitSaleType(LLUICtrl* ctrl, void* data); void setAllSaleInfo(); - static void onCommitClickAction(LLUICtrl* ctrl, void*); - static void onCommitIncludeInSearch(LLUICtrl* ctrl, void*); - private: LLNameBox* mLabelGroupName; // group name @@ -94,12 +94,14 @@ class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel protected: void onOpenButtonClicked(); - void onBuildButtonClicked(); + void onPayButtonClicked(); void onBuyButtonClicked(); private: LLButton* mOpenBtn; - LLButton* mBuildBtn; + LLButton* mPayBtn; LLButton* mBuyBtn; + + LLObjectSelectionHandle mObjectSelection; }; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 526b7967874..e2e0e00dcff 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2523,24 +2523,12 @@ class LLObjectEnableTouch : public view_listener_t // label.assign("Touch"); // } //} -/* -bool handle_object_open() -{ - LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - if(!obj) return true; - LLFloaterOpenObject::show(); - return true; +void handle_object_open() +{ + LLFloaterReg::showInstance("openobject"); } -class LLObjectOpen : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - return handle_object_open(); - } -}; -*/ bool enable_object_open() { // Look for contents in root object, which is all the LLFloaterOpenObject @@ -8077,6 +8065,7 @@ void initialize_menus() commit.add("Object.Buy", boost::bind(&handle_buy)); commit.add("Object.Edit", boost::bind(&handle_object_edit)); commit.add("Object.Inspect", boost::bind(&handle_object_inspect)); + commit.add("Object.Open", boost::bind(&handle_object_open)); commit.add("Object.Take", boost::bind(&handle_take)); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index b65878b5e63..db4eb3be9d8 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -94,6 +94,7 @@ void handle_sit_down(void*); void handle_object_build(void*); void handle_object_touch(); bool enable_object_open(); +void handle_object_open(); // Buy either contents or object itself void handle_buy(); -- GitLab From 83fb99a9ac2f07334233e7307cc18a4d340c8527 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Wed, 4 Nov 2009 18:28:45 -0800 Subject: [PATCH 150/306] ext-2038 - script editor, cursor becomes stuck in some rows ext-2037 0 Script editor, garbage characters inserted in text --- indra/llui/lltextbase.cpp | 28 +++++++++++++++++++++------ indra/llui/lltextbase.h | 6 +++--- indra/newview/llexpandabletextbox.cpp | 3 ++- indra/newview/llparticipantlist.cpp | 3 +++ indra/newview/llviewertexteditor.cpp | 4 ++-- 5 files changed, 32 insertions(+), 12 deletions(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index e5aac0d5e7e..97ba6913418 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1108,7 +1108,7 @@ void LLTextBase::reflow(S32 start_index) S32_MAX); S32 segment_width, segment_height; - segment->getDimensions(seg_offset, character_count, segment_width, segment_height); + bool force_newline = segment->getDimensions(seg_offset, character_count, segment_width, segment_height); // grow line height as necessary based on reported height of this segment line_height = llmax(line_height, segment_height); remaining_pixels -= segment_width; @@ -1153,6 +1153,18 @@ void LLTextBase::reflow(S32 start_index) else { // subtract pixels used and increment segment + if (force_newline) + { + mLineInfoList.push_back(line_info( + line_start_index, + last_segment_char_on_line, + line_rect, + line_count)); + line_start_index = segment->getStart() + seg_offset; + cur_top -= llround((F32)line_height * mLineSpacingMult) + mLineSpacingPixels; + line_height = 0; + remaining_pixels = text_width; + } ++seg_iter; seg_offset = 0; } @@ -2124,7 +2136,7 @@ LLRect LLTextBase::getVisibleDocumentRect() const LLTextSegment::~LLTextSegment() {} -void LLTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const { width = 0; height = 0; } +bool LLTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const { width = 0; height = 0; return false;} S32 LLTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const { return 0; } S32 LLTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const { return 0; } void LLTextSegment::updateLayout(const LLTextBase& editor) {} @@ -2352,12 +2364,13 @@ void LLNormalTextSegment::setToolTip(const std::string& tooltip) mTooltip = tooltip; } -void LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const +bool LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const { LLWString text = mEditor.getWText(); height = mFontHeight; width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars); + return num_chars >= 1 && text[mStart + num_chars - 1] == '\n'; } S32 LLNormalTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const @@ -2404,8 +2417,9 @@ S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin // but not both S32 last_char_in_run = mStart + segment_offset + num_chars; // check length first to avoid indexing off end of string - if (last_char_in_run >= mEditor.getLength() - || text[last_char_in_run] == '\n') + if (last_char_in_run < mEnd + && (last_char_in_run >= mEditor.getLength() + || text[last_char_in_run] == '\n')) { num_chars++; } @@ -2444,7 +2458,7 @@ LLInlineViewSegment::~LLInlineViewSegment() mView->die(); } -void LLInlineViewSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const +bool LLInlineViewSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const { if (first_char == 0 && num_chars == 0) { @@ -2458,6 +2472,8 @@ void LLInlineViewSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt width = mLeftPad + mRightPad + mView->getRect().getWidth(); height = mBottomPad + mTopPad + mView->getRect().getHeight(); } + + return false; } S32 LLInlineViewSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 4cca522a235..8cae8fde220 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -370,7 +370,7 @@ class LLTextSegment : public LLRefCount, public LLMouseHandler LLTextSegment(S32 start, S32 end) : mStart(start), mEnd(end){}; virtual ~LLTextSegment(); - virtual void getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const; + virtual bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const; virtual S32 getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const; virtual S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const; virtual void updateLayout(const class LLTextBase& editor); @@ -421,7 +421,7 @@ class LLNormalTextSegment : public LLTextSegment LLNormalTextSegment( const LLStyleSP& style, S32 start, S32 end, LLTextBase& editor ); LLNormalTextSegment( const LLColor4& color, S32 start, S32 end, LLTextBase& editor, BOOL is_visible = TRUE); - /*virtual*/ void getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const; + /*virtual*/ bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const; /*virtual*/ S32 getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const; /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const; /*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect); @@ -474,7 +474,7 @@ class LLInlineViewSegment : public LLTextSegment LLInlineViewSegment(const Params& p, S32 start, S32 end); ~LLInlineViewSegment(); - /*virtual*/ void getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const; + /*virtual*/ bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const; /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const; /*virtual*/ void updateLayout(const class LLTextBase& editor); /*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect); diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 7bc48185e68..424d6353211 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -48,11 +48,12 @@ class LLExpanderSegment : public LLTextSegment mExpanderLabel(more_text) {} - /*virtual*/ void getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const + /*virtual*/ bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const { // more label always spans width of text box width = mEditor.getTextRect().getWidth() - mEditor.getHPad(); height = llceil(mStyle->getFont()->getLineHeight()); + return true; } /*virtual*/ S32 getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const { diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 9450bee3153..c373cef6f3b 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -42,6 +42,9 @@ #include "llspeakers.h" //LLParticipantList retrieves add, clear and remove events and updates view accordingly +#if LL_MSVC +#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally +#endif LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list): mSpeakerMgr(data_source), mAvatarList(avatar_list), diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 90dff465c94..75555efe7ac 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -171,7 +171,7 @@ class LLEmbeddedItemSegment : public LLTextSegment mToolTip = inv_item->getName() + '\n' + inv_item->getDescription(); } - /*virtual*/ void getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const + /*virtual*/ bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const { if (num_chars == 0) { @@ -183,7 +183,7 @@ class LLEmbeddedItemSegment : public LLTextSegment width = EMBEDDED_ITEM_LABEL_PADDING + mImage->getWidth() + mStyle->getFont()->getWidth(mLabel.c_str()); height = llmax(mImage->getHeight(), llceil(mStyle->getFont()->getLineHeight())); } - + return false; } /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const -- GitLab From 723a86f608879d192347039570e37bd1c04752e1 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Wed, 4 Nov 2009 19:00:40 -0800 Subject: [PATCH 151/306] fixed layout of items embedded in notecards --- indra/newview/llviewertexteditor.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 75555efe7ac..6f8818be6e4 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -188,7 +188,24 @@ class LLEmbeddedItemSegment : public LLTextSegment /*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const { - return 1; + // always draw at beginning of line + if (line_offset == 0) + { + return 1; + } + else + { + S32 width, height; + getDimensions(mStart, 1, width, height); + if (width > num_pixels) + { + return 0; + } + else + { + return 1; + } + } } /*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect) { @@ -208,7 +225,7 @@ class LLEmbeddedItemSegment : public LLTextSegment } F32 right_x; - mStyle->getFont()->render(mLabel, 0, image_rect.mRight + EMBEDDED_ITEM_LABEL_PADDING, draw_rect.mBottom, color, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::UNDERLINE, LLFontGL::NO_SHADOW, mLabel.length(), S32_MAX, &right_x); + mStyle->getFont()->render(mLabel, 0, image_rect.mRight + EMBEDDED_ITEM_LABEL_PADDING, draw_rect.mTop, color, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::UNDERLINE, LLFontGL::NO_SHADOW, mLabel.length(), S32_MAX, &right_x); return right_x; } -- GitLab From 0292fec348dbe3c65c6e56b2bef8149e4ce58d54 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Wed, 4 Nov 2009 19:22:55 -0800 Subject: [PATCH 152/306] fixed clipping not working with gl_rect calls EXT-1397 - description edit field is broken --- indra/llui/lllocalcliprect.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/llui/lllocalcliprect.cpp b/indra/llui/lllocalcliprect.cpp index 058b6ae1784..f5a78e10994 100644 --- a/indra/llui/lllocalcliprect.cpp +++ b/indra/llui/lllocalcliprect.cpp @@ -77,6 +77,8 @@ LLScreenClipRect::LLScreenClipRect(const LLRect& rect, BOOL enabled) LLScreenClipRect::~LLScreenClipRect() { + // finish any deferred calls in this clipping region + gGL.flush(); if (mEnabled) { popClipRect(); -- GitLab From 35c7c7a9b29ef4462ea969b393c25b59813ef169 Mon Sep 17 00:00:00 2001 From: angela <angela@lindenlab.com> Date: Thu, 5 Nov 2009 11:40:09 +0800 Subject: [PATCH 153/306] in object inspector: change secure browsing image and make it hide by default --- indra/newview/skins/default/xui/en/inspect_object.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml index fe492e0ae80..bdceb7b0fb9 100644 --- a/indra/newview/skins/default/xui/en/inspect_object.xml +++ b/indra/newview/skins/default/xui/en/inspect_object.xml @@ -151,10 +151,11 @@ This is a really long description for an object being as how it is at least 80 c width="75" /> <icon name="secure_browsing" - image_name="map_infohub.tga" + image_name="Lock" left_delta="80" - width="16" - height="16" + visible="false" + width="18" + height="18" top_delta="2" tool_tip="Secure Browsing" follows="left|top"/> -- GitLab From ecaf21b22616cad649784e6874249e35f1feee7b Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Wed, 4 Nov 2009 20:46:17 -0800 Subject: [PATCH 154/306] better fix for clipping not working --- indra/llui/lllocalcliprect.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/indra/llui/lllocalcliprect.cpp b/indra/llui/lllocalcliprect.cpp index f5a78e10994..43c21e250ce 100644 --- a/indra/llui/lllocalcliprect.cpp +++ b/indra/llui/lllocalcliprect.cpp @@ -77,8 +77,6 @@ LLScreenClipRect::LLScreenClipRect(const LLRect& rect, BOOL enabled) LLScreenClipRect::~LLScreenClipRect() { - // finish any deferred calls in this clipping region - gGL.flush(); if (mEnabled) { popClipRect(); @@ -115,6 +113,9 @@ void LLScreenClipRect::updateScissorRegion() { if (sClipRectStack.empty()) return; + // finish any deferred calls in the old clipping region + gGL.flush(); + LLRect rect = sClipRectStack.top(); stop_glerror(); S32 x,y,w,h; -- GitLab From 77ebe6680449b3e0fda96444ba7df3140d1dcab1 Mon Sep 17 00:00:00 2001 From: Alexei Arabadji <aarabadji@productengine.com> Date: Thu, 5 Nov 2009 12:49:44 +0200 Subject: [PATCH 155/306] fixed EXT-2201 "Docking undocked window causes closing off docked nearby chat window" --HG-- branch : product-engine --- indra/newview/llnearbychat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 81d033d7f98..b0cce314cf1 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -61,7 +61,7 @@ static const S32 RESIZE_BAR_THICKNESS = 3; LLNearbyChat::LLNearbyChat(const LLSD& key) - : LLDockableFloater(NULL, key) + : LLDockableFloater(NULL, false, key) ,mChatHistory(NULL) { -- GitLab From f8d1644a4132356c2a0220110b9d9bc981f73b16 Mon Sep 17 00:00:00 2001 From: Yuri Chebotarev <ychebotarev@productengine.com> Date: Thu, 5 Nov 2009 13:17:12 +0200 Subject: [PATCH 156/306] fix for major bug ext-2209 Nearby Chat log is broken --HG-- branch : product-engine --- indra/llui/llfloaterreg.cpp | 2 +- indra/newview/llnearbychat.cpp | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index f8e07913fbf..03925f922c1 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -367,7 +367,7 @@ std::string LLFloaterReg::declareVisibilityControl(const std::string& name) std::string LLFloaterReg::declareDockStateControl(const std::string& name) { std::string controlname = getDockStateControlName(name); - LLUI::sSettingGroups["floater"]->declareBOOL(controlname, FALSE, + LLUI::sSettingGroups["floater"]->declareBOOL(controlname, TRUE, llformat("Window Docking state for %s", name.c_str()), TRUE); return controlname; diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 81d033d7f98..c68d3fe023d 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -107,12 +107,14 @@ BOOL LLNearbyChat::postBuild() void LLNearbyChat::applySavedVariables() { - if (mRectControl.size() > 1) { const LLRect& rect = LLUI::sSettingGroups["floater"]->getRect(mRectControl); - reshape(rect.getWidth(), rect.getHeight()); - setRect(rect); + if(!rect.isEmpty() && rect.isValid()) + { + reshape(rect.getWidth(), rect.getHeight()); + setRect(rect); + } } -- GitLab From 3f469dcef67a0ee79def5b10990a652a0d75eacf Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Thu, 5 Nov 2009 11:30:28 +0000 Subject: [PATCH 157/306] DEV-38840: cosmetic fix to the Pay Resident/Group floater in 2.0. Previously the title for this floater was set to "" and a text string was positioned over the title bar based upon whether you are paying a resident or a group. This could mess up the position of the floater "title" and was also truncating the "Pay Resident" title. Now, we use setTitle() to actually set the floater title appropriately. --- indra/newview/llfloaterpay.cpp | 6 ++-- .../default/xui/en/floater_pay_object.xml | 36 +++++-------------- 2 files changed, 11 insertions(+), 31 deletions(-) diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp index 88811d06fe2..c2389e73a06 100644 --- a/indra/newview/llfloaterpay.cpp +++ b/indra/newview/llfloaterpay.cpp @@ -444,13 +444,11 @@ void LLFloaterPay::onCacheOwnerName(const LLUUID& owner_id, { if (is_group) { - childSetVisible("payee_group",true); - childSetVisible("payee_resident",false); + setTitle(getString("payee_group")); } else { - childSetVisible("payee_group",false); - childSetVisible("payee_resident",true); + setTitle(getString("payee_resident")); } childSetTextArg("payee_name", "[FIRST]", firstname); diff --git a/indra/newview/skins/default/xui/en/floater_pay_object.xml b/indra/newview/skins/default/xui/en/floater_pay_object.xml index 8d230023cc8..1946920a9ce 100644 --- a/indra/newview/skins/default/xui/en/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/en/floater_pay_object.xml @@ -8,32 +8,14 @@ help_topic="give_money" save_rect="true" width="225"> - <text - type="string" - length="1" - follows="left|top" - font="SansSerifBold" - height="18" - layout="topleft" - left="12" - name="payee_group" - top="7" - width="75"> - Pay group: - </text> - <text - type="string" - length="1" - follows="left|top" - font="SansSerifBold" - height="18" - layout="topleft" - left="12" - name="payee_resident" - top="7" - width="75"> - Pay resident: - </text> + <string + name="payee_group"> + Pay Group + </string> + <string + name="payee_resident"> + Pay Resident + </string> <icon height="16" width="16" @@ -41,7 +23,7 @@ mouse_opaque="true" name="icon_person" tool_tip="Person" - top_pad="0" + top_pad="24" left="10" /> <text -- GitLab From a0348b7e271d8bc343ac15049c6c5ea81c4b7f3f Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Thu, 5 Nov 2009 14:19:43 +0200 Subject: [PATCH 158/306] EXT-2023 Camera floater: arrows became shifted when pressed Cause: The different between default texture size and size of the image has influenced on displacement of arrows at rotation. Solution: Transformation matrix has been changed to handle that different --HG-- branch : product-engine --- indra/newview/lljoystickbutton.cpp | 29 +++++++++++++++++++---------- indra/newview/lljoystickbutton.h | 2 +- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp index 4fd3b7bddc8..bd6702a0b2f 100644 --- a/indra/newview/lljoystickbutton.cpp +++ b/indra/newview/lljoystickbutton.cpp @@ -517,43 +517,52 @@ void LLJoystickCameraRotate::draw() LLGLSUIDefault gls_ui; getImageUnselected()->draw( 0, 0 ); + LLPointer<LLUIImage> image = getImageSelected(); if( mInTop ) { - drawRotatedImage( getImageSelected()->getImage(), 0 ); + drawRotatedImage( getImageSelected(), 0 ); } if( mInRight ) { - drawRotatedImage( getImageSelected()->getImage(), 1 ); + drawRotatedImage( getImageSelected(), 1 ); } if( mInBottom ) { - drawRotatedImage( getImageSelected()->getImage(), 2 ); + drawRotatedImage( getImageSelected(), 2 ); } if( mInLeft ) { - drawRotatedImage( getImageSelected()->getImage(), 3 ); + drawRotatedImage( getImageSelected(), 3 ); } } // Draws image rotated by multiples of 90 degrees -void LLJoystickCameraRotate::drawRotatedImage( LLTexture* image, S32 rotations ) +void LLJoystickCameraRotate::drawRotatedImage( LLPointer<LLUIImage> image, S32 rotations ) { S32 width = image->getWidth(); S32 height = image->getHeight(); - + LLTexture* texture = image->getImage(); + + /* + * Scale texture coordinate system + * to handle the different between image size and size of texture. + * If we will use default matrix, + * it may break texture mapping after rotation. + * see EXT-2023 Camera floater: arrows became shifted when pressed. + */ F32 uv[][2] = { - { 1.f, 1.f }, - { 0.f, 1.f }, + { (F32)width/texture->getWidth(), (F32)height/texture->getHeight() }, + { 0.f, (F32)height/texture->getHeight() }, { 0.f, 0.f }, - { 1.f, 0.f } + { (F32)width/texture->getWidth(), 0.f } }; - gGL.getTexUnit(0)->bind(image); + gGL.getTexUnit(0)->bind(texture); gGL.color4fv(UI_VERTEX_COLOR.mV); diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h index 8caef30fa4b..4c657913b8c 100644 --- a/indra/newview/lljoystickbutton.h +++ b/indra/newview/lljoystickbutton.h @@ -150,7 +150,7 @@ class LLJoystickCameraRotate protected: F32 getOrbitRate(); virtual void updateSlop(); - void drawRotatedImage( LLTexture* image, S32 rotations ); + void drawRotatedImage( LLPointer<LLUIImage> image, S32 rotations ); protected: BOOL mInLeft; -- GitLab From 055d9f5eb4ae5d340c64ce741061558344501de4 Mon Sep 17 00:00:00 2001 From: Igor Borovkov <iborovkov@productengine.com> Date: Thu, 5 Nov 2009 15:07:36 +0200 Subject: [PATCH 159/306] IM: removed unused class and xml file for im p2p control panel --HG-- branch : product-engine --- indra/newview/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index fde942ad116..76997385cbb 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -239,7 +239,6 @@ set(viewer_SOURCE_FILES llhudrender.cpp llhudtext.cpp llhudview.cpp - llimcontrolpanel.cpp llimfloater.cpp llimhandler.cpp llimpanel.cpp @@ -721,7 +720,6 @@ set(viewer_HEADER_FILES llhudrender.h llhudtext.h llhudview.h - llimcontrolpanel.h llimfloater.h llimpanel.h llimview.h -- GitLab From de281985ec679c026cc201d2326ecfa3db6a66da Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Thu, 5 Nov 2009 13:18:26 +0000 Subject: [PATCH 160/306] fix that speak button on trunk. --- indra/newview/skins/default/xui/en/panel_bottomtray.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 1da5f0e74d2..dcfd0af36e9 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -60,7 +60,7 @@ min_width="96" name="speak_panel" user_resize="false"> - <chiclet_talk + <talk_button follows="right" height="23" speak_button.tab_stop="true" @@ -293,4 +293,4 @@ top="0" width="26"/> </layout_stack> -</panel> \ No newline at end of file +</panel> -- GitLab From 42e4e37666d3827b5d2ceb77cb13bcdb93068c0c Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Thu, 5 Nov 2009 13:31:17 +0000 Subject: [PATCH 161/306] trivial dead code removal. --- indra/llwindow/llwindowsdl.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 9f03c8f6956..e671fc8a83c 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -418,7 +418,6 @@ static int x11_detect_VRAM_kb() BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync) { //bool glneedsinit = false; -// const char *gllibname = null; llinfos << "createContext, fullscreen=" << fullscreen << " size=" << width << "x" << height << llendl; -- GitLab From 8cec9098cd755a4f70bcf5092d8b66a7c3c702d5 Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Thu, 5 Nov 2009 15:54:05 +0200 Subject: [PATCH 162/306] implemented minor task EXT-1617 No need to expand all accordion panels in the My Landmarks. Rollback previous incorrect behavior in changeset 45ece11eb7d8. --HG-- branch : product-engine --- indra/newview/llpanellandmarks.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 34c146826f5..02bcd385e92 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -100,6 +100,8 @@ BOOL LLLandmarksPanel::postBuild() initLandmarksInventroyPanel(); initMyInventroyPanel(); initLibraryInventroyPanel(); + getChild<LLAccordionCtrlTab>("tab_favorites")->setDisplayChildren(true); + getChild<LLAccordionCtrlTab>("tab_landmarks")->setDisplayChildren(true); gIdleCallbacks.addFunction(LLLandmarksPanel::doIdle, this); return TRUE; @@ -421,6 +423,7 @@ void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLIn mAccordionTabs.push_back(accordion_tab); accordion_tab->setDropDownStateChangedCallback( boost::bind(&LLLandmarksPanel::onAccordionExpandedCollapsed, this, _2, inventory_list)); + accordion_tab->setDisplayChildren(false); } void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLInventorySubTreePanel* inventory_list) @@ -617,21 +620,19 @@ void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const void LLLandmarksPanel::onFoldingAction(const LLSD& userdata) { - LLFolderView* landmarks_folder = mLandmarksInventoryPanel->getRootFolder(); - LLFolderView* fav_folder = mFavoritesInventoryPanel->getRootFolder(); + if(!mCurrentSelectedList) return; + + LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); std::string command_name = userdata.asString(); if ("expand_all" == command_name) { - landmarks_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); - fav_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); - landmarks_folder->arrangeAll(); - fav_folder->arrangeAll(); + root_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); + root_folder->arrangeAll(); } else if ("collapse_all" == command_name) { - landmarks_folder->closeAllFolders(); - fav_folder->closeAllFolders(); + root_folder->closeAllFolders(); } else if ( "sort_by_date" == command_name) { @@ -642,9 +643,6 @@ void LLLandmarksPanel::onFoldingAction(const LLSD& userdata) } else { - if(!mCurrentSelectedList) return; - - LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); root_folder->doToSelected(&gInventory, userdata); } } -- GitLab From 1c3cb11a7b19f6410994b0576ac51b6f7a7ba054 Mon Sep 17 00:00:00 2001 From: Sergey Borushevsky <sborushevsky@productengine.com> Date: Thu, 5 Nov 2009 16:55:29 +0200 Subject: [PATCH 163/306] Fixed major bug EXT-2221 (Teleport History > List item > Arrow button should open Place Profile, not teleport) Fixed major bug EXT-2222 (Remove (i) inspector icon from Places > Teleport History > item) Fixed major bug EXT-2223 (Places > Teleport History > Arrow icon should only appear on mouseover) Actually it's just replacing image for right-side button on history item. --HG-- branch : product-engine --- indra/newview/llpanelteleporthistory.cpp | 16 +++++++++------- .../xui/en/panel_teleport_history_item.xml | 11 +---------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 437af1c4e71..a34f029095b 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -71,9 +71,10 @@ class LLTeleportHistoryFlatItem : public LLPanel static void showPlaceInfoPanel(S32 index); private: - void onInfoBtnClick(); + void onProfileBtnClick(); - LLButton* mInfoBtn; + LLButton* mProfileBtn; + LLTeleportHistoryPanel::ContextMenu *mContextMenu; S32 mIndex; @@ -95,8 +96,9 @@ BOOL LLTeleportHistoryFlatItem::postBuild() LLTextBox *region = getChild<LLTextBox>("region"); region->setValue(mRegionName); - mInfoBtn = getChild<LLButton>("info_btn"); - mInfoBtn->setClickedCallback(boost::bind(&LLTeleportHistoryFlatItem::onInfoBtnClick, this)); + mProfileBtn = getChild<LLButton>("profile_btn"); + + mProfileBtn->setClickedCallback(boost::bind(&LLTeleportHistoryFlatItem::onProfileBtnClick, this)); return true; } @@ -111,7 +113,7 @@ void LLTeleportHistoryFlatItem::setValue(const LLSD& value) void LLTeleportHistoryFlatItem::onMouseEnter(S32 x, S32 y, MASK mask) { childSetVisible("hovered_icon", true); - mInfoBtn->setVisible(true); + mProfileBtn->setVisible(true); LLPanel::onMouseEnter(x, y, mask); } @@ -119,7 +121,7 @@ void LLTeleportHistoryFlatItem::onMouseEnter(S32 x, S32 y, MASK mask) void LLTeleportHistoryFlatItem::onMouseLeave(S32 x, S32 y, MASK mask) { childSetVisible("hovered_icon", false); - mInfoBtn->setVisible(false); + mProfileBtn->setVisible(false); LLPanel::onMouseLeave(x, y, mask); } @@ -142,7 +144,7 @@ void LLTeleportHistoryFlatItem::showPlaceInfoPanel(S32 index) LLSideTray::getInstance()->showPanel("panel_places", params); } -void LLTeleportHistoryFlatItem::onInfoBtnClick() +void LLTeleportHistoryFlatItem::onProfileBtnClick() { LLTeleportHistoryFlatItem::showPlaceInfoPanel(mIndex); } diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml index 0073a1f1a0d..1f67a0a7328 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml @@ -47,16 +47,6 @@ top="4" value="..." width="242" /> - <button - follows="right" - height="16" - image_pressed="Info_Press" - image_unselected="Info_Over" - left_pad="3" - right="-31" - name="info_btn" - top_delta="-2" - width="16" /> <button follows="right" height="20" @@ -66,5 +56,6 @@ right="-3" name="profile_btn" top_delta="-2" + visible="false" width="20" /> </panel> -- GitLab From 4254d1e0f7af0f8f00033bc0edaf74ddd7a49796 Mon Sep 17 00:00:00 2001 From: Eugene Kondrashev <ekondrashev@productengine.com> Date: Thu, 5 Nov 2009 17:10:09 +0200 Subject: [PATCH 164/306] Implemented normal sub-task EXT-2146-IM Message Headers should NOT be of enourmous size (see Style Guide: IM & Voice). --HG-- branch : product-engine --- indra/newview/llchathistory.cpp | 29 +++++-- indra/newview/llchathistory.h | 21 ++++- .../default/xui/en/panel_chat_header.xml | 85 +++++++++---------- .../default/xui/en/panel_chat_separator.xml | 16 +--- .../default/xui/en/widgets/chat_history.xml | 4 + 5 files changed, 86 insertions(+), 69 deletions(-) diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index e561507e69b..2ccd6b7d350 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -132,8 +132,7 @@ class LLChatHistoryHeader: public LLPanel menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); mPopupMenuHandleObject = menu->getHandle(); - LLPanel* visible_panel = getChild<LLPanel>("im_header"); - visible_panel->setMouseDownCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4)); + setMouseDownCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4)); return LLPanel::postBuild(); } @@ -290,7 +289,11 @@ mMessageSeparatorFilename(p.message_separator), mLeftTextPad(p.left_text_pad), mRightTextPad(p.right_text_pad), mLeftWidgetPad(p.left_widget_pad), -mRightWidgetPad(p.right_widget_pad) +mRightWidgetPad(p.right_widget_pad), +mTopSeparatorPad(p.top_separator_pad), +mBottomSeparatorPad(p.bottom_separator_pad), +mTopHeaderPad(p.top_header_pad), +mBottomHeaderPad(p.bottom_header_pad) { } @@ -332,16 +335,30 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& sty LLView* view = NULL; std::string view_text; + LLInlineViewSegment::Params p; + p.force_newline = true; + p.left_pad = mLeftWidgetPad; + p.right_pad = mRightWidgetPad; + if (mLastFromName == chat.mFromName) { view = getSeparator(); view_text = "\n"; + p.top_pad = mTopSeparatorPad; + p.bottom_pad = mBottomSeparatorPad; } else { view = getHeader(chat); view_text = chat.mFromName + MESSAGE_USERNAME_DATE_SEPARATOR + formatCurrentTime() + '\n'; + if (getText().size() == 0) + p.top_pad = 0; + else + p.top_pad = mTopHeaderPad; + p.bottom_pad = mBottomHeaderPad; } + p.view = view; + //Prepare the rect for the view LLRect target_rect = getDocumentView()->getRect(); // squeeze down the widget by subtracting padding off left and right @@ -350,12 +367,6 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& sty view->reshape(target_rect.getWidth(), view->getRect().getHeight()); view->setOrigin(target_rect.mLeft, view->getRect().mBottom); - LLInlineViewSegment::Params p; - p.view = view; - p.force_newline = true; - p.left_pad = mLeftWidgetPad; - p.right_pad = mRightWidgetPad; - appendWidget(p, view_text, false); //Append the text message diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h index 92dcfdd9582..3789ebff4e9 100644 --- a/indra/newview/llchathistory.h +++ b/indra/newview/llchathistory.h @@ -54,6 +54,14 @@ class LLChatHistory : public LLTextEditor Optional<S32> left_widget_pad; //Widget right padding from the scroll rect Optional<S32> right_widget_pad; + //Separator top padding + Optional<S32> top_separator_pad; + //Separator bottom padding + Optional<S32> bottom_separator_pad; + //Header top padding + Optional<S32> top_header_pad; + //Header bottom padding + Optional<S32> bottom_header_pad; Params() : message_header("message_header"), @@ -61,7 +69,11 @@ class LLChatHistory : public LLTextEditor left_text_pad("left_text_pad"), right_text_pad("right_text_pad"), left_widget_pad("left_widget_pad"), - right_widget_pad("right_widget_pad") + right_widget_pad("right_widget_pad"), + top_separator_pad("top_separator_pad"), + bottom_separator_pad("bottom_separator_pad"), + top_header_pad("top_header_pad"), + bottom_header_pad("bottom_header_pad") { } @@ -105,9 +117,16 @@ class LLChatHistory : public LLTextEditor std::string mLastFromName; std::string mMessageHeaderFilename; std::string mMessageSeparatorFilename; + S32 mLeftTextPad; S32 mRightTextPad; + S32 mLeftWidgetPad; S32 mRightWidgetPad; + + S32 mTopSeparatorPad; + S32 mBottomSeparatorPad; + S32 mTopHeaderPad; + S32 mBottomHeaderPad; }; #endif /* LLCHATHISTORY_H_ */ diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml index a9f622e0183..64519b25715 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml @@ -1,53 +1,44 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" + bevel_style="in" + bg_alpha_color="black" follows="left|top|right" - height="57" - label="im_header_container" + height="20" + label="im_header" layout="topleft" - left="8" - name="im_header_container"> - <panel - background_visible="true" - bevel_style="in" - bg_alpha_color="black" - follows="left|top|right" - height="30" - label="im_header" + name="im_header" > + <avatar_icon + follows="left" + height="16" + image_name="icon_avatar_online.tga" layout="topleft" - name="im_header" - top_pad="17"> - <avatar_icon - follows="left" - height="20" - image_name="icon_avatar_online.tga" - layout="topleft" - left="5" - mouse_opaque="true" - name="avatar_icon" - top="5" - width="20" /> - <text - follows="left|right" - font="SansSerifBigBold" - height="20" - layout="topleft" - left_pad="10" - right="-50" - name="user_name" - text_color="white" - top="5" - value="Darth Vader" - use_ellipses="true" /> - <text - follows="right" - font="SansSerifBig" - height="20" - layout="topleft" - name="time_box" - right="0" - text_color="white" - top="5" - value="23:30" - width="50" /> - </panel> + left="2" + mouse_opaque="true" + name="avatar_icon" + top="2" + width="16" /> + <text + follows="left|right" + font="SansSerifBigBold" + height="20" + layout="topleft" + left_pad="6" + right="-50" + name="user_name" + text_color="white" + top="3" + value="Darth Vader" + use_ellipses="true" /> + <text + follows="right" + font="SansSerifBig" + height="20" + layout="topleft" + name="time_box" + right="0" + text_color="white" + top="3" + value="23:30" + width="50" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_chat_separator.xml b/indra/newview/skins/default/xui/en/panel_chat_separator.xml index bacc750e863..d0a2ddb2891 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_separator.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_separator.xml @@ -1,16 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel + background_visible="true" + bg_alpha_color="black" follows="left|right|top" - height="9" + height="1" layout="topleft" - left="8" - name="chat_separator_container"> - <panel - background_visible="true" - bg_alpha_color="black" - follows="left|right|top" - height="1" - layout="topleft" - name="chat_separator_panel" - top_pad="3" /> -</panel> + name="chat_separator_panel" /> diff --git a/indra/newview/skins/default/xui/en/widgets/chat_history.xml b/indra/newview/skins/default/xui/en/widgets/chat_history.xml index ea6997ebd54..32916c08167 100644 --- a/indra/newview/skins/default/xui/en/widgets/chat_history.xml +++ b/indra/newview/skins/default/xui/en/widgets/chat_history.xml @@ -6,6 +6,10 @@ right_text_pad="15" left_widget_pad="0" right_widget_pad="10" + top_separator_pad="5" + bottom_separator_pad="5" + top_header_pad="17" + bottom_header_pad="10" max_length="2147483647" enabled="false" track_bottom="true" -- GitLab From 49db6cd157f5da37f962aa36ab791084c202d439 Mon Sep 17 00:00:00 2001 From: Alexei Arabadji <aarabadji@productengine.com> Date: Thu, 5 Nov 2009 17:43:06 +0200 Subject: [PATCH 165/306] partly impemented EXT-700 '"Offer" notifications should be accessible via chiclet' --HG-- branch : product-engine --- indra/newview/CMakeLists.txt | 1 + indra/newview/llavataractions.cpp | 4 +- indra/newview/llimview.cpp | 1 - indra/newview/llnotificationhandler.h | 24 ++- indra/newview/llnotificationmanager.cpp | 3 + indra/newview/llnotificationofferhandler.cpp | 153 ++++++++++++++++++ indra/newview/llnotificationscripthandler.cpp | 5 +- indra/newview/llscreenchannel.h | 3 +- indra/newview/llsyswellwindow.cpp | 1 + .../skins/default/xui/en/notifications.xml | 8 +- 10 files changed, 193 insertions(+), 10 deletions(-) create mode 100644 indra/newview/llnotificationofferhandler.cpp diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index fde942ad116..b12742be343 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -290,6 +290,7 @@ set(viewer_SOURCE_FILES llnotificationalerthandler.cpp llnotificationgrouphandler.cpp llnotificationmanager.cpp + llnotificationofferhandler.cpp llnotificationscripthandler.cpp llnotificationtiphandler.cpp llnotify.cpp diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 2f674013017..b3a8f85033d 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -57,6 +57,7 @@ #include "llviewerobjectlist.h" #include "llviewermessage.h" // for handle_lure #include "llviewerregion.h" +#include "llimfloater.h" // static @@ -176,7 +177,8 @@ void LLAvatarActions::startIM(const LLUUID& id) std::string name; gCacheName->getFullName(id, name); - gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); + LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); + LLIMFloater::show(session_id); make_ui_sound("UISndStartIM"); } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 66a3e3e85c0..7e8701bf212 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1604,7 +1604,6 @@ LLUUID LLIMMgr::addSession( LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids); } - LLIMFloater::show(session_id); //*TODO remove this "floater" thing when Communicate Floater's gone LLFloaterIMPanel* floater = findFloaterBySession(session_id); diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index cd4e640ec48..23998a0e5d1 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -53,7 +53,8 @@ typedef enum e_notification_type NT_GROUPCHAT, NT_NEARBYCHAT, NT_ALERT, - NT_ALERTMODAL + NT_ALERTMODAL, + NT_OFFER } ENotificationType; /** @@ -231,6 +232,27 @@ class LLAlertHandler : public LLSysHandler bool mIsModal; }; +/** + * Handler for offers notices. + * It manages life time of offer notices. + */ +class LLOfferHandler : public LLSysHandler +{ +public: + LLOfferHandler(e_notification_type type, const LLSD& id); + virtual ~LLOfferHandler(); + + // base interface functions + virtual bool processNotification(const LLSD& notify); + +protected: + virtual void onDeleteToast(LLToast* toast); + virtual void initChannel(); + + // own handlers + void onRejectToast(LLUUID& id); +}; + } #endif diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp index 81a6b32917d..1083cf3634b 100644 --- a/indra/newview/llnotificationmanager.cpp +++ b/indra/newview/llnotificationmanager.cpp @@ -63,6 +63,7 @@ void LLNotificationManager::init() LLNotificationChannel::buildChannel("Alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert")); LLNotificationChannel::buildChannel("AlertModal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal")); LLNotificationChannel::buildChannel("IM Notifications", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "notifytoast")); + LLNotificationChannel::buildChannel("Offer", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "offer")); LLNotifications::instance().getChannel("Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); LLNotifications::instance().getChannel("NotificationTips")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); @@ -70,6 +71,7 @@ void LLNotificationManager::init() LLNotifications::instance().getChannel("Alerts")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); LLNotifications::instance().getChannel("IM Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); + LLNotifications::instance().getChannel("Offer")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); mNotifyHandlers["notify"] = boost::shared_ptr<LLEventHandler>(new LLScriptHandler(NT_NOTIFY, LLSD())); mNotifyHandlers["notifytip"] = boost::shared_ptr<LLEventHandler>(new LLTipHandler(NT_NOTIFY, LLSD())); @@ -80,6 +82,7 @@ void LLNotificationManager::init() mNotifyHandlers["notifytoast"] = boost::shared_ptr<LLEventHandler>(new LLIMHandler(NT_IMCHAT, LLSD())); mNotifyHandlers["nearbychat"] = boost::shared_ptr<LLEventHandler>(new LLNearbyChatHandler(NT_NEARBYCHAT, LLSD())); + mNotifyHandlers["offer"] = boost::shared_ptr<LLEventHandler>(new LLOfferHandler(NT_OFFER, LLSD())); } //-------------------------------------------------------------------------- diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp new file mode 100644 index 00000000000..8e3a44682c8 --- /dev/null +++ b/indra/newview/llnotificationofferhandler.cpp @@ -0,0 +1,153 @@ +/** + * @file llnotificationofferhandler.cpp + * @brief Notification Handler Class for Simple Notifications and Notification Tips + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + + +#include "llviewerprecompiledheaders.h" // must be first include + +#include "llnotificationhandler.h" +#include "lltoastnotifypanel.h" +#include "llviewercontrol.h" +#include "llviewerwindow.h" +#include "llimview.h" +#include "llimfloater.h" +#include "llnotificationmanager.h" + +using namespace LLNotificationsUI; + +//-------------------------------------------------------------------------- +LLOfferHandler::LLOfferHandler(e_notification_type type, const LLSD& id) +{ + mType = type; + + // Getting a Channel for our notifications + mChannel = LLChannelManager::getInstance()->createNotificationChannel(); + mChannel->setControlHovering(true); + + LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); + if(channel) + channel->setOnRejectToastCallback(boost::bind(&LLOfferHandler::onRejectToast, this, _1)); +} + +//-------------------------------------------------------------------------- +LLOfferHandler::~LLOfferHandler() +{ +} + +//-------------------------------------------------------------------------- +void LLOfferHandler::initChannel() +{ + S32 channel_right_bound = gViewerWindow->getWorldViewRect().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); + S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); + mChannel->init(channel_right_bound - channel_width, channel_right_bound); +} + +//-------------------------------------------------------------------------- +bool LLOfferHandler::processNotification(const LLSD& notify) +{ + if(!mChannel) + { + return false; + } + + LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID()); + + if(!notification) + return false; + + // arrange a channel on a screen + if(!mChannel->getVisible()) + { + initChannel(); + } + + if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change") + { + // add message to IM + LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, notification->getPayload()["from_id"]); + if (!LLIMMgr::instance().hasSession(session_id)) + { + // create session with faked type to avoid creating chicklets + session_id = LLIMMgr::instance().addSession( + notification->getSubstitutions()["NAME"], IM_NOTHING_SPECIAL, + notification->getPayload()["from_id"]); + } + LLIMMgr::instance().addMessage(session_id, LLUUID(), + notification->getSubstitutions()["NAME"], + notification->getMessage()); + + LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification); + + LLToast::Params p; + p.notif_id = notification->getID(); + p.notification = notification; + p.panel = notify_box; + p.on_delete_toast = boost::bind(&LLOfferHandler::onDeleteToast, this, _1); + + LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel); + if(channel) + channel->addToast(p); + + // send a signal to the counter manager + mNewNotificationSignal(); + } + else if (notify["sigtype"].asString() == "delete") + { + mChannel->killToastByNotificationID(notification->getID()); + } + + return true; +} + +//-------------------------------------------------------------------------- + +void LLOfferHandler::onDeleteToast(LLToast* toast) +{ + // send a signal to the counter manager + mDelNotificationSignal(); + + // send a signal to a listener to let him perform some action + // in this case listener is a SysWellWindow and it will remove a corresponding item from its list + mNotificationIDSignal(toast->getNotificationID()); +} + +//-------------------------------------------------------------------------- +void LLOfferHandler::onRejectToast(LLUUID& id) +{ + LLNotificationPtr notification = LLNotifications::instance().find(id); + + if (notification + && LLNotificationManager::getInstance()->getHandlerForNotification( + notification->getType()) == this) + { + LLNotifications::instance().cancel(notification); + } +} diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index 070af432d6c..dac7a4ca3a4 100644 --- a/indra/newview/llnotificationscripthandler.cpp +++ b/indra/newview/llnotificationscripthandler.cpp @@ -37,6 +37,7 @@ #include "lltoastnotifypanel.h" #include "llviewercontrol.h" #include "llviewerwindow.h" +#include "llnotificationmanager.h" using namespace LLNotificationsUI; @@ -129,7 +130,9 @@ void LLScriptHandler::onRejectToast(LLUUID& id) { LLNotificationPtr notification = LLNotifications::instance().find(id); - if(notification) + if (notification + && LLNotificationManager::getInstance()->getHandlerForNotification( + notification->getType()) == this) { LLNotifications::instance().cancel(notification); } diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index 987bc4b596a..fd31690622f 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -204,8 +204,7 @@ class LLScreenChannel : public LLScreenChannelBase // signal on rejecting of a toast event typedef boost::function<void (LLUUID id)> reject_tost_callback_t; typedef boost::signals2::signal<void (LLUUID id)> reject_tost_signal_t; - reject_tost_signal_t mRejectToastSignal; - boost::signals2::connection setOnRejectToastCallback(reject_tost_callback_t cb) { return mRejectToastSignal.connect(cb); } + reject_tost_signal_t mRejectToastSignal; boost::signals2::connection setOnRejectToastCallback(reject_tost_callback_t cb) { return mRejectToastSignal.connect(cb); } private: struct ToastElem diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index c2554184296..723ac0fc33a 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -66,6 +66,7 @@ BOOL LLSysWellWindow::postBuild() // init connections to the list's update events connectListUpdaterToSignal("notify"); connectListUpdaterToSignal("groupnotify"); + connectListUpdaterToSignal("offer"); // get a corresponding channel initChannel(); diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index babed28f10e..f26a4d09d45 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4982,7 +4982,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a <notification icon="notify.tga" name="UserGiveItem" - type="notify"> + type="offer"> [NAME] has given you a [OBJECTTYPE] named '[OBJECTNAME]'. <form name="form"> <button @@ -5028,7 +5028,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a <notification icon="notify.tga" name="TeleportOffered" - type="notify"> + type="offer"> [NAME] has offered to teleport you to their location: [MESSAGE] @@ -5065,7 +5065,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a <notification icon="notify.tga" name="OfferFriendship" - type="notify"> + type="offer"> [NAME] is offering friendship. [MESSAGE] @@ -5105,7 +5105,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a <notification icon="notify.tga" name="FriendshipAccepted" - type="notify"> + type="offer"> [NAME] accepted your friendship offer. </notification> -- GitLab From 33a56087faaf65da3d391aa6923f065b198a54d9 Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk <slitovchuk@productengine.com> Date: Thu, 5 Nov 2009 18:09:15 +0200 Subject: [PATCH 166/306] - Fixed EXT-2054 "Hook up parcel permission icons to parcel profile" implementation: moved icon file names to XML. --HG-- branch : product-engine --- indra/newview/llpanelplaceprofile.cpp | 69 ++++++++++++++----- .../default/xui/en/panel_place_profile.xml | 55 ++++++++++++--- 2 files changed, 97 insertions(+), 27 deletions(-) diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index b2a9f6f2513..81f4f1f569a 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -55,6 +55,23 @@ static LLRegisterPanelClassWrapper<LLPanelPlaceProfile> t_place_profile("panel_place_profile"); +// Statics for textures filenames +static std::string icon_pg; +static std::string icon_m; +static std::string icon_r; +static std::string icon_voice; +static std::string icon_voice_no; +static std::string icon_fly; +static std::string icon_fly_no; +static std::string icon_push; +static std::string icon_push_no; +static std::string icon_build; +static std::string icon_build_no; +static std::string icon_scripts; +static std::string icon_scripts_no; +static std::string icon_damage; +static std::string icon_damage_no; + LLPanelPlaceProfile::LLPanelPlaceProfile() : LLPanelPlaceInfo(), mForSalePanel(NULL), @@ -119,6 +136,22 @@ BOOL LLPanelPlaceProfile::postBuild() mResaleText = getChild<LLTextEditor>("resale"); mSaleToText = getChild<LLTextBox>("sale_to"); + icon_pg = getString("icon_PG"); + icon_m = getString("icon_M"); + icon_r = getString("icon_R"); + icon_voice = getString("icon_Voice"); + icon_voice_no = getString("icon_VoiceNo"); + icon_fly = getString("icon_Fly"); + icon_fly_no = getString("icon_FlyNo"); + icon_push = getString("icon_Push"); + icon_push_no = getString("icon_PushNo"); + icon_build = getString("icon_Build"); + icon_build_no = getString("icon_BuildNo"); + icon_scripts = getString("icon_Scripts"); + icon_scripts_no = getString("icon_ScriptsNo"); + icon_damage = getString("icon_Damage"); + icon_damage_no = getString("icon_DamageNo"); + return TRUE; } @@ -231,22 +264,22 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, case SIM_ACCESS_MATURE: parcel_data.flags = 0x1; - mParcelRatingIcon->setValue("parcel_drk_M"); - mRegionRatingIcon->setValue("parcel_drk_M"); + mParcelRatingIcon->setValue(icon_m); + mRegionRatingIcon->setValue(icon_m); break; case SIM_ACCESS_ADULT: parcel_data.flags = 0x2; - mParcelRatingIcon->setValue("parcel_drk_R"); - mRegionRatingIcon->setValue("parcel_drk_R"); + mParcelRatingIcon->setValue(icon_r); + mRegionRatingIcon->setValue(icon_r); break; default: parcel_data.flags = 0; - mParcelRatingIcon->setValue("parcel_drk_PG"); - mRegionRatingIcon->setValue("parcel_drk_PG"); + mParcelRatingIcon->setValue(icon_pg); + mRegionRatingIcon->setValue(icon_pg); } std::string rating = LLViewerRegion::accessToString(sim_access); @@ -270,45 +303,45 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, // Processing parcel characteristics if (parcel->getParcelFlagAllowVoice()) { - mVoiceIcon->setValue("parcel_drk_Voice"); + mVoiceIcon->setValue(icon_voice); mVoiceText->setText(on); } else { - mVoiceIcon->setValue("parcel_drk_VoiceNo"); + mVoiceIcon->setValue(icon_voice_no); mVoiceText->setText(off); } if (!region->getBlockFly() && parcel->getAllowFly()) { - mFlyIcon->setValue("parcel_drk_Fly"); + mFlyIcon->setValue(icon_fly); mFlyText->setText(on); } else { - mFlyIcon->setValue("parcel_drk_FlyNo"); + mFlyIcon->setValue(icon_fly_no); mFlyText->setText(off); } if (region->getRestrictPushObject() || parcel->getRestrictPushObject()) { - mPushIcon->setValue("parcel_drk_PushNo"); + mPushIcon->setValue(icon_push_no); mPushText->setText(off); } else { - mPushIcon->setValue("parcel_drk_Push"); + mPushIcon->setValue(icon_push); mPushText->setText(on); } if (parcel->getAllowModify()) { - mBuildIcon->setValue("parcel_drk_Build"); + mBuildIcon->setValue(icon_build); mBuildText->setText(on); } else { - mBuildIcon->setValue("parcel_drk_BuildNo"); + mBuildIcon->setValue(icon_build_no); mBuildText->setText(off); } @@ -316,23 +349,23 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) || !parcel->getAllowOtherScripts()) { - mScriptsIcon->setValue("parcel_drk_ScriptsNo"); + mScriptsIcon->setValue(icon_scripts_no); mScriptsText->setText(off); } else { - mScriptsIcon->setValue("parcel_drk_Scripts"); + mScriptsIcon->setValue(icon_scripts); mScriptsText->setText(on); } if (region->getAllowDamage() || parcel->getAllowDamage()) { - mDamageIcon->setValue("parcel_drk_Damage"); + mDamageIcon->setValue(icon_damage); mDamageText->setText(on); } else { - mDamageIcon->setValue("parcel_drk_DamageNo"); + mDamageIcon->setValue(icon_damage_no); mDamageText->setText(off); } diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 4dc65fa7363..34a5f96f2b0 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -92,6 +92,52 @@ name="acquired_date"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </string> + <!-- Texture names for parcel permissions icons --> + <string + name="icon_PG" + value="parcel_drk_PG" /> + <string + name="icon_M" + value="parcel_drk_M" /> + <string + name="icon_R" + value="parcel_drk_R" /> + <string + name="icon_Voice" + value="parcel_drk_Voice" /> + <string + name="icon_VoiceNo" + value="parcel_drk_VoiceNo" /> + <string + name="icon_Fly" + value="parcel_drk_Fly" /> + <string + name="icon_FlyNo" + value="parcel_drk_FlyNo" /> + <string + name="icon_Push" + value="parcel_drk_Push" /> + <string + name="icon_PushNo" + value="parcel_drk_PushNo" /> + <string + name="icon_Build" + value="parcel_drk_Build" /> + <string + name="icon_BuildNo" + value="parcel_drk_BuildNo" /> + <string + name="icon_Scripts" + value="parcel_drk_Scripts" /> + <string + name="icon_ScriptsNo" + value="parcel_drk_ScriptsNo" /> + <string + name="icon_Damage" + value="parcel_drk_Damage" /> + <string + name="icon_DamageNo" + value="parcel_drk_DamageNo" /> <button follows="top|right" height="23" @@ -212,15 +258,6 @@ use_ellipses="true" value="SampleRegion" width="290" /> - <!-- <icon - follows="top|right" - height="16" - image_name="Icon_For_Sale" - layout="topleft" - left="3" - mouse_opaque="true" - name="icon_for_sale" - width="16" />--> <text follows="left|top|right" height="14" -- GitLab From a82ab8690f03f8571e536aa2a3a29e5f653e230e Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk <slitovchuk@productengine.com> Date: Thu, 5 Nov 2009 18:20:00 +0200 Subject: [PATCH 167/306] No ticket. Merged recent changes in panel_place_info.xml to new XML layouts and removed the obsolete xml. --HG-- branch : product-engine --- indra/newview/skins/default/xui/en/panel_landmark_info.xml | 1 - indra/newview/skins/default/xui/en/panel_place_profile.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index 03ba7f7c81f..0c24adfad59 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -50,7 +50,6 @@ layout="topleft" left="10" name="back_btn" - picture_style="true" tab_stop="false" top="0" width="23" /> diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 34a5f96f2b0..65f150b33c6 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -145,7 +145,6 @@ layout="topleft" left="10" name="back_btn" - picture_style="true" tab_stop="false" top="0" width="23" /> -- GitLab From 8c042fde4f1103a44cbd50e15c7221d46db82288 Mon Sep 17 00:00:00 2001 From: Andrew Dyukov <adyukov@productengine.com> Date: Thu, 5 Nov 2009 18:27:40 +0200 Subject: [PATCH 168/306] Fixed reopened minor bug EXT-1854 (Area of working for nav bar context menu is changed) --HG-- branch : product-engine --- indra/newview/skins/default/xui/en/panel_navigation_bar.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index ae11f028ca7..34f9e1daf50 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -22,7 +22,7 @@ <icon follows="all" image_name="NavBar_BG_NoFav" - mouse_opaque="true" + mouse_opaque="false" name="bg_icon_no_fav" scale_image="true" visible="false" -- GitLab From 1af422bb4182a9b82da45f19e7e8cbf755619959 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Thu, 5 Nov 2009 17:14:28 +0000 Subject: [PATCH 169/306] DEV-42155 EXT-2077: Speak button should use Widget_UpArrow instead of a down arrow I added two new graphics which are simply the former combobox graphics with the arrow part flipped. --- indra/newview/skins/default/textures/textures.xml | 2 ++ .../textures/widgets/ComboButton_UpOff.png | Bin 0 -> 466 bytes .../textures/widgets/ComboButton_UpSelected.png | Bin 0 -> 536 bytes .../skins/default/xui/en/widgets/talk_button.xml | 4 ++-- 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png create mode 100644 indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 2b9ebd05730..6ded2e77f5c 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -67,7 +67,9 @@ <texture name="ComboButton_Over" file_name="widgets/ComboButton_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_Press" file_name="widgets/ComboButton_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> + <texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> + <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="Container" file_name="containers/Container.png" preload="false" /> <texture name="DisclosureArrow_Closed_Off" file_name="widgets/DisclosureArrow_Closed_Off.png" preload="true" /> diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png b/indra/newview/skins/default/textures/widgets/ComboButton_UpOff.png new file mode 100644 index 0000000000000000000000000000000000000000..2330cb420bbefe64451c1a403c4b9b878aa7ee0e GIT binary patch literal 466 zcmV;@0WJQCP)<h;3K|Lk000e1NJLTq000&M000*V1^@s659q(100001b5ch_0Itp) z=>Px$j7da6R5;7EmA`HpK@i5jnOh@4v6T^JigcF!4oGPa*$)9vKueL1J{@9t2qULX zlUE=Tk<!E|L&F_X(Cy5mF!-PDXuKY2rQMb0x8Ka{>=J;_NMjMeF92W7Z0n}e>6NNl z3UW~tm&@hyf{4DjqA04(X7lf@P$EL7({cTN|HFE{{^Uf&L?o5ss?};`X7<sU8B`Ui z?7%y7s;VNAjI62z04~M|5lN;v#s~m#s%oij#X+$>f>Ram1vtiNF~(Z(cDt>P^AN)I za5%g@uD$nXbv{*9836FZA@#=0#LN^zxB);Rgq!1DlaHAx0Jz<5M`c-3LuA=}KF`gb z0-DWc*Q3$st}M%12N59vU?LJ`t{scTB4=j29*6x#KLBuM)_5!OJpa*Dq+YLQCyRHg z^Sa&c&lA;e?7T<C_B@GiZ|Nt+3Ary6Cx3+AEfvgMF%nvqWwhV##e4tTsVds-c9sGx zBDPws{tgC%@098@WoGf--%lo!Z{zX!51H9{s`LV=0F(gqKZesj#@172od5s;07*qo IM6N<$f_MbjEC2ui literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png b/indra/newview/skins/default/textures/widgets/ComboButton_UpSelected.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b5c2e1d414f053f82f6bf80536c166e0897bfc GIT binary patch literal 536 zcmV+z0_XjSP)<h;3K|Lk000e1NJLTq000&M000*V1^@s659q(100001b5ch_0Itp) z=>Px$(n&-?R5;76Rk4oRKoEU1yO9hrE1`q%0r`LwCsCzK&0p{VNS3TvqR3CBN|7dC zaZ;LuDmno<I3pX+Op3#ZaB#)hPkP0U#-ryqv$F)?3)(>i;3t5uX7)gX!Qj5z?Uv3t zX;73@l>t;D@@=tLeD?i*|4$spf1@ZW8p*9HR}@8Wv)O!f&VBMBgom4(oBI&L?zKhD z3?jno_4-j&-<jEaA4O3S$MG(N@YqDLs<NtLx7+np^^G?(6A={=ZP+{|qRKh92LP|C z5D|z-<FODCs6OfQc7Uo{)53MFTCs_UiHNnJ_$ZJMHds|v&$wJJ%bL^a^uy`-QvN|8 z0DzxdxC~|{W~MYv#{eiz({UZU_Kle-0B~8Bl;=5Zx7%k_RhJ~m*vzPAk|bkQb(iw< zJg2fO2>_Ugl$n*8<(yfT-FokF&MeDrFXc0{5|JL8SM$6Xv)OEQtx==V$Sz!xV;z48 z9Ov&8!{PAmg`4(b%$wPN^Vh;0<EXe^ByGZ**;OlEv50W0*jl#2n0e1_{koYE052jM zLipv2qKG=3PESN!lSQwpTolFI)oOJ&nM{6ATaPI-O9<ijd_Mo4B*}uzY|xe)0QLa3 a0Q4UVuHu)AGM!Wa0000<MNUMnLSTZ{ko&#> literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml index 725492052ca..00793b4ed63 100644 --- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml +++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml @@ -24,8 +24,8 @@ tab_stop="false" is_toggle="true" picture_style="true" - image_selected="ComboButton_Selected" - image_unselected="ComboButton_Off" + image_selected="ComboButton_UpSelected" + image_unselected="ComboButton_UpOff" /> <monitor name="monitor" -- GitLab From b6aef7ea394430ab29698a2a4f1a4d9d93faeff0 Mon Sep 17 00:00:00 2001 From: Andrew Dyukov <adyukov@productengine.com> Date: Thu, 5 Nov 2009 19:20:56 +0200 Subject: [PATCH 170/306] Fixed EXT-1769 (Edit Pick: '+' icon blinks on mouse over), but new icon is needed. --HG-- branch : product-engine --- indra/newview/llpanelpick.cpp | 2 ++ indra/newview/skins/default/xui/en/panel_edit_pick.xml | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp index 103f0416865..f5c4f89702b 100644 --- a/indra/newview/llpanelpick.cpp +++ b/indra/newview/llpanelpick.cpp @@ -413,6 +413,8 @@ BOOL LLPanelPickEdit::postBuild() childSetAction(XML_BTN_SAVE, boost::bind(&LLPanelPickEdit::onClickSave, this)); childSetAction("set_to_curr_location_btn", boost::bind(&LLPanelPickEdit::onClickSetLocation, this)); + initTexturePickerMouseEvents(); + return TRUE; } diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml index 282b3f3e554..f4a212ba0a6 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml @@ -64,9 +64,9 @@ top="20" left="10" name="pick_snapshot" /> - <button + <icon height="18" - image_overlay="AddItem_Off" + image_name="AddItem_Off" layout="topleft" right="-5" name="edit_icon" -- GitLab From 3cd5d0d9d5bbe104a6f4cafce57c1eb95fc9495d Mon Sep 17 00:00:00 2001 From: Andrew Dyukov <adyukov@productengine.com> Date: Thu, 5 Nov 2009 19:30:27 +0200 Subject: [PATCH 171/306] No ticket. Fixed '+' not hiding in edit profile, but new icon is needed. --HG-- branch : product-engine --- indra/newview/skins/default/xui/en/panel_edit_profile.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml index fedc49ae87b..2378ae518bf 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml @@ -116,9 +116,9 @@ top_pad="0" width="102" /> </panel> - <button + <icon height="18" - image_overlay="AddItem_Off" + image_name="AddItem_Off" layout="topleft" name="2nd_life_edit_icon" label="" @@ -171,9 +171,9 @@ top_pad="0" width="102" /> </panel> - <button + <icon height="18" - image_overlay="AddItem_Off" + image_name="AddItem_Off" layout="topleft" name="real_world_edit_icon" label="" -- GitLab From 888bc27cf655d5d64325241b2516795e58e16064 Mon Sep 17 00:00:00 2001 From: Andrew Dyukov <adyukov@productengine.com> Date: Thu, 5 Nov 2009 19:44:18 +0200 Subject: [PATCH 172/306] Fixed normal bug EXT-1526. We decided to show full name via tooltip, because if name is long without truncating it we'd have to manually move widgets that are below it(which is hard to do). --HG-- branch : product-engine --- indra/newview/llpanelgroup.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index 10f015774af..61f23961687 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -291,6 +291,7 @@ void LLPanelGroup::update(LLGroupChange gc) if(gdatap) { childSetValue("group_name", gdatap->mName); + childSetToolTip("group_name",gdatap->mName); LLButton* btn_join = getChild<LLButton>("btn_join"); LLUICtrl* join_text = getChild<LLUICtrl>("join_cost_text"); @@ -337,7 +338,10 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id) LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mID); if(gdatap) + { childSetValue("group_name", gdatap->mName); + childSetToolTip("group_name",gdatap->mName); + } LLButton* button_apply = findChild<LLButton>("btn_apply"); LLButton* button_refresh = findChild<LLButton>("btn_refresh"); -- GitLab From fd7d01c7094c1f8adad02b16c5865944a34737c9 Mon Sep 17 00:00:00 2001 From: Lis Pardi <lis@lindenlab.com> Date: Thu, 5 Nov 2009 12:48:28 -0500 Subject: [PATCH 173/306] ext-2085 make leave group icon not a trash can H: Enter commit message. Lines beginning with 'HG:' are removed. --- .../xui/en/menu_people_groups_view_sort.xml | 11 ++++++++++ .../skins/default/xui/en/panel_people.xml | 22 +++++++++---------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml index 2bec7454109..6dd44255bf3 100644 --- a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml +++ b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml @@ -13,4 +13,15 @@ function="CheckControl" parameter="GroupListShowIcons" /> </menu_item_check> + <menu_item_check + label="Leave Selected Group" + layout="topleft" + name="Leave Selected Group"> + <menu_item_check.on_click + function="People.Groups.ViewSort.Action" + parameter="show_icons" /> + <menu_item_check.on_check + function="CheckControl" + parameter="GroupListShowIcons" /> + </menu_item_check> </menu> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index c8194a286b8..ed21c5cc6c6 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -95,6 +95,7 @@ background_visible="true" layout="topleft" left="10" name="nearby_view_sort_btn" + picture_style="true" top="5" width="18" /> <button @@ -106,6 +107,7 @@ background_visible="true" layout="topleft" left_pad="5" name="add_friend_btn" + picture_style="true" top_delta="0" tool_tip="Add selected resident to your friends List" width="18" /> @@ -181,6 +183,7 @@ background_visible="true" layout="topleft" left="10" name="friends_viewsort_btn" + picture_style="true" top="5" width="18" /> <button @@ -192,6 +195,7 @@ background_visible="true" layout="topleft" left_pad="5" name="add_btn" + picture_style="true" tool_tip="Offer friendship to a resident" top_delta="0" width="18" /> @@ -205,6 +209,7 @@ background_visible="true" left_pad="10" right="-10" name="del_btn" + picture_style="true" tool_tip="Remove selected person from your Friends list" top_delta="0" width="18" /> @@ -247,6 +252,7 @@ background_visible="true" layout="topleft" left="10" name="groups_viewsort_btn" + picture_style="true" top="7" width="18" /> <button @@ -258,6 +264,7 @@ background_visible="true" layout="topleft" left_pad="5" name="plus_btn" + picture_style="true" tool_tip="Join group/Create new group" top_delta="0" width="18" /> @@ -270,21 +277,10 @@ background_visible="true" layout="topleft" left_pad="24" name="activate_btn" + picture_style="true" tool_tip="Activate selected group" top_delta="5" width="10" /> - <button - follows="bottom|left" - height="18" - image_selected="TrashItem_Press" - image_unselected="TrashItem_Off" - layout="topleft" - left_pad="10" - right="-10" - name="minus_btn" - tool_tip="Leave selected group" - top_delta="-5" - width="18" /> </panel> </panel> <panel @@ -327,6 +323,7 @@ background_visible="true" layout="topleft" left="10" name="recent_viewsort_btn" + picture_style="true" top="7" width="18" /> <button @@ -338,6 +335,7 @@ background_visible="true" layout="topleft" left_pad="5" name="add_friend_btn" + picture_style="true" top_delta="0" tool_tip="Add selected resident to your friends List" width="18" /> -- GitLab From 78923934c783accf33c9a6e68fadd699227ed3d5 Mon Sep 17 00:00:00 2001 From: Lis Pardi <lis@lindenlab.com> Date: Thu, 5 Nov 2009 12:51:49 -0500 Subject: [PATCH 174/306] ext-146 appearance floater has layout issues ext-1942 there is corrupted UI in the Skin, Hair, Shirt, Pants tabs in the Edit Appearance dlg --- .../default/xui/en/floater_customize.xml | 31 +++++++------------ 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml index c021dd79de1..f54b6eecfb7 100644 --- a/indra/newview/skins/default/xui/en/floater_customize.xml +++ b/indra/newview/skins/default/xui/en/floater_customize.xml @@ -193,7 +193,7 @@ font="SansSerif" height="16" layout="topleft" - left="26" + left="8" name="title" top="8" width="355"> @@ -299,7 +299,7 @@ scratch and wear it. left="8" name="Create New" top="104" - width="120" /> + width="140" /> <button follows="right|bottom" height="20" @@ -342,9 +342,10 @@ scratch and wear it. top="4" width="18" /> <icon + follows="left|top" height="16" layout="topleft" - left_delta="-325" + left="8" mouse_opaque="true" top_delta="3" width="16" /> @@ -399,7 +400,7 @@ scratch and wear it. font="SansSerif" height="16" layout="topleft" - left="26" + left="8" name="title" top="8" width="355"> @@ -599,7 +600,7 @@ scratch and wear it. <icon height="16" layout="topleft" - left_delta="-325" + left="8" mouse_opaque="true" top_delta="3" width="16" /> @@ -654,7 +655,7 @@ scratch and wear it. font="SansSerif" height="16" layout="topleft" - left="26" + left="8" name="title" top="8" width="355"> @@ -1015,7 +1016,7 @@ scratch and wear it. <icon height="16" layout="topleft" - left_delta="-325" + left="8" mouse_opaque="true" top_delta="3" width="16" /> @@ -1100,7 +1101,7 @@ scratch and wear it. font="SansSerif" height="16" layout="topleft" - left="26" + left="8" name="title" top="8" width="355"> @@ -1221,7 +1222,7 @@ scratch and wear it. <icon height="16" layout="topleft" - left_delta="-325" + left="8" mouse_opaque="true" top_delta="3" width="16" /> @@ -1306,7 +1307,7 @@ scratch and wear it. font="SansSerif" height="16" layout="topleft" - left="26" + left="8" name="title" top="8" width="355"> @@ -3378,16 +3379,6 @@ scratch and wear it. layout="topleft" name="panel_list" /> </scroll_container> - <button - bottom="536" - follows="right|bottom" - height="20" - label="Make Outfit" - label_selected="Make Outfit" - layout="topleft" - name="make_outfit_btn" - right="-216" - width="100" /> <button bottom="536" follows="right|bottom" -- GitLab From e638e77047510eb9ddf49f7e981a5742561721d7 Mon Sep 17 00:00:00 2001 From: Andrew Polunin <apolunin@productengine.com> Date: Thu, 5 Nov 2009 20:17:16 +0200 Subject: [PATCH 175/306] fixed normal bug EXT-2029 Double clicking group does not start chat --HG-- branch : product-engine --- indra/newview/llpanelpeople.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 2f8fae0f5de..c8bb3d5353c 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -454,7 +454,7 @@ BOOL LLPanelPeople::postBuild() mNearbyList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mNearbyList)); mRecentList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mRecentList)); - mGroupList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onGroupInfoButtonClicked, this)); + mGroupList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onChatButtonClicked, this)); mGroupList->setCommitCallback(boost::bind(&LLPanelPeople::updateButtons, this)); LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>("tab_all"); -- GitLab From 341b6e4058f50915862b932ef5655c55f23f7ffc Mon Sep 17 00:00:00 2001 From: Dmitry Oleshko <doleshko@productengine.com> Date: Thu, 5 Nov 2009 20:29:01 +0200 Subject: [PATCH 176/306] partial fix for a normal Sub-task (EXT-988) Change indication of unread messges in chiclets --HG-- branch : product-engine --- indra/newview/llchiclet.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 0a187ca4225..6fd7e6b07db 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -212,7 +212,7 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p) LLRect chiclet_rect = p.rect; LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.mTop, chiclet_rect.mRight, chiclet_rect.getHeight()/2); // shift an icon a little bit to the right and up corner of a chiclet - overlay_icon_rect.translate(overlay_icon_rect.getWidth()/4, overlay_icon_rect.getHeight()/4); + overlay_icon_rect.translate(overlay_icon_rect.getWidth()/5, overlay_icon_rect.getHeight()/5); mNewMessagesIcon->setRect(overlay_icon_rect); addChild(mNewMessagesIcon); @@ -247,8 +247,6 @@ BOOL LLIMChiclet::handleMouseDown(S32 x, S32 y, MASK mask) void LLIMChiclet::draw() { LLUICtrl::draw(); - - gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.0f,0.0f,0.0f,1.f), FALSE); } // static -- GitLab From 65497c0b6f639f4940d2a0185eb5befc4127a38e Mon Sep 17 00:00:00 2001 From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com> Date: Thu, 5 Nov 2009 13:36:38 -0500 Subject: [PATCH 177/306] Added Favorite_Link_Over (re-do: failed commit? merge bork?). http://jira.secondlife.com/browse/EXT-2218 --- indra/newview/skins/default/textures/textures.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 2b9ebd05730..ea81c478664 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -89,6 +89,7 @@ <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" /> <texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" /> <texture name="Favorite_Star_Over" file_name="navbar/Favorite_Star_Over.png" preload="false" /> + <texture name="Favorite_Link_Over" file_name="navbar/Favorite_Link_Over.png" preload="false" /> <texture name="FileMenu_BarSelect" file_name="navbar/FileMenu_BarSelect.png" preload="false" scale.left="2" scale.top="0" scale.right="2" scale.bottom="0" /> <texture name="FileMenu_BG" file_name="navbar/FileMenu_BG.png" preload="false" /> -- GitLab From daf3adc4ae349cf37b4b1d7caee1268a3febb430 Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Thu, 5 Nov 2009 20:40:34 +0200 Subject: [PATCH 178/306] implemented major task EXT-2153 make changes to Communicate menu --HG-- branch : product-engine --- indra/newview/llviewermenu.cpp | 22 +++---------- .../default/xui/en/menu_inspect_self_gear.xml | 7 ++-- .../skins/default/xui/en/menu_viewer.xml | 32 ++++++++----------- 3 files changed, 21 insertions(+), 40 deletions(-) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 2c2b2047cae..300ebf4e243 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3442,26 +3442,13 @@ void handle_show_side_tray() root->addChild(side_tray); } -class LLSelfFriends : public view_listener_t +class LLShowPanelPeopleTab : public view_listener_t { bool handleEvent(const LLSD& userdata) { - // Open "Friends" tab of the "People" panel in side tray. + // Open tab of the "People" panel in side tray. LLSD param; - param["people_panel_tab_name"] = "friends_panel"; - - LLSideTray::getInstance()->showPanel("panel_people", param); - return true; - } -}; - -class LLSelfGroups : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - // Open "Groups" tab of the "People" panel in side tray. - LLSD param; - param["people_panel_tab_name"] = "groups_panel"; + param["people_panel_tab_name"] = userdata.asString(); LLSideTray::getInstance()->showPanel("panel_people", param); return true; } @@ -8022,8 +8009,7 @@ void initialize_menus() view_listener_t::addMenu(new LLSelfEnableRemoveAllAttachments(), "Self.EnableRemoveAllAttachments"); // we don't use boost::bind directly to delay side tray construction - view_listener_t::addMenu(new LLSelfFriends(), "Self.Friends"); - view_listener_t::addMenu(new LLSelfGroups(), "Self.Groups"); + view_listener_t::addMenu( new LLShowPanelPeopleTab(), "SideTray.PanelPeopleTab"); // Avatar pie menu view_listener_t::addMenu(new LLObjectMute(), "Avatar.Mute"); diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml index ce5ee83f556..3d65878cf86 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml @@ -36,13 +36,14 @@ label="My Friends" name="my_friends"> <menu_item_call.on_click - function="Self.Friends" - parameter="" /> + function="SideTray.PanelPeopleTab" + parameter="friends_panel" /> </menu_item_call> <menu_item_call label="My Groups" name="my_groups"> <menu_item_call.on_click - function="Self.Groups" /> + function="SideTray.PanelPeopleTab" + parameter="groups_panel" /> </menu_item_call> </menu> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 3f63f493b14..ebdfb017879 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -114,25 +114,22 @@ layout="topleft" name="Communicate" tear_off="true"> - <menu_item_check + <menu_item_call label="My Friends" layout="topleft" name="My Friends" shortcut="control|shift|F"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="contacts.friends" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="contacts.friends" /> - </menu_item_check> + <menu_item_call.on_click + function="SideTray.PanelPeopleTab" + parameter="friends_panel" /> + </menu_item_call> <menu_item_call label="My Groups" layout="topleft" name="My Groups"> <menu_item_call.on_click - function="Floater.Show" - parameter="contacts.groups" /> + function="SideTray.PanelPeopleTab" + parameter="groups_panel" /> </menu_item_call> <menu_item_separator layout="topleft" /> @@ -155,18 +152,15 @@ function="Floater.Toggle" parameter="nearby_chat" /> </menu_item_check> - <menu_item_check - label="Nearby Speakers" + <menu_item_call + label="Nearby People" layout="topleft" name="Active Speakers" shortcut="control|shift|A"> - <menu_item_check.on_check - function="Floater.Visible" - parameter="active_speakers" /> - <menu_item_check.on_click - function="Floater.Toggle" - parameter="active_speakers" /> - </menu_item_check> + <menu_item_call.on_click + function="SideTray.PanelPeopleTab" + parameter="nearby_panel" /> + </menu_item_call> <menu_item_check label="Nearby Media" layout="topleft" -- GitLab From bbbacf1c4d06e7a0b4a5f532565410496a72963a Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Thu, 5 Nov 2009 11:02:02 -0800 Subject: [PATCH 179/306] eliminated various warnings when parsing side tray --- indra/newview/llnavigationbar.cpp | 2 - indra/newview/llpanelplaceprofile.cpp | 2 +- .../default/xui/en/floater_sell_land.xml | 1 - .../skins/default/xui/en/panel_avatar_tag.xml | 1 - .../skins/default/xui/en/panel_bars.xml | 67 +++---------------- .../skins/default/xui/en/panel_edit_eyes.xml | 2 - .../default/xui/en/panel_edit_gloves.xml | 2 - .../skins/default/xui/en/panel_edit_hair.xml | 8 --- .../default/xui/en/panel_edit_jacket.xml | 2 - .../skins/default/xui/en/panel_edit_pants.xml | 2 - .../skins/default/xui/en/panel_edit_shape.xml | 18 ----- .../skins/default/xui/en/panel_edit_shirt.xml | 2 - .../skins/default/xui/en/panel_edit_shoes.xml | 2 - .../skins/default/xui/en/panel_edit_skin.xml | 8 --- .../skins/default/xui/en/panel_edit_skirt.xml | 2 - .../skins/default/xui/en/panel_edit_socks.xml | 2 - .../default/xui/en/panel_edit_underpants.xml | 2 - .../default/xui/en/panel_edit_undershirt.xml | 2 - .../xui/en/panel_group_info_sidetray.xml | 5 -- .../default/xui/en/panel_group_land_money.xml | 6 +- .../default/xui/en/panel_group_notices.xml | 2 - .../default/xui/en/panel_landmark_info.xml | 1 - .../default/xui/en/panel_navigation_bar.xml | 1 + .../skins/default/xui/en/panel_people.xml | 3 - .../default/xui/en/panel_place_profile.xml | 1 - .../skins/default/xui/en/panel_profile.xml | 5 +- .../skins/default/xui/en/panel_side_tray.xml | 4 +- .../default/xui/en/panel_teleport_history.xml | 18 ----- .../default/xui/en/widgets/talk_button.xml | 2 - 29 files changed, 15 insertions(+), 160 deletions(-) diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index b35fd6134b7..2f7d7874eb0 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -174,8 +174,6 @@ LLNavigationBar::LLNavigationBar() mSearchComboBox(NULL), mPurgeTPHistoryItems(false) { - setIsChrome(TRUE); - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_navigation_bar.xml"); // set a listener function for LoginComplete event diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 9ba72fe6cff..58533f81148 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -529,7 +529,7 @@ void LLPanelPlaceProfile::updateYouAreHereBanner(void* userdata) if(!self->getVisible()) return; - if(!gDisconnected) + if(!gDisconnected && gAgent.getRegion()) { static F32 radius = gSavedSettings.getF32("YouAreHereDistance"); diff --git a/indra/newview/skins/default/xui/en/floater_sell_land.xml b/indra/newview/skins/default/xui/en/floater_sell_land.xml index 45d59e280bd..c427b827c0b 100644 --- a/indra/newview/skins/default/xui/en/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml @@ -13,7 +13,6 @@ color="DkGray2" follows="left|top|right|bottom" height="435" - min_height="300" layout="topleft" name="profile_scroll" reserve_scroll_corner="true" diff --git a/indra/newview/skins/default/xui/en/panel_avatar_tag.xml b/indra/newview/skins/default/xui/en/panel_avatar_tag.xml index e4f6e7bd44e..16c8660781e 100644 --- a/indra/newview/skins/default/xui/en/panel_avatar_tag.xml +++ b/indra/newview/skins/default/xui/en/panel_avatar_tag.xml @@ -55,7 +55,6 @@ top="65" left="10" right="-10" - can_resize="true" height="100" follows="left|top|bottom|right" font="SansSerifSmall" diff --git a/indra/newview/skins/default/xui/en/panel_bars.xml b/indra/newview/skins/default/xui/en/panel_bars.xml index 9c06329eaff..527ec4e007f 100644 --- a/indra/newview/skins/default/xui/en/panel_bars.xml +++ b/indra/newview/skins/default/xui/en/panel_bars.xml @@ -5,65 +5,14 @@ layout="topleft" left="0" mouse_opaque="false" - name="bottom_panel" + name="screen" width="1024"> - <panel - follows="left|right|top|bottom" - height="728" - layout="topleft" - left="0" - mouse_opaque="false" - name="status" - top="0" - width="1024" /> - <layout_stack - border_size="0" - follows="left|right|bottom|top" - height="768" - layout="topleft" - left_delta="0" - mouse_opaque="false" - name="bar_stack" - top_delta="0" - use_bounding_rect="true" - width="1024"> - <layout_panel - follows="left|right|top|bottom" - height="768" - layout="topleft" - left="0" - mouse_opaque="false" - name="spacer" - top="0" - user_resize="false" - width="1024" /> - <layout_panel - auto_resize="false" - height="200" - layout="topleft" - min_height="200" - mouse_opaque="false" - name="overlay" - use_bounding_rect="true" - user_resize="false" - width="1024" /> - <layout_panel - auto_resize="false" - filename="panel_toolbar.xml" - layout="topleft" - min_height="28" - name="toolbar" - use_bounding_rect="true" - user_resize="false" - width="1024" /> + <layout_stack name="menu_stack" orientation="vertical" height="768" border_size="0"> + <panel auto_resize="false" width="1024" name="status_bar" filename="panel_status_bar.xml"/> + <panel auto_resize="false" width="1024" height="65" name="navigation bar" filename="panel_navigation_bar.xml"/> + <layout_stack name="hud_stack" orientation="horizontal" auto_resize="true" width="1024" height="500" follows="all"> + <panel auto_resize="true" name="floater_view" height="500"/> + <panel auto_resize="false" filename="panel_side_tray.xml" height="500" width="333"/> </layout_stack> - <panel - follows="left|right|top|bottom" - height="728" - layout="topleft" - left_delta="0" - mouse_opaque="false" - name="hud" - top_delta="-10" - width="1024" /> + </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_eyes.xml b/indra/newview/skins/default/xui/en/panel_edit_eyes.xml index 9789da57960..c514054c41c 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_eyes.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_eyes.xml @@ -37,13 +37,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="eyes_main_tab" title="Eyes"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="eyes_main_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml index 517cdd75fb9..f9ef038314d 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml @@ -49,13 +49,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="gloves_main_tab" title="Gloves"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="gloves_main_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_edit_hair.xml b/indra/newview/skins/default/xui/en/panel_edit_hair.xml index d2ee2ebf2af..e7d1c053016 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_hair.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_hair.xml @@ -37,13 +37,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="hair_color_tab" title="Color"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="hair_color_param_list" @@ -51,13 +49,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="hair_style_tab" title="Style"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="hair_style_param_list" @@ -65,13 +61,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="hair_eyebrows_tab" title="Eyebrows"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="hair_eyebrows_param_list" @@ -79,13 +73,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="hair_facial_tab" title="Facial"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="hair_facial_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml index 0b54944e290..f4c03399fe8 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml @@ -61,13 +61,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="jacket_main_tab" title="Jacket"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="jacket_main_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_edit_pants.xml b/indra/newview/skins/default/xui/en/panel_edit_pants.xml index 939314f9f9a..ab105afd88e 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pants.xml @@ -49,13 +49,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="pants_main_tab" title="Pants"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="pants_main_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_edit_shape.xml b/indra/newview/skins/default/xui/en/panel_edit_shape.xml index a9dfcb82d69..45c4b923382 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shape.xml @@ -59,13 +59,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="shape_body_tab" title="Body"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="shape_body_param_list" @@ -73,13 +71,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="shape_head_tab" title="Head"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="shape_head_param_list" @@ -87,13 +83,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="shape_eyes_tab" title="Eyes"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="shape_eyes_param_list" @@ -101,13 +95,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="shape_ears_tab" title="Ears"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="shape_ears_param_list" @@ -115,13 +107,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="shape_nose_tab" title="Nose"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="shape_nose_param_list" @@ -129,13 +119,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="shape_mouth_tab" title="Mouth"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="shape_mouth_param_list" @@ -143,13 +131,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="shape_chin_tab" title="Chin"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="shape_chin_param_list" @@ -157,13 +143,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="shape_torso_tab" title="Torso"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="shape_torso_param_list" @@ -171,13 +155,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="shape_legs_tab" title="Legs"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="shape_legs_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml index 258ee06697e..9a13dfa3c45 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml @@ -49,13 +49,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="shirt_main_tab" title="Shirt"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="shirt_main_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml index 22fced4aac7..154b9d959c9 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml @@ -49,13 +49,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="shoes_main_tab" title="Shoes"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="shoes_main_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_edit_skin.xml b/indra/newview/skins/default/xui/en/panel_edit_skin.xml index 1a00277f432..918606b54ca 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_skin.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_skin.xml @@ -64,13 +64,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="skin_color_tab" title="Skin Color"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="skin_color_param_list" @@ -78,13 +76,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="skin_face_tab" title="Face Detail"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="skin_face_param_list" @@ -92,13 +88,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="skin_makeup_tab" title="Makeup"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="skin_makeup_param_list" @@ -106,13 +100,11 @@ width="303" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="skin_body_tab" title="Body Detail"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="skin_body_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml index 411d4336041..d0f4d754442 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml @@ -49,13 +49,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="skirt_main_tab" title="Skirt"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="skirt_main_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_edit_socks.xml b/indra/newview/skins/default/xui/en/panel_edit_socks.xml index faff67795c5..acc6d482a7d 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_socks.xml @@ -49,13 +49,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="socks_main_tab" title="Socks"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="socks_main_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml index bb0b353a012..4f5c1c08b71 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml @@ -49,13 +49,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="underpants_main_tab" title="Underpants"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="underpants_main_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml index 097cb14ee6c..715674e88ba 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml @@ -49,13 +49,11 @@ top_pad="10" width="303"> <accordion_tab - can_resize="false" layout="topleft" min_height="150" name="undershirt_main_tab" title="Undershirt"> <scrolling_panel_list - draw_heading="false" follows="all" left="0" name="undershirt_main_param_list" diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index c2f9cfe6755..9d360cea0ce 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -120,12 +120,10 @@ background_visible="true" height="425" layout="topleft" left="0" - multiple_expansion="false" name="groups_accordion" top_pad="15" width="336"> <accordion_tab - can_resize="false" expanded="true" layout="topleft" name="tab_general" @@ -153,7 +151,6 @@ background_visible="true" </scroll_container> </accordion_tab> <accordion_tab - can_resize="false" expanded="false" layout="topleft" name="tab_roles" @@ -181,7 +178,6 @@ background_visible="true" </scroll_container> </accordion_tab> <accordion_tab - can_resize="false" expanded="false" layout="topleft" name="tab_notices" @@ -209,7 +205,6 @@ background_visible="true" </scroll_container> </accordion_tab> <accordion_tab - can_resize="false" expanded="false" layout="topleft" name="tab_notices" 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 99fc39c466a..0c6f81f8fd8 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 @@ -304,7 +304,6 @@ image_overlay="Arrow_Left_Off" layout="topleft" name="earlier_details_button" - picture_style="true" tool_tip="Back" top_pad="3" right="-35" @@ -315,8 +314,7 @@ image_overlay="Arrow_Right_Off" layout="topleft" left_pad="10" - name="later_details_button" - picture_style="true" + name="later_details_button" tool_tip="Next" width="31" /> </panel> @@ -350,7 +348,6 @@ image_overlay="Arrow_Left_Off" layout="topleft" name="earlier_sales_button" - picture_style="true" tool_tip="Back" top_pad="3" right="-35" @@ -362,7 +359,6 @@ layout="topleft" left_pad="10" name="later_sales_button" - picture_style="true" tool_tip="Next" width="31" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index bfb49a60c25..24a4005a459 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -83,7 +83,6 @@ Groups are limited to 200 notices/group daily label="Create a new notice" left="15" name="create_new_notice" - picture_style="true" tool_tip="Create a new notice" top_delta="-5" width="18" /> @@ -93,7 +92,6 @@ Groups are limited to 200 notices/group daily image_overlay="Refresh_Off" layout="topleft" name="refresh_notices" - picture_style="true" right="-5" top_delta="5" width="23" /> diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index 03ba7f7c81f..0c24adfad59 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -50,7 +50,6 @@ layout="topleft" left="10" name="back_btn" - picture_style="true" tab_stop="false" top="0" width="23" /> diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index ddfa6e72a39..e1b3cbf1c89 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -7,6 +7,7 @@ height="65" layout="topleft" name="navigation_bar" + chrome="true" width="600"> <icon follows="all" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index c8194a286b8..c648b5654e6 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -75,7 +75,6 @@ background_visible="true" multi_select="true" name="avatar_list" top="0" - volume_column_width="20" width="313" /> <panel follows="left|right|bottom" @@ -130,7 +129,6 @@ background_visible="true" top="0" width="313"> <accordion_tab - can_resize="false" layout="topleft" height="235" min_height="150" @@ -147,7 +145,6 @@ background_visible="true" width="313" /> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" height="235" name="tab_all" diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 7e073f064d7..e1b197b5d1f 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -99,7 +99,6 @@ layout="topleft" left="10" name="back_btn" - picture_style="true" tab_stop="false" top="0" width="23" /> diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index c3a92f9d9ae..23d55b33e22 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -31,7 +31,6 @@ color="DkGray2" follows="all" height="485" - min_height="300" layout="topleft" name="profile_scroll" reserve_scroll_corner="true" @@ -81,7 +80,7 @@ height="95" layout="topleft" left="107" - max_length="512" + textbox.max_length="512" name="sl_description_edit" top_pad="-3" width="173" @@ -124,7 +123,7 @@ height="95" layout="topleft" left="107" - max_length="512" + textbox.max_length="512" name="fl_description_edit" top_pad="-3" width="173" diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml index 3582de1c711..d3de09ab4ce 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <!-- Side tray cannot show background because it is always partially on screen to hold tab buttons. --> -<side_tray +<panel name="sidebar" background_visible="false" mouse_opaque="true" @@ -147,4 +147,4 @@ /> </sidetray_tab> -</side_tray> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml index bbfffe7baba..01204ba7795 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml @@ -10,12 +10,10 @@ name="history_accordion" width="380"> <accordion_tab - can_resize="false" layout="topleft" name="today" title="Today"> <flat_list_view - draw_heading="false" follows="all" height="150" layout="topleft" @@ -26,12 +24,10 @@ </flat_list_view> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" name="yesterday" title="Yesterday"> <flat_list_view - draw_heading="false" follows="all" height="150" layout="topleft" @@ -42,12 +38,10 @@ </flat_list_view> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" name="2_days_ago" title="2 days ago"> <flat_list_view - draw_heading="false" follows="all" height="150" layout="topleft" @@ -58,12 +52,10 @@ </flat_list_view> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" name="3_days_ago" title="3 days ago"> <flat_list_view - draw_heading="false" follows="all" height="150" layout="topleft" @@ -74,12 +66,10 @@ </flat_list_view> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" name="4_days_ago" title="4 days ago"> <flat_list_view - draw_heading="false" follows="all" height="150" layout="topleft" @@ -90,12 +80,10 @@ </flat_list_view> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" name="5_days_ago" title="5 days ago"> <flat_list_view - draw_heading="false" follows="all" height="150" layout="topleft" @@ -106,12 +94,10 @@ </flat_list_view> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" name="6_days_and_older" title="6 days and older"> <flat_list_view - draw_heading="false" follows="all" height="150" layout="topleft" @@ -122,12 +108,10 @@ </flat_list_view> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" name="1_month_and_older" title="1 month and older"> <flat_list_view - draw_heading="false" follows="all" height="150" layout="topleft" @@ -138,12 +122,10 @@ </flat_list_view> </accordion_tab> <accordion_tab - can_resize="false" layout="topleft" name="6_months_and_older" title="6 months and older"> <flat_list_view - draw_heading="false" follows="all" height="150" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml index 725492052ca..75d20c1ce39 100644 --- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml +++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml @@ -12,7 +12,6 @@ font="SansSerifSmall" tab_stop="false" is_toggle="true" - picture_style="true" /> <show_button name="right" @@ -23,7 +22,6 @@ bottom="0" tab_stop="false" is_toggle="true" - picture_style="true" image_selected="ComboButton_Selected" image_unselected="ComboButton_Off" /> -- GitLab From 5e56af9c9da77a98645c54166d83589db322354f Mon Sep 17 00:00:00 2001 From: Rick Pasetto <rick@lindenlab.com> Date: Thu, 5 Nov 2009 11:07:03 -0800 Subject: [PATCH 180/306] FIX DEV-42115: Remove modify permission check that would grant navigate/interact or controls "permission" Review #27 Back when media controls (an unfortunately much-overloaded word) was called media permission (also an overloaded word), we granted "permission" for interact/navigate or controls "display" if the requestor agent had modify permissions. This decision doesn't seem to make sense, because it is a common use case to want to "disable" controls (or perhaps interaction/navigate) even for the user who created the object (i.e. who has modify permissions). This removes that check. NOTE that this check is also made on the server, but in that case modify permissions *grants* the right to navigate in that case. Although the code is very similar, the viewer version is trying to address a use case story, whereas the other is trying to prevent a griefing vector. --- indra/newview/llvovolume.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 1d94e9118e0..caeda3d1db6 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1796,20 +1796,19 @@ void LLVOVolume::mediaNavigateBounceBack(U8 texture_index) bool LLVOVolume::hasMediaPermission(const LLMediaEntry* media_entry, MediaPermType perm_type) { - // NOTE: This logic duplicates the logic in the server (in particular, in llmediaservice.cpp). + // NOTE: This logic ALMOST duplicates the logic in the server (in particular, in llmediaservice.cpp). if (NULL == media_entry ) return false; // XXX should we assert here? - // The agent has permissions to navigate if: - // - agent has edit permissions, or + // The agent has permissions if: // - world permissions are on, or // - group permissions are on, and agent_id is in the group, or // - agent permissions are on, and agent_id is the owner - if (permModify()) - { - return true; - } - + // *NOTE: We *used* to check for modify permissions here (i.e. permissions were + // granted if permModify() was true). However, this doesn't make sense in the + // viewer: we don't want to show controls or allow interaction if the author + // has deemed it so. See DEV-42115. + U8 media_perms = (perm_type == MEDIA_PERM_INTERACT) ? media_entry->getPermsInteract() : media_entry->getPermsControl(); // World permissions -- GitLab From b1242ead82c80628a9155cd0eb05f5ff2378af4b Mon Sep 17 00:00:00 2001 From: Lis Pardi <lis@lindenlab.com> Date: Thu, 5 Nov 2009 14:32:03 -0500 Subject: [PATCH 181/306] ext-665 Iconography - New art for badge_note.j2c (image denoting list items) on Sell Land floater --- .../default/xui/en/floater_sell_land.xml | 66 +++++-------------- 1 file changed, 17 insertions(+), 49 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_sell_land.xml b/indra/newview/skins/default/xui/en/floater_sell_land.xml index 8fedd0a89f0..fd653895a29 100644 --- a/indra/newview/skins/default/xui/en/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml @@ -96,27 +96,16 @@ width="200"> To sell this parcel: </text> - <icon - follows="top|left" - height="64" - image_name="badge_note.j2c" - layout="topleft" - left="0" - name="step_price" - top="206" - width="64" /> <text type="string" length="1" - bottom_delta="-38" follows="top|left" font="SansSerif" height="16" layout="topleft" - left="72" - name="price_label" - right="-20"> - Set a price: + left="30" + name="price_label"> + 1. Set a price: </text> <text type="string" @@ -124,9 +113,8 @@ follows="top|left" height="16" layout="topleft" - left="72" - name="price_text" - right="-20"> + left="40" + name="price_text"> Choose an appropriate price. </text> <text @@ -134,7 +122,7 @@ length="1" height="16" layout="topleft" - left="72" + left="40" name="price_ld" width="20"> L$ @@ -156,32 +144,22 @@ length="1" height="16" layout="topleft" - left="72" + left="40" name="price_per_m" top_delta="25" width="200"> (L$[PER_METER] per m²) </text> - <icon - follows="top|left" - height="64" - image_name="badge_note.j2c" - layout="topleft" - left="0" - name="step_sell_to" - width="64" /> <text type="string" length="1" - bottom_delta="-38" follows="top|left" font="SansSerif" height="16" layout="topleft" - left="72" - name="sell_to_label" - right="-20"> - Sell the land to: + left="30" + name="sell_to_label"> + 2. Sell the land to: </text> <text type="string" @@ -189,7 +167,7 @@ follows="top|left" height="25" layout="topleft" - left="72" + left="40" word_wrap="true" name="sell_to_text" right="-20"> @@ -235,26 +213,16 @@ name="sell_to_select_agent" top_delta="0" width="60" /> - <icon - follows="top|left" - height="64" - image_name="badge_note.j2c" - layout="topleft" - left="0" - name="step_sell_objects" - width="64" /> <text type="string" length="1" - bottom_delta="-38" follows="top|left" font="SansSerif" height="16" layout="topleft" - left="72" - name="sell_objects_label" - right="-20"> - Sell the objects with the land? + left="30" + name="sell_objects_label"> + 3. Sell the objects with the land? </text> <text type="string" @@ -264,7 +232,7 @@ height="25" layout="topleft" word_wrap="true" - left="72" + left="40" name="sell_objects_text"> Land owner's transferable objects on parcel will change ownership. </text> @@ -273,7 +241,7 @@ follows="top|right" height="40" layout="topleft" - left="72" + left="40" name="sell_objects" right="420"> <radio_item @@ -304,7 +272,7 @@ label="Show Objects" layout="topleft" name="show_objects" - left="100" + left="70" top_pad="10" width="110" /> <text -- GitLab From c67ef56fa1a85ea8882b176f989dd34866de19a2 Mon Sep 17 00:00:00 2001 From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com> Date: Thu, 5 Nov 2009 14:45:00 -0500 Subject: [PATCH 182/306] Removed chrome from help button and replaced with 80/20 art. http://jira.secondlife.com/browse/EXT-2172 --- .../xui/en/panel_side_tray_tab_caption.xml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml index 9845a9eb78e..4c8bb68e549 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml @@ -19,16 +19,18 @@ top="4" value="Side Panel" width="255" /> - <button + <button follows="left|right|top" - font="SansSerif" - height="23" - label="?" + height="16" + image_selected="Icon_Help_Press" + image_unselected="Icon_Help_Foreground" + image_disabled="Icon_Help_Press" + picture_style="true" layout="topleft" name="show_help" - top="5" - right="-8" - width="28" + top="10" + right="-11" + width="16" tool_tip="Show Help"> <button.commit_callback function="Button.ShowHelp" /> -- GitLab From 280e01729173e79e37939c3e764f9f3f674f79da Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 5 Nov 2009 15:00:36 -0500 Subject: [PATCH 183/306] EXT-2229 : Task SP : Update task on new selection Using activePanel hack to update selection when it changes. --HG-- branch : avatar-pipeline --- indra/newview/llpanelmaininventory.cpp | 1637 +++++++++-------- indra/newview/llselectmgr.cpp | 20 +- .../newview/llsidepanelinventorysubpanel.cpp | 2 +- indra/newview/llsidepaneltaskinfo.cpp | 51 +- indra/newview/llsidepaneltaskinfo.h | 7 + 5 files changed, 893 insertions(+), 824 deletions(-) diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 617445a27f2..876151479fd 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -1,818 +1,819 @@ -/** - * @file llsidepanelmaininventory.cpp - * @brief Implementation of llsidepanelmaininventory. - * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" -#include "llpanelmaininventory.h" - -#include "llfloaterinventory.h" -#include "llinventorybridge.h" -#include "llinventoryfunctions.h" -#include "llinventorypanel.h" -#include "llfiltereditor.h" -#include "llfloaterreg.h" -#include "llscrollcontainer.h" -#include "llsdserialize.h" -#include "llspinctrl.h" -#include "lltooldraganddrop.h" - -static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); // Seraph is this redundant with constructor? - -///---------------------------------------------------------------------------- -/// LLFloaterInventoryFinder -///---------------------------------------------------------------------------- - -class LLFloaterInventoryFinder : public LLFloater -{ -public: - LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view); - virtual void draw(); - /*virtual*/ BOOL postBuild(); - void changeFilter(LLInventoryFilter* filter); - void updateElementsFromFilter(); - BOOL getCheckShowEmpty(); - BOOL getCheckSinceLogoff(); - - static void onTimeAgo(LLUICtrl*, void *); - static void onCheckSinceLogoff(LLUICtrl*, void *); - static void onCloseBtn(void* user_data); - static void selectAllTypes(void* user_data); - static void selectNoTypes(void* user_data); -private: - LLPanelMainInventory* mPanelInventoryDecorated; - LLSpinCtrl* mSpinSinceDays; - LLSpinCtrl* mSpinSinceHours; - LLInventoryFilter* mFilter; -}; - -///---------------------------------------------------------------------------- -/// LLPanelMainInventory -///---------------------------------------------------------------------------- - -LLPanelMainInventory::LLPanelMainInventory() - : LLPanel() -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT); - // Menu Callbacks (non contex menus) - mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2)); - mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this)); - mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); - mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); - mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2)); - mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this)); - mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this)); - mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this)); - mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2)); - - // Controls - // *TODO: Just use persistant settings for each of these - U32 sort_order = gSavedSettings.getU32("InventorySortOrder"); - BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE ); - BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME ); - BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ); - - gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE); - gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE); - gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE); - gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE); - - mSavedFolderState = new LLSaveFolderState(); - mSavedFolderState->setApply(FALSE); -} - -BOOL LLPanelMainInventory::postBuild() -{ - gInventory.addObserver(this); - - mFilterTabs = getChild<LLTabContainer>("inventory filter tabs"); - mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this)); - - //panel->getFilter()->markDefault(); - - // Set up the default inv. panel/filter settings. - mActivePanel = getChild<LLInventoryPanel>("All Items"); - if (mActivePanel) - { - // "All Items" is the previous only view, so it gets the InventorySortOrder - mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder")); - mActivePanel->getFilter()->markDefault(); - mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); - mActivePanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mActivePanel, _1, _2)); - } - LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); - if (recent_items_panel) - { - recent_items_panel->setSinceLogoff(TRUE); - recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE); - recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - recent_items_panel->getFilter()->markDefault(); - recent_items_panel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, recent_items_panel, _1, _2)); - } - - // Now load the stored settings from disk, if available. - std::ostringstream filterSaveName; - filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); - llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName << llendl; - llifstream file(filterSaveName.str()); - LLSD savedFilterState; - if (file.is_open()) - { - LLSDSerialize::fromXML(savedFilterState, file); - file.close(); - - // Load the persistent "Recent Items" settings. - // Note that the "All Items" settings do not persist. - if(recent_items_panel) - { - if(savedFilterState.has(recent_items_panel->getFilter()->getName())) - { - LLSD recent_items = savedFilterState.get( - recent_items_panel->getFilter()->getName()); - recent_items_panel->getFilter()->fromLLSD(recent_items); - } - } - - } - - - mFilterEditor = getChild<LLFilterEditor>("inventory search editor"); - if (mFilterEditor) - { - mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2)); - } - - // *TODO:Get the cost info from the server - const std::string upload_cost("10"); - childSetLabelArg("Upload Image", "[COST]", upload_cost); - childSetLabelArg("Upload Sound", "[COST]", upload_cost); - childSetLabelArg("Upload Animation", "[COST]", upload_cost); - childSetLabelArg("Bulk Upload", "[COST]", upload_cost); - - return TRUE; -} - -// Destroys the object -LLPanelMainInventory::~LLPanelMainInventory( void ) -{ - // Save the filters state. - LLSD filterRoot; - LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items"); - if (all_items_panel) - { - LLInventoryFilter* filter = all_items_panel->getFilter(); - if (filter) - { - LLSD filterState; - filter->toLLSD(filterState); - filterRoot[filter->getName()] = filterState; - } - } - - LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); - if (recent_items_panel) - { - LLInventoryFilter* filter = recent_items_panel->getFilter(); - if (filter) - { - LLSD filterState; - filter->toLLSD(filterState); - filterRoot[filter->getName()] = filterState; - } - } - - std::ostringstream filterSaveName; - filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); - llofstream filtersFile(filterSaveName.str()); - if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile)) - { - llwarns << "Could not write to filters save file " << filterSaveName << llendl; - } - else - filtersFile.close(); - - gInventory.removeObserver(this); - delete mSavedFolderState; -} - -void LLPanelMainInventory::startSearch() -{ - // this forces focus to line editor portion of search editor - if (mFilterEditor) - { - mFilterEditor->focusFirstItem(TRUE); - } -} - -BOOL LLPanelMainInventory::handleKeyHere(KEY key, MASK mask) -{ - LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL; - if (root_folder) - { - // first check for user accepting current search results - if (mFilterEditor - && mFilterEditor->hasFocus() - && (key == KEY_RETURN - || key == KEY_DOWN) - && mask == MASK_NONE) - { - // move focus to inventory proper - mActivePanel->setFocus(TRUE); - root_folder->scrollToShowSelection(); - return TRUE; - } - - if (mActivePanel->hasFocus() && key == KEY_UP) - { - startSearch(); - } - } - - return LLPanel::handleKeyHere(key, mask); - -} - -//---------------------------------------------------------------------------- -// menu callbacks - -void LLPanelMainInventory::doToSelected(const LLSD& userdata) -{ - getPanel()->getRootFolder()->doToSelected(&gInventory, userdata); -} - -void LLPanelMainInventory::closeAllFolders() -{ - getPanel()->getRootFolder()->closeAllFolders(); -} - -void LLPanelMainInventory::newWindow() -{ - LLFloaterInventory::showAgentInventory(); -} - -void LLPanelMainInventory::doCreate(const LLSD& userdata) -{ - menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata); -} - -void LLPanelMainInventory::resetFilters() -{ - LLFloaterInventoryFinder *finder = getFinder(); - getActivePanel()->getFilter()->resetDefault(); - if (finder) - { - finder->updateElementsFromFilter(); - } - - setFilterTextFromFilter(); -} - -void LLPanelMainInventory::setSortBy(const LLSD& userdata) -{ - std::string sort_field = userdata.asString(); - if (sort_field == "name") - { - U32 order = getActivePanel()->getSortOrder(); - getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE ); - - gSavedSettings.setBOOL("Inventory.SortByName", TRUE ); - gSavedSettings.setBOOL("Inventory.SortByDate", FALSE ); - } - else if (sort_field == "date") - { - U32 order = getActivePanel()->getSortOrder(); - getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE ); - - gSavedSettings.setBOOL("Inventory.SortByName", FALSE ); - gSavedSettings.setBOOL("Inventory.SortByDate", TRUE ); - } - else if (sort_field == "foldersalwaysbyname") - { - U32 order = getActivePanel()->getSortOrder(); - if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME ) - { - order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME; - - gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE ); - } - else - { - order |= LLInventoryFilter::SO_FOLDERS_BY_NAME; - - gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE ); - } - getActivePanel()->setSortOrder( order ); - } - else if (sort_field == "systemfolderstotop") - { - U32 order = getActivePanel()->getSortOrder(); - if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ) - { - order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; - - gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE ); - } - else - { - order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; - - gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE ); - } - getActivePanel()->setSortOrder( order ); - } -} - -// static -BOOL LLPanelMainInventory::filtersVisible(void* user_data) -{ - LLPanelMainInventory* self = (LLPanelMainInventory*)user_data; - if(!self) return FALSE; - - return self->getFinder() != NULL; -} - -void LLPanelMainInventory::onClearSearch() -{ - LLFloater *finder = getFinder(); - if (mActivePanel) - { - mActivePanel->setFilterSubString(LLStringUtil::null); - mActivePanel->setFilterTypes(0xffffffff); - } - - if (finder) - { - LLFloaterInventoryFinder::selectAllTypes(finder); - } - - // re-open folders that were initially open - if (mActivePanel) - { - mSavedFolderState->setApply(TRUE); - mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); - LLOpenFoldersWithSelection opener; - mActivePanel->getRootFolder()->applyFunctorRecursively(opener); - mActivePanel->getRootFolder()->scrollToShowSelection(); - } -} - -void LLPanelMainInventory::onFilterEdit(const std::string& search_string ) -{ - if (search_string == "") - { - onClearSearch(); - } - if (!mActivePanel) - { - return; - } - - gInventory.startBackgroundFetch(); - - std::string uppercase_search_string = search_string; - LLStringUtil::toUpper(uppercase_search_string); - if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty()) - { - // current filter and new filter empty, do nothing - return; - } - - // save current folder open state if no filter currently applied - if (!mActivePanel->getRootFolder()->isFilterModified()) - { - mSavedFolderState->setApply(FALSE); - mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); - } - - // set new filter string - mActivePanel->setFilterSubString(uppercase_search_string); -} - - - //static - BOOL LLPanelMainInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward) - { - LLPanelMainInventory* active_view = NULL; - - LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory"); - for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) - { - LLPanelMainInventory* iv = dynamic_cast<LLPanelMainInventory*>(*iter); - if (iv) - { - if (gFocusMgr.childHasKeyboardFocus(iv)) - { - active_view = iv; - break; - } - } - } - - if (!active_view) - { - return FALSE; - } - - std::string search_string(find_text); - - if (search_string.empty()) - { - return FALSE; - } - - if (active_view->getPanel() && - active_view->getPanel()->getRootFolder()->search(first_item, search_string, backward)) - { - return TRUE; - } - - return FALSE; - } - -void LLPanelMainInventory::onFilterSelected() -{ - // Find my index - mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs"); - - if (!mActivePanel) - { - return; - } - LLInventoryFilter* filter = mActivePanel->getFilter(); - LLFloaterInventoryFinder *finder = getFinder(); - if (finder) - { - finder->changeFilter(filter); - } - if (filter->isActive()) - { - // If our filter is active we may be the first thing requiring a fetch so we better start it here. - gInventory.startBackgroundFetch(); - } - setFilterTextFromFilter(); -} - -const std::string LLPanelMainInventory::getFilterSubString() -{ - return mActivePanel->getFilterSubString(); -} - -void LLPanelMainInventory::setFilterSubString(const std::string& string) -{ - mActivePanel->setFilterSubString(string); -} - -BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg) -{ - // Check to see if we are auto scrolling from the last frame - LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel(); - BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y); - if(mFilterTabs) - { - if(needsToScroll) - { - mFilterTabs->startDragAndDropDelayTimer(); - } - } - - BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); - - return handled; -} - -void LLPanelMainInventory::changed(U32 mask) -{ -} - - -void LLPanelMainInventory::setFilterTextFromFilter() -{ - mFilterText = mActivePanel->getFilter()->getFilterText(); -} - -void LLPanelMainInventory::toggleFindOptions() -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE); - LLFloater *floater = getFinder(); - if (!floater) - { - LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this); - mFinderHandle = finder->getHandle(); - finder->openFloater(); - - LLFloater* parent_floater = gFloaterView->getParentFloater(this); - if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel - parent_floater->addDependentFloater(mFinderHandle); - // start background fetch of folders - gInventory.startBackgroundFetch(); - } - else - { - floater->closeFloater(); - } -} - -void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb) -{ - getChild<LLInventoryPanel>("All Items")->setSelectCallback(cb); - getChild<LLInventoryPanel>("Recent Items")->setSelectCallback(cb); -} - -///---------------------------------------------------------------------------- -/// LLFloaterInventoryFinder -///---------------------------------------------------------------------------- - -LLFloaterInventoryFinder* LLPanelMainInventory::getFinder() -{ - return (LLFloaterInventoryFinder*)mFinderHandle.get(); -} - - -LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) : - LLFloater(LLSD()), - mPanelInventoryDecorated(inventory_view), - mFilter(inventory_view->getPanel()->getFilter()) -{ - LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL); - updateElementsFromFilter(); -} - - -void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data) -{ - LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; - if (!self) return; - - bool since_logoff= self->childGetValue("check_since_logoff"); - - if (!since_logoff && - !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) ) - { - self->mSpinSinceHours->set(1.0f); - } -} -BOOL LLFloaterInventoryFinder::postBuild() -{ - const LLRect& viewrect = mPanelInventoryDecorated->getRect(); - setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight())); - - childSetAction("All", selectAllTypes, this); - childSetAction("None", selectNoTypes, this); - - mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago"); - childSetCommitCallback("spin_hours_ago", onTimeAgo, this); - - mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago"); - childSetCommitCallback("spin_days_ago", onTimeAgo, this); - - // mCheckSinceLogoff = getChild<LLSpinCtrl>("check_since_logoff"); - childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this); - - childSetAction("Close", onCloseBtn, this); - - updateElementsFromFilter(); - return TRUE; -} -void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data) -{ - LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; - if (!self) return; - - bool since_logoff=true; - if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) - { - since_logoff = false; - } - self->childSetValue("check_since_logoff", since_logoff); -} - -void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter) -{ - mFilter = filter; - updateElementsFromFilter(); -} - -void LLFloaterInventoryFinder::updateElementsFromFilter() -{ - if (!mFilter) - return; - - // Get data needed for filter display - U32 filter_types = mFilter->getFilterTypes(); - std::string filter_string = mFilter->getFilterSubString(); - LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState(); - U32 hours = mFilter->getHoursAgo(); - - // update the ui elements - setTitle(mFilter->getName()); - - childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION)); - - childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD)); - childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE)); - childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE)); - childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK)); - childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD)); - childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT)); - childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL)); - childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND)); - childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE)); - childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT)); - childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS); - childSetValue("check_since_logoff", mFilter->isSinceLogoff()); - mSpinSinceHours->set((F32)(hours % 24)); - mSpinSinceDays->set((F32)(hours / 24)); -} - -void LLFloaterInventoryFinder::draw() -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW); - U32 filter = 0xffffffff; - BOOL filtered_by_all_types = TRUE; - - if (!childGetValue("check_animation")) - { - filter &= ~(0x1 << LLInventoryType::IT_ANIMATION); - filtered_by_all_types = FALSE; - } - - - if (!childGetValue("check_calling_card")) - { - filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_clothing")) - { - filter &= ~(0x1 << LLInventoryType::IT_WEARABLE); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_gesture")) - { - filter &= ~(0x1 << LLInventoryType::IT_GESTURE); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_landmark")) - - - { - filter &= ~(0x1 << LLInventoryType::IT_LANDMARK); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_notecard")) - { - filter &= ~(0x1 << LLInventoryType::IT_NOTECARD); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_object")) - { - filter &= ~(0x1 << LLInventoryType::IT_OBJECT); - filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_script")) - { - filter &= ~(0x1 << LLInventoryType::IT_LSL); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_sound")) - { - filter &= ~(0x1 << LLInventoryType::IT_SOUND); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_texture")) - { - filter &= ~(0x1 << LLInventoryType::IT_TEXTURE); - filtered_by_all_types = FALSE; - } - - if (!childGetValue("check_snapshot")) - { - filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT); - filtered_by_all_types = FALSE; - } - - if (!filtered_by_all_types) - { - // don't include folders in filter, unless I've selected everything - filter &= ~(0x1 << LLInventoryType::IT_CATEGORY); - } - - // update the panel, panel will update the filter - mPanelInventoryDecorated->getPanel()->setShowFolderState(getCheckShowEmpty() ? - LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - mPanelInventoryDecorated->getPanel()->setFilterTypes(filter); - if (getCheckSinceLogoff()) - { - mSpinSinceDays->set(0); - mSpinSinceHours->set(0); - } - U32 days = (U32)mSpinSinceDays->get(); - U32 hours = (U32)mSpinSinceHours->get(); - if (hours > 24) - { - days += hours / 24; - hours = (U32)hours % 24; - mSpinSinceDays->set((F32)days); - mSpinSinceHours->set((F32)hours); - } - hours += days * 24; - mPanelInventoryDecorated->getPanel()->setHoursAgo(hours); - mPanelInventoryDecorated->getPanel()->setSinceLogoff(getCheckSinceLogoff()); - mPanelInventoryDecorated->setFilterTextFromFilter(); - - LLPanel::draw(); -} - -BOOL LLFloaterInventoryFinder::getCheckShowEmpty() -{ - return childGetValue("check_show_empty"); -} - -BOOL LLFloaterInventoryFinder::getCheckSinceLogoff() -{ - return childGetValue("check_since_logoff"); -} - -void LLFloaterInventoryFinder::onCloseBtn(void* user_data) -{ - LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data; - finderp->closeFloater(); -} - -// static -void LLFloaterInventoryFinder::selectAllTypes(void* user_data) -{ - LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; - if(!self) return; - - self->childSetValue("check_animation", TRUE); - self->childSetValue("check_calling_card", TRUE); - self->childSetValue("check_clothing", TRUE); - self->childSetValue("check_gesture", TRUE); - self->childSetValue("check_landmark", TRUE); - self->childSetValue("check_notecard", TRUE); - self->childSetValue("check_object", TRUE); - self->childSetValue("check_script", TRUE); - self->childSetValue("check_sound", TRUE); - self->childSetValue("check_texture", TRUE); - self->childSetValue("check_snapshot", TRUE); -} - -//static -void LLFloaterInventoryFinder::selectNoTypes(void* user_data) -{ - LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; - if(!self) return; - - self->childSetValue("check_animation", FALSE); - self->childSetValue("check_calling_card", FALSE); - self->childSetValue("check_clothing", FALSE); - self->childSetValue("check_gesture", FALSE); - self->childSetValue("check_landmark", FALSE); - self->childSetValue("check_notecard", FALSE); - self->childSetValue("check_object", FALSE); - self->childSetValue("check_script", FALSE); - self->childSetValue("check_sound", FALSE); - self->childSetValue("check_texture", FALSE); - self->childSetValue("check_snapshot", FALSE); -} +/** + * @file llsidepanelmaininventory.cpp + * @brief Implementation of llsidepanelmaininventory. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llpanelmaininventory.h" + +#include "llfloaterinventory.h" +#include "llinventorybridge.h" +#include "llinventoryfunctions.h" +#include "llinventorypanel.h" +#include "llfiltereditor.h" +#include "llfloaterreg.h" +#include "llscrollcontainer.h" +#include "llsdserialize.h" +#include "llspinctrl.h" +#include "lltooldraganddrop.h" + +static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); // Seraph is this redundant with constructor? + +///---------------------------------------------------------------------------- +/// LLFloaterInventoryFinder +///---------------------------------------------------------------------------- + +class LLFloaterInventoryFinder : public LLFloater +{ +public: + LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view); + virtual void draw(); + /*virtual*/ BOOL postBuild(); + void changeFilter(LLInventoryFilter* filter); + void updateElementsFromFilter(); + BOOL getCheckShowEmpty(); + BOOL getCheckSinceLogoff(); + + static void onTimeAgo(LLUICtrl*, void *); + static void onCheckSinceLogoff(LLUICtrl*, void *); + static void onCloseBtn(void* user_data); + static void selectAllTypes(void* user_data); + static void selectNoTypes(void* user_data); +private: + LLPanelMainInventory* mPanelMainInventory; + LLSpinCtrl* mSpinSinceDays; + LLSpinCtrl* mSpinSinceHours; + LLInventoryFilter* mFilter; +}; + +///---------------------------------------------------------------------------- +/// LLPanelMainInventory +///---------------------------------------------------------------------------- + +LLPanelMainInventory::LLPanelMainInventory() + : LLPanel() +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT); + // Menu Callbacks (non contex menus) + mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2)); + mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); + mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2)); + mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this)); + mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this)); + mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this)); + mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2)); + + // Controls + // *TODO: Just use persistant settings for each of these + U32 sort_order = gSavedSettings.getU32("InventorySortOrder"); + BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE ); + BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME ); + BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ); + + gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE); + gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE); + gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE); + gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE); + + mSavedFolderState = new LLSaveFolderState(); + mSavedFolderState->setApply(FALSE); +} + +BOOL LLPanelMainInventory::postBuild() +{ + gInventory.addObserver(this); + + mFilterTabs = getChild<LLTabContainer>("inventory filter tabs"); + mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this)); + + //panel->getFilter()->markDefault(); + + // Set up the default inv. panel/filter settings. + mActivePanel = getChild<LLInventoryPanel>("All Items"); + if (mActivePanel) + { + // "All Items" is the previous only view, so it gets the InventorySortOrder + mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder")); + mActivePanel->getFilter()->markDefault(); + mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + mActivePanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mActivePanel, _1, _2)); + mActivePanel->getRootFolder()->openFolder("My Inventory"); + } + LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); + if (recent_items_panel) + { + recent_items_panel->setSinceLogoff(TRUE); + recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE); + recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + recent_items_panel->getFilter()->markDefault(); + recent_items_panel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, recent_items_panel, _1, _2)); + } + + // Now load the stored settings from disk, if available. + std::ostringstream filterSaveName; + filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); + llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName << llendl; + llifstream file(filterSaveName.str()); + LLSD savedFilterState; + if (file.is_open()) + { + LLSDSerialize::fromXML(savedFilterState, file); + file.close(); + + // Load the persistent "Recent Items" settings. + // Note that the "All Items" settings do not persist. + if(recent_items_panel) + { + if(savedFilterState.has(recent_items_panel->getFilter()->getName())) + { + LLSD recent_items = savedFilterState.get( + recent_items_panel->getFilter()->getName()); + recent_items_panel->getFilter()->fromLLSD(recent_items); + } + } + + } + + + mFilterEditor = getChild<LLFilterEditor>("inventory search editor"); + if (mFilterEditor) + { + mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2)); + } + + // *TODO:Get the cost info from the server + const std::string upload_cost("10"); + childSetLabelArg("Upload Image", "[COST]", upload_cost); + childSetLabelArg("Upload Sound", "[COST]", upload_cost); + childSetLabelArg("Upload Animation", "[COST]", upload_cost); + childSetLabelArg("Bulk Upload", "[COST]", upload_cost); + + return TRUE; +} + +// Destroys the object +LLPanelMainInventory::~LLPanelMainInventory( void ) +{ + // Save the filters state. + LLSD filterRoot; + LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items"); + if (all_items_panel) + { + LLInventoryFilter* filter = all_items_panel->getFilter(); + if (filter) + { + LLSD filterState; + filter->toLLSD(filterState); + filterRoot[filter->getName()] = filterState; + } + } + + LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); + if (recent_items_panel) + { + LLInventoryFilter* filter = recent_items_panel->getFilter(); + if (filter) + { + LLSD filterState; + filter->toLLSD(filterState); + filterRoot[filter->getName()] = filterState; + } + } + + std::ostringstream filterSaveName; + filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml"); + llofstream filtersFile(filterSaveName.str()); + if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile)) + { + llwarns << "Could not write to filters save file " << filterSaveName << llendl; + } + else + filtersFile.close(); + + gInventory.removeObserver(this); + delete mSavedFolderState; +} + +void LLPanelMainInventory::startSearch() +{ + // this forces focus to line editor portion of search editor + if (mFilterEditor) + { + mFilterEditor->focusFirstItem(TRUE); + } +} + +BOOL LLPanelMainInventory::handleKeyHere(KEY key, MASK mask) +{ + LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL; + if (root_folder) + { + // first check for user accepting current search results + if (mFilterEditor + && mFilterEditor->hasFocus() + && (key == KEY_RETURN + || key == KEY_DOWN) + && mask == MASK_NONE) + { + // move focus to inventory proper + mActivePanel->setFocus(TRUE); + root_folder->scrollToShowSelection(); + return TRUE; + } + + if (mActivePanel->hasFocus() && key == KEY_UP) + { + startSearch(); + } + } + + return LLPanel::handleKeyHere(key, mask); + +} + +//---------------------------------------------------------------------------- +// menu callbacks + +void LLPanelMainInventory::doToSelected(const LLSD& userdata) +{ + getPanel()->getRootFolder()->doToSelected(&gInventory, userdata); +} + +void LLPanelMainInventory::closeAllFolders() +{ + getPanel()->getRootFolder()->closeAllFolders(); +} + +void LLPanelMainInventory::newWindow() +{ + LLFloaterInventory::showAgentInventory(); +} + +void LLPanelMainInventory::doCreate(const LLSD& userdata) +{ + menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata); +} + +void LLPanelMainInventory::resetFilters() +{ + LLFloaterInventoryFinder *finder = getFinder(); + getActivePanel()->getFilter()->resetDefault(); + if (finder) + { + finder->updateElementsFromFilter(); + } + + setFilterTextFromFilter(); +} + +void LLPanelMainInventory::setSortBy(const LLSD& userdata) +{ + std::string sort_field = userdata.asString(); + if (sort_field == "name") + { + U32 order = getActivePanel()->getSortOrder(); + getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE ); + + gSavedSettings.setBOOL("Inventory.SortByName", TRUE ); + gSavedSettings.setBOOL("Inventory.SortByDate", FALSE ); + } + else if (sort_field == "date") + { + U32 order = getActivePanel()->getSortOrder(); + getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE ); + + gSavedSettings.setBOOL("Inventory.SortByName", FALSE ); + gSavedSettings.setBOOL("Inventory.SortByDate", TRUE ); + } + else if (sort_field == "foldersalwaysbyname") + { + U32 order = getActivePanel()->getSortOrder(); + if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME ) + { + order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME; + + gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE ); + } + else + { + order |= LLInventoryFilter::SO_FOLDERS_BY_NAME; + + gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE ); + } + getActivePanel()->setSortOrder( order ); + } + else if (sort_field == "systemfolderstotop") + { + U32 order = getActivePanel()->getSortOrder(); + if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP ) + { + order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; + + gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE ); + } + else + { + order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; + + gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE ); + } + getActivePanel()->setSortOrder( order ); + } +} + +// static +BOOL LLPanelMainInventory::filtersVisible(void* user_data) +{ + LLPanelMainInventory* self = (LLPanelMainInventory*)user_data; + if(!self) return FALSE; + + return self->getFinder() != NULL; +} + +void LLPanelMainInventory::onClearSearch() +{ + LLFloater *finder = getFinder(); + if (mActivePanel) + { + mActivePanel->setFilterSubString(LLStringUtil::null); + mActivePanel->setFilterTypes(0xffffffff); + } + + if (finder) + { + LLFloaterInventoryFinder::selectAllTypes(finder); + } + + // re-open folders that were initially open + if (mActivePanel) + { + mSavedFolderState->setApply(TRUE); + mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + LLOpenFoldersWithSelection opener; + mActivePanel->getRootFolder()->applyFunctorRecursively(opener); + mActivePanel->getRootFolder()->scrollToShowSelection(); + } +} + +void LLPanelMainInventory::onFilterEdit(const std::string& search_string ) +{ + if (search_string == "") + { + onClearSearch(); + } + if (!mActivePanel) + { + return; + } + + gInventory.startBackgroundFetch(); + + std::string uppercase_search_string = search_string; + LLStringUtil::toUpper(uppercase_search_string); + if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty()) + { + // current filter and new filter empty, do nothing + return; + } + + // save current folder open state if no filter currently applied + if (!mActivePanel->getRootFolder()->isFilterModified()) + { + mSavedFolderState->setApply(FALSE); + mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + } + + // set new filter string + mActivePanel->setFilterSubString(uppercase_search_string); +} + + + //static + BOOL LLPanelMainInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward) + { + LLPanelMainInventory* active_view = NULL; + + LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory"); + for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) + { + LLPanelMainInventory* iv = dynamic_cast<LLPanelMainInventory*>(*iter); + if (iv) + { + if (gFocusMgr.childHasKeyboardFocus(iv)) + { + active_view = iv; + break; + } + } + } + + if (!active_view) + { + return FALSE; + } + + std::string search_string(find_text); + + if (search_string.empty()) + { + return FALSE; + } + + if (active_view->getPanel() && + active_view->getPanel()->getRootFolder()->search(first_item, search_string, backward)) + { + return TRUE; + } + + return FALSE; + } + +void LLPanelMainInventory::onFilterSelected() +{ + // Find my index + mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs"); + + if (!mActivePanel) + { + return; + } + LLInventoryFilter* filter = mActivePanel->getFilter(); + LLFloaterInventoryFinder *finder = getFinder(); + if (finder) + { + finder->changeFilter(filter); + } + if (filter->isActive()) + { + // If our filter is active we may be the first thing requiring a fetch so we better start it here. + gInventory.startBackgroundFetch(); + } + setFilterTextFromFilter(); +} + +const std::string LLPanelMainInventory::getFilterSubString() +{ + return mActivePanel->getFilterSubString(); +} + +void LLPanelMainInventory::setFilterSubString(const std::string& string) +{ + mActivePanel->setFilterSubString(string); +} + +BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg) +{ + // Check to see if we are auto scrolling from the last frame + LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel(); + BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y); + if(mFilterTabs) + { + if(needsToScroll) + { + mFilterTabs->startDragAndDropDelayTimer(); + } + } + + BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); + + return handled; +} + +void LLPanelMainInventory::changed(U32 mask) +{ +} + + +void LLPanelMainInventory::setFilterTextFromFilter() +{ + mFilterText = mActivePanel->getFilter()->getFilterText(); +} + +void LLPanelMainInventory::toggleFindOptions() +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE); + LLFloater *floater = getFinder(); + if (!floater) + { + LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this); + mFinderHandle = finder->getHandle(); + finder->openFloater(); + + LLFloater* parent_floater = gFloaterView->getParentFloater(this); + if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel + parent_floater->addDependentFloater(mFinderHandle); + // start background fetch of folders + gInventory.startBackgroundFetch(); + } + else + { + floater->closeFloater(); + } +} + +void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb) +{ + getChild<LLInventoryPanel>("All Items")->setSelectCallback(cb); + getChild<LLInventoryPanel>("Recent Items")->setSelectCallback(cb); +} + +///---------------------------------------------------------------------------- +/// LLFloaterInventoryFinder +///---------------------------------------------------------------------------- + +LLFloaterInventoryFinder* LLPanelMainInventory::getFinder() +{ + return (LLFloaterInventoryFinder*)mFinderHandle.get(); +} + + +LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) : + LLFloater(LLSD()), + mPanelMainInventory(inventory_view), + mFilter(inventory_view->getPanel()->getFilter()) +{ + LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL); + updateElementsFromFilter(); +} + + +void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data) +{ + LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; + if (!self) return; + + bool since_logoff= self->childGetValue("check_since_logoff"); + + if (!since_logoff && + !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) ) + { + self->mSpinSinceHours->set(1.0f); + } +} +BOOL LLFloaterInventoryFinder::postBuild() +{ + const LLRect& viewrect = mPanelMainInventory->getRect(); + setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight())); + + childSetAction("All", selectAllTypes, this); + childSetAction("None", selectNoTypes, this); + + mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago"); + childSetCommitCallback("spin_hours_ago", onTimeAgo, this); + + mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago"); + childSetCommitCallback("spin_days_ago", onTimeAgo, this); + + // mCheckSinceLogoff = getChild<LLSpinCtrl>("check_since_logoff"); + childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this); + + childSetAction("Close", onCloseBtn, this); + + updateElementsFromFilter(); + return TRUE; +} +void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data) +{ + LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; + if (!self) return; + + bool since_logoff=true; + if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) + { + since_logoff = false; + } + self->childSetValue("check_since_logoff", since_logoff); +} + +void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter) +{ + mFilter = filter; + updateElementsFromFilter(); +} + +void LLFloaterInventoryFinder::updateElementsFromFilter() +{ + if (!mFilter) + return; + + // Get data needed for filter display + U32 filter_types = mFilter->getFilterTypes(); + std::string filter_string = mFilter->getFilterSubString(); + LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState(); + U32 hours = mFilter->getHoursAgo(); + + // update the ui elements + setTitle(mFilter->getName()); + + childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION)); + + childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD)); + childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE)); + childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE)); + childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK)); + childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD)); + childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT)); + childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL)); + childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND)); + childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE)); + childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT)); + childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS); + childSetValue("check_since_logoff", mFilter->isSinceLogoff()); + mSpinSinceHours->set((F32)(hours % 24)); + mSpinSinceDays->set((F32)(hours / 24)); +} + +void LLFloaterInventoryFinder::draw() +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW); + U32 filter = 0xffffffff; + BOOL filtered_by_all_types = TRUE; + + if (!childGetValue("check_animation")) + { + filter &= ~(0x1 << LLInventoryType::IT_ANIMATION); + filtered_by_all_types = FALSE; + } + + + if (!childGetValue("check_calling_card")) + { + filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_clothing")) + { + filter &= ~(0x1 << LLInventoryType::IT_WEARABLE); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_gesture")) + { + filter &= ~(0x1 << LLInventoryType::IT_GESTURE); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_landmark")) + + + { + filter &= ~(0x1 << LLInventoryType::IT_LANDMARK); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_notecard")) + { + filter &= ~(0x1 << LLInventoryType::IT_NOTECARD); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_object")) + { + filter &= ~(0x1 << LLInventoryType::IT_OBJECT); + filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_script")) + { + filter &= ~(0x1 << LLInventoryType::IT_LSL); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_sound")) + { + filter &= ~(0x1 << LLInventoryType::IT_SOUND); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_texture")) + { + filter &= ~(0x1 << LLInventoryType::IT_TEXTURE); + filtered_by_all_types = FALSE; + } + + if (!childGetValue("check_snapshot")) + { + filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT); + filtered_by_all_types = FALSE; + } + + if (!filtered_by_all_types) + { + // don't include folders in filter, unless I've selected everything + filter &= ~(0x1 << LLInventoryType::IT_CATEGORY); + } + + // update the panel, panel will update the filter + mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ? + LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + mPanelMainInventory->getPanel()->setFilterTypes(filter); + if (getCheckSinceLogoff()) + { + mSpinSinceDays->set(0); + mSpinSinceHours->set(0); + } + U32 days = (U32)mSpinSinceDays->get(); + U32 hours = (U32)mSpinSinceHours->get(); + if (hours > 24) + { + days += hours / 24; + hours = (U32)hours % 24; + mSpinSinceDays->set((F32)days); + mSpinSinceHours->set((F32)hours); + } + hours += days * 24; + mPanelMainInventory->getPanel()->setHoursAgo(hours); + mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff()); + mPanelMainInventory->setFilterTextFromFilter(); + + LLPanel::draw(); +} + +BOOL LLFloaterInventoryFinder::getCheckShowEmpty() +{ + return childGetValue("check_show_empty"); +} + +BOOL LLFloaterInventoryFinder::getCheckSinceLogoff() +{ + return childGetValue("check_since_logoff"); +} + +void LLFloaterInventoryFinder::onCloseBtn(void* user_data) +{ + LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data; + finderp->closeFloater(); +} + +// static +void LLFloaterInventoryFinder::selectAllTypes(void* user_data) +{ + LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; + if(!self) return; + + self->childSetValue("check_animation", TRUE); + self->childSetValue("check_calling_card", TRUE); + self->childSetValue("check_clothing", TRUE); + self->childSetValue("check_gesture", TRUE); + self->childSetValue("check_landmark", TRUE); + self->childSetValue("check_notecard", TRUE); + self->childSetValue("check_object", TRUE); + self->childSetValue("check_script", TRUE); + self->childSetValue("check_sound", TRUE); + self->childSetValue("check_texture", TRUE); + self->childSetValue("check_snapshot", TRUE); +} + +//static +void LLFloaterInventoryFinder::selectNoTypes(void* user_data) +{ + LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data; + if(!self) return; + + self->childSetValue("check_animation", FALSE); + self->childSetValue("check_calling_card", FALSE); + self->childSetValue("check_clothing", FALSE); + self->childSetValue("check_gesture", FALSE); + self->childSetValue("check_landmark", FALSE); + self->childSetValue("check_notecard", FALSE); + self->childSetValue("check_object", FALSE); + self->childSetValue("check_script", FALSE); + self->childSetValue("check_sound", FALSE); + self->childSetValue("check_texture", FALSE); + self->childSetValue("check_snapshot", FALSE); +} diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 759c86f3a02..47e745c9d3f 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -67,6 +67,7 @@ #include "llinventorymodel.h" #include "llmenugl.h" #include "llmutelist.h" +#include "llsidepaneltaskinfo.h" #include "llslurl.h" #include "llstatusbar.h" #include "llsurface.h" @@ -4906,12 +4907,20 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) } if (mSelectedObjects->getNumNodes()) { - LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect"); LLUUID inspect_item_id= LLUUID::null; +#if 0 + LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect"); if(inspect_instance) { inspect_item_id = inspect_instance->getSelectedUUID(); } +#endif + LLSidepanelTaskInfo *panel_task_info = LLSidepanelTaskInfo::getActivePanel(); + if (panel_task_info) + { + inspect_item_id = panel_task_info->getSelectedUUID(); + } + for (S32 pass = 0; pass < 2; pass++) { for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); @@ -5494,12 +5503,19 @@ void dialog_refresh_all() } LLFloaterProperties::dirtyAll(); - + +#if 0 LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect"); if(inspect_instance) { inspect_instance->dirty(); } +#endif + LLSidepanelTaskInfo *panel_task_info = LLSidepanelTaskInfo::getActivePanel(); + if (panel_task_info) + { + panel_task_info->dirty(); + } } S32 get_family_count(LLViewerObject *parent) diff --git a/indra/newview/llsidepanelinventorysubpanel.cpp b/indra/newview/llsidepanelinventorysubpanel.cpp index 85224567771..162198f1c55 100644 --- a/indra/newview/llsidepanelinventorysubpanel.cpp +++ b/indra/newview/llsidepanelinventorysubpanel.cpp @@ -87,7 +87,6 @@ void LLSidepanelInventorySubpanel::setVisible(BOOL visible) if (visible) { dirty(); - setIsEditing(FALSE); } LLPanel::setVisible(visible); } @@ -123,6 +122,7 @@ void LLSidepanelInventorySubpanel::draw() void LLSidepanelInventorySubpanel::dirty() { mIsDirty = TRUE; + setIsEditing(FALSE); } void LLSidepanelInventorySubpanel::updateVerbs() diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 4284c95b130..01c832d7d56 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -71,6 +71,8 @@ /// Class llsidepaneltaskinfo ///---------------------------------------------------------------------------- +LLSidepanelTaskInfo* LLSidepanelTaskInfo::sActivePanel = NULL; + static LLRegisterPanelClassWrapper<LLSidepanelTaskInfo> t_task_info("sidepanel_task_info"); // Default constructor @@ -79,6 +81,14 @@ LLSidepanelTaskInfo::LLSidepanelTaskInfo() setMouseOpaque(FALSE); } + +LLSidepanelTaskInfo::~LLSidepanelTaskInfo() +{ + if (sActivePanel == this) + sActivePanel = NULL; +} + +// virtual BOOL LLSidepanelTaskInfo::postBuild() { LLSidepanelInventorySubpanel::postBuild(); @@ -101,12 +111,20 @@ BOOL LLSidepanelTaskInfo::postBuild() return TRUE; } -LLSidepanelTaskInfo::~LLSidepanelTaskInfo() +// virtual +void LLSidepanelTaskInfo::setVisible(BOOL visible) { - // base class will take care of everything + LLPanel::setVisible(visible); + if (visible) + { + sActivePanel = this; + } + else + { + sActivePanel = NULL; + } } - void LLSidepanelTaskInfo::refresh() { LLButton* BtnDeedToGroup = getChild<LLButton>("button deed"); @@ -1037,6 +1055,8 @@ void LLSidepanelTaskInfo::updateVerbs() mBuyBtn->setVisible(!getIsEditing()); mOpenBtn->setEnabled(enable_object_open()); + const LLViewerObject *obj = getFirstSelectedObject(); + mEditBtn->setEnabled(obj && obj->permModify()); } void LLSidepanelTaskInfo::onOpenButtonClicked() @@ -1077,3 +1097,28 @@ void LLSidepanelTaskInfo::setObjectSelection(LLObjectSelectionHandle selection) { mObjectSelection = selection; } + +LLSidepanelTaskInfo* LLSidepanelTaskInfo::getActivePanel() +{ + return sActivePanel; +} + +LLViewerObject* LLSidepanelTaskInfo::getFirstSelectedObject() +{ + LLSelectNode *node = mObjectSelection->getFirstRootNode(); + if (node) + { + return node->getObject(); + } + return NULL; +} + +const LLUUID& LLSidepanelTaskInfo::getSelectedUUID() +{ + const LLViewerObject* obj = getFirstSelectedObject(); + if (obj) + { + return obj->getID(); + } + return LLUUID::null; +} diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h index 25a9e2d5772..b6dd4dfb2ce 100644 --- a/indra/newview/llsidepaneltaskinfo.h +++ b/indra/newview/llsidepaneltaskinfo.h @@ -45,6 +45,7 @@ class LLNameBox; class LLCheckBoxCtrl; +class LLViewerObject; class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel { @@ -53,9 +54,14 @@ class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel virtual ~LLSidepanelTaskInfo(); /*virtual*/ BOOL postBuild(); + /*virtual*/ void setVisible(BOOL visible); void setObjectSelection(LLObjectSelectionHandle selection); + const LLUUID& getSelectedUUID(); + LLViewerObject* getFirstSelectedObject(); + + static LLSidepanelTaskInfo *getActivePanel(); protected: /*virtual*/ void refresh(); // refresh all labels as needed /*virtual*/ void save(); @@ -102,6 +108,7 @@ class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel LLButton* mBuyBtn; LLObjectSelectionHandle mObjectSelection; + static LLSidepanelTaskInfo* sActivePanel; }; -- GitLab From 02608052592eb47aea7c8856e85d64aec086d658 Mon Sep 17 00:00:00 2001 From: Eugene Mutavchi <emutavchi@productengine.com> Date: Thu, 5 Nov 2009 22:05:48 +0200 Subject: [PATCH 184/306] Fixed normal bug EXT-1420(Menu context (People side panel) sorting is not working) --HG-- branch : product-engine --- indra/newview/llpanelpeople.cpp | 3 --- .../skins/default/xui/en/menu_people_friends_view_sort.xml | 3 --- 2 files changed, 6 deletions(-) diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index c8bb3d5353c..65a7b5322b5 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -992,9 +992,6 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata) mAllFriendList->toggleIcons(); mOnlineFriendList->toggleIcons(); } - else if (chosen_item == "organize_offline") - { - } } void LLPanelPeople::onGroupsViewSortMenuItemClicked(const LLSD& userdata) diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml index eedb4383bbf..f1117d14191 100644 --- a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml +++ b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml @@ -31,9 +31,6 @@ function="CheckControl" parameter="FriendsListShowIcons" /> </menu_item_check> - <menu_item_call name="organize_offline" label="Organize Offline Friends"> - <menu_item_call.on_click function="People.Friends.ViewSort.Action" userdata="organize_offline" /> - </menu_item_call> <menu_item_separator layout="topleft" /> <menu_item_call name="show_blocked_list" label="Show Blocked Residents & Objects"> <menu_item_call.on_click function="SideTray.ShowPanel" parameter="panel_block_list_sidetray" /> -- GitLab From b60d80542f240c869cf690382cf9cf0278e16e75 Mon Sep 17 00:00:00 2001 From: Rick Pasetto <rick@lindenlab.com> Date: Thu, 5 Nov 2009 12:10:30 -0800 Subject: [PATCH 185/306] Remove scrolling controls (not to spec) --- .../skins/default/xui/en/panel_prim_media_controls.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index d384abf038a..fc5ccdb63e6 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -412,6 +412,8 @@ function="MediaCtrl.CommitURL" /> </button> </layout_panel> <!-- Scroll pad --> +<!-- +disabled <layout_panel name="media_panel_scroll" auto_resize="false" @@ -477,6 +479,8 @@ function="MediaCtrl.CommitURL" /> min_width="8" width="8" /> </layout_panel> +disabled +--> <layout_panel name="zoom_frame" auto_resize="false" -- GitLab From ebf74a7b38826eb113162cd7bca4e3b76318e4d3 Mon Sep 17 00:00:00 2001 From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com> Date: Thu, 5 Nov 2009 15:16:27 -0500 Subject: [PATCH 186/306] Updated TimeTextColor. http://jira.secondlife.com/browse/EXT-2138 --- indra/newview/skins/default/colors.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 1e0da131628..572a4cf9e95 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -651,7 +651,7 @@ value="0 0 0 .33" /> <color name="TimeTextColor" - reference="LtGray_50" /> + reference="LtGray" /> <color name="TitleBarFocusColor" reference="White_10" /> -- GitLab From 6ce9f3b047084a9b947f66d041645238feb4b09b Mon Sep 17 00:00:00 2001 From: Erica <erica@lindenlab.com> Date: Thu, 5 Nov 2009 12:53:41 -0800 Subject: [PATCH 187/306] EXT-2160 texture picker cancel button should be on the right, General texture and color picker cleanup --- .../default/xui/en/floater_color_picker.xml | 22 ++-- .../default/xui/en/floater_texture_ctrl.xml | 105 +++++++++--------- 2 files changed, 67 insertions(+), 60 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_color_picker.xml b/indra/newview/skins/default/xui/en/floater_color_picker.xml index e4b9d3f6bc7..4380ff8f4b0 100644 --- a/indra/newview/skins/default/xui/en/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_color_picker.xml @@ -168,26 +168,29 @@ <check_box follows="left|bottom" height="20" - label="Apply Now" + label="Apply now" layout="topleft" left="12" name="apply_immediate" top_pad="185" width="100" /> - <button - follows="left|top" - height="32" + <button + follows="left|bottom" + height="28" + image_selected="eye_button_active.tga" + image_unselected="eye_button_inactive.tga" layout="topleft" - left_pad="30" - name="color_pipette" - width="32" /> + left_pad="50" + name="Pipette" + width="28" /> <button follows="right|bottom" height="20" label="Ok" - label_selected="Select" + label_selected="Ok" layout="topleft" - left_pad="50" + right="-120" + top_delta="9" name="select_btn" width="100" /> <button @@ -197,6 +200,7 @@ label_selected="Cancel" layout="topleft" left_pad="5" + right="-10" name="cancel_btn" width="100" /> <text diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml index 88afa549725..4679ae467df 100644 --- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml @@ -23,14 +23,16 @@ type="string" length="1" follows="left|top" + text_color="White" + font="SansSerifBig" halign="center" - height="14" + height="17" layout="topleft" left="4" name="Multiple" top="96" width="163"> - Multiple + Multiple textures </text> <text type="string" @@ -42,7 +44,7 @@ name="unknown" top_pad="80" width="163"> - Dimensions: [DIMENSIONS] + Size: [DIMENSIONS] </text> <button enabled="false" @@ -55,7 +57,7 @@ left_delta="0" name="Default" top_pad="4" - width="64" /> + width="80" /> <button enabled="false" follows="left|bottom" @@ -67,7 +69,7 @@ left_pad="4" name="None" top_delta="0" - width="64" /> + width="80" /> <button follows="left|bottom" font="SansSerifSmall" @@ -77,74 +79,75 @@ layout="topleft" left="4" name="Blank" - top="232" - width="64" /> - <check_box - height="24" + top_pad="5" + width="80" /> + <button + follows="left|bottom" + height="28" + image_selected="eye_button_active.tga" + image_unselected="eye_button_inactive.tga" + layout="topleft" + left_pad="50" + top_delta="3" + name="Pipette" + width="28" /> + <check_box + follows="left|bottom" + height="20" initial_value="true" - label="Show Folders" + label="Apply now" layout="topleft" - left="175" - name="show_folders_check" - top="20" - width="201" /> + left="4" + name="apply_immediate_check" + top="262" + width="120" /> <filter_editor follows="left|top|right" - height="16" - label="Type here to search" + height="23" + label="Filter textures" layout="topleft" - left_delta="0" + left="175" name="inventory search editor" - top_delta="0" + top="20" width="231" /> <inventory_panel allow_multi_select="false" - border="true" - follows="left|top|right|bottom" - height="216" + bg_visible="true" + bg_alpha_color="DkGray2" + border="false" + follows="all" + height="200" layout="topleft" left_delta="0" name="inventory panel" top_pad="4" width="231" /> - <check_box - follows="left|bottom" - height="20" - initial_value="true" - label="Apply Immediately" - layout="topleft" - left="4" - name="apply_immediate_check" - top="262" - width="150" /> - <button - follows="left|bottom" - height="32" - image_selected="eye_button_active.tga" - image_unselected="eye_button_inactive.tga" + <check_box + height="14" + initial_value="false" + label="Show folders" layout="topleft" - left="139" - name="Pipette" - top="250" - width="32" /> - <button + name="show_folders_check" + top_pad="0" + left_delta="-3" + width="200" /> + <button follows="right|bottom" height="20" - label="Cancel" - label_selected="Cancel" + label="Ok" + label_selected="Ok" layout="topleft" - left="186" - name="Cancel" - top="262" + right="-120" + name="Select" width="100" /> <button follows="right|bottom" height="20" - label="Select" - label_selected="Select" + label="Cancel" + label_selected="Cancel" layout="topleft" - left_pad="4" - name="Select" - top_delta="0" + right="-10" + left_pad="5" + name="Cancel" width="100" /> </floater> -- GitLab From c9e91056fd8029dfc323d9a08c24d38e488a3de3 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Thu, 5 Nov 2009 13:49:15 -0800 Subject: [PATCH 188/306] fixed crash on login reviewed by James --- indra/newview/skins/default/xui/en/panel_side_tray.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml index d3de09ab4ce..3582de1c711 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <!-- Side tray cannot show background because it is always partially on screen to hold tab buttons. --> -<panel +<side_tray name="sidebar" background_visible="false" mouse_opaque="true" @@ -147,4 +147,4 @@ /> </sidetray_tab> -</panel> +</side_tray> -- GitLab From 50164c2d8663039b6b10e94e84b689da6e794fbb Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Thu, 5 Nov 2009 13:49:59 -0800 Subject: [PATCH 189/306] removed some more picture_style attributes --- .../newview/skins/default/xui/en/panel_bottomtray.xml | 1 - indra/newview/skins/default/xui/en/panel_people.xml | 10 ---------- .../default/xui/en/panel_side_tray_tab_caption.xml | 1 - 3 files changed, 12 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index dcfd0af36e9..f833e0a1cbb 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -271,7 +271,6 @@ follows="right" flash_color="EmphasisColor" name="Unread" - picture_style="true" image_overlay="Notices_Unread" width="20" /> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 5ab2e623e46..d6e2aa64fa5 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -94,7 +94,6 @@ background_visible="true" layout="topleft" left="10" name="nearby_view_sort_btn" - picture_style="true" top="5" width="18" /> <button @@ -106,7 +105,6 @@ background_visible="true" layout="topleft" left_pad="5" name="add_friend_btn" - picture_style="true" top_delta="0" tool_tip="Add selected resident to your friends List" width="18" /> @@ -180,7 +178,6 @@ background_visible="true" layout="topleft" left="10" name="friends_viewsort_btn" - picture_style="true" top="5" width="18" /> <button @@ -192,7 +189,6 @@ background_visible="true" layout="topleft" left_pad="5" name="add_btn" - picture_style="true" tool_tip="Offer friendship to a resident" top_delta="0" width="18" /> @@ -206,7 +202,6 @@ background_visible="true" left_pad="10" right="-10" name="del_btn" - picture_style="true" tool_tip="Remove selected person from your Friends list" top_delta="0" width="18" /> @@ -249,7 +244,6 @@ background_visible="true" layout="topleft" left="10" name="groups_viewsort_btn" - picture_style="true" top="7" width="18" /> <button @@ -261,7 +255,6 @@ background_visible="true" layout="topleft" left_pad="5" name="plus_btn" - picture_style="true" tool_tip="Join group/Create new group" top_delta="0" width="18" /> @@ -274,7 +267,6 @@ background_visible="true" layout="topleft" left_pad="24" name="activate_btn" - picture_style="true" tool_tip="Activate selected group" top_delta="5" width="10" /> @@ -320,7 +312,6 @@ background_visible="true" layout="topleft" left="10" name="recent_viewsort_btn" - picture_style="true" top="7" width="18" /> <button @@ -332,7 +323,6 @@ background_visible="true" layout="topleft" left_pad="5" name="add_friend_btn" - picture_style="true" top_delta="0" tool_tip="Add selected resident to your friends List" width="18" /> diff --git a/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml index 4c8bb68e549..0a9c70303e1 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray_tab_caption.xml @@ -25,7 +25,6 @@ image_selected="Icon_Help_Press" image_unselected="Icon_Help_Foreground" image_disabled="Icon_Help_Press" - picture_style="true" layout="topleft" name="show_help" top="10" -- GitLab From d7a2ddc0c065847c91ae593f9987ad32bf13a74e Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Thu, 5 Nov 2009 13:51:26 -0800 Subject: [PATCH 190/306] EXT-2262 Arrow keys should move cursor in chat entry field. See Communications Spec for design. Arrow keys still move you if text chat field is empty. Also fixed ctrl-up/ctrl-down for recently chatted lines. Reviewed with Richard. --- indra/newview/app_settings/settings.xml | 4 +- indra/newview/llviewerwindow.cpp | 39 +++++++++---------- .../xui/en/panel_preferences_advanced.xml | 2 +- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 7254fff664a..02fd05458b6 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -133,7 +133,7 @@ <key>Value</key> <integer>1</integer> </map> - <key>ArrowKeysMoveAvatar</key> + <key>ArrowKeysAlwaysMove</key> <map> <key>Comment</key> <string>While cursor is in chat entry box, arrow keys still control your avatar</string> @@ -142,7 +142,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>AskedAboutCrashReports</key> <map> diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index b574a9c110d..765f4e4476c 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2113,31 +2113,30 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) // arrow keys move avatar while chatting hack if (chat_editor && chat_editor->hasFocus()) { - if (chat_editor->getText().empty() || gSavedSettings.getBOOL("ArrowKeysMoveAvatar")) + // let Control-Up and Control-Down through for chat line history + if (!(key == KEY_UP && mask == MASK_CONTROL) + && !(key == KEY_DOWN && mask == MASK_CONTROL)) { - switch(key) + // If text field is empty, there's no point in trying to move + // cursor with arrow keys, so allow movement + if (chat_editor->getText().empty() + || gSavedSettings.getBOOL("ArrowKeysAlwaysMove")) { - case KEY_LEFT: - case KEY_RIGHT: - case KEY_UP: - // let CTRL UP through for chat line history - if( MASK_CONTROL == mask ) + switch(key) { + case KEY_LEFT: + case KEY_RIGHT: + case KEY_UP: + case KEY_DOWN: + case KEY_PAGE_UP: + case KEY_PAGE_DOWN: + case KEY_HOME: + // when chatbar is empty or ArrowKeysAlwaysMove set, + // pass arrow keys on to avatar... + return FALSE; + default: break; } - case KEY_DOWN: - // let CTRL DOWN through for chat line history - if( MASK_CONTROL == mask ) - { - break; - } - case KEY_PAGE_UP: - case KEY_PAGE_DOWN: - case KEY_HOME: - // when chatbar is empty or ArrowKeysMoveAvatar set, pass arrow keys on to avatar... - return FALSE; - default: - break; } } } diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index f98f3a08503..613decad8d3 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -212,7 +212,7 @@ Avatars: width="256" top_pad="0"/> <check_box - control_name="ArrowKeysMoveAvatar" + control_name="ArrowKeysAlwaysMove" follows="left|top" height="20" label="Arrow keys always move me" -- GitLab From 04add8806e49f0e5355666b9b8186d6e0bf78781 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed <nat@lindenlab.com> Date: Thu, 5 Nov 2009 16:53:35 -0500 Subject: [PATCH 191/306] Support QAModeTermCode var for unattended shutdown on LL_ERRS. Normally LL_ERRS in a developer build of the viewer pops up an OS message box with the text of the LL_ERRS log message, requiring user intervention to proceed. This isn't good for unattended testing, especially on Parabuild machines. Running the viewer with '--set QAModeTermCode n' for some 0 < n < 256 will, on LL_ERRS, cause the viewer to terminate immediately with _exit(n). --- indra/newview/app_settings/settings.xml | 13 ++++++++++++- indra/newview/llappviewer.cpp | 16 ++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 7254fff664a..da7caad21e5 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5473,7 +5473,18 @@ <key>QAModeEventHostPort</key> <map> <key>Comment</key> - <string>Enable Testing Features.</string> + <string>Port on which lleventhost should listen</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>-1</integer> + </map> + <key>QAModeTermCode</key> + <map> + <key>Comment</key> + <string>On LL_ERRS, terminate with this code instead of OS message box</string> <key>Persist</key> <integer>0</integer> <key>Type</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 873215169ee..e95eec47412 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -620,7 +620,19 @@ bool LLAppViewer::init() if (!initConfiguration()) return false; - + + // Although initLogging() is the right place to mess with + // setFatalFunction(), we can't query gSavedSettings until after + // initConfiguration(). + S32 rc(gSavedSettings.getS32("QAModeTermCode")); + if (rc >= 0) + { + // QAModeTermCode set, terminate with that rc on LL_ERRS. Use _exit() + // rather than exit() because normal cleanup depends too much on + // successful startup! + LLError::setFatalFunction(boost::bind(_exit, rc)); + } + mAlloc.setProfilingEnabled(gSavedSettings.getBOOL("MemProfiling")); // *NOTE:Mani - LLCurl::initClass is not thread safe. @@ -1665,7 +1677,7 @@ bool LLAppViewer::initLogging() LLError::initForApplication( gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); LLError::setFatalFunction(errorCallback); - + // Remove the last ".old" log file. std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.old"); -- GitLab From 7b33c9b862d478dc488d86593116ef35030321f2 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed <nat@lindenlab.com> Date: Thu, 5 Nov 2009 16:55:31 -0500 Subject: [PATCH 192/306] Produce slightly more info for bad LLDir::setLindenUserDir() call --- indra/llvfs/lldir.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 781321e5e40..c0c6e592d58 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -580,7 +580,7 @@ void LLDir::setLindenUserDir(const std::string &first, const std::string &last) } else { - llerrs << "Invalid name for LLDir::setLindenUserDir" << llendl; + llerrs << "Invalid name for LLDir::setLindenUserDir(first='" << first << "', last='" << last << "')" << llendl; } dumpCurrentDirectories(); -- GitLab From 74f74da3cf43e990bffb186a8e2e9c4104bd07da Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Thu, 5 Nov 2009 14:17:53 -0800 Subject: [PATCH 193/306] Only use ctrl-up/down for recently typed chat lines if chat field is empty. Otherwise it discards a typed line in progress. --- indra/newview/llviewerwindow.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 765f4e4476c..9b3dbcd2f67 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2113,14 +2113,14 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) // arrow keys move avatar while chatting hack if (chat_editor && chat_editor->hasFocus()) { - // let Control-Up and Control-Down through for chat line history - if (!(key == KEY_UP && mask == MASK_CONTROL) - && !(key == KEY_DOWN && mask == MASK_CONTROL)) + // If text field is empty, there's no point in trying to move + // cursor with arrow keys, so allow movement + if (chat_editor->getText().empty() + || gSavedSettings.getBOOL("ArrowKeysAlwaysMove")) { - // If text field is empty, there's no point in trying to move - // cursor with arrow keys, so allow movement - if (chat_editor->getText().empty() - || gSavedSettings.getBOOL("ArrowKeysAlwaysMove")) + // let Control-Up and Control-Down through for chat line history, + if (!(key == KEY_UP && mask == MASK_CONTROL) + && !(key == KEY_DOWN && mask == MASK_CONTROL)) { switch(key) { -- GitLab From 44fc2e5ba3a4aee321f13e0c0486a171725007a9 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Thu, 5 Nov 2009 14:18:16 -0800 Subject: [PATCH 194/306] Restore the media focus ring. This fixes DEV-42166. Media focus is still tracked separately from LLSelectMgr (which was a change made during a refactor a while ago), but LLViewerMediaFocus now keeps LLSelectMgr updated with the current media focus when it changes. Added a special case for media focus to LLSelectMgr::deselectAllIfTooFar(), since it was making the focus ring not show up when media focus was on distant media. --- indra/newview/llselectmgr.cpp | 23 ++++++++--------------- indra/newview/llviewermediafocus.cpp | 7 +++++++ indra/newview/llviewermediafocus.h | 2 ++ 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 26e668adb5a..dd07a3c015f 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -3406,7 +3406,7 @@ void LLSelectMgr::deselectAll() { return; } - + // Zap the angular velocity, as the sim will set it to zero for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); iter != mSelectedObjects->end(); iter++ ) @@ -3496,6 +3496,7 @@ void LLSelectMgr::deselectAllIfTooFar() LLVector3d selectionCenter = getSelectionCenterGlobal(); if (gSavedSettings.getBOOL("LimitSelectDistance") && (!mSelectedObjects->getPrimaryObject() || !mSelectedObjects->getPrimaryObject()->isAvatar()) + && (mSelectedObjects->getPrimaryObject() != LLViewerMediaFocus::getInstance()->getFocusedObject()) && !mSelectedObjects->isAttachment() && !selectionCenter.isExactlyZero()) { @@ -4912,6 +4913,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) { inspect_item_id = inspect_instance->getSelectedUUID(); } + LLUUID focus_item_id = LLViewerMediaFocus::getInstance()->getFocusedObjectID(); for (S32 pass = 0; pass < 2; pass++) { for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); @@ -4925,7 +4927,11 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) { continue; } - if(objectp->getID() == inspect_item_id) + if (objectp->getID() == focus_item_id) + { + node->renderOneSilhouette(gFocusMgr.getFocusColor()); + } + else if(objectp->getID() == inspect_item_id) { node->renderOneSilhouette(sHighlightInspectColor); } @@ -4979,19 +4985,6 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) } } -#if 0 - // Hilight focused media object - { - LLViewerObject* objectp = LLViewerMediaFocus::getInstance()->getFocusedObject(); - if(objectp) - { - // FIXME: how do I construct a silhouette for an object that's not selected? - // Would we need to add another LLObjectSelectionHandle for this purpose? - node->renderOneSilhouette(gFocusMgr.getFocusColor()); - } - } -#endif - if (for_hud && avatar) { glMatrixMode(GL_PROJECTION); diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index 657c58364f6..b2a0fa4b1c7 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -77,6 +77,10 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac { old_media_impl->focus(false); } + + // Always clear the current selection. If we're setting focus on a face, we'll reselect the correct object below. + LLSelectMgr::getInstance()->deselectAll(); + mSelection = NULL; if (media_impl.notNull() && objectp.notNull()) { @@ -87,6 +91,9 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac mFocusedObjectFace = face; mFocusedObjectNormal = pick_normal; + // Set the selection in the selection manager so we can draw the focus ring. + mSelection = LLSelectMgr::getInstance()->selectObjectOnly(objectp, face); + // Focusing on a media face clears its disable flag. media_impl->setDisabled(false); diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h index e5f36d341c4..89ee0ae2831 100644 --- a/indra/newview/llviewermediafocus.h +++ b/indra/newview/llviewermediafocus.h @@ -76,6 +76,7 @@ class LLViewerMediaFocus : LLViewerMediaImpl* getFocusedMediaImpl(); LLViewerObject* getFocusedObject(); S32 getFocusedFace() { return mFocusedObjectFace; } + LLUUID getFocusedObjectID() { return mFocusedObjectID; } // These look up (by uuid) and return the values that were set with setHoverFace. They will return null if the objects have been destroyed. LLViewerMediaImpl* getHoverMediaImpl(); @@ -95,6 +96,7 @@ class LLViewerMediaFocus : private: LLHandle<LLPanelPrimMediaControls> mMediaControls; + LLObjectSelectionHandle mSelection; LLUUID mFocusedObjectID; S32 mFocusedObjectFace; -- GitLab From 680512c9e646be0cbef3f1c471a6792b2ddb638f Mon Sep 17 00:00:00 2001 From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com> Date: Thu, 5 Nov 2009 17:48:58 -0500 Subject: [PATCH 195/306] Removed attributes that were causing parse errors. --- .../skins/default/xui/en/panel_notification.xml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml index 0d34aa0f081..34a185fb44a 100644 --- a/indra/newview/skins/default/xui/en/panel_notification.xml +++ b/indra/newview/skins/default/xui/en/panel_notification.xml @@ -2,9 +2,6 @@ <panel background_opaque="false" border_visible="false" - border = "false" - border_drop_shadow_visible = "false" - drop_shadow_visible = "false" background_visible="true" bg_alpha_color="0.3 0.3 0.3 0" bg_opaque_color="0.3 0.3 0.3 0" @@ -18,12 +15,7 @@ <!-- THIS PANEL CONTROLS TOAST HEIGHT? --> <panel border_visible="false" - drop_shadow="false" bevel_style="none" - border_style="none" - border = "false" - border_drop_shadow_visible = "false" - drop_shadow_visible = "false" background_visible="true" bg_alpha_color="0.3 0.3 0.3 0" bg_opaque_color="0.3 0.3 0.3 0" @@ -67,9 +59,6 @@ v_pad="0" bg_readonly_color="0.0 0.0 0.0 0" border_visible="false" - border = "false" - border_drop_shadow_visible = "false" - drop_shadow_visible = "false" embedded_items="false" enabled="false" follows="left|right|top|bottom" -- GitLab From c1a65fcd9dd60fd966ca92b7a83b21a0d693441f Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Thu, 5 Nov 2009 15:29:01 -0800 Subject: [PATCH 196/306] Don't print every Windlight param file loaded. --- indra/newview/llwlparammanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp index 1581153c199..c6fd35c1422 100644 --- a/indra/newview/llwlparammanager.cpp +++ b/indra/newview/llwlparammanager.cpp @@ -196,7 +196,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate) escaped_filename += ".xml"; std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", escaped_filename)); - llinfos << "Loading WindLight sky setting from " << pathName << llendl; + //llinfos << "Loading WindLight sky setting from " << pathName << llendl; llifstream presetsXML; presetsXML.open(pathName.c_str()); -- GitLab From e096fa3480a04c35cfbd2274b08899b4ea6639f6 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Thu, 5 Nov 2009 15:31:22 -0800 Subject: [PATCH 197/306] EXT-2032 Accordion header title is black (hard to read) and cannot be configured in XUI XML Font and color can be set in accordion_tab.xml --- indra/newview/skins/default/xui/en/widgets/accordion_tab.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml index fcfe89c6530..1924568cc1e 100644 --- a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml +++ b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <accordion_tab + font="SansSerifBold" header_bg_color="DkGray2" - header_txt_color="LtGray" header_collapse_img="Accordion_ArrowClosed_Off" header_collapse_img_pressed="Accordion_ArrowClosed_Press" header_expand_img="Accordion_ArrowOpened_Off" @@ -10,4 +10,5 @@ header_image_over="Accordion_Over" header_image_pressed="Accordion_Press" header_image_selected="Accordion_Selected" + header_text_color="LtGray" /> -- GitLab From 0a7290772a6b39555adb966c7a48ef44151c1f05 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Thu, 5 Nov 2009 15:36:11 -0800 Subject: [PATCH 198/306] moved scroll_column_header default params to scroll_column_header.xml reviewed by James --- indra/llui/llscrolllistcolumn.cpp | 11 +++-------- indra/llui/llscrolllistctrl.cpp | 2 +- .../default/xui/en/widgets/scroll_column_header.xml | 9 +++++++++ 3 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml diff --git a/indra/llui/llscrolllistcolumn.cpp b/indra/llui/llscrolllistcolumn.cpp index ba53f848774..d2813412022 100644 --- a/indra/llui/llscrolllistcolumn.cpp +++ b/indra/llui/llscrolllistcolumn.cpp @@ -44,6 +44,9 @@ const S32 MIN_COLUMN_WIDTH = 20; +// defaults for LLScrollColumnHeader param block pulled from widgets/scroll_column_header.xml +static LLWidgetNameRegistry::StaticRegistrar sRegisterColumnHeaderParams(&typeid(LLScrollColumnHeader::Params), "scroll_column_header"); + //--------------------------------------------------------------------------- // LLScrollColumnHeader //--------------------------------------------------------------------------- @@ -51,15 +54,7 @@ LLScrollColumnHeader::Params::Params() : column("column") { name = "column_header"; - image_unselected.name("square_btn_32x128.tga"); - image_selected.name("square_btn_selected_32x128.tga"); - image_disabled.name("square_btn_32x128.tga"); - image_disabled_selected.name("square_btn_selected_32x128.tga"); - image_overlay.name("combobox_arrow.tga"); - image_overlay_alignment("right"); - font_halign = LLFontGL::LEFT; tab_stop(false); - scale_image(true); } diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index a6cd6412e50..1c2c02e1cc1 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -2624,7 +2624,7 @@ void LLScrollListCtrl::addColumn(const LLScrollListColumn::Params& column_params LLRect temp_rect = LLRect(left,top+mHeadingHeight,right,top); - LLScrollColumnHeader::Params params; + LLScrollColumnHeader::Params params(LLUICtrlFactory::getDefaultParams<LLScrollColumnHeader>()); params.name = "btn_" + name; params.rect = temp_rect; params.column = new_column; diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml b/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml new file mode 100644 index 00000000000..0794b49a0c6 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/scroll_column_header.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<scroll_column_header image_unselected="square_btn_32x128.tga" + image_selected="square_btn_selected_32x128.tga" + image_disabled="square_btn_32x128.tga" + image_disabled_selected="square_btn_selected_32x128.tga" + image_overlay="combobox_arrow.tga" + image_overlay_alignment="right" + halign="left" + scale_image="true"/> -- GitLab From 93e877a5ce9208f37872614a5b4ee2fabc3cbf11 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Thu, 5 Nov 2009 15:36:59 -0800 Subject: [PATCH 199/306] LLSpeakButton now cleans up after itself by removing transientfloatermgr references --- indra/newview/llspeakbutton.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index cd765b0338f..0b9c81dcc13 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -120,6 +120,8 @@ LLSpeakButton::LLSpeakButton(const Params& p) LLSpeakButton::~LLSpeakButton() { + LLTransientFloaterMgr::getInstance()->removeControlView(mSpeakBtn); + LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn); } void LLSpeakButton::setSpeakBtnToggleState(bool state) -- GitLab From 81192236ac44ea500ea6ec6f8de32be11e9165ca Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Thu, 5 Nov 2009 16:08:04 -0800 Subject: [PATCH 200/306] Fix for DEV-39258. When the amount of the texture that's being drawn by the plugin shrinks in either width or height, reallocate the texture (which clears it). --- indra/newview/llviewermedia.cpp | 14 ++++++++++++-- indra/newview/llviewermedia.h | 2 ++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 55e4f28e75f..40bf9fb1fe2 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -658,6 +658,8 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, mMediaAutoScale(media_auto_scale), mMediaLoop(media_loop), mNeedsNewTexture(true), + mTextureUsedWidth(0), + mTextureUsedHeight(0), mSuspendUpdates(false), mVisible(true), mLastSetCursor( UI_CURSOR_ARROW ), @@ -1568,8 +1570,11 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage() if (mNeedsNewTexture || placeholder_image->getUseMipMaps() - || placeholder_image->getWidth() != mMediaSource->getTextureWidth() - || placeholder_image->getHeight() != mMediaSource->getTextureHeight()) + || (placeholder_image->getWidth() != mMediaSource->getTextureWidth()) + || (placeholder_image->getHeight() != mMediaSource->getTextureHeight()) + || (mTextureUsedWidth > mMediaSource->getWidth()) + || (mTextureUsedHeight > mMediaSource->getHeight()) + ) { LL_DEBUGS("Media") << "initializing media placeholder" << LL_ENDL; LL_DEBUGS("Media") << "movie image id " << mTextureId << LL_ENDL; @@ -1601,6 +1606,11 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage() // FIXME // placeholder_image->mIsMediaTexture = true; mNeedsNewTexture = false; + + // If the amount of the texture being drawn by the media goes down in either width or height, + // recreate the texture to avoid leaving parts of the old image behind. + mTextureUsedWidth = mMediaSource->getWidth(); + mTextureUsedHeight = mMediaSource->getHeight(); } return placeholder_image; diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index d6dde0c93e3..4cb08177353 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -306,6 +306,8 @@ class LLViewerMediaImpl bool mMediaAutoScale; bool mMediaLoop; bool mNeedsNewTexture; + S32 mTextureUsedWidth; + S32 mTextureUsedHeight; bool mSuspendUpdates; bool mVisible; ECursorType mLastSetCursor; -- GitLab From 29d8ee76f12e151c0e305933cc7de2daed661430 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Thu, 5 Nov 2009 16:30:11 -0800 Subject: [PATCH 201/306] LLChiclet cleans up its connection to LLTransientFloaterMgr now and panel_stand_stop_flying is visible by default while its contents are not --- indra/newview/llchiclet.cpp | 2 ++ indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 53c4bb32ca7..c200a970588 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -812,6 +812,8 @@ LLChicletPanel::LLChicletPanel(const Params&p) LLChicletPanel::~LLChicletPanel() { + LLTransientFloaterMgr::getInstance()->removeControlView(mLeftScrollButton); + LLTransientFloaterMgr::getInstance()->removeControlView(mRightScrollButton); } diff --git a/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml index c8703aa895a..b48943c6994 100644 --- a/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml +++ b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml @@ -5,7 +5,7 @@ layout="topleft" name="panel_stand_stop_flying" mouse_opaque="false" - visible="false" + visible="true" width="115"> <button follows="left|bottom" -- GitLab From 36f295fb9e3d91b59cc900862087ba4023b975d5 Mon Sep 17 00:00:00 2001 From: Erica <erica@lindenlab.com> Date: Thu, 5 Nov 2009 17:00:20 -0800 Subject: [PATCH 202/306] EXT-2241 layout of Preferences > Sound needs to be improved for I18N, EXT-2276 Advanced water settings floater sliders spaced too tight --- .../skins/default/xui/en/floater_water.xml | 135 ++++++------------ .../xui/en/panel_preferences_sound.xml | 36 ++--- 2 files changed, 65 insertions(+), 106 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml index a6876dcf7d3..b13a11c05d8 100644 --- a/indra/newview/skins/default/xui/en/floater_water.xml +++ b/indra/newview/skins/default/xui/en/floater_water.xml @@ -16,7 +16,7 @@ type="string" length="1" follows="left|top|right" - font="SansSerif" + font.style="BOLD" height="16" layout="topleft" left="10" @@ -28,7 +28,7 @@ <combo_box height="18" layout="topleft" - left_delta="110" + left_pad="10" name="WaterPresetsCombo" top_delta="-2" width="150" /> @@ -40,7 +40,7 @@ left_pad="20" name="WaterNewPreset" top_delta="1" - width="70" /> + width="90" /> <button height="20" label="Save" @@ -49,7 +49,7 @@ left_pad="10" name="WaterSavePreset" top_delta="0" - width="70" /> + width="90" /> <button height="20" label="Delete" @@ -58,8 +58,9 @@ left_pad="10" name="WaterDeletePreset" top_delta="0" - width="70" /> + width="90" /> <tab_container + border="false" follows="left|top" height="180" halign="center" @@ -67,20 +68,20 @@ left="0" name="Water Tabs" tab_position="top" - tab_height="20" top="60" width="700"> <panel border="true" - follows="left|top|right|bottom" + border_color="EmphasisColor" + follows="all" height="180" label="Settings" layout="topleft" - left="1" + left="0" mouse_opaque="false" help_topic="water_settings_tab" name="Settings" - top="60" + top="0" width="698"> <text type="string" @@ -92,11 +93,10 @@ left="10" name="BHText" top="4" - width="355"> + width="200"> Water Fog Color </text> <color_swatch - border_color="0.45098 0.517647 0.607843 1" can_apply_immediately="true" color="0.5 0.5 0.5 1" follows="left|top" @@ -117,7 +117,7 @@ left="10" name="WaterFogDensText" top="74" - width="355"> + width="200"> Fog Density Exponent </text> <slider @@ -142,7 +142,7 @@ left_delta="-14" name="WaterUnderWaterFogModText" top_delta="4" - width="355"> + width="200"> Underwater Fog Modifier </text> <slider @@ -167,83 +167,44 @@ left="245" name="BDensText" top="4" - width="355"> + width="200"> Reflection Wavelet Scale </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left="245" - name="BHText2" - top="21" - width="10"> - 1 - </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="BHText3" - top_delta="11" - width="10"> - 2 - </text> - <text - type="string" - length="1" - follows="left|top|right" - halign="center" - height="16" - layout="topleft" - left_delta="0" - name="BHText4" - top_delta="11" - width="10"> - 3 - </text> <slider control_name="WaterNormalScaleX" decimal_digits="1" follows="left" - height="10" + height="15" initial_value="0.7" + label="1" layout="topleft" - left_pad="4" max_val="10" name="WaterNormalScaleX" - top_delta="-3" + top_pad="20" width="200" /> <slider control_name="WaterNormalScaleY" decimal_digits="1" follows="left" - height="10" + height="15" initial_value="0.7" + label="2" layout="topleft" - left_delta="0" max_val="10" name="WaterNormalScaleY" - top_pad="1" + top_pad="0" width="200" /> <slider control_name="WaterNormalScaleZ" decimal_digits="1" follows="left" - height="10" + height="15" initial_value="0.7" + label="3" layout="topleft" - left_delta="0" max_val="10" name="WaterNormalScaleZ" - top_pad="1" + top_pad="0" width="200" /> <text type="string" @@ -252,10 +213,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" name="HDText" - top_delta="2" - width="355"> + top_pad="-10" + width="200"> Fresnel Scale </text> <slider @@ -266,9 +226,8 @@ increment="0.01" initial_value="0.7" layout="topleft" - left="259" name="WaterFresnelScale" - top="100" + top_pad="20" width="200" /> <text type="string" @@ -277,10 +236,9 @@ font="SansSerif" height="16" layout="topleft" - left_delta="-14" name="FresnelOffsetText" - top_delta="-1" - width="355"> + top_pad="-10" + width="200"> Fresnel Offset </text> <slider @@ -291,9 +249,8 @@ increment="0.01" initial_value="0.7" layout="topleft" - left="259" name="WaterFresnelOffset" - top="135" + top_pad="20" width="200" /> <text type="string" @@ -305,7 +262,7 @@ left="480" name="DensMultText" top="4" - width="355"> + width="200"> Refract Scale Above </text> <slider @@ -330,7 +287,7 @@ left_delta="-14" name="WaterScaleBelowText" top_delta="-3" - width="355"> + width="200"> Refract Scale Below </text> <slider @@ -355,7 +312,7 @@ left_delta="-14" name="MaxAltText" top_delta="-2" - width="355"> + width="200"> Blur Multiplier </text> <slider @@ -373,15 +330,15 @@ </panel> <panel border="true" - follows="left|top|right|bottom" + follows="all" height="180" label="Image" layout="topleft" - left_delta="0" + left="0" mouse_opaque="false" help_topic="water_waves_tab" name="Waves" - top_delta="44" + top="0" width="698"> <text type="string" @@ -392,8 +349,8 @@ layout="topleft" left="10" name="BHText" - top="4" - width="355"> + top="10" + width="200"> Big Wave Direction </text> <text @@ -405,7 +362,7 @@ layout="topleft" left="10" name="WaterWave1DirXText" - top="21" + top_pad="4" width="10"> X </text> @@ -418,7 +375,7 @@ layout="topleft" left_delta="0" name="WaterWave1DirYText" - top_delta="11" + top_delta="18" width="10"> Y </text> @@ -434,7 +391,7 @@ max_val="4" min_val="-4" name="WaterWave1DirX" - top="40" + top="55" width="200" /> <slider control_name="WaterWave1DirY" @@ -448,7 +405,7 @@ max_val="4" min_val="-4" name="WaterWave1DirY" - top_pad="1" + top_pad="5" width="200" /> <text type="string" @@ -472,7 +429,7 @@ layout="topleft" left="10" name="WaterWave2DirXText" - top="71" + top="90" width="10"> X </text> @@ -485,7 +442,7 @@ layout="topleft" left_delta="0" name="WaterWave2DirYText" - top_delta="11" + top_delta="20" width="10"> Y </text> @@ -501,7 +458,7 @@ max_val="4" min_val="-4" name="WaterWave2DirX" - top="90" + top="115" width="200" /> <slider control_name="WaterWave2DirY" @@ -515,7 +472,7 @@ max_val="4" min_val="-4" name="WaterWave2DirY" - top_pad="1" + top_pad="10" width="200" /> <text type="string" @@ -527,7 +484,7 @@ left="240" name="BHText3" top="4" - width="355"> + width="200"> Normal Map </text> <texture_picker diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 78ae9a82240..c3e0cb352bb 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -228,15 +228,18 @@ tab_stop="false" top_delta="-2" width="22" /> - <check_box - height="16" - control_name ="EnableVoiceChat" - disabled_control="CmdLineDisableVoice" - label="Enable Voice" - layout="topleft" - left="22" + <check_box + label_text.halign="left" + follows="right|top" + height="16" + control_name ="EnableVoiceChat" + disabled_control="CmdLineDisableVoice" + label="Voice" + left="50" name="enable_voice_check" - width="100"> + top_pad="5" + width="110" + > </check_box> <slider control_name="AudioLevelVoice" @@ -246,16 +249,15 @@ height="15" increment="0.05" initial_value="0.5" - label="Voice" - label_width="60" + label_width="0" layout="topleft" - left="100" + left="165" + top_delta="0" name="Voice Volume" show_text="false" slider_label.halign="right" - top_pad="-15" volume="true" - width="250"> + width="185"> <slider.commit_callback function="Pref.setControlFalse" parameter="MuteVoice" /> @@ -289,7 +291,7 @@ <icon follows="left" height="18" - image_name="CameraView_Off" + image_name="Cam_FreeCam_Off" name="camera_icon" mouse_opaque="false" visible="true" @@ -316,13 +318,13 @@ height="16" label="Camera position" left_pad="1" - follows="topleft" + follows="topleft" name="0" top_delta="-30" width="200" /> <radio_item height="16" - follows="topleft" + follows="topleft" label="Avatar position" left_delta="0" name="1" @@ -401,7 +403,7 @@ My volume: </text> <slider_bar - control_name="AudioLevelMic" + control_name="AudioLevelMic" follows="left|top" height="17" increment="0.05" -- GitLab From d0bb161daa1d413baee1386caee49d335db9e297 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Thu, 5 Nov 2009 17:10:45 -0800 Subject: [PATCH 203/306] EXT-2030 Accordion header needs to change graphic when selected/expanded New attribute header_image_expanded supplies background image. Reviewed with Leyla (last commit too) --- indra/newview/skins/default/xui/en/widgets/accordion_tab.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml index 1924568cc1e..08c337455c6 100644 --- a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml +++ b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml @@ -9,6 +9,6 @@ header_image="Accordion_Off" header_image_over="Accordion_Over" header_image_pressed="Accordion_Press" - header_image_selected="Accordion_Selected" + header_image_expanded="Accordion_Selected" header_text_color="LtGray" /> -- GitLab From 9affcc4a10152e5621bfe418d11e030b6d838052 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 5 Nov 2009 20:16:44 -0500 Subject: [PATCH 204/306] EXT-2277 : Bottom panel for Inventory view Adds gear menu, add button, trash. --HG-- branch : avatar-pipeline --- indra/newview/llinventorypanel.cpp | 1776 ++++++++--------- indra/newview/llpanelmaininventory.cpp | 182 +- indra/newview/llpanelmaininventory.h | 270 +-- .../default/xui/en/menu_inventory_add.xml | 36 + .../xui/en/menu_inventory_gear_default.xml | 90 + .../default/xui/en/panel_main_inventory.xml | 54 +- 6 files changed, 1388 insertions(+), 1020 deletions(-) create mode 100644 indra/newview/skins/default/xui/en/menu_inventory_add.xml create mode 100644 indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index d1ca0efed35..36d9455fa25 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1,888 +1,888 @@ -/** - * @file llfloaterinventory.cpp - * @brief Implementation of the inventory view and associated stuff. - * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include <utility> // for std::pair<> - -#include "llinventorypanel.h" - -// Seraph TODO: Remove unnecessary headers - -// library includes -#include "llagent.h" -#include "llagentwearables.h" -#include "llcallingcard.h" -#include "llfloaterreg.h" -#include "llsdserialize.h" -#include "llfiltereditor.h" -#include "llspinctrl.h" -#include "llui.h" -#include "message.h" - -// newview includes -#include "llappearancemgr.h" -#include "llappviewer.h" -#include "llfirstuse.h" -#include "llfloaterchat.h" -#include "llfloatercustomize.h" -#include "llfocusmgr.h" -#include "llfolderview.h" -#include "llgesturemgr.h" -#include "lliconctrl.h" -#include "llimview.h" -#include "llinventorybridge.h" -#include "llinventoryclipboard.h" -#include "llinventorymodel.h" -#include "lllineeditor.h" -#include "llmenugl.h" -#include "llpreviewanim.h" -#include "llpreviewgesture.h" -#include "llpreviewnotecard.h" -#include "llpreviewscript.h" -#include "llpreviewsound.h" -#include "llpreviewtexture.h" -#include "llresmgr.h" -#include "llscrollbar.h" -#include "llscrollcontainer.h" -#include "llselectmgr.h" -#include "lltabcontainer.h" -#include "lltooldraganddrop.h" -#include "lluictrlfactory.h" -#include "llviewerinventory.h" -#include "llviewermessage.h" -#include "llviewerobjectlist.h" -#include "llviewerregion.h" -#include "llviewerwindow.h" -#include "llvoavatarself.h" -#include "llwearablelist.h" - -static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel"); - -const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder"); -const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder"); -const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string(""); -static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER; - -LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) : - LLPanel(p), - mInventoryObserver(NULL), - mFolders(NULL), - mScroller(NULL), - mSortOrderSetting(p.sort_order_setting), - mInventory(p.inventory), - mAllowMultiSelect(p.allow_multi_select), - mHasInventoryConnection(false), - mStartFolderString(p.start_folder), - mBuildDefaultHierarchy(true), - mInvFVBridgeBuilder(NULL) -{ - mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER; - - // contex menu callbacks - mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2)); - mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); - mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); - mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2)); - mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2)); - mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this)); - - setBackgroundColor(LLUIColorTable::instance().getColor("InventoryBackgroundColor")); - setBackgroundVisible(TRUE); - setBackgroundOpaque(TRUE); -} - -BOOL LLInventoryPanel::postBuild() -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD); - - mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves - - // create root folder - { - LLRect folder_rect(0, - 0, - getRect().getWidth(), - 0); - LLFolderView::Params p; - p.name = getName(); - p.rect = folder_rect; - p.parent_panel = this; - mFolders = LLUICtrlFactory::create<LLFolderView>(p); - mFolders->setAllowMultiSelect(mAllowMultiSelect); - } - - mCommitCallbackRegistrar.popScope(); - - mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); - - // scroller - { - LLRect scroller_view_rect = getRect(); - scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom); - LLScrollContainer::Params p; - p.name("Inventory Scroller"); - p.rect(scroller_view_rect); - p.follows.flags(FOLLOWS_ALL); - p.reserve_scroll_corner(true); - p.tab_stop(true); - mScroller = LLUICtrlFactory::create<LLScrollContainer>(p); - } - addChild(mScroller); - mScroller->addChild(mFolders); - - mFolders->setScrollContainer(mScroller); - - // set up the callbacks from the inventory we're viewing, and then - // build everything. - mInventoryObserver = new LLInventoryPanelObserver(this); - mInventory->addObserver(mInventoryObserver); - - // determine the root folder, if any, so inventory contents show just the children - // of that folder (i.e. not including the folder itself). - const LLAssetType::EType preferred_type = LLAssetType::lookupHumanReadable(mStartFolderString); - - if ("inventory" == mStartFolderString) - { - mStartFolderID = gInventory.getRootFolderID(); - } - else if ("library" == mStartFolderString) - { - mStartFolderID = gInventory.getLibraryRootFolderID(); - } - else - { - mStartFolderID = (preferred_type != LLAssetType::AT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); - } - - // build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback - if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection) - { - rebuildViewsFor(mStartFolderID); - mHasInventoryConnection = true; - } - - // bit of a hack to make sure the inventory is open. - mFolders->openFolder(preferred_type != LLAssetType::AT_NONE ? LLAssetType::lookupCategoryName(preferred_type) : "My Inventory"); - - if (mSortOrderSetting != INHERIT_SORT_ORDER) - { - setSortOrder(gSavedSettings.getU32(mSortOrderSetting)); - } - else - { - setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER)); - } - mFolders->setSortOrder(mFolders->getFilter()->getSortOrder()); - - return TRUE; -} - -LLInventoryPanel::~LLInventoryPanel() -{ - // should this be a global setting? - if (mFolders) - { - U32 sort_order = mFolders->getSortOrder(); - if (mSortOrderSetting != INHERIT_SORT_ORDER) - { - gSavedSettings.setU32(mSortOrderSetting, sort_order); - } - } - - // LLView destructor will take care of the sub-views. - mInventory->removeObserver(mInventoryObserver); - delete mInventoryObserver; - mScroller = NULL; -} - -LLMemType mt(LLMemType::MTYPE_INVENTORY_FROM_XML); // ! BUG ! Should this be removed? -void LLInventoryPanel::draw() -{ - // select the desired item (in case it wasn't loaded when the selection was requested) - mFolders->updateSelection(); - LLPanel::draw(); -} - -LLInventoryFilter* LLInventoryPanel::getFilter() -{ - if (mFolders) return mFolders->getFilter(); - return NULL; -} - -void LLInventoryPanel::setFilterTypes(U64 filter_types, BOOL filter_for_categories) -{ - mFolders->getFilter()->setFilterTypes(filter_types, filter_for_categories); -} - -void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask) -{ - mFolders->getFilter()->setFilterPermissions(filter_perm_mask); -} - -void LLInventoryPanel::setFilterSubString(const std::string& string) -{ - mFolders->getFilter()->setFilterSubString(string); -} - -void LLInventoryPanel::setSortOrder(U32 order) -{ - mFolders->getFilter()->setSortOrder(order); - if (mFolders->getFilter()->isModified()) - { - mFolders->setSortOrder(order); - // try to keep selection onscreen, even if it wasn't to start with - mFolders->scrollToShowSelection(); - } -} - -void LLInventoryPanel::setSinceLogoff(BOOL sl) -{ - mFolders->getFilter()->setDateRangeLastLogoff(sl); -} - -void LLInventoryPanel::setHoursAgo(U32 hours) -{ - mFolders->getFilter()->setHoursAgo(hours); -} - -void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show) -{ - mFolders->getFilter()->setShowFolderState(show); -} - -LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState() -{ - return mFolders->getFilter()->getShowFolderState(); -} - -static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh"); - -void LLInventoryPanel::modelChanged(U32 mask) -{ - LLFastTimer t2(FTM_REFRESH); - - bool handled = false; - - // inventory just initialized, do complete build - if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection) - { - rebuildViewsFor(mStartFolderID); - mHasInventoryConnection = true; - return; - } - - if(mask & LLInventoryObserver::LABEL) - { - handled = true; - // label change - empty out the display name for each object - // in this change set. - const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); - std::set<LLUUID>::const_iterator id_it = changed_items.begin(); - std::set<LLUUID>::const_iterator id_end = changed_items.end(); - LLFolderViewItem* view = NULL; - LLInvFVBridge* bridge = NULL; - for (;id_it != id_end; ++id_it) - { - view = mFolders->getItemByID(*id_it); - if(view) - { - // request refresh on this item (also flags for filtering) - bridge = (LLInvFVBridge*)view->getListener(); - if(bridge) - { // Clear the display name first, so it gets properly re-built during refresh() - bridge->clearDisplayName(); - } - view->refresh(); - } - } - } - if((mask & (LLInventoryObserver::STRUCTURE - | LLInventoryObserver::ADD - | LLInventoryObserver::REMOVE)) != 0) - { - handled = true; - // Record which folders are open by uuid. - LLInventoryModel* model = getModel(); - if (model) - { - const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); - - std::set<LLUUID>::const_iterator id_it = changed_items.begin(); - std::set<LLUUID>::const_iterator id_end = changed_items.end(); - for (;id_it != id_end; ++id_it) - { - // sync view with model - LLInventoryObject* model_item = model->getObject(*id_it); - LLFolderViewItem* view_item = mFolders->getItemByID(*id_it); - - if (model_item) - { - if (!view_item) - { - // this object was just created, need to build a view for it - if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD) - { - llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl; - } - buildNewViews(*id_it); - - // select any newly created object - // that has the auto rename at top of folder - // root set - if(mFolders->getRoot()->needsAutoRename()) - { - setSelection(*id_it, FALSE); - } - } - else - { - // this object was probably moved, check its parent - if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE) - { - llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << llendl; - } - - LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID()); - - // added check against NULL for cases when Inventory panel contains startFolder. - // in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself. - // this check is a fix for bug EXT-1859. - if (NULL != new_parent && view_item->getParentFolder() != new_parent) - { - view_item->getParentFolder()->extractItem(view_item); - view_item->addToFolder(new_parent, mFolders); - } - } - } - else - { - if (view_item) - { - if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE) - { - llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl; - } - // item in view but not model, need to delete view - view_item->destroyView(); - } - else - { - llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl; - } - } - } - } - } - - if (!handled) - { - // it's a small change that only requires a refresh. - // *TODO: figure out a more efficient way to do the refresh - // since it is expensive on large inventories - mFolders->refresh(); - } -} - - -void LLInventoryPanel::rebuildViewsFor(const LLUUID& id) -{ - LLFolderViewItem* old_view = NULL; - - // get old LLFolderViewItem - old_view = mFolders->getItemByID(id); - if (old_view && id.notNull()) - { - old_view->destroyView(); - } - - buildNewViews(id); -} - -void LLInventoryPanel::buildNewViews(const LLUUID& id) -{ - LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS); - LLFolderViewItem* itemp = NULL; - LLInventoryObject* objectp = NULL; - - // Don't add the start folder (the inventory panel will show contents - // beginning with the children of the starting folder, excluding the starting folder itself). - if (id != mStartFolderID) - { - objectp = gInventory.getObject(id); - if (objectp) - { - const LLUUID &parent_id = objectp->getParentUUID(); - // If this item's parent is the starting folder, then just add it to the top level (recall that - // the starting folder isn't actually represented in the view, parent_folder would be NULL in - // this case otherwise). - LLFolderViewFolder* parent_folder = (parent_id == mStartFolderID ? - mFolders : (LLFolderViewFolder*)mFolders->getItemByID(parent_id)); - - // This item exists outside the inventory's hierarchy, so don't add it. - if (!parent_folder) - { - return; - } - - if (objectp->getType() <= LLAssetType::AT_NONE || - objectp->getType() >= LLAssetType::AT_COUNT) - { - llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << - ((S32) objectp->getType()) << llendl; - return; - } - - if (objectp->getType() == LLAssetType::AT_CATEGORY && - objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) - { - LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(), - objectp->getType(), - LLInventoryType::IT_CATEGORY, - this, - objectp->getUUID()); - - if (new_listener) - { - LLFolderViewFolder::Params p; - p.name = new_listener->getDisplayName(); - p.icon = new_listener->getIcon(); - p.root = mFolders; - p.listener = new_listener; - LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p); - - folderp->setItemSortOrder(mFolders->getSortOrder()); - itemp = folderp; - } - } - else - { - // Build new view for item - LLInventoryItem* item = (LLInventoryItem*)objectp; - LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(), - item->getActualType(), - item->getInventoryType(), - this, - item->getUUID(), - item->getFlags()); - - if (new_listener) - { - LLFolderViewItem::Params params; - params.name(new_listener->getDisplayName()); - params.icon(new_listener->getIcon()); - params.creation_date(new_listener->getCreationDate()); - params.root(mFolders); - params.listener(new_listener); - params.rect(LLRect (0, 0, 0, 0)); - itemp = LLUICtrlFactory::create<LLFolderViewItem> (params); - } - } - - if (itemp) - { - itemp->addToFolder(parent_folder, mFolders); - } - } - } - - // If this is a folder, add the children of the folder and recursively add any - // child folders. - if ((id == mStartFolderID) || - (objectp && objectp->getType() == LLAssetType::AT_CATEGORY)) - { - LLViewerInventoryCategory::cat_array_t* categories; - LLViewerInventoryItem::item_array_t* items; - - mInventory->lockDirectDescendentArrays(id, categories, items); - if(categories) - { - S32 count = categories->count(); - for(S32 i = 0; i < count; ++i) - { - LLInventoryCategory* cat = categories->get(i); - buildNewViews(cat->getUUID()); - } - } - if(items) - { - S32 count = items->count(); - for(S32 i = 0; i < count; ++i) - { - LLInventoryItem* item = items->get(i); - buildNewViews(item->getUUID()); - } - } - mInventory->unlockDirectDescendentArrays(id); - } -} - -struct LLConfirmPurgeData -{ - LLUUID mID; - LLInventoryModel* mModel; -}; - -class LLIsNotWorn : public LLInventoryCollectFunctor -{ -public: - LLIsNotWorn() {} - virtual ~LLIsNotWorn() {} - virtual bool operator()(LLInventoryCategory* cat, - LLInventoryItem* item) - { - return !gAgentWearables.isWearingItem(item->getUUID()); - } -}; - -class LLOpenFolderByID : public LLFolderViewFunctor -{ -public: - LLOpenFolderByID(const LLUUID& id) : mID(id) {} - virtual ~LLOpenFolderByID() {} - virtual void doFolder(LLFolderViewFolder* folder) - { - if (folder->getListener() && folder->getListener()->getUUID() == mID) folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); - } - virtual void doItem(LLFolderViewItem* item) {} -protected: - const LLUUID& mID; -}; - - -void LLInventoryPanel::openSelected() -{ - LLFolderViewItem* folder_item = mFolders->getCurSelectedItem(); - if(!folder_item) return; - LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener(); - if(!bridge) return; - bridge->openItem(); -} - -BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask) -{ - BOOL handled = LLView::handleHover(x, y, mask); - if(handled) - { - ECursorType cursor = getWindow()->getCursor(); - if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW) - { - // replace arrow cursor with arrow and hourglass cursor - getWindow()->setCursor(UI_CURSOR_WORKING); - } - } - else - { - getWindow()->setCursor(UI_CURSOR_ARROW); - } - return TRUE; -} - -BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg) -{ - - BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); - - if (handled) - { - mFolders->setDragAndDropThisFrame(); - } - - return handled; -} - -void LLInventoryPanel::onFocusLost() -{ - // inventory no longer handles cut/copy/paste/delete - if (LLEditMenuHandler::gEditMenuHandler == mFolders) - { - LLEditMenuHandler::gEditMenuHandler = NULL; - } - - LLPanel::onFocusLost(); -} - -void LLInventoryPanel::onFocusReceived() -{ - // inventory now handles cut/copy/paste/delete - LLEditMenuHandler::gEditMenuHandler = mFolders; - - LLPanel::onFocusReceived(); -} - - -void LLInventoryPanel::openAllFolders() -{ - mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); - mFolders->arrangeAll(); -} - -void LLInventoryPanel::openDefaultFolderForType(LLAssetType::EType type) -{ - LLUUID category_id = mInventory->findCategoryUUIDForType(type); - LLOpenFolderByID opener(category_id); - mFolders->applyFunctorRecursively(opener); -} - -void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus) -{ - // Don't select objects in COF (e.g. to prevent refocus when items are worn). - const LLInventoryObject *obj = gInventory.getObject(obj_id); - if (obj && obj->getParentUUID() == LLAppearanceManager::getCOF()) - { - return; - } - mFolders->setSelectionByID(obj_id, take_keyboard_focus); -} - -void LLInventoryPanel::clearSelection() -{ - mFolders->clearSelection(); -} - -void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action) -{ - LLFolderView* fv = getRootFolder(); - if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename - { - fv->setNeedsAutoRename(FALSE); - if (items.size()) // new asset is visible and selected - { - fv->startRenamingSelectedItem(); - } - } - // Seraph - Put determineFolderType in here for ensemble typing? -} - -//---------------------------------------------------------------------------- - -void LLInventoryPanel::doToSelected(const LLSD& userdata) -{ - mFolders->doToSelected(&gInventory, userdata); -} - -void LLInventoryPanel::doCreate(const LLSD& userdata) -{ - menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata); -} - -bool LLInventoryPanel::beginIMSession() -{ - std::set<LLUUID> selected_items; - mFolders->getSelectionList(selected_items); - - std::string name; - static int session_num = 1; - - LLDynamicArray<LLUUID> members; - EInstantMessage type = IM_SESSION_CONFERENCE_START; - - std::set<LLUUID>::const_iterator iter; - for (iter = selected_items.begin(); iter != selected_items.end(); iter++) - { - - LLUUID item = *iter; - LLFolderViewItem* folder_item = mFolders->getItemByID(item); - - if(folder_item) - { - LLFolderViewEventListener* fve_listener = folder_item->getListener(); - if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY)) - { - - LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener(); - if(!bridge) return true; - LLViewerInventoryCategory* cat = bridge->getCategory(); - if(!cat) return true; - name = cat->getName(); - LLUniqueBuddyCollector is_buddy; - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - gInventory.collectDescendentsIf(bridge->getUUID(), - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_buddy); - S32 count = item_array.count(); - if(count > 0) - { - LLFloaterReg::showInstance("communicate"); - // create the session - LLAvatarTracker& at = LLAvatarTracker::instance(); - LLUUID id; - for(S32 i = 0; i < count; ++i) - { - id = item_array.get(i)->getCreatorUUID(); - if(at.isBuddyOnline(id)) - { - members.put(id); - } - } - } - } - else - { - LLFolderViewItem* folder_item = mFolders->getItemByID(item); - if(!folder_item) return true; - LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener(); - - if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD) - { - LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID()); - - if (inv_item) - { - LLAvatarTracker& at = LLAvatarTracker::instance(); - LLUUID id = inv_item->getCreatorUUID(); - - if(at.isBuddyOnline(id)) - { - members.put(id); - } - } - } //if IT_CALLINGCARD - } //if !IT_CATEGORY - } - } //for selected_items - - // the session_id is randomly generated UUID which will be replaced later - // with a server side generated number - - if (name.empty()) - { - name = llformat("Session %d", session_num++); - } - - gIMMgr->addSession(name, type, members[0], members); - - return true; -} - -bool LLInventoryPanel::attachObject(const LLSD& userdata) -{ - std::set<LLUUID> selected_items; - mFolders->getSelectionList(selected_items); - - std::string joint_name = userdata.asString(); - LLVOAvatar *avatarp = static_cast<LLVOAvatar*>(gAgent.getAvatarObject()); - LLViewerJointAttachment* attachmentp = NULL; - for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); - iter != avatarp->mAttachmentPoints.end(); ) - { - LLVOAvatar::attachment_map_t::iterator curiter = iter++; - LLViewerJointAttachment* attachment = curiter->second; - if (attachment->getName() == joint_name) - { - attachmentp = attachment; - break; - } - } - if (attachmentp == NULL) - { - return true; - } - - for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin(); - set_iter != selected_items.end(); - ++set_iter) - { - const LLUUID &id = *set_iter; - LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id); - if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID())) - { - rez_attachment(item, attachmentp); - } - else if(item && item->isComplete()) - { - // must be in library. copy it to our inventory and put it on. - LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp); - copy_inventory_item(gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - LLUUID::null, - std::string(), - cb); - } - } - gFocusMgr.setKeyboardFocus(NULL); - - return true; -} - - -//---------------------------------------------------------------------------- - -// static DEBUG ONLY: -void LLInventoryPanel::dumpSelectionInformation(void* user_data) -{ - LLInventoryPanel* iv = (LLInventoryPanel*)user_data; - iv->mFolders->dumpSelectionInformation(); -} - -BOOL LLInventoryPanel::getSinceLogoff() -{ - return mFolders->getFilter()->isSinceLogoff(); -} - -void example_param_block_usage() -{ - LLInventoryPanel::Params param_block; - param_block.name(std::string("inventory")); - - param_block.sort_order_setting(LLInventoryPanel::RECENTITEMS_SORT_ORDER); - param_block.allow_multi_select(true); - param_block.filter(LLInventoryPanel::Filter() - .sort_order(1) - .types(0xffff0000)); - param_block.inventory(&gInventory); - param_block.has_border(true); - - LLUICtrlFactory::create<LLInventoryPanel>(param_block); - - param_block = LLInventoryPanel::Params(); - param_block.name(std::string("inventory")); - - //LLSD param_block_sd; - //param_block_sd["sort_order_setting"] = LLInventoryPanel::RECENTITEMS_SORT_ORDER; - //param_block_sd["allow_multi_select"] = true; - //param_block_sd["filter"]["sort_order"] = 1; - //param_block_sd["filter"]["types"] = (S32)0xffff0000; - //param_block_sd["has_border"] = true; - - //LLInitParam::LLSDParser(param_block_sd).parse(param_block); - - LLUICtrlFactory::create<LLInventoryPanel>(param_block); -} +/* + * @file llinventorypanel.cpp + * @brief Implementation of the inventory panel and associated stuff. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include <utility> // for std::pair<> + +#include "llinventorypanel.h" + +// Seraph TODO: Remove unnecessary headers + +// library includes +#include "llagent.h" +#include "llagentwearables.h" +#include "llcallingcard.h" +#include "llfloaterreg.h" +#include "llsdserialize.h" +#include "llfiltereditor.h" +#include "llspinctrl.h" +#include "llui.h" +#include "message.h" + +// newview includes +#include "llappearancemgr.h" +#include "llappviewer.h" +#include "llfirstuse.h" +#include "llfloaterchat.h" +#include "llfloatercustomize.h" +#include "llfocusmgr.h" +#include "llfolderview.h" +#include "llgesturemgr.h" +#include "lliconctrl.h" +#include "llimview.h" +#include "llinventorybridge.h" +#include "llinventoryclipboard.h" +#include "llinventorymodel.h" +#include "lllineeditor.h" +#include "llmenugl.h" +#include "llpreviewanim.h" +#include "llpreviewgesture.h" +#include "llpreviewnotecard.h" +#include "llpreviewscript.h" +#include "llpreviewsound.h" +#include "llpreviewtexture.h" +#include "llresmgr.h" +#include "llscrollbar.h" +#include "llscrollcontainer.h" +#include "llselectmgr.h" +#include "lltabcontainer.h" +#include "lltooldraganddrop.h" +#include "lluictrlfactory.h" +#include "llviewerinventory.h" +#include "llviewermessage.h" +#include "llviewerobjectlist.h" +#include "llviewerregion.h" +#include "llviewerwindow.h" +#include "llvoavatarself.h" +#include "llwearablelist.h" + +static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel"); + +const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder"); +const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder"); +const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string(""); +static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER; + +LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) : + LLPanel(p), + mInventoryObserver(NULL), + mFolders(NULL), + mScroller(NULL), + mSortOrderSetting(p.sort_order_setting), + mInventory(p.inventory), + mAllowMultiSelect(p.allow_multi_select), + mHasInventoryConnection(false), + mStartFolderString(p.start_folder), + mBuildDefaultHierarchy(true), + mInvFVBridgeBuilder(NULL) +{ + mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER; + + // contex menu callbacks + mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2)); + mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); + mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); + mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2)); + mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2)); + mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this)); + + setBackgroundColor(LLUIColorTable::instance().getColor("InventoryBackgroundColor")); + setBackgroundVisible(TRUE); + setBackgroundOpaque(TRUE); +} + +BOOL LLInventoryPanel::postBuild() +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD); + + mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves + + // create root folder + { + LLRect folder_rect(0, + 0, + getRect().getWidth(), + 0); + LLFolderView::Params p; + p.name = getName(); + p.rect = folder_rect; + p.parent_panel = this; + mFolders = LLUICtrlFactory::create<LLFolderView>(p); + mFolders->setAllowMultiSelect(mAllowMultiSelect); + } + + mCommitCallbackRegistrar.popScope(); + + mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar); + + // scroller + { + LLRect scroller_view_rect = getRect(); + scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom); + LLScrollContainer::Params p; + p.name("Inventory Scroller"); + p.rect(scroller_view_rect); + p.follows.flags(FOLLOWS_ALL); + p.reserve_scroll_corner(true); + p.tab_stop(true); + mScroller = LLUICtrlFactory::create<LLScrollContainer>(p); + } + addChild(mScroller); + mScroller->addChild(mFolders); + + mFolders->setScrollContainer(mScroller); + + // set up the callbacks from the inventory we're viewing, and then + // build everything. + mInventoryObserver = new LLInventoryPanelObserver(this); + mInventory->addObserver(mInventoryObserver); + + // determine the root folder, if any, so inventory contents show just the children + // of that folder (i.e. not including the folder itself). + const LLAssetType::EType preferred_type = LLAssetType::lookupHumanReadable(mStartFolderString); + + if ("inventory" == mStartFolderString) + { + mStartFolderID = gInventory.getRootFolderID(); + } + else if ("library" == mStartFolderString) + { + mStartFolderID = gInventory.getLibraryRootFolderID(); + } + else + { + mStartFolderID = (preferred_type != LLAssetType::AT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); + } + + // build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback + if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection) + { + rebuildViewsFor(mStartFolderID); + mHasInventoryConnection = true; + } + + // bit of a hack to make sure the inventory is open. + mFolders->openFolder(preferred_type != LLAssetType::AT_NONE ? LLAssetType::lookupCategoryName(preferred_type) : "My Inventory"); + + if (mSortOrderSetting != INHERIT_SORT_ORDER) + { + setSortOrder(gSavedSettings.getU32(mSortOrderSetting)); + } + else + { + setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER)); + } + mFolders->setSortOrder(mFolders->getFilter()->getSortOrder()); + + return TRUE; +} + +LLInventoryPanel::~LLInventoryPanel() +{ + // should this be a global setting? + if (mFolders) + { + U32 sort_order = mFolders->getSortOrder(); + if (mSortOrderSetting != INHERIT_SORT_ORDER) + { + gSavedSettings.setU32(mSortOrderSetting, sort_order); + } + } + + // LLView destructor will take care of the sub-views. + mInventory->removeObserver(mInventoryObserver); + delete mInventoryObserver; + mScroller = NULL; +} + +LLMemType mt(LLMemType::MTYPE_INVENTORY_FROM_XML); // ! BUG ! Should this be removed? +void LLInventoryPanel::draw() +{ + // select the desired item (in case it wasn't loaded when the selection was requested) + mFolders->updateSelection(); + LLPanel::draw(); +} + +LLInventoryFilter* LLInventoryPanel::getFilter() +{ + if (mFolders) return mFolders->getFilter(); + return NULL; +} + +void LLInventoryPanel::setFilterTypes(U64 filter_types, BOOL filter_for_categories) +{ + mFolders->getFilter()->setFilterTypes(filter_types, filter_for_categories); +} + +void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask) +{ + mFolders->getFilter()->setFilterPermissions(filter_perm_mask); +} + +void LLInventoryPanel::setFilterSubString(const std::string& string) +{ + mFolders->getFilter()->setFilterSubString(string); +} + +void LLInventoryPanel::setSortOrder(U32 order) +{ + mFolders->getFilter()->setSortOrder(order); + if (mFolders->getFilter()->isModified()) + { + mFolders->setSortOrder(order); + // try to keep selection onscreen, even if it wasn't to start with + mFolders->scrollToShowSelection(); + } +} + +void LLInventoryPanel::setSinceLogoff(BOOL sl) +{ + mFolders->getFilter()->setDateRangeLastLogoff(sl); +} + +void LLInventoryPanel::setHoursAgo(U32 hours) +{ + mFolders->getFilter()->setHoursAgo(hours); +} + +void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show) +{ + mFolders->getFilter()->setShowFolderState(show); +} + +LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState() +{ + return mFolders->getFilter()->getShowFolderState(); +} + +static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh"); + +void LLInventoryPanel::modelChanged(U32 mask) +{ + LLFastTimer t2(FTM_REFRESH); + + bool handled = false; + + // inventory just initialized, do complete build + if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection) + { + rebuildViewsFor(mStartFolderID); + mHasInventoryConnection = true; + return; + } + + if(mask & LLInventoryObserver::LABEL) + { + handled = true; + // label change - empty out the display name for each object + // in this change set. + const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); + std::set<LLUUID>::const_iterator id_it = changed_items.begin(); + std::set<LLUUID>::const_iterator id_end = changed_items.end(); + LLFolderViewItem* view = NULL; + LLInvFVBridge* bridge = NULL; + for (;id_it != id_end; ++id_it) + { + view = mFolders->getItemByID(*id_it); + if(view) + { + // request refresh on this item (also flags for filtering) + bridge = (LLInvFVBridge*)view->getListener(); + if(bridge) + { // Clear the display name first, so it gets properly re-built during refresh() + bridge->clearDisplayName(); + } + view->refresh(); + } + } + } + if((mask & (LLInventoryObserver::STRUCTURE + | LLInventoryObserver::ADD + | LLInventoryObserver::REMOVE)) != 0) + { + handled = true; + // Record which folders are open by uuid. + LLInventoryModel* model = getModel(); + if (model) + { + const std::set<LLUUID>& changed_items = gInventory.getChangedIDs(); + + std::set<LLUUID>::const_iterator id_it = changed_items.begin(); + std::set<LLUUID>::const_iterator id_end = changed_items.end(); + for (;id_it != id_end; ++id_it) + { + // sync view with model + LLInventoryObject* model_item = model->getObject(*id_it); + LLFolderViewItem* view_item = mFolders->getItemByID(*id_it); + + if (model_item) + { + if (!view_item) + { + // this object was just created, need to build a view for it + if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD) + { + llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl; + } + buildNewViews(*id_it); + + // select any newly created object + // that has the auto rename at top of folder + // root set + if(mFolders->getRoot()->needsAutoRename()) + { + setSelection(*id_it, FALSE); + } + } + else + { + // this object was probably moved, check its parent + if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE) + { + llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << llendl; + } + + LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID()); + + // added check against NULL for cases when Inventory panel contains startFolder. + // in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself. + // this check is a fix for bug EXT-1859. + if (NULL != new_parent && view_item->getParentFolder() != new_parent) + { + view_item->getParentFolder()->extractItem(view_item); + view_item->addToFolder(new_parent, mFolders); + } + } + } + else + { + if (view_item) + { + if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE) + { + llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl; + } + // item in view but not model, need to delete view + view_item->destroyView(); + } + else + { + llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl; + } + } + } + } + } + + if (!handled) + { + // it's a small change that only requires a refresh. + // *TODO: figure out a more efficient way to do the refresh + // since it is expensive on large inventories + mFolders->refresh(); + } +} + + +void LLInventoryPanel::rebuildViewsFor(const LLUUID& id) +{ + LLFolderViewItem* old_view = NULL; + + // get old LLFolderViewItem + old_view = mFolders->getItemByID(id); + if (old_view && id.notNull()) + { + old_view->destroyView(); + } + + buildNewViews(id); +} + +void LLInventoryPanel::buildNewViews(const LLUUID& id) +{ + LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS); + LLFolderViewItem* itemp = NULL; + LLInventoryObject* objectp = NULL; + + // Don't add the start folder (the inventory panel will show contents + // beginning with the children of the starting folder, excluding the starting folder itself). + if (id != mStartFolderID) + { + objectp = gInventory.getObject(id); + if (objectp) + { + const LLUUID &parent_id = objectp->getParentUUID(); + // If this item's parent is the starting folder, then just add it to the top level (recall that + // the starting folder isn't actually represented in the view, parent_folder would be NULL in + // this case otherwise). + LLFolderViewFolder* parent_folder = (parent_id == mStartFolderID ? + mFolders : (LLFolderViewFolder*)mFolders->getItemByID(parent_id)); + + // This item exists outside the inventory's hierarchy, so don't add it. + if (!parent_folder) + { + return; + } + + if (objectp->getType() <= LLAssetType::AT_NONE || + objectp->getType() >= LLAssetType::AT_COUNT) + { + llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << + ((S32) objectp->getType()) << llendl; + return; + } + + if (objectp->getType() == LLAssetType::AT_CATEGORY && + objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) + { + LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(), + objectp->getType(), + LLInventoryType::IT_CATEGORY, + this, + objectp->getUUID()); + + if (new_listener) + { + LLFolderViewFolder::Params p; + p.name = new_listener->getDisplayName(); + p.icon = new_listener->getIcon(); + p.root = mFolders; + p.listener = new_listener; + LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p); + + folderp->setItemSortOrder(mFolders->getSortOrder()); + itemp = folderp; + } + } + else + { + // Build new view for item + LLInventoryItem* item = (LLInventoryItem*)objectp; + LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(), + item->getActualType(), + item->getInventoryType(), + this, + item->getUUID(), + item->getFlags()); + + if (new_listener) + { + LLFolderViewItem::Params params; + params.name(new_listener->getDisplayName()); + params.icon(new_listener->getIcon()); + params.creation_date(new_listener->getCreationDate()); + params.root(mFolders); + params.listener(new_listener); + params.rect(LLRect (0, 0, 0, 0)); + itemp = LLUICtrlFactory::create<LLFolderViewItem> (params); + } + } + + if (itemp) + { + itemp->addToFolder(parent_folder, mFolders); + } + } + } + + // If this is a folder, add the children of the folder and recursively add any + // child folders. + if ((id == mStartFolderID) || + (objectp && objectp->getType() == LLAssetType::AT_CATEGORY)) + { + LLViewerInventoryCategory::cat_array_t* categories; + LLViewerInventoryItem::item_array_t* items; + + mInventory->lockDirectDescendentArrays(id, categories, items); + if(categories) + { + S32 count = categories->count(); + for(S32 i = 0; i < count; ++i) + { + LLInventoryCategory* cat = categories->get(i); + buildNewViews(cat->getUUID()); + } + } + if(items) + { + S32 count = items->count(); + for(S32 i = 0; i < count; ++i) + { + LLInventoryItem* item = items->get(i); + buildNewViews(item->getUUID()); + } + } + mInventory->unlockDirectDescendentArrays(id); + } +} + +struct LLConfirmPurgeData +{ + LLUUID mID; + LLInventoryModel* mModel; +}; + +class LLIsNotWorn : public LLInventoryCollectFunctor +{ +public: + LLIsNotWorn() {} + virtual ~LLIsNotWorn() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item) + { + return !gAgentWearables.isWearingItem(item->getUUID()); + } +}; + +class LLOpenFolderByID : public LLFolderViewFunctor +{ +public: + LLOpenFolderByID(const LLUUID& id) : mID(id) {} + virtual ~LLOpenFolderByID() {} + virtual void doFolder(LLFolderViewFolder* folder) + { + if (folder->getListener() && folder->getListener()->getUUID() == mID) folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); + } + virtual void doItem(LLFolderViewItem* item) {} +protected: + const LLUUID& mID; +}; + + +void LLInventoryPanel::openSelected() +{ + LLFolderViewItem* folder_item = mFolders->getCurSelectedItem(); + if(!folder_item) return; + LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener(); + if(!bridge) return; + bridge->openItem(); +} + +BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask) +{ + BOOL handled = LLView::handleHover(x, y, mask); + if(handled) + { + ECursorType cursor = getWindow()->getCursor(); + if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW) + { + // replace arrow cursor with arrow and hourglass cursor + getWindow()->setCursor(UI_CURSOR_WORKING); + } + } + else + { + getWindow()->setCursor(UI_CURSOR_ARROW); + } + return TRUE; +} + +BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg) +{ + + BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); + + if (handled) + { + mFolders->setDragAndDropThisFrame(); + } + + return handled; +} + +void LLInventoryPanel::onFocusLost() +{ + // inventory no longer handles cut/copy/paste/delete + if (LLEditMenuHandler::gEditMenuHandler == mFolders) + { + LLEditMenuHandler::gEditMenuHandler = NULL; + } + + LLPanel::onFocusLost(); +} + +void LLInventoryPanel::onFocusReceived() +{ + // inventory now handles cut/copy/paste/delete + LLEditMenuHandler::gEditMenuHandler = mFolders; + + LLPanel::onFocusReceived(); +} + + +void LLInventoryPanel::openAllFolders() +{ + mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); + mFolders->arrangeAll(); +} + +void LLInventoryPanel::openDefaultFolderForType(LLAssetType::EType type) +{ + LLUUID category_id = mInventory->findCategoryUUIDForType(type); + LLOpenFolderByID opener(category_id); + mFolders->applyFunctorRecursively(opener); +} + +void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus) +{ + // Don't select objects in COF (e.g. to prevent refocus when items are worn). + const LLInventoryObject *obj = gInventory.getObject(obj_id); + if (obj && obj->getParentUUID() == LLAppearanceManager::getCOF()) + { + return; + } + mFolders->setSelectionByID(obj_id, take_keyboard_focus); +} + +void LLInventoryPanel::clearSelection() +{ + mFolders->clearSelection(); +} + +void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action) +{ + LLFolderView* fv = getRootFolder(); + if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename + { + fv->setNeedsAutoRename(FALSE); + if (items.size()) // new asset is visible and selected + { + fv->startRenamingSelectedItem(); + } + } + // Seraph - Put determineFolderType in here for ensemble typing? +} + +//---------------------------------------------------------------------------- + +void LLInventoryPanel::doToSelected(const LLSD& userdata) +{ + mFolders->doToSelected(&gInventory, userdata); +} + +void LLInventoryPanel::doCreate(const LLSD& userdata) +{ + menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata); +} + +bool LLInventoryPanel::beginIMSession() +{ + std::set<LLUUID> selected_items; + mFolders->getSelectionList(selected_items); + + std::string name; + static int session_num = 1; + + LLDynamicArray<LLUUID> members; + EInstantMessage type = IM_SESSION_CONFERENCE_START; + + std::set<LLUUID>::const_iterator iter; + for (iter = selected_items.begin(); iter != selected_items.end(); iter++) + { + + LLUUID item = *iter; + LLFolderViewItem* folder_item = mFolders->getItemByID(item); + + if(folder_item) + { + LLFolderViewEventListener* fve_listener = folder_item->getListener(); + if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY)) + { + + LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener(); + if(!bridge) return true; + LLViewerInventoryCategory* cat = bridge->getCategory(); + if(!cat) return true; + name = cat->getName(); + LLUniqueBuddyCollector is_buddy; + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + gInventory.collectDescendentsIf(bridge->getUUID(), + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_buddy); + S32 count = item_array.count(); + if(count > 0) + { + LLFloaterReg::showInstance("communicate"); + // create the session + LLAvatarTracker& at = LLAvatarTracker::instance(); + LLUUID id; + for(S32 i = 0; i < count; ++i) + { + id = item_array.get(i)->getCreatorUUID(); + if(at.isBuddyOnline(id)) + { + members.put(id); + } + } + } + } + else + { + LLFolderViewItem* folder_item = mFolders->getItemByID(item); + if(!folder_item) return true; + LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener(); + + if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD) + { + LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID()); + + if (inv_item) + { + LLAvatarTracker& at = LLAvatarTracker::instance(); + LLUUID id = inv_item->getCreatorUUID(); + + if(at.isBuddyOnline(id)) + { + members.put(id); + } + } + } //if IT_CALLINGCARD + } //if !IT_CATEGORY + } + } //for selected_items + + // the session_id is randomly generated UUID which will be replaced later + // with a server side generated number + + if (name.empty()) + { + name = llformat("Session %d", session_num++); + } + + gIMMgr->addSession(name, type, members[0], members); + + return true; +} + +bool LLInventoryPanel::attachObject(const LLSD& userdata) +{ + std::set<LLUUID> selected_items; + mFolders->getSelectionList(selected_items); + + std::string joint_name = userdata.asString(); + LLVOAvatar *avatarp = static_cast<LLVOAvatar*>(gAgent.getAvatarObject()); + LLViewerJointAttachment* attachmentp = NULL; + for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); + iter != avatarp->mAttachmentPoints.end(); ) + { + LLVOAvatar::attachment_map_t::iterator curiter = iter++; + LLViewerJointAttachment* attachment = curiter->second; + if (attachment->getName() == joint_name) + { + attachmentp = attachment; + break; + } + } + if (attachmentp == NULL) + { + return true; + } + + for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin(); + set_iter != selected_items.end(); + ++set_iter) + { + const LLUUID &id = *set_iter; + LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id); + if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID())) + { + rez_attachment(item, attachmentp); + } + else if(item && item->isComplete()) + { + // must be in library. copy it to our inventory and put it on. + LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp); + copy_inventory_item(gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + LLUUID::null, + std::string(), + cb); + } + } + gFocusMgr.setKeyboardFocus(NULL); + + return true; +} + + +//---------------------------------------------------------------------------- + +// static DEBUG ONLY: +void LLInventoryPanel::dumpSelectionInformation(void* user_data) +{ + LLInventoryPanel* iv = (LLInventoryPanel*)user_data; + iv->mFolders->dumpSelectionInformation(); +} + +BOOL LLInventoryPanel::getSinceLogoff() +{ + return mFolders->getFilter()->isSinceLogoff(); +} + +void example_param_block_usage() +{ + LLInventoryPanel::Params param_block; + param_block.name(std::string("inventory")); + + param_block.sort_order_setting(LLInventoryPanel::RECENTITEMS_SORT_ORDER); + param_block.allow_multi_select(true); + param_block.filter(LLInventoryPanel::Filter() + .sort_order(1) + .types(0xffff0000)); + param_block.inventory(&gInventory); + param_block.has_border(true); + + LLUICtrlFactory::create<LLInventoryPanel>(param_block); + + param_block = LLInventoryPanel::Params(); + param_block.name(std::string("inventory")); + + //LLSD param_block_sd; + //param_block_sd["sort_order_setting"] = LLInventoryPanel::RECENTITEMS_SORT_ORDER; + //param_block_sd["allow_multi_select"] = true; + //param_block_sd["filter"]["sort_order"] = 1; + //param_block_sd["filter"]["types"] = (S32)0xffff0000; + //param_block_sd["has_border"] = true; + + //LLInitParam::LLSDParser(param_block_sd).parse(param_block); + + LLUICtrlFactory::create<LLInventoryPanel>(param_block); +} diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 876151479fd..9f0eed2cbe8 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -33,6 +33,7 @@ #include "llviewerprecompiledheaders.h" #include "llpanelmaininventory.h" +#include "lldndbutton.h" #include "llfloaterinventory.h" #include "llinventorybridge.h" #include "llinventoryfunctions.h" @@ -43,6 +44,7 @@ #include "llsdserialize.h" #include "llspinctrl.h" #include "lltooldraganddrop.h" +#include "llviewermenu.h" static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); // Seraph is this redundant with constructor? @@ -78,7 +80,12 @@ class LLFloaterInventoryFinder : public LLFloater ///---------------------------------------------------------------------------- LLPanelMainInventory::LLPanelMainInventory() - : LLPanel() + : LLPanel(), + mActivePanel(NULL), + mSavedFolderState(NULL), + mFilterText(""), + mMenuGearDefault(NULL), + mMenuAdd(NULL) { LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT); // Menu Callbacks (non contex menus) @@ -125,8 +132,7 @@ BOOL LLPanelMainInventory::postBuild() mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder")); mActivePanel->getFilter()->markDefault(); mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); - mActivePanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mActivePanel, _1, _2)); - mActivePanel->getRootFolder()->openFolder("My Inventory"); + mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2)); } LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items"); if (recent_items_panel) @@ -135,7 +141,7 @@ BOOL LLPanelMainInventory::postBuild() recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE); recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); recent_items_panel->getFilter()->markDefault(); - recent_items_panel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, recent_items_panel, _1, _2)); + recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2)); } // Now load the stored settings from disk, if available. @@ -163,7 +169,6 @@ BOOL LLPanelMainInventory::postBuild() } - mFilterEditor = getChild<LLFilterEditor>("inventory search editor"); if (mFilterEditor) { @@ -176,10 +181,38 @@ BOOL LLPanelMainInventory::postBuild() childSetLabelArg("Upload Sound", "[COST]", upload_cost); childSetLabelArg("Upload Animation", "[COST]", upload_cost); childSetLabelArg("Bulk Upload", "[COST]", upload_cost); - + + initListCommandsHandlers(); return TRUE; } +void LLPanelMainInventory::initListCommandsHandlers() +{ + mListCommands = getChild<LLPanel>("bottom_panel"); + + mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this)); + mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this)); + mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this)); + /* + mListCommands->getChild<LLButton>("add_btn")->setHeldDownCallback(boost::bind(&LLPanelMainInventory::onAddButtonHeldDown, this)); + static const LLSD add_landmark_command("add_landmark"); + mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddAction, this, add_landmark_command)); + */ + + LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn"); + trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this + , _4 // BOOL drop + , _5 // EDragAndDropType cargo_type + , _7 // EAcceptance* accept + )); + + mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2)); + mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2)); + mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + +} + // Destroys the object LLPanelMainInventory::~LLPanelMainInventory( void ) { @@ -550,6 +583,12 @@ void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_ getChild<LLInventoryPanel>("Recent Items")->setSelectCallback(cb); } +void LLPanelMainInventory::onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action) +{ + updateListCommands(); + panel->onSelectionChange(items, user_action); +} + ///---------------------------------------------------------------------------- /// LLFloaterInventoryFinder ///---------------------------------------------------------------------------- @@ -817,3 +856,134 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data) self->childSetValue("check_texture", FALSE); self->childSetValue("check_snapshot", FALSE); } + + + + + +void LLPanelMainInventory::updateListCommands() +{ + bool trash_enabled = isActionEnabled("delete"); + + mListCommands->childSetEnabled("trash_btn", trash_enabled); +} + +void LLPanelMainInventory::onGearButtonClick() +{ + showActionMenu(mMenuGearDefault,"options_gear_btn"); +} + +void LLPanelMainInventory::onAddButtonClick() +{ + showActionMenu(mMenuAdd,"add_btn"); +} + +void LLPanelMainInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name) +{ + if (menu) + { + menu->buildDrawLabels(); + menu->updateParent(LLMenuGL::sMenuContainer); + LLView* spawning_view = getChild<LLView> (spawning_view_name); + S32 menu_x, menu_y; + //show menu in co-ordinates of panel + spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this); + menu_y += menu->getRect().getHeight(); + LLMenuGL::showPopup(this, menu, menu_x, menu_y); + } +} + +void LLPanelMainInventory::onTrashButtonClick() +{ + onClipboardAction("delete"); +} + +void LLPanelMainInventory::onClipboardAction(const LLSD& userdata) +{ + std::string command_name = userdata.asString(); + getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); +} + +void LLPanelMainInventory::onCustomAction(const LLSD& userdata) +{ + const std::string command_name = userdata.asString(); + if (command_name == "new_window") + { + newWindow(); + } + if (command_name == "sort_by_name") + { + const LLSD arg = "name"; + setSortBy(arg); + } + if (command_name == "sort_by_recent") + { + const LLSD arg = "date"; + setSortBy(arg); + } + if (command_name == "show_filters") + { + toggleFindOptions(); + } + if (command_name == "reset_filters") + { + resetFilters(); + } + if (command_name == "close_folders") + { + closeAllFolders(); + } + if (command_name == "empty_trash") + { + const std::string notification = "ConfirmEmptyTrash"; + gInventory.emptyFolderType(notification, LLAssetType::AT_TRASH); + } + if (command_name == "empty_lostnfound") + { + const std::string notification = "ConfirmEmptyLostAndFound"; + gInventory.emptyFolderType(notification, LLAssetType::AT_LOST_AND_FOUND); + } + if (command_name == "save_texture") + { + } +} + +BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) +{ + const std::string command_name = userdata.asString(); + if (command_name == "delete") + { + BOOL can_delete = FALSE; + LLFolderView *folder = getActivePanel()->getRootFolder(); + if (folder) + { + can_delete = TRUE; + std::set<LLUUID> selection_set; + folder->getSelectionList(selection_set); + for (std::set<LLUUID>::iterator iter = selection_set.begin(); + iter != selection_set.end(); + ++iter) + { + const LLUUID &item_id = (*iter); + LLFolderViewItem *item = folder->getItemByID(item_id); + can_delete &= item->getListener()->isItemRemovable(); + } + return can_delete; + } + } + return FALSE; +} + +bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept) +{ + *accept = ACCEPT_NO; + + const bool is_enabled = isActionEnabled("delete"); + if (is_enabled) *accept = ACCEPT_YES_MULTI; + + if (is_enabled && drop) + { + onClipboardAction("delete"); + } + return true; +} diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index a2b988e80cb..f7b9fd383e9 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -1,125 +1,145 @@ -/** - * @file llpanelmaininventory.h - * @brief llpanelmaininventory.h - * class definition - * - * $LicenseInfo:firstyear=2001&license=viewergpl$ - * - * Copyright (c) 2001-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_LLPANELMAININVENTORY_H -#define LL_LLPANELMAININVENTORY_H - -#include "llpanel.h" -#include "llinventorymodel.h" -#include "llfolderview.h" - -class LLFolderViewItem; -class LLInventoryPanel; -class LLSaveFolderState; -class LLFilterEditor; -class LLTabContainer; -class LLFloaterInventoryFinder; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLPanelMainInventory -// -// This is a panel used to view and control an agent's inventory, -// including all the fixin's (e.g. AllItems/RecentItems tabs, filter floaters). -// -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLPanelMainInventory : public LLPanel, LLInventoryObserver -{ -public: - friend class LLFloaterInventoryFinder; - - LLPanelMainInventory(); - ~LLPanelMainInventory(); - - BOOL postBuild(); - - virtual BOOL handleKeyHere(KEY key, MASK mask); - - // Inherited functionality - /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg); - /*virtual*/ void changed(U32 mask); - - LLInventoryPanel* getPanel() { return mActivePanel; } - LLInventoryPanel* getActivePanel() { return mActivePanel; } - - const std::string& getFilterText() const { return mFilterText; } - - void setSelectCallback(const LLFolderView::signal_t::slot_type& cb); - -protected: - // - // Misc functions - // - void setFilterTextFromFilter(); - void startSearch(); - - void toggleFindOptions(); - - static BOOL filtersVisible(void* user_data); - void onClearSearch(); - static void onFoldersByName(void *user_data); - static BOOL checkFoldersByName(void *user_data); - void onFilterEdit(const std::string& search_string ); - static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward); - void onFilterSelected(); - - const std::string getFilterSubString(); - void setFilterSubString(const std::string& string); - - // menu callbacks - void doToSelected(const LLSD& userdata); - void closeAllFolders(); - void newWindow(); - void doCreate(const LLSD& userdata); - void resetFilters(); - void setSortBy(const LLSD& userdata); - -private: - LLFloaterInventoryFinder* getFinder(); - - LLFilterEditor* mFilterEditor; - LLTabContainer* mFilterTabs; - LLHandle<LLFloater> mFinderHandle; - LLInventoryPanel* mActivePanel; - LLSaveFolderState* mSavedFolderState; - - std::string mFilterText; -}; - -#endif // LL_LLPANELMAININVENTORY_H - - - +/** + * @file llpanelmaininventory.h + * @brief llpanelmaininventory.h + * class definition + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELMAININVENTORY_H +#define LL_LLPANELMAININVENTORY_H + +#include "llpanel.h" +#include "llinventorymodel.h" +#include "llfolderview.h" + +class LLFolderViewItem; +class LLInventoryPanel; +class LLSaveFolderState; +class LLFilterEditor; +class LLTabContainer; +class LLFloaterInventoryFinder; +class LLMenuGL; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLPanelMainInventory +// +// This is a panel used to view and control an agent's inventory, +// including all the fixin's (e.g. AllItems/RecentItems tabs, filter floaters). +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLPanelMainInventory : public LLPanel, LLInventoryObserver +{ +public: + friend class LLFloaterInventoryFinder; + + LLPanelMainInventory(); + ~LLPanelMainInventory(); + + BOOL postBuild(); + + virtual BOOL handleKeyHere(KEY key, MASK mask); + + // Inherited functionality + /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg); + /*virtual*/ void changed(U32 mask); + + LLInventoryPanel* getPanel() { return mActivePanel; } + LLInventoryPanel* getActivePanel() { return mActivePanel; } + const LLInventoryPanel* getActivePanel() const { return mActivePanel; } + + const std::string& getFilterText() const { return mFilterText; } + + void setSelectCallback(const LLFolderView::signal_t::slot_type& cb); + +protected: + // + // Misc functions + // + void setFilterTextFromFilter(); + void startSearch(); + + void toggleFindOptions(); + + static BOOL filtersVisible(void* user_data); + void onClearSearch(); + static void onFoldersByName(void *user_data); + static BOOL checkFoldersByName(void *user_data); + void onFilterEdit(const std::string& search_string ); + static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward); + void onFilterSelected(); + + const std::string getFilterSubString(); + void setFilterSubString(const std::string& string); + + // menu callbacks + void doToSelected(const LLSD& userdata); + void closeAllFolders(); + void newWindow(); + void doCreate(const LLSD& userdata); + void resetFilters(); + void setSortBy(const LLSD& userdata); + + // List Commands Handlers + void initListCommandsHandlers(); + void updateListCommands(); + void onGearButtonClick(); + void onAddButtonClick(); + void showActionMenu(LLMenuGL* menu, std::string spawning_view_name); + void onTrashButtonClick(); + void onClipboardAction(const LLSD& userdata); + BOOL isActionEnabled(const LLSD& command_name); + void onCustomAction(const LLSD& command_name); + bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept); + + void onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action); + +private: + LLFloaterInventoryFinder* getFinder(); + + LLFilterEditor* mFilterEditor; + LLTabContainer* mFilterTabs; + LLHandle<LLFloater> mFinderHandle; + LLInventoryPanel* mActivePanel; + LLSaveFolderState* mSavedFolderState; + + LLPanel* mListCommands; + LLMenuGL* mMenuGearDefault; + LLMenuGL* mMenuAdd; + + std::string mFilterText; +}; + +#endif // LL_LLPANELMAININVENTORY_H + + + diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml new file mode 100644 index 00000000000..cfe46fc6429 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + layout="topleft" + left="0" + mouse_opaque="false" + name="menu_folder_gear" + visible="false"> + <menu_item_call + label="Upload" + layout="topleft" + name="upload"> + </menu_item_call> + <menu_item_call + label="Folder" + layout="topleft" + name="add_folder"> + <on_click + function="Inventory.Add.Action" + parameter="folder" /> + <menu_item_call + label="Script" + layout="topleft" + name="add_script"> + <on_click + function="Inventory.Add.Action" + parameter="script" /> + </menu_item_call> + <menu_item_call + label="Note" + layout="topleft" + name="add_note"> + <on_click + function="Inventory.Add.Action" + parameter="note" /> + </menu_item_call> +</menu> diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml new file mode 100644 index 00000000000..1592ba7bc76 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + bottom="806" + layout="topleft" + left="0" + mouse_opaque="false" + name="menu_gear_default" + visible="false"> + <menu_item_call + label="New Inventory Window" + layout="topleft" + name="new_window"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="new_window" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Sort by Name" + layout="topleft" + name="sort_by_name"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="sort_by_name" /> + </menu_item_call> + <menu_item_call + label="Sort by Most Recent" + layout="topleft" + name="sort_by_recent"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="sort_by_recent" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Show Filters" + layout="topleft" + name="show_filters"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="show_filters" /> + </menu_item_call> + <menu_item_call + label="Reset Filters" + layout="topleft" + name="reset_filters"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="reset_filters" /> + </menu_item_call> + <menu_item_call + label="Close All Folders" + layout="topleft" + name="close_folders"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="close_folders" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Empty Trash" + layout="topleft" + name="empty_trash"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="empty_trash" /> + </menu_item_call> + <menu_item_call + label="Empty Lost and Found" + layout="topleft" + name="empty_lostnfound"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="empty_lostnfound" /> + </menu_item_call> + <menu_item_call + label="Save Texture As" + layout="topleft" + name="save_texture"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="save_texture" /> + <on_enable + function="Inventory.GearDefault.Enable" + parameter="save_texture" /> + </menu_item_call> +</menu> diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 8c5bf768d69..fcee0ef9538 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -52,6 +52,57 @@ top_delta="0" width="290" /> </tab_container> + + <panel + background_visible="true" + bevel_style="none" + bottom="0" + follows="left|right|bottom" + height="30" + layout="bottomleft" + left="0" + visible="true" + name="bottom_panel" + width="330"> + <button + follows="bottom|left" + tool_tip="Show additional options" + height="18" + image_disabled="OptionsMenu_Disabled" + image_selected="OptionsMenu_Press" + image_unselected="OptionsMenu_Off" + layout="topleft" + left="10" + name="options_gear_btn" + picture_style="true" + top="6" + width="18" /> + <button + follows="bottom|left" + height="18" + image_selected="AddItem_Press" + image_unselected="AddItem_Off" + image_disabled="AddItem_Disabled" + layout="topleft" + left_pad="5" + name="add_btn" + picture_style="true" + tool_tip="Add new item" + width="18" /> + <dnd_button + follows="bottom|right" + height="18" + image_selected="TrashItem_Press" + image_unselected="TrashItem_Off" + layout="topleft" + right="-5" + name="trash_btn" + picture_style="true" + tool_tip="Remove selected item" + top="6" + width="18" /> + </panel> + <menu_bar bg_visible="false" follows="left|top|right" @@ -60,7 +111,8 @@ left_delta="0" mouse_opaque="false" name="Inventory Menu" - top_delta="-45" + top="15" + visible="true" width="290"> <menu height="101" -- GitLab From e948c0c03c5d6a9d3b81617a88927bbc2058e28d Mon Sep 17 00:00:00 2001 From: Palmer <palmer@lindenlab.com> Date: Thu, 5 Nov 2009 17:33:10 -0800 Subject: [PATCH 205/306] Ext-2191 - Put some limits on WLSkyDetail Reviewed by Mani --- indra/newview/llvowlsky.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index 8621e5e1d92..7a7538ae629 100644 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -49,12 +49,12 @@ const U32 LLVOWLSky::MAX_SKY_DETAIL = 180; inline U32 LLVOWLSky::getNumStacks(void) { - return gSavedSettings.getU32("WLSkyDetail"); + return min(MAX_SKY_DETAIL, max(MIN_SKY_DETAIL, gSavedSettings.getU32("WLSkyDetail"))); } inline U32 LLVOWLSky::getNumSlices(void) { - return 2 * gSavedSettings.getU32("WLSkyDetail"); + return 2 * min(MAX_SKY_DETAIL, max(MIN_SKY_DETAIL, gSavedSettings.getU32("WLSkyDetail"))); } inline U32 LLVOWLSky::getFanNumVerts(void) -- GitLab From 3cff39dd4abd4cacd25375b1749f8485d1567aad Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 5 Nov 2009 20:42:06 -0500 Subject: [PATCH 206/306] EXT-2277 : Bottom panel for Inventory view "Add" button menu for bottom panel. --HG-- branch : avatar-pipeline --- .../default/xui/en/menu_inventory_add.xml | 253 +++++++++++++++--- 1 file changed, 223 insertions(+), 30 deletions(-) diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml index cfe46fc6429..b07a8bb5123 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml @@ -3,34 +3,227 @@ layout="topleft" left="0" mouse_opaque="false" - name="menu_folder_gear" + name="menu_inventory_add" visible="false"> - <menu_item_call - label="Upload" - layout="topleft" - name="upload"> - </menu_item_call> - <menu_item_call - label="Folder" - layout="topleft" - name="add_folder"> - <on_click - function="Inventory.Add.Action" - parameter="folder" /> - <menu_item_call - label="Script" - layout="topleft" - name="add_script"> - <on_click - function="Inventory.Add.Action" - parameter="script" /> - </menu_item_call> - <menu_item_call - label="Note" - layout="topleft" - name="add_note"> - <on_click - function="Inventory.Add.Action" - parameter="note" /> - </menu_item_call> -</menu> + <menu + create_jump_keys="true" + label="Upload" + layout="topleft" + name="upload" + tear_off="true"> + <menu_item_call + label="Image (L$[COST])..." + layout="topleft" + name="Upload Image" + shortcut="control|U"> + <menu_item_call.on_click + function="File.UploadImage" + parameter="" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + </menu_item_call> + <menu_item_call + label="Sound (L$[COST])..." + layout="topleft" + name="Upload Sound"> + <menu_item_call.on_click + function="File.UploadSound" + parameter="" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + </menu_item_call> + <menu_item_call + label="Animation (L$[COST])..." + layout="topleft" + name="Upload Animation"> + <menu_item_call.on_click + function="File.UploadAnim" + parameter="" /> + <menu_item_call.on_enable + function="File.EnableUpload" /> + </menu_item_call> + <menu_item_call + label="Bulk (L$[COST] per file)..." + layout="topleft" + name="Bulk Upload"> + <menu_item_call.on_click + function="File.UploadBulk" + parameter="" /> + </menu_item_call> + <menu_item_separator + layout="topleft" /> + </menu> + + <menu_item_call + label="New Folder" + layout="topleft" + name="New Folder"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="category" /> + </menu_item_call> + <menu_item_call + label="New Script" + layout="topleft" + name="New Script"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="lsl" /> + </menu_item_call> + <menu_item_call + label="New Note" + layout="topleft" + name="New Note"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="notecard" /> + </menu_item_call> + <menu_item_call + label="New Gesture" + layout="topleft" + name="New Gesture"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="gesture" /> + </menu_item_call> + <menu + height="175" + label="New Clothes" + layout="topleft" + left_delta="0" + mouse_opaque="false" + name="New Clothes" + top_pad="514" + width="125"> + <menu_item_call + label="New Shirt" + layout="topleft" + name="New Shirt"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="shirt" /> + </menu_item_call> + <menu_item_call + label="New Pants" + layout="topleft" + name="New Pants"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="pants" /> + </menu_item_call> + <menu_item_call + label="New Shoes" + layout="topleft" + name="New Shoes"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="shoes" /> + </menu_item_call> + <menu_item_call + label="New Socks" + layout="topleft" + name="New Socks"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="socks" /> + </menu_item_call> + <menu_item_call + label="New Jacket" + layout="topleft" + name="New Jacket"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="jacket" /> + </menu_item_call> + <menu_item_call + label="New Skirt" + layout="topleft" + name="New Skirt"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="skirt" /> + </menu_item_call> + <menu_item_call + label="New Gloves" + layout="topleft" + name="New Gloves"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="gloves" /> + </menu_item_call> + <menu_item_call + label="New Undershirt" + layout="topleft" + name="New Undershirt"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="undershirt" /> + </menu_item_call> + <menu_item_call + label="New Underpants" + layout="topleft" + name="New Underpants"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="underpants" /> + </menu_item_call> + <menu_item_call + label="New Alpha" + layout="topleft" + name="New Alpha"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="alpha" /> + </menu_item_call> + <menu_item_call + label="New Tattoo" + layout="topleft" + name="New Tattoo"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="tattoo" /> + </menu_item_call> + </menu> + <menu + height="85" + label="New Body Parts" + layout="topleft" + left_delta="0" + mouse_opaque="false" + name="New Body Parts" + top_pad="514" + width="118"> + <menu_item_call + label="New Shape" + layout="topleft" + name="New Shape"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="shape" /> + </menu_item_call> + <menu_item_call + label="New Skin" + layout="topleft" + name="New Skin"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="skin" /> + </menu_item_call> + <menu_item_call + label="New Hair" + layout="topleft" + name="New Hair"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="hair" /> + </menu_item_call> + <menu_item_call + label="New Eyes" + layout="topleft" + name="New Eyes"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="eyes" /> + </menu_item_call> + </menu> +</menu> \ No newline at end of file -- GitLab From 96345c7420a38ce6cf385bac644d5d243ff17395 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Thu, 5 Nov 2009 21:51:35 -0500 Subject: [PATCH 207/306] EXT-2278 : "Save Texture As" for bottom panel --HG-- branch : avatar-pipeline --- indra/newview/llpanelmaininventory.cpp | 73 +++++++++++++++++++ indra/newview/llpanelmaininventory.h | 2 +- .../xui/en/menu_inventory_gear_default.xml | 22 +++--- 3 files changed, 85 insertions(+), 12 deletions(-) diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 9f0eed2cbe8..bdfff9b2ab3 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -34,6 +34,7 @@ #include "llpanelmaininventory.h" #include "lldndbutton.h" +#include "llfilepicker.h" #include "llfloaterinventory.h" #include "llinventorybridge.h" #include "llinventoryfunctions.h" @@ -45,9 +46,18 @@ #include "llspinctrl.h" #include "lltooldraganddrop.h" #include "llviewermenu.h" +#include "llviewertexturelist.h" static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); // Seraph is this redundant with constructor? +void on_file_loaded_for_save(BOOL success, + LLViewerFetchedTexture *src_vi, + LLImageRaw* src, + LLImageRaw* aux_src, + S32 discard_level, + BOOL final, + void* userdata); + ///---------------------------------------------------------------------------- /// LLFloaterInventoryFinder ///---------------------------------------------------------------------------- @@ -906,6 +916,9 @@ void LLPanelMainInventory::onClipboardAction(const LLSD& userdata) void LLPanelMainInventory::onCustomAction(const LLSD& userdata) { + if (!isActionEnabled(userdata)) + return; + const std::string command_name = userdata.asString(); if (command_name == "new_window") { @@ -945,6 +958,25 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata) } if (command_name == "save_texture") { + LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); + if (!current_item) + { + return; + } + + const LLUUID& item_id = current_item->getListener()->getUUID(); + LLFilePicker& file_picker = LLFilePicker::instance(); + const LLInventoryItem* item = gInventory.getItem(item_id); + if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TGA, item ? LLDir::getScrubbedFileName(item->getName()) : LLStringUtil::null) ) + { + // User canceled or we failed to acquire save file. + return; + } + // remember the user-approved/edited file name. + const LLUUID& asset_id = item->getAssetUUID(); + LLPointer<LLViewerFetchedTexture> image = LLViewerTextureManager::getFetchedTexture(asset_id, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + image->setLoadedCallback( on_file_loaded_for_save, + 0, TRUE, FALSE, new std::string(file_picker.getFirstFile()) ); } } @@ -971,6 +1003,14 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) return can_delete; } } + if (command_name == "save_texture") + { + LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem(); + if (current_item) + { + return (current_item->getListener()->getInventoryType() == LLInventoryType::IT_TEXTURE); + } + } return FALSE; } @@ -987,3 +1027,36 @@ bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType } return true; } + +void on_file_loaded_for_save(BOOL success, + LLViewerFetchedTexture *src_vi, + LLImageRaw* src, + LLImageRaw* aux_src, + S32 discard_level, + BOOL final, + void* userdata) +{ + std::string *filename = (std::string*) userdata; + + if (final && success) + { + LLPointer<LLImageTGA> image_tga = new LLImageTGA; + if( !image_tga->encode( src ) ) + { + LLSD args; + args["FILE"] = *filename; + LLNotifications::instance().add("CannotEncodeFile", args); + } + else if( !image_tga->save( *filename ) ) + { + LLSD args; + args["FILE"] = *filename; + LLNotifications::instance().add("CannotWriteFile", args); + } + } + + if(!success ) + { + LLNotifications::instance().add("CannotDownloadFile"); + } +} diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index f7b9fd383e9..29e9baa6cf2 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -89,6 +89,7 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver void startSearch(); void toggleFindOptions(); + void onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action); static BOOL filtersVisible(void* user_data); void onClearSearch(); @@ -121,7 +122,6 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver void onCustomAction(const LLSD& command_name); bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept); - void onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action); private: LLFloaterInventoryFinder* getFinder(); diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml index 1592ba7bc76..435a3e6d340 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml @@ -76,15 +76,15 @@ function="Inventory.GearDefault.Custom.Action" parameter="empty_lostnfound" /> </menu_item_call> - <menu_item_call - label="Save Texture As" - layout="topleft" - name="save_texture"> - <on_click - function="Inventory.GearDefault.Custom.Action" - parameter="save_texture" /> - <on_enable - function="Inventory.GearDefault.Enable" - parameter="save_texture" /> - </menu_item_call> + <menu_item_call + label="Save Texture As" + layout="topleft" + name="Save Texture As"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="save_texture" /> + <on_enable + function="Inventory.GearDefault.Enable" + parameter="save_texture" /> + </menu_item_call> </menu> -- GitLab From fac0b6836a59681443fb2bbd13e6b5eb9c07cef5 Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Thu, 5 Nov 2009 20:36:15 -0800 Subject: [PATCH 208/306] refactored top level ui into main_view.xml --- indra/llui/llfloater.cpp | 2 + indra/llui/llmenugl.cpp | 6 +- indra/llui/llmenugl.h | 4 +- indra/llui/lltooltip.cpp | 4 +- indra/newview/llbottomtray.cpp | 2 +- indra/newview/lldebugview.cpp | 6 +- indra/newview/lldebugview.h | 2 + indra/newview/llfloatersnapshot.cpp | 2 + indra/newview/llmoveview.cpp | 5 +- indra/newview/llviewermenu.cpp | 22 +-- indra/newview/llviewermenu.h | 5 + indra/newview/llviewerwindow.cpp | 177 ++++++------------ .../skins/default/xui/en/floater_aaa.xml | 21 +-- .../skins/default/xui/en/main_view.xml | 138 ++++++++++++++ 14 files changed, 239 insertions(+), 157 deletions(-) create mode 100644 indra/newview/skins/default/xui/en/main_view.xml diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index aac27e65627..f2cdad8854a 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1857,6 +1857,8 @@ void LLFloater::buildButtons() ///////////////////////////////////////////////////// // LLFloaterView +static LLDefaultChildRegistry::Register<LLFloaterView> r("floater_view"); + LLFloaterView::LLFloaterView (const Params& p) : LLUICtrl (p), mFocusCycleMode(FALSE), diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 956e8439874..f078b679128 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -3247,11 +3247,9 @@ BOOL LLMenuBarGL::handleHover( S32 x, S32 y, MASK mask ) ///============================================================================ LLCoordGL LLMenuHolderGL::sContextMenuSpawnPos(S32_MAX, S32_MAX); -LLMenuHolderGL::LLMenuHolderGL() - : LLPanel() +LLMenuHolderGL::LLMenuHolderGL(const LLMenuHolderGL::Params& p) + : LLPanel(p) { - setName("Menu Holder"); - setMouseOpaque(FALSE); sItemActivationTimer.stop(); mCanHide = TRUE; } diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 09d9e407c7b..b0681d252d2 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -765,7 +765,9 @@ class LLMenuBarGL : public LLMenuGL class LLMenuHolderGL : public LLPanel { public: - LLMenuHolderGL(); + struct Params : public LLInitParam::Block<Params, LLPanel::Params> + {}; + LLMenuHolderGL(const Params& p); virtual ~LLMenuHolderGL() {} virtual BOOL hideMenus(); diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp index 4bc9a9c0426..fe1c2ba67c0 100644 --- a/indra/llui/lltooltip.cpp +++ b/indra/llui/lltooltip.cpp @@ -57,6 +57,8 @@ LLToolTipView *gToolTipView = NULL; // Member functions // +static LLDefaultChildRegistry::Register<LLToolTipView> register_tooltip_view("tooltip_view"); + LLToolTipView::Params::Params() { mouse_opaque = false; @@ -142,7 +144,7 @@ void LLToolTipView::drawStickyRect() // -static LLDefaultChildRegistry::Register<LLToolTip> r("tool_tip"); +static LLDefaultChildRegistry::Register<LLToolTip> register_tooltip("tool_tip"); LLToolTip::Params::Params() diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index a17ba79078b..4c15fdd1a29 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -71,7 +71,7 @@ LLBottomTray::LLBottomTray(const LLSD&) //this is to fix a crash that occurs because LLBottomTray is a singleton //and thus is deleted at the end of the viewers lifetime, but to be cleanly //destroyed LLBottomTray requires some subsystems that are long gone - LLUI::getRootView()->addChild(this); + //LLUI::getRootView()->addChild(this); // Necessary for focus movement among child controls setFocusRoot(TRUE); diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp index 24a57cb0c1b..15d74c9793d 100644 --- a/indra/newview/lldebugview.cpp +++ b/indra/newview/lldebugview.cpp @@ -55,12 +55,16 @@ LLDebugView* gDebugView = NULL; // // Methods // +static LLDefaultChildRegistry::Register<LLDebugView> r("debug_view"); LLDebugView::LLDebugView(const LLDebugView::Params& p) : LLView(p) +{} + +void LLDebugView::init() { LLRect r; - LLRect rect(p.rect); + LLRect rect = getLocalRect(); r.set(10, rect.getHeight() - 100, rect.getWidth()/2, 100); LLConsole::Params cp; diff --git a/indra/newview/lldebugview.h b/indra/newview/lldebugview.h index 9cf2a59a0a7..b17cdb43cdc 100644 --- a/indra/newview/lldebugview.h +++ b/indra/newview/lldebugview.h @@ -60,6 +60,8 @@ class LLDebugView : public LLView LLDebugView(const Params&); ~LLDebugView(); + void init(); + void setStatsVisible(BOOL visible); LLFastTimerView* mFastTimerView; diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index fd2e7b3487a..347cc3a58e4 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -101,6 +101,8 @@ S32 BORDER_WIDTH = 6; const S32 MAX_POSTCARD_DATASIZE = 1024 * 1024; // one megabyte const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512 +static LLDefaultChildRegistry::Register<LLSnapshotFloaterView> r("snapshot_floater_view"); + ///---------------------------------------------------------------------------- /// Class LLSnapshotLivePreview ///---------------------------------------------------------------------------- diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 14da35594fb..b0520874752 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -598,14 +598,11 @@ BOOL LLPanelStandStopFlying::postBuild() void LLPanelStandStopFlying::setVisible(BOOL visible) { //we dont need to show the panel if these buttons are not activated - if (visible && !mStandButton->getVisible() && !mStopFlyingButton->getVisible()) visible = false; - if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) visible = false; if (visible) { updatePosition(); - getParent()->sendChildToFront(this); } LLPanel::setVisible(visible); @@ -638,7 +635,7 @@ LLPanelStandStopFlying* LLPanelStandStopFlying::getStandStopFlyingPanel() LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_stand_stop_flying.xml"); panel->setVisible(FALSE); - LLUI::getRootView()->addChild(panel); + //LLUI::getRootView()->addChild(panel); llinfos << "Build LLPanelStandStopFlying panel" << llendl; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index b30acd47f1f..ad8739585fb 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -467,16 +467,6 @@ void set_underclothes_menu_options() void init_menus() { S32 top = gViewerWindow->getRootView()->getRect().getHeight(); - S32 width = gViewerWindow->getRootView()->getRect().getWidth(); - - // - // Main menu bar - // - gMenuHolder = new LLViewerMenuHolderGL(); - gMenuHolder->setRect(LLRect(0, top, width, 0)); - gMenuHolder->setFollowsAll(); - - LLMenuGL::sMenuContainer = gMenuHolder; // Initialize actions initialize_menus(); @@ -7080,6 +7070,11 @@ void handle_test_load_url(void*) // // LLViewerMenuHolderGL // +static LLDefaultChildRegistry::Register<LLViewerMenuHolderGL> r("menu_holder"); + +LLViewerMenuHolderGL::LLViewerMenuHolderGL(const LLViewerMenuHolderGL::Params& p) +: LLMenuHolderGL(p) +{} BOOL LLViewerMenuHolderGL::hideMenus() { @@ -7089,8 +7084,11 @@ BOOL LLViewerMenuHolderGL::hideMenus() mParcelSelection = NULL; mObjectSelection = NULL; - gMenuBarView->clearHoverItem(); - gMenuBarView->resetMenuTrigger(); + if (gMenuBarView) + { + gMenuBarView->clearHoverItem(); + gMenuBarView->resetMenuTrigger(); + } return handled; } diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index b65878b5e63..50751d60668 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -132,6 +132,11 @@ void handle_export_selected( void * ); class LLViewerMenuHolderGL : public LLMenuHolderGL { public: + struct Params : public LLInitParam::Block<Params, LLMenuHolderGL::Params> + {}; + + LLViewerMenuHolderGL(const Params& p); + virtual BOOL hideMenus(); void setParcelSelection(LLSafeHandle<LLParcelSelection> selection); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 9b3dbcd2f67..86303699717 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1373,6 +1373,10 @@ void LLViewerWindow::initGLDefaults() gCylinder.prerender(); } +struct MainPanel : public LLPanel +{ +}; + void LLViewerWindow::initBase() { S32 height = getWindowHeight(); @@ -1396,30 +1400,15 @@ void LLViewerWindow::initBase() // Create the floater view at the start so that other views can add children to it. // (But wait to add it as a child of the root view so that it will be in front of the // other views.) + MainPanel* main_view = new MainPanel(); + LLUICtrlFactory::instance().buildPanel(main_view, "main_view.xml"); + main_view->setShape(full_window); + getRootView()->addChild(main_view); // Constrain floaters to inside the menu and status bar regions. - LLRect floater_view_rect = full_window; - // make space for menu bar - floater_view_rect.mTop -= MENU_BAR_HEIGHT; - - LLFloaterView::Params fvparams; - fvparams.name("Floater View"); - fvparams.rect(floater_view_rect); - fvparams.mouse_opaque(false); - fvparams.follows.flags(FOLLOWS_ALL); - fvparams.tab_stop(false); - gFloaterView = LLUICtrlFactory::create<LLFloaterView> (fvparams); - - LLSnapshotFloaterView::Params snapParams; - snapParams.name("Snapshot Floater View"); - snapParams.rect(full_window); - snapParams.enabled(false); - gSnapshotFloaterView = LLUICtrlFactory::create<LLSnapshotFloaterView> (snapParams); + gFloaterView = getRootView()->getChild<LLFloaterView>("Floater View"); + gSnapshotFloaterView = getRootView()->getChild<LLSnapshotFloaterView>("Snapshot Floater View"); - // Snapshot floater must start invisible otherwise it eats all - // the tooltips. JC - gSnapshotFloaterView->setVisible(FALSE); - // Console llassert( !gConsole ); LLConsole::Params cp; @@ -1443,43 +1432,21 @@ void LLViewerWindow::initBase() } #endif - // Debug view over the console - LLDebugView::Params debug_p; - debug_p.name("DebugView"); - debug_p.rect(full_window); - debug_p.follows.flags(FOLLOWS_ALL); - debug_p.visible(true); - gDebugView = LLUICtrlFactory::create<LLDebugView>(debug_p); - getRootView()->addChild(gDebugView); - - // Add floater view at the end so it will be on top, and give it tab priority over others - getRootView()->addChild(gFloaterView, -1); - getRootView()->addChild(gSnapshotFloaterView); - - // notify above floaters! - LLRect notify_rect = floater_view_rect; - LLNotifyBoxView::Params p; - p.name("notify_container"); - p.rect(notify_rect); - p.mouse_opaque(false); - p.follows.flags(FOLLOWS_ALL); - gNotifyBoxView = LLUICtrlFactory::create<LLNotifyBoxView> (p); - getRootView()->addChild(gNotifyBoxView, -2); - - // View for tooltips - LLToolTipView::Params hvp; - hvp.name("tooltip view"); - hvp.rect(full_window); - hvp.follows.flags(FOLLOWS_ALL); - gToolTipView = LLUICtrlFactory::create<LLToolTipView>(hvp); - gToolTipView->setFollowsAll(); - getRootView()->addChild(gToolTipView); + gDebugView = getRootView()->getChild<LLDebugView>("DebugView"); + gDebugView->init(); + gNotifyBoxView = getRootView()->getChild<LLNotifyBoxView>("notify_container"); + gToolTipView = getRootView()->getChild<LLToolTipView>("tooltip view"); // Add the progress bar view (startup view), which overrides everything mProgressView = new LLProgressView(full_window); getRootView()->addChild(mProgressView); setShowProgress(FALSE); setProgressCancelButtonVisible(FALSE); + + gMenuHolder = getRootView()->getChild<LLViewerMenuHolderGL>("Menu Holder"); + + LLMenuGL::sMenuContainer = gMenuHolder; + } void LLViewerWindow::initWorldUI() @@ -1488,20 +1455,22 @@ void LLViewerWindow::initWorldUI() S32 width = mRootView->getRect().getWidth(); LLRect full_window(0, height, width, 0); + gIMMgr = LLIMMgr::getInstance(); // side tray - getRootView()->addChild(LLSideTray::getInstance()); + //getRootView()->addChild(LLSideTray::getInstance()); getRootView()->sendChildToFront(gFloaterView); getRootView()->sendChildToFront(gSnapshotFloaterView); // new bottom panel - LLRect rc = LLBottomTray::getInstance()->getRect(); - rc.mLeft = 0; - rc.mRight = mRootView->getRect().getWidth(); - LLBottomTray::getInstance()->reshape(rc.getWidth(),rc.getHeight(),FALSE); - LLBottomTray::getInstance()->setRect(rc); + LLPanel* bottom_tray_container = getRootView()->getChild<LLPanel>("bottom_tray_container"); + LLBottomTray* bottom_tray = LLBottomTray::getInstance(); + bottom_tray->setShape(bottom_tray_container->getLocalRect()); + bottom_tray->setFollows(FOLLOWS_ALL); + bottom_tray_container->addChild(bottom_tray); + bottom_tray_container->setVisible(TRUE); // Pre initialize instance communicate instance; // currently needs to happen before initializing chat or IM @@ -1517,17 +1486,6 @@ void LLViewerWindow::initWorldUI() gMorphView = LLUICtrlFactory::create<LLMorphView>(mvp); getRootView()->addChild(gMorphView); - // Make space for nav bar. - LLNavigationBar* navbar = LLNavigationBar::getInstance(); - LLRect floater_view_rect = gFloaterView->getRect(); - LLRect notify_view_rect = gNotifyBoxView->getRect(); - floater_view_rect.mTop -= navbar->getDefNavBarHeight(); - floater_view_rect.mBottom += LLBottomTray::getInstance()->getRect().getHeight(); - notify_view_rect.mTop -= navbar->getDefNavBarHeight(); - notify_view_rect.mBottom += LLBottomTray::getInstance()->getRect().getHeight(); - gFloaterView->setRect(floater_view_rect); - gNotifyBoxView->setRect(notify_view_rect); - LLWorldMapView::initClass(); // Force gFloaterWorldMap to initialize @@ -1538,22 +1496,22 @@ void LLViewerWindow::initWorldUI() LLFloaterReg::hideInstance("build"); // Status bar - S32 menu_bar_height = gMenuBarView->getRect().getHeight(); - LLRect root_rect = getRootView()->getRect(); - LLRect status_rect(0, root_rect.getHeight(), root_rect.getWidth(), root_rect.getHeight() - menu_bar_height); - gStatusBar = new LLStatusBar(status_rect); - gStatusBar->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP); - - gStatusBar->reshape(root_rect.getWidth(), gStatusBar->getRect().getHeight(), TRUE); - gStatusBar->translate(0, root_rect.getHeight() - gStatusBar->getRect().getHeight()); + LLPanel* status_bar_container = getRootView()->getChild<LLPanel>("status_bar_container"); + gStatusBar = new LLStatusBar(status_bar_container->getLocalRect()); + gStatusBar->setFollows(FOLLOWS_ALL); // sync bg color with menu bar gStatusBar->setBackgroundColor( gMenuBarView->getBackgroundColor().get() ); + status_bar_container->addChild(gStatusBar); + status_bar_container->setVisible(TRUE); // Navigation bar - navbar->reshape(root_rect.getWidth(), navbar->getRect().getHeight(), TRUE); // *TODO: redundant? - navbar->translate(0, root_rect.getHeight() - menu_bar_height - navbar->getRect().getHeight()); // FIXME - navbar->setBackgroundColor(gMenuBarView->getBackgroundColor().get()); + LLPanel* nav_bar_container = getRootView()->getChild<LLPanel>("nav_bar_container"); + LLNavigationBar* navbar = LLNavigationBar::getInstance(); + navbar->setShape(nav_bar_container->getLocalRect()); + navbar->setBackgroundColor(gMenuBarView->getBackgroundColor().get()); + nav_bar_container->addChild(navbar); + nav_bar_container->setVisible(TRUE); if (!gSavedSettings.getBOOL("ShowNavbarNavigationPanel")) { @@ -1585,19 +1543,6 @@ void LLViewerWindow::initWorldUI() LLBottomTray::getInstance()->showGestureButton(FALSE); } - getRootView()->addChild(gStatusBar); - getRootView()->addChild(navbar); - - - //sidetray - //then notify area - //then menu - //getRootView()->sendChildToFront(LLSideTray::getInstance()); - - getRootView()->sendChildToFront(gNotifyBoxView); - // menu holder appears on top to get first pass at all mouse events - getRootView()->sendChildToFront(gMenuHolder); - if ( gHUDView == NULL ) { LLRect hud_rect = full_window; @@ -1611,11 +1556,13 @@ void LLViewerWindow::initWorldUI() getRootView()->addChildInBack(gHUDView); } - // this allows not to see UI elements created while UI initializing after Alt+Tab was pressed during login. EXT-744. - moveProgressViewToFront(); + LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container"); + LLPanelStandStopFlying* panel_stand_stop_flying = LLPanelStandStopFlying::getInstance(); + panel_stand_stop_flying->setShape(panel_ssf_container->getLocalRect()); + panel_stand_stop_flying->setFollows(FOLLOWS_ALL); + panel_ssf_container->addChild(panel_stand_stop_flying); + panel_ssf_container->setVisible(TRUE); - // tooltips are always on top - getRootView()->sendChildToFront(gToolTipView); } // Destroy the UI @@ -2327,26 +2274,26 @@ void LLViewerWindow::moveCursorToCenter() void LLViewerWindow::updateBottomTrayRect() { - if(LLBottomTray::instanceExists() && LLSideTray::instanceCreated()) - { - S32 side_tray_width = 0; - if(LLSideTray::getInstance()->getVisible()) - { - side_tray_width = LLSideTray::getInstance()->getTrayWidth(); - } + //if(LLBottomTray::instanceExists() && LLSideTray::instanceCreated()) + //{ + // S32 side_tray_width = 0; + // if(LLSideTray::getInstance()->getVisible()) + // { + // side_tray_width = LLSideTray::getInstance()->getTrayWidth(); + // } - LLBottomTray* bottom_tray = LLBottomTray::getInstance(); - S32 right = llround((F32)mWindowRect.mRight / mDisplayScale.mV[VX]) - side_tray_width; + // LLBottomTray* bottom_tray = LLBottomTray::getInstance(); + // S32 right = llround((F32)mWindowRect.mRight / mDisplayScale.mV[VX]) - side_tray_width; - LLRect rc = bottom_tray->getRect(); - if (right != rc.mRight) - { - rc.mRight = right; - bottom_tray->reshape(rc.getWidth(), rc.getHeight(), FALSE); - bottom_tray->setRect(rc); - mOnBottomTrayWidthChanged(); - } - } + // LLRect rc = bottom_tray->getRect(); + // if (right != rc.mRight) + // { + // rc.mRight = right; + // bottom_tray->reshape(rc.getWidth(), rc.getHeight(), FALSE); + // bottom_tray->setRect(rc); + // mOnBottomTrayWidthChanged(); + // } + //} } ////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml index 4d5268681b6..d0d0cc64c55 100644 --- a/indra/newview/skins/default/xui/en/floater_aaa.xml +++ b/indra/newview/skins/default/xui/en/floater_aaa.xml @@ -1,24 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater - legacy_header_height="18" - height="440" + height="768" layout="topleft" name="floater_aaa" - help_topic="floater_aaa" - save_rect="true" can_resize="true" - title="ABOUT [APP_NAME]" - width="470"> - <text_editor - follows="left|top|right|bottom" - height="400" - layout="topleft" - left="6" - max_length="65536" - name="credits_editor" - top="25" - width="458" - word_wrap="true"> -This is line 4 - </text_editor> + width="1024"> + <panel filename="main_view.xml" follows="all" width="1024" height="768" top="0"/> </floater> diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml new file mode 100644 index 00000000000..2d69465b580 --- /dev/null +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="left|right|top|bottom" + height="768" + layout="topleft" + left="0" + mouse_opaque="false" + name="screen" + width="1024"> + <layout_stack border_size="0" + follows="all" + height="768" + mouse_opaque="false" + name="menu_stack" + orientation="vertical"> + <!-- filename="panel_status_bar.xml"--> + <layout_panel auto_resize="false" + mouse_opaque="false" + name="status_bar_container" + width="1024" + visible="false"/> + <!--filename="panel_navigation_bar.xml"--> + <layout_panel auto_resize="false" + height="65" + mouse_opaque="false" + name="nav_bar_container" + width="1024" + visible="false"/> + <layout_stack auto_resize="true" + border_size="0" + follows="all" + height="500" + mouse_opaque="false" + name="hud_stack" + orientation="horizontal" + width="1024"> + <panel auto_resize="true" + follows="all" + height="500" + layout="topleft" + mouse_opaque="false" + name="main_view" + user_resize="true" + width="500"> + <layout_stack bottom="500" + follows="all" + height="500" + mouse_opaque="false" + name="hud_stack" + orientation="vertical"> + <panel auto_resize="true" + follows="all" + height="500" + layout="topleft" + mouse_opaque="false" + name="hud container" + width="500"> + <debug_view follows="all" + left="0" + top="0" + mouse_opaque="false" + height="500" + name="DebugView" + width="500"/> + + <panel follows="right|top|bottom" + height="500" + mouse_opaque="false" + name="side_bar_tabs" + right="500" + top="0" + width="32"/> + </panel> + <!--filename="panel_stand_stop_flying.xml"--> + <layout_panel auto_resize="false" + follows="all" + min_height="25" + mouse_opaque="false" + name="stand_stop_flying_container" + visible="false"/> + <!--filename="panel_bottomtray.xml"--> + <layout_panel auto_resize="false" + follows="all" + min_height="33" + mouse_opaque="false" + name="bottom_tray_container" + visible="false"/> + </layout_stack> + <floater_view follows="all" + height="500" + mouse_opaque="false" + name="Floater View" + tab_group="-1" + tab_stop="false" + top="0"/> + <snapshot_floater_view enabled="false" + follows="all" + height="500" + left="0" + mouse_opaque="false" + name="Snapshot Floater View" + tab_stop="false" + top="0" + visible="false"/> + </panel> + <!-- side tray --> + <layout_panel auto_resize="false" + follows="all" + height="500" + min_width="333" + mouse_opaque="false" + name="side_tray_container" + user_resize="true" + visible="false" + width="333"/> + </layout_stack> + </layout_stack> + <notify_box_view top="0" + follows="all" + height="768" + mouse_opaque="false" + name="notify_container" + tab_group="-2" + width="1024"/> + <menu_holder top="0" + follows="all" + height="768" + mouse_opaque="false" + name="Menu Holder" + width="1024"/> + <tooltip_view top="0" + follows="all" + height="768" + mouse_opaque="false" + name="tooltip view" + tab_group="-2" + width="1024"/> +</panel> -- GitLab From 35e200881c38eb6c1bfd1f14ef440d4bc4da8c74 Mon Sep 17 00:00:00 2001 From: Xiaohong Bao <bao@lindenlab.com> Date: Fri, 6 Nov 2009 06:52:24 +0000 Subject: [PATCH 209/306] merge QAR-1829: texture pipeline branch in viewer-2.0.0.3 --- indra/llcharacter/llheadrotmotion.cpp | 11 +- indra/llcommon/llapr.cpp | 161 ++- indra/llcommon/llapr.h | 34 +- indra/llcommon/llqueuedthread.cpp | 70 +- indra/llcommon/llqueuedthread.h | 4 + indra/llcommon/llthread.h | 2 - indra/llcommon/llworkerthread.cpp | 1 + indra/llcommon/llworkerthread.h | 6 +- indra/llimage/CMakeLists.txt | 4 + indra/llimage/llimage.cpp | 67 +- indra/llimage/llimage.h | 13 +- indra/llimage/llimagedxt.cpp | 19 +- indra/llimage/llimagej2c.cpp | 5 +- indra/llimage/llimagejpeg.cpp | 9 +- indra/llimage/llimageworker.cpp | 202 ++- indra/llimage/llimageworker.h | 95 +- indra/llimage/tests/llimageworker_test.cpp | 260 ++++ indra/llmath/llvolume.cpp | 2 +- indra/llmessage/llassetstorage.cpp | 3 + indra/llmessage/llassetstorage.h | 11 +- indra/llmessage/llcurl.cpp | 36 +- indra/llmessage/llcurl.h | 7 +- indra/llmessage/tests/llcurl_stub.cpp | 3 +- .../tests/llhttpclientadapter_test.cpp | 2 +- indra/llrender/llimagegl.cpp | 395 +++-- indra/llrender/llimagegl.h | 85 +- indra/llrender/llrender.cpp | 15 +- indra/llrender/llrender.h | 4 +- indra/llrender/lltexture.h | 2 +- indra/llvfs/lllfsthread.cpp | 4 +- indra/newview/CMakeLists.txt | 20 +- indra/newview/app_settings/settings.xml | 83 +- indra/newview/llagent.cpp | 16 +- indra/newview/llappviewer.cpp | 29 +- indra/newview/llappviewer.h | 13 +- indra/newview/llassetuploadresponders.cpp | 10 +- indra/newview/llassetuploadresponders.h | 1 + indra/newview/llcolorswatch.cpp | 2 +- indra/newview/lldebugview.cpp | 35 +- indra/newview/lldrawable.cpp | 2 +- indra/newview/lldrawpool.cpp | 8 +- indra/newview/lldrawpoolalpha.cpp | 2 +- indra/newview/lldrawpooltree.cpp | 2 +- indra/newview/lldynamictexture.cpp | 2 +- indra/newview/llface.cpp | 157 +- indra/newview/llface.h | 20 +- indra/newview/llfloatermap.cpp | 48 +- indra/newview/llfloatermap.h | 2 + indra/newview/llfloaterreporter.cpp | 2 +- indra/newview/llfloaterworldmap.cpp | 182 +-- indra/newview/llfloaterworldmap.h | 10 +- indra/newview/lllandmarkactions.cpp | 15 +- indra/newview/llnavigationbar.cpp | 7 +- indra/newview/llnetmap.cpp | 69 +- indra/newview/llnetmap.h | 12 +- indra/newview/llpanelteleporthistory.cpp | 2 +- indra/newview/llpreviewtexture.cpp | 6 + indra/newview/llspatialpartition.cpp | 3 +- indra/newview/llstartup.cpp | 9 +- indra/newview/llsurface.cpp | 7 +- indra/newview/lltexlayer.cpp | 12 +- indra/newview/lltexturecache.cpp | 1286 +++++++++-------- indra/newview/lltexturecache.h | 65 +- indra/newview/lltexturefetch.cpp | 1056 ++++++++------ indra/newview/lltexturefetch.h | 37 +- indra/newview/lltextureinfo.cpp | 290 ++++ indra/newview/lltextureinfo.h | 80 + indra/newview/lltextureinfodetails.cpp | 40 + indra/newview/lltextureinfodetails.h | 58 + indra/newview/lltexturestats.cpp | 61 + indra/newview/lltexturestats.h | 41 + indra/newview/lltexturestatsuploader.cpp | 59 + indra/newview/lltexturestatsuploader.h | 48 + indra/newview/lltextureview.cpp | 332 +++-- indra/newview/lltextureview.h | 27 +- indra/newview/llurldispatcher.cpp | 8 +- indra/newview/llviewercamera.cpp | 16 +- indra/newview/llviewercamera.h | 14 +- indra/newview/llviewercontrol.cpp | 9 +- indra/newview/llviewerdisplay.cpp | 3 +- indra/newview/llviewermenu.cpp | 47 +- indra/newview/llviewerobject.cpp | 2 +- indra/newview/llviewerobject.h | 2 +- indra/newview/llviewerobjectlist.cpp | 8 +- indra/newview/llviewerregion.cpp | 4 +- indra/newview/llviewerstats.cpp | 28 +- indra/newview/llviewerstats.h | 4 + indra/newview/llviewertexture.cpp | 831 +++++++++-- indra/newview/llviewertexture.h | 132 +- indra/newview/llviewertexturelist.cpp | 177 ++- indra/newview/llviewertexturelist.h | 23 +- indra/newview/llviewerwindow.cpp | 15 +- indra/newview/llviewerwindow.h | 2 +- indra/newview/llvlcomposition.cpp | 13 +- indra/newview/llvoavatar.cpp | 6 +- indra/newview/llvoavatar.h | 2 +- indra/newview/llvoavatarself.cpp | 83 +- indra/newview/llvoavatarself.h | 2 +- indra/newview/llvoclouds.cpp | 2 +- indra/newview/llvoclouds.h | 2 +- indra/newview/llvograss.cpp | 2 +- indra/newview/llvograss.h | 2 +- indra/newview/llvoground.cpp | 2 +- indra/newview/llvoground.h | 2 +- indra/newview/llvopartgroup.cpp | 2 +- indra/newview/llvopartgroup.h | 2 +- indra/newview/llvosky.cpp | 4 +- indra/newview/llvosky.h | 2 +- indra/newview/llvosurfacepatch.cpp | 2 +- indra/newview/llvosurfacepatch.h | 2 +- indra/newview/llvotextbubble.cpp | 2 +- indra/newview/llvotextbubble.h | 2 +- indra/newview/llvotree.cpp | 2 +- indra/newview/llvotree.h | 2 +- indra/newview/llvotreenew.h | 2 +- indra/newview/llvovolume.cpp | 193 +-- indra/newview/llvovolume.h | 7 +- indra/newview/llvowater.cpp | 2 +- indra/newview/llvowater.h | 2 +- indra/newview/llwearablelist.cpp | 5 + indra/newview/llwearablelist.h | 1 + indra/newview/llworldmap.cpp | 1174 +++++---------- indra/newview/llworldmap.h | 332 +++-- indra/newview/llworldmapmessage.cpp | 261 ++++ indra/newview/llworldmapmessage.h | 83 ++ indra/newview/llworldmapview.cpp | 1242 +++++++--------- indra/newview/llworldmapview.h | 51 +- indra/newview/llworldmipmap.cpp | 275 ++++ indra/newview/llworldmipmap.h | 100 ++ indra/newview/pipeline.cpp | 10 +- .../skins/default/textures/map_avatar_32.tga | Bin 0 -> 2894 bytes .../default/textures/map_avatar_above_32.tga | Bin 0 -> 2909 bytes .../default/textures/map_avatar_below_32.tga | Bin 0 -> 3037 bytes .../default/textures/map_avatar_you_32.tga | Bin 0 -> 3395 bytes .../default/xui/en/floater_world_map.xml | 33 +- .../skins/default/xui/en/menu_viewer.xml | 70 +- indra/newview/tests/lltextureinfo_test.cpp | 284 ++++ .../tests/lltextureinfodetails_test.cpp | 98 ++ .../tests/lltexturestatsuploader_test.cpp | 156 ++ indra/newview/tests/llworldmap_test.cpp | 523 +++++++ indra/newview/tests/llworldmipmap_test.cpp | 176 +++ install.xml | 8 +- 142 files changed, 8330 insertions(+), 4023 deletions(-) create mode 100644 indra/llimage/tests/llimageworker_test.cpp create mode 100644 indra/newview/lltextureinfo.cpp create mode 100644 indra/newview/lltextureinfo.h create mode 100644 indra/newview/lltextureinfodetails.cpp create mode 100644 indra/newview/lltextureinfodetails.h create mode 100644 indra/newview/lltexturestats.cpp create mode 100644 indra/newview/lltexturestats.h create mode 100644 indra/newview/lltexturestatsuploader.cpp create mode 100644 indra/newview/lltexturestatsuploader.h create mode 100644 indra/newview/llworldmapmessage.cpp create mode 100644 indra/newview/llworldmapmessage.h create mode 100644 indra/newview/llworldmipmap.cpp create mode 100644 indra/newview/llworldmipmap.h create mode 100644 indra/newview/skins/default/textures/map_avatar_32.tga create mode 100644 indra/newview/skins/default/textures/map_avatar_above_32.tga create mode 100644 indra/newview/skins/default/textures/map_avatar_below_32.tga create mode 100644 indra/newview/skins/default/textures/map_avatar_you_32.tga create mode 100644 indra/newview/tests/lltextureinfo_test.cpp create mode 100644 indra/newview/tests/lltextureinfodetails_test.cpp create mode 100644 indra/newview/tests/lltexturestatsuploader_test.cpp create mode 100644 indra/newview/tests/llworldmap_test.cpp create mode 100644 indra/newview/tests/llworldmipmap_test.cpp diff --git a/indra/llcharacter/llheadrotmotion.cpp b/indra/llcharacter/llheadrotmotion.cpp index 88cd77f7afc..0ee378f3b82 100644 --- a/indra/llcharacter/llheadrotmotion.cpp +++ b/indra/llcharacter/llheadrotmotion.cpp @@ -251,10 +251,13 @@ BOOL LLHeadRotMotion::onUpdate(F32 time, U8* joint_mask) mLastHeadRot = head_rot_local; // Set the head rotation. - LLQuaternion torsoRotLocal = mNeckState->getJoint()->getParent()->getWorldRotation() * currentInvRootRotWorld; - head_rot_local = head_rot_local * ~torsoRotLocal; - mNeckState->setRotation( nlerp(NECK_LAG, LLQuaternion::DEFAULT, head_rot_local) ); - mHeadState->setRotation( nlerp(1.f - NECK_LAG, LLQuaternion::DEFAULT, head_rot_local)); + if(mNeckState->getJoint() && mNeckState->getJoint()->getParent()) + { + LLQuaternion torsoRotLocal = mNeckState->getJoint()->getParent()->getWorldRotation() * currentInvRootRotWorld; + head_rot_local = head_rot_local * ~torsoRotLocal; + mNeckState->setRotation( nlerp(NECK_LAG, LLQuaternion::DEFAULT, head_rot_local) ); + mHeadState->setRotation( nlerp(1.f - NECK_LAG, LLQuaternion::DEFAULT, head_rot_local)); + } return TRUE; } diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp index 669afc53303..ed70b1d9f28 100644 --- a/indra/llcommon/llapr.cpp +++ b/indra/llcommon/llapr.cpp @@ -57,7 +57,7 @@ void ll_init_apr() if(!LLAPRFile::sAPRFilePoolp) { - LLAPRFile::sAPRFilePoolp = new LLVolatileAPRPool() ; + LLAPRFile::sAPRFilePoolp = new LLVolatileAPRPool(FALSE) ; } } @@ -99,13 +99,12 @@ void ll_cleanup_apr() // //LLAPRPool // -LLAPRPool::LLAPRPool(apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag) -{ - mParent = parent ; - mReleasePoolFlag = releasePoolFlag ; - mMaxSize = size ; - mPool = NULL ; - +LLAPRPool::LLAPRPool(apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag) + : mParent(parent), + mReleasePoolFlag(releasePoolFlag), + mMaxSize(size), + mPool(NULL) +{ createAPRPool() ; } @@ -148,31 +147,65 @@ void LLAPRPool::releaseAPRPool() } } +//virtual apr_pool_t* LLAPRPool::getAPRPool() +{ + return mPool ; +} + +LLVolatileAPRPool::LLVolatileAPRPool(BOOL is_local, apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag) + : LLAPRPool(parent, size, releasePoolFlag), + mNumActiveRef(0), + mNumTotalRef(0), + mMutexPool(NULL), + mMutexp(NULL) { - if(!mPool) + //create mutex + if(!is_local) //not a local apr_pool, that is: shared by multiple threads. { - createAPRPool() ; + apr_pool_create(&mMutexPool, NULL); // Create a pool for mutex + apr_thread_mutex_create(&mMutexp, APR_THREAD_MUTEX_UNNESTED, mMutexPool); } - - return mPool ; } -LLVolatileAPRPool::LLVolatileAPRPool(apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag) - : LLAPRPool(parent, size, releasePoolFlag) + +LLVolatileAPRPool::~LLVolatileAPRPool() { - mNumActiveRef = 0 ; - mNumTotalRef = 0 ; + //delete mutex + if(mMutexp) + { + apr_thread_mutex_destroy(mMutexp); + apr_pool_destroy(mMutexPool); + } } -apr_pool_t* LLVolatileAPRPool::getVolatileAPRPool() +// +//define this virtual function to avoid any mistakenly calling LLAPRPool::getAPRPool(). +// +//virtual +apr_pool_t* LLVolatileAPRPool::getAPRPool() { + return LLVolatileAPRPool::getVolatileAPRPool() ; +} + +apr_pool_t* LLVolatileAPRPool::getVolatileAPRPool() +{ + LLScopedLock lock(mMutexp) ; + mNumTotalRef++ ; mNumActiveRef++ ; - return getAPRPool() ; + + if(!mPool) + { + createAPRPool() ; + } + + return mPool ; } void LLVolatileAPRPool::clearVolatileAPRPool() { + LLScopedLock lock(mMutexp) ; + if(mNumActiveRef > 0) { mNumActiveRef--; @@ -251,10 +284,9 @@ void LLScopedLock::unlock() bool ll_apr_warn_status(apr_status_t status) { if(APR_SUCCESS == status) return false; -#ifndef LL_WINDOWS char buf[MAX_STRING]; /* Flawfinder: ignore */ - LL_WARNS_ONCE("APR") << "APR: " << apr_strerror(status, buf, MAX_STRING) << LL_ENDL; -#endif + apr_strerror(status, buf, MAX_STRING); + LL_WARNS("APR") << "APR: " << buf << LL_ENDL; return true; } @@ -268,10 +300,18 @@ void ll_apr_assert_status(apr_status_t status) // LLAPRFile functions // LLAPRFile::LLAPRFile() + : mFile(NULL), + mCurrentFilePoolp(NULL) +{ +} + +LLAPRFile::LLAPRFile(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool) + : mFile(NULL), + mCurrentFilePoolp(NULL) { - mFile = NULL ; - mCurrentFilePoolp = NULL ; + open(filename, flags, pool); } + LLAPRFile::~LLAPRFile() { close() ; @@ -295,11 +335,40 @@ apr_status_t LLAPRFile::close() return ret ; } -apr_status_t LLAPRFile::open(LLVolatileAPRPool* pool, const std::string& filename, apr_int32_t flags, S32* sizep) +apr_status_t LLAPRFile::open(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool, S32* sizep) { apr_status_t s ; - s = open(filename, flags, pool ? pool->getVolatileAPRPool() : NULL, sizep) ; + + //check if already open some file + llassert_always(!mFile) ; + llassert_always(!mCurrentFilePoolp) ; + apr_pool_t* apr_pool = pool ? pool->getVolatileAPRPool() : NULL ; + s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, getAPRFilePool(apr_pool)); + + if (s != APR_SUCCESS || !mFile) + { + mFile = NULL ; + + if (sizep) + { + *sizep = 0; + } + } + else if (sizep) + { + S32 file_size = 0; + apr_off_t offset = 0; + if (apr_file_seek(mFile, APR_END, &offset) == APR_SUCCESS) + { + llassert_always(offset <= 0x7fffffff); + file_size = (S32)offset; + offset = 0; + apr_file_seek(mFile, APR_SET, &offset); + } + *sizep = file_size; + } + if(!mCurrentFilePoolp) { mCurrentFilePoolp = pool ; @@ -312,40 +381,25 @@ apr_status_t LLAPRFile::open(LLVolatileAPRPool* pool, const std::string& filenam return s ; } -apr_status_t LLAPRFile::open(const std::string& filename, apr_int32_t flags, apr_pool_t* pool, S32* sizep) + +//use gAPRPoolp. +apr_status_t LLAPRFile::open(const std::string& filename, apr_int32_t flags, BOOL use_global_pool) { apr_status_t s; //check if already open some file llassert_always(!mFile) ; llassert_always(!mCurrentFilePoolp) ; + llassert_always(use_global_pool) ; //be aware of using gAPRPoolp. - s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, getAPRFilePool(pool)); + s = apr_file_open(&mFile, filename.c_str(), flags, APR_OS_DEFAULT, gAPRPoolp); if (s != APR_SUCCESS || !mFile) { mFile = NULL ; close() ; - if (sizep) - { - *sizep = 0; - } return s; } - if (sizep) - { - S32 file_size = 0; - apr_off_t offset = 0; - if (apr_file_seek(mFile, APR_END, &offset) == APR_SUCCESS) - { - llassert_always(offset <= 0x7fffffff); - file_size = (S32)offset; - offset = 0; - apr_file_seek(mFile, APR_SET, &offset); - } - *sizep = file_size; - } - return s; } @@ -369,6 +423,7 @@ S32 LLAPRFile::read(void *buf, S32 nbytes) apr_status_t s = apr_file_read(mFile, buf, &sz); if (s != APR_SUCCESS) { + ll_apr_warn_status(s); return 0; } else @@ -386,6 +441,7 @@ S32 LLAPRFile::write(const void *buf, S32 nbytes) apr_status_t s = apr_file_write(mFile, buf, &sz); if (s != APR_SUCCESS) { + ll_apr_warn_status(s); return 0; } else @@ -434,6 +490,8 @@ apr_file_t* LLAPRFile::open(const std::string& filename, LLVolatileAPRPool* pool s = apr_file_open(&file_handle, filename.c_str(), flags, APR_OS_DEFAULT, pool->getVolatileAPRPool()); if (s != APR_SUCCESS || !file_handle) { + ll_apr_warn_status(s); + LL_WARNS("APR") << " Attempting to open filename: " << filename << LL_ENDL; file_handle = NULL ; close(file_handle, pool) ; return NULL; @@ -464,6 +522,7 @@ S32 LLAPRFile::seek(apr_file_t* file_handle, apr_seek_where_t where, S32 offset) } if (s != APR_SUCCESS) { + ll_apr_warn_status(s); return -1; } else @@ -501,6 +560,8 @@ S32 LLAPRFile::readEx(const std::string& filename, void *buf, S32 offset, S32 nb apr_status_t s = apr_file_read(file_handle, buf, &bytes_read); if (s != APR_SUCCESS) { + LL_WARNS("APR") << " Attempting to read filename: " << filename << LL_ENDL; + ll_apr_warn_status(s); bytes_read = 0; } else @@ -549,6 +610,8 @@ S32 LLAPRFile::writeEx(const std::string& filename, void *buf, S32 offset, S32 n apr_status_t s = apr_file_write(file_handle, buf, &bytes_written); if (s != APR_SUCCESS) { + LL_WARNS("APR") << " Attempting to write filename: " << filename << LL_ENDL; + ll_apr_warn_status(s); bytes_written = 0; } else @@ -575,8 +638,8 @@ bool LLAPRFile::remove(const std::string& filename, LLVolatileAPRPool* pool) if (s != APR_SUCCESS) { - LL_DEBUGS("APR") << "LLAPRFile::remove failed on file: " << filename << LL_ENDL; ll_apr_warn_status(s); + LL_WARNS("APR") << " Attempting to remove filename: " << filename << LL_ENDL; return false; } return true; @@ -593,8 +656,8 @@ bool LLAPRFile::rename(const std::string& filename, const std::string& newname, if (s != APR_SUCCESS) { - LL_DEBUGS("APR") << "LLAPRFile::rename failed on file: " << filename << LL_ENDL; ll_apr_warn_status(s); + LL_WARNS("APR") << " Attempting to rename filename: " << filename << LL_ENDL; return false; } return true; @@ -667,8 +730,8 @@ bool LLAPRFile::makeDir(const std::string& dirname, LLVolatileAPRPool* pool) if (s != APR_SUCCESS) { - LL_DEBUGS("APR") << "LLAPRFile::makeDir failed on file: " << dirname << LL_ENDL; ll_apr_warn_status(s); + LL_WARNS("APR") << " Attempting to make directory: " << dirname << LL_ENDL; return false; } return true; @@ -685,8 +748,8 @@ bool LLAPRFile::removeDir(const std::string& dirname, LLVolatileAPRPool* pool) if (s != APR_SUCCESS) { - LL_DEBUGS("APR") << "LLAPRFile::removeDir failed on file: " << dirname << LL_ENDL; ll_apr_warn_status(s); + LL_WARNS("APR") << " Attempting to remove directory: " << dirname << LL_ENDL; return false; } return true; diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h index 63130a89fcd..a1a4c6db4a9 100644 --- a/indra/llcommon/llapr.h +++ b/indra/llcommon/llapr.h @@ -70,9 +70,9 @@ class LLAPRPool { public: LLAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE) ; - ~LLAPRPool() ; + virtual ~LLAPRPool() ; - apr_pool_t* getAPRPool() ; + virtual apr_pool_t* getAPRPool() ; apr_status_t getStatus() {return mStatus ; } protected: @@ -95,18 +95,21 @@ class LLAPRPool class LLVolatileAPRPool : public LLAPRPool { public: - LLVolatileAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE); - ~LLVolatileAPRPool(){} + LLVolatileAPRPool(BOOL is_local = TRUE, apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE); + virtual ~LLVolatileAPRPool(); - apr_pool_t* getVolatileAPRPool() ; - + /*virtual*/ apr_pool_t* getAPRPool() ; //define this virtual function to avoid any mistakenly calling LLAPRPool::getAPRPool(). + apr_pool_t* getVolatileAPRPool() ; void clearVolatileAPRPool() ; BOOL isFull() ; - BOOL isEmpty() {return !mNumActiveRef ;} + private: S32 mNumActiveRef ; //number of active pointers pointing to the apr_pool. - S32 mNumTotalRef ; //number of total pointers pointing to the apr_pool since last creating. + S32 mNumTotalRef ; //number of total pointers pointing to the apr_pool since last creating. + + apr_thread_mutex_t *mMutexp; + apr_pool_t *mMutexPool; } ; /** @@ -192,18 +195,21 @@ typedef LLAtomic32<S32> LLAtomicS32; // 1, a temperary pool passed to an APRFile function, which is used within this function and only once. // 2, a global pool. // -class LLAPRFile + +class LLAPRFile : boost::noncopyable { + // make this non copyable since a copy closes the file private: apr_file_t* mFile ; LLVolatileAPRPool *mCurrentFilePoolp ; //currently in use apr_pool, could be one of them: sAPRFilePoolp, or a temp pool. public: LLAPRFile() ; + LLAPRFile(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool = NULL); ~LLAPRFile() ; - - apr_status_t open(LLVolatileAPRPool* pool, const std::string& filename, apr_int32_t flags, S32* sizep = NULL); - apr_status_t open(const std::string& filename, apr_int32_t flags, apr_pool_t* pool = NULL, S32* sizep = NULL); + + apr_status_t open(const std::string& filename, apr_int32_t flags, LLVolatileAPRPool* pool = NULL, S32* sizep = NULL); + apr_status_t open(const std::string& filename, apr_int32_t flags, BOOL use_global_pool); //use gAPRPoolp. apr_status_t close() ; // Returns actual offset, -1 if seek fails @@ -217,8 +223,8 @@ class LLAPRFile apr_file_t* getFileHandle() {return mFile;} private: - apr_pool_t* getAPRFilePool(apr_pool_t* pool) ; - + apr_pool_t* getAPRFilePool(apr_pool_t* pool) ; + // //******************************************************************************************************************************* //static components diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp index 3db5c365454..395d2988874 100644 --- a/indra/llcommon/llqueuedthread.cpp +++ b/indra/llcommon/llqueuedthread.cpp @@ -42,7 +42,8 @@ LLQueuedThread::LLQueuedThread(const std::string& name, bool threaded) : LLThread(name), mThreaded(threaded), mIdleThread(TRUE), - mNextHandle(0) + mNextHandle(0), + mStarted(FALSE) { if (mThreaded) { @@ -53,6 +54,10 @@ LLQueuedThread::LLQueuedThread(const std::string& name, bool threaded) : // MAIN THREAD LLQueuedThread::~LLQueuedThread() { + if (!mThreaded) + { + endThread(); + } shutdown(); // ~LLThread() will be called here } @@ -106,6 +111,11 @@ void LLQueuedThread::shutdown() // virtual S32 LLQueuedThread::update(U32 max_time_ms) { + if (!mStarted) + { + startThread(); + mStarted = TRUE; + } return updateQueue(max_time_ms); } @@ -452,26 +462,12 @@ S32 LLQueuedThread::processNextRequest() } } - S32 res; S32 pending = getPending(); - if (pending == 0) - { - if (isQuitting()) - { - res = -1; // exit thread - } - else - { - res = 0; - } - } - else - { - res = pending; - } - return res; + + return pending; } +// virtual bool LLQueuedThread::runCondition() { // mRunCondition must be locked here @@ -481,35 +477,53 @@ bool LLQueuedThread::runCondition() return true; } +// virtual void LLQueuedThread::run() { + // call checPause() immediately so we don't try to do anything before the class is fully constructed + checkPause(); + startThread(); + mStarted = TRUE; + while (1) { // this will block on the condition until runCondition() returns true, the thread is unpaused, or the thread leaves the RUNNING state. checkPause(); - if(isQuitting()) + if (isQuitting()) + { + endThread(); break; - - //llinfos << "QUEUED THREAD RUNNING, queue size = " << mRequestQueue.size() << llendl; + } mIdleThread = FALSE; + + threadedUpdate(); int res = processNextRequest(); if (res == 0) { mIdleThread = TRUE; + ms_sleep(1); } - - if (res < 0) // finished working and want to exit - { - break; - } - //LLThread::yield(); // thread should yield after each request } + llinfos << "LLQueuedThread " << mName << " EXITING." << llendl; +} - llinfos << "QUEUED THREAD " << mName << " EXITING." << llendl; +// virtual +void LLQueuedThread::startThread() +{ +} + +// virtual +void LLQueuedThread::endThread() +{ +} + +// virtual +void LLQueuedThread::threadedUpdate() +{ } //============================================================================ diff --git a/indra/llcommon/llqueuedthread.h b/indra/llcommon/llqueuedthread.h index 3ba43e1e070..bcd154da0b5 100644 --- a/indra/llcommon/llqueuedthread.h +++ b/indra/llcommon/llqueuedthread.h @@ -165,6 +165,9 @@ class LLQueuedThread : public LLThread virtual bool runCondition(void); virtual void run(void); + virtual void startThread(void); + virtual void endThread(void); + virtual void threadedUpdate(void); protected: handle_t generateHandle(); @@ -199,6 +202,7 @@ class LLQueuedThread : public LLThread protected: BOOL mThreaded; // if false, run on main thread and do updates during update() + BOOL mStarted; // required when mThreaded is false to call startThread() from update() LLAtomic32<BOOL> mIdleThread; // request queue is empty (or we are quitting) and the thread is idle typedef std::set<QueuedRequest*, queued_request_less> request_queue_t; diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h index f25339f48d1..1470dca14c5 100644 --- a/indra/llcommon/llthread.h +++ b/indra/llcommon/llthread.h @@ -33,9 +33,7 @@ #ifndef LL_LLTHREAD_H #define LL_LLTHREAD_H -#include "llapr.h" #include "llapp.h" - #include "apr_thread_cond.h" class LLThread; diff --git a/indra/llcommon/llworkerthread.cpp b/indra/llcommon/llworkerthread.cpp index 5dda6007553..82c736266db 100644 --- a/indra/llcommon/llworkerthread.cpp +++ b/indra/llcommon/llworkerthread.cpp @@ -201,6 +201,7 @@ LLWorkerClass::~LLWorkerClass() { llassert_always(!(mWorkFlags & WCF_WORKING)); llassert_always(mWorkFlags & WCF_DELETE_REQUESTED); + llassert_always(!mMutex.isLocked()); if (mRequestHandle != LLWorkerThread::nullHandle()) { LLWorkerThread::WorkRequest* workreq = (LLWorkerThread::WorkRequest*)mWorkerThread->getRequest(mRequestHandle); diff --git a/indra/llcommon/llworkerthread.h b/indra/llcommon/llworkerthread.h index 19407f44638..4a4cd6c85f8 100644 --- a/indra/llcommon/llworkerthread.h +++ b/indra/llcommon/llworkerthread.h @@ -52,6 +52,7 @@ class LLWorkerClass; class LLWorkerThread : public LLQueuedThread { + friend class LLWorkerClass; public: class WorkRequest : public LLQueuedThread::QueuedRequest { @@ -92,8 +93,11 @@ class LLWorkerThread : public LLQueuedThread handle_t addWorkRequest(LLWorkerClass* workerclass, S32 param, U32 priority = PRIORITY_NORMAL); - void deleteWorker(LLWorkerClass* workerclass); // schedule for deletion S32 getNumDeletes() { return (S32)mDeleteList.size(); } // debug + +private: + void deleteWorker(LLWorkerClass* workerclass); // schedule for deletion + }; //============================================================================ diff --git a/indra/llimage/CMakeLists.txt b/indra/llimage/CMakeLists.txt index 0635ddd5f5c..22be4078a1b 100644 --- a/indra/llimage/CMakeLists.txt +++ b/indra/llimage/CMakeLists.txt @@ -3,6 +3,7 @@ project(llimage) include(00-Common) +include(LLAddBuildTest) include(LLCommon) include(LLImage) include(LLMath) @@ -59,3 +60,6 @@ target_link_libraries(llimage ${PNG_LIBRARIES} ${ZLIB_LIBRARIES} ) + +# Add tests +#ADD_BUILD_TEST(llimageworker llimage) diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 9bbc55509dd..9cb005898d1 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -55,13 +55,9 @@ std::string LLImage::sLastErrorMessage; LLMutex* LLImage::sMutex = NULL; //static -void LLImage::initClass(LLWorkerThread* workerthread) +void LLImage::initClass() { sMutex = new LLMutex(NULL); - if (workerthread) - { - LLImageWorker::initImageWorker(workerthread); - } LLImageJ2C::openDSO(); } @@ -69,7 +65,6 @@ void LLImage::initClass(LLWorkerThread* workerthread) void LLImage::cleanupClass() { LLImageJ2C::closeDSO(); - LLImageWorker::cleanupImageWorker(); delete sMutex; sMutex = NULL; } @@ -316,6 +311,21 @@ void LLImageRaw::deleteData() LLImageBase::deleteData(); } +void LLImageRaw::setDataAndSize(U8 *data, S32 width, S32 height, S8 components) +{ + if(data == getData()) + { + return ; + } + + deleteData(); + + LLImageBase::setSize(width, height, components) ; + LLImageBase::setDataAndSize(data, width * height * components) ; + + sGlobalRawMemory += getDataSize(); +} + BOOL LLImageRaw::resize(U16 width, U16 height, S8 components) { if ((getWidth() == width) && (getHeight() == height) && (getComponents() == components)) @@ -816,6 +826,51 @@ void LLImageRaw::copyScaled( LLImageRaw* src ) } } +//scale down image by not blending a pixel with its neighbors. +BOOL LLImageRaw::scaleDownWithoutBlending( S32 new_width, S32 new_height) +{ + LLMemType mt1(mMemType); + + S8 c = getComponents() ; + llassert((1 == c) || (3 == c) || (4 == c) ); + + S32 old_width = getWidth(); + S32 old_height = getHeight(); + + S32 new_data_size = old_width * new_height * c ; + llassert_always(new_data_size > 0); + + F32 ratio_x = (F32)old_width / new_width ; + F32 ratio_y = (F32)old_height / new_height ; + if( ratio_x < 1.0f || ratio_y < 1.0f ) + { + return TRUE; // Nothing to do. + } + ratio_x -= 1.0f ; + ratio_y -= 1.0f ; + + U8* new_data = new U8[new_data_size] ; + llassert_always(new_data != NULL) ; + + U8* old_data = getData() ; + S32 i, j, k, s, t; + for(i = 0, s = 0, t = 0 ; i < new_height ; i++) + { + for(j = 0 ; j < new_width ; j++) + { + for(k = 0 ; k < c ; k++) + { + new_data[s++] = old_data[t++] ; + } + t += (S32)(ratio_x * c + 0.1f) ; + } + t += (S32)(ratio_y * old_width * c + 0.1f) ; + } + + setDataAndSize(new_data, new_width, new_height, c) ; + + return TRUE ; +} BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data ) { diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index 81085531072..686f5838865 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -50,7 +50,8 @@ const S32 MAX_IMAGE_AREA = MAX_IMAGE_SIZE * MAX_IMAGE_SIZE; const S32 MAX_IMAGE_COMPONENTS = 8; const S32 MAX_IMAGE_DATA_SIZE = MAX_IMAGE_AREA * MAX_IMAGE_COMPONENTS; -// Note! These CANNOT be changed without invalidating the viewer VFS files, I think? +// Note! These CANNOT be changed without modifying simulator code +// *TODO: change both to 1024 when SIM texture fetching is deprecated const S32 FIRST_PACKET_SIZE = 600; const S32 MAX_IMG_PACKET_SIZE = 1000; @@ -61,7 +62,6 @@ const S32 MAX_IMG_PACKET_SIZE = 1000; class LLImageFormatted; class LLImageRaw; class LLColor4U; -class LLWorkerThread; typedef enum e_image_codec { @@ -82,7 +82,7 @@ typedef enum e_image_codec class LLImage { public: - static void initClass(LLWorkerThread* workerthread); + static void initClass(); static void cleanupClass(); static const std::string& getLastError(); @@ -131,7 +131,7 @@ class LLImageBase : public LLThreadSafeRefCount protected: // special accessor to allow direct setting of mData and mDataSize by LLImageFormatted - void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; }; + void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; } public: static void generateMip(const U8 *indata, U8* mipdata, int width, int height, S32 nchannels); @@ -192,6 +192,7 @@ class LLImageRaw : public LLImageBase void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE); void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE); BOOL scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE ); + BOOL scaleDownWithoutBlending( S32 new_width, S32 new_height) ; // Fill the buffer with a constant color void fill( const LLColor4U& color ); @@ -240,6 +241,8 @@ class LLImageRaw : public LLImageBase U8 fastFractionalMult(U8 a,U8 b); + void setDataAndSize(U8 *data, S32 width, S32 height, S8 components) ; + public: static S32 sGlobalRawMemory; static S32 sRawImageCount; @@ -310,7 +313,7 @@ class LLImageFormatted : public LLImageBase protected: S8 mCodec; S8 mDecoding; - S8 mDecoded; + S8 mDecoded; // unused, but changing LLImage layout requires recompiling static Mac/Linux libs. 2009-01-30 JC S8 mDiscardLevel; public: diff --git a/indra/llimage/llimagedxt.cpp b/indra/llimage/llimagedxt.cpp index 1ce4517a0d1..0aa6840ff6a 100644 --- a/indra/llimage/llimagedxt.cpp +++ b/indra/llimage/llimagedxt.cpp @@ -264,6 +264,8 @@ void LLImageDXT::setFormat() // virtual BOOL LLImageDXT::decode(LLImageRaw* raw_image, F32 time) { + // *TODO: Test! This has been tweaked since its intial inception, + // but we don't use it any more! llassert_always(raw_image); if (mFileFormat >= FORMAT_DXT1 && mFileFormat <= FORMAT_DXR5) @@ -274,8 +276,17 @@ BOOL LLImageDXT::decode(LLImageRaw* raw_image, F32 time) S32 width = getWidth(), height = getHeight(); S32 ncomponents = getComponents(); + U8* data = NULL; + if (mDiscardLevel >= 0) + { + data = getData() + getMipOffset(mDiscardLevel); + calcDiscardWidthHeight(mDiscardLevel, mFileFormat, width, height); + } + else + { + data = getData() + getMipOffset(0); + } S32 image_size = formatBytes(mFileFormat, width, height); - U8* data = getData() + getMipOffset(0); if ((!getData()) || (data + image_size > getData() + getDataSize())) { @@ -300,10 +311,8 @@ BOOL LLImageDXT::getMipData(LLPointer<LLImageRaw>& raw, S32 discard) llerrs << "Request for invalid discard level" << llendl; } U8* data = getData() + getMipOffset(discard); - // I'm not sure these are the correct initial values for height and width, - // but previously they were being used uninitialized. JC - S32 width = raw->getWidth(); - S32 height = raw->getHeight(); + S32 width = 0; + S32 height = 0; calcDiscardWidthHeight(discard, mFileFormat, width, height); raw = new LLImageRaw(data, width, height, getComponents()); return TRUE; diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index 363486fb9c0..49017cc508a 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -277,6 +277,7 @@ BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time) } +// Returns TRUE to mean done, whether successful or not. BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 first_channel, S32 max_channel_count ) { LLMemType mt1(mMemType); @@ -289,7 +290,7 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir if (!getData() || (getDataSize() < 16)) { setLastError("LLImageJ2C uninitialized"); - res = FALSE; + res = TRUE; // done } else { @@ -342,7 +343,7 @@ BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text, //static S32 LLImageJ2C::calcHeaderSizeJ2C() { - return 600; //2048; // ??? hack... just needs to be >= actual header size... + return FIRST_PACKET_SIZE; // Hack. just needs to be >= actual header size... } //static diff --git a/indra/llimage/llimagejpeg.cpp b/indra/llimage/llimagejpeg.cpp index fa0dd3ff050..79ea79cc070 100644 --- a/indra/llimage/llimagejpeg.cpp +++ b/indra/llimage/llimagejpeg.cpp @@ -188,6 +188,7 @@ void LLImageJPEG::decodeTermSource (j_decompress_ptr cinfo) } +// Returns true when done, whether or not decode was successful. BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time) { llassert_always(raw_image); @@ -198,7 +199,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time) if (!getData() || (0 == getDataSize())) { setLastError("LLImageJPEG trying to decode an image with no data!"); - return FALSE; + return TRUE; // done } S32 row_stride = 0; @@ -226,7 +227,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time) if(setjmp(sSetjmpBuffer)) { jpeg_destroy_decompress(&cinfo); - return FALSE; + return TRUE; // done } try { @@ -320,7 +321,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time) catch (int) { jpeg_destroy_decompress(&cinfo); - return FALSE; + return TRUE; // done } // Check to see whether any corrupt-data warnings occurred @@ -328,7 +329,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time) { // TODO: extract the warning to find out what went wrong. setLastError( "Unable to decode JPEG image."); - return FALSE; + return TRUE; // done } return TRUE; diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp index 532e996188d..86d41515e7c 100644 --- a/indra/llimage/llimageworker.cpp +++ b/indra/llimage/llimageworker.cpp @@ -37,152 +37,138 @@ //---------------------------------------------------------------------------- -//static -LLWorkerThread* LLImageWorker::sWorkerThread = NULL; -S32 LLImageWorker::sCount = 0; +// MAIN THREAD +LLImageDecodeThread::LLImageDecodeThread(bool threaded) + : LLQueuedThread("imagedecode", threaded) +{ + mCreationMutex = new LLMutex(getAPRPool()); +} -//static -void LLImageWorker::initImageWorker(LLWorkerThread* workerthread) +// MAIN THREAD +// virtual +S32 LLImageDecodeThread::update(U32 max_time_ms) { - sWorkerThread = workerthread; + LLMutexLock lock(mCreationMutex); + for (creation_list_t::iterator iter = mCreationList.begin(); + iter != mCreationList.end(); ++iter) + { + creation_info& info = *iter; + ImageRequest* req = new ImageRequest(info.handle, info.image, + info.priority, info.discard, info.needs_aux, + info.responder); + addRequest(req); + } + mCreationList.clear(); + S32 res = LLQueuedThread::update(max_time_ms); + return res; } -//static -void LLImageWorker::cleanupImageWorker() +LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage(LLImageFormatted* image, + U32 priority, S32 discard, BOOL needs_aux, Responder* responder) +{ + LLMutexLock lock(mCreationMutex); + handle_t handle = generateHandle(); + mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder)); + return handle; +} + +// Used by unit test only +// Returns the size of the mutex guarded list as an indication of sanity +S32 LLImageDecodeThread::tut_size() +{ + LLMutexLock lock(mCreationMutex); + S32 res = mCreationList.size(); + return res; +} + +LLImageDecodeThread::Responder::~Responder() { } //---------------------------------------------------------------------------- -LLImageWorker::LLImageWorker(LLImageFormatted* image, U32 priority, - S32 discard, - LLPointer<LLResponder> responder) - : LLWorkerClass(sWorkerThread, "Image"), +LLImageDecodeThread::ImageRequest::ImageRequest(handle_t handle, LLImageFormatted* image, + U32 priority, S32 discard, BOOL needs_aux, + LLImageDecodeThread::Responder* responder) + : LLQueuedThread::QueuedRequest(handle, priority, FLAG_AUTO_COMPLETE), mFormattedImage(image), - mDecodedType(-1), mDiscardLevel(discard), - mPriority(priority), + mNeedsAux(needs_aux), + mDecodedRaw(FALSE), + mDecodedAux(FALSE), mResponder(responder) { - ++sCount; } -LLImageWorker::~LLImageWorker() +LLImageDecodeThread::ImageRequest::~ImageRequest() { - mDecodedImage = NULL; + mDecodedImageRaw = NULL; + mDecodedImageAux = NULL; mFormattedImage = NULL; - --sCount; } //---------------------------------------------------------------------------- -//virtual, main thread -void LLImageWorker::startWork(S32 param) -{ - llassert_always(mDecodedImage.isNull()); - mDecodedType = -1; -} -bool LLImageWorker::doWork(S32 param) +// Returns true when done, whether or not decode was successful. +bool LLImageDecodeThread::ImageRequest::processRequest() { - bool decoded = false; - if(mDecodedImage.isNull()) + const F32 decode_time_slice = .1f; + bool done = true; + if (!mDecodedRaw && mFormattedImage.notNull()) { - if (!mFormattedImage->updateData()) - { - mDecodedType = -2; // failed - return true; - } - if (mDiscardLevel >= 0) + // Decode primary channels + if (mDecodedImageRaw.isNull()) { - mFormattedImage->setDiscardLevel(mDiscardLevel); - } - if (!(mFormattedImage->getWidth() * mFormattedImage->getHeight() * mFormattedImage->getComponents())) - { - decoded = true; // failed - } - else - { - mDecodedImage = new LLImageRaw(); // allow possibly smaller size set during decoding + // parse formatted header + if (!mFormattedImage->updateData()) + { + return true; // done (failed) + } + if (!(mFormattedImage->getWidth() * mFormattedImage->getHeight() * mFormattedImage->getComponents())) + { + return true; // done (failed) + } + if (mDiscardLevel >= 0) + { + mFormattedImage->setDiscardLevel(mDiscardLevel); + } + mDecodedImageRaw = new LLImageRaw(mFormattedImage->getWidth(), + mFormattedImage->getHeight(), + mFormattedImage->getComponents()); } + done = mFormattedImage->decode(mDecodedImageRaw, decode_time_slice); // 1ms + mDecodedRaw = done; } - if (!decoded) + if (done && mNeedsAux && !mDecodedAux && mFormattedImage.notNull()) { - if (param == 0) - { - // Decode primary channels - decoded = mFormattedImage->decode(mDecodedImage, .1f); // 1ms - } - else + // Decode aux channel + if (!mDecodedImageAux) { - // Decode aux channel - decoded = mFormattedImage->decodeChannels(mDecodedImage, .1f, param, param); // 1ms + mDecodedImageAux = new LLImageRaw(mFormattedImage->getWidth(), + mFormattedImage->getHeight(), + 1); } + done = mFormattedImage->decodeChannels(mDecodedImageAux, decode_time_slice, 4, 4); // 1ms + mDecodedAux = done; } - if (decoded) - { - // Call the callback immediately; endWork doesn't get called until ckeckWork - if (mResponder.notNull()) - { - bool success = (!wasAborted() && mDecodedImage.notNull() && mDecodedImage->getDataSize() != 0); - mResponder->completed(success); - } - } - return decoded; -} -void LLImageWorker::endWork(S32 param, bool aborted) -{ - if (mDecodedType != -2) - { - mDecodedType = aborted ? -2 : param; - } + return done; } -//---------------------------------------------------------------------------- - - -BOOL LLImageWorker::requestDecodedAuxData(LLPointer<LLImageRaw>& raw, S32 channel, S32 discard) +void LLImageDecodeThread::ImageRequest::finishRequest(bool completed) { - // For most codecs, only mDiscardLevel data is available. - // (see LLImageDXT for exception) - if (discard >= 0 && discard != mFormattedImage->getDiscardLevel()) - { - llerrs << "Request for invalid discard level" << llendl; - } - checkWork(); - if (mDecodedType == -2) + if (mResponder.notNull()) { - return TRUE; // aborted, done - } - if (mDecodedType != channel) - { - if (!haveWork()) - { - addWork(channel, mPriority); - } - return FALSE; - } - else - { - llassert_always(!haveWork()); - llassert_always(mDecodedType == channel); - raw = mDecodedImage; // smart pointer acquires ownership of data - mDecodedImage = NULL; - return TRUE; + bool success = completed && mDecodedRaw && (!mNeedsAux || mDecodedAux); + mResponder->completed(success, mDecodedImageRaw, mDecodedImageAux); } + // Will automatically be deleted } -BOOL LLImageWorker::requestDecodedData(LLPointer<LLImageRaw>& raw, S32 discard) +// Used by unit test only +// Checks that a responder exists for this instance so that something can happen when completion is reached +bool LLImageDecodeThread::ImageRequest::tut_isOK() { - if (mFormattedImage->getCodec() == IMG_CODEC_DXT) - { - // special case - LLImageDXT* imagedxt = (LLImageDXT*)((LLImageFormatted*)mFormattedImage); - return imagedxt->getMipData(raw, discard); - } - else - { - return requestDecodedAuxData(raw, 0, discard); - } + return mResponder.notNull(); } diff --git a/indra/llimage/llimageworker.h b/indra/llimage/llimageworker.h index 0d66695d6ec..6a5b86a2779 100644 --- a/indra/llimage/llimageworker.h +++ b/indra/llimage/llimageworker.h @@ -37,49 +37,72 @@ #include "llpointer.h" #include "llworkerthread.h" -class LLImageWorker : public LLWorkerClass +class LLImageDecodeThread : public LLQueuedThread { public: - static void initImageWorker(LLWorkerThread* workerthread); - static void cleanupImageWorker(); - -public: - static LLWorkerThread* getWorkerThread() { return sWorkerThread; } - - // LLWorkerThread -public: - LLImageWorker(LLImageFormatted* image, U32 priority, S32 discard, - LLPointer<LLResponder> responder); - ~LLImageWorker(); - - // called from WORKER THREAD, returns TRUE if done - /*virtual*/ bool doWork(S32 param); - - BOOL requestDecodedData(LLPointer<LLImageRaw>& raw, S32 discard = -1); - BOOL requestDecodedAuxData(LLPointer<LLImageRaw>& raw, S32 channel, S32 discard = -1); - void releaseDecodedData(); - void cancelDecode(); + class Responder : public LLThreadSafeRefCount + { + protected: + virtual ~Responder(); + public: + virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux) = 0; + }; -private: - // called from MAIN THREAD - /*virtual*/ void startWork(S32 param); // called from addWork() - /*virtual*/ void endWork(S32 param, bool aborted); // called from doWork() + class ImageRequest : public LLQueuedThread::QueuedRequest + { + protected: + virtual ~ImageRequest(); // use deleteRequest() + + public: + ImageRequest(handle_t handle, LLImageFormatted* image, + U32 priority, S32 discard, BOOL needs_aux, + LLImageDecodeThread::Responder* responder); -protected: - LLPointer<LLImageFormatted> mFormattedImage; - LLPointer<LLImageRaw> mDecodedImage; - S32 mDecodedType; - S32 mDiscardLevel; + /*virtual*/ bool processRequest(); + /*virtual*/ void finishRequest(bool completed); -private: - U32 mPriority; - LLPointer<LLResponder> mResponder; + // Used by unit tests to check the consitency of the request instance + bool tut_isOK(); + + private: + // input + LLPointer<LLImageFormatted> mFormattedImage; + S32 mDiscardLevel; + BOOL mNeedsAux; + // output + LLPointer<LLImageRaw> mDecodedImageRaw; + LLPointer<LLImageRaw> mDecodedImageAux; + BOOL mDecodedRaw; + BOOL mDecodedAux; + LLPointer<LLImageDecodeThread::Responder> mResponder; + }; -protected: - static LLWorkerThread* sWorkerThread; - public: - static S32 sCount; + LLImageDecodeThread(bool threaded = true); + handle_t decodeImage(LLImageFormatted* image, + U32 priority, S32 discard, BOOL needs_aux, + Responder* responder); + S32 update(U32 max_time_ms); + + // Used by unit tests to check the consistency of the thread instance + S32 tut_size(); + +private: + struct creation_info + { + handle_t handle; + LLPointer<LLImageFormatted> image; + U32 priority; + S32 discard; + BOOL needs_aux; + LLPointer<Responder> responder; + creation_info(handle_t h, LLImageFormatted* i, U32 p, S32 d, BOOL aux, Responder* r) + : handle(h), image(i), priority(p), discard(d), needs_aux(aux), responder(r) + {} + }; + typedef std::list<creation_info> creation_list_t; + creation_list_t mCreationList; + LLMutex* mCreationMutex; }; #endif diff --git a/indra/llimage/tests/llimageworker_test.cpp b/indra/llimage/tests/llimageworker_test.cpp new file mode 100644 index 00000000000..cc44696a453 --- /dev/null +++ b/indra/llimage/tests/llimageworker_test.cpp @@ -0,0 +1,260 @@ +/** + * @file llimageworker_test.cpp + * @author Merov Linden + * @date 2009-04-28 + * + * $LicenseInfo:firstyear=2006&license=viewergpl$ + * + * Copyright (c) 2006-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +// Precompiled header: almost always required for newview cpp files +#include <list> +#include <map> +#include <algorithm> +// Class to test +#include "../llimageworker.h" +// For timer class +#include "../llcommon/lltimer.h" +// Tut header +#include "../test/lltut.h" + +// ------------------------------------------------------------------------------------------- +// Stubbing: Declarations required to link and run the class being tested +// Notes: +// * Add here stubbed implementation of the few classes and methods used in the class to be tested +// * Add as little as possible (let the link errors guide you) +// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code) +// * A simulator for a class can be implemented here. Please comment and document thoroughly. + +LLImageBase::LLImageBase() {} +LLImageBase::~LLImageBase() {} +void LLImageBase::dump() { } +void LLImageBase::sanityCheck() { } +void LLImageBase::deleteData() { } +U8* LLImageBase::allocateData(S32 size) { return NULL; } +U8* LLImageBase::reallocateData(S32 size) { return NULL; } + +LLImageRaw::LLImageRaw(U16 width, U16 height, S8 components) { } +LLImageRaw::~LLImageRaw() { } +void LLImageRaw::deleteData() { } +U8* LLImageRaw::allocateData(S32 size) { return NULL; } +U8* LLImageRaw::reallocateData(S32 size) { return NULL; } + +// End Stubbing +// ------------------------------------------------------------------------------------------- + +// ------------------------------------------------------------------------------------------- +// TUT +// ------------------------------------------------------------------------------------------- + +namespace tut +{ + // Test wrapper declarations + + // Note: We derive the responder class for 2 reasons: + // 1. It's a pure virtual class and we can't compile without completed() being implemented + // 2. We actually need a responder to test that the thread work test completed + // We implement this making no assumption on what's done in the thread or worker + // though, just that the responder's completed() method is called in the end. + // Note on responders: responders are ref counted and *will* be deleted by the request they are + // attached to when the queued request is deleted. The recommended way of using them is to + // create them when creating a request, put a callback method in completed() and not rely on + // anything to survive in the responder object once completed() has been called. Let the request + // do the deletion and clean up itself. + class responder_test : public LLImageDecodeThread::Responder + { + public: + responder_test(bool* res) + { + done = res; + *done = false; + } + virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux) + { + *done = true; + } + private: + // This is what can be thought of as the minimal implementation of a responder + // Done will be switched to true when completed() is called and can be tested + // outside the responder. A better way of doing this is to store a callback here. + bool* done; + }; + + // Test wrapper declaration : decode thread + struct imagedecodethread_test + { + // Instance to be tested + LLImageDecodeThread* mThread; + + // Constructor and destructor of the test wrapper + imagedecodethread_test() + { + mThread = NULL; + } + ~imagedecodethread_test() + { + delete mThread; + } + }; + + // Test wrapper declaration : image worker + // Note: this class is not meant to be instantiated outside an LLImageDecodeThread instance + // but it's not a bad idea to get its public API a good shake as part of a thorough unit test set. + // Some gotcha with the destructor though (see below). + struct imagerequest_test + { + // Instance to be tested + LLImageDecodeThread::ImageRequest* mRequest; + bool done; + + // Constructor and destructor of the test wrapper + imagerequest_test() + { + done = false; + mRequest = new LLImageDecodeThread::ImageRequest(0, 0, + LLQueuedThread::PRIORITY_NORMAL, 0, FALSE, + new responder_test(&done)); + } + ~imagerequest_test() + { + // We should delete the object *but*, because its destructor is protected, that cannot be + // done from outside an LLImageDecodeThread instance... So we leak memory here... It's fine... + //delete mRequest; + } + }; + + // Tut templating thingamagic: test group, object and test instance + typedef test_group<imagedecodethread_test> imagedecodethread_t; + typedef imagedecodethread_t::object imagedecodethread_object_t; + tut::imagedecodethread_t tut_imagedecodethread("imagedecodethread"); + + typedef test_group<imagerequest_test> imagerequest_t; + typedef imagerequest_t::object imagerequest_object_t; + tut::imagerequest_t tut_imagerequest("imagerequest"); + + // --------------------------------------------------------------------------------------- + // Test functions + // Notes: + // * Test as many as you possibly can without requiring a full blown simulation of everything + // * The tests are executed in sequence so the test instance state may change between calls + // * Remember that you cannot test private methods with tut + // --------------------------------------------------------------------------------------- + + // --------------------------------------------------------------------------------------- + // Test the LLImageDecodeThread interface + // --------------------------------------------------------------------------------------- + // + // Note on Unit Testing Queued Thread Classes + // + // Since methods on such a class are called on a separate loop and that we can't insert tut + // ensure() calls in there, we exercise the class with 2 sets of tests: + // - 1: Test as a single threaded instance: We declare the class but ask for no thread + // to be spawned (easy with LLThreads since there's a boolean argument on the constructor + // just for that). We can then unit test each public method like we do on a normal class. + // - 2: Test as a threaded instance: We let the thread launch and check that its external + // behavior is as expected (i.e. it runs, can accept a work order and processes + // it). Typically though there's no guarantee that this exercises all the methods of the + // class which is why we also need the previous "non threaded" set of unit tests for + // complete coverage. + // + // --------------------------------------------------------------------------------------- + + template<> template<> + void imagedecodethread_object_t::test<1>() + { + // Test a *non threaded* instance of the class + mThread = new LLImageDecodeThread(false); + ensure("LLImageDecodeThread: non threaded constructor failed", mThread != NULL); + // Test that we start with an empty list right at creation + ensure("LLImageDecodeThread: non threaded init state incorrect", mThread->tut_size() == 0); + // Insert something in the queue + bool done = false; + LLImageDecodeThread::handle_t decodeHandle = mThread->decodeImage(NULL, LLQueuedThread::PRIORITY_NORMAL, 0, FALSE, new responder_test(&done)); + // Verifies we got a valid handle + ensure("LLImageDecodeThread: non threaded decodeImage(), returned handle is null", decodeHandle != 0); + // Verifies that we do now have something in the queued list + ensure("LLImageDecodeThread: non threaded decodeImage() insertion in threaded list failed", mThread->tut_size() == 1); + // Trigger queue handling "manually" (on a threaded instance, this is done on the thread loop) + S32 res = mThread->update(0); + // Verifies that we successfully handled the list + ensure("LLImageDecodeThread: non threaded update() list handling test failed", res == 0); + // Verifies that the list is now empty + ensure("LLImageDecodeThread: non threaded update() list emptying test failed", mThread->tut_size() == 0); + } + + template<> template<> + void imagedecodethread_object_t::test<2>() + { + // Test a *threaded* instance of the class + mThread = new LLImageDecodeThread(true); + ensure("LLImageDecodeThread: threaded constructor failed", mThread != NULL); + // Test that we start with an empty list right at creation + ensure("LLImageDecodeThread: threaded init state incorrect", mThread->tut_size() == 0); + // Insert something in the queue + bool done = false; + LLImageDecodeThread::handle_t decodeHandle = mThread->decodeImage(NULL, LLQueuedThread::PRIORITY_NORMAL, 0, FALSE, new responder_test(&done)); + // Verifies we get back a valid handle + ensure("LLImageDecodeThread: threaded decodeImage(), returned handle is null", decodeHandle != 0); + // Wait a little so to simulate the main thread doing something on its main loop... + ms_sleep(500); // 500 milliseconds + // Verifies that the responder has *not* been called yet in the meantime + ensure("LLImageDecodeThread: responder creation failed", done == false); + // Ask the thread to update: that means tells the queue to check itself and creates work requests + mThread->update(1); + // Wait till the thread has time to handle the work order (though it doesn't do much per work order...) + const U32 INCREMENT_TIME = 500; // 500 milliseconds + const U32 MAX_TIME = 20 * INCREMENT_TIME; // Do the loop 20 times max, i.e. wait 10 seconds but no more + U32 total_time = 0; + while ((done == false) && (total_time < MAX_TIME)) + { + ms_sleep(INCREMENT_TIME); + total_time += INCREMENT_TIME; + } + // Verifies that the responder has now been called + ensure("LLImageDecodeThread: threaded work unit not processed", done == true); + } + + // --------------------------------------------------------------------------------------- + // Test the LLImageDecodeThread::ImageRequest interface + // --------------------------------------------------------------------------------------- + + template<> template<> + void imagerequest_object_t::test<1>() + { + // Test that we start with a correct request at creation + ensure("LLImageDecodeThread::ImageRequest::ImageRequest() constructor test failed", mRequest->tut_isOK()); + bool res = mRequest->processRequest(); + // Verifies that we processed the request successfully + ensure("LLImageDecodeThread::ImageRequest::processRequest() processing request test failed", res == true); + // Check that we can call the finishing call safely + try { + mRequest->finishRequest(false); + } catch (...) { + fail("LLImageDecodeThread::ImageRequest::finishRequest() test failed"); + } + } +} diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index b8ef92f9a98..df4c618ac10 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -3582,7 +3582,7 @@ S32 LLVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, if (face == -1) // ALL_SIDES { start_face = 0; - end_face = getNumFaces() - 1; + end_face = getNumVolumeFaces() - 1; } else { diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp index b3087bcc3f8..0ab10812006 100644 --- a/indra/llmessage/llassetstorage.cpp +++ b/indra/llmessage/llassetstorage.cpp @@ -64,6 +64,9 @@ const LLUUID CATEGORIZE_LOST_AND_FOUND_ID(std::string("00000000-0000-0000-0000-0 const U64 TOXIC_ASSET_LIFETIME = (120 * 1000000); // microseconds +LLTempAssetStorage::~LLTempAssetStorage() +{ +} ///---------------------------------------------------------------------------- /// LLAssetInfo diff --git a/indra/llmessage/llassetstorage.h b/indra/llmessage/llassetstorage.h index 56adbd5ccfe..83cfdf6110f 100644 --- a/indra/llmessage/llassetstorage.h +++ b/indra/llmessage/llassetstorage.h @@ -204,7 +204,16 @@ typedef std::map<LLUUID,U64,lluuid_less> toxic_asset_map_t; typedef void (*LLGetAssetCallback)(LLVFS *vfs, const LLUUID &asset_id, LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status); -class LLAssetStorage +class LLTempAssetStorage +{ +public: + virtual ~LLTempAssetStorage() =0; + virtual void addTempAssetData(const LLUUID& asset_id, + const LLUUID& agent_id, + const std::string& host_name) = 0; +}; + +class LLAssetStorage : public LLTempAssetStorage { public: // VFS member is public because static child methods need it :( diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index a4af8e989ba..14771ef6dd8 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -220,7 +220,7 @@ class LLCurl::Easy U32 report(CURLcode); void getTransferInfo(LLCurl::TransferInfo* info); - void prepRequest(const std::string& url, ResponderPtr, bool post = false); + void prepRequest(const std::string& url, const std::vector<std::string>& headers, ResponderPtr, bool post = false); const char* getErrorBuffer(); @@ -432,7 +432,9 @@ size_t curlHeaderCallback(void* data, size_t size, size_t nmemb, void* user_data return n; } -void LLCurl::Easy::prepRequest(const std::string& url, ResponderPtr responder, bool post) +void LLCurl::Easy::prepRequest(const std::string& url, + const std::vector<std::string>& headers, + ResponderPtr responder, bool post) { resetState(); @@ -465,8 +467,13 @@ void LLCurl::Easy::prepRequest(const std::string& url, ResponderPtr responder, b { slist_append("Connection: keep-alive"); slist_append("Keep-alive: 300"); + // Accept and other headers + for (std::vector<std::string>::const_iterator iter = headers.begin(); + iter != headers.end(); ++iter) + { + slist_append((*iter).c_str()); + } } - // *FIX: should have ACCEPT headers } //////////////////////////////////////////////////////////////////////////// @@ -676,15 +683,18 @@ LLCurlRequest::LLCurlRequest() : mActiveMulti(NULL), mActiveRequestCount(0) { + mThreadID = LLThread::currentID(); } LLCurlRequest::~LLCurlRequest() { + llassert_always(mThreadID == LLThread::currentID()); for_each(mMultiSet.begin(), mMultiSet.end(), DeletePointer()); } void LLCurlRequest::addMulti() { + llassert_always(mThreadID == LLThread::currentID()); LLCurl::Multi* multi = new LLCurl::Multi(); mMultiSet.insert(multi); mActiveMulti = multi; @@ -714,17 +724,20 @@ bool LLCurlRequest::addEasy(LLCurl::Easy* easy) void LLCurlRequest::get(const std::string& url, LLCurl::ResponderPtr responder) { - getByteRange(url, 0, -1, responder); + getByteRange(url, headers_t(), 0, -1, responder); } -bool LLCurlRequest::getByteRange(const std::string& url, S32 offset, S32 length, LLCurl::ResponderPtr responder) +bool LLCurlRequest::getByteRange(const std::string& url, + const headers_t& headers, + S32 offset, S32 length, + LLCurl::ResponderPtr responder) { LLCurl::Easy* easy = allocEasy(); if (!easy) { return false; } - easy->prepRequest(url, responder); + easy->prepRequest(url, headers, responder); easy->setopt(CURLOPT_HTTPGET, 1); if (length > 0) { @@ -736,14 +749,17 @@ bool LLCurlRequest::getByteRange(const std::string& url, S32 offset, S32 length, return res; } -bool LLCurlRequest::post(const std::string& url, const LLSD& data, LLCurl::ResponderPtr responder) +bool LLCurlRequest::post(const std::string& url, + const headers_t& headers, + const LLSD& data, + LLCurl::ResponderPtr responder) { LLCurl::Easy* easy = allocEasy(); if (!easy) { return false; } - easy->prepRequest(url, responder); + easy->prepRequest(url, headers, responder); LLSDSerialize::toXML(data, easy->getInput()); S32 bytes = easy->getInput().str().length(); @@ -763,6 +779,7 @@ bool LLCurlRequest::post(const std::string& url, const LLSD& data, LLCurl::Respo // Note: call once per frame S32 LLCurlRequest::process() { + llassert_always(mThreadID == LLThread::currentID()); S32 res = 0; for (curlmulti_set_t::iterator iter = mMultiSet.begin(); iter != mMultiSet.end(); ) @@ -782,6 +799,7 @@ S32 LLCurlRequest::process() S32 LLCurlRequest::getQueued() { + llassert_always(mThreadID == LLThread::currentID()); S32 queued = 0; for (curlmulti_set_t::iterator iter = mMultiSet.begin(); iter != mMultiSet.end(); ) @@ -1002,7 +1020,7 @@ void LLCurl::initClass() S32 mutex_count = CRYPTO_num_locks(); for (S32 i=0; i<mutex_count; i++) { - sSSLMutex.push_back(new LLMutex(gAPRPoolp)); + sSSLMutex.push_back(new LLMutex(NULL)); } CRYPTO_set_id_callback(&LLCurl::ssl_thread_id); CRYPTO_set_locking_callback(&LLCurl::ssl_locking_callback); diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h index fbd3077cbf7..32637b200e8 100644 --- a/indra/llmessage/llcurl.h +++ b/indra/llmessage/llcurl.h @@ -188,12 +188,14 @@ namespace boost class LLCurlRequest { public: + typedef std::vector<std::string> headers_t; + LLCurlRequest(); ~LLCurlRequest(); void get(const std::string& url, LLCurl::ResponderPtr responder); - bool getByteRange(const std::string& url, S32 offset, S32 length, LLCurl::ResponderPtr responder); - bool post(const std::string& url, const LLSD& data, LLCurl::ResponderPtr responder); + bool getByteRange(const std::string& url, const headers_t& headers, S32 offset, S32 length, LLCurl::ResponderPtr responder); + bool post(const std::string& url, const headers_t& headers, const LLSD& data, LLCurl::ResponderPtr responder); S32 process(); S32 getQueued(); @@ -207,6 +209,7 @@ class LLCurlRequest curlmulti_set_t mMultiSet; LLCurl::Multi* mActiveMulti; S32 mActiveRequestCount; + U32 mThreadID; // debug }; class LLCurlEasyRequest diff --git a/indra/llmessage/tests/llcurl_stub.cpp b/indra/llmessage/tests/llcurl_stub.cpp index 5dc5932fde9..db5ffaf3eee 100644 --- a/indra/llmessage/tests/llcurl_stub.cpp +++ b/indra/llmessage/tests/llcurl_stub.cpp @@ -20,8 +20,9 @@ */ #include "linden_common.h" +#include "llcurl.h" -LLCurl::Responder::Responder() +LLCurl::Responder::Responder() : mReferenceCount(0) { } diff --git a/indra/llmessage/tests/llhttpclientadapter_test.cpp b/indra/llmessage/tests/llhttpclientadapter_test.cpp index 250fa100b67..7065c9d7e4a 100644 --- a/indra/llmessage/tests/llhttpclientadapter_test.cpp +++ b/indra/llmessage/tests/llhttpclientadapter_test.cpp @@ -50,7 +50,7 @@ std::vector<std::string> put_urls; std::vector<LLSD> put_body; std::vector<boost::intrusive_ptr<LLCurl::Responder> > put_responders; -void LLHTTPClient::put(std::string const &url, LLSD const &body, boost::intrusive_ptr<LLCurl::Responder> responder,float) +void LLHTTPClient::put(const std::string& url, const LLSD& body, boost::intrusive_ptr<LLCurl::Responder> responder, const LLSD& headers, const F32 timeout) { put_urls.push_back(url); put_responders.push_back(responder); diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index e5fea5b995e..f8d7ea00e0c 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -43,7 +43,6 @@ #include "llmath.h" #include "llgl.h" #include "llrender.h" - //---------------------------------------------------------------------------- const F32 MIN_TEXTURE_LIFETIME = 10.f; @@ -60,21 +59,34 @@ std::list<U32> LLImageGL::sDeadTextureList; BOOL LLImageGL::sGlobalUseAnisotropic = FALSE; F32 LLImageGL::sLastFrameTime = 0.f; +BOOL LLImageGL::sAllowReadBackRaw = FALSE ; LLImageGL* LLImageGL::sDefaultGLTexture = NULL ; + std::set<LLImageGL*> LLImageGL::sImageList; -#if !LL_RELEASE_FOR_DOWNLOAD +//**************************************************************************************************** +//The below for texture auditing use only +//**************************************************************************************************** //----------------------- //debug use +BOOL gAuditTexture = FALSE ; #define MAX_TEXTURE_LOG_SIZE 22 //2048 * 2048 std::vector<S32> LLImageGL::sTextureLoadedCounter(MAX_TEXTURE_LOG_SIZE + 1) ; std::vector<S32> LLImageGL::sTextureBoundCounter(MAX_TEXTURE_LOG_SIZE + 1) ; std::vector<S32> LLImageGL::sTextureCurBoundCounter(MAX_TEXTURE_LOG_SIZE + 1) ; S32 LLImageGL::sCurTexSizeBar = -1 ; S32 LLImageGL::sCurTexPickSize = -1 ; -LLPointer<LLImageGL> LLImageGL::sDefaultTexturep = NULL; +LLPointer<LLImageGL> LLImageGL::sHighlightTexturep = NULL; +S32 LLImageGL::sMaxCatagories = 1 ; + +std::vector<S32> LLImageGL::sTextureMemByCategory; +std::vector<S32> LLImageGL::sTextureMemByCategoryBound ; +std::vector<S32> LLImageGL::sTextureCurMemByCategoryBound ; //------------------------ -#endif +//**************************************************************************************************** +//End for texture auditing use only +//**************************************************************************************************** + //************************************************************************************** //below are functions for debug use //do not delete them even though they are not currently being used. @@ -144,6 +156,60 @@ void LLImageGL::checkTexSize() const //************************************************************************************** //---------------------------------------------------------------------------- +BOOL is_little_endian() +{ + S32 a = 0x12345678; + U8 *c = (U8*)(&a); + + return (*c == 0x78) ; +} +//static +void LLImageGL::initClass(S32 num_catagories) +{ + sMaxCatagories = num_catagories ; + + sTextureMemByCategory.resize(sMaxCatagories); + sTextureMemByCategoryBound.resize(sMaxCatagories) ; + sTextureCurMemByCategoryBound.resize(sMaxCatagories) ; +} + +//static +void LLImageGL::cleanupClass() +{ + sTextureMemByCategory.clear() ; + sTextureMemByCategoryBound.clear() ; + sTextureCurMemByCategoryBound.clear() ; +} + +//static +void LLImageGL::setHighlightTexture(S32 category) +{ + const S32 dim = 128; + sHighlightTexturep = new LLImageGL() ; + LLPointer<LLImageRaw> image_raw = new LLImageRaw(dim,dim,3); + U8* data = image_raw->getData(); + for (S32 i = 0; i<dim; i++) + { + for (S32 j = 0; j<dim; j++) + { + const S32 border = 2; + if (i<border || j<border || i>=(dim-border) || j>=(dim-border)) + { + *data++ = 0xff; + *data++ = 0xff; + *data++ = 0xff; + } + else + { + *data++ = 0xff; + *data++ = 0xff; + *data++ = 0x00; + } + } + } + sHighlightTexturep->createGLTexture(0, image_raw, 0, TRUE, category); + image_raw = NULL; +} //static S32 LLImageGL::dataFormatBits(S32 dataformat) @@ -211,19 +277,31 @@ void LLImageGL::updateStats(F32 current_time) sBoundTextureMemoryInBytes = sCurBoundTextureMemory; sCurBoundTextureMemory = 0; -#if !LL_RELEASE_FOR_DOWNLOAD - for(U32 i = 0 ; i < sTextureCurBoundCounter.size() ; i++) + if(gAuditTexture) { - sTextureBoundCounter[i] = sTextureCurBoundCounter[i] ; - sTextureCurBoundCounter[i] = 0 ; + for(U32 i = 0 ; i < sTextureCurBoundCounter.size() ; i++) + { + sTextureBoundCounter[i] = sTextureCurBoundCounter[i] ; + sTextureCurBoundCounter[i] = 0 ; + } + for(U32 i = 0 ; i < sTextureCurMemByCategoryBound.size() ; i++) + { + sTextureMemByCategoryBound[i] = sTextureCurMemByCategoryBound[i] ; + sTextureCurMemByCategoryBound[i] = 0 ; + } } -#endif } //static -S32 LLImageGL::updateBoundTexMem(const S32 delta) +S32 LLImageGL::updateBoundTexMem(const S32 mem, const S32 ncomponents, S32 category) { - LLImageGL::sCurBoundTextureMemory += delta; + if(gAuditTexture && ncomponents > 0 && category > -1) + { + sTextureCurBoundCounter[getTextureCounterIndex(mem / ncomponents)]++ ; + sTextureCurMemByCategoryBound[category] += mem ; + } + + LLImageGL::sCurBoundTextureMemory += mem ; return LLImageGL::sCurBoundTextureMemory; } @@ -237,6 +315,7 @@ void LLImageGL::destroyGL(BOOL save_state) gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE); } + sAllowReadBackRaw = true ; for (std::set<LLImageGL*>::iterator iter = sImageList.begin(); iter != sImageList.end(); iter++) { @@ -246,7 +325,7 @@ void LLImageGL::destroyGL(BOOL save_state) if (save_state && glimage->isGLTextureCreated() && glimage->mComponents) { glimage->mSaveData = new LLImageRaw; - if(!glimage->readBackRaw(glimage->mCurrentDiscardLevel, glimage->mSaveData, false)) + if(!glimage->readBackRaw(glimage->mCurrentDiscardLevel, glimage->mSaveData, false)) //necessary, keep it. { glimage->mSaveData = NULL ; } @@ -256,6 +335,7 @@ void LLImageGL::destroyGL(BOOL save_state) stop_glerror(); } } + sAllowReadBackRaw = false ; } //static @@ -273,7 +353,7 @@ void LLImageGL::restoreGL() { if (glimage->getComponents() && glimage->mSaveData->getComponents()) { - glimage->createGLTexture(glimage->mCurrentDiscardLevel, glimage->mSaveData); + glimage->createGLTexture(glimage->mCurrentDiscardLevel, glimage->mSaveData, 0, TRUE, glimage->getCategory()); stop_glerror(); } glimage->mSaveData = NULL; // deletes data @@ -355,7 +435,7 @@ void LLImageGL::init(BOOL usemipmaps) mPickMask = NULL; mTextureMemory = 0; mLastBindTime = 0.f; - + mTarget = GL_TEXTURE_2D; mBindTarget = LLTexUnit::TT_TEXTURE; mUseMipMaps = usemipmaps; @@ -381,7 +461,11 @@ void LLImageGL::init(BOOL usemipmaps) mHasExplicitFormat = FALSE; mGLTextureCreated = FALSE ; + mIsMask = FALSE; + mCategory = -1 ; + mAlphaStride = 0 ; + mAlphaOffset = 0 ; mNeedsAlphaAndPickMask = TRUE ; mDiscardLevelInAtlas = -1 ; @@ -486,6 +570,10 @@ void LLImageGL::dump() } //---------------------------------------------------------------------------- +void LLImageGL::forceUpdateBindStats(void) const +{ + mLastBindTime = sLastFrameTime; +} BOOL LLImageGL::updateBindStats(S32 tex_mem) const { @@ -499,7 +587,7 @@ BOOL LLImageGL::updateBindStats(S32 tex_mem) const { // we haven't accounted for this texture yet this frame sUniqueCount++; - updateBoundTexMem(tex_mem); + updateBoundTexMem(tex_mem, mComponents, mCategory); mLastBindTime = sLastFrameTime; return TRUE ; @@ -525,6 +613,8 @@ void LLImageGL::setExplicitFormat( LLGLint internal_format, LLGLenum primary_for else mFormatType = type_format; mFormatSwapBytes = swap_bytes; + + calcAlphaChannelOffsetAndStride() ; } //---------------------------------------------------------------------------- @@ -540,7 +630,6 @@ void LLImageGL::setImage(const LLImageRaw* imageraw) void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips) { - llpushcallstacks ; bool is_compressed = false; if (mFormatPrimary >= GL_COMPRESSED_RGBA_S3TC_DXT1_EXT && mFormatPrimary <= GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) { @@ -749,7 +838,6 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips) } stop_glerror(); mGLTextureCreated = true; - llpushcallstacks ; } BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image) @@ -840,7 +928,6 @@ void LLImageGL::postAddToAtlas() BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height, BOOL force_fast_update) { - llpushcallstacks ; if (!width || !height) { return TRUE; @@ -930,7 +1017,6 @@ BOOL LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S3 stop_glerror(); mGLTextureCreated = true; } - llpushcallstacks ; return TRUE; } @@ -942,8 +1028,9 @@ BOOL LLImageGL::setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S3 // Copy sub image from frame buffer BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_pos, S32 width, S32 height) { - if (gGL.getTexUnit(0)->bind(this)) + if (gGL.getTexUnit(0)->bind(this, false, true)) { + //checkTexSize() ; glCopyTexSubImage2D(GL_TEXTURE_2D, 0, fb_x, fb_y, x_pos, y_pos, width, height); mGLTextureCreated = true; stop_glerror(); @@ -1007,7 +1094,7 @@ BOOL LLImageGL::createGLTexture() return TRUE ; } -BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename/*=0*/) +BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename/*=0*/, BOOL to_create, S32 category) { if (gGLManager.mIsDisabled) { @@ -1027,8 +1114,10 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S discard_level = llclamp(discard_level, 0, (S32)mMaxDiscardLevel); // Actual image width/height = raw image width/height * 2^discard_level - S32 w = imageraw->getWidth() << discard_level; - S32 h = imageraw->getHeight() << discard_level; + S32 raw_w = imageraw->getWidth() ; + S32 raw_h = imageraw->getHeight() ; + S32 w = raw_w << discard_level; + S32 h = raw_h << discard_level; // setSize may call destroyGLTexture if the size does not match setSize(w, h, imageraw->getComponents()); @@ -1062,15 +1151,25 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S default: llerrs << "Bad number of components for texture: " << (U32)getComponents() << llendl; } + + calcAlphaChannelOffsetAndStride() ; } + if(!to_create) //not create a gl texture + { + destroyGLTexture(); + mCurrentDiscardLevel = discard_level; + mLastBindTime = sLastFrameTime; + return TRUE ; + } + + setCategory(category) ; const U8* rawdata = imageraw->getData(); return createGLTexture(discard_level, rawdata, FALSE, usename); } BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_hasmips, S32 usename) { - llpushcallstacks ; llassert(data_in); if (discard_level < 0) @@ -1137,11 +1236,14 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_ if (old_name != 0) { sGlobalTextureMemoryInBytes -= mTextureMemory; -#if !LL_RELEASE_FOR_DOWNLOAD - decTextureCounter(mTextureMemory / mComponents) ; -#endif + + if(gAuditTexture) + { + decTextureCounter(mTextureMemory, mComponents, mCategory) ; + } LLImageGL::deleteTextures(1, &old_name); + stop_glerror(); } @@ -1149,82 +1251,20 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_ sGlobalTextureMemoryInBytes += mTextureMemory; mTexelsInGLTexture = getWidth() * getHeight() ; -#if !LL_RELEASE_FOR_DOWNLOAD - incTextureCounter(mTextureMemory / mComponents) ; -#endif - + if(gAuditTexture) + { + incTextureCounter(mTextureMemory, mComponents, mCategory) ; + } // mark this as bound at this point, so we don't throw it out immediately mLastBindTime = sLastFrameTime; - - llpushcallstacks ; return TRUE; } -BOOL LLImageGL::setDiscardLevel(S32 discard_level) -{ - llassert(discard_level >= 0); - llassert(mCurrentDiscardLevel >= 0); - - discard_level = llclamp(discard_level, 0, (S32)mMaxDiscardLevel); - - if (discard_level == mCurrentDiscardLevel) - { - // nothing to do - return FALSE; - } - else if (discard_level < mCurrentDiscardLevel) - { - // larger image - dump(); - llerrs << "LLImageGL::setDiscardLevel() called with larger discard level; use createGLTexture()" << llendl; - return FALSE; - } - else if (mUseMipMaps) - { - LLPointer<LLImageRaw> imageraw = new LLImageRaw; - while(discard_level > mCurrentDiscardLevel) - { - if (readBackRaw(discard_level, imageraw, false)) - { - break; - } - discard_level--; - } - if (discard_level == mCurrentDiscardLevel) - { - // unable to increase the discard level - return FALSE; - } - return createGLTexture(discard_level, imageraw); - } - else - { -#if !LL_LINUX && !LL_SOLARIS - // *FIX: This should not be skipped for the linux client. - llerrs << "LLImageGL::setDiscardLevel() called on image without mipmaps" << llendl; -#endif - return FALSE; - } -} - -BOOL LLImageGL::isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents) -{ - assert_glerror(); - S32 gl_discard = discard_level - mCurrentDiscardLevel; - LLGLint glwidth = 0; - glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_WIDTH, (GLint*)&glwidth); - LLGLint glheight = 0; - glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_HEIGHT, (GLint*)&glheight); - LLGLint glcomponents = 0 ; - glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_INTERNAL_FORMAT, (GLint*)&glcomponents); - assert_glerror(); - - return glwidth >= image_width && glheight >= image_height && (GL_RGB8 == glcomponents || GL_RGBA8 == glcomponents) ; -} - BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok) const { - llpushcallstacks ; + llassert_always(sAllowReadBackRaw) ; + //llerrs << "should not call this function!" << llendl ; + if (discard_level < 0) { discard_level = mCurrentDiscardLevel; @@ -1327,7 +1367,7 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre return FALSE ; } //----------------------------------------------------------------------------------------------- - llpushcallstacks ; + return TRUE ; } @@ -1345,25 +1385,26 @@ void LLImageGL::deleteDeadTextures() stop_glerror(); } } - + glDeleteTextures(1, &tex); stop_glerror(); } } - + void LLImageGL::destroyGLTexture() { if (mTexName != 0) { if(mTextureMemory) { -#if !LL_RELEASE_FOR_DOWNLOAD - decTextureCounter(mTextureMemory / mComponents) ; -#endif + if(gAuditTexture) + { + decTextureCounter(mTextureMemory, mComponents, mCategory) ; + } sGlobalTextureMemoryInBytes -= mTextureMemory; mTextureMemory = 0; } - + LLImageGL::deleteTextures(1, &mTexName); mTexName = 0; mCurrentDiscardLevel = -1 ; //invalidate mCurrentDiscardLevel. @@ -1479,6 +1520,11 @@ S32 LLImageGL::getMipBytes(S32 discard_level) const return res; } +BOOL LLImageGL::isJustBound() const +{ + return (BOOL)(sLastFrameTime - mLastBindTime < 0.5f); +} + BOOL LLImageGL::getBoundRecently() const { return (BOOL)(sLastFrameTime - mLastBindTime < MIN_TEXTURE_LIFETIME); @@ -1490,44 +1536,104 @@ void LLImageGL::setTarget(const LLGLenum target, const LLTexUnit::eTextureType b mBindTarget = bind_target; } -void LLImageGL::analyzeAlpha(const void* data_in, S32 w, S32 h) +const S8 INVALID_OFFSET = -99 ; +void LLImageGL::setNeedsAlphaAndPickMask(BOOL need_mask) { - if(!mNeedsAlphaAndPickMask) + if(mNeedsAlphaAndPickMask != need_mask) { - return ; + mNeedsAlphaAndPickMask = need_mask; + + if(mNeedsAlphaAndPickMask) + { + mAlphaOffset = 0 ; + } + else //do not need alpha mask + { + mAlphaOffset = INVALID_OFFSET ; + mIsMask = FALSE; + } } +} - if (mFormatType != GL_UNSIGNED_BYTE) +void LLImageGL::calcAlphaChannelOffsetAndStride() +{ + if(mAlphaOffset == INVALID_OFFSET)//do not need alpha mask { - llwarns << "Cannot analyze alpha for image with format type " << std::hex << mFormatType << std::dec << llendl; + return ; } - U32 stride = 0; + mAlphaStride = -1 ; switch (mFormatPrimary) { case GL_LUMINANCE: case GL_ALPHA: - stride = 1; + mAlphaStride = 1; break; case GL_LUMINANCE_ALPHA: - stride = 2; + mAlphaStride = 2; break; case GL_RGB: - //no alpha + mNeedsAlphaAndPickMask = FALSE ; mIsMask = FALSE; - return; + return ; //no alpha channel. case GL_RGBA: - stride = 4; + mAlphaStride = 4; break; case GL_BGRA_EXT: - stride = 4; + mAlphaStride = 4; break; default: - return; + break; + } + + mAlphaOffset = -1 ; + if (mFormatType == GL_UNSIGNED_BYTE) + { + mAlphaOffset = mAlphaStride - 1 ; + } + else if(is_little_endian()) + { + if (mFormatType == GL_UNSIGNED_INT_8_8_8_8) + { + mAlphaOffset = 0 ; + } + else if (mFormatType == GL_UNSIGNED_INT_8_8_8_8_REV) + { + mAlphaOffset = 3 ; + } + } + else //big endian + { + if (mFormatType == GL_UNSIGNED_INT_8_8_8_8) + { + mAlphaOffset = 3 ; + } + else if (mFormatType == GL_UNSIGNED_INT_8_8_8_8_REV) + { + mAlphaOffset = 0 ; + } + } + + if( mAlphaStride < 1 || //unsupported format + mAlphaOffset < 0 || //unsupported type + (mFormatPrimary == GL_BGRA_EXT && mFormatType != GL_UNSIGNED_BYTE)) //unknown situation + { + llwarns << "Cannot analyze alpha for image with format type " << std::hex << mFormatType << std::dec << llendl; + + mNeedsAlphaAndPickMask = FALSE ; + mIsMask = FALSE; + } +} + +void LLImageGL::analyzeAlpha(const void* data_in, S32 w, S32 h) +{ + if(!mNeedsAlphaAndPickMask) + { + return ; } U32 length = w * h; - const GLubyte* current = ((const GLubyte*) data_in)+stride-1; + const GLubyte* current = ((const GLubyte*) data_in) + mAlphaOffset ; S32 sample[16]; memset(sample, 0, sizeof(S32)*16); @@ -1535,7 +1641,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, S32 w, S32 h) for (U32 i = 0; i < length; i++) { ++sample[*current/16]; - current += stride; + current += mAlphaStride ; } U32 total = 0; @@ -1638,8 +1744,30 @@ BOOL LLImageGL::getMask(const LLVector2 &tc) return res; } -//---------------------------------------------------------------------------- -#if !LL_RELEASE_FOR_DOWNLOAD +void LLImageGL::setCategory(S32 category) +{ + if(!gAuditTexture) + { + return ; + } + if(mCategory != category) + { + if(mCategory > -1) + { + sTextureMemByCategory[mCategory] -= mTextureMemory ; + } + if(category > -1 && category < sMaxCatagories) + { + sTextureMemByCategory[category] += mTextureMemory ; + mCategory = category; + } + else + { + mCategory = -1 ; + } + } +} + //for debug use //val is a "power of two" number S32 LLImageGL::getTextureCounterIndex(U32 val) @@ -1663,18 +1791,33 @@ S32 LLImageGL::getTextureCounterIndex(U32 val) return ret ; } } -void LLImageGL::incTextureCounter(U32 val) + +//static +void LLImageGL::incTextureCounter(U32 val, S32 ncomponents, S32 category) { sTextureLoadedCounter[getTextureCounterIndex(val)]++ ; + sTextureMemByCategory[category] += (S32)val * ncomponents ; } -void LLImageGL::decTextureCounter(U32 val) + +//static +void LLImageGL::decTextureCounter(U32 val, S32 ncomponents, S32 category) { sTextureLoadedCounter[getTextureCounterIndex(val)]-- ; + sTextureMemByCategory[category] += (S32)val * ncomponents ; } -void LLImageGL::setCurTexSizebar(S32 index) + +void LLImageGL::setCurTexSizebar(S32 index, BOOL set_pick_size) { sCurTexSizeBar = index ; - sCurTexPickSize = (1 << index) ; + + if(set_pick_size) + { + sCurTexPickSize = (1 << index) ; + } + else + { + sCurTexPickSize = -1 ; + } } void LLImageGL::resetCurTexSizebar() { @@ -1682,7 +1825,9 @@ void LLImageGL::resetCurTexSizebar() sCurTexPickSize = -1 ; } //---------------------------------------------------------------------------- -#endif + +//---------------------------------------------------------------------------- + // Manual Mip Generation /* diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index a094605607c..937065043c1 100644 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h @@ -47,7 +47,6 @@ class LLTextureAtlas ; #define MEGA_BYTES_TO_BYTES(x) ((x) << 20) //============================================================================ - class LLImageGL : public LLRefCount { friend class LLTexUnit; @@ -63,6 +62,7 @@ class LLImageGL : public LLRefCount BOOL updateBindStats(S32 tex_mem) const ; F32 getTimePassedSinceLastBound(); + void forceUpdateBindStats(void) const; // needs to be called every frame static void updateStats(F32 current_time); @@ -71,8 +71,9 @@ class LLImageGL : public LLRefCount static void destroyGL(BOOL save_state = TRUE); static void restoreGL(); - // Sometimes called externally for textures not using LLImageGL (should go away...) - static S32 updateBoundTexMem(const S32 delta); + // Sometimes called externally for textures not using LLImageGL (should go away...) + static S32 updateBoundTexMem(const S32 mem, const S32 ncomponents, S32 category) ; + static bool checkSize(S32 width, S32 height); //for server side use only. @@ -91,6 +92,7 @@ class LLImageGL : public LLRefCount virtual ~LLImageGL(); void analyzeAlpha(const void* data_in, S32 w, S32 h); + void calcAlphaChannelOffsetAndStride(); public: virtual void dump(); // debugging info to llinfos @@ -105,14 +107,15 @@ class LLImageGL : public LLRefCount static void setManualImage(U32 target, S32 miplevel, S32 intformat, S32 width, S32 height, U32 pixformat, U32 pixtype, const void *pixels); BOOL createGLTexture() ; - BOOL createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0); + BOOL createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0, BOOL to_create = TRUE, + S32 category = sMaxCatagories - 1); BOOL createGLTexture(S32 discard_level, const U8* data, BOOL data_hasmips = FALSE, S32 usename = 0); void setImage(const LLImageRaw* imageraw); void setImage(const U8* data_in, BOOL data_hasmips = FALSE); BOOL setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height, BOOL force_fast_update = FALSE); BOOL setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height, BOOL force_fast_update = FALSE); BOOL setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_pos, S32 width, S32 height); - BOOL setDiscardLevel(S32 discard_level); + // Read back a raw image for this discard level, if it exists BOOL readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok) const; void destroyGLTexture(); @@ -131,6 +134,7 @@ class LLImageGL : public LLRefCount S32 getBytes(S32 discard_level = -1) const; S32 getMipBytes(S32 discard_level = -1) const; BOOL getBoundRecently() const; + BOOL isJustBound() const; LLGLenum getPrimaryFormat() const { return mFormatPrimary; } LLGLenum getFormatType() const { return mFormatType; } @@ -150,8 +154,6 @@ class LLImageGL : public LLRefCount BOOL getUseMipMaps() const { return mUseMipMaps; } void setUseMipMaps(BOOL usemips) { mUseMipMaps = usemips; } - BOOL isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents) ; - void updatePickMask(S32 width, S32 height, const U8* data_in); BOOL getMask(const LLVector2 &tc); @@ -178,7 +180,7 @@ class LLImageGL : public LLRefCount void init(BOOL usemipmaps); virtual void cleanup(); // Clean up the LLImageGL so it can be reinitialized. Be careful when using this in derived class destructors - void setNeedsAlphaAndPickMask(BOOL need_mask) {mNeedsAlphaAndPickMask = need_mask;} + void setNeedsAlphaAndPickMask(BOOL need_mask); BOOL preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image); void postAddToAtlas() ; @@ -187,7 +189,7 @@ class LLImageGL : public LLRefCount // Various GL/Rendering options S32 mTextureMemory; mutable F32 mLastBindTime; // last time this was bound, by discard level - + private: LLPointer<LLImageRaw> mSaveData; // used for destroyGL/restoreGL U8* mPickMask; //downsampled bitmap approximation of alpha channel. NULL if no alpha channel @@ -197,13 +199,15 @@ class LLImageGL : public LLRefCount BOOL mIsMask; BOOL mNeedsAlphaAndPickMask; - + S8 mAlphaStride ; + S8 mAlphaOffset ; + bool mGLTextureCreated ; LLGLuint mTexName; U16 mWidth; U16 mHeight; S8 mCurrentDiscardLevel; - + S8 mDiscardLevelInAtlas; U32 mTexelsInAtlas ; U32 mTexelsInGLTexture; @@ -233,7 +237,7 @@ class LLImageGL : public LLRefCount static S32 sCount; static F32 sLastFrameTime; - + static LLGLuint sCurrentBoundTextures[MAX_GL_TEXTURE_UNITS]; // Currently bound texture ID // Global memory statistics @@ -246,30 +250,61 @@ class LLImageGL : public LLRefCount static LLImageGL* sDefaultGLTexture ; static BOOL sAutomatedTest; -#if !LL_RELEASE_FOR_DOWNLOAD +#if DEBUG_MISS + BOOL mMissed; // Missed on last bind? + BOOL getMissed() const { return mMissed; }; +#else + BOOL getMissed() const { return FALSE; }; +#endif + +public: + static void initClass(S32 num_catagories) ; + static void cleanupClass() ; +private: + static S32 sMaxCatagories ; + + //the flag to allow to call readBackRaw(...). + //can be removed if we do not use that function at all. + static BOOL sAllowReadBackRaw ; +// +//**************************************************************************************************** +//The below for texture auditing use only +//**************************************************************************************************** +private: + S32 mCategory ; +public: + void setCategory(S32 category) ; + S32 getCategory()const {return mCategory ;} + //for debug use: show texture size distribution //---------------------------------------- - static LLPointer<LLImageGL> sDefaultTexturep; //default texture to replace normal textures + static LLPointer<LLImageGL> sHighlightTexturep; //default texture to replace normal textures static std::vector<S32> sTextureLoadedCounter ; static std::vector<S32> sTextureBoundCounter ; static std::vector<S32> sTextureCurBoundCounter ; static S32 sCurTexSizeBar ; static S32 sCurTexPickSize ; - + + static void setHighlightTexture(S32 category) ; static S32 getTextureCounterIndex(U32 val) ; - static void incTextureCounter(U32 val) ; - static void decTextureCounter(U32 val) ; - static void setCurTexSizebar(S32 index) ; + static void incTextureCounter(U32 val, S32 ncomponents, S32 category) ; + static void decTextureCounter(U32 val, S32 ncomponents, S32 category) ; + static void setCurTexSizebar(S32 index, BOOL set_pick_size = TRUE) ; static void resetCurTexSizebar(); //---------------------------------------- -#endif -#if DEBUG_MISS - BOOL mMissed; // Missed on last bind? - BOOL getMissed() const { return mMissed; }; -#else - BOOL getMissed() const { return FALSE; }; -#endif + //for debug use: show texture category distribution + //---------------------------------------- + + static std::vector<S32> sTextureMemByCategory; + static std::vector<S32> sTextureMemByCategoryBound ; + static std::vector<S32> sTextureCurMemByCategoryBound ; + //---------------------------------------- +//**************************************************************************************************** +//End of definitions for texture auditing use only +//**************************************************************************************************** + }; +extern BOOL gAuditTexture; #endif // LL_LLIMAGEGL_H diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index b74d824c9e4..fc45df81539 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -179,7 +179,7 @@ void LLTexUnit::disable(void) } } -bool LLTexUnit::bind(LLTexture* texture, bool forceBind) +bool LLTexUnit::bind(LLTexture* texture, bool for_rendering, bool forceBind) { stop_glerror(); if (mIndex < 0) return false; @@ -198,9 +198,19 @@ bool LLTexUnit::bind(LLTexture* texture, bool forceBind) //if deleted, will re-generate it immediately texture->forceImmediateUpdate() ; + gl_tex->forceUpdateBindStats() ; return texture->bindDefaultImage(mIndex); } + //in audit, replace the selected texture by the default one. + if(gAuditTexture && for_rendering && LLImageGL::sCurTexPickSize > 0) + { + if(texture->getWidth() * texture->getHeight() == LLImageGL::sCurTexPickSize) + { + gl_tex->updateBindStats(gl_tex->mTextureMemory); + return bind(LLImageGL::sHighlightTexturep.get()); + } + } if ((mCurrTexture != gl_tex->getTexName()) || forceBind) { activate(); @@ -223,7 +233,7 @@ bool LLTexUnit::bind(LLTexture* texture, bool forceBind) return true; } -bool LLTexUnit::bind(LLImageGL* texture, bool forceBind) +bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind) { stop_glerror(); if (mIndex < 0) return false; @@ -260,6 +270,7 @@ bool LLTexUnit::bind(LLImageGL* texture, bool forceBind) setTextureFilteringOption(texture->mFilterOption); } } + return true; } diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index cb2a4d44507..0121a190ee5 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -149,8 +149,8 @@ class LLTexUnit // Binds the LLImageGL to this texture unit // (automatically enables the unit for the LLImageGL's texture type) - bool bind(LLImageGL* texture, bool forceBind = false); - bool bind(LLTexture* texture, bool forceBind = false); + bool bind(LLImageGL* texture, bool for_rendering = false, bool forceBind = false); + bool bind(LLTexture* texture, bool for_rendering = false, bool forceBind = false); // Binds a cubemap to this texture unit // (automatically enables the texture unit for cubemaps) diff --git a/indra/llrender/lltexture.h b/indra/llrender/lltexture.h index c18917b6634..6495fb9859d 100644 --- a/indra/llrender/lltexture.h +++ b/indra/llrender/lltexture.h @@ -61,7 +61,7 @@ class LLTexture : public LLRefCount // //interfaces to access LLViewerTexture // - virtual bool bindDefaultImage(const S32 stage = 0) const = 0 ; + virtual bool bindDefaultImage(const S32 stage = 0) = 0 ; virtual void forceImmediateUpdate() = 0 ; virtual void setActive() = 0 ; virtual S32 getWidth(S32 discard_level = -1) const = 0 ; diff --git a/indra/llvfs/lllfsthread.cpp b/indra/llvfs/lllfsthread.cpp index 704e1ab1427..e85cc437f40 100644 --- a/indra/llvfs/lllfsthread.cpp +++ b/indra/llvfs/lllfsthread.cpp @@ -189,7 +189,7 @@ bool LLLFSThread::Request::processRequest() { llassert(mOffset >= 0); LLAPRFile infile ; - infile.open(mThread->getLocalAPRFilePool(), mFileName, LL_APR_RB); + infile.open(mFileName, LL_APR_RB, mThread->getLocalAPRFilePool()); if (!infile.getFileHandle()) { llwarns << "LLLFS: Unable to read file: " << mFileName << llendl; @@ -213,7 +213,7 @@ bool LLLFSThread::Request::processRequest() if (mOffset < 0) flags |= APR_APPEND; LLAPRFile outfile ; - outfile.open(mThread->getLocalAPRFilePool(), mFileName, flags); + outfile.open(mFileName, flags, mThread->getLocalAPRFilePool()); if (!outfile.getFileHandle()) { llwarns << "LLLFS: Unable to write file: " << mFileName << llendl; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index f27d949faf4..38622d206ff 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -265,7 +265,6 @@ set(viewer_SOURCE_FILES llmaniprotate.cpp llmanipscale.cpp llmaniptranslate.cpp - llmapresponders.cpp llmediactrl.cpp llmediadataclient.cpp llmediaremotectrl.cpp @@ -387,6 +386,10 @@ set(viewer_SOURCE_FILES lltexturecache.cpp lltexturectrl.cpp lltexturefetch.cpp + lltextureinfo.cpp + lltextureinfodetails.cpp + lltexturestats.cpp + lltexturestatsuploader.cpp lltextureview.cpp lltoast.cpp lltoastalertpanel.cpp @@ -508,6 +511,8 @@ set(viewer_SOURCE_FILES llwlparamset.cpp llworld.cpp llworldmap.cpp + llworldmapmessage.cpp + llworldmipmap.cpp llworldmapview.cpp llxmlrpctransaction.cpp noise.cpp @@ -738,7 +743,6 @@ set(viewer_HEADER_FILES llmaniprotate.h llmanipscale.h llmaniptranslate.h - llmapresponders.h llmediadataclient.h llmediaremotectrl.h llmemoryview.h @@ -859,6 +863,10 @@ set(viewer_HEADER_FILES lltexturecache.h lltexturectrl.h lltexturefetch.h + lltextureinfo.h + lltextureinfodetails.h + lltexturestats.h + lltexturestatsuploader.h lltextureview.h lltoast.h lltoastalertpanel.h @@ -982,6 +990,8 @@ set(viewer_HEADER_FILES llwlparamset.h llworld.h llworldmap.h + llworldmapmessage.h + llworldmipmap.h llworldmapview.h llxmlrpctransaction.h macmain.h @@ -1574,6 +1584,12 @@ LL_ADD_INTEGRATION_TEST(llcapabilitylistener ) #ADD_VIEWER_BUILD_TEST(llmemoryview viewer) +#ADD_VIEWER_BUILD_TEST(llagentaccess viewer) +#ADD_VIEWER_BUILD_TEST(llworldmap viewer) +#ADD_VIEWER_BUILD_TEST(llworldmipmap viewer) +#ADD_VIEWER_BUILD_TEST(lltextureinfo viewer) +#ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer) +#ADD_VIEWER_BUILD_TEST(lltexturestatsuploader viewer) # Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 7e368b0c9c8..aa43f8cd9cc 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -309,7 +309,18 @@ <key>Value</key> <integer>0</integer> </map> - <key>AutoAcceptNewInventory</key> + <key>AuditTexture</key> + <map> + <key>Comment</key> + <string>Enable texture auditting.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>AutoAcceptNewInventory</key> <map> <key>Comment</key> <string>Automatically accept new notecards/textures/landmarks</string> @@ -4545,6 +4556,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>MiniMapPrimMaxRadius</key> + <map> + <key>Comment</key> + <string>Radius of the largest prim to show on the MiniMap. Increasing beyond 256 may cause client lag.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>256.0</real> + </map> <key>MiniMapRotate</key> <map> <key>Comment</key> @@ -4559,7 +4581,7 @@ <key>MiniMapScale</key> <map> <key>Comment</key> - <string>Miniature world map zoom levle (pixels per region)</string> + <string>Miniature world map zoom level (pixels per region)</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -8468,6 +8490,28 @@ <key>Value</key> <real>20.0</real> </map> + <key>TextureDisable</key> + <map> + <key>Comment</key> + <string>If TRUE, do not load textures for in-world content</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>TextureLoadFullRes</key> + <map> + <key>Comment</key> + <string>If TRUE, always load textures at full resolution (discard = 0)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>TextureMemory</key> <map> <key>Comment</key> @@ -10537,5 +10581,38 @@ <key>Value</key> <integer>0</integer> </map> - </map> + <key>LogTextureDownloadsToViewerLog</key> + <map> + <key>Comment</key> + <string>Send texture download details to the viewer log</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>LogTextureDownloadsToSimulator</key> + <map> + <key>Comment</key> + <string>Send a digest of texture info to the sim</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>TextureLoggingThreshold</key> + <map> + <key>Comment</key> + <string>Specifies the byte threshold at which texture download data should be sent to the sim.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>1</integer> + </map> +</map> </llsd> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 0fa3b1f04df..e182228ab3b 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -74,6 +74,8 @@ #include "llstatusbar.h" #include "llteleportflags.h" #include "llteleporthistory.h" +#include "lltexturestats.h" +#include "lltexturestats.h" #include "lltool.h" #include "lltoolcomp.h" #include "lltoolmgr.h" @@ -6087,17 +6089,16 @@ void LLAgent::teleportCancel() void LLAgent::teleportViaLocation(const LLVector3d& pos_global) { LLViewerRegion* regionp = getRegion(); - LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global); + U64 handle = to_region_handle(pos_global); + LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle); if(regionp && info) { - U32 x_pos; - U32 y_pos; - from_region_handle(info->mHandle, &x_pos, &y_pos); + LLVector3d region_origin = info->getGlobalOrigin(); LLVector3 pos_local( - (F32)(pos_global.mdV[VX] - x_pos), - (F32)(pos_global.mdV[VY] - y_pos), + (F32)(pos_global.mdV[VX] - region_origin.mdV[VX]), + (F32)(pos_global.mdV[VY] - region_origin.mdV[VY]), (F32)(pos_global.mdV[VZ])); - teleportRequest(info->mHandle, pos_local); + teleportRequest(handle, pos_local); } else if(regionp && teleportCore(regionp->getHandle() == to_region_handle_global((F32)pos_global.mdV[VX], (F32)pos_global.mdV[VY]))) @@ -6514,3 +6515,4 @@ LLAgentQueryManager::~LLAgentQueryManager() } // EOF + diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index c673db2034f..87d081b27c7 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -58,6 +58,8 @@ #include "llallocator.h" #include "llares.h" #include "llcurl.h" +#include "lltexturestats.h" +#include "lltexturestats.h" #include "llviewerwindow.h" #include "llviewerdisplay.h" #include "llviewermedia.h" @@ -248,9 +250,6 @@ F32 gLogoutMaxTime = LOGOUT_REQUEST_TIME; BOOL gDisconnected = FALSE; -// Map scale in pixels per region -F32 gMapScale = 128.f; - // used to restore texture state after a mode switch LLFrameTimer gRestoreGLTimer; BOOL gRestoreGL = FALSE; @@ -413,7 +412,7 @@ static void settings_to_globals() gDebugWindowProc = gSavedSettings.getBOOL("DebugWindowProc"); gAllowTapTapHoldRun = gSavedSettings.getBOOL("AllowTapTapHoldRun"); gShowObjectUpdates = gSavedSettings.getBOOL("ShowObjectUpdates"); - gMapScale = gSavedSettings.getF32("MapScale"); + LLWorldMapView::sMapScale = gSavedSettings.getF32("MapScale"); LLCubeMap::sUseCubeMaps = LLFeatureManager::getInstance()->isFeatureAvailable("RenderCubeMap"); } @@ -426,7 +425,7 @@ static void settings_modify() LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4] gDebugGL = gSavedSettings.getBOOL("RenderDebugGL") || gDebugSession; gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline"); - + gAuditTexture = gSavedSettings.getBOOL("AuditTexture"); #if LL_VECTORIZE if (gSysCPU.hasAltivec()) { @@ -547,7 +546,7 @@ LLAppViewer* LLAppViewer::sInstance = NULL; const std::string LLAppViewer::sGlobalSettingsName = "Global"; LLTextureCache* LLAppViewer::sTextureCache = NULL; -LLWorkerThread* LLAppViewer::sImageDecodeThread = NULL; +LLImageDecodeThread* LLAppViewer::sImageDecodeThread = NULL; LLTextureFetch* LLAppViewer::sTextureFetch = NULL; LLAppViewer::LLAppViewer() : @@ -639,6 +638,9 @@ bool LLAppViewer::init() ////////////////////////////////////////////////////////////////////////////// // *FIX: The following code isn't grouped into functions yet. + // Statistics / debug timer initialization + init_statistics(); + // // Various introspection concerning the libs we're using - particularly // the libs involved in getting to a full login screen. @@ -1596,14 +1598,14 @@ bool LLAppViewer::initThreads() LLWatchdog::getInstance()->init(watchdog_killer_callback); } - LLVFSThread::initClass(enable_threads && true); - LLLFSThread::initClass(enable_threads && true); + LLVFSThread::initClass(enable_threads && false); + LLLFSThread::initClass(enable_threads && false); // Image decoding - LLAppViewer::sImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true); + LLAppViewer::sImageDecodeThread = new LLImageDecodeThread(enable_threads && true); LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true); - LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), enable_threads && false); - LLImage::initClass(LLAppViewer::getImageDecodeThread()); + LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && true); + LLImage::initClass(); if (LLFastTimer::sLog || LLFastTimer::sMetricLog) { @@ -2397,7 +2399,7 @@ void LLAppViewer::cleanupSavedSettings() } } - gSavedSettings.setF32("MapScale", gMapScale ); + gSavedSettings.setF32("MapScale", LLWorldMapView::sMapScale ); // Some things are cached in LLAgent. if (gAgent.mInitialized) @@ -2723,7 +2725,7 @@ void LLAppViewer::initMarkerFile() // Create the marker file for this execution & lock it apr_status_t s; - s = mMarkerFile.open(mMarkerFileName, LL_APR_W, gAPRPoolp); + s = mMarkerFile.open(mMarkerFileName, LL_APR_W, TRUE); if (s == APR_SUCCESS && mMarkerFile.getFileHandle()) { @@ -4109,3 +4111,4 @@ void LLAppViewer::handleLoginComplete() writeDebugInfo(); } + diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 646b6772649..d07ee6e94ff 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -41,12 +41,10 @@ class LLCommandLineParser; class LLFrameTimer; class LLPumpIO; class LLTextureCache; +class LLImageDecodeThread; class LLTextureFetch; -class LLTimer; -class LLVFS; class LLWatchdogTimeout; -class LLWorkerThread; - +class LLCommandLineParser; class LLAppViewer : public LLApp { @@ -98,7 +96,7 @@ class LLAppViewer : public LLApp // Thread accessors static LLTextureCache* getTextureCache() { return sTextureCache; } - static LLWorkerThread* getImageDecodeThread() { return sImageDecodeThread; } + static LLImageDecodeThread* getImageDecodeThread() { return sImageDecodeThread; } static LLTextureFetch* getTextureFetch() { return sTextureFetch; } const std::string& getSerialNumber() { return mSerialNumber; } @@ -228,7 +226,7 @@ class LLAppViewer : public LLApp // Thread objects. static LLTextureCache* sTextureCache; - static LLWorkerThread* sImageDecodeThread; + static LLImageDecodeThread* sImageDecodeThread; static LLTextureFetch* sTextureFetch; S32 mNumSessions; @@ -322,9 +320,6 @@ extern F32 gSimFrames; extern BOOL gDisconnected; -// Map scale in pixels per region -extern F32 gMapScale; - extern LLFrameTimer gRestoreGLTimer; extern BOOL gRestoreGL; extern BOOL gUseWireframe; diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index ea3809d58d6..f117e7d975b 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -368,7 +368,7 @@ void LLSendTexLayerResponder::uploadComplete(const LLSD& content) std::string result = content["state"]; LLUUID new_id = content["new_asset"]; - llinfos << "LLSendTexLayerResponder::result from capabilities: " << result << llendl; + llinfos << "result: " << result << "new_id:" << new_id << llendl; if (result == "complete" && mBakedUploadData != NULL) { // Invoke @@ -382,6 +382,14 @@ void LLSendTexLayerResponder::uploadComplete(const LLSD& content) } } +void LLSendTexLayerResponder::error(U32 statusNum, const std::string& reason) +{ + llinfos << "status: " << statusNum << " reason: " << reason << llendl; + + // Invoke the original callback with an error result + LLTexLayerSetBuffer::onTextureUploadComplete(LLUUID(), (void*) mBakedUploadData, -1, LL_EXSTAT_NONE); + mBakedUploadData = NULL; // deleted in onTextureUploadComplete() +} LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(const LLSD& post_data, const LLUUID& vfile_id, diff --git a/indra/newview/llassetuploadresponders.h b/indra/newview/llassetuploadresponders.h index a08d70213c3..e6563513056 100644 --- a/indra/newview/llassetuploadresponders.h +++ b/indra/newview/llassetuploadresponders.h @@ -84,6 +84,7 @@ class LLSendTexLayerResponder : public LLAssetUploadResponder ~LLSendTexLayerResponder(); virtual void uploadComplete(const LLSD& content); + virtual void error(U32 statusNum, const std::string& reason); LLBakedUploadData * mBakedUploadData; }; diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index 7b75c77a1e3..5d27595a593 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -228,7 +228,7 @@ void LLColorSwatchCtrl::draw() { if (!mFallbackImageName.empty()) { - LLPointer<LLViewerTexture> fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + LLPointer<LLViewerFetchedTexture> fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); if( fallback_image->getComponents() == 4 ) { gl_rect_2d_checkerboard( interior ); diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp index 24a57cb0c1b..9057d84f63c 100644 --- a/indra/newview/lldebugview.cpp +++ b/indra/newview/lldebugview.cpp @@ -45,7 +45,7 @@ #include "llviewerwindow.h" #include "llappviewer.h" #include "llmemoryview.h" - +#include "llviewertexture.h" // // Globals // @@ -102,17 +102,29 @@ LLDebugView::LLDebugView(const LLDebugView::Params& p) gTextureView = LLUICtrlFactory::create<LLTextureView>(tvp); addChild(gTextureView); //gTextureView->reshape(r.getWidth(), r.getHeight(), TRUE); -#if !LL_RELEASE_FOR_DOWNLOAD - r.set(150, rect.getHeight() - 50, 900 + LLImageGL::sTextureLoadedCounter.size() * 30, 100); - LLTextureSizeView::Params tsvp; - tsvp.name("gTextureSizeView"); - tsvp.rect(r); - tsvp.follows.flags(FOLLOWS_BOTTOM|FOLLOWS_LEFT); - tsvp.visible(false); - gTextureSizeView = LLUICtrlFactory::create<LLTextureSizeView>(tsvp); - addChild(gTextureSizeView); -#endif + if(gAuditTexture) + { + r.set(150, rect.getHeight() - 50, 900 + LLImageGL::sTextureLoadedCounter.size() * 30, 100); + LLTextureSizeView::Params tsv ; + tsv.name("gTextureSizeView"); + tsv.rect(r); + tsv.follows.flags(FOLLOWS_BOTTOM|FOLLOWS_LEFT); + tsv.visible(false); + gTextureSizeView = LLUICtrlFactory::create<LLTextureSizeView>(tsv); + addChild(gTextureSizeView); + gTextureSizeView->setType(LLTextureSizeView::TEXTURE_MEM_OVER_SIZE) ; + + r.set(150, rect.getHeight() - 50, 900 + LLViewerTexture::getTotalNumOfCategories() * 30, 100); + LLTextureSizeView::Params tcv ; + tcv.name("gTextureCategoryView"); + tcv.rect(r); + tcv.follows.flags(FOLLOWS_BOTTOM|FOLLOWS_LEFT); + tcv.visible(false); + gTextureCategoryView = LLUICtrlFactory::create<LLTextureSizeView>(tcv); + gTextureCategoryView->setType(LLTextureSizeView::TEXTURE_MEM_OVER_CATEGORY); + addChild(gTextureCategoryView); + } } @@ -122,5 +134,6 @@ LLDebugView::~LLDebugView() gDebugView = NULL; gTextureView = NULL; gTextureSizeView = NULL; + gTextureCategoryView = NULL; } diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 069155c2559..03a3f2b43de 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -105,7 +105,7 @@ void LLDrawable::init() mVObjp = NULL; // mFaces mSpatialGroupp = NULL; - mVisible = 0; + mVisible = sCurVisible - 2;//invisible for the current frame and the last frame. mRadius = 0.f; mGeneration = -1; diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index 976f02eeb7f..1b46e0a4787 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -279,7 +279,7 @@ S32 LLFacePool::drawLoopSetTex(face_array_t& face_list, S32 stage) iter != face_list.end(); iter++) { LLFace *facep = *iter; - gGL.getTexUnit(stage)->bind(facep->getTexture()); + gGL.getTexUnit(stage)->bind(facep->getTexture(), TRUE) ; gGL.getTexUnit(0)->activate(); res += facep->renderIndexed(); } @@ -474,17 +474,13 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) { if (params.mTexture.notNull()) { - gGL.getTexUnit(0)->bind(params.mTexture.get()); + gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ; if (params.mTextureMatrix) { glMatrixMode(GL_TEXTURE); glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix); gPipeline.mTextureMatrixOps++; } - if(params.mTexture.notNull())//will be removed. - { - params.mTexture->addTextureStats(params.mVSize); - } } else { diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index a5a29dea7b2..6d773614149 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -219,7 +219,7 @@ void LLDrawPoolAlpha::render(S32 pass) gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); glColor4f(1,0,0,1); LLViewerFetchedTexture::sSmokeImagep->addTextureStats(1024.f*1024.f); - gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sSmokeImagep) ; + gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sSmokeImagep, TRUE) ; renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0); } diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp index 8d2cbc583c1..5521fb05a82 100644 --- a/indra/newview/lldrawpooltree.cpp +++ b/indra/newview/lldrawpooltree.cpp @@ -253,7 +253,7 @@ void LLDrawPoolTree::renderTree(BOOL selecting) LLGLState normalize(GL_NORMALIZE, TRUE); // Bind the texture for this tree. - gGL.getTexUnit(sDiffTex)->bind(mTexturep.get()); + gGL.getTexUnit(sDiffTex)->bind(mTexturep.get(), TRUE); U32 indices_drawn = 0; diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index 0bb5edf3f99..e41c4104ebe 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -104,7 +104,7 @@ void LLViewerDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum { setExplicitFormat(internal_format, primary_format, type_format, swap_bytes); } - createGLTexture(0, raw_image); + createGLTexture(0, raw_image, 0, TRUE, LLViewerTexture::DYNAMIC_TEX); setAddressMode((mClamp) ? LLTexUnit::TAM_CLAMP : LLTexUnit::TAM_WRAP); mGLTexturep->setGLTextureCreated(false); } diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 4246cbc27f2..edadc3dcf77 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -52,6 +52,7 @@ #include "llvovolume.h" #include "pipeline.h" #include "llviewerregion.h" +#include "llviewerwindow.h" #define LL_MAX_INDICES_COUNT 1000000 @@ -175,6 +176,9 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp) mLastIndicesCount = mIndicesCount; mLastIndicesIndex = mIndicesIndex; + mImportanceToCamera = 0.f ; + mBoundingSphereRadius = 0.0f ; + mAtlasInfop = NULL ; mUsingAtlas = FALSE ; } @@ -186,6 +190,7 @@ void LLFace::destroy() { mTexture->removeFace(this) ; } + if (mDrawPoolp) { mDrawPoolp->removeFace(this); @@ -207,7 +212,7 @@ void LLFace::destroy() } } } - + setDrawInfo(NULL); removeAtlas(); @@ -256,6 +261,7 @@ void LLFace::setPool(LLFacePool* new_pool, LLViewerTexture *texturep) } mDrawPoolp = new_pool; } + setTexture(texturep) ; } @@ -750,7 +756,9 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f, } mCenterLocal = (newMin+newMax)*0.5f; - + LLVector3 tmp = (newMin - newMax) ; + mBoundingSphereRadius = tmp.length() * 0.5f ; + updateCenterAgent(); } @@ -1305,6 +1313,151 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, return TRUE; } +const F32 LEAST_IMPORTANCE = 0.05f ; +const F32 LEAST_IMPORTANCE_FOR_LARGE_IMAGE = 0.3f ; + +F32 LLFace::getTextureVirtualSize() +{ + F32 radius; + F32 cos_angle_to_view_dir; + mPixelArea = calcPixelArea(cos_angle_to_view_dir, radius); + + if (mPixelArea <= 0) + { + return 0.f; + } + + //get area of circle in texture space + LLVector2 tdim = mTexExtents[1] - mTexExtents[0]; + F32 texel_area = (tdim * 0.5f).lengthSquared()*3.14159f; + if (texel_area <= 0) + { + // Probably animated, use default + texel_area = 1.f; + } + + //apply texel area to face area to get accurate ratio + //face_area /= llclamp(texel_area, 1.f/64.f, 16.f); + F32 face_area = mPixelArea / llclamp(texel_area, 0.015625f, 128.f); + + if(face_area > LLViewerTexture::sMaxSmallImageSize) + { + if(mImportanceToCamera < LEAST_IMPORTANCE) //if the face is not important, do not load hi-res. + { + static const F32 MAX_LEAST_IMPORTANCE_IMAGE_SIZE = 128.0f * 128.0f ; + face_area = llmin(face_area * 0.5f, MAX_LEAST_IMPORTANCE_IMAGE_SIZE) ; + } + else if(face_area > LLViewerTexture::sMinLargeImageSize) //if is large image, shrink face_area by considering the partial overlapping. + { + if(mImportanceToCamera < LEAST_IMPORTANCE_FOR_LARGE_IMAGE)//if the face is not important, do not load hi-res. + { + face_area = LLViewerTexture::sMinLargeImageSize ; + } + else if(mTexture.notNull() && mTexture->isLargeImage()) + { + face_area *= adjustPartialOverlapPixelArea(cos_angle_to_view_dir, radius ); + } + } + } + + return face_area; +} + +F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) +{ + //get area of circle around face + LLVector3 center = getPositionAgent(); + LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f; + + LLVector3 lookAt = center - LLViewerCamera::getInstance()->getOrigin(); + F32 dist = lookAt.normVec() ; + + //get area of circle around node + F32 app_angle = atanf(size.length()/dist); + radius = app_angle*LLDrawable::sCurPixelAngle; + F32 face_area = radius*radius * 3.14159f; + + if(dist < mBoundingSphereRadius) //camera is very close + { + cos_angle_to_view_dir = 1.0f ; + mImportanceToCamera = 1.0f ; + } + else + { + cos_angle_to_view_dir = lookAt * LLViewerCamera::getInstance()->getXAxis() ; + mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ; + } + + return face_area ; +} + +//the projection of the face partially overlaps with the screen +F32 LLFace::adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius ) +{ + F32 screen_radius = (F32)llmax(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight()) ; + F32 center_angle = acosf(cos_angle_to_view_dir) ; + F32 d = center_angle * LLDrawable::sCurPixelAngle ; + + if(d + radius > screen_radius + 5.f) + { + //---------------------------------------------- + //calculate the intersection area of two circles + //F32 radius_square = radius * radius ; + //F32 d_square = d * d ; + //F32 screen_radius_square = screen_radius * screen_radius ; + //face_area = + // radius_square * acosf((d_square + radius_square - screen_radius_square)/(2 * d * radius)) + + // screen_radius_square * acosf((d_square + screen_radius_square - radius_square)/(2 * d * screen_radius)) - + // 0.5f * sqrtf((-d + radius + screen_radius) * (d + radius - screen_radius) * (d - radius + screen_radius) * (d + radius + screen_radius)) ; + //---------------------------------------------- + + //the above calculation is too expensive + //the below is a good estimation: bounding box of the bounding sphere: + F32 alpha = 0.5f * (radius + screen_radius - d) / radius ; + alpha = llclamp(alpha, 0.f, 1.f) ; + return alpha * alpha ; + } + return 1.0f ; +} + +const S8 FACE_IMPORTANCE_LEVEL = 4 ; +const F32 FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[FACE_IMPORTANCE_LEVEL][2] = //{distance, importance_weight} + {{16.1f, 1.0f}, {32.1f, 0.5f}, {48.1f, 0.2f}, {96.1f, 0.05f} } ; +const F32 FACE_IMPORTANCE_TO_CAMERA_OVER_ANGLE[FACE_IMPORTANCE_LEVEL][2] = //{cos(angle), importance_weight} + {{0.985f /*cos(10 degrees)*/, 1.0f}, {0.94f /*cos(20 degrees)*/, 0.8f}, {0.866f /*cos(30 degrees)*/, 0.64f}, {0.0f, 0.36f}} ; + +//static +F32 LLFace::calcImportanceToCamera(F32 cos_angle_to_view_dir, F32 dist) +{ + F32 importance = 0.f ; + + if(cos_angle_to_view_dir > LLViewerCamera::getInstance()->getCosHalfFov() && + dist < FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[FACE_IMPORTANCE_LEVEL - 1][0]) + { + F32 camera_moving_speed = LLViewerCamera::getInstance()->getAverageSpeed() ; + F32 camera_angular_speed = LLViewerCamera::getInstance()->getAverageAngularSpeed(); + + if(camera_moving_speed > 10.0f || camera_angular_speed > 1.0f) + { + //if camera moves or rotates too fast, ignore the importance factor + return 0.f ; + } + + //F32 camera_relative_speed = camera_moving_speed * (lookAt * LLViewerCamera::getInstance()->getVelocityDir()) ; + + S32 i = 0 ; + for(i = 0; i < FACE_IMPORTANCE_LEVEL && dist > FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[i][0]; ++i); + i = llmin(i, FACE_IMPORTANCE_LEVEL - 1) ; + F32 dist_factor = FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[i][1] ; + + for(i = 0; i < FACE_IMPORTANCE_LEVEL && cos_angle_to_view_dir < FACE_IMPORTANCE_TO_CAMERA_OVER_ANGLE[i][0] ; ++i) ; + i = llmin(i, FACE_IMPORTANCE_LEVEL - 1) ; + importance = dist_factor * FACE_IMPORTANCE_TO_CAMERA_OVER_ANGLE[i][1] ; + } + + return importance ; +} + BOOL LLFace::verify(const U32* indices_array) const { BOOL ok = TRUE; diff --git a/indra/newview/llface.h b/indra/newview/llface.h index d734b327d95..68eee061b8b 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -188,6 +188,9 @@ class LLFace void setIndicesIndex(S32 idx) { mIndicesIndex = idx; } void setDrawInfo(LLDrawInfo* draw_info); + F32 getTextureVirtualSize() ; + F32 getImportanceToCamera()const {return mImportanceToCamera ;} + //for atlas LLTextureAtlasSlot* getAtlasInfo() ; void setAtlasInUse(BOOL flag); @@ -200,6 +203,12 @@ class LLFace void removeAtlas() ; BOOL switchTexture() ; +private: + F32 adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius ); + F32 calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ; +public: + static F32 calcImportanceToCamera(F32 to_view_dir, F32 dist); + public: LLVector3 mCenterLocal; @@ -214,7 +223,7 @@ class LLFace LLMatrix4* mTextureMatrix; LLDrawInfo* mDrawInfo; -protected: +private: friend class LLGeometryManager; friend class LLVolumeGeometryManager; @@ -244,9 +253,16 @@ class LLFace F32 mVSize; F32 mPixelArea; + //importance factor, in the range [0, 1.0]. + //1.0: the most important. + //based on the distance from the face to the view point and the angle from the face center to the view direction. + F32 mImportanceToCamera ; + F32 mBoundingSphereRadius ; + + //atlas LLPointer<LLTextureAtlasSlot> mAtlasInfop ; - BOOL mUsingAtlas ; + BOOL mUsingAtlas ; protected: static BOOL sSafeRenderSelect; diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index 0c9a759f320..3fe711a1664 100644 --- a/indra/newview/llfloatermap.cpp +++ b/indra/newview/llfloatermap.cpp @@ -50,12 +50,27 @@ #include "lltextbox.h" #include "llviewermenu.h" +// +// Constants +// +const F32 MAP_MINOR_DIR_THRESHOLD = 0.08f; + // // Member functions // LLFloaterMap::LLFloaterMap(const LLSD& key) - : LLFloater(key) + : LLFloater(key), + mPopupMenu(NULL), + mTextBoxEast(NULL), + mTextBoxNorth(NULL), + mTextBoxWest(NULL), + mTextBoxSouth(NULL), + mTextBoxSouthEast(NULL), + mTextBoxNorthEast(NULL), + mTextBoxNorthWest(NULL), + mTextBoxSouthWest(NULL), + mMap(NULL) { //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_map.xml", FALSE); } @@ -92,6 +107,8 @@ BOOL LLFloaterMap::postBuild() mPopupMenu->setItemEnabled ("Stop Tracking", false); } + updateMinorDirections(); + // Get the drag handle all the way in back sendChildToBack(getDragHandle()); @@ -139,6 +156,23 @@ void LLFloaterMap::setDirectionPos( LLTextBox* text_box, F32 rotation ) llround(map_half_height - text_half_height + radius * sin( rotation )) ); } +void LLFloaterMap::updateMinorDirections() +{ + if (mTextBoxNorthEast == NULL) + { + return; + } + + // Hide minor directions if they cover too much of the map + bool show_minors = mTextBoxNorthEast->getRect().getHeight() < MAP_MINOR_DIR_THRESHOLD * + llmin(getRect().getWidth(), getRect().getHeight()); + + mTextBoxNorthEast->setVisible(show_minors); + mTextBoxNorthWest->setVisible(show_minors); + mTextBoxSouthWest->setVisible(show_minors); + mTextBoxSouthEast->setVisible(show_minors); +} + // virtual void LLFloaterMap::draw() { @@ -180,17 +214,23 @@ void LLFloaterMap::draw() LLFloater::draw(); } +void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + LLFloater::reshape(width, height, called_from_parent); + updateMinorDirections(); +} + void LLFloaterMap::handleZoom(const LLSD& userdata) { std::string level = userdata.asString(); F32 scale = 0.0f; if (level == std::string("close")) - scale = MAP_SCALE_MAX; + scale = LLNetMap::MAP_SCALE_MAX; else if (level == std::string("medium")) - scale = MAP_SCALE_MID; + scale = LLNetMap::MAP_SCALE_MID; else if (level == std::string("far")) - scale = MAP_SCALE_MIN; + scale = LLNetMap::MAP_SCALE_MIN; if (scale != 0.0f) { gSavedSettings.setF32("MiniMapScale", scale ); diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h index 501777ed078..6c9138c6a7e 100644 --- a/indra/newview/llfloatermap.h +++ b/indra/newview/llfloatermap.h @@ -51,12 +51,14 @@ class LLFloaterMap : public LLFloater /*virtual*/ BOOL postBuild(); /*virtual*/ BOOL handleDoubleClick( S32 x, S32 y, MASK mask ); /*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask ); + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); /*virtual*/ void draw(); private: void handleZoom(const LLSD& userdata); void handleStopTracking (const LLSD& userdata); void setDirectionPos( LLTextBox* text_box, F32 rotation ); + void updateMinorDirections(); LLMenuGL* mPopupMenu; diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index b146ed9b389..8e5a76bfae5 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -790,7 +790,7 @@ void LLFloaterReporter::takeScreenshot() // store in the image list so it doesn't try to fetch from the server LLPointer<LLViewerFetchedTexture> image_in_list = LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid, TRUE, FALSE, LLViewerTexture::FETCHED_TEXTURE); - image_in_list->createGLTexture(0, raw); + image_in_list->createGLTexture(0, raw, 0, TRUE, LLViewerTexture::OTHER); // the texture picker then uses that texture LLTexturePicker* texture = getChild<LLTextureCtrl>("screenshot"); diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index fbaf10d4553..63560d2038c 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -55,7 +55,6 @@ #include "llregionhandle.h" #include "llscrolllistctrl.h" #include "llslurl.h" -#include "lltabcontainer.h" #include "lltextbox.h" #include "lltracker.h" #include "lltrans.h" @@ -63,7 +62,9 @@ #include "llviewermenu.h" #include "llviewerregion.h" #include "llviewerstats.h" +#include "llviewertexture.h" #include "llworldmap.h" +#include "llworldmapmessage.h" #include "llworldmapview.h" #include "lluictrlfactory.h" #include "llappviewer.h" @@ -79,6 +80,12 @@ //--------------------------------------------------------------------------- static const F32 MAP_ZOOM_TIME = 0.2f; +// Merov: we switched from using the "world size" (which varies depending where the user went) to a fixed +// width of 512 regions max visible at a time. This makes the zoom slider works in a consistent way across +// sessions and doesn't prevent the user to pan the world if it was to grow a lot beyond that limit. +// Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window. +static const S32 MAX_VISIBLE_REGIONS = 512; + enum EPanDirection { PAN_UP, @@ -160,11 +167,11 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key) gFloaterWorldMap = this; mFactoryMap["objects_mapview"] = LLCallbackMap(createWorldMapView, NULL); - mFactoryMap["terrain_mapview"] = LLCallbackMap(createWorldMapView, NULL); //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_world_map.xml", FALSE); mCommitCallbackRegistrar.add("WMap.Location", boost::bind(&LLFloaterWorldMap::onLocationCommit, this)); mCommitCallbackRegistrar.add("WMap.AvatarCombo", boost::bind(&LLFloaterWorldMap::onAvatarComboCommit, this)); + mCommitCallbackRegistrar.add("WMap.Landmark", boost::bind(&LLFloaterWorldMap::onLandmarkComboCommit, this)); mCommitCallbackRegistrar.add("WMap.SearchResult", boost::bind(&LLFloaterWorldMap::onCommitSearchResult, this)); mCommitCallbackRegistrar.add("WMap.CommitLocation", boost::bind(&LLFloaterWorldMap::onCommitLocation, this)); mCommitCallbackRegistrar.add("WMap.GoHome", boost::bind(&LLFloaterWorldMap::onGoHome, this)); @@ -183,17 +190,7 @@ void* LLFloaterWorldMap::createWorldMapView(void* data) BOOL LLFloaterWorldMap::postBuild() { - mTabs = getChild<LLTabContainer>("maptab"); - if (!mTabs) return FALSE; - - mTabs->setCommitCallback(boost::bind(&LLFloaterWorldMap::onCommitBackground, this)); - - // The following callback syncs the worlmap tabs with the images. - // Commented out since it was crashing when LLWorldMap became a singleton. - // We should be fine without it but override the onOpen method and put it - // there if it turns out to be needed. -MG - // - //onCommitBackground(); + mPanel = getChild<LLPanel>("objects_mapview"); LLComboBox *avatar_combo = getChild<LLComboBox>("friend combo"); if (avatar_combo) @@ -221,8 +218,8 @@ BOOL LLFloaterWorldMap::postBuild() landmark_combo->setTextEntryCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) ); } - mCurZoomVal = log(gMapScale)/log(2.f); - childSetValue("zoom slider", gMapScale); + mCurZoomVal = log(LLWorldMapView::sMapScale)/log(2.f); + childSetValue("zoom slider", LLWorldMapView::sMapScale); setDefaultBtn(NULL); @@ -235,7 +232,7 @@ BOOL LLFloaterWorldMap::postBuild() LLFloaterWorldMap::~LLFloaterWorldMap() { // All cleaned up by LLView destructor - mTabs = NULL; + mPanel = NULL; // Inventory deletes all observers on shutdown mInventory = NULL; @@ -268,7 +265,7 @@ void LLFloaterWorldMap::onOpen(const LLSD& key) mIsClosing = FALSE; LLWorldMapView* map_panel; - map_panel = (LLWorldMapView*)mTabs->getCurrentPanel(); + map_panel = (LLWorldMapView*)gFloaterWorldMap->mPanel; map_panel->clearLastClick(); { @@ -279,15 +276,8 @@ void LLFloaterWorldMap::onOpen(const LLSD& key) } map_panel->updateVisibleBlocks(); - // Reload the agent positions when we show the window - LLWorldMap::getInstance()->eraseItems(); - - // Reload any maps that may have changed - LLWorldMap::getInstance()->clearSimFlags(); - - const S32 panel_num = mTabs->getCurrentPanelIndex(); - const bool request_from_sim = true; - LLWorldMap::getInstance()->setCurrentLayer(panel_num, request_from_sim); + // Reload items as they may have changed + LLWorldMap::getInstance()->reloadItems(); // We may already have a bounding box for the regions of the world, // so use that to adjust the view. @@ -321,12 +311,9 @@ void LLFloaterWorldMap::onOpen(const LLSD& key) // static void LLFloaterWorldMap::reloadIcons(void*) { - LLWorldMap::getInstance()->eraseItems(); - - LLWorldMap::getInstance()->sendMapLayerRequest(); + LLWorldMap::getInstance()->reloadItems(); } - // virtual BOOL LLFloaterWorldMap::handleHover(S32 x, S32 y, MASK mask) { @@ -358,12 +345,6 @@ BOOL LLFloaterWorldMap::handleScrollWheel(S32 x, S32 y, S32 clicks) void LLFloaterWorldMap::reshape( S32 width, S32 height, BOOL called_from_parent ) { LLFloater::reshape( width, height, called_from_parent ); - - // Might have changed size of world display area - // JC: Technically, this is correct, but it makes the slider "pop" - // if you resize the window, then draw the slider. Just leaving it - // the way it was when you opened the window seems better. - // adjustZoomSliderBounds(); } @@ -445,7 +426,7 @@ void LLFloaterWorldMap::draw() childSetEnabled("Teleport", (BOOL)tracking_status); // childSetEnabled("Clear", (BOOL)tracking_status); - childSetEnabled("Show Destination", (BOOL)tracking_status || LLWorldMap::getInstance()->mIsTrackingUnknownLocation); + childSetEnabled("Show Destination", (BOOL)tracking_status || LLWorldMap::getInstance()->isTracking()); childSetEnabled("copy_slurl", (mSLURL.size() > 0) ); setMouseOpaque(TRUE); @@ -465,6 +446,18 @@ void LLFloaterWorldMap::draw() mCurZoomVal = lerp(mCurZoomVal, (F32)childGetValue("zoom slider").asReal(), interp); F32 map_scale = 256.f*pow(2.f, mCurZoomVal); LLWorldMapView::setScale( map_scale ); + + // Enable/disable checkboxes depending on the zoom level + // If above threshold level (i.e. low res) -> Disable all checkboxes + // If under threshold level (i.e. high res) -> Enable all checkboxes + bool enable = LLWorldMapView::showRegionInfo(); + childSetEnabled("people_chk", enable); + childSetEnabled("infohub_chk", enable); + childSetEnabled("telehub_chk", enable); + childSetEnabled("land_for_sale_chk", enable); + childSetEnabled("event_chk", enable); + childSetEnabled("event_mature_chk", enable); + childSetEnabled("event_adult_chk", enable); LLFloater::draw(); } @@ -553,14 +546,14 @@ void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id ) void LLFloaterWorldMap::trackEvent(const LLItemInfo &event_info) { mTrackedStatus = LLTracker::TRACKING_LOCATION; - LLTracker::trackLocation(event_info.mPosGlobal, event_info.mName, event_info.mToolTip, LLTracker::LOCATION_EVENT); + LLTracker::trackLocation(event_info.getGlobalPosition(), event_info.getName(), event_info.getToolTip(), LLTracker::LOCATION_EVENT); setDefaultBtn("Teleport"); } void LLFloaterWorldMap::trackGenericItem(const LLItemInfo &item) { mTrackedStatus = LLTracker::TRACKING_LOCATION; - LLTracker::trackLocation(item.mPosGlobal, item.mName, item.mToolTip, LLTracker::LOCATION_ITEM); + LLTracker::trackLocation(item.getGlobalPosition(), item.getName(), item.getToolTip(), LLTracker::LOCATION_ITEM); setDefaultBtn("Teleport"); } @@ -569,29 +562,27 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global) LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global); if (!sim_info) { - LLWorldMap::getInstance()->mIsTrackingUnknownLocation = TRUE; - LLWorldMap::getInstance()->mInvalidLocation = FALSE; - LLWorldMap::getInstance()->mUnknownLocation = pos_global; + // We haven't found a region for that point yet, leave the tracking to the world map + LLWorldMap::getInstance()->setTracking(pos_global); LLTracker::stopTracking(NULL); S32 world_x = S32(pos_global.mdV[0] / 256); S32 world_y = S32(pos_global.mdV[1] / 256); - LLWorldMap::getInstance()->sendMapBlockRequest(world_x, world_y, world_x, world_y, true); + LLWorldMapMessage::getInstance()->sendMapBlockRequest(world_x, world_y, world_x, world_y, true); setDefaultBtn(""); return; } - if (sim_info->mAccess == SIM_ACCESS_DOWN) + if (sim_info->isDown()) { - // Down sim. Show the blue circle of death! - LLWorldMap::getInstance()->mIsTrackingUnknownLocation = TRUE; - LLWorldMap::getInstance()->mUnknownLocation = pos_global; - LLWorldMap::getInstance()->mInvalidLocation = TRUE; + // Down region. Show the blue circle of death! + // i.e. let the world map that this and tell it it's invalid + LLWorldMap::getInstance()->setTracking(pos_global); + LLWorldMap::getInstance()->setTrackingInvalid(); LLTracker::stopTracking(NULL); setDefaultBtn(""); return; } - std::string sim_name; - LLWorldMap::getInstance()->simNameFromPosGlobal( pos_global, sim_name ); + std::string sim_name = sim_info->getName(); F32 region_x = (F32)fmod( pos_global.mdV[VX], (F64)REGION_WIDTH_METERS ); F32 region_y = (F32)fmod( pos_global.mdV[VY], (F64)REGION_WIDTH_METERS ); std::string full_name = llformat("%s (%d, %d, %d)", @@ -603,9 +594,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global) std::string tooltip(""); mTrackedStatus = LLTracker::TRACKING_LOCATION; LLTracker::trackLocation(pos_global, full_name, tooltip); - LLWorldMap::getInstance()->mIsTrackingUnknownLocation = FALSE; - LLWorldMap::getInstance()->mIsTrackingDoubleClick = FALSE; - LLWorldMap::getInstance()->mIsTrackingCommit = FALSE; + LLWorldMap::getInstance()->cancelTracking(); // The floater is taking over the tracking setDefaultBtn("Teleport"); } @@ -718,9 +707,9 @@ void LLFloaterWorldMap::trackURL(const std::string& region_name, S32 x_coord, S3 // pass sim name to combo box gFloaterWorldMap->mCompletingRegionName = region_name; - LLWorldMap::getInstance()->sendNamedRegionRequest(region_name); + LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name); LLStringUtil::toLower(gFloaterWorldMap->mCompletingRegionName); - LLWorldMap::getInstance()->mIsTrackingCommit = TRUE; + LLWorldMap::getInstance()->setTrackingCommit(); } } @@ -787,19 +776,12 @@ void LLFloaterWorldMap::buildAvatarIDList() // Delete all but the "None" entry S32 list_size = list->getItemCount(); - while (list_size > 1) + if (list_size > 1) { - list->selectNthItem(1); + list->selectItemRange(1, -1); list->operateOnSelection(LLCtrlListInterface::OP_DELETE); - --list_size; } - LLSD default_column; - default_column["name"] = "friend name"; - default_column["label"] = "Friend Name"; - default_column["width"] = 500; - list->addColumn(default_column); - // Get all of the calling cards for avatar that are currently online LLCollectMappableBuddies collector; LLAvatarTracker::instance().applyFunctor(collector); @@ -820,10 +802,7 @@ void LLFloaterWorldMap::buildAvatarIDList() void LLFloaterWorldMap::buildLandmarkIDLists() { LLCtrlListInterface *list = childGetListInterface("landmark combo"); - if (!list) - { - return; - } + if (!list) return; // Delete all but the "None" entry S32 list_size = list->getItemCount(); @@ -864,7 +843,6 @@ void LLFloaterWorldMap::buildLandmarkIDLists() mLandmarkAssetIDList.put( item->getAssetUUID() ); mLandmarkItemIDList.put( item->getUUID() ); } - list->sortByColumn(std::string("landmark name"), TRUE); list->selectFirstItem(); } @@ -901,7 +879,7 @@ void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui) { childSetValue("spin z", 0); } - LLWorldMap::getInstance()->mIsTrackingCommit = FALSE; + LLWorldMap::getInstance()->cancelTracking(); mCompletingRegionName = ""; } @@ -937,18 +915,16 @@ void LLFloaterWorldMap::clearAvatarSelection(BOOL clear_ui) // can see the whole world, plus a little. void LLFloaterWorldMap::adjustZoomSliderBounds() { - // World size in regions - S32 world_width_regions = LLWorldMap::getInstance()->getWorldWidth() / REGION_WIDTH_UNITS; - S32 world_height_regions = LLWorldMap::getInstance()->getWorldHeight() / REGION_WIDTH_UNITS; - - // Pad the world size a little bit, so we have a nice border on - // the edge - world_width_regions++; - world_height_regions++; + // Merov: we switched from using the "world size" (which varies depending where the user went) to a fixed + // width of 512 regions max visible at a time. This makes the zoom slider works in a consistent way across + // sessions and doesn't prevent the user to pan the world if it was to grow a lot beyond that limit. + // Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window. + S32 world_width_regions = MAX_VISIBLE_REGIONS; + S32 world_height_regions = MAX_VISIBLE_REGIONS; // Find how much space we have to display the world LLWorldMapView* map_panel; - map_panel = (LLWorldMapView*)mTabs->getCurrentPanel(); + map_panel = (LLWorldMapView*)mPanel; LLRect view_rect = map_panel->getRect(); // View size in pixels @@ -1161,15 +1137,15 @@ void LLFloaterWorldMap::onLocationCommit() LLStringUtil::toLower(str); mCompletingRegionName = str; - LLWorldMap::getInstance()->mIsTrackingCommit = TRUE; + LLWorldMap::getInstance()->setTrackingCommit(); if (str.length() >= 3) { - LLWorldMap::getInstance()->sendNamedRegionRequest(str); + LLWorldMapMessage::getInstance()->sendNamedRegionRequest(str); } else { str += "#"; - LLWorldMap::getInstance()->sendNamedRegionRequest(str); + LLWorldMapMessage::getInstance()->sendNamedRegionRequest(str); } } @@ -1177,8 +1153,8 @@ void LLFloaterWorldMap::onClearBtn() { mTrackedStatus = LLTracker::TRACKING_NOTHING; LLTracker::stopTracking((void *)(intptr_t)TRUE); - LLWorldMap::getInstance()->mIsTrackingUnknownLocation = FALSE; - mSLURL = ""; // Clear the SLURL since it's invalid + LLWorldMap::getInstance()->cancelTracking(); + mSLURL = ""; // Clear the SLURL since it's invalid mSetToUserPosition = TRUE; // Revert back to the current user position } @@ -1230,9 +1206,9 @@ void LLFloaterWorldMap::centerOnTarget(BOOL animate) pos_global = LLTracker::getTrackedPositionGlobal() - gAgent.getCameraPositionGlobal(); } } - else if(LLWorldMap::getInstance()->mIsTrackingUnknownLocation) + else if(LLWorldMap::getInstance()->isTracking()) { - pos_global = LLWorldMap::getInstance()->mUnknownLocation - gAgent.getCameraPositionGlobal();; + pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal() - gAgent.getCameraPositionGlobal();; } else { @@ -1240,8 +1216,8 @@ void LLFloaterWorldMap::centerOnTarget(BOOL animate) pos_global.clearVec(); } - LLWorldMapView::setPan( -llfloor((F32)(pos_global.mdV[VX] * (F64)LLWorldMapView::sPixelsPerMeter)), - -llfloor((F32)(pos_global.mdV[VY] * (F64)LLWorldMapView::sPixelsPerMeter)), + LLWorldMapView::setPan( -llfloor((F32)(pos_global.mdV[VX] * (F64)LLWorldMapView::sMapScale / REGION_WIDTH_METERS)), + -llfloor((F32)(pos_global.mdV[VY] * (F64)LLWorldMapView::sMapScale / REGION_WIDTH_METERS)), !animate); mWaitingForTracker = FALSE; } @@ -1399,13 +1375,6 @@ void LLFloaterWorldMap::flyToAvatar() } } -void LLFloaterWorldMap::onCommitBackground() -{ - // Find my index - S32 index = mTabs->getCurrentPanelIndex(); - LLWorldMap::getInstance()->setCurrentLayer(index); -} - void LLFloaterWorldMap::updateSims(bool found_null_sim) { if (mCompletingRegionName == "") @@ -1422,24 +1391,23 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) S32 num_results = 0; std::map<U64, LLSimInfo*>::const_iterator it; - for (it = LLWorldMap::getInstance()->mSimInfoMap.begin(); it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it) + for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it) { - LLSimInfo* info = (*it).second; - std::string sim_name = info->mName; - std::string sim_name_lower = sim_name; + LLSimInfo* info = it->second; + std::string sim_name_lower = info->getName(); LLStringUtil::toLower(sim_name_lower); if (sim_name_lower.substr(0, name_length) == mCompletingRegionName) { if (sim_name_lower == mCompletingRegionName) { - match = sim_name; + match = info->getName(); } LLSD value; - value["id"] = sim_name; + value["id"] = info->getName(); value["columns"][0]["column"] = "sim_name"; - value["columns"][0]["value"] = sim_name; + value["columns"][0]["value"] = info->getName(); list->addElement(value); num_results++; } @@ -1496,15 +1464,13 @@ void LLFloaterWorldMap::onCommitSearchResult() LLStringUtil::toLower(sim_name); std::map<U64, LLSimInfo*>::const_iterator it; - for (it = LLWorldMap::getInstance()->mSimInfoMap.begin(); it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it) + for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it) { - LLSimInfo* info = (*it).second; - std::string info_sim_name = info->mName; - LLStringUtil::toLower(info_sim_name); + LLSimInfo* info = it->second; - if (sim_name == info_sim_name) + if (info->isName(sim_name)) { - LLVector3d pos_global = from_region_handle( info->mHandle ); + LLVector3d pos_global = info->getGlobalOrigin(); F64 local_x = childGetValue("spin x"); F64 local_y = childGetValue("spin y"); F64 local_z = childGetValue("spin z"); diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index 20a8e6d3217..7feebb583d8 100644 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -96,7 +96,7 @@ class LLFloaterWorldMap : public LLFloater static const LLUUID& getHomeID() { return sHomeID; } // A z_attenuation of 0.0f collapses the distance into the X-Y plane - F32 getDistanceToDestination(const LLVector3d& pos_global, F32 z_attenuation = 0.5f) const; + F32 getDistanceToDestination(const LLVector3d& pos_global, F32 z_attenuation = 0.5f) const; void clearLocationSelection(BOOL clear_ui = FALSE); void clearAvatarSelection(BOOL clear_ui = FALSE); @@ -121,8 +121,6 @@ class LLFloaterWorldMap : public LLFloater void onAvatarComboPrearrange(); void onAvatarComboCommit(); - void onCommitBackground(); - void onComboTextEntry( ); void onSearchTextEntry( LLLineEditor* ctrl ); @@ -155,10 +153,10 @@ class LLFloaterWorldMap : public LLFloater void cacheLandmarkPosition(); -protected: - LLTabContainer* mTabs; +private: + LLPanel* mPanel; // Panel displaying the map - // Sets gMapScale, in pixels per region + // Ties to LLWorldMapView::sMapScale, in pixels per region F32 mCurZoomVal; LLFrameTimer mZoomTimer; diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp index a341720aec3..12796507cad 100644 --- a/indra/newview/lllandmarkactions.cpp +++ b/indra/newview/lllandmarkactions.cpp @@ -49,6 +49,7 @@ #include "llstring.h" #include "llviewerinventory.h" #include "llviewerparcelmgr.h" +#include "llworldmapmessage.h" #include "llviewerwindow.h" #include "llwindow.h" #include "llworldmap.h" @@ -268,13 +269,13 @@ void LLLandmarkActions::getSLURLfromPosGlobal(const LLVector3d& global_pos, slur { U64 new_region_handle = to_region_handle(global_pos); - LLWorldMap::url_callback_t url_cb = boost::bind(&LLLandmarkActions::onRegionResponseSLURL, + LLWorldMapMessage::url_callback_t url_cb = boost::bind(&LLLandmarkActions::onRegionResponseSLURL, cb, global_pos, escaped, _2); - LLWorldMap::getInstance()->sendHandleRegionRequest(new_region_handle, url_cb, std::string("unused"), false); + LLWorldMapMessage::getInstance()->sendHandleRegionRequest(new_region_handle, url_cb, std::string("unused"), false); } } @@ -285,18 +286,19 @@ void LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(const LLVector3d& gl if (sim_infop) { LLVector3 pos = sim_infop->getLocalPos(global_pos); - cb(sim_infop->mName, llround(pos.mV[VX]), llround(pos.mV[VY])); + std::string name = sim_infop->getName() ; + cb(name, llround(pos.mV[VX]), llround(pos.mV[VY])); } else { U64 new_region_handle = to_region_handle(global_pos); - LLWorldMap::url_callback_t url_cb = boost::bind(&LLLandmarkActions::onRegionResponseNameAndCoords, + LLWorldMapMessage::url_callback_t url_cb = boost::bind(&LLLandmarkActions::onRegionResponseNameAndCoords, cb, global_pos, _1); - LLWorldMap::getInstance()->sendHandleRegionRequest(new_region_handle, url_cb, std::string("unused"), false); + LLWorldMapMessage::getInstance()->sendHandleRegionRequest(new_region_handle, url_cb, std::string("unused"), false); } } @@ -328,7 +330,8 @@ void LLLandmarkActions::onRegionResponseNameAndCoords(region_name_and_coords_cal if (sim_infop) { LLVector3 local_pos = sim_infop->getLocalPos(global_pos); - cb(sim_infop->mName, llround(local_pos.mV[VX]), llround(local_pos.mV[VY])); + std::string name = sim_infop->getName() ; + cb(name, llround(local_pos.mV[VX]), llround(local_pos.mV[VY])); } } diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index b91e23eace4..b60f0f12467 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -51,7 +51,7 @@ #include "llurlsimstring.h" #include "llviewerinventory.h" #include "llviewerparcelmgr.h" -#include "llworldmap.h" +#include "llworldmapmessage.h" #include "llappviewer.h" #include "llviewercontrol.h" #include "llfloatermediabrowser.h" @@ -386,14 +386,13 @@ void LLNavigationBar::onLocationSelection() // Resolve the region name to its global coordinates. // If resolution succeeds we'll teleport. - LLWorldMap::url_callback_t cb = boost::bind( + LLWorldMapMessage::url_callback_t cb = boost::bind( &LLNavigationBar::onRegionNameResponse, this, typed_location, region_name, local_coords, _1, _2, _3, _4); // connect the callback each time, when user enter new location to get real location of agent after teleport mTeleportFinishConnection = LLViewerParcelMgr::getInstance()-> setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1,typed_location)); - - LLWorldMap::getInstance()->sendNamedRegionRequest(region_name, cb, std::string("unused"), false); + LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name, cb, std::string("unused"), false); } void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, const std::string& typed_location) diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index b6b433c28f1..4286582cdc5 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -65,9 +65,15 @@ static LLDefaultChildRegistry::Register<LLNetMap> r1("net_map"); +const F32 LLNetMap::MAP_SCALE_MIN = 32; +const F32 LLNetMap::MAP_SCALE_MID = 1024; +const F32 LLNetMap::MAP_SCALE_MAX = 4096; + const F32 MAP_SCALE_INCREMENT = 16; -const F32 MAP_MIN_PICK_DIST = 4; -const F32 MAX_PRIM_RADIUS = 256.0f; // Don't try to draw giant mega-prims on the mini map +const F32 MAP_SCALE_ZOOM_FACTOR = 1.04f; // Zoom in factor per click of scroll wheel (4%) +const F32 MIN_DOT_RADIUS = 3.5f; +const F32 DOT_SCALE = 0.75f; +const F32 MIN_PICK_SCALE = 2.f; LLNetMap::LLNetMap (const Params & p) : LLUICtrl (p), @@ -89,6 +95,7 @@ LLNetMap::LLNetMap (const Params & p) mRotateMap(FALSE), mToolTipMsg() { + mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS); } LLNetMap::~LLNetMap() @@ -101,17 +108,18 @@ void LLNetMap::setScale( F32 scale ) if (mObjectImagep.notNull()) { - F32 half_width = (F32)(getRect().getWidth() / 2); - F32 half_height = (F32)(getRect().getHeight() / 2); - F32 radius = sqrt( half_width * half_width + half_height * half_height ); - F32 region_widths = (2.f*radius)/mScale; + F32 width = (F32)(getRect().getWidth()); + F32 height = (F32)(getRect().getHeight()); + F32 diameter = sqrt(width * width + height * height); + F32 region_widths = diameter / mScale; F32 meters = region_widths * LLWorld::getInstance()->getRegionWidthInMeters(); F32 num_pixels = (F32)mObjectImagep->getWidth(); - mObjectMapTPM = num_pixels/meters; - mObjectMapPixels = 2.f*radius; + mObjectMapTPM = num_pixels / meters; + mObjectMapPixels = diameter; } mPixelsPerMeter = mScale / REGION_WIDTH_METERS; + mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS); mUpdateNow = TRUE; } @@ -302,6 +310,7 @@ void LLNetMap::draw() LLUI::getMousePositionLocal(this, &local_mouse_x, &local_mouse_y); mClosestAgentToCursor.setNull(); F32 closest_dist = F32_MAX; + F32 min_pick_dist = mDotRadius * MIN_PICK_SCALE; // Draw avatars for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); @@ -345,10 +354,10 @@ void LLNetMap::draw() LLWorldMapView::drawAvatar( pos_map.mV[VX], pos_map.mV[VY], show_as_friend ? map_avatar_friend_color : map_avatar_color, - pos_map.mV[VZ]); + pos_map.mV[VZ], mDotRadius); F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), LLVector2(local_mouse_x,local_mouse_y)); - if(dist_to_cursor < MAP_MIN_PICK_DIST && dist_to_cursor < closest_dist) + if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist) { closest_dist = dist_to_cursor; mClosestAgentToCursor = regionp->mMapAvatarIDs.get(i); @@ -378,10 +387,12 @@ void LLNetMap::draw() // Draw dot for self avatar position pos_global = gAgent.getPositionGlobal(); pos_map = globalPosToView(pos_global); - LLUIImagePtr you = LLWorldMapView::sAvatarYouSmallImage; - you->draw( - llround(pos_map.mV[VX]) - you->getWidth()/2, - llround(pos_map.mV[VY]) - you->getHeight()/2); + LLUIImagePtr you = LLWorldMapView::sAvatarYouLargeImage; + S32 dot_width = llround(mDotRadius * 2.f); + you->draw(llround(pos_map.mV[VX] - mDotRadius), + llround(pos_map.mV[VY] - mDotRadius), + dot_width, + dot_width); // Draw frustum F32 meters_to_pixels = mScale/ LLWorld::getInstance()->getRegionWidthInMeters(); @@ -429,6 +440,12 @@ void LLNetMap::draw() LLUICtrl::draw(); } +void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + LLUICtrl::reshape(width, height, called_from_parent); + createObjectImage(); +} + LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos ) { LLVector3d relative_pos_global = global_pos - gAgent.getCameraPositionGlobal(); @@ -504,8 +521,12 @@ LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y ) BOOL LLNetMap::handleScrollWheel(S32 x, S32 y, S32 clicks) { - // note that clicks are reversed from what you'd think - setScale(llclamp(mScale - clicks*MAP_SCALE_INCREMENT, MAP_SCALE_MIN, MAP_SCALE_MAX)); + // note that clicks are reversed from what you'd think: i.e. > 0 means zoom out, < 0 means zoom in + F32 scale = mScale; + + scale *= pow(MAP_SCALE_ZOOM_FACTOR, -clicks); + setScale(llclamp(scale, MAP_SCALE_MIN, MAP_SCALE_MAX)); + return TRUE; } @@ -567,9 +588,7 @@ void LLNetMap::renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U & LLVector3 local_pos; local_pos.setVec( pos - mObjectImageCenterGlobal ); - F32 radius_clamped = llmin(radius_meters, MAX_PRIM_RADIUS); - - S32 diameter_pixels = llround(2 * radius_clamped * mObjectMapTPM); + S32 diameter_pixels = llround(2 * radius_meters * mObjectMapTPM); renderPoint( local_pos, color, diameter_pixels ); } @@ -662,13 +681,13 @@ void LLNetMap::renderPoint(const LLVector3 &pos_local, const LLColor4U &color, void LLNetMap::createObjectImage() { // Find the size of the side of a square that surrounds the circle that surrounds getRect(). - F32 half_width = (F32)(getRect().getWidth() / 2); - F32 half_height = (F32)(getRect().getHeight() / 2); - F32 radius = sqrt( half_width * half_width + half_height * half_height ); - S32 square_size = S32( 2 * radius ); + // ... which is, the diagonal of the rect. + F32 width = (F32)getRect().getWidth(); + F32 height = (F32)getRect().getHeight(); + S32 square_size = llround( sqrt(width*width + height*height) ); // Find the least power of two >= the minimum size. - const S32 MIN_SIZE = 32; + const S32 MIN_SIZE = 64; const S32 MAX_SIZE = 256; S32 img_size = MIN_SIZE; while( (img_size*2 < square_size ) && (img_size < MAX_SIZE) ) @@ -684,7 +703,7 @@ void LLNetMap::createObjectImage() U8* data = mObjectRawImagep->getData(); memset( data, 0, img_size * img_size * 4 ); mObjectImagep = LLViewerTextureManager::getLocalTexture( mObjectRawImagep.get(), FALSE); - setScale(mScale); } + setScale(mScale); mUpdateNow = TRUE; } diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index 5ebdd133846..7088ab3e70c 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -70,9 +70,14 @@ class LLNetMap : public LLUICtrl public: virtual ~LLNetMap(); + static const F32 MAP_SCALE_MIN; + static const F32 MAP_SCALE_MID; + static const F32 MAP_SCALE_MAX; + /*virtual*/ void draw(); /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); /*virtual*/ BOOL handleToolTip( S32 x, S32 y, MASK mask); + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); void setScale( F32 scale ); void setRotateMap( BOOL b ) { mRotateMap = b; } @@ -94,16 +99,17 @@ class LLNetMap : public LLUICtrl void drawTracking( const LLVector3d& pos_global, const LLColor4& color, BOOL draw_arrow = TRUE); - - void createObjectImage(); + void createObjectImage(); + private: LLUIColor mBackgroundColor; F32 mScale; // Size of a region in pixels F32 mPixelsPerMeter; // world meters to map pixels F32 mObjectMapTPM; // texels per meter on map - F32 mObjectMapPixels; // Width of object map in pixels; + F32 mObjectMapPixels; // Width of object map in pixels + F32 mDotRadius; // Size of avatar markers F32 mTargetPanX; F32 mTargetPanY; F32 mCurPanX; diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 7dd9df674c0..92040eb2e56 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -357,7 +357,7 @@ void LLTeleportHistoryPanel::onCopySLURL() U64 new_region_handle = to_region_handle(global_pos); - LLWorldMap::url_callback_t cb = boost::bind( + LLWorldMapMessage::url_callback_t cb = boost::bind( &LLPanelPlacesTab::onRegionResponse, this, global_pos, _1, _2, _3, _4); diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 9c21faa3be5..a44794122f6 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -192,6 +192,11 @@ void LLPreviewTexture::draw() // Pump the texture priority F32 pixel_area = mLoadingFullImage ? (F32)MAX_IMAGE_AREA : (F32)(interior.getWidth() * interior.getHeight() ); mImage->addTextureStats( pixel_area ); + if(pixel_area > 0.f) + { + //boost the previewed image priority to the highest to make it to get loaded first. + mImage->setAdditionalDecodePriority(1.0f) ; + } // Don't bother decoding more than we can display, unless // we're loading the full image. @@ -554,6 +559,7 @@ void LLPreviewTexture::loadAsset() { mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); mImage->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); + mImage->forceToSaveRawImage(0) ; mAssetStatus = PREVIEW_ASSET_LOADING; updateDimensions(); } diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 9f317803ce7..5afb821d157 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -2679,8 +2679,7 @@ void renderTexturePriority(LLDrawable* drawable) //LLViewerTexture* imagep = facep->getTexture(); //if (imagep) { - - //F32 vsize = LLVOVolume::getTextureVirtualSize(facep); + //F32 vsize = imagep->mMaxVirtualSize; F32 vsize = facep->getPixelArea(); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 51b651d58ee..bfe753a0aa7 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -61,6 +61,7 @@ #include "llfocusmgr.h" #include "llhttpsender.h" #include "lllocationhistory.h" +#include "llimageworker.h" #include "llloginflags.h" #include "llmd5.h" #include "llmemorystream.h" @@ -170,7 +171,7 @@ #include "llvoclouds.h" #include "llweb.h" #include "llworld.h" -#include "llworldmap.h" +#include "llworldmapmessage.h" #include "llxfermanager.h" #include "pipeline.h" #include "llappviewer.h" @@ -1812,6 +1813,7 @@ bool idle_startup() gViewerWindow->moveProgressViewToFront(); LLError::logToFixedBuffer(gDebugView->mDebugConsolep); + // set initial visibility of debug console gDebugView->mDebugConsolep->setVisible(gSavedSettings.getBOOL("ShowDebugConsole")); } @@ -3266,9 +3268,8 @@ void register_viewer_callbacks(LLMessageSystem* msg) msg->setHandlerFunc("AvatarPickerReply", LLFloaterAvatarPicker::processAvatarPickerReply); - msg->setHandlerFunc("MapLayerReply", LLWorldMap::processMapLayerReply); - msg->setHandlerFunc("MapBlockReply", LLWorldMap::processMapBlockReply); - msg->setHandlerFunc("MapItemReply", LLWorldMap::processMapItemReply); + msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply); + msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply); msg->setHandlerFunc("EventInfoReply", LLPanelEvent::processEventInfoReply); msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply); diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index 5440b2c9adf..1d479bac8ca 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -234,12 +234,7 @@ void LLSurface::createSTexture() { if (!mSTexturep) { - // Fill with dummy gray data. - - //mSTexturep = LLViewerTextureManager::getLocalTexture(sTextureSize, sTextureSize, 3, FALSE); - //mSTexturep->dontDiscard(); - //mSTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); - + // Fill with dummy gray data. // GL NOT ACTIVE HERE LLPointer<LLImageRaw> raw = new LLImageRaw(sTextureSize, sTextureSize, 3); U8 *default_texture = raw->getData(); diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index 5d9046ac905..4ff5906b7e0 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -1371,7 +1371,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph) LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode(); - gGL.getTexUnit(0)->bind(tex); + gGL.getTexUnit(0)->bind(tex, TRUE); gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); gl_rect_2d_simple_tex( width, height ); @@ -1393,7 +1393,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph) LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); if( tex ) { - gGL.getTexUnit(0)->bind(tex); + gGL.getTexUnit(0)->bind(tex, TRUE); gl_rect_2d_simple_tex( width, height ); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } @@ -1506,7 +1506,7 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height) if( tex ) { LLGLSNoAlphaTest gls_no_alpha_test; - gGL.getTexUnit(0)->bind(tex); + gGL.getTexUnit(0)->bind(tex, TRUE); gl_rect_2d_simple_tex( width, height ); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } @@ -1585,7 +1585,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode(); - gGL.getTexUnit(0)->bind(tex); + gGL.getTexUnit(0)->bind(tex, TRUE); gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); gl_rect_2d_simple_tex( width, height ); @@ -1608,7 +1608,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC ( (tex->getComponents() == 1) && getInfo()->mStaticImageIsMask ) ) { LLGLSNoAlphaTest gls_no_alpha_test; - gGL.getTexUnit(0)->bind(tex); + gGL.getTexUnit(0)->bind(tex, TRUE); gl_rect_2d_simple_tex( width, height ); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } @@ -2034,7 +2034,7 @@ LLViewerTexture* LLTexLayerStaticImageList::getTexture(const std::string& file_n // that once an image is a mask it's always a mask. tex->setExplicitFormat( GL_ALPHA8, GL_ALPHA ); } - tex->createGLTexture(0, image_raw); + tex->createGLTexture(0, image_raw, 0, TRUE, LLViewerTexture::LOCAL); gGL.getTexUnit(0)->bind(tex); tex->setAddressMode(LLTexUnit::TAM_CLAMP); diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 1b249d75d15..69a2d1d7a6b 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -43,11 +43,17 @@ // Included to allow LLTextureCache::purgeTextures() to pause watchdog timeout #include "llappviewer.h" -#define USE_LFS_READ 0 -#define USE_LFS_WRITE 0 - -// Note: first 4 bytes store file size, rest is j2c data -const S32 TEXTURE_CACHE_ENTRY_SIZE = FIRST_PACKET_SIZE; //1024; +// Cache organization: +// cache/texture.entries +// Unordered array of Entry structs +// cache/texture.cache +// First TEXTURE_CACHE_ENTRY_SIZE bytes of each texture in texture.entries in same order +// cache/textures/[0-F]/UUID.texture +// Actual texture body files + +const S32 TEXTURE_CACHE_ENTRY_SIZE = 1024; +const F32 TEXTURE_CACHE_PURGE_AMOUNT = .20f; // % amount to reduce the cache by when it exceeds its limit +const F32 TEXTURE_CACHE_LRU_SIZE = .10f; // % amount for LRU list (low overhead to regenerate) class LLTextureCacheWorker : public LLWorkerClass { @@ -309,94 +315,75 @@ void LLTextureCacheWorker::startWork(S32 param) { } +// This is where a texture is read from the cache system (header and body) +// Current assumption are: +// - the whole data are in a raw form, will be stored at mReadData +// - the size of this raw data is mDataSize and can be smaller than TEXTURE_CACHE_ENTRY_SIZE (the size of a record in the header cache) +// - the code supports offset reading but this is actually never exercised in the viewer bool LLTextureCacheRemoteWorker::doRead() { + bool done = false; + S32 idx = -1; + S32 local_size = 0; std::string local_filename; + // First state / stage : find out if the file is local if (mState == INIT) { std::string filename = mCache->getLocalFileName(mID); - local_filename = filename + ".j2c"; - local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool()); - if (local_size == 0) + // Is it a JPEG2000 file? { - local_filename = filename + ".tga"; + local_filename = filename + ".j2c"; local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool()); if (local_size > 0) { - mImageFormat = IMG_CODEC_TGA; - mDataSize = local_size; // Only a complete .tga file is valid + mImageFormat = IMG_CODEC_J2C; } } - if (local_size > 0) - { - mState = LOCAL; - } - else - { - mState = CACHE; - } - } - - if (mState == LOCAL) - { -#if USE_LFS_READ - if (mFileHandle == LLLFSThread::nullHandle()) + // If not, is it a jpeg file? + if (local_size == 0) { - mImageLocal = TRUE; - mImageSize = local_size; - if (!mDataSize || mDataSize + mOffset > local_size) + local_filename = filename + ".jpg"; + local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool()); + if (local_size > 0) { - mDataSize = local_size - mOffset; + mImageFormat = IMG_CODEC_JPEG; + mDataSize = local_size; // Only a complete .jpg file is valid } - if (mDataSize <= 0) - { - // no more data to read - mDataSize = 0; - return true; - } - mReadData = new U8[mDataSize]; - mBytesRead = -1; - mBytesToRead = mDataSize; - setPriority(LLWorkerThread::PRIORITY_LOW | mPriority); - mFileHandle = LLLFSThread::sLocal->read(local_filename, mReadData, mOffset, mDataSize, - new ReadResponder(mCache, mRequestHandle)); - return false; } - else + // Hmm... What about a targa file? (used for UI texture mostly) + if (local_size == 0) { - if (mBytesRead >= 0) - { - if (mBytesRead != mBytesToRead) - { -// llwarns << "Error reading file from local cache: " << local_filename -// << " Bytes: " << mDataSize << " Offset: " << mOffset -// << " / " << mDataSize << llendl; - mDataSize = 0; // failed - delete[] mReadData; - mReadData = NULL; - } - return true; - } - else + local_filename = filename + ".tga"; + local_size = LLAPRFile::size(local_filename, mCache->getLocalAPRFilePool()); + if (local_size > 0) { - return false; + mImageFormat = IMG_CODEC_TGA; + mDataSize = local_size; // Only a complete .tga file is valid } } -#else + // Determine the next stage: if we found a file, then LOCAL else CACHE + mState = (local_size > 0 ? LOCAL : CACHE); + } + + // Second state / stage : if the file is local, load it and leave + if (!done && (mState == LOCAL)) + { + llassert(local_size != 0); // we're assuming there is a non empty local file here... if (!mDataSize || mDataSize > local_size) { mDataSize = local_size; } + // Allocate read buffer mReadData = new U8[mDataSize]; S32 bytes_read = LLAPRFile::readEx(local_filename, mReadData, mOffset, mDataSize, mCache->getLocalAPRFilePool()); if (bytes_read != mDataSize) { -// llwarns << "Error reading file from local cache: " << local_filename -// << " Bytes: " << mDataSize << " Offset: " << mOffset -// << " / " << mDataSize << llendl; + llwarns << "Error reading file from local cache: " << local_filename + << " Bytes: " << mDataSize << " Offset: " << mOffset + << " / " << mDataSize << llendl; mDataSize = 0; delete[] mReadData; mReadData = NULL; @@ -406,405 +393,275 @@ bool LLTextureCacheRemoteWorker::doRead() mImageSize = local_size; mImageLocal = TRUE; } - return true; -#endif + // We're done... + done = true; } - S32 idx = -1; - - if (mState == CACHE) + // Second state / stage : identify the cache or not... + if (!done && (mState == CACHE)) { - llassert_always(mImageSize == 0); - idx = mCache->getHeaderCacheEntry(mID, false, &mImageSize); - if (idx >= 0 && mImageSize > mOffset) + idx = mCache->getHeaderCacheEntry(mID, mImageSize); + if (idx < 0) { - llassert_always(mImageSize > 0); - if (!mDataSize || mDataSize > mImageSize) - { - mDataSize = mImageSize; - } - mState = mOffset < TEXTURE_CACHE_ENTRY_SIZE ? HEADER : BODY; + // The texture is *not* cached. We're done here... + mDataSize = 0; // no data + done = true; } else { - mDataSize = 0; // no data - return true; + // If the read offset is bigger than the header cache, we read directly from the body + // Note that currently, we *never* read with offset from the cache, so the result is *always* HEADER + mState = mOffset < TEXTURE_CACHE_ENTRY_SIZE ? HEADER : BODY; } } - if (mState == HEADER) + // Third state / stage : read data from the header cache (texture.entries) file + if (!done && (mState == HEADER)) { -#if USE_LFS_READ - if (mFileHandle == LLLFSThread::nullHandle()) - { - llassert_always(idx >= 0); - llassert_always(mOffset < TEXTURE_CACHE_ENTRY_SIZE); - S32 offset = idx * TEXTURE_CACHE_ENTRY_SIZE + mOffset; - S32 size = TEXTURE_CACHE_ENTRY_SIZE - mOffset; - llassert_always(mReadData == NULL); - mReadData = new U8[size]; - mBytesRead = -1; - mBytesToRead = size; - setPriority(LLWorkerThread::PRIORITY_LOW | mPriority); - mFileHandle = LLLFSThread::sLocal->read(mCache->mHeaderDataFileName, - mReadData, offset, mBytesToRead, - new ReadResponder(mCache, mRequestHandle)); - return false; - } - else - { - if (mBytesRead >= 0) - { - if (mBytesRead != mBytesToRead) - { -// llwarns << "LLTextureCacheWorker: " << mID -// << " incorrect number of bytes read from header: " << mBytesRead -// << " != " << mBytesToRead << llendl; - mDataSize = -1; // failed - return true; - } - if (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE) - { - return true; // done - } - else - { - mFileHandle = LLLFSThread::nullHandle(); - mState = BODY; - } - } - else - { - return false; - } - } -#else - llassert_always(idx >= 0); + llassert_always(idx >= 0); // we need an entry here or reading the header makes no sense llassert_always(mOffset < TEXTURE_CACHE_ENTRY_SIZE); S32 offset = idx * TEXTURE_CACHE_ENTRY_SIZE + mOffset; + // Compute the size we need to read (in bytes) S32 size = TEXTURE_CACHE_ENTRY_SIZE - mOffset; + size = llmin(size, mDataSize); + // Allocate the read buffer mReadData = new U8[size]; S32 bytes_read = LLAPRFile::readEx(mCache->mHeaderDataFileName, mReadData, offset, size, mCache->getLocalAPRFilePool()); if (bytes_read != size) { -// llwarns << "LLTextureCacheWorker: " << mID -// << " incorrect number of bytes read from header: " << bytes_read -// << " / " << size << llendl; + llwarns << "LLTextureCacheWorker: " << mID + << " incorrect number of bytes read from header: " << bytes_read + << " / " << size << llendl; + delete[] mReadData; + mReadData = NULL; mDataSize = -1; // failed - return true; + done = true; } - if (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE) + // If we already read all we expected, we're actually done + if (mDataSize <= bytes_read) { - return true; // done + done = true; } else { mState = BODY; } -#endif } - if (mState == BODY) + // Fourth state / stage : read the rest of the data from the UUID based cached file + if (!done && (mState == BODY)) { -#if USE_LFS_READ - if (mFileHandle == LLLFSThread::nullHandle()) - { - std::string filename = mCache->getTextureFileName(mID); - S32 filesize = LLAPRFile::size(filename, mCache->getLocalAPRFilePool()); - if (filesize > mOffset) - { - S32 datasize = TEXTURE_CACHE_ENTRY_SIZE + filesize; - mDataSize = llmin(datasize, mDataSize); - S32 data_offset = TEXTURE_CACHE_ENTRY_SIZE - mOffset; - data_offset = llmax(data_offset, 0); - S32 file_size = mDataSize - data_offset; - S32 file_offset = mOffset - TEXTURE_CACHE_ENTRY_SIZE; - file_offset = llmax(file_offset, 0); - - llassert_always(mDataSize > 0); - U8* data = new U8[mDataSize]; - if (data_offset > 0) - { - llassert_always(mReadData); - llassert_always(data_offset <= mDataSize); - memcpy(data, mReadData, data_offset); - delete[] mReadData; - mReadData = NULL; - } - llassert_always(mReadData == NULL); - mReadData = data; - - mBytesRead = -1; - mBytesToRead = file_size; - setPriority(LLWorkerThread::PRIORITY_LOW | mPriority); - llassert_always(data_offset + mBytesToRead <= mDataSize); - mFileHandle = LLLFSThread::sLocal->read(filename, - mReadData + data_offset, file_offset, mBytesToRead, - new ReadResponder(mCache, mRequestHandle)); - return false; - } - else - { - mDataSize = TEXTURE_CACHE_ENTRY_SIZE; - return true; // done - } - } - else - { - if (mBytesRead >= 0) - { - if (mBytesRead != mBytesToRead) - { -// llwarns << "LLTextureCacheWorker: " << mID -// << " incorrect number of bytes read from body: " << mBytesRead -// << " != " << mBytesToRead << llendl; - mDataSize = -1; // failed - } - return true; - } - else - { - return false; - } - } -#else std::string filename = mCache->getTextureFileName(mID); S32 filesize = LLAPRFile::size(filename, mCache->getLocalAPRFilePool()); - S32 bytes_read = 0; - if (filesize > mOffset) + + if (filesize && (filesize + TEXTURE_CACHE_ENTRY_SIZE) > mOffset) { - S32 datasize = TEXTURE_CACHE_ENTRY_SIZE + filesize; - mDataSize = llmin(datasize, mDataSize); - S32 data_offset = TEXTURE_CACHE_ENTRY_SIZE - mOffset; - data_offset = llmax(data_offset, 0); - S32 file_size = mDataSize - data_offset; - S32 file_offset = mOffset - TEXTURE_CACHE_ENTRY_SIZE; - file_offset = llmax(file_offset, 0); + S32 max_datasize = TEXTURE_CACHE_ENTRY_SIZE + filesize - mOffset; + mDataSize = llmin(max_datasize, mDataSize); + + S32 data_offset, file_size, file_offset; + // Reserve the whole data buffer first U8* data = new U8[mDataSize]; - if (data_offset > 0) + + // Set the data file pointers taking the read offset into account. 2 cases: + if (mOffset < TEXTURE_CACHE_ENTRY_SIZE) { + // Offset within the header record. That means we read something from the header cache. + // Note: most common case is (mOffset = 0), so this is the "normal" code path. + data_offset = TEXTURE_CACHE_ENTRY_SIZE - mOffset; // i.e. TEXTURE_CACHE_ENTRY_SIZE if mOffset nul (common case) + file_offset = 0; + file_size = mDataSize - data_offset; + // Copy the raw data we've been holding from the header cache into the new sized buffer llassert_always(mReadData); memcpy(data, mReadData, data_offset); delete[] mReadData; + mReadData = NULL; + } + else + { + // Offset bigger than the header record. That means we haven't read anything yet. + data_offset = 0; + file_offset = mOffset - TEXTURE_CACHE_ENTRY_SIZE; + file_size = mDataSize; + // No data from header cache to copy in that case, we skipped it all } + + // Now use that buffer as the object read buffer + llassert_always(mReadData == NULL); mReadData = data; - bytes_read = LLAPRFile::readEx(filename, + + // Read the data at last + S32 bytes_read = LLAPRFile::readEx(filename, mReadData + data_offset, file_offset, file_size, mCache->getLocalAPRFilePool()); if (bytes_read != file_size) { -// llwarns << "LLTextureCacheWorker: " << mID -// << " incorrect number of bytes read from body: " << bytes_read -// << " / " << file_size << llendl; + llwarns << "LLTextureCacheWorker: " << mID + << " incorrect number of bytes read from body: " << bytes_read + << " / " << file_size << llendl; + delete[] mReadData; + mReadData = NULL; mDataSize = -1; // failed - return true; + done = true; } } else { - mDataSize = TEXTURE_CACHE_ENTRY_SIZE; - } - - return true; -#endif + // No body, we're done. + mDataSize = llmax(TEXTURE_CACHE_ENTRY_SIZE - mOffset, 0); + lldebugs << "No body file for: " << filename << llendl; + } + // Nothing else to do at that point... + done = true; } - - return false; + + // Clean up and exit + return done; } +// This is where *everything* about a texture is written down in the cache system (entry map, header and body) +// Current assumption are: +// - the whole data are in a raw form, starting at mWriteData +// - the size of this raw data is mDataSize and can be smaller than TEXTURE_CACHE_ENTRY_SIZE (the size of a record in the header cache) +// - the code *does not* support offset writing so there are no difference between buffer addresses and start of data bool LLTextureCacheRemoteWorker::doWrite() { + bool done = false; S32 idx = -1; - // No LOCAL state for write() - + // First state / stage : check that what we're trying to cache is in an OK shape if (mState == INIT) { + llassert_always(mOffset == 0); // We currently do not support write offsets + llassert_always(mDataSize > 0); // Things will go badly wrong if mDataSize is nul or negative... + mState = CACHE; + } + + // No LOCAL state for write(): because it doesn't make much sense to cache a local file... + + // Second state / stage : set an entry in the headers entry (texture.entries) file + if (!done && (mState == CACHE)) + { + bool alreadyCached = false; S32 cur_imagesize = 0; - S32 offset = mOffset; - idx = mCache->getHeaderCacheEntry(mID, false, &cur_imagesize); - if (idx >= 0 && cur_imagesize > 0) + // Checks if this image is already in the entry list + idx = mCache->getHeaderCacheEntry(mID, cur_imagesize); + if (idx >= 0 && (cur_imagesize >= 0)) { - offset = TEXTURE_CACHE_ENTRY_SIZE; // don't re-write header + alreadyCached = true; // already there and non empty } - idx = mCache->getHeaderCacheEntry(mID, true, &mImageSize); // touch entry - if (idx >= 0) + idx = mCache->setHeaderCacheEntry(mID, mImageSize); // create or touch the entry + if (idx < 0) { - if(cur_imagesize > 0 && mImageSize != cur_imagesize) - { -// llwarns << "Header cache entry size: " << cur_imagesize << " != mImageSize: " << mImageSize << llendl; - offset = 0; // re-write header - } - mState = offset < TEXTURE_CACHE_ENTRY_SIZE ? HEADER : BODY; + llwarns << "LLTextureCacheWorker: " << mID + << " Unable to create header entry for writing!" << llendl; + mDataSize = -1; // failed + done = true; } else { - mDataSize = -1; // failed - return true; + if (cur_imagesize > 0 && (mImageSize != cur_imagesize)) + { + alreadyCached = false; // re-write the header if the size changed in all cases + } + if (alreadyCached && (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE)) + { + // Small texture already cached case: we're done with writing + done = true; + } + else + { + // If the texture has already been cached, we don't resave the header and go directly to the body part + mState = alreadyCached ? BODY : HEADER; + } } } - - if (mState == HEADER) + + // Third stage / state : write the header record in the header file (texture.cache) + if (!done && (mState == HEADER)) { -#if USE_LFS_WRITE - if (mFileHandle == LLLFSThread::nullHandle()) + llassert_always(idx >= 0); // we need an entry here or storing the header makes no sense + S32 offset = idx * TEXTURE_CACHE_ENTRY_SIZE; // skip to the correct spot in the header file + S32 size = TEXTURE_CACHE_ENTRY_SIZE; // record size is fixed for the header + S32 bytes_written; + + if (mDataSize < TEXTURE_CACHE_ENTRY_SIZE) { - llassert_always(idx >= 0); - llassert_always(mOffset < TEXTURE_CACHE_ENTRY_SIZE); - S32 offset = idx * TEXTURE_CACHE_ENTRY_SIZE + mOffset; - S32 size = TEXTURE_CACHE_ENTRY_SIZE - mOffset; - mBytesRead = -1; - mBytesToRead = size; - setPriority(LLWorkerThread::PRIORITY_LOW | mPriority); - mFileHandle = LLLFSThread::sLocal->write(mCache->mHeaderDataFileName, - mWriteData, offset, mBytesToRead, - new WriteResponder(mCache, mRequestHandle)); - return false; + // We need to write a full record in the header cache so, if the amount of data is smaller + // than a record, we need to transfer the data to a buffer padded with 0 and write that + U8* padBuffer = new U8[TEXTURE_CACHE_ENTRY_SIZE]; + memset(padBuffer, 0, TEXTURE_CACHE_ENTRY_SIZE); // Init with zeros + memcpy(padBuffer, mWriteData, mDataSize); // Copy the write buffer + bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, padBuffer, offset, size, mCache->getLocalAPRFilePool()); + delete [] padBuffer; } else { - if (mBytesRead >= 0) - { - if (mBytesRead != mBytesToRead) - { -// llwarns << "LLTextureCacheWorker: " << mID -// << " incorrect number of bytes written to header: " << mBytesRead -// << " != " << mBytesToRead << llendl; - mDataSize = -1; // failed - return true; - } - if (mDataSize <= mBytesToRead) - { - return true; // done - } - else - { - mFileHandle = LLLFSThread::nullHandle(); - mState = BODY; - } - } - else - { - return false; - } + // Write the header record (== first TEXTURE_CACHE_ENTRY_SIZE bytes of the raw file) in the header file + bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, mWriteData, offset, size, mCache->getLocalAPRFilePool()); } -#else - llassert_always(idx >= 0); - llassert_always(mOffset < TEXTURE_CACHE_ENTRY_SIZE); - S32 offset = idx * TEXTURE_CACHE_ENTRY_SIZE + mOffset; - S32 size = TEXTURE_CACHE_ENTRY_SIZE - mOffset; - S32 bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, mWriteData, offset, size, mCache->getLocalAPRFilePool()); if (bytes_written <= 0) { -// llwarns << "LLTextureCacheWorker: missing entry: " << mID << llendl; + llwarns << "LLTextureCacheWorker: " << mID + << " Unable to write header entry!" << llendl; mDataSize = -1; // failed - return true; + done = true; } - if (mDataSize <= size) + // If we wrote everything (may be more with padding) in the header cache, + // we're done so we don't have a body to store + if (mDataSize <= bytes_written) { - return true; // done + done = true; } else { mState = BODY; } -#endif } - if (mState == BODY) + // Fourth stage / state : write the body file, i.e. the rest of the texture in a "UUID" file name + if (!done && (mState == BODY)) { -#if USE_LFS_WRITE - if (mFileHandle == LLLFSThread::nullHandle()) + llassert(mDataSize > TEXTURE_CACHE_ENTRY_SIZE); // wouldn't make sense to be here otherwise... + S32 file_size = mDataSize - TEXTURE_CACHE_ENTRY_SIZE; + if ((file_size > 0) && mCache->updateTextureEntryList(mID, file_size)) { - S32 data_offset = TEXTURE_CACHE_ENTRY_SIZE - mOffset; - data_offset = llmax(data_offset, 0); - S32 file_size = mDataSize - data_offset; - S32 file_offset = mOffset - TEXTURE_CACHE_ENTRY_SIZE; - file_offset = llmax(file_offset, 0); - if (file_size > 0 && mCache->appendToTextureEntryList(mID, file_size)) - { - std::string filename = mCache->getTextureFileName(mID); - mBytesRead = -1; - mBytesToRead = file_size; - setPriority(LLWorkerThread::PRIORITY_LOW | mPriority); - mFileHandle = LLLFSThread::sLocal->write(filename, - mWriteData + data_offset, file_offset, mBytesToRead, - new WriteResponder(mCache, mRequestHandle)); - return false; - } - else - { - mDataSize = 0; // no data written - return true; // done - } - } - else - { - if (mBytesRead >= 0) - { - if (mBytesRead != mBytesToRead) - { -// llwarns << "LLTextureCacheWorker: " << mID -// << " incorrect number of bytes written to body: " << mBytesRead -// << " != " << mBytesToRead << llendl; - mDataSize = -1; // failed - } - return true; - } - else - { - return false; - } - } -#else - S32 data_offset = TEXTURE_CACHE_ENTRY_SIZE - mOffset; - data_offset = llmax(data_offset, 0); - S32 file_size = mDataSize - data_offset; - S32 file_offset = mOffset - TEXTURE_CACHE_ENTRY_SIZE; - file_offset = llmax(file_offset, 0); - S32 bytes_written = 0; - if (file_size > 0 && mCache->appendToTextureEntryList(mID, file_size)) - { - std::string filename = mCache->getTextureFileName(mID); - - bytes_written = LLAPRFile::writeEx(filename, - mWriteData + data_offset, - file_offset, file_size, - mCache->getLocalAPRFilePool()); + // build the cache file name from the UUID + std::string filename = mCache->getTextureFileName(mID); +// llinfos << "Writing Body: " << filename << " Bytes: " << file_offset+file_size << llendl; + S32 bytes_written = LLAPRFile::writeEx( filename, + mWriteData + TEXTURE_CACHE_ENTRY_SIZE, + 0, file_size, + mCache->getLocalAPRFilePool()); if (bytes_written <= 0) { + llwarns << "LLTextureCacheWorker: " << mID + << " incorrect number of bytes written to body: " << bytes_written + << " / " << file_size << llendl; mDataSize = -1; // failed + done = true; } } else { mDataSize = 0; // no data written } - - return true; -#endif + // Nothing else to do at that point... + done = true; } - - return false; + + // Clean up and exit + return done; } //virtual bool LLTextureCacheWorker::doWork(S32 param) { -// *TODO reenable disabled apr_pool usage disabled due to maint-render-9 merge breakage -brad - //allocate a new local apr_pool -// LLAPRPool pool ; - - //save the current mFileAPRPool to avoid breaking anything. -// apr_pool_t* old_pool = mCache->getFileAPRPool() ; - //make mFileAPRPool to point to the local one -// mCache->setFileAPRPool(pool.getAPRPool()) ; - bool res = false; if (param == 0) // read { @@ -818,10 +675,6 @@ bool LLTextureCacheWorker::doWork(S32 param) { llassert_always(0); } - - //set mFileAPRPool back, the local one will be released automatically. -// mCache->setFileAPRPool(old_pool) ; - return res; } @@ -887,6 +740,7 @@ LLTextureCache::LLTextureCache(bool threaded) mWorkersMutex(NULL), mHeaderMutex(NULL), mListMutex(NULL), + mHeaderAPRFile(NULL), mReadOnly(FALSE), mTexturesSizeTotal(0), mDoPurge(FALSE) @@ -926,6 +780,9 @@ S32 LLTextureCache::update(U32 max_time_ms) } } + unlockWorkers(); + + // call 'completed' with workers list unlocked (may call readComplete() or writeComplete() for (responder_list_t::iterator iter1 = completed_list.begin(); iter1 != completed_list.end(); ++iter1) { @@ -934,8 +791,6 @@ S32 LLTextureCache::update(U32 max_time_ms) responder->completed(success); } - unlockWorkers(); - return res; } @@ -954,33 +809,48 @@ std::string LLTextureCache::getTextureFileName(const LLUUID& id) { std::string idstr = id.asString(); std::string delem = gDirUtilp->getDirDelimiter(); - std::string filename = mTexturesDirName + delem + idstr[0] + delem + idstr; + std::string filename = mTexturesDirName + delem + idstr[0] + delem + idstr + ".texture"; return filename; } -bool LLTextureCache::appendToTextureEntryList(const LLUUID& id, S32 bodysize) +bool LLTextureCache::updateTextureEntryList(const LLUUID& id, S32 bodysize) { bool res = false; bool purge = false; - // Append UUID to end of texture entries { LLMutexLock lock(&mHeaderMutex); - size_map_t::iterator iter = mTexturesSizeMap.find(id); - if (iter == mTexturesSizeMap.end() || iter->second < bodysize) + size_map_t::iterator iter1 = mTexturesSizeMap.find(id); + if (iter1 == mTexturesSizeMap.end() || iter1->second < bodysize) { llassert_always(bodysize > 0); - Entry* entry = new Entry(id, bodysize, time(NULL)); - LLAPRFile::writeEx(mTexturesDirEntriesFileName, - (U8*)entry, -1, 1*sizeof(Entry), - getLocalAPRFilePool()); - delete entry; - if (iter != mTexturesSizeMap.end()) + S32 oldbodysize = 0; + if (iter1 != mTexturesSizeMap.end()) + { + oldbodysize = iter1->second; + } + + Entry entry; + S32 idx = openAndReadEntry(id, entry, false); + if (idx < 0) + { + // TODO: change to llwarns + llerrs << "Failed to open entry: " << id << llendl; + removeFromCache(id); + return false; + } + else if (oldbodysize != entry.mBodySize) { - mTexturesSizeTotal -= iter->second; + // TODO: change to llwarns + llerrs << "Entry mismatch in mTextureSizeMap / mHeaderIDMap" + << " idx=" << idx << " oldsize=" << oldbodysize << " entrysize=" << entry.mBodySize << llendl; } + entry.mBodySize = bodysize; + writeEntryAndClose(idx, entry); + + mTexturesSizeTotal -= oldbodysize; mTexturesSizeTotal += bodysize; - mTexturesSizeMap[id] = bodysize; + if (mTexturesSizeTotal > sCacheMaxTexturesSize) { purge = true; @@ -995,11 +865,59 @@ bool LLTextureCache::appendToTextureEntryList(const LLUUID& id, S32 bodysize) return res; } +//debug +BOOL LLTextureCache::isInCache(const LLUUID& id) +{ + LLMutexLock lock(&mHeaderMutex); + id_map_t::const_iterator iter = mHeaderIDMap.find(id); + + return (iter != mHeaderIDMap.end()) ; +} + +//debug +BOOL LLTextureCache::isInLocal(const LLUUID& id) +{ + S32 local_size = 0; + std::string local_filename; + + std::string filename = getLocalFileName(id); + // Is it a JPEG2000 file? + { + local_filename = filename + ".j2c"; + local_size = LLAPRFile::size(local_filename, getLocalAPRFilePool()); + if (local_size > 0) + { + return TRUE ; + } + } + + // If not, is it a jpeg file? + { + local_filename = filename + ".jpg"; + local_size = LLAPRFile::size(local_filename, getLocalAPRFilePool()); + if (local_size > 0) + { + return TRUE ; + } + } + + // Hmm... What about a targa file? (used for UI texture mostly) + { + local_filename = filename + ".tga"; + local_size = LLAPRFile::size(local_filename, getLocalAPRFilePool()); + if (local_size > 0) + { + return TRUE ; + } + } + + return FALSE ; +} ////////////////////////////////////////////////////////////////////////////// //static const S32 MAX_REASONABLE_FILE_SIZE = 512*1024*1024; // 512 MB -F32 LLTextureCache::sHeaderCacheVersion = 1.0f; +F32 LLTextureCache::sHeaderCacheVersion = 1.3f; U32 LLTextureCache::sCacheMaxEntries = MAX_REASONABLE_FILE_SIZE / TEXTURE_CACHE_ENTRY_SIZE; S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit const char* entries_filename = "texture.entries"; @@ -1012,7 +930,6 @@ void LLTextureCache::setDirNames(ELLPath location) mHeaderEntriesFileName = gDirUtilp->getExpandedFilename(location, entries_filename); mHeaderDataFileName = gDirUtilp->getExpandedFilename(location, cache_filename); mTexturesDirName = gDirUtilp->getExpandedFilename(location, textures_dirname); - mTexturesDirEntriesFileName = mTexturesDirName + delem + entries_filename; } void LLTextureCache::purgeCache(ELLPath location) @@ -1020,7 +937,7 @@ void LLTextureCache::purgeCache(ELLPath location) if (!mReadOnly) { setDirNames(location); - + llassert_always(mHeaderAPRFile == NULL); LLAPRFile::remove(mHeaderEntriesFileName, getLocalAPRFilePool()); LLAPRFile::remove(mHeaderDataFileName, getLocalAPRFilePool()); } @@ -1063,83 +980,317 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only) return max_size; // unused cache space } -struct lru_data +//---------------------------------------------------------------------------- +// mHeaderMutex must be locked for the following functions! + +LLAPRFile* LLTextureCache::openHeaderEntriesFile(bool readonly, S32 offset) +{ + llassert_always(mHeaderAPRFile == NULL); + apr_int32_t flags = readonly ? APR_READ|APR_BINARY : APR_READ|APR_WRITE|APR_BINARY; + mHeaderAPRFile = new LLAPRFile(mHeaderEntriesFileName, flags, getLocalAPRFilePool()); + mHeaderAPRFile->seek(APR_SET, offset); + return mHeaderAPRFile; +} + +void LLTextureCache::closeHeaderEntriesFile() +{ + llassert_always(mHeaderAPRFile != NULL); + delete mHeaderAPRFile; + mHeaderAPRFile = NULL; +} + +void LLTextureCache::readEntriesHeader() +{ + // mHeaderEntriesInfo initializes to default values so safe not to read it + llassert_always(mHeaderAPRFile == NULL); + if (LLAPRFile::isExist(mHeaderEntriesFileName, getLocalAPRFilePool())) + { + LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo), + getLocalAPRFilePool()); + } +} + +void LLTextureCache::writeEntriesHeader() { - lru_data(U32 t, S32 i, const LLUUID& id) { time=t; index=i; uuid=id; } - U32 time; - S32 index; - LLUUID uuid; - struct Compare - { - // lhs < rhs - typedef const lru_data* lru_data_ptr; - bool operator()(const lru_data_ptr& a, const lru_data_ptr& b) const + llassert_always(mHeaderAPRFile == NULL); + if (!mReadOnly) + { + LLAPRFile::writeEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo), + getLocalAPRFilePool()); + } +} + +static S32 mHeaderEntriesMaxWriteIdx = 0; + +S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create) +{ + S32 idx = -1; + + id_map_t::iterator iter1 = mHeaderIDMap.find(id); + if (iter1 != mHeaderIDMap.end()) + { + idx = iter1->second; + } + + if (idx < 0) + { + if (create && !mReadOnly) { - if(a->time == b->time) - return (a->index < b->index); + if (mHeaderEntriesInfo.mEntries < sCacheMaxEntries) + { + // Add an entry to the end of the list + idx = mHeaderEntriesInfo.mEntries++; + + } + else if (!mFreeList.empty()) + { + idx = *(mFreeList.begin()); + mFreeList.erase(mFreeList.begin()); + } else - return (a->time >= b->time); + { + // Look for a still valid entry in the LRU + for (std::set<LLUUID>::iterator iter2 = mLRU.begin(); iter2 != mLRU.end();) + { + std::set<LLUUID>::iterator curiter2 = iter2++; + LLUUID oldid = *curiter2; + // Erase entry from LRU regardless + mLRU.erase(curiter2); + // Look up entry and use it if it is valid + id_map_t::iterator iter3 = mHeaderIDMap.find(oldid); + if (iter3 != mHeaderIDMap.end() && iter3->second >= 0) + { + idx = iter3->second; + mHeaderIDMap.erase(oldid); + mTexturesSizeMap.erase(oldid); + break; + } + } + // if (idx < 0) at this point, we will rebuild the LRU + // and retry if called from setHeaderCacheEntry(), + // otherwise this shouldn't happen and will trigger an error + } + if (idx >= 0) + { + // Set the header index + mHeaderIDMap[id] = idx; + llassert_always(mTexturesSizeMap.erase(id) == 0); + // Initialize the entry (will get written later) + entry.init(id, time(NULL)); + // Update Header + writeEntriesHeader(); + // Write Entry + S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry); + LLAPRFile* aprfile = openHeaderEntriesFile(false, offset); + S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry)); + llassert_always(bytes_written == sizeof(Entry)); + mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx); + closeHeaderEntriesFile(); + } } - }; -}; + } + else + { + // Remove this entry from the LRU if it exists + mLRU.erase(id); + // Read the entry + S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry); + LLAPRFile* aprfile = openHeaderEntriesFile(true, offset); + S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry)); + llassert_always(bytes_read == sizeof(Entry)); + llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize); + closeHeaderEntriesFile(); + } + return idx; +} + +void LLTextureCache::writeEntryAndClose(S32 idx, Entry& entry) +{ + if (idx >= 0) + { + if (!mReadOnly) + { + entry.mTime = time(NULL); + llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize); + if (entry.mBodySize > 0) + { + mTexturesSizeMap[entry.mID] = entry.mBodySize; + } +// llinfos << "Updating TE: " << idx << ": " << id << " Size: " << entry.mBodySize << " Time: " << entry.mTime << llendl; + S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry); + LLAPRFile* aprfile = openHeaderEntriesFile(false, offset); + S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry)); + llassert_always(bytes_written == sizeof(Entry)); + mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx); + closeHeaderEntriesFile(); + } + } +} + +U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries) +{ + U32 num_entries = mHeaderEntriesInfo.mEntries; + + mHeaderIDMap.clear(); + mTexturesSizeMap.clear(); + mFreeList.clear(); + mTexturesSizeTotal = 0; + + LLAPRFile* aprfile = openHeaderEntriesFile(false, (S32)sizeof(EntriesInfo)); + for (U32 idx=0; idx<num_entries; idx++) + { + Entry entry; + S32 bytes_read = aprfile->read((void*)(&entry), (S32)sizeof(Entry)); + if (bytes_read < sizeof(Entry)) + { + llwarns << "Corrupted header entries, failed at " << idx << " / " << num_entries << llendl; + closeHeaderEntriesFile(); + purgeAllTextures(false); + return 0; + } + entries.push_back(entry); +// llinfos << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << llendl; + if (entry.mImageSize < 0) + { + mFreeList.insert(idx); + } + else + { + mHeaderIDMap[entry.mID] = idx; + if (entry.mBodySize > 0) + { + mTexturesSizeMap[entry.mID] = entry.mBodySize; + mTexturesSizeTotal += entry.mBodySize; + } + llassert_always(entry.mImageSize == 0 || entry.mImageSize > entry.mBodySize); + } + } + closeHeaderEntriesFile(); + return num_entries; +} + +void LLTextureCache::writeEntriesAndClose(const std::vector<Entry>& entries) +{ + S32 num_entries = entries.size(); + llassert_always(num_entries == mHeaderEntriesInfo.mEntries); + + if (!mReadOnly) + { + LLAPRFile* aprfile = openHeaderEntriesFile(false, (S32)sizeof(EntriesInfo)); + for (S32 idx=0; idx<num_entries; idx++) + { + S32 bytes_written = aprfile->write((void*)(&entries[idx]), (S32)sizeof(Entry)); + llassert_always(bytes_written == sizeof(Entry)); + } + mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, num_entries-1); + closeHeaderEntriesFile(); + } +} + +//---------------------------------------------------------------------------- // Called from either the main thread or the worker thread void LLTextureCache::readHeaderCache() { LLMutexLock lock(&mHeaderMutex); - mHeaderEntriesInfo.mVersion = 0.f; - mHeaderEntriesInfo.mEntries = 0; - if (LLAPRFile::isExist(mHeaderEntriesFileName, getLocalAPRFilePool())) - { - LLAPRFile::readEx(mHeaderEntriesFileName, - (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo), - getLocalAPRFilePool()); - } + + mLRU.clear(); // always clear the LRU + + readEntriesHeader(); + if (mHeaderEntriesInfo.mVersion != sHeaderCacheVersion) { if (!mReadOnly) { - // Info with 0 entries - mHeaderEntriesInfo.mVersion = sHeaderCacheVersion; - - LLAPRFile::writeEx(mHeaderEntriesFileName, - (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo), - getLocalAPRFilePool()); + purgeAllTextures(false); } } else { - S32 num_entries = mHeaderEntriesInfo.mEntries; + std::vector<Entry> entries; + U32 num_entries = openAndReadEntries(entries); if (num_entries) { - Entry* entries = new Entry[num_entries]; + U32 empty_entries = 0; + typedef std::pair<U32, LLUUID> lru_data_t; + std::set<lru_data_t> lru; + std::vector<LLUUID> purge_list; + for (U32 i=0; i<num_entries; i++) + { + Entry& entry = entries[i]; + const LLUUID& id = entry.mID; + if (entry.mImageSize < 0) + { + // This will be in the Free List, don't put it in the LRY + ++empty_entries; + } + else + { + lru.insert(std::make_pair(entry.mTime, id)); + if (entry.mBodySize > 0) + { + if (entry.mBodySize > entry.mImageSize) + { + // Shouldn't happen, failsafe only + llwarns << "Bad entry: " << i << ": " << id << ": BodySize: " << entry.mBodySize << llendl; + purge_list.push_back(id); + } + } + } + } + if (num_entries > sCacheMaxEntries) + { + // Special case: cache size was reduced, need to remove entries + // Note: After we prune entries, we will call this again and create the LRU + U32 entries_to_purge = (num_entries-empty_entries) - sCacheMaxEntries; + if (entries_to_purge > 0) + { + for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter) + { + purge_list.push_back(iter->second); + if (--entries_to_purge <= 0) + break; + } + } + } + else { - LLAPRFile::readEx(mHeaderEntriesFileName, - (U8*)entries, sizeof(EntriesInfo), num_entries*sizeof(Entry), - getLocalAPRFilePool()); + S32 lru_entries = (S32)((F32)sCacheMaxEntries * TEXTURE_CACHE_LRU_SIZE); + for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter) + { + mLRU.insert(iter->second); +// llinfos << "LRU: " << iter->first << " : " << iter->second << llendl; + if (--lru_entries <= 0) + break; + } } - typedef std::set<lru_data*, lru_data::Compare> lru_set_t; - lru_set_t lru; - for (S32 i=0; i<num_entries; i++) + + if (purge_list.size() > 0) { - if (entries[i].mSize >= 0) // -1 indicates erased entry, skip + for (std::vector<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter) { - const LLUUID& id = entries[i].mID; - lru.insert(new lru_data(entries[i].mTime, i, id)); - mHeaderIDMap[id] = i; + removeFromCache(*iter); } + // If we removed any entries, we need to rebuild the entries list, + // write the header, and call this again + std::vector<Entry> new_entries; + for (U32 i=0; i<num_entries; i++) + { + const Entry& entry = entries[i]; + if (entry.mImageSize >=0) + { + new_entries.push_back(entry); + } + } + llassert_always(new_entries.size() <= sCacheMaxEntries); + mHeaderEntriesInfo.mEntries = new_entries.size(); + writeEntriesAndClose(new_entries); + readHeaderCache(); // repeat with new entries file } - mLRU.clear(); - S32 lru_entries = sCacheMaxEntries / 10; - for (lru_set_t::iterator iter = lru.begin(); iter != lru.end(); ++iter) + else { - lru_data* data = *iter; - mLRU[data->index] = data->uuid; - if (--lru_entries <= 0) - break; + writeEntriesAndClose(entries); } - for_each(lru.begin(), lru.end(), DeletePointer()); - delete[] entries; } } } @@ -1162,13 +1313,21 @@ void LLTextureCache::purgeAllTextures(bool purge_directories) LLFile::rmdir(dirname); } } - LLAPRFile::remove(mTexturesDirEntriesFileName, getLocalAPRFilePool()); if (purge_directories) { LLFile::rmdir(mTexturesDirName); } } + mHeaderIDMap.clear(); mTexturesSizeMap.clear(); + mTexturesSizeTotal = 0; + mFreeList.clear(); + mTexturesSizeTotal = 0; + + // Info with 0 entries + mHeaderEntriesInfo.mVersion = sHeaderCacheVersion; + mHeaderEntriesInfo.mEntries = 0; + writeEntriesHeader(); } void LLTextureCache::purgeTextures(bool validate) @@ -1182,51 +1341,37 @@ void LLTextureCache::purgeTextures(bool validate) LLAppViewer::instance()->pauseMainloopTimeout(); LLMutexLock lock(&mHeaderMutex); - - S32 filesize = LLAPRFile::size(mTexturesDirEntriesFileName, getLocalAPRFilePool()); - S32 num_entries = filesize / sizeof(Entry); - if (num_entries * (S32)sizeof(Entry) != filesize) - { - LL_WARNS("TextureCache") << "Bad cache file: " << mTexturesDirEntriesFileName << " Purging." << LL_ENDL; - purgeAllTextures(false); - return; - } - if (num_entries == 0) + + llinfos << "TEXTURE CACHE: Purging." << llendl; + + // Read the entries list + std::vector<Entry> entries; + U32 num_entries = openAndReadEntries(entries); + if (!num_entries) { - return; // nothing to do + writeEntriesAndClose(entries); + return; // nothing to purge } - Entry* entries = new Entry[num_entries]; - S32 bytes_read = LLAPRFile::readEx(mTexturesDirEntriesFileName, - (U8*)entries, 0, num_entries*sizeof(Entry), - getLocalAPRFilePool()); - if (bytes_read != filesize) - { - LL_WARNS("TextureCache") << "Bad cache file (2): " << mTexturesDirEntriesFileName << " Purging." << LL_ENDL; - purgeAllTextures(false); - return; - } - - LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Reading Entries..." << LL_ENDL; - - std::map<LLUUID, S32> entry_idx_map; - S64 total_size = 0; - for (S32 idx=0; idx<num_entries; idx++) - { - const LLUUID& id = entries[idx].mID; - LL_DEBUGS("TextureCache") << "Entry: " << id << " Size: " << entries[idx].mSize << " Time: " << entries[idx].mTime << LL_ENDL; - std::map<LLUUID, S32>::iterator iter = entry_idx_map.find(id); - if (iter != entry_idx_map.end()) + // Use mTexturesSizeMap to collect UUIDs of textures with bodies + typedef std::set<std::pair<U32,S32> > time_idx_set_t; + std::set<std::pair<U32,S32> > time_idx_set; + for (size_map_t::iterator iter1 = mTexturesSizeMap.begin(); + iter1 != mTexturesSizeMap.end(); ++iter1) + { + if (iter1->second > 0) { - // Newer entry replacing older entry - S32 pidx = iter->second; - total_size -= entries[pidx].mSize; - entries[pidx].mSize = 0; // flag: skip older entry + id_map_t::iterator iter2 = mHeaderIDMap.find(iter1->first); + if (iter2 != mHeaderIDMap.end()) + { + S32 idx = iter2->second; + time_idx_set.insert(std::make_pair(entries[idx].mTime, idx)); +// llinfos << "TIME: " << entries[idx].mTime << " TEX: " << entries[idx].mID << " IDX: " << idx << " Size: " << entries[idx].mImageSize << llendl; + } } - entry_idx_map[id] = idx; - total_size += entries[idx].mSize; } - + + // Validate 1/256th of the files on startup U32 validate_idx = 0; if (validate) { @@ -1235,19 +1380,17 @@ void LLTextureCache::purgeTextures(bool validate) gSavedSettings.setU32("CacheValidateCounter", next_idx); LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Validating: " << validate_idx << LL_ENDL; } - - S64 min_cache_size = (sCacheMaxTexturesSize * 9) / 10; + + S64 cache_size = mTexturesSizeTotal; + S64 purged_cache_size = (sCacheMaxTexturesSize * (S64)((1.f-TEXTURE_CACHE_PURGE_AMOUNT)*100)) / 100; S32 purge_count = 0; - S32 next_idx = 0; - for (S32 idx=0; idx<num_entries; idx++) + for (time_idx_set_t::iterator iter = time_idx_set.begin(); + iter != time_idx_set.end(); ++iter) { - if (entries[idx].mSize == 0) - { - continue; - } + S32 idx = iter->second; bool purge_entry = false; std::string filename = getTextureFileName(entries[idx].mID); - if (total_size >= min_cache_size) + if (cache_size >= purged_cache_size) { purge_entry = true; } @@ -1257,60 +1400,44 @@ void LLTextureCache::purgeTextures(bool validate) U32 uuididx = entries[idx].mID.mData[0]; if (uuididx == validate_idx) { - LL_DEBUGS("TextureCache") << "Validating: " << filename << "Size: " << entries[idx].mSize << LL_ENDL; + LL_DEBUGS("TextureCache") << "Validating: " << filename << "Size: " << entries[idx].mBodySize << LL_ENDL; S32 bodysize = LLAPRFile::size(filename, getLocalAPRFilePool()); - if (bodysize != entries[idx].mSize) + if (bodysize != entries[idx].mBodySize) { - LL_WARNS("TextureCache") << "TEXTURE CACHE BODY HAS BAD SIZE: " << bodysize << " != " << entries[idx].mSize + LL_WARNS("TextureCache") << "TEXTURE CACHE BODY HAS BAD SIZE: " << bodysize << " != " << entries[idx].mBodySize << filename << LL_ENDL; purge_entry = true; } } } + else + { + break; + } + if (purge_entry) { purge_count++; LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL; LLAPRFile::remove(filename, getLocalAPRFilePool()); - total_size -= entries[idx].mSize; - entries[idx].mSize = 0; - } - else - { - if (next_idx != idx) - { - entries[next_idx] = entries[idx]; - } - ++next_idx; + cache_size -= entries[idx].mBodySize; + mTexturesSizeTotal -= entries[idx].mBodySize; + entries[idx].mBodySize = 0; + mTexturesSizeMap.erase(entries[idx].mID); } } - num_entries = next_idx; LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Writing Entries: " << num_entries << LL_ENDL; - - LLAPRFile::remove(mTexturesDirEntriesFileName, getLocalAPRFilePool()); - LLAPRFile::writeEx(mTexturesDirEntriesFileName, - (U8*)&entries[0], 0, num_entries*sizeof(Entry), - getLocalAPRFilePool()); - - mTexturesSizeTotal = 0; - mTexturesSizeMap.clear(); - for (S32 idx=0; idx<num_entries; idx++) - { - mTexturesSizeMap[entries[idx].mID] = entries[idx].mSize; - mTexturesSizeTotal += entries[idx].mSize; - } - llassert(mTexturesSizeTotal == total_size); - - delete[] entries; + writeEntriesAndClose(entries); + // *FIX:Mani - watchdog back on. LLAppViewer::instance()->resumeMainloopTimeout(); LL_INFOS("TextureCache") << "TEXTURE CACHE:" << " PURGED: " << purge_count << " ENTRIES: " << num_entries - << " CACHE SIZE: " << total_size / 1024*1024 << " MB" + << " CACHE SIZE: " << mTexturesSizeTotal / 1024*1024 << " MB" << llendl; } @@ -1340,78 +1467,39 @@ LLTextureCacheWorker* LLTextureCache::getWriter(handle_t handle) } ////////////////////////////////////////////////////////////////////////////// - // Called from work thread -S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, bool touch, S32* imagesize) -{ - bool retry = false; - S32 idx = -1; +// Reads imagesize from the header, updates timestamp +S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, S32& imagesize) +{ + LLMutexLock lock(&mHeaderMutex); + Entry entry; + S32 idx = openAndReadEntry(id, entry, false); + if (idx >= 0) { - LLMutexLock lock(&mHeaderMutex); - id_map_t::iterator iter = mHeaderIDMap.find(id); - if (iter != mHeaderIDMap.end()) - { - idx = iter->second; - } - else if (touch && !mReadOnly) - { - if (mHeaderEntriesInfo.mEntries < sCacheMaxEntries) - { - // Add an entry - idx = mHeaderEntriesInfo.mEntries++; - mHeaderIDMap[id] = idx; - // Update Info - LLAPRFile::writeEx(mHeaderEntriesFileName, - (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo), - getLocalAPRFilePool()); - } - else if (!mLRU.empty()) - { - idx = mLRU.begin()->first; // will be erased below - const LLUUID& oldid = mLRU.begin()->second; - mHeaderIDMap.erase(oldid); - mTexturesSizeMap.erase(oldid); - mHeaderIDMap[id] = idx; - } - else - { - idx = -1; - retry = true; - } - } - if (idx >= 0) - { - if (touch && !mReadOnly) - { - // Update the lru entry - mLRU.erase(idx); - llassert_always(imagesize && *imagesize > 0); - Entry* entry = new Entry(id, *imagesize, time(NULL)); - S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry); - LLAPRFile::writeEx(mHeaderEntriesFileName, - (U8*)entry, offset, sizeof(Entry), - getLocalAPRFilePool()); - delete entry; - } - else if (imagesize) - { - // Get the image size - Entry entry; - S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry); + imagesize = entry.mImageSize; + writeEntryAndClose(idx, entry); // updates time + } + return idx; +} - LLAPRFile::readEx(mHeaderEntriesFileName, - (U8*)&entry, offset, sizeof(Entry), - getLocalAPRFilePool()); - *imagesize = entry.mSize; - } - } +// Writes imagesize to the header, updates timestamp +S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize) +{ + LLMutexLock lock(&mHeaderMutex); + llassert_always(imagesize >= 0); + Entry entry; + S32 idx = openAndReadEntry(id, entry, true); + if (idx >= 0) + { + entry.mImageSize = imagesize; + writeEntryAndClose(idx, entry); } - if (retry) + else // retry { - readHeaderCache(); // updates the lru + readHeaderCache(); // We couldn't write an entry, so refresh the LRU llassert_always(!mLRU.empty() || mHeaderEntriesInfo.mEntries < sCacheMaxEntries); - idx = getHeaderCacheEntry(id, touch, imagesize); // assert above ensures no inf. recursion + idx = setHeaderCacheEntry(id, imagesize); // assert above ensures no inf. recursion } return idx; } @@ -1427,8 +1515,8 @@ LLTextureCache::handle_t LLTextureCache::readFromCache(const std::string& filena // so let the thread handle it LLMutexLock lock(&mWorkersMutex); LLTextureCacheWorker* worker = new LLTextureCacheLocalFileWorker(this, priority, filename, id, - NULL, size, offset, 0, - responder); + NULL, size, offset, 0, + responder); handle_t handle = worker->read(); mReaders[handle] = worker; return handle; @@ -1441,8 +1529,8 @@ LLTextureCache::handle_t LLTextureCache::readFromCache(const LLUUID& id, U32 pri // so let the thread handle it LLMutexLock lock(&mWorkersMutex); LLTextureCacheWorker* worker = new LLTextureCacheRemoteWorker(this, priority, id, - NULL, size, offset, 0, - responder); + NULL, size, offset, + 0, responder); handle_t handle = worker->read(); mReaders[handle] = worker; return handle; @@ -1453,7 +1541,7 @@ bool LLTextureCache::readComplete(handle_t handle, bool abort) { lockWorkers(); handle_map_t::iterator iter = mReaders.find(handle); - llassert_always(iter != mReaders.end()); + llassert_always(iter != mReaders.end() || abort); LLTextureCacheWorker* worker = iter->second; bool res = worker->complete(); if (res || abort) @@ -1487,19 +1575,13 @@ LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 prio purgeTextures(false); mDoPurge = FALSE; } - if (datasize >= TEXTURE_CACHE_ENTRY_SIZE) - { - LLMutexLock lock(&mWorkersMutex); - llassert_always(imagesize > 0); - LLTextureCacheWorker* worker = new LLTextureCacheRemoteWorker(this, priority, id, - data, datasize, 0, - imagesize, responder); - handle_t handle = worker->write(); - mWriters[handle] = worker; - return handle; - } - delete responder; - return LLWorkerThread::nullHandle(); + LLMutexLock lock(&mWorkersMutex); + LLTextureCacheWorker* worker = new LLTextureCacheRemoteWorker(this, priority, id, + data, datasize, 0, + imagesize, responder); + handle_t handle = worker->write(); + mWriters[handle] = worker; + return handle; } bool LLTextureCache::writeComplete(handle_t handle, bool abort) @@ -1542,25 +1624,17 @@ void LLTextureCache::addCompleted(Responder* responder, bool success) bool LLTextureCache::removeHeaderCacheEntry(const LLUUID& id) { - if (mReadOnly) - { - return false; - } - LLMutexLock lock(&mHeaderMutex); - id_map_t::iterator iter = mHeaderIDMap.find(id); - if (iter != mHeaderIDMap.end()) + if (!mReadOnly) { - S32 idx = iter->second; + LLMutexLock lock(&mHeaderMutex); + Entry entry; + S32 idx = openAndReadEntry(id, entry, false); if (idx >= 0) { - Entry* entry = new Entry(id, -1, time(NULL)); - S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry); - - LLAPRFile::writeEx(mHeaderEntriesFileName, - (U8*)entry, offset, sizeof(Entry), - getLocalAPRFilePool()); - delete entry; - mLRU[idx] = id; + entry.mImageSize = -1; + entry.mBodySize = 0; + writeEntryAndClose(idx, entry); + mFreeList.insert(idx); mHeaderIDMap.erase(id); mTexturesSizeMap.erase(id); return true; diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index 68b1458e9a8..bc9c988648b 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -48,6 +48,27 @@ class LLTextureCache : public LLWorkerThread friend class LLTextureCacheRemoteWorker; friend class LLTextureCacheLocalFileWorker; +private: + // Entries + struct EntriesInfo + { + EntriesInfo() : mVersion(0.f), mEntries(0) {} + F32 mVersion; + U32 mEntries; + }; + struct Entry + { + Entry() {} + Entry(const LLUUID& id, S32 imagesize, S32 bodysize, U32 time) : + mID(id), mImageSize(imagesize), mBodySize(bodysize), mTime(time) {} + void init(const LLUUID& id, U32 time) { mID = id, mImageSize = 0; mBodySize = 0; mTime = time; } + LLUUID mID; // 16 bytes + S32 mImageSize; // total size of image if known + S32 mBodySize; // size of body file in body cache + U32 mTime; // seconds since 1/1/1970 + }; + + public: class Responder : public LLResponder @@ -106,10 +127,16 @@ class LLTextureCache : public LLWorkerThread // debug S32 getNumReads() { return mReaders.size(); } S32 getNumWrites() { return mWriters.size(); } + S64 getUsage() { return mTexturesSizeTotal; } + S64 getMaxUsage() { return sCacheMaxTexturesSize; } + U32 getEntries() { return mHeaderEntriesInfo.mEntries; } + U32 getMaxEntries() { return sCacheMaxEntries; }; + BOOL isInCache(const LLUUID& id) ; + BOOL isInLocal(const LLUUID& id) ; protected: // Accessed by LLTextureCacheWorker - bool appendToTextureEntryList(const LLUUID& id, S32 size); + bool updateTextureEntryList(const LLUUID& id, S32 size); std::string getLocalFileName(const LLUUID& id); std::string getTextureFileName(const LLUUID& id); void addCompleted(Responder* responder, bool success); @@ -122,7 +149,16 @@ class LLTextureCache : public LLWorkerThread void readHeaderCache(); void purgeAllTextures(bool purge_directories); void purgeTextures(bool validate); - S32 getHeaderCacheEntry(const LLUUID& id, bool touch, S32* imagesize = NULL); + LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset); + void closeHeaderEntriesFile(); + void readEntriesHeader(); + void writeEntriesHeader(); + S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create); + void writeEntryAndClose(S32 idx, Entry& entry); + U32 openAndReadEntries(std::vector<Entry>& entries); + void writeEntriesAndClose(const std::vector<Entry>& entries); + S32 getHeaderCacheEntry(const LLUUID& id, S32& imagesize); + S32 setHeaderCacheEntry(const LLUUID& id, S32 imagesize); bool removeHeaderCacheEntry(const LLUUID& id); void lockHeaders() { mHeaderMutex.lock(); } void unlockHeaders() { mHeaderMutex.unlock(); } @@ -132,6 +168,7 @@ class LLTextureCache : public LLWorkerThread LLMutex mWorkersMutex; LLMutex mHeaderMutex; LLMutex mListMutex; + LLAPRFile* mHeaderAPRFile; typedef std::map<handle_t, LLTextureCacheWorker*> handle_map_t; handle_map_t mReaders; @@ -145,42 +182,28 @@ class LLTextureCache : public LLWorkerThread BOOL mReadOnly; - // Entries - struct EntriesInfo - { - F32 mVersion; - U32 mEntries; - }; - struct Entry - { - Entry() {} - Entry(const LLUUID& id, S32 size, U32 time) : mID(id), mSize(size), mTime(time) {} - LLUUID mID; // 128 bits - S32 mSize; // total size of image if known (NOT size cached) - U32 mTime; // seconds since 1/1/1970 - }; - // HEADERS (Include first mip) std::string mHeaderEntriesFileName; std::string mHeaderDataFileName; EntriesInfo mHeaderEntriesInfo; - typedef std::map<S32,LLUUID> index_map_t; - index_map_t mLRU; // index, id; stored as a map for fast removal + std::set<S32> mFreeList; // deleted entries + std::set<LLUUID> mLRU; typedef std::map<LLUUID,S32> id_map_t; id_map_t mHeaderIDMap; // BODIES (TEXTURES minus headers) std::string mTexturesDirName; - std::string mTexturesDirEntriesFileName; typedef std::map<LLUUID,S32> size_map_t; size_map_t mTexturesSizeMap; S64 mTexturesSizeTotal; LLAtomic32<BOOL> mDoPurge; - + // Statics static F32 sHeaderCacheVersion; static U32 sCacheMaxEntries; static S64 sCacheMaxTexturesSize; }; +extern const S32 TEXTURE_CACHE_ENTRY_SIZE; + #endif // LL_LLTEXTURECACHE_H diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 88fc7f98c01..c918f988952 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -32,108 +32,35 @@ #include "llviewerprecompiledheaders.h" +#include <iostream> + #include "llstl.h" #include "lltexturefetch.h" #include "llcurl.h" +#include "lldir.h" #include "llhttpclient.h" +#include "llhttpstatuscodes.h" #include "llimage.h" #include "llimageworker.h" #include "llworkerthread.h" #include "llagent.h" #include "lltexturecache.h" +#include "llviewercontrol.h" #include "llviewertexturelist.h" #include "llviewertexture.h" #include "llviewerregion.h" +#include "llworld.h" ////////////////////////////////////////////////////////////////////////////// -//static class LLTextureFetchWorker : public LLWorkerClass { -friend class LLTextureFetch; - -private: -#if 0 - class URLResponder : public LLHTTPClient::Responder - { - public: - URLResponder(LLTextureFetch* fetcher, const LLUUID& id) - : mFetcher(fetcher), mID(id) - { - } - ~URLResponder() - { - } - virtual void error(U32 status, const std::string& reason) - { - mFetcher->lockQueue(); - LLTextureFetchWorker* worker = mFetcher->getWorker(mID); - if (worker) - { -// llwarns << "LLTextureFetchWorker::URLResponder::error " << status << ": " << reason << llendl; - worker->callbackURLReceived(LLSD(), false); - } - mFetcher->unlockQueue(); - } - virtual void result(const LLSD& content) - { - mFetcher->lockQueue(); - LLTextureFetchWorker* worker = mFetcher->getWorker(mID); - if (worker) - { - worker->callbackURLReceived(content, true); - } - mFetcher->unlockQueue(); - } - private: - LLTextureFetch* mFetcher; - LLUUID mID; - }; - - class HTTPGetResponder : public LLHTTPClient::Responder - { - public: - HTTPGetResponder(LLTextureFetch* fetcher, const LLUUID& id) - : mFetcher(fetcher), mID(id) - { - } - ~HTTPGetResponder() - { - } - virtual void completed(U32 status, const std::stringstream& content) - { - mFetcher->lockQueue(); - LLTextureFetchWorker* worker = mFetcher->getWorker(mID); - if (worker) - { - const std::string& cstr = content.str(); - if (200 <= status && status < 300) - { - if (203 == status) // partial information (i.e. last block) - { - worker->callbackHttpGet((U8*)cstr.c_str(), cstr.length(), true); - } - else - { - worker->callbackHttpGet((U8*)cstr.c_str(), cstr.length(), false); - } - } - else - { -// llinfos << "LLTextureFetchWorker::HTTPGetResponder::error " << status << ": " << cstr << llendl; - worker->callbackHttpGet(NULL, -1, true); - } - } - mFetcher->unlockQueue(); - } - private: - LLTextureFetch* mFetcher; - LLUUID mID; - }; -#endif + friend class LLTextureFetch; + friend class HTTPGetResponder; +private: class CacheReadResponder : public LLTextureCache::ReadResponder { public: @@ -179,20 +106,20 @@ friend class LLTextureFetch; LLUUID mID; }; - class DecodeResponder : public LLResponder + class DecodeResponder : public LLImageDecodeThread::Responder { public: DecodeResponder(LLTextureFetch* fetcher, const LLUUID& id, LLTextureFetchWorker* worker) : mFetcher(fetcher), mID(id), mWorker(worker) { } - virtual void completed(bool success) + virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux) { mFetcher->lockQueue(); LLTextureFetchWorker* worker = mFetcher->getWorker(mID); if (worker) { - worker->callbackDecoded(success); + worker->callbackDecoded(success, raw, aux); } mFetcher->unlockQueue(); } @@ -227,37 +154,45 @@ friend class LLTextureFetch; ~LLTextureFetchWorker(); void relese() { --mActiveCount; } + void callbackHttpGet(const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer, + bool last_block, bool success); + void callbackCacheRead(bool success, LLImageFormatted* image, + S32 imagesize, BOOL islocal); + void callbackCacheWrite(bool success); + void callbackDecoded(bool success, LLImageRaw* raw, LLImageRaw* aux); + + void setGetStatus(U32 status, const std::string& reason) + { + mGetStatus = status; + mGetReason = reason; + } + protected: LLTextureFetchWorker(LLTextureFetch* fetcher, const LLUUID& id, const LLHost& host, F32 priority, S32 discard, S32 size); + LLTextureFetchWorker(LLTextureFetch* fetcher, const std::string& url, const LLUUID& id, const LLHost& host, + F32 priority, S32 discard, S32 size); private: /*virtual*/ void startWork(S32 param); // called from addWork() (MAIN THREAD) /*virtual*/ void endWork(S32 param, bool aborted); // called from doWork() (MAIN THREAD) - virtual std::string getName() { return LLStringUtil::null; } void resetFormattedData(); void setImagePriority(F32 priority); void setDesiredDiscard(S32 discard, S32 size); bool insertPacket(S32 index, U8* data, S32 size); void clearPackets(); + void setupPacketData(); U32 calcWorkPriority(); void removeFromCache(); bool processSimulatorPackets(); - bool decodeImage(); bool writeToCacheComplete(); - void lockWorkData() { mWorkMutex.lock(); } - void unlockWorkData() { mWorkMutex.unlock(); } + void lockWorkMutex() { mWorkMutex.lock(); } + void unlockWorkMutex() { mWorkMutex.unlock(); } - void callbackURLReceived(const LLSD& data, bool success); - void callbackHttpGet(U8* data, S32 data_size, bool last_block); - void callbackCacheRead(bool success, LLImageFormatted* image, - S32 imagesize, BOOL islocal); - void callbackCacheWrite(bool success); - void callbackDecoded(bool success); - private: enum e_state // mState { @@ -268,8 +203,8 @@ friend class LLTextureFetch; CACHE_POST, LOAD_FROM_NETWORK, LOAD_FROM_SIMULATOR, - LOAD_FROM_HTTP_GET_URL, - LOAD_FROM_HTTP_GET_DATA, + SEND_HTTP_REQ, + WAIT_HTTP_REQ, DECODE_IMAGE, DECODE_IMAGE_UPDATE, WRITE_TO_CACHE, @@ -280,19 +215,17 @@ friend class LLTextureFetch; { UNSENT = 0, QUEUED = 1, - SENT_SIM = 2, - SENT_URL = 3, - SENT_HTTP = 4 + SENT_SIM = 2 }; static const char* sStateDescs[]; e_state mState; LLTextureFetch* mFetcher; - LLImageWorker* mImageWorker; LLPointer<LLImageFormatted> mFormattedImage; LLPointer<LLImageRaw> mRawImage; LLPointer<LLImageRaw> mAuxImage; LLUUID mID; LLHost mHost; + std::string mUrl; U8 mType; F32 mImagePriority; U32 mWorkPriority; @@ -314,15 +247,18 @@ friend class LLTextureFetch; S32 mCachedSize; BOOL mLoaded; e_request_state mSentRequest; + handle_t mDecodeHandle; BOOL mDecoded; BOOL mWritten; BOOL mNeedsAux; BOOL mHaveAllData; BOOL mInLocalCache; + S32 mHTTPFailCount; S32 mRetryAttempt; - std::string mURL; S32 mActiveCount; - + U32 mGetStatus; + std::string mGetReason; + // Work Data LLMutex mWorkMutex; struct PacketData @@ -340,25 +276,79 @@ friend class LLTextureFetch; U8 mImageCodec; }; -class LLTextureFetchLocalFileWorker : public LLTextureFetchWorker -{ -friend class LLTextureFetch; - -protected: - LLTextureFetchLocalFileWorker(LLTextureFetch* fetcher, const std::string& filename, const LLUUID& id, const LLHost& host, - F32 priority, S32 discard, S32 size) - : LLTextureFetchWorker(fetcher, id, host, priority, discard, size), - mFileName(filename) - {} +////////////////////////////////////////////////////////////////////////////// -private: - /*virtual*/ std::string getName() { return mFileName; } +class HTTPGetResponder : public LLCurl::Responder +{ + LOG_CLASS(HTTPGetResponder); +public: + HTTPGetResponder(LLTextureFetch* fetcher, const LLUUID& id, U64 startTime, S32 requestedSize, U32 offset) + : mFetcher(fetcher), mID(id), mStartTime(startTime), mRequestedSize(requestedSize), mOffset(offset) + { + } + ~HTTPGetResponder() + { + } + virtual void completedRaw(U32 status, const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + if ((gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog")) || (gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"))) + { + mFetcher->mTextureInfo.setRequestStartTime(mID, mStartTime); + U64 timeNow = LLTimer::getTotalTime(); + mFetcher->mTextureInfo.setRequestType(mID, LLTextureInfoDetails::REQUEST_TYPE_HTTP); + mFetcher->mTextureInfo.setRequestSize(mID, mRequestedSize); + mFetcher->mTextureInfo.setRequestOffset(mID, mOffset); + mFetcher->mTextureInfo.setRequestCompleteTimeAndLog(mID, timeNow); + } + lldebugs << "HTTP COMPLETE: " << mID << llendl; + mFetcher->lockQueue(); + LLTextureFetchWorker* worker = mFetcher->getWorker(mID); + if (worker) + { + bool success = false; + bool partial = false; + if (200 <= status && status < 300) + { + success = true; + if (203 == status) // partial information (i.e. last block) + { + partial = true; + } + } + else + { + worker->setGetStatus(status, reason); +// llwarns << status << ": " << reason << llendl; + } + if (!success) + { + worker->setGetStatus(status, reason); +// llwarns << "CURL GET FAILED, status:" << status << " reason:" << reason << llendl; + } + mFetcher->removeFromHTTPQueue(mID); + worker->callbackHttpGet(channels, buffer, partial, success); + } + else + { + mFetcher->removeFromHTTPQueue(mID); + llwarns << "Worker not found: " << mID << llendl; + } + mFetcher->unlockQueue(); + } + private: - std::string mFileName; + LLTextureFetch* mFetcher; + LLUUID mID; + U64 mStartTime; + S32 mRequestedSize; + U32 mOffset; }; +////////////////////////////////////////////////////////////////////////////// //static const char* LLTextureFetchWorker::sStateDescs[] = { @@ -368,8 +358,8 @@ const char* LLTextureFetchWorker::sStateDescs[] = { "CACHE_POST", "LOAD_FROM_NETWORK", "LOAD_FROM_SIMULATOR", - "LOAD_FROM_HTTP_URL", - "LOAD_FROM_HTTP_DATA", + "SEND_HTTP_REQ", + "WAIT_HTTP_REQ", "DECODE_IMAGE", "DECODE_IMAGE_UPDATE", "WRITE_TO_CACHE", @@ -380,6 +370,7 @@ const char* LLTextureFetchWorker::sStateDescs[] = { // called from MAIN THREAD LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, + const std::string& url, // Optional URL const LLUUID& id, // Image UUID const LLHost& host, // Simulator host F32 priority, // Priority @@ -388,9 +379,9 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, : LLWorkerClass(fetcher, "TextureFetch"), mState(INIT), mFetcher(fetcher), - mImageWorker(NULL), mID(id), mHost(host), + mUrl(url), mImagePriority(priority), mWorkPriority(0), mRequestedPriority(0.f), @@ -404,18 +395,21 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, mBuffer(NULL), mBufferSize(0), mRequestedSize(0), - mDesiredSize(FIRST_PACKET_SIZE), + mDesiredSize(TEXTURE_CACHE_ENTRY_SIZE), mFileSize(0), mCachedSize(0), mLoaded(FALSE), mSentRequest(UNSENT), + mDecodeHandle(0), mDecoded(FALSE), mWritten(FALSE), mNeedsAux(FALSE), mHaveAllData(FALSE), mInLocalCache(FALSE), + mHTTPFailCount(0), mRetryAttempt(0), mActiveCount(0), + mGetStatus(0), mWorkMutex(NULL), mFirstPacket(0), mLastPacket(-1), @@ -440,7 +434,7 @@ LLTextureFetchWorker::~LLTextureFetchWorker() // << " Requested=" << mRequestedDiscard // << " Desired=" << mDesiredDiscard << llendl; llassert_always(!haveWork()); - lockWorkData(); + lockWorkMutex(); if (mCacheReadHandle != LLTextureCache::nullHandle()) { mFetcher->mTextureCache->readComplete(mCacheReadHandle, true); @@ -449,13 +443,9 @@ LLTextureFetchWorker::~LLTextureFetchWorker() { mFetcher->mTextureCache->writeComplete(mCacheWriteHandle, true); } - if (mImageWorker) - { - mImageWorker->scheduleDelete(); - } mFormattedImage = NULL; clearPackets(); - unlockWorkData(); + unlockWorkMutex(); } void LLTextureFetchWorker::clearPackets() @@ -467,6 +457,38 @@ void LLTextureFetchWorker::clearPackets() mFirstPacket = 0; } +void LLTextureFetchWorker::setupPacketData() +{ + S32 data_size = 0; + if (mFormattedImage.notNull()) + { + data_size = mFormattedImage->getDataSize(); + } + if (data_size > 0) + { + // Only used for simulator requests + mFirstPacket = (data_size - FIRST_PACKET_SIZE) / MAX_IMG_PACKET_SIZE + 1; + if (FIRST_PACKET_SIZE + (mFirstPacket-1) * MAX_IMG_PACKET_SIZE != data_size) + { + llwarns << "Bad CACHED TEXTURE size: " << data_size << " removing." << llendl; + removeFromCache(); + resetFormattedData(); + clearPackets(); + } + else if (mFileSize > 0) + { + mLastPacket = mFirstPacket-1; + mTotalPackets = (mFileSize - FIRST_PACKET_SIZE + MAX_IMG_PACKET_SIZE-1) / MAX_IMG_PACKET_SIZE + 1; + } + else + { + // This file was cached using HTTP so we have to refetch the first packet + resetFormattedData(); + clearPackets(); + } + } +} + U32 LLTextureFetchWorker::calcWorkPriority() { // llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerTexture::maxDecodePriority()); @@ -538,7 +560,6 @@ void LLTextureFetchWorker::resetFormattedData() // Called from MAIN thread void LLTextureFetchWorker::startWork(S32 param) { - llassert(mImageWorker == NULL); llassert(mFormattedImage.isNull()); } @@ -549,6 +570,14 @@ bool LLTextureFetchWorker::doWork(S32 param) { LLMutexLock lock(&mWorkMutex); + if ((mFetcher->isQuitting() || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) + { + if (mState < WRITE_TO_CACHE) + { + return true; // abort + } + } + if (mFetcher->mDebugPause) { return false; // debug: don't do any work @@ -563,16 +592,9 @@ bool LLTextureFetchWorker::doWork(S32 param) mFetchTimer.reset(); } - if (mImagePriority <= 0.0f) - { - if (mState < WRITE_TO_CACHE) - { - return true; // cancel request - } - } - if (mState == INIT) { + mRawImage = NULL ; mRequestedDiscard = -1; mLoadedDiscard = -1; mDecodedDiscard = -1; @@ -590,8 +612,9 @@ bool LLTextureFetchWorker::doWork(S32 param) clearPackets(); // TODO: Shouldn't be necessary mCacheReadHandle = LLTextureCache::nullHandle(); mCacheWriteHandle = LLTextureCache::nullHandle(); - mURL.clear(); mState = LOAD_FROM_TEXTURE_CACHE; + LL_DEBUGS("Texture") << mID << ": Priority: " << llformat("%8.0f",mImagePriority) + << " Desired Discard: " << mDesiredDiscard << " Desired Size: " << mDesiredSize << LL_ENDL; // fall through } @@ -612,16 +635,27 @@ bool LLTextureFetchWorker::doWork(S32 param) setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage); - if (getName().empty()) + if (mUrl.compare(0, 7, "file://") == 0) + { + // read file from local disk + std::string filename = mUrl.substr(7, std::string::npos); + mCacheReadHandle = mFetcher->mTextureCache->readFromCache(filename, mID, cache_priority, + offset, size, responder); + } + else if (mUrl.empty()) { mCacheReadHandle = mFetcher->mTextureCache->readFromCache(mID, cache_priority, offset, size, responder); } else { - // read file from local disk - mCacheReadHandle = mFetcher->mTextureCache->readFromCache(getName(), mID, cache_priority, - offset, size, responder); + if (!(mUrl.compare(0, 7, "http://") == 0)) + { + // *TODO:?remove this warning + llwarns << "Unknown URL Type: " << mUrl << llendl; + } + setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); + mState = SEND_HTTP_REQ; } } @@ -647,75 +681,101 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mState == CACHE_POST) { - mDesiredSize = llmax(mDesiredSize, FIRST_PACKET_SIZE); + mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE); mCachedSize = mFormattedImage.notNull() ? mFormattedImage->getDataSize() : 0; // Successfully loaded if ((mCachedSize >= mDesiredSize) || mHaveAllData) { // we have enough data, decode it llassert_always(mFormattedImage->getDataSize() > 0); + mLoadedDiscard = mDesiredDiscard; mState = DECODE_IMAGE; + LL_DEBUGS("Texture") << mID << ": Cached. Bytes: " << mFormattedImage->getDataSize() + << " Size: " << llformat("%dx%d",mFormattedImage->getWidth(),mFormattedImage->getHeight()) + << " Desired Discard: " << mDesiredDiscard << " Desired Size: " << mDesiredSize << LL_ENDL; // fall through } else { - if (!getName().empty()) + if (mUrl.compare(0, 7, "file://") == 0) { // failed to load local file, we're done. return true; } // need more data - mState = LOAD_FROM_NETWORK; + else + { + LL_DEBUGS("Texture") << mID << ": Not in Cache" << LL_ENDL; + mState = LOAD_FROM_NETWORK; + } // fall through } } if (mState == LOAD_FROM_NETWORK) { - if (mSentRequest == UNSENT) + bool get_url = gSavedSettings.getBOOL("ImagePipelineUseHTTP"); + if (!mUrl.empty()) get_url = false; +// if (mHost != LLHost::invalid) get_url = false; + if ( get_url ) { - if (mFormattedImage.isNull()) - { - mFormattedImage = new LLImageJ2C; - } - // Add this to the network queue and sit here. - // LLTextureFetch::update() will send off a request which will change our state - S32 data_size = mFormattedImage->getDataSize(); - if (data_size > 0) + LLViewerRegion* region = NULL; + if (mHost == LLHost::invalid) + region = gAgent.getRegion(); + else + region = LLWorld::getInstance()->getRegion(mHost); + + if (region) { - // Only used for simulator requests - mFirstPacket = (data_size - FIRST_PACKET_SIZE) / MAX_IMG_PACKET_SIZE + 1; - if (FIRST_PACKET_SIZE + (mFirstPacket-1) * MAX_IMG_PACKET_SIZE != data_size) - { -// llwarns << "Bad CACHED TEXTURE size: " << data_size << " removing." << llendl; - removeFromCache(); - resetFormattedData(); - clearPackets(); - } - else + std::string http_url = region->getCapability("GetTexture"); + if (!http_url.empty()) { - mLastPacket = mFirstPacket-1; - mTotalPackets = (mFileSize - FIRST_PACKET_SIZE + MAX_IMG_PACKET_SIZE-1) / MAX_IMG_PACKET_SIZE + 1; + mUrl = http_url + "/?texture_id=" + mID.asString().c_str(); } } + else + { + llwarns << "Region not found for host: " << mHost << llendl; + } + } + if (!mUrl.empty()) + { + mState = LLTextureFetchWorker::SEND_HTTP_REQ; + setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); + // don't return, fall through to next state + } + else if (mSentRequest == UNSENT) + { + // Add this to the network queue and sit here. + // LLTextureFetch::update() will send off a request which will change our state mRequestedSize = mDesiredSize; mRequestedDiscard = mDesiredDiscard; mSentRequest = QUEUED; - mFetcher->lockQueue(); mFetcher->addToNetworkQueue(this); - mFetcher->unlockQueue(); setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); + return false; + } + else + { + // Shouldn't need to do anything here + //llassert_always(mFetcher->mNetworkQueue.find(mID) != mFetcher->mNetworkQueue.end()); + // Make certain this is in the network queue + //mFetcher->addToNetworkQueue(this); + //setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); + return false; } - return false; } if (mState == LOAD_FROM_SIMULATOR) { + if (mFormattedImage.isNull()) + { + mFormattedImage = new LLImageJ2C; + } if (processSimulatorPackets()) { - mFetcher->lockQueue(); - mFetcher->removeFromNetworkQueue(this); - mFetcher->unlockQueue(); + LL_DEBUGS("Texture") << mID << ": Loaded from Sim. Bytes: " << mFormattedImage->getDataSize() << LL_ENDL; + mFetcher->removeFromNetworkQueue(this, false); if (mFormattedImage.isNull() || !mFormattedImage->getDataSize()) { // processSimulatorPackets() failed @@ -727,108 +787,99 @@ bool LLTextureFetchWorker::doWork(S32 param) } else { + mFetcher->addToNetworkQueue(this); // failsafe setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); } return false; } -#if 0 - if (mState == LOAD_FROM_HTTP_GET_URL) - { - if (!mSentRequest) - { - mSentRequest = TRUE; - mLoaded = FALSE; - std::string url; - LLViewerRegion* region = gAgent.getRegion(); - if (region) + if (mState == SEND_HTTP_REQ) + { + { + const S32 HTTP_QUEUE_MAX_SIZE = 32; + // *TODO: Integrate this with llviewerthrottle + // Note: LLViewerThrottle uses dynamic throttling which makes sense for UDP, + // but probably not for Textures. + // Set the throttle to the entire bandwidth, assuming UDP packets will get priority + // when they are needed + F32 max_bandwidth = mFetcher->mMaxBandwidth; + if ((mFetcher->getHTTPQueueSize() >= HTTP_QUEUE_MAX_SIZE) || + (mFetcher->getTextureBandwidth() > max_bandwidth)) { - url = region->getCapability("RequestTextureDownload"); - } - if (!url.empty()) - { - LLSD sd; - sd = mID.asString(); - setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); - LLHTTPClient::post(url, sd, new URLResponder(mFetcher, mID)); + // Make normal priority and return (i.e. wait until there is room in the queue) + setPriority(LLWorkerThread::PRIORITY_NORMAL | mWorkPriority); return false; } - else - { -// llwarns << mID << ": HTTP get url failed, requesting from simulator" << llendl; - mSentRequest = FALSE; - mState = LOAD_FROM_SIMULATOR; - return false; - } - } - else - { - if (mLoaded) + + mFetcher->removeFromNetworkQueue(this, false); + + S32 cur_size = 0; + if (mFormattedImage.notNull()) { - if (!mURL.empty()) - { - mState = LOAD_FROM_HTTP_GET_DATA; - mSentRequest = FALSE; // reset - mLoaded = FALSE; // reset - } - else - { -// llwarns << mID << ": HTTP get url is empty, requesting from simulator" << llendl; - mSentRequest = FALSE; - mState = LOAD_FROM_SIMULATOR; - return false; - } + cur_size = mFormattedImage->getDataSize(); // amount of data we already have } - } - // fall through - } - - if (mState == LOAD_FROM_HTTP_GET_DATA) - { - if (!mSentRequest) - { - mSentRequest = TRUE; - S32 cur_size = mFormattedImage->getDataSize(); // amount of data we already have mRequestedSize = mDesiredSize; mRequestedDiscard = mDesiredDiscard; -#if 1 // *TODO: LLCurl::getByteRange is broken (ignores range) - cur_size = 0; - mFormattedImage->deleteData(); -#endif mRequestedSize -= cur_size; - // F32 priority = mImagePriority / (F32)LLViewerTexture::maxDecodePriority(); // 0-1 S32 offset = cur_size; mBufferSize = cur_size; // This will get modified by callbackHttpGet() - std::string url; - if (mURL.empty()) + + bool res = false; + if (!mUrl.empty()) { - //url = "http://asset.agni/0000002f-38ae-0e17-8e72-712e58964e9c.texture"; - std::stringstream urlstr; - urlstr << "http://asset.agni/" << mID.asString() << ".texture"; - url = urlstr.str(); + mLoaded = FALSE; + mGetStatus = 0; + mGetReason.clear(); + lldebugs << "HTTP GET: " << mID << " Offset: " << offset + << " Bytes: " << mRequestedSize + << " Bandwidth(kbps): " << mFetcher->getTextureBandwidth() << "/" << max_bandwidth + << llendl; + setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); + mState = WAIT_HTTP_REQ; + + mFetcher->addToHTTPQueue(mID); + // Will call callbackHttpGet when curl request completes + std::vector<std::string> headers; + headers.push_back("Accept: image/x-j2c"); + res = mFetcher->mCurlGetRequest->getByteRange(mUrl, headers, offset, mRequestedSize, + new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, offset)); } - else + if (!res) { - url = mURL; + llwarns << "HTTP GET request failed for " << mID << llendl; + resetFormattedData(); + ++mHTTPFailCount; + return true; // failed } - mLoaded = FALSE; -// llinfos << "HTTP GET: " << mID << " Offset: " << offset << " Bytes: " << mRequestedSize << llendl; - setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); - LLCurl::getByteRange(url, offset, mRequestedSize, - new HTTPGetResponder(mFetcher, mID)); // *TODO: use mWorkPriority - return false; // not done + // fall through } - + } + + if (mState == WAIT_HTTP_REQ) + { if (mLoaded) { - S32 cur_size = mFormattedImage->getDataSize(); + S32 cur_size = mFormattedImage.notNull() ? mFormattedImage->getDataSize() : 0; if (mRequestedSize < 0) { -// llwarns << "http get failed for: " << mID << llendl; + const S32 HTTP_MAX_RETRY_COUNT = 3; + S32 max_attempts = (mGetStatus == HTTP_NOT_FOUND) ? 1 : HTTP_MAX_RETRY_COUNT + 1; + llinfos << "HTTP GET failed for: " << mUrl + << " Status: " << mGetStatus << " Reason: '" << mGetReason << "'" + << " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl; if (cur_size == 0) { - resetFormattedData(); - return true; // failed + ++mHTTPFailCount; + if (mHTTPFailCount >= max_attempts) + { + resetFormattedData(); + return true; // failed + } + else + { + mState = SEND_HTTP_REQ; + return false; // retry + } } else { @@ -836,6 +887,18 @@ bool LLTextureFetchWorker::doWork(S32 param) return false; // use what we have } } + + if (mFormattedImage.isNull()) + { + // For now, create formatted image based on extension + std::string extension = gDirUtilp->getExtension(mUrl); + mFormattedImage = LLImageFormatted::createFromType(LLImageBase::getCodecFromExtension(extension)); + if (mFormattedImage.isNull()) + { + mFormattedImage = new LLImageJ2C; // default + } + } + llassert_always(mBufferSize == cur_size + mRequestedSize); if (mHaveAllData) { @@ -854,43 +917,51 @@ bool LLTextureFetchWorker::doWork(S32 param) mBuffer = NULL; mBufferSize = 0; mLoadedDiscard = mRequestedDiscard; - setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); mState = DECODE_IMAGE; + setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); + return false; + } + else + { + setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); return false; } - - // NOTE: Priority gets updated when the http get completes (in callbackHTTPGet()) - setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); - return false; } -#endif if (mState == DECODE_IMAGE) { - llassert_always(mFormattedImage->getDataSize() > 0); + if (mFormattedImage->getDataSize() <= 0) + { + llerrs << "Decode entered with invalid mFormattedImage. ID = " << mID << llendl; + } setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it mRawImage = NULL; mAuxImage = NULL; - llassert_always(mImageWorker == NULL); llassert_always(mFormattedImage.notNull()); + llassert_always(mLoadedDiscard >= 0); S32 discard = mHaveAllData ? 0 : mLoadedDiscard; U32 image_priority = LLWorkerThread::PRIORITY_NORMAL | mWorkPriority; mDecoded = FALSE; mState = DECODE_IMAGE_UPDATE; - mImageWorker = new LLImageWorker(mFormattedImage, image_priority, discard, new DecodeResponder(mFetcher, mID, this)); - // fall though (need to call requestDecodedData() to start work) + LL_DEBUGS("Texture") << mID << ": Decoding. Bytes: " << mFormattedImage->getDataSize() << " Discard: " << discard + << " All Data: " << mHaveAllData << LL_ENDL; + mDecodeHandle = mFetcher->mImageDecodeThread->decodeImage(mFormattedImage, image_priority, discard, mNeedsAux, + new DecodeResponder(mFetcher, mID, this)); + // fall though } if (mState == DECODE_IMAGE_UPDATE) { - if (decodeImage()) + if (mDecoded) { if (mDecodedDiscard < 0) { + LL_DEBUGS("Texture") << mID << ": Failed to Decode." << LL_ENDL; if (mCachedSize > 0 && !mInLocalCache && mRetryAttempt == 0) { // Cache file should be deleted, try again // llwarns << mID << ": Decode of cached file failed (removed), retrying" << llendl; + llassert_always(mDecodeHandle == 0); mFormattedImage = NULL; ++mRetryAttempt; setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); @@ -905,6 +976,9 @@ bool LLTextureFetchWorker::doWork(S32 param) } else { + llassert_always(mRawImage.notNull()); + LL_DEBUGS("Texture") << mID << ": Decoded. Discard: " << mDecodedDiscard + << " Raw Image: " << llformat("%dx%d",mRawImage->getWidth(),mRawImage->getHeight()) << LL_ENDL; setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); mState = WRITE_TO_CACHE; } @@ -918,9 +992,10 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mState == WRITE_TO_CACHE) { - if (mInLocalCache || !mFileSize || mSentRequest == UNSENT) + if (mInLocalCache || mSentRequest == UNSENT || mFormattedImage.isNull()) { - // If we're in a local cache or we didn't actually receive any new data, skip + // If we're in a local cache or we didn't actually receive any new data, + // or we failed to load anything, skip mState = DONE; return false; } @@ -979,10 +1054,10 @@ bool LLTextureFetchWorker::doWork(S32 param) // Called from MAIN thread void LLTextureFetchWorker::endWork(S32 param, bool aborted) { - if (mImageWorker) + if (mDecodeHandle != 0) { - mImageWorker->scheduleDelete(); - mImageWorker = NULL; + mFetcher->mImageDecodeThread->abortRequest(mDecodeHandle, false); + mDecodeHandle = 0; } mFormattedImage = NULL; } @@ -1035,7 +1110,7 @@ bool LLTextureFetchWorker::deleteOK() if ((haveWork() && // not ok to delete from these states - ((mState >= LOAD_FROM_HTTP_GET_URL && mState <= LOAD_FROM_HTTP_GET_DATA) || + ((mState >= SEND_HTTP_REQ && mState <= WAIT_HTTP_REQ) || (mState >= WRITE_TO_CACHE && mState <= WAIT_ON_WRITE)))) { delete_ok = false; @@ -1044,7 +1119,6 @@ bool LLTextureFetchWorker::deleteOK() return delete_ok; } - void LLTextureFetchWorker::removeFromCache() { if (!mInLocalCache) @@ -1061,6 +1135,7 @@ bool LLTextureFetchWorker::processSimulatorPackets() if (mFormattedImage.isNull() || mRequestedSize < 0) { // not sure how we got here, but not a valid state, abort! + llassert_always(mDecodeHandle == 0); mFormattedImage = NULL; return true; } @@ -1074,6 +1149,12 @@ bool LLTextureFetchWorker::processSimulatorPackets() buffer_size += mPackets[i]->mSize; } bool have_all_data = mLastPacket >= mTotalPackets-1; + if (mRequestedSize <= 0) + { + // We received a packed but haven't requested anything yet (edge case) + // Return true (we're "done") since we didn't request anything + return true; + } if (buffer_size >= mRequestedSize || have_all_data) { /// We have enough (or all) data @@ -1109,50 +1190,36 @@ bool LLTextureFetchWorker::processSimulatorPackets() ////////////////////////////////////////////////////////////////////////////// -void LLTextureFetchWorker::callbackURLReceived(const LLSD& data, bool success) +void LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer, + bool last_block, bool success) { -#if 0 LLMutexLock lock(&mWorkMutex); - if (!mSentRequest || mState != LOAD_FROM_HTTP_GET_URL) - { - llwarns << "callbackURLReceived for unrequested fetch worker, req=" - << mSentRequest << " state= " << mState << llendl; - return; - } - if (success) - { - mURL = data.asString(); - } - mLoaded = TRUE; - setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); -#endif -} - -////////////////////////////////////////////////////////////////////////////// -void LLTextureFetchWorker::callbackHttpGet(U8* data, S32 data_size, bool last_block) -{ -#if 0 - LLMutexLock lock(&mWorkMutex); - if (!mSentRequest || mState != LOAD_FROM_HTTP_GET_DATA) + if (mState != WAIT_HTTP_REQ) { - llwarns << "callbackHttpGet for unrequested fetch worker, req=" - << mSentRequest << " state= " << mState << llendl; + llwarns << "callbackHttpGet for unrequested fetch worker: " << mID + << " req=" << mSentRequest << " state= " << mState << llendl; return; } -// llinfos << "HTTP RECEIVED: " << mID.asString() << " Bytes: " << data_size << llendl; if (mLoaded) { llwarns << "Duplicate callback for " << mID.asString() << llendl; return; // ignore duplicate callback } - if (data_size >= 0) + if (success) { + // get length of stream: + S32 data_size = buffer->countAfter(channels.in(), NULL); + + gTextureList.sTextureBits += data_size * 8; // Approximate - does not include header bits + + //llinfos << "HTTP RECEIVED: " << mID.asString() << " Bytes: " << data_size << llendl; if (data_size > 0) { + // *TODO: set the formatted image data here directly to avoid the copy mBuffer = new U8[data_size]; - // *TODO: set the formatted image data here - memcpy(mBuffer, data, data_size); + buffer->readAfter(channels.in(), NULL, mBuffer, data_size); mBufferSize += data_size; if (data_size < mRequestedSize || last_block == true) { @@ -1160,10 +1227,11 @@ void LLTextureFetchWorker::callbackHttpGet(U8* data, S32 data_size, bool last_bl } else if (data_size > mRequestedSize) { - // *TODO: This will happen until we fix LLCurl::getByteRange() -// llinfos << "HUH?" << llendl; + // *TODO: This shouldn't be happening any more + llwarns << "data_size = " << data_size << " > requested: " << mRequestedSize << llendl; mHaveAllData = TRUE; - mFormattedImage->deleteData(); + llassert_always(mDecodeHandle == 0); + mFormattedImage = NULL; // discard any previous data we had mBufferSize = data_size; } } @@ -1181,7 +1249,6 @@ void LLTextureFetchWorker::callbackHttpGet(U8* data, S32 data_size, bool last_bl } mLoaded = TRUE; setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); -#endif } ////////////////////////////////////////////////////////////////////////////// @@ -1197,7 +1264,7 @@ void LLTextureFetchWorker::callbackCacheRead(bool success, LLImageFormatted* ima } if (success) { - llassert_always(imagesize > 0); + llassert_always(imagesize >= 0); mFileSize = imagesize; mFormattedImage = image; mImageCodec = image->getCodec(); @@ -1225,65 +1292,40 @@ void LLTextureFetchWorker::callbackCacheWrite(bool success) ////////////////////////////////////////////////////////////////////////////// -void LLTextureFetchWorker::callbackDecoded(bool success) +void LLTextureFetchWorker::callbackDecoded(bool success, LLImageRaw* raw, LLImageRaw* aux) { + LLMutexLock lock(&mWorkMutex); + if (mDecodeHandle == 0) + { + return; // aborted, ignore + } if (mState != DECODE_IMAGE_UPDATE) { // llwarns << "Decode callback for " << mID << " with state = " << mState << llendl; + mDecodeHandle = 0; return; } -// llinfos << mID << " : DECODE COMPLETE " << llendl; - setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); -} - -////////////////////////////////////////////////////////////////////////////// - -bool LLTextureFetchWorker::decodeImage() -{ - if(!mImageWorker) - { - //LLTextureFetchWorker is aborted, skip image decoding. - return true ; - } - - bool res = true; - if (mRawImage.isNull()) - { - res = false; - if (mImageWorker->requestDecodedData(mRawImage, -1)) - { - res = true; -// llinfos << mID << " : BASE DECODE FINISHED" << llendl; - } - } - if (res && - (mRawImage.notNull() && mRawImage->getDataSize() > 0) && - (mNeedsAux && mAuxImage.isNull())) + llassert_always(mFormattedImage.notNull()); + + mDecodeHandle = 0; + if (success) { - res = false; - if (mImageWorker->requestDecodedAuxData(mAuxImage, 4, -1)) - { - res = true; -// llinfos << mID << " : AUX DECODE FINISHED" << llendl; - } + llassert_always(raw); + mRawImage = raw; + mAuxImage = aux; + mDecodedDiscard = mFormattedImage->getDiscardLevel(); + LL_DEBUGS("Texture") << mID << ": Decode Finished. Discard: " << mDecodedDiscard + << " Raw Image: " << llformat("%dx%d",mRawImage->getWidth(),mRawImage->getHeight()) << LL_ENDL; } - if (res) + else { - if ((mRawImage.notNull() && mRawImage->getDataSize() > 0) && - (!mNeedsAux || (mAuxImage.notNull() && mAuxImage->getDataSize() > 0))) - { - mDecodedDiscard = mFormattedImage->getDiscardLevel(); -// llinfos << mID << " : DECODE FINISHED. DISCARD: " << mDecodedDiscard << llendl; - } - else - { -// llwarns << "DECODE FAILED: " << mID << " Discard: " << (S32)mFormattedImage->getDiscardLevel() << llendl; - removeFromCache(); - } - mImageWorker->scheduleDelete(); - mImageWorker = NULL; + llwarns << "DECODE FAILED: " << mID << " Discard: " << (S32)mFormattedImage->getDiscardLevel() << llendl; + removeFromCache(); + mDecodedDiscard = -1; // Redundant, here for clarity and paranoia } - return res; + mDecoded = TRUE; +// llinfos << mID << " : DECODE COMPLETE " << llendl; + setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); } ////////////////////////////////////////////////////////////////////////////// @@ -1314,15 +1356,21 @@ bool LLTextureFetchWorker::writeToCacheComplete() ////////////////////////////////////////////////////////////////////////////// // public -LLTextureFetch::LLTextureFetch(LLTextureCache* cache, bool threaded) +LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded) : LLWorkerThread("TextureFetch", threaded), mDebugCount(0), mDebugPause(FALSE), mPacketCount(0), mBadPacketCount(0), mQueueMutex(getAPRPool()), - mTextureCache(cache) + mNetworkQueueMutex(getAPRPool()), + mTextureCache(cache), + mImageDecodeThread(imagedecodethread), + mTextureBandwidth(0), + mCurlGetRequest(NULL) { + mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); + mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), gSavedSettings.getU32("TextureLoggingThreshold")); } LLTextureFetch::~LLTextureFetch() @@ -1330,13 +1378,7 @@ LLTextureFetch::~LLTextureFetch() // ~LLQueuedThread() called here } -bool LLTextureFetch::createRequest(const LLUUID& id, const LLHost& host, F32 priority, - S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux) -{ - return createRequest(LLStringUtil::null, id, host, priority, w, h, c, desired_discard, needs_aux); -} - -bool LLTextureFetch::createRequest(const std::string& filename, const LLUUID& id, const LLHost& host, F32 priority, +bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux) { if (mDebugPause) @@ -1361,7 +1403,14 @@ bool LLTextureFetch::createRequest(const std::string& filename, const LLUUID& id } S32 desired_size; - if (desired_discard == 0) + std::string exten = gDirUtilp->getExtension(url); + if (!url.empty() && (!exten.empty() && LLImageBase::getCodecFromExtension(exten) != IMG_CODEC_J2C)) + { + // Only do partial requests for J2C at the moment + //llinfos << "Merov : LLTextureFetch::createRequest(), blocking fetch on " << url << llendl; + desired_size = MAX_IMAGE_DATA_SIZE; + } + else if (desired_discard == 0) { // if we want the entire image, and we know its size, then get it all // (calcDataSizeJ2C() below makes assumptions about how the image @@ -1378,7 +1427,7 @@ bool LLTextureFetch::createRequest(const std::string& filename, const LLUUID& id } else { - desired_size = FIRST_PACKET_SIZE; + desired_size = TEXTURE_CACHE_ENTRY_SIZE; desired_discard = MAX_DISCARD_LEVEL; } @@ -1389,10 +1438,10 @@ bool LLTextureFetch::createRequest(const std::string& filename, const LLUUID& id { return false; // need to wait for previous aborted request to complete } - worker->lockWorkData(); + worker->lockWorkMutex(); worker->setImagePriority(priority); worker->setDesiredDiscard(desired_discard, desired_size); - worker->unlockWorkData(); + worker->unlockWorkMutex(); if (!worker->haveWork()) { worker->mState = LLTextureFetchWorker::INIT; @@ -1401,16 +1450,7 @@ bool LLTextureFetch::createRequest(const std::string& filename, const LLUUID& id } else { - if (filename.empty()) - { - // do remote fetch - worker = new LLTextureFetchWorker(this, id, host, priority, desired_discard, desired_size); - } - else - { - // do local file fetch - worker = new LLTextureFetchLocalFileWorker(this, filename, id, host, priority, desired_discard, desired_size); - } + worker = new LLTextureFetchWorker(this, url, id, host, priority, desired_discard, desired_size); mRequestMap[id] = worker; } worker->mActiveCount++; @@ -1430,10 +1470,9 @@ void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel) } // protected - -// call lockQueue() first! void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker) { + LLMutexLock lock(&mNetworkQueueMutex); if (mRequestMap.find(worker->mID) != mRequestMap.end()) { // only add to the queue if in the request map @@ -1447,10 +1486,27 @@ void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker) } } -// call lockQueue() first! -void LLTextureFetch::removeFromNetworkQueue(LLTextureFetchWorker* worker) +void LLTextureFetch::removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel) { - mNetworkQueue.erase(worker->mID); + LLMutexLock lock(&mNetworkQueueMutex); + size_t erased = mNetworkQueue.erase(worker->mID); + if (cancel && erased > 0) + { + mCancelQueue[worker->mHost].insert(worker->mID); + } +} + +// protected +void LLTextureFetch::addToHTTPQueue(const LLUUID& id) +{ + LLMutexLock lock(&mNetworkQueueMutex); + mHTTPTextureQueue.insert(id); +} + +void LLTextureFetch::removeFromHTTPQueue(const LLUUID& id) +{ + LLMutexLock lock(&mNetworkQueueMutex); + mHTTPTextureQueue.erase(id); } // call lockQueue() first! @@ -1458,11 +1514,7 @@ void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel) { size_t erased_1 = mRequestMap.erase(worker->mID); llassert_always(erased_1 > 0) ; - size_t erased = mNetworkQueue.erase(worker->mID); - if (cancel && erased > 0) - { - mCancelQueue[worker->mHost].insert(worker->mID); - } + removeFromNetworkQueue(worker, cancel); llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ; worker->scheduleDelete(); @@ -1504,24 +1556,27 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level, } else if (worker->checkWork()) { + worker->lockWorkMutex(); discard_level = worker->mDecodedDiscard; - raw = worker->mRawImage; worker->mRawImage = NULL; - aux = worker->mAuxImage; worker->mAuxImage = NULL; + raw = worker->mRawImage; + aux = worker->mAuxImage; res = true; + LL_DEBUGS("Texture") << id << ": Request Finished. State: " << worker->mState << " Discard: " << discard_level << LL_ENDL; + worker->unlockWorkMutex(); } else { - worker->lockWorkData(); + worker->lockWorkMutex(); if ((worker->mDecodedDiscard >= 0) && (worker->mDecodedDiscard < discard_level || discard_level < 0) && (worker->mState >= LLTextureFetchWorker::WAIT_ON_WRITE)) { // Not finished, but data is ready discard_level = worker->mDecodedDiscard; - if (worker->mRawImage) raw = worker->mRawImage; - if (worker->mAuxImage) aux = worker->mAuxImage; + raw = worker->mRawImage; + aux = worker->mAuxImage; } - worker->unlockWorkData(); + worker->unlockWorkMutex(); } } else @@ -1538,9 +1593,9 @@ bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority) LLTextureFetchWorker* worker = getWorker(id); if (worker) { - worker->lockWorkData(); + worker->lockWorkMutex(); worker->setImagePriority(priority); - worker->unlockWorkData(); + worker->unlockWorkMutex(); res = true; } return res; @@ -1548,40 +1603,106 @@ bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority) ////////////////////////////////////////////////////////////////////////////// +// MAIN THREAD //virtual S32 LLTextureFetch::update(U32 max_time_ms) { S32 res; + + mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); + res = LLWorkerThread::update(max_time_ms); - const F32 REQUEST_TIME = 1.f; - - // Periodically, gather the list of textures that need data from the network - // And send the requests out to the simulators - if (mNetworkTimer.getElapsedTimeF32() >= REQUEST_TIME) + if (!mDebugPause) { - mNetworkTimer.reset(); sendRequestListToSimulators(); } return res; } +// WORKER THREAD +void LLTextureFetch::startThread() +{ + // Construct mCurlGetRequest from Worker Thread + mCurlGetRequest = new LLCurlRequest(); +} + +// WORKER THREAD +void LLTextureFetch::endThread() +{ + // Destroy mCurlGetRequest from Worker Thread + delete mCurlGetRequest; + mCurlGetRequest = NULL; +} + +// WORKER THREAD +void LLTextureFetch::threadedUpdate() +{ + llassert_always(mCurlGetRequest); + + // Limit update frequency + const F32 PROCESS_TIME = 0.05f; + static LLFrameTimer process_timer; + if (process_timer.getElapsedTimeF32() < PROCESS_TIME) + { + return; + } + process_timer.reset(); + + // Update Curl on same thread as mCurlGetRequest was constructed + S32 processed = mCurlGetRequest->process(); + if (processed > 0) + { + lldebugs << "processed: " << processed << " messages." << llendl; + } + +#if 0 + const F32 INFO_TIME = 1.0f; + static LLFrameTimer info_timer; + if (info_timer.getElapsedTimeF32() >= INFO_TIME) + { + S32 q = mCurlGetRequest->getQueued(); + if (q > 0) + { + llinfos << "Queued gets: " << q << llendl; + info_timer.reset(); + } + } +#endif + +} + ////////////////////////////////////////////////////////////////////////////// void LLTextureFetch::sendRequestListToSimulators() { + // All requests + const F32 REQUEST_DELTA_TIME = 0.10f; // 10 fps + + // Sim requests const S32 IMAGES_PER_REQUEST = 50; - const F32 LAZY_FLUSH_TIMEOUT = 15.f; // 10.0f // temp + const F32 SIM_LAZY_FLUSH_TIMEOUT = 10.0f; // temp const F32 MIN_REQUEST_TIME = 1.0f; const F32 MIN_DELTA_PRIORITY = 1000.f; - LLMutexLock lock(&mQueueMutex); + // Periodically, gather the list of textures that need data from the network + // And send the requests out to the simulators + static LLFrameTimer timer; + if (timer.getElapsedTimeF32() < REQUEST_DELTA_TIME) + { + return; + } + timer.reset(); + LLMutexLock lock(&mQueueMutex); + // Send requests typedef std::set<LLTextureFetchWorker*,LLTextureFetchWorker::Compare> request_list_t; typedef std::map< LLHost, request_list_t > work_request_map_t; work_request_map_t requests; + { + LLMutexLock lock2(&mNetworkQueueMutex); for (queue_t::iterator iter = mNetworkQueue.begin(); iter != mNetworkQueue.end(); ) { queue_t::iterator curiter = iter++; @@ -1591,65 +1712,65 @@ void LLTextureFetch::sendRequestListToSimulators() mNetworkQueue.erase(curiter); continue; // paranoia } + if ((req->mState != LLTextureFetchWorker::LOAD_FROM_NETWORK) && + (req->mState != LLTextureFetchWorker::LOAD_FROM_SIMULATOR)) + { + // We already received our URL, remove from the queue + llwarns << "Worker: " << req->mID << " in mNetworkQueue but in wrong state: " << req->mState << llendl; + mNetworkQueue.erase(curiter); + continue; + } if (req->mID == mDebugID) { mDebugCount++; // for setting breakpoints } - if (req->mTotalPackets > 0 && req->mLastPacket >= req->mTotalPackets-1) + if (req->mSentRequest == LLTextureFetchWorker::SENT_SIM && + req->mTotalPackets > 0 && + req->mLastPacket >= req->mTotalPackets-1) { // We have all the packets... make sure this is high priority // req->setPriority(LLWorkerThread::PRIORITY_HIGH | req->mWorkPriority); continue; } F32 elapsed = req->mRequestedTimer.getElapsedTimeF32(); - F32 delta_priority = llabs(req->mRequestedPriority - req->mImagePriority); - if ((req->mSimRequestedDiscard != req->mDesiredDiscard) || - (delta_priority > MIN_DELTA_PRIORITY && elapsed >= MIN_REQUEST_TIME) || - (elapsed >= LAZY_FLUSH_TIMEOUT)) { - requests[req->mHost].insert(req); + F32 delta_priority = llabs(req->mRequestedPriority - req->mImagePriority); + if ((req->mSimRequestedDiscard != req->mDesiredDiscard) || + (delta_priority > MIN_DELTA_PRIORITY && elapsed >= MIN_REQUEST_TIME) || + (elapsed >= SIM_LAZY_FLUSH_TIMEOUT)) + { + requests[req->mHost].insert(req); + } } } - - std::string http_url; -#if 0 - if (gSavedSettings.getBOOL("ImagePipelineUseHTTP")) - { - LLViewerRegion* region = gAgent.getRegion(); - if (region) - { - http_url = region->getCapability("RequestTextureDownload"); - } } -#endif - + for (work_request_map_t::iterator iter1 = requests.begin(); iter1 != requests.end(); ++iter1) { - bool use_http = http_url.empty() ? false : true; LLHost host = iter1->first; // invalid host = use agent host if (host == LLHost::invalid) { host = gAgent.getRegionHost(); } - else - { - use_http = false; - } - if (use_http) + S32 sim_request_count = 0; + + for (request_list_t::iterator iter2 = iter1->second.begin(); + iter2 != iter1->second.end(); ++iter2) { - } - else - { - S32 request_count = 0; - for (request_list_t::iterator iter2 = iter1->second.begin(); - iter2 != iter1->second.end(); ++iter2) + LLTextureFetchWorker* req = *iter2; + if (gMessageSystem) { - LLTextureFetchWorker* req = *iter2; - req->mSentRequest = LLTextureFetchWorker::SENT_SIM; - if (0 == request_count) + if (req->mSentRequest != LLTextureFetchWorker::SENT_SIM) + { + // Initialize packet data based on data read from cache + req->lockWorkMutex(); + req->setupPacketData(); + req->unlockWorkMutex(); + } + if (0 == sim_request_count) { gMessageSystem->newMessageFast(_PREHASH_RequestImage); gMessageSystem->nextBlockFast(_PREHASH_AgentData); @@ -1666,30 +1787,42 @@ void LLTextureFetch::sendRequestListToSimulators() // llinfos << "IMAGE REQUEST: " << req->mID << " Discard: " << req->mDesiredDiscard // << " Packet: " << packet << " Priority: " << req->mImagePriority << llendl; - req->lockWorkData(); + if ((gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog")) || (gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"))) + { + mTextureInfo.setRequestStartTime(req->mID, LLTimer::getTotalTime()); + mTextureInfo.setRequestOffset(req->mID, 0); + mTextureInfo.setRequestSize(req->mID, 0); + mTextureInfo.setRequestType(req->mID, LLTextureInfoDetails::REQUEST_TYPE_UDP); + } + + req->lockWorkMutex(); + req->mSentRequest = LLTextureFetchWorker::SENT_SIM; req->mSimRequestedDiscard = req->mDesiredDiscard; req->mRequestedPriority = req->mImagePriority; req->mRequestedTimer.reset(); - req->unlockWorkData(); - request_count++; - if (request_count >= IMAGES_PER_REQUEST) + req->unlockWorkMutex(); + sim_request_count++; + if (sim_request_count >= IMAGES_PER_REQUEST) { -// llinfos << "REQUESTING " << request_count << " IMAGES FROM HOST: " << host.getIPString() << llendl; +// llinfos << "REQUESTING " << sim_request_count << " IMAGES FROM HOST: " << host.getIPString() << llendl; + gMessageSystem->sendSemiReliable(host, NULL, NULL); - request_count = 0; + sim_request_count = 0; } } - if (request_count > 0 && request_count < IMAGES_PER_REQUEST) - { -// llinfos << "REQUESTING " << request_count << " IMAGES FROM HOST: " << host.getIPString() << llendl; - gMessageSystem->sendSemiReliable(host, NULL, NULL); - request_count = 0; - } + } + if (gMessageSystem && sim_request_count > 0 && sim_request_count < IMAGES_PER_REQUEST) + { +// llinfos << "REQUESTING " << sim_request_count << " IMAGES FROM HOST: " << host.getIPString() << llendl; + gMessageSystem->sendSemiReliable(host, NULL, NULL); + sim_request_count = 0; } } // Send cancelations - if (!mCancelQueue.empty()) + { + LLMutexLock lock2(&mNetworkQueueMutex); + if (gMessageSystem && !mCancelQueue.empty()) { for (cancel_queue_t::iterator iter1 = mCancelQueue.begin(); iter1 != mCancelQueue.end(); ++iter1) @@ -1732,6 +1865,7 @@ void LLTextureFetch::sendRequestListToSimulators() } mCancelQueue.clear(); } + } } ////////////////////////////////////////////////////////////////////////////// @@ -1808,7 +1942,7 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 return false; } - worker->lockWorkData(); + worker->lockWorkMutex(); // Copy header data into image object worker->mImageCodec = codec; @@ -1819,7 +1953,7 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 res = worker->insertPacket(0, data, data_size); worker->setPriority(LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority); worker->mState = LLTextureFetchWorker::LOAD_FROM_SIMULATOR; - worker->unlockWorkData(); + worker->unlockWorkMutex(); return res; } @@ -1853,7 +1987,7 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1 return false; } - worker->lockWorkData(); + worker->lockWorkMutex(); res = worker->insertPacket(packet_num, data, data_size); @@ -1866,12 +2000,20 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1 else { // llwarns << "receiveImagePacket " << packet_num << "/" << worker->mLastPacket << " for worker: " << id -// << " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState] << llendl; - removeFromNetworkQueue(worker); // failsafe - mCancelQueue[host].insert(id); +// << " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState] << llendl; + removeFromNetworkQueue(worker, true); // failsafe } - - worker->unlockWorkData(); + + if(packet_num >= (worker->mTotalPackets - 1)) + { + if ((gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog")) || (gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"))) + { + U64 timeNow = LLTimer::getTotalTime(); + mTextureInfo.setRequestSize(id, worker->mFileSize); + mTextureInfo.setRequestCompleteTimeAndLog(id, timeNow); + } + } + worker->unlockWorkMutex(); return res; } @@ -1885,9 +2027,9 @@ BOOL LLTextureFetch::isFromLocalCache(const LLUUID& id) LLTextureFetchWorker* worker = getWorker(id); if (worker) { - worker->lockWorkData(); + worker->lockWorkMutex() ; from_cache = worker->mInLocalCache ; - worker->unlockWorkData(); + worker->unlockWorkMutex() ; } return from_cache ; @@ -1907,7 +2049,7 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r LLTextureFetchWorker* worker = getWorker(id); if (worker && worker->haveWork()) { - worker->lockWorkData(); + worker->lockWorkMutex(); state = worker->mState; fetch_dtime = worker->mFetchTimer.getElapsedTimeF32(); request_dtime = worker->mRequestedTimer.getElapsedTimeF32(); @@ -1924,7 +2066,7 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r data_progress = (F32)worker->mFormattedImage->getDataSize() / (F32)worker->mFileSize; } } - if (state >= LLTextureFetchWorker::LOAD_FROM_NETWORK && state <= LLTextureFetchWorker::LOAD_FROM_HTTP_GET_DATA) + if (state >= LLTextureFetchWorker::LOAD_FROM_NETWORK && state <= LLTextureFetchWorker::WAIT_HTTP_REQ) { requested_priority = worker->mRequestedPriority; } @@ -1933,7 +2075,7 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r requested_priority = worker->mImagePriority; } fetch_priority = worker->getPriority(); - worker->unlockWorkData(); + worker->unlockWorkMutex(); } data_progress_p = data_progress; requested_priority_p = requested_priority; @@ -1959,5 +2101,3 @@ void LLTextureFetch::dump() } } - -////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 97719a9468e..373e38a83cb 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -37,26 +37,29 @@ #include "llimage.h" #include "lluuid.h" #include "llworkerthread.h" +#include "llcurl.h" +#include "lltextureinfo.h" class LLViewerTexture; class LLTextureFetchWorker; +class HTTPGetResponder; class LLTextureCache; +class LLImageDecodeThread; class LLHost; // Interface class class LLTextureFetch : public LLWorkerThread { friend class LLTextureFetchWorker; + friend class HTTPGetResponder; public: - LLTextureFetch(LLTextureCache* cache, bool threaded); + LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* imagedecodethread, bool threaded); ~LLTextureFetch(); /*virtual*/ S32 update(U32 max_time_ms); - bool createRequest(const LLUUID& id, const LLHost& host, F32 priority, - S32 w, S32 h, S32 c, S32 discard, bool needs_aux); - bool createRequest(const std::string& filename, const LLUUID& id, const LLHost& host, F32 priority, + bool createRequest(const std::string& url, const LLUUID& id, const LLHost& host, F32 priority, S32 w, S32 h, S32 c, S32 discard, bool needs_aux); void deleteRequest(const LLUUID& id, bool cancel); bool getRequestFinished(const LLUUID& id, S32& discard_level, @@ -66,25 +69,39 @@ class LLTextureFetch : public LLWorkerThread bool receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes, U16 data_size, U8* data); bool receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data); + void setTextureBandwidth(F32 bandwidth) { mTextureBandwidth = bandwidth; } + F32 getTextureBandwidth() { return mTextureBandwidth; } + // Debug BOOL isFromLocalCache(const LLUUID& id); S32 getFetchState(const LLUUID& id, F32& decode_progress_p, F32& requested_priority_p, U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p); void dump(); S32 getNumRequests() { return mRequestMap.size(); } + S32 getNumHTTPRequests() { return mHTTPTextureQueue.size(); } // Public for access by callbacks void lockQueue() { mQueueMutex.lock(); } void unlockQueue() { mQueueMutex.unlock(); } LLTextureFetchWorker* getWorker(const LLUUID& id); + + LLTextureInfo* getTextureInfo() { return &mTextureInfo; } protected: void addToNetworkQueue(LLTextureFetchWorker* worker); - void removeFromNetworkQueue(LLTextureFetchWorker* worker); + void removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel); + void addToHTTPQueue(const LLUUID& id); + void removeFromHTTPQueue(const LLUUID& id); + S32 getHTTPQueueSize() { return (S32)mHTTPTextureQueue.size(); } void removeRequest(LLTextureFetchWorker* worker, bool cancel); + // Called from worker thread (during doWork) + void processCurlRequests(); private: void sendRequestListToSimulators(); + /*virtual*/ void startThread(void); + /*virtual*/ void endThread(void); + /*virtual*/ void threadedUpdate(void); public: LLUUID mDebugID; @@ -95,8 +112,11 @@ class LLTextureFetch : public LLWorkerThread private: LLMutex mQueueMutex; + LLMutex mNetworkQueueMutex; LLTextureCache* mTextureCache; + LLImageDecodeThread* mImageDecodeThread; + LLCurlRequest* mCurlGetRequest; // Map of all requests by UUID typedef std::map<LLUUID,LLTextureFetchWorker*> map_t; @@ -105,10 +125,13 @@ class LLTextureFetch : public LLWorkerThread // Set of requests that require network data typedef std::set<LLUUID> queue_t; queue_t mNetworkQueue; + queue_t mHTTPTextureQueue; typedef std::map<LLHost,std::set<LLUUID> > cancel_queue_t; cancel_queue_t mCancelQueue; - - LLFrameTimer mNetworkTimer; + F32 mTextureBandwidth; + F32 mMaxBandwidth; + LLTextureInfo mTextureInfo; }; #endif // LL_LLTEXTUREFETCH_H + diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp new file mode 100644 index 00000000000..672a36a8bd7 --- /dev/null +++ b/indra/newview/lltextureinfo.cpp @@ -0,0 +1,290 @@ +/** + * @file lltextureinfo.cpp + * @brief Object which handles local texture info + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "lltextureinfo.h" +#include "lltexturestats.h" +#include "llviewercontrol.h" + +LLTextureInfo::LLTextureInfo() : + mLogTextureDownloadsToViewerLog(false), + mLogTextureDownloadsToSimulator(false), + mTotalBytes(0), + mTotalMilliseconds(0), + mTextureDownloadsStarted(0), + mTextureDownloadsCompleted(0), + mTextureDownloadProtocol("NONE"), + mTextureLogThreshold(100 * 1024), + mCurrentStatsBundleStartTime(0) +{ + mTextures.clear(); +} + +void LLTextureInfo::setUpLogging(bool writeToViewerLog, bool sendToSim, U32 textureLogThreshold) +{ + mLogTextureDownloadsToViewerLog = writeToViewerLog; + mLogTextureDownloadsToSimulator = sendToSim; + mTextureLogThreshold = textureLogThreshold; +} + +LLTextureInfo::~LLTextureInfo() +{ + std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator; + for (iterator = mTextures.begin(); iterator != mTextures.end(); iterator++) + { + LLTextureInfoDetails *info = (*iterator).second; + delete info; + } + + mTextures.clear(); +} + +void LLTextureInfo::addRequest(const LLUUID& id) +{ + LLTextureInfoDetails *info = new LLTextureInfoDetails(); + mTextures[id] = info; +} + +U32 LLTextureInfo::getTextureInfoMapSize() +{ + return mTextures.size(); +} + +bool LLTextureInfo::has(const LLUUID& id) +{ + std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id); + if (iterator == mTextures.end()) + { + return false; + } + else + { + return true; + } +} + +void LLTextureInfo::setRequestStartTime(const LLUUID& id, U64 startTime) +{ + if (!has(id)) + { + addRequest(id); + } + mTextures[id]->mStartTime = startTime; + mTextureDownloadsStarted++; +} + +void LLTextureInfo::setRequestSize(const LLUUID& id, U32 size) +{ + if (!has(id)) + { + addRequest(id); + } + mTextures[id]->mSize = size; +} + +void LLTextureInfo::setRequestOffset(const LLUUID& id, U32 offset) +{ + if (!has(id)) + { + addRequest(id); + } + mTextures[id]->mOffset = offset; +} + +void LLTextureInfo::setRequestType(const LLUUID& id, LLTextureInfoDetails::LLRequestType type) +{ + if (!has(id)) + { + addRequest(id); + } + mTextures[id]->mType = type; +} + +void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64 completeTime) +{ + if (!has(id)) + { + addRequest(id); + } + mTextures[id]->mCompleteTime = completeTime; + + std::string protocol = "NONE"; + switch(mTextures[id]->mType) + { + case LLTextureInfoDetails::REQUEST_TYPE_HTTP: + protocol = "HTTP"; + break; + + case LLTextureInfoDetails::REQUEST_TYPE_UDP: + protocol = "UDP"; + break; + + case LLTextureInfoDetails::REQUEST_TYPE_NONE: + default: + break; + } + + if (mLogTextureDownloadsToViewerLog) + { + llinfos << "texture=" << id + << " start=" << mTextures[id]->mStartTime + << " end=" << mTextures[id]->mCompleteTime + << " size=" << mTextures[id]->mSize + << " offset=" << mTextures[id]->mOffset + << " length_in_ms=" << (mTextures[id]->mCompleteTime - mTextures[id]->mStartTime) / 1000 + << " protocol=" << protocol + << llendl; + } + + if(mLogTextureDownloadsToSimulator) + { + S32 texture_stats_upload_threshold = mTextureLogThreshold; + mTotalBytes += mTextures[id]->mSize; + mTotalMilliseconds += mTextures[id]->mCompleteTime - mTextures[id]->mStartTime; + mTextureDownloadsCompleted++; + mTextureDownloadProtocol = protocol; + if (mTotalBytes >= texture_stats_upload_threshold) + { + LLSD texture_data; + std::stringstream startTime; + startTime << mCurrentStatsBundleStartTime; + texture_data["start_time"] = startTime.str(); + std::stringstream endTime; + endTime << completeTime; + texture_data["end_time"] = endTime.str(); + texture_data["averages"] = getAverages(); + send_texture_stats_to_sim(texture_data); + resetTextureStatistics(); + } + } + + mTextures.erase(id); +} + +LLSD LLTextureInfo::getAverages() +{ + LLSD averagedTextureData; + S32 averageDownloadRate; + if(mTotalMilliseconds == 0) + { + averageDownloadRate = 0; + } + else + { + averageDownloadRate = (mTotalBytes * 8) / mTotalMilliseconds; + } + + averagedTextureData["bits_per_second"] = averageDownloadRate; + averagedTextureData["bytes_downloaded"] = mTotalBytes; + averagedTextureData["texture_downloads_started"] = mTextureDownloadsStarted; + averagedTextureData["texture_downloads_completed"] = mTextureDownloadsCompleted; + averagedTextureData["transport"] = mTextureDownloadProtocol; + + return averagedTextureData; +} + +void LLTextureInfo::resetTextureStatistics() +{ + mTotalMilliseconds = 0; + mTotalBytes = 0; + mTextureDownloadsStarted = 0; + mTextureDownloadsCompleted = 0; + mTextureDownloadProtocol = "NONE"; + mCurrentStatsBundleStartTime = LLTimer::getTotalTime(); +} + +U32 LLTextureInfo::getRequestStartTime(const LLUUID& id) +{ + if (!has(id)) + { + return 0; + } + else + { + std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id); + return (*iterator).second->mStartTime; + } +} + +U32 LLTextureInfo::getRequestSize(const LLUUID& id) +{ + if (!has(id)) + { + return 0; + } + else + { + std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id); + return (*iterator).second->mSize; + } +} + +U32 LLTextureInfo::getRequestOffset(const LLUUID& id) +{ + if (!has(id)) + { + return 0; + } + else + { + std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id); + return (*iterator).second->mOffset; + } +} + +LLTextureInfoDetails::LLRequestType LLTextureInfo::getRequestType(const LLUUID& id) +{ + if (!has(id)) + { + return LLTextureInfoDetails::REQUEST_TYPE_NONE; + } + else + { + std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id); + return (*iterator).second->mType; + } +} + +U32 LLTextureInfo::getRequestCompleteTime(const LLUUID& id) +{ + if (!has(id)) + { + return 0; + } + else + { + std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id); + return (*iterator).second->mCompleteTime; + } +} + diff --git a/indra/newview/lltextureinfo.h b/indra/newview/lltextureinfo.h new file mode 100644 index 00000000000..71b0ea431fd --- /dev/null +++ b/indra/newview/lltextureinfo.h @@ -0,0 +1,80 @@ +/** + * @file lltextureinfo.h + * @brief Object for managing texture information. + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLTEXTUREINFO_H +#define LL_LLTEXTUREINFO_H + +#include "lluuid.h" +#include "lltextureinfodetails.h" +#include <map> + +class LLTextureInfo +{ +public: + LLTextureInfo(); + ~LLTextureInfo(); + + void setUpLogging(bool writeToViewerLog, bool sendToSim, U32 textureLogThreshold); + bool has(const LLUUID& id); + void setRequestStartTime(const LLUUID& id, U64 startTime); + void setRequestSize(const LLUUID& id, U32 size); + void setRequestOffset(const LLUUID& id, U32 offset); + void setRequestType(const LLUUID& id, LLTextureInfoDetails::LLRequestType type); + void setRequestCompleteTimeAndLog(const LLUUID& id, U64 completeTime); + U32 getRequestStartTime(const LLUUID& id); + U32 getRequestSize(const LLUUID& id); + U32 getRequestOffset(const LLUUID& id); + LLTextureInfoDetails::LLRequestType getRequestType(const LLUUID& id); + U32 getRequestCompleteTime(const LLUUID& id); + void resetTextureStatistics(); + U32 getTextureInfoMapSize(); + LLSD getAverages(); + +private: + void addRequest(const LLUUID& id); + + std::map<LLUUID, LLTextureInfoDetails *> mTextures; + + LLSD mAverages; + + bool mLogTextureDownloadsToViewerLog; + bool mLogTextureDownloadsToSimulator; + S32 mTotalBytes; + S32 mTotalMilliseconds; + S32 mTextureDownloadsStarted; + S32 mTextureDownloadsCompleted; + std::string mTextureDownloadProtocol; + U32 mTextureLogThreshold; // in bytes + U64 mCurrentStatsBundleStartTime; +}; + +#endif // LL_LLTEXTUREINFO_H diff --git a/indra/newview/lltextureinfodetails.cpp b/indra/newview/lltextureinfodetails.cpp new file mode 100644 index 00000000000..f6ef47a2ee5 --- /dev/null +++ b/indra/newview/lltextureinfodetails.cpp @@ -0,0 +1,40 @@ +/** + * @file lltextureinfodetails.cpp + * @brief Object which handles details of any individual texture + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "lltextureinfodetails.h" + +LLTextureInfoDetails::LLTextureInfoDetails() : mStartTime(0), mCompleteTime(0), mSize(0), mType(REQUEST_TYPE_NONE), mOffset(0) +{ +} + diff --git a/indra/newview/lltextureinfodetails.h b/indra/newview/lltextureinfodetails.h new file mode 100644 index 00000000000..091fa01a3d7 --- /dev/null +++ b/indra/newview/lltextureinfodetails.h @@ -0,0 +1,58 @@ +/** + * @file lltextureinfo.h + * @brief Object for managing texture information. + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLTEXTUREINFODETAILS_H +#define LL_LLTEXTUREINFODETAILS_H + +#include "lluuid.h" + +class LLTextureInfoDetails +{ +public: + enum LLRequestType + { + REQUEST_TYPE_NONE, + REQUEST_TYPE_HTTP, + REQUEST_TYPE_UDP + }; + + U32 mStartTime; + U32 mCompleteTime; + U32 mOffset; + U32 mSize; + LLRequestType mType; + + LLTextureInfoDetails(); +}; + +#endif // LL_LLTEXTUREINFODETAILS_H + diff --git a/indra/newview/lltexturestats.cpp b/indra/newview/lltexturestats.cpp new file mode 100644 index 00000000000..c91bfd4df2a --- /dev/null +++ b/indra/newview/lltexturestats.cpp @@ -0,0 +1,61 @@ +/** + * @file lltexturerstats.cpp + * @brief texture stats helper methods + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "pipeline.h" +#include "llagent.h" +#include "lltexturefetch.h" +#include "lltexturestats.h" +#include "lltexturestatsuploader.h" +#include "llviewerregion.h" + +void send_texture_stats_to_sim(const LLSD &texture_stats) +{ + LLSD texture_stats_report; + // Only send stats if the agent is connected to a region. + if (!gAgent.getRegion() || gNoRender) + { + return; + } + + LLUUID agent_id = gAgent.getID(); + texture_stats_report["agent_id"] = agent_id; + texture_stats_report["region_id"] = gAgent.getRegion()->getRegionID(); + texture_stats_report["stats_data"] = texture_stats; + + std::string texture_cap_url = gAgent.getRegion()->getCapability("TextureStats"); + LLTextureStatsUploader tsu; + llinfos << "uploading texture stats data to simulator" << llendl; + tsu.uploadStatsToSimulator(texture_cap_url, texture_stats); +} + diff --git a/indra/newview/lltexturestats.h b/indra/newview/lltexturestats.h new file mode 100644 index 00000000000..2deb377dfdd --- /dev/null +++ b/indra/newview/lltexturestats.h @@ -0,0 +1,41 @@ +/** + * @file lltexturestats.h + * @brief texture stats utilities + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLTEXTURESTATS_H +#define LL_LLTEXTURESTATS_H + +#include "llappviewer.h" + +// utility functions to capture data on texture download speeds and send to simulator periodically +void send_texture_stats_to_sim(const LLSD &texture_stats); + +#endif // LL_LLTEXTURESTATS_H diff --git a/indra/newview/lltexturestatsuploader.cpp b/indra/newview/lltexturestatsuploader.cpp new file mode 100644 index 00000000000..e0358e1fcaf --- /dev/null +++ b/indra/newview/lltexturestatsuploader.cpp @@ -0,0 +1,59 @@ +/** + * @file lltexturerstats.cpp + * @brief texture stats upload class + * + * $LicenseInfo:firstyear=2002&license=viewergpl$ + * + * Copyright (c) 2002-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "lltexturestatsuploader.h" + +LLTextureStatsUploader::LLTextureStatsUploader() +{ +} + +LLTextureStatsUploader::~LLTextureStatsUploader() +{ +} + +void LLTextureStatsUploader::uploadStatsToSimulator(const std::string texture_cap_url, const LLSD &texture_stats) +{ + if ( texture_cap_url != "" ) + { + LLHTTPClient::post(texture_cap_url, texture_stats, NULL); + } + else + { + llinfos << "Not sending texture stats: " + << texture_stats + << " as there is no cap url." + << llendl; + } +} + diff --git a/indra/newview/lltexturestatsuploader.h b/indra/newview/lltexturestatsuploader.h new file mode 100644 index 00000000000..f6cc8be8fe9 --- /dev/null +++ b/indra/newview/lltexturestatsuploader.h @@ -0,0 +1,48 @@ +/** + * @file lltexturestatsuploader.h + * @brief Class to send the texture stats to the simulatore + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLTEXTURESTATSUPLOADER_H +#define LL_LLTEXTURESTATSUPLOADER_H + +#include "llappviewer.h" + +// utility functions to capture data on texture download speeds and send to simulator periodically + +class LLTextureStatsUploader +{ +public: + LLTextureStatsUploader(); + ~LLTextureStatsUploader(); + void uploadStatsToSimulator(const std::string texture_cap_url, const LLSD &texture_stats); +}; + +#endif // LL_LLTEXTURESTATSUPLOADER_H diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index ea675c5a6e4..44ef6717e70 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -44,19 +44,21 @@ #include "llrender.h" #include "lltooltip.h" +#include "llappviewer.h" #include "llselectmgr.h" #include "lltexlayer.h" #include "lltexturecache.h" #include "lltexturefetch.h" +#include "llviewercontrol.h" #include "llviewerobject.h" #include "llviewertexture.h" #include "llviewertexturelist.h" -#include "llappviewer.h" - +#include "llvovolume.h" extern F32 texmem_lower_bound_scale; LLTextureView *gTextureView = NULL; LLTextureSizeView *gTextureSizeView = NULL; +LLTextureSizeView *gTextureCategoryView = NULL; //static std::set<LLViewerFetchedTexture*> LLTextureView::sDebugImages; @@ -230,10 +232,10 @@ void LLTextureBar::draw() { "DSK", LLColor4::blue }, // CACHE_POST { "NET", LLColor4::green }, // LOAD_FROM_NETWORK { "SIM", LLColor4::green }, // LOAD_FROM_SIMULATOR - { "URL", LLColor4::green2 },// LOAD_FROM_HTTP_GET_URL - { "HTP", LLColor4::green }, // LOAD_FROM_HTTP_GET_DATA + { "REQ", LLColor4::yellow },// SEND_HTTP_REQ + { "HTP", LLColor4::green }, // WAIT_HTTP_REQ { "DEC", LLColor4::yellow },// DECODE_IMAGE - { "DEC", LLColor4::yellow },// DECODE_IMAGE_UPDATE + { "DEC", LLColor4::green }, // DECODE_IMAGE_UPDATE { "WRT", LLColor4::purple },// WRITE_TO_CACHE { "WRT", LLColor4::orange },// WAIT_ON_WRITE { "END", LLColor4::red }, // DONE @@ -261,7 +263,7 @@ void LLTextureBar::draw() // Draw the progress bar. S32 bar_width = 100; - S32 bar_left = 280; + S32 bar_left = 260; left = bar_left; right = left + bar_width; @@ -286,30 +288,31 @@ void LLTextureBar::draw() S32 pip_x = title_x3 + pip_space/2; // Draw the packet pip + const F32 pip_max_time = 5.f; F32 last_event = mImagep->mLastPacketTimer.getElapsedTimeF32(); - if (last_event < 1.f) + if (last_event < pip_max_time) { clr = LLColor4::white; } else { last_event = mImagep->mRequestDeltaTime; - if (last_event < 1.f) + if (last_event < pip_max_time) { clr = LLColor4::green; } else { last_event = mImagep->mFetchDeltaTime; - if (last_event < 1.f) + if (last_event < pip_max_time) { clr = LLColor4::yellow; } } } - if (last_event < 1.f) + if (last_event < pip_max_time) { - clr.setAlpha(1.f - last_event); + clr.setAlpha(1.f - last_event/pip_max_time); gGL.color4fv(clr.mV); gl_rect_2d(pip_x, top, pip_x + pip_width, bottom); } @@ -406,89 +409,113 @@ void LLGLTexMemBar::draw() S32 total_mem = BYTES_TO_MEGA_BYTES(LLViewerTexture::sTotalTextureMemoryInBytes); S32 max_total_mem = LLViewerTexture::sMaxTotalTextureMemInMegaBytes; F32 discard_bias = LLViewerTexture::sDesiredDiscardBias; + F32 cache_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getUsage()) ; + F32 cache_max_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getMaxUsage()) ; S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); S32 h_offset = (S32)((texture_bar_height + 2.5f) * mTextureView->mNumTextureBars + 2.5f); //---------------------------------------------------------------------------- LLGLSUIDefault gls_ui; - F32 text_color[] = {1.f, 1.f, 1.f, 0.75f}; + LLColor4 text_color(1.f, 1.f, 1.f, 0.75f); + LLColor4 color; std::string text; - text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Discard Bias: %.2f", + text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB", total_mem, max_total_mem, bound_mem, max_bound_mem, - discard_bias); + LLImageRaw::sGlobalRawMemory >> 20, discard_bias, + cache_usage, cache_max_usage); + //, cache_entries, cache_max_entries LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, h_offset + line_height*3, - text_color, LLFontGL::LEFT, LLFontGL::TOP); + text_color, LLFontGL::LEFT, LLFontGL::TOP); //---------------------------------------------------------------------------- - S32 bar_left = 380; +#if 0 + S32 bar_left = 400; S32 bar_width = 200; S32 top = line_height*3 - 2 + h_offset; S32 bottom = top - 6; S32 left = bar_left; S32 right = left + bar_width; - - F32 bar_scale = (F32)bar_width / (max_bound_mem * 1.5f); + F32 bar_scale; gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - - gGL.color4f(0.5f, 0.5f, 0.5f, 0.75f); - gl_rect_2d(left, top, right, bottom); - + // GL Mem Bar + left = bar_left; - right = left + llfloor(bound_mem * bar_scale); - if (bound_mem < llfloor(max_bound_mem * texmem_lower_bound_scale)) - { - gGL.color4f(0.f, 1.f, 0.f, 0.75f); - } - else if (bound_mem < max_bound_mem) - { - gGL.color4f(1.f, 1.f, 0.f, 0.75f); - } - else - { - gGL.color4f(1.f, 0.f, 0.f, 0.75f); - } + text = "GL"; + LLFontGL::getFontMonospace()->renderUTF8(text, 0, left, line_height*3, + text_color, LLFontGL::LEFT, LLFontGL::TOP); + + left = bar_left+20; + right = left + bar_width; + + gGL.color4f(0.5f, 0.5f, 0.5f, 0.75f); // grey gl_rect_2d(left, top, right, bottom); bar_scale = (F32)bar_width / (max_total_mem * 1.5f); + right = left + llfloor(total_mem * bar_scale); + right = llclamp(right, bar_left, bar_left + bar_width); - top = bottom - 2; - bottom = top - 6; + color = (total_mem < llfloor(max_total_mem * texmem_lower_bound_scale)) ? LLColor4::green : + (total_mem < max_total_mem) ? LLColor4::yellow : LLColor4::red; + color[VALPHA] = .75f; + glColor4fv(color.mV); + + gl_rect_2d(left, top, right, bottom); // red/yellow/green + + // + bar_left += bar_width + bar_space; + //top = bottom - 2; bottom = top - 6; + + // Bound Mem Bar + left = bar_left; - right = left + llfloor(total_mem * bar_scale); - if (total_mem < llfloor(max_total_mem * texmem_lower_bound_scale)) - { - gGL.color4f(0.f, 1.f, 0.f, 0.75f); - } - else if (total_mem < max_total_mem) - { - gGL.color4f(1.f, 1.f, 0.f, 0.75f); - } - else - { - gGL.color4f(1.f, 0.f, 0.f, 0.75f); - } + text = "GL"; + LLFontGL::getFontMonospace()->renderUTF8(text, 0, left, line_height*3, + text_color, LLFontGL::LEFT, LLFontGL::TOP); + left = bar_left + 20; + right = left + bar_width; + + gGL.color4f(0.5f, 0.5f, 0.5f, 0.75f); gl_rect_2d(left, top, right, bottom); + color = (bound_mem < llfloor(max_bound_mem * texmem_lower_bound_scale)) ? LLColor4::green : + (bound_mem < max_bound_mem) ? LLColor4::yellow : LLColor4::red; + color[VALPHA] = .75f; + glColor4fv(color.mV); + + gl_rect_2d(left, top, right, bottom); +#else + S32 left = 0 ; +#endif //---------------------------------------------------------------------------- - text = llformat("Textures: Count: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d(%d) RAW:%d mRaw:%d mAux:%d CB:%d", + text = llformat("Textures: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d RAW:%d HTP:%d", gTextureList.getNumImages(), LLAppViewer::getTextureFetch()->getNumRequests(), LLAppViewer::getTextureFetch()->getNumDeletes(), LLAppViewer::getTextureFetch()->mPacketCount, LLAppViewer::getTextureFetch()->mBadPacketCount, LLAppViewer::getTextureCache()->getNumReads(), LLAppViewer::getTextureCache()->getNumWrites(), LLLFSThread::sLocal->getPending(), - LLImageWorker::sCount, LLImageWorker::getWorkerThread()->getNumDeletes(), - LLImageRaw::sRawImageCount, LLViewerFetchedTexture::sRawCount, LLViewerFetchedTexture::sAuxCount, - gTextureList.mCallbackList.size()); + LLAppViewer::getImageDecodeThread()->getPending(), + LLImageRaw::sRawImageCount, + LLAppViewer::getTextureFetch()->getNumHTTPRequests()); LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, h_offset + line_height*2, text_color, LLFontGL::LEFT, LLFontGL::TOP); + + + left = 550; + F32 bandwidth = LLAppViewer::getTextureFetch()->getTextureBandwidth(); + F32 max_bandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); + color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color; + color[VALPHA] = text_color[VALPHA]; + text = llformat("BW:%.0f/%.0f",bandwidth, max_bandwidth); + LLFontGL::getFontMonospace()->renderUTF8(text, 0, left, line_height*2, + color, LLFontGL::LEFT, LLFontGL::TOP); S32 dx1 = 0; if (LLAppViewer::getTextureFetch()->mDebugPause) @@ -555,7 +582,7 @@ class LLGLTexSizeBar void setTop(S32 loaded, S32 bound, F32 scale) {mTopLoaded = loaded ; mTopBound = bound; mScale = scale ;} void draw(); - BOOL handleHover(S32 x, S32 y, MASK mask) ; + BOOL handleHover(S32 x, S32 y, MASK mask, BOOL set_pick_size) ; private: S32 mIndex ; @@ -568,19 +595,16 @@ class LLGLTexSizeBar F32 mScale ; }; -BOOL LLGLTexSizeBar::handleHover(S32 x, S32 y, MASK mask) +BOOL LLGLTexSizeBar::handleHover(S32 x, S32 y, MASK mask, BOOL set_pick_size) { -#if !LL_RELEASE_FOR_DOWNLOAD if(y > mBottom && (y < mBottom + (S32)(mTopLoaded * mScale) || y < mBottom + (S32)(mTopBound * mScale))) { - LLImageGL::setCurTexSizebar(mIndex); + LLImageGL::setCurTexSizebar(mIndex, set_pick_size); } -#endif return TRUE ; } void LLGLTexSizeBar::draw() { -#if !LL_RELEASE_FOR_DOWNLOAD LLGLSUIDefault gls_ui; if(LLImageGL::sCurTexSizeBar == mIndex) @@ -601,7 +625,6 @@ void LLGLTexSizeBar::draw() F32 bound_color[] = {1.0f, 1.0f, 0.0f, 0.75f}; gl_rect_2d(mLeft, mBottom + (S32)(mTopLoaded * mScale), (mLeft + mRight) / 2, mBottom, loaded_color) ; gl_rect_2d((mLeft + mRight) / 2, mBottom + (S32)(mTopBound * mScale), mRight, mBottom, bound_color) ; -#endif } //////////////////////////////////////////////////////////////////////////// @@ -675,7 +698,13 @@ void LLTextureView::draw() << "\t" << cur_discard << llendl; } - + + if (imagep->getID() == LLAppViewer::getTextureFetch()->mDebugID) + { + static S32 debug_count = 0; + ++debug_count; // for breakpoints + } + #if 0 if (imagep->getDontDiscard()) { @@ -889,8 +918,7 @@ BOOL LLTextureView::handleKey(KEY key, MASK mask, BOOL called_from_parent) } //----------------------------------------------------------------- -LLTextureSizeView::LLTextureSizeView(const LLTextureSizeView::Params& p) - : LLView(p) +LLTextureSizeView::LLTextureSizeView(const LLTextureSizeView::Params& p) : LLContainerView(p) { setVisible(FALSE) ; @@ -910,7 +938,31 @@ LLTextureSizeView::~LLTextureSizeView() } void LLTextureSizeView::draw() { -#if !LL_RELEASE_FOR_DOWNLOAD + if(mType == TEXTURE_MEM_OVER_SIZE) + { + drawTextureSizeGraph(); + } + else + { + drawTextureCategoryGraph() ; + } + + LLView::draw(); +} + +BOOL LLTextureSizeView::handleHover(S32 x, S32 y, MASK mask) +{ + if(x > mTextureSizeBarRect.mLeft && x < mTextureSizeBarRect.mRight) + { + mTextureSizeBar[(x - mTextureSizeBarRect.mLeft) / mTextureSizeBarWidth]->handleHover(x, y, mask, (mType == TEXTURE_MEM_OVER_SIZE)) ; + } + + return TRUE ; +} + +//draw real-time texture mem bar over size +void LLTextureSizeView::drawTextureSizeGraph() +{ if(mTextureSizeBar.size() == 0) { S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); @@ -931,29 +983,16 @@ void LLTextureSizeView::draw() mTextureSizeBar[i]->draw() ; } LLImageGL::resetCurTexSizebar(); - - LLView::draw(); -#endif -} - -BOOL LLTextureSizeView::handleHover(S32 x, S32 y, MASK mask) -{ - if(x > mTextureSizeBarRect.mLeft && x < mTextureSizeBarRect.mRight) - { - mTextureSizeBar[(x - mTextureSizeBarRect.mLeft) / mTextureSizeBarWidth]->handleHover(x, y, mask) ; - } - - return TRUE ; } //draw background of texture size bar graph F32 LLTextureSizeView::drawTextureSizeDistributionGraph() { + //scale F32 scale = 1.0f ; -#if !LL_RELEASE_FOR_DOWNLOAD + LLGLSUIDefault gls_ui; - //scale { S32 count = 0 ; for(U32 i = 0 ; i < LLImageGL::sTextureLoadedCounter.size() ; i++) @@ -1043,8 +1082,137 @@ F32 LLTextureSizeView::drawTextureSizeDistributionGraph() text = llformat("Texture Size Distribution") ; LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + 250, top + line_height * 3, text_color, LLFontGL::LEFT, LLFontGL::TOP); - -#endif return scale ; } +//draw real-time texture mem bar over category +void LLTextureSizeView::drawTextureCategoryGraph() +{ + if(mTextureSizeBar.size() == 0) + { + S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); + mTextureSizeBar.resize(LLViewerTexture::getTotalNumOfCategories()) ; + mTextureSizeBarRect.set(700, line_height * 2 + 400, 700 + mTextureSizeBar.size() * mTextureSizeBarWidth, line_height * 2) ; + + for(U32 i = 0 ; i < mTextureSizeBar.size() ; i++) + { + mTextureSizeBar[i] = new LLGLTexSizeBar(i, mTextureSizeBarRect.mLeft + i * mTextureSizeBarWidth , + line_height * 2, mTextureSizeBarRect.mLeft + (i + 1) * mTextureSizeBarWidth, line_height) ; + } + } + + F32 size_bar_scale = drawTextureCategoryDistributionGraph() ; + for(U32 i = 0 ; i < mTextureSizeBar.size() ; i++) + { + U32 k = LLViewerTexture::getIndexFromCategory(i) ; + mTextureSizeBar[i]->setTop(LLImageGL::sTextureMemByCategory[k] >> 20, LLImageGL::sTextureMemByCategoryBound[k] >> 20, size_bar_scale) ; + mTextureSizeBar[i]->draw() ; + } + LLImageGL::resetCurTexSizebar(); +} + +//draw background for TEXTURE_MEM_OVER_CATEGORY +F32 LLTextureSizeView::drawTextureCategoryDistributionGraph() +{ + //scale + F32 scale = 4.0f ; + + LLGLSUIDefault gls_ui; + + { + S32 count = 0 ; + for(U32 i = 0 ; i < LLImageGL::sTextureMemByCategory.size() ; i++) + { + S32 tmp = LLImageGL::sTextureMemByCategory[i] >> 20 ; + if(tmp > count) + { + count = tmp ; + } + } + if(count > mTextureSizeBarRect.getHeight() * 0.25f) + { + scale = (F32)mTextureSizeBarRect.getHeight() * 0.25f / count ; + } + } + + S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); + S32 left = mTextureSizeBarRect.mLeft ; + S32 bottom = mTextureSizeBarRect.mBottom ; + S32 right = mTextureSizeBarRect.mRight ; + S32 top = mTextureSizeBarRect.mTop ; + + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + + //background rect + gl_rect_2d(left - 25, top + 30, right + 100, bottom - 25, LLColor4(0.0f, 0.0f, 0.0f, 0.25f)) ; + + //-------------------------------------------------- + gGL.color4f(1.0f, 0.5f, 0.5f, 0.75f); + gl_line_2d(left, bottom, right, bottom) ; //x axis + gl_line_2d(left, bottom, left, top) ; //y axis + + //ruler + //-------------------------------------------------- + gGL.color4f(1.0f, 0.5f, 0.5f, 0.5f); + for(S32 i = bottom + 50 ; i <= top ; i += 50) + { + gl_line_2d(left, i, right, i) ; + } + + //texts + //-------------------------------------------------- + F32 text_color[] = {1.f, 1.f, 1.f, 0.75f}; + std::string text; + + //------- + //x axis: size label + static char category[LLViewerTexture::MAX_GL_IMAGE_CATEGORY][4] = + {"Non", "Bak", "Av", "Cld", "Scp", "Hi", "Trn", "Slt", "Hud", "Bsf", "UI", "Pvw", "Map", "Mvs", "Slf", "Loc", "Scr", "Dyn", "Mdi", "ALT", "Oth" } ; + + text = llformat("%s", category[0]) ; + LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + 12, bottom - line_height / 2, + text_color, LLFontGL::LEFT, LLFontGL::TOP); + for(U32 i = 1 ; i < mTextureSizeBar.size() ; i++) + { + text = llformat("%s", category[i]) ; + LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + i * mTextureSizeBarWidth + 12, bottom - line_height / 2, + text_color, LLFontGL::LEFT, LLFontGL::TOP); + } + //------- + + //y axis: number label + for(S32 i = bottom + 50 ; i <= top ; i += 50) + { + text = llformat("%d", (S32)((i - bottom) / scale)) ; + LLFontGL::getFontMonospace()->renderUTF8(text, 0, left - 20, i + line_height / 2 , + text_color, LLFontGL::LEFT, LLFontGL::TOP); + LLFontGL::getFontMonospace()->renderUTF8(text, 0, right + 5, i + line_height / 2 , + text_color, LLFontGL::LEFT, LLFontGL::TOP); + } + + text = llformat("MB") ; + LLFontGL::getFontMonospace()->renderUTF8(text, 0, left - 20, top + line_height * 2 , + text_color, LLFontGL::LEFT, LLFontGL::TOP); + //-------------------------------------------------- + F32 loaded_color[] = {1.0f, 0.0f, 0.0f, 0.75f}; + gl_rect_2d(left + 70, top + line_height * 2, left + 90, top + line_height, loaded_color) ; + text = llformat("Loaded") ; + LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + 100, top + line_height * 2, + loaded_color, + LLFontGL::LEFT, LLFontGL::TOP); + + F32 bound_color[] = {1.0f, 1.0f, 0.0f, 0.75f}; + gl_rect_2d(left + 170, top + line_height * 2, left + 190, top + line_height, bound_color) ; + text = llformat("Bound") ; + LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + 200, top + line_height * 2, + bound_color, LLFontGL::LEFT, LLFontGL::TOP); + + //-------------------------------------------------- + + //title + text = llformat("Texture Category Distribution") ; + LLFontGL::getFontMonospace()->renderUTF8(text, 0, left + 250, top + line_height * 3, + text_color, LLFontGL::LEFT, LLFontGL::TOP); + + return scale ; +} diff --git a/indra/newview/lltextureview.h b/indra/newview/lltextureview.h index e917c0235e7..435a55df835 100644 --- a/indra/newview/lltextureview.h +++ b/indra/newview/lltextureview.h @@ -79,24 +79,41 @@ class LLTextureView : public LLContainerView }; class LLGLTexSizeBar; - -class LLTextureSizeView : public LLView +class LLTextureSizeView : public LLContainerView { -public: +protected: LLTextureSizeView(const Params&); + friend class LLUICtrlFactory; +public: ~LLTextureSizeView(); /*virtual*/ void draw(); /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask) ; + void setType(S32 type) {mType = type ;} + enum + { + TEXTURE_MEM_OVER_SIZE, + TEXTURE_MEM_OVER_CATEGORY + }; private: + //draw background for TEXTURE_MEM_OVER_SIZE F32 drawTextureSizeDistributionGraph() ; - + //draw real-time texture mem bar over size + void drawTextureSizeGraph(); + + //draw background for TEXTURE_MEM_OVER_CATEGORY + F32 drawTextureCategoryDistributionGraph() ; + //draw real-time texture mem bar over category + void drawTextureCategoryGraph(); + private: std::vector<LLGLTexSizeBar*> mTextureSizeBar ; LLRect mTextureSizeBarRect ; - S32 mTextureSizeBarWidth ; + S32 mTextureSizeBarWidth ; + S32 mType ; }; extern LLTextureView *gTextureView; extern LLTextureSizeView *gTextureSizeView; +extern LLTextureSizeView *gTextureCategoryView; #endif // LL_TEXTURE_VIEW_H diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 841902f6833..a3daca6fa42 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -46,7 +46,7 @@ #include "llstartup.h" // gStartupState #include "llurlsimstring.h" #include "llweb.h" -#include "llworldmap.h" +#include "llworldmapmessage.h" // library includes #include "llsd.h" @@ -201,7 +201,7 @@ bool LLURLDispatcherImpl::dispatchRegion(const std::string& url, bool right_mous //if(url_displayp) url_displayp->setName(region_name); // Request a region handle by name - LLWorldMap::getInstance()->sendNamedRegionRequest(region_name, + LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name, LLURLDispatcherImpl::regionNameCallback, url, false); // don't teleport @@ -240,7 +240,7 @@ void LLURLDispatcherImpl::regionNameCallback(U64 region_handle, const std::strin LLVector3d global_pos = from_region_handle(region_handle) + LLVector3d(local_pos); U64 new_region_handle = to_region_handle(global_pos); - LLWorldMap::getInstance()->sendHandleRegionRequest(new_region_handle, + LLWorldMapMessage::getInstance()->sendHandleRegionRequest(new_region_handle, LLURLDispatcherImpl::regionHandleCallback, url, teleport); } @@ -335,7 +335,7 @@ class LLTeleportHandler : public LLCommandHandler { url += tokens[i].asString() + "/"; } - LLWorldMap::getInstance()->sendNamedRegionRequest(region_name, + LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name, LLURLDispatcherImpl::regionHandleCallback, url, true); // teleport diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index f65baea6ca0..b5709fa1021 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -109,10 +109,13 @@ LLViewerCamera::LLViewerCamera() : LLCamera() { calcProjection(getFar()); mCameraFOVDefault = DEFAULT_FIELD_OF_VIEW; + mCosHalfCameraFOV = cosf(mCameraFOVDefault * 0.5f); mPixelMeterRatio = 0.f; mScreenPixelArea = 0; mZoomFactor = 1.f; mZoomSubregion = 1; + mAverageSpeed = 0.f; + mAverageAngularSpeed = 0.f; gSavedSettings.getControl("CameraAngle")->getCommitSignal()->connect(boost::bind(&LLViewerCamera::updateCameraAngle, this, _2)); } @@ -151,15 +154,22 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, setOriginAndLookAt(origin, up_direction, point_of_interest); - F32 dpos = (center - last_position).magVec(); + mVelocityDir = center - last_position ; + F32 dpos = mVelocityDir.normVec() ; LLQuaternion rotation; rotation.shortestArc(last_axis, getAtAxis()); F32 x, y, z; F32 drot; rotation.getAngleAxis(&drot, &x, &y, &z); + mVelocityStat.addValue(dpos); mAngularVelocityStat.addValue(drot); + + mAverageSpeed = mVelocityStat.getMeanPerSec() ; + mAverageAngularSpeed = mAngularVelocityStat.getMeanPerSec() ; + mCosHalfCameraFOV = cosf(0.5f * getView() * llmax(1.0f, getAspect())); + // update pixel meter ratio using default fov, not modified one mPixelMeterRatio = getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5)); // update screen pixel area @@ -818,10 +828,12 @@ BOOL LLViewerCamera::areVertsVisible(LLViewerObject* volumep, BOOL all_verts) LLCamera::setView(vertical_fov_rads); // call base implementation } -void LLViewerCamera::setDefaultFOV(F32 vertical_fov_rads) { +void LLViewerCamera::setDefaultFOV(F32 vertical_fov_rads) +{ vertical_fov_rads = llclamp(vertical_fov_rads, getMinView(), getMaxView()); setView(vertical_fov_rads); mCameraFOVDefault = vertical_fov_rads; + mCosHalfCameraFOV = cosf(mCameraFOVDefault * 0.5f); } diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h index 90b77f771f3..2b8a0892bf6 100644 --- a/indra/newview/llviewercamera.h +++ b/indra/newview/llviewercamera.h @@ -91,17 +91,20 @@ class LLViewerCamera : public LLCamera, public LLSingleton<LLViewerCamera> BOOL projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoordGL &out_point, const BOOL clamp = TRUE) const; BOOL projectPosAgentToScreenEdge(const LLVector3 &pos_agent, LLCoordGL &out_point) const; - + const LLVector3* getVelocityDir() const {return &mVelocityDir;} LLStat *getVelocityStat() { return &mVelocityStat; } LLStat *getAngularVelocityStat() { return &mAngularVelocityStat; } + F32 getCosHalfFov() {return mCosHalfCameraFOV;} + F32 getAverageSpeed() {return mAverageSpeed ;} + F32 getAverageAngularSpeed() {return mAverageAngularSpeed;} void getPixelVectors(const LLVector3 &pos_agent, LLVector3 &up, LLVector3 &right); LLVector3 roundToPixel(const LLVector3 &pos_agent); // Sets the current matrix /* virtual */ void setView(F32 vertical_fov_rads); - // Sets the current matrix AND remembers result as default view - void setDefaultFOV(F32 vertical_fov_rads); + + void setDefaultFOV(F32 fov) ; F32 getDefaultFOV() { return mCameraFOVDefault; } BOOL cameraUnderWater() const; @@ -120,9 +123,14 @@ class LLViewerCamera : public LLCamera, public LLSingleton<LLViewerCamera> LLStat mVelocityStat; LLStat mAngularVelocityStat; + LLVector3 mVelocityDir ; + F32 mAverageSpeed ; + F32 mAverageAngularSpeed ; + mutable LLMatrix4 mProjectionMatrix; // Cache of perspective matrix mutable LLMatrix4 mModelviewMatrix; F32 mCameraFOVDefault; + F32 mCosHalfCameraFOV; LLVector3 mLastPointOfInterest; F32 mPixelMeterRatio; // Divide by distance from camera to get pixels per meter at that distance. S32 mScreenPixelArea; // Pixel area of entire window diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index b71291f834f..6d3bf277bba 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -90,7 +90,7 @@ std::string gCurrentVersion; extern BOOL gResizeScreenTexture; extern BOOL gDebugGL; - +extern BOOL gAuditTexture; //////////////////////////////////////////////////////////////////////////// // Listeners @@ -378,6 +378,12 @@ static bool handleRenderUseImpostorsChanged(const LLSD& newvalue) return true; } +static bool handleAuditTextureChanged(const LLSD& newvalue) +{ + gAuditTexture = newvalue.asBoolean(); + return true; +} + static bool handleRenderDebugGLChanged(const LLSD& newvalue) { gDebugGL = newvalue.asBoolean() || gDebugSession; @@ -566,6 +572,7 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderDeferredShadow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); gSavedSettings.getControl("RenderDeferredGI")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); gSavedSettings.getControl("TextureMemory")->getSignal()->connect(boost::bind(&handleVideoMemoryChanged, _2)); + gSavedSettings.getControl("AuditTexture")->getSignal()->connect(boost::bind(&handleAuditTextureChanged, _2)); gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&handleChatFontSizeChanged, _2)); gSavedSettings.getControl("ChatPersistTime")->getSignal()->connect(boost::bind(&handleChatPersistTimeChanged, _2)); gSavedSettings.getControl("ConsoleMaxLines")->getSignal()->connect(boost::bind(&handleConsoleMaxLinesChanged, _2)); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index a6a72e96661..e0bb8fedeb1 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -712,7 +712,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) gBumpImageList.updateImages(); // must be called before gTextureList version so that it's textures are thrown out first. - const F32 max_image_decode_time = llmin(0.005f, 0.005f*10.f*gFrameIntervalSeconds); // 50 ms/second decode time (no more than 5ms/frame) + F32 max_image_decode_time = 0.050f*gFrameIntervalSeconds; // 50 ms/second decode time + max_image_decode_time = llclamp(max_image_decode_time, 0.001f, 0.005f ); // min 1ms/frame, max 5ms/frame) gTextureList.updateImages(max_image_decode_time); //remove dead textures from GL diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index e4643a15b58..3374720a68c 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -606,6 +606,14 @@ class LLAdvancedToggleConsole : public view_listener_t { toggle_visibility( (void*)((LLView*)gDebugView->mDebugConsolep) ); } + else if (gTextureSizeView && "texture size" == console_type) + { + toggle_visibility( (void*)gTextureSizeView ); + } + else if (gTextureCategoryView && "texture category" == console_type) + { + toggle_visibility( (void*)gTextureCategoryView ); + } else if ("fast timers" == console_type) { toggle_visibility( (void*)gDebugView->mFastTimerView ); @@ -633,6 +641,14 @@ class LLAdvancedCheckConsole : public view_listener_t { new_value = get_visibility( (void*)((LLView*)gDebugView->mDebugConsolep) ); } + else if (gTextureSizeView && "texture size" == console_type) + { + new_value = get_visibility( (void*)gTextureSizeView ); + } + else if (gTextureCategoryView && "texture category" == console_type) + { + new_value = get_visibility( (void*)gTextureCategoryView ); + } else if ("fast timers" == console_type) { new_value = get_visibility( (void*)gDebugView->mFastTimerView ); @@ -1156,28 +1172,6 @@ class LLAdvancedCheckWireframe : public view_listener_t } }; -////////////////////// -// DISABLE TEXTURES // -////////////////////// - -class LLAdvancedToggleDisableTextures : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - LLViewerTexture::sDontLoadVolumeTextures = !LLViewerTexture::sDontLoadVolumeTextures; - return true; - } -}; - -class LLAdvancedCheckDisableTextures : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - bool new_value = LLViewerTexture::sDontLoadVolumeTextures; // <-- make this using LLCacheControl - return new_value; - } -}; - ////////////////////// // TEXTURE ATLAS // ////////////////////// @@ -1909,7 +1903,7 @@ class LLAdvancedRebakeTextures : public view_listener_t }; -#ifndef LL_RELEASE_FOR_DOWNLOAD +#if 1 //ndef LL_RELEASE_FOR_DOWNLOAD /////////////////////////// // DEBUG AVATAR TEXTURES // /////////////////////////// @@ -3511,9 +3505,8 @@ void set_god_level(U8 god_level) gIMMgr->refresh(); LLViewerParcelMgr::getInstance()->notifyObservers(); - // God mode changes sim visibility - LLWorldMap::getInstance()->reset(); - LLWorldMap::getInstance()->setCurrentLayer(0); + // God mode changes region visibility + LLWorldMap::getInstance()->reloadItems(true); // inventory in items may change in god mode gObjectList.dirtyAllObjectInventory(); @@ -7887,8 +7880,6 @@ void initialize_menus() view_listener_t::addMenu(new LLAdvancedSelectedTextureInfo(), "Advanced.SelectedTextureInfo"); view_listener_t::addMenu(new LLAdvancedToggleWireframe(), "Advanced.ToggleWireframe"); view_listener_t::addMenu(new LLAdvancedCheckWireframe(), "Advanced.CheckWireframe"); - view_listener_t::addMenu(new LLAdvancedToggleDisableTextures(), "Advanced.ToggleDisableTextures"); - view_listener_t::addMenu(new LLAdvancedCheckDisableTextures(), "Advanced.CheckDisableTextures"); view_listener_t::addMenu(new LLAdvancedToggleTextureAtlas(), "Advanced.ToggleTextureAtlas"); view_listener_t::addMenu(new LLAdvancedCheckTextureAtlas(), "Advanced.CheckTextureAtlas"); view_listener_t::addMenu(new LLAdvancedEnableObjectObjectOcclusion(), "Advanced.EnableObjectObjectOcclusion"); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 20cd516fa06..5de52367ef4 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2906,7 +2906,7 @@ F32 LLViewerObject::getMidScale() const } -void LLViewerObject::updateTextures(LLAgent &agent) +void LLViewerObject::updateTextures() { } diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index b8ae31118c1..01b213a87d1 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -199,7 +199,7 @@ class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate S32 getNumFaces() const { return mNumFaces; } // Graphical stuff for objects - maybe broken out into render class later? - virtual void updateTextures(LLAgent &agent); + virtual void updateTextures(); virtual void boostTexturePriority(BOOL boost_children = TRUE); // When you just want to boost priority of this object virtual LLDrawable* createDrawable(LLPipeline *pipeline); diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 2927ca52926..96828ee1b60 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -642,7 +642,7 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent) // Update distance & gpw objectp->setPixelAreaAndAngle(agent); // Also sets the approx. pixel area - objectp->updateTextures(agent); // Update the image levels of textures for this object. + objectp->updateTextures(); // Update the image levels of textures for this object. } } @@ -1074,6 +1074,7 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap) LLColor4 group_own_below_water_color = LLUIColorTable::instance().getColor( "NetMapGroupOwnBelowWater" ); + F32 max_radius = gSavedSettings.getF32("MiniMapPrimMaxRadius"); for (S32 i = 0; i < mMapObjects.count(); i++) { @@ -1089,6 +1090,11 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap) F32 approx_radius = (scale.mV[VX] + scale.mV[VY]) * 0.5f * 0.5f * 1.3f; // 1.3 is a fudge + // Limit the size of megaprims so they don't blot out everything on the minimap. + // Attempting to draw very large megaprims also causes client lag. + // See DEV-17370 and DEV-29869/SNOW-79 for details. + approx_radius = llmin(approx_radius, max_radius); + LLColor4U color = above_water_color; if( objectp->permYouOwner() ) { diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 7ea55b49e86..d1c9840a972 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1427,11 +1427,11 @@ void LLViewerRegion::setSeedCapability(const std::string& url) capabilityNames.append("EstateChangeInfo"); capabilityNames.append("EventQueueGet"); capabilityNames.append("FetchInventory"); - capabilityNames.append("WebFetchInventoryDescendents"); capabilityNames.append("ObjectMedia"); capabilityNames.append("ObjectMediaNavigate"); capabilityNames.append("FetchLib"); capabilityNames.append("FetchLibDescendents"); + capabilityNames.append("GetTexture"); capabilityNames.append("GroupProposalBallot"); capabilityNames.append("HomeLocation"); capabilityNames.append("MapLayer"); @@ -1452,6 +1452,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url) capabilityNames.append("SendUserReportWithScreenshot"); capabilityNames.append("ServerReleaseNotes"); capabilityNames.append("StartGroupProposal"); + capabilityNames.append("TextureStats"); capabilityNames.append("UntrustedSimulatorMessage"); capabilityNames.append("UpdateAgentInformation"); capabilityNames.append("UpdateAgentLanguage"); @@ -1464,6 +1465,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url) capabilityNames.append("UploadBakedTexture"); capabilityNames.append("ViewerStartAuction"); capabilityNames.append("ViewerStats"); + capabilityNames.append("WebFetchInventoryDescendents"); // Please add new capabilities alphabetically to reduce // merge conflicts. diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 6e07d8f2468..caa94dba381 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -560,12 +560,18 @@ extern U32 gVisCompared; extern U32 gVisTested; std::map<S32,LLFrameTimer> gDebugTimers; +std::map<S32,std::string> gDebugTimerLabel; + +void init_statistics() +{ + // Label debug timers + gDebugTimerLabel[0] = "Texture"; +} void update_statistics(U32 frame_count) { gTotalWorldBytes += gVLManager.getTotalBytes(); gTotalObjectBytes += gObjectBits / 8; - gTotalTextureBytes += gTextureList.mTextureBits / 8; // make sure we have a valid time delta for this frame if (gFrameIntervalSeconds > 0.f) @@ -617,7 +623,6 @@ void update_statistics(U32 frame_count) F32 layer_bits = (F32)(gVLManager.getLandBits() + gVLManager.getWindBits() + gVLManager.getCloudBits()); LLViewerStats::getInstance()->mLayersKBitStat.addValue(layer_bits/1024.f); LLViewerStats::getInstance()->mObjectKBitStat.addValue(gObjectBits/1024.f); - LLViewerStats::getInstance()->mTextureKBitStat.addValue(gTextureList.mTextureBits/1024.f); LLViewerStats::getInstance()->mVFSPendingOperations.addValue(LLVFile::getVFSThread()->getPending()); LLViewerStats::getInstance()->mAssetKBitStat.addValue(gTransferManager.getTransferBitsIn(LLTCT_ASSET)/1024.f); gTransferManager.resetTransferBitsIn(LLTCT_ASSET); @@ -631,8 +636,6 @@ void update_statistics(U32 frame_count) gDebugTimers[0].unpause(); } - LLViewerStats::getInstance()->mTexturePacketsStat.addValue(gTextureList.mTexturePackets); - { static F32 visible_avatar_frames = 0.f; static F32 avg_visible_avatars = 0; @@ -652,8 +655,20 @@ void update_statistics(U32 frame_count) gObjectBits = 0; // gDecodedBits = 0; - gTextureList.mTextureBits = 0; - gTextureList.mTexturePackets = 0; + // Only update texture stats ones per second so that they are less noisy + { + static const F32 texture_stats_freq = 1.f; + static LLFrameTimer texture_stats_timer; + if (texture_stats_timer.getElapsedTimeF32() >= texture_stats_freq) + { + LLViewerStats::getInstance()->mTextureKBitStat.addValue(LLViewerTextureList::sTextureBits/1024.f); + LLViewerStats::getInstance()->mTexturePacketsStat.addValue(LLViewerTextureList::sTexturePackets); + gTotalTextureBytes += LLViewerTextureList::sTextureBits / 8; + LLViewerTextureList::sTextureBits = 0; + LLViewerTextureList::sTexturePackets = 0; + texture_stats_timer.reset(); + } + } } @@ -826,3 +841,4 @@ void send_stats() LLViewerStats::getInstance()->addToMessage(body); LLHTTPClient::post(url, body, new ViewerStatsResponder()); } + diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index ba89fbf02a5..13d73000d24 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -34,6 +34,7 @@ #define LL_LLVIEWERSTATS_H #include "llstat.h" +#include "lltextureinfo.h" class LLViewerStats : public LLSingleton<LLViewerStats> { @@ -205,10 +206,13 @@ class LLViewerStats : public LLSingleton<LLViewerStats> static const F32 SEND_STATS_PERIOD = 300.0f; // The following are from (older?) statistics code found in appviewer. +void init_statistics(); void reset_statistics(); void output_statistics(void*); void update_statistics(U32 frame_count); void send_stats(); extern std::map<S32,LLFrameTimer> gDebugTimers; +extern std::map<S32,std::string> gDebugTimerLabel; + #endif // LL_LLVIEWERSTATS_H diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index a0ab4cb1e68..b2ca9edfea5 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -60,6 +60,8 @@ #include "llviewercontrol.h" #include "pipeline.h" #include "llappviewer.h" +#include "llface.h" +#include "llviewercamera.h" #include "lltextureatlas.h" #include "lltextureatlasmanager.h" #include "lltextureentry.h" @@ -88,7 +90,15 @@ S32 LLViewerTexture::sTotalTextureMemoryInBytes = 0; S32 LLViewerTexture::sMaxBoundTextureMemInMegaBytes = 0; S32 LLViewerTexture::sMaxTotalTextureMemInMegaBytes = 0; S32 LLViewerTexture::sMaxDesiredTextureMemInBytes = 0 ; -BOOL LLViewerTexture::sDontLoadVolumeTextures = FALSE; +S8 LLViewerTexture::sCameraMovingDiscardBias = 0 ; +S32 LLViewerTexture::sMaxSculptRez = 128 ; //max sculpt image size +const S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64 ; +const S32 MAX_CACHED_RAW_SCULPT_IMAGE_AREA = LLViewerTexture::sMaxSculptRez * LLViewerTexture::sMaxSculptRez ; +const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128 ; +S32 LLViewerTexture::sMinLargeImageSize = 65536 ; //256 * 256. +S32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA ; +BOOL LLViewerTexture::sFreezeImageScalingDown = FALSE ; +F32 LLViewerTexture::sCurrentTime = 0.0f ; BOOL LLViewerTexture::sUseTextureAtlas = FALSE ; const F32 desired_discard_bias_min = -2.0f; // -max number of levels to improve image quality by @@ -161,6 +171,7 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(BOOL usemipma if(generate_gl_tex) { tex->generateGLTexture() ; + tex->setCategory(LLViewerTexture::LOCAL) ; } return tex ; } @@ -170,12 +181,14 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const LLUUID& if(generate_gl_tex) { tex->generateGLTexture() ; + tex->setCategory(LLViewerTexture::LOCAL) ; } return tex ; } LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const LLImageRaw* raw, BOOL usemipmaps) { LLPointer<LLViewerTexture> tex = new LLViewerTexture(raw, usemipmaps) ; + tex->setCategory(LLViewerTexture::LOCAL) ; return tex ; } LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps, BOOL generate_gl_tex) @@ -184,6 +197,7 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid if(generate_gl_tex) { tex->generateGLTexture() ; + tex->setCategory(LLViewerTexture::LOCAL) ; } return tex ; } @@ -212,6 +226,19 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile( return gTextureList.getImageFromFile(filename, usemipmaps, level_immediate, texture_type, internal_format, primary_format, force_id) ; } +//static +LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string& url, + BOOL usemipmaps, + BOOL level_immediate, // Get the requested level immediately upon creation. + S8 texture_type, + LLGLint internal_format, + LLGLenum primary_format, + const LLUUID& force_id + ) +{ + return gTextureList.getImageFromUrl(url, usemipmaps, level_immediate, texture_type, internal_format, primary_format, force_id) ; +} + LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromHost(const LLUUID& image_id, LLHost host) { return gTextureList.getImageFromHost(image_id, host) ; @@ -253,11 +280,12 @@ void LLViewerTextureManager::init() } imagep->createGLTexture(0, image_raw); image_raw = NULL; - LLViewerFetchedTexture::sDefaultImagep->dontDiscard(); #else LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE); #endif - + LLViewerFetchedTexture::sDefaultImagep->dontDiscard(); + LLViewerFetchedTexture::sDefaultImagep->setCategory(LLViewerTexture::OTHER) ; + LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, TRUE, TRUE); LLViewerFetchedTexture::sSmokeImagep->setNoDelete() ; @@ -281,6 +309,8 @@ void LLViewerTextureManager::cleanup() LLViewerFetchedTexture::sWhiteImagep = NULL; LLViewerMediaTexture::cleanup() ; + + LLViewerTexture::cleanupClass() ; } //---------------------------------------------------------------------------------------------- @@ -291,6 +321,11 @@ void LLViewerTextureManager::cleanup() void LLViewerTexture::initClass() { LLImageGL::sDefaultGLTexture = LLViewerFetchedTexture::sDefaultImagep->getGLTexture() ; + + if(gAuditTexture) + { + LLImageGL::setHighlightTexture(LLViewerTexture::OTHER) ; + } } // static @@ -298,6 +333,25 @@ void LLViewerTexture::cleanupClass() { } +// static +S32 LLViewerTexture::getTotalNumOfCategories() +{ + return MAX_GL_IMAGE_CATEGORY - (BOOST_HIGH - BOOST_SCULPTED) + 2 ; +} + +// static +//index starts from zero. +S32 LLViewerTexture::getIndexFromCategory(S32 category) +{ + return (category < BOOST_HIGH) ? category : category - (BOOST_HIGH - BOOST_SCULPTED) + 1 ; +} + +//static +S32 LLViewerTexture::getCategoryFromIndex(S32 index) +{ + return (index < BOOST_HIGH) ? index : index + (BOOST_HIGH - BOOST_SCULPTED) - 1 ; +} + // tuning params const F32 discard_bias_delta = .05f; const F32 discard_delta_time = 0.5f; @@ -309,6 +363,8 @@ F32 texmem_middle_bound_scale = 0.925f; //static void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity) { + sCurrentTime = gFrameTimeSeconds ; + if(LLViewerTextureManager::sTesterp) { LLViewerTextureManager::sTesterp->update() ; @@ -349,6 +405,13 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity } sDesiredDiscardBias = llclamp(sDesiredDiscardBias, desired_discard_bias_min, desired_discard_bias_max); LLViewerTexture::sUseTextureAtlas = gSavedSettings.getBOOL("EnableTextureAtlas") ; + + F32 camera_moving_speed = LLViewerCamera::getInstance()->getAverageSpeed() ; + F32 camera_angular_speed = LLViewerCamera::getInstance()->getAverageAngularSpeed(); + sCameraMovingDiscardBias = (S8)llmax(0.2f * camera_moving_speed, 2.0f * camera_angular_speed - 1) ; + + LLViewerTexture::sFreezeImageScalingDown = (BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) < 0.75f * sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale) && + (BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) < 0.75f * sMaxTotalTextureMemInMegaBytes * texmem_middle_bound_scale) ; } //end of static functions @@ -414,7 +477,9 @@ void LLViewerTexture::init(bool firstinit) mTextureState = NO_DELETE ; mDontDiscard = FALSE; mMaxVirtualSize = 0.f; + mNeedsGLTexture = FALSE ; mNeedsResetMaxVirtualSize = FALSE ; + mAdditionalDecodePriority = 0.f ; } //virtual @@ -455,11 +520,15 @@ void LLViewerTexture::setBoostLevel(S32 level) { setNoDelete() ; } + if(gAuditTexture) + { + setCategory(mBoostLevel); + } } } -bool LLViewerTexture::bindDefaultImage(S32 stage) const +bool LLViewerTexture::bindDefaultImage(S32 stage) { if (stage < 0) return false; @@ -478,6 +547,10 @@ bool LLViewerTexture::bindDefaultImage(S32 stage) const llwarns << "LLViewerTexture::bindDefaultImage failed." << llendl; } stop_glerror(); + + //check if there is cached raw image and switch to it if possible + switchToCachedImage() ; + if(LLViewerTextureManager::sTesterp) { LLViewerTextureManager::sTesterp->updateGrayTextureBinding() ; @@ -496,24 +569,32 @@ void LLViewerTexture::forceImmediateUpdate() { } -void LLViewerTexture::addTextureStats(F32 virtual_size) const +void LLViewerTexture::addTextureStats(F32 virtual_size, BOOL needs_gltexture) const { - if (virtual_size > mMaxVirtualSize) + if(needs_gltexture) { - mMaxVirtualSize = virtual_size; + mNeedsGLTexture = TRUE ; } -} -void LLViewerTexture::resetTextureStats(BOOL zero) -{ - if (zero) + if(mNeedsResetMaxVirtualSize) { - mMaxVirtualSize = 0.0f; + //flag to reset the values because the old values are used. + mNeedsResetMaxVirtualSize = FALSE ; + mMaxVirtualSize = virtual_size; + mAdditionalDecodePriority = 0.f ; + mNeedsGLTexture = needs_gltexture ; } - else + else if (virtual_size > mMaxVirtualSize) { - mMaxVirtualSize -= mMaxVirtualSize * .10f; // decay by 5%/update - } + mMaxVirtualSize = virtual_size; + } +} + +void LLViewerTexture::resetTextureStats() +{ + mMaxVirtualSize = 0.0f; + mAdditionalDecodePriority = 0.f ; + mNeedsResetMaxVirtualSize = FALSE ; } //virtual @@ -534,6 +615,12 @@ void LLViewerTexture::removeFace(LLFace* facep) mFaceList.remove(facep) ; } +//virtual +void LLViewerTexture::switchToCachedImage() +{ + //nothing here. +} + void LLViewerTexture::forceActive() { mTextureState = ACTIVE ; @@ -578,11 +665,11 @@ BOOL LLViewerTexture::createGLTexture() return mGLTexturep->createGLTexture() ; } -BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename) +BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename, BOOL to_create, S32 category) { llassert_always(mGLTexturep.notNull()) ; - BOOL ret = mGLTexturep->createGLTexture(discard_level, imageraw, usename) ; + BOOL ret = mGLTexturep->createGLTexture(discard_level, imageraw, usename, to_create, category) ; if(ret) { @@ -694,6 +781,13 @@ void LLViewerTexture::setGLTextureCreated (bool initialized) mGLTexturep->setGLTextureCreated (initialized) ; } +void LLViewerTexture::setCategory(S32 category) +{ + llassert_always(mGLTexturep.notNull()) ; + + mGLTexturep->setCategory(category) ; +} + LLTexUnit::eTextureAddressMode LLViewerTexture::getAddressMode(void) const { llassert_always(mGLTexturep.notNull()) ; @@ -742,18 +836,18 @@ BOOL LLViewerTexture::getMissed() const return mGLTexturep->getMissed() ; } -BOOL LLViewerTexture::isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents) +BOOL LLViewerTexture::isJustBound() const { llassert_always(mGLTexturep.notNull()) ; - return mGLTexturep->isValidForSculpt(discard_level, image_width, image_height, ncomponents) ; + return mGLTexturep->isJustBound() ; } -BOOL LLViewerTexture::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok) const +void LLViewerTexture::forceUpdateBindStats(void) const { llassert_always(mGLTexturep.notNull()) ; - return mGLTexturep->readBackRaw(discard_level, imageraw, compressed_ok) ; + return mGLTexturep->forceUpdateBindStats() ; } U32 LLViewerTexture::getTexelsInAtlas() const @@ -793,6 +887,11 @@ void LLViewerTexture::destroyGLTexture() } } +BOOL LLViewerTexture::isLargeImage() +{ + return mFullWidth * mFullHeight > LLViewerTexture::sMinLargeImageSize ; +} + //virtual void LLViewerTexture::updateBindStatsForTester() { @@ -813,11 +912,12 @@ void LLViewerTexture::updateBindStatsForTester() //static F32 LLViewerFetchedTexture::maxDecodePriority() { - return 2000000.f; + return 6000000.f; } -LLViewerFetchedTexture::LLViewerFetchedTexture(const LLUUID& id, BOOL usemipmaps) - : LLViewerTexture(id, usemipmaps) +LLViewerFetchedTexture::LLViewerFetchedTexture(const LLUUID& id, const LLHost& host, BOOL usemipmaps) + : LLViewerTexture(id, usemipmaps), + mTargetHost(host) { init(TRUE) ; generateGLTexture() ; @@ -829,9 +929,9 @@ LLViewerFetchedTexture::LLViewerFetchedTexture(const LLImageRaw* raw, BOOL usemi init(TRUE) ; } -LLViewerFetchedTexture::LLViewerFetchedTexture(const std::string& full_path, const LLUUID& id, BOOL usemipmaps) +LLViewerFetchedTexture::LLViewerFetchedTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps) : LLViewerTexture(id, usemipmaps), - mLocalFileName(full_path) + mUrl(url) { init(TRUE) ; generateGLTexture() ; @@ -879,6 +979,16 @@ void LLViewerFetchedTexture::init(bool firstinit) mVisibleFrame = 0; mForSculpt = FALSE ; mIsFetched = FALSE ; + + mCachedRawImage = NULL ; + mCachedRawDiscardLevel = -1 ; + mCachedRawImageReady = FALSE ; + + mSavedRawImage = NULL ; + mForceToSaveRawImage = FALSE ; + mSavedRawDiscardLevel = -1 ; + mDesiredSavedRawDiscardLevel = -1 ; + mLastReferencedSavedRawImageTime = 0.0f ; } LLViewerFetchedTexture::~LLViewerFetchedTexture() @@ -915,11 +1025,25 @@ void LLViewerFetchedTexture::cleanup() // Clean up image data destroyRawImage(); + mCachedRawImage = NULL ; + mCachedRawDiscardLevel = -1 ; + mCachedRawImageReady = FALSE ; + mSavedRawImage = NULL ; } void LLViewerFetchedTexture::setForSculpt() { mForSculpt = TRUE ; + if(isForSculptOnly() && !getBoundRecently()) + { + destroyGLTexture() ; //sculpt image does not need gl texture. + } + checkCachedRawSculptImage() ; +} + +BOOL LLViewerFetchedTexture::isForSculptOnly() const +{ + return mForSculpt && !mNeedsGLTexture ; } BOOL LLViewerFetchedTexture::isDeleted() @@ -954,17 +1078,37 @@ void LLViewerFetchedTexture::setInactive() } } +BOOL LLViewerFetchedTexture::isFullyLoaded() const +{ + // Unfortunately, the boolean "mFullyLoaded" is never updated correctly so we use that logic + // to check if the texture is there and completely downloaded + return (mFullWidth != 0) && (mFullHeight != 0) && !mIsFetching && !mHasFetcher; +} + + // virtual void LLViewerFetchedTexture::dump() { LLViewerTexture::dump(); - llinfos << "LLViewerFetchedTexture" - << " mIsMissingAsset " << (S32)mIsMissingAsset - << " mFullWidth " << mFullWidth - << " mFullHeight " << mFullHeight - << " mOrigWidth" << mOrigWidth - << " mOrigHeight" << mOrigHeight + llinfos << "Dump : " << mID + << ", mIsMissingAsset = " << (S32)mIsMissingAsset + << ", mFullWidth = " << (S32)mFullWidth + << ", mFullHeight = " << (S32)mFullHeight + << ", mOrigWidth = " << (S32)mOrigWidth + << ", mOrigHeight = " << (S32)mOrigHeight + << llendl; + llinfos << " : " + << " mFullyLoaded = " << (S32)mFullyLoaded + << ", mFetchState = " << (S32)mFetchState + << ", mFetchPriority = " << (S32)mFetchPriority + << ", mDownloadProgress = " << (F32)mDownloadProgress + << llendl; + llinfos << " : " + << " mHasFetcher = " << (S32)mHasFetcher + << ", mIsFetching = " << (S32)mIsFetching + << ", mIsFetched = " << (S32)mIsFetched + << ", mBoostLevel = " << (S32)mBoostLevel << llendl; } @@ -985,6 +1129,75 @@ void LLViewerFetchedTexture::destroyTexture() mFullyLoaded = FALSE ; } +// +//do not change the discard level of the loaded texture image. +BOOL LLViewerFetchedTexture::keepReuestedDiscardLevel() +{ + if (!mLoadedCallbackList.empty()) + { + return TRUE ; + } + + return FALSE ; +} + +void LLViewerFetchedTexture::addToCreateTexture() +{ + if(isForSculptOnly()) + { + //just update some variables, not to create a real GL texture. + createGLTexture(mRawDiscardLevel, mRawImage, 0, FALSE) ; + mNeedsCreateTexture = FALSE ; + destroyRawImage(); + } + else + { +#if 1 + // + //if mRequestedDiscardLevel > mDesiredDiscardLevel, we assume the required image res keep going up, + //so do not scale down the over qualified image. + //Note: scaling down image is expensensive. Do it only when very necessary. + // + if(mRequestedDiscardLevel <= mDesiredDiscardLevel && !keepReuestedDiscardLevel()) + { + S32 w = mFullWidth >> mRawDiscardLevel; + S32 h = mFullHeight >> mRawDiscardLevel; + + //if big image, do not load extra data + //scale it down to size >= LLViewerTexture::sMinLargeImageSize + if(w * h > LLViewerTexture::sMinLargeImageSize) + { + S32 d_level = llmin(mRequestedDiscardLevel, (S32)mDesiredDiscardLevel) - mRawDiscardLevel ; + + if(d_level > 0) + { + S32 i = 0 ; + while((d_level > 0) && ((w >> i) * (h >> i) > LLViewerTexture::sMinLargeImageSize)) + { + i++; + d_level--; + } + if(i > 0) + { + mRawDiscardLevel += i ; + if(mRawDiscardLevel >= getDiscardLevel() && getDiscardLevel() > 0) + { + mNeedsCreateTexture = FALSE ; + destroyRawImage(); + return ; + } + mRawImage->scale(w >> i, h >> i) ; + } + } + } + } +#endif + mNeedsCreateTexture = TRUE; + gTextureList.mCreateTextureList.insert(this); + } + return ; +} + // ONLY called from LLViewerTextureList BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) { @@ -1006,7 +1219,7 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) if (!gNoRender) { // store original size only for locally-sourced images - if (!mLocalFileName.empty()) + if (mUrl.compare(0, 7, "file://") == 0) { mOrigWidth = mRawImage->getWidth(); mOrigHeight = mRawImage->getHeight(); @@ -1052,7 +1265,7 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) if(!(res = insertToAtlas())) { - res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename); + res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); resetFaceAtlas() ; } setActive() ; @@ -1099,7 +1312,15 @@ void LLViewerFetchedTexture::processTextureStats() return ; } - if(!mFullWidth || !mFullHeight) + updateVirtualSize() ; + + static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes"); + + if (textures_fullres) + { + mDesiredDiscardLevel = 0; + } + else if(!mFullWidth || !mFullHeight) { mDesiredDiscardLevel = getMaxDiscardLevel() ; } @@ -1148,8 +1369,11 @@ F32 LLViewerFetchedTexture::calcDecodePriority() { return mDecodePriority; // no change while waiting to create } - - F32 priority; + if(mForceToSaveRawImage) + { + return maxDecodePriority() ; + } + S32 cur_discard = getDiscardLevel(); bool have_all_data = (cur_discard >= 0 && (cur_discard <= mDesiredDiscardLevel)); F32 pixel_priority = fsqrtf(mMaxVirtualSize); @@ -1159,11 +1383,24 @@ F32 LLViewerFetchedTexture::calcDecodePriority() { mVisibleFrame = mDecodeFrame; } - + + F32 priority; if (mIsMissingAsset) { priority = 0.0f; } + else if(mDesiredDiscardLevel >= cur_discard && cur_discard > -1) + { + priority = -1.0f ; + } + else if (!isJustBound() && mCachedRawImageReady && !mBoostLevel) + { + priority = -1.0f; + } + else if(mCachedRawDiscardLevel > -1 && mDesiredDiscardLevel >= mCachedRawDiscardLevel) + { + priority = -1.0f; + } else if (mDesiredDiscardLevel > getMaxDiscardLevel()) { // Don't decode anything we don't need @@ -1213,7 +1450,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority() { ddiscard+=2; } - else if (mGLTexturep.notNull() && !mGLTexturep->getBoundRecently() && mBoostLevel == 0) + else if (ddiscard > 2 && mGLTexturep.notNull() && !mGLTexturep->getBoundRecently() && mBoostLevel == 0) { ddiscard-=2; } @@ -1222,7 +1459,10 @@ F32 LLViewerFetchedTexture::calcDecodePriority() } if (priority > 0.0f) { - pixel_priority = llclamp(pixel_priority, 0.0f, priority-1.f); // priority range = 100000-900000 + // priority range = 100000-900000 + pixel_priority = llclamp(pixel_priority, 0.0f, priority-1.f); + + // priority range = [100000.f, 2000000.f] if ( mBoostLevel > BOOST_HIGH) { priority = 1000000.f + pixel_priority + 1000.f * mBoostLevel; @@ -1231,6 +1471,12 @@ F32 LLViewerFetchedTexture::calcDecodePriority() { priority += 0.f + pixel_priority + 1000.f * mBoostLevel; } + + // priority range = [2100000.f, 5000000.f] if mAdditionalDecodePriority > 1.0 + if(mAdditionalDecodePriority > 1.0f) + { + priority += 2000000.f + mAdditionalDecodePriority ; + } } return priority; } @@ -1242,6 +1488,40 @@ void LLViewerFetchedTexture::setDecodePriority(F32 priority) mDecodePriority = priority; } +F32 LLViewerFetchedTexture::maxAdditionalDecodePriority() +{ + return 2000000.f; +} +void LLViewerFetchedTexture::setAdditionalDecodePriority(F32 priority) +{ + priority *= maxAdditionalDecodePriority(); + if(mAdditionalDecodePriority < priority) + { + mAdditionalDecodePriority = priority; + } +} + +void LLViewerFetchedTexture::updateVirtualSize() +{ + if(mNeedsResetMaxVirtualSize) + { + addTextureStats(0.f, FALSE) ;//reset + } + if(mFaceList.size() > 0) + { + for(std::list<LLFace*>::iterator iter = mFaceList.begin(); iter != mFaceList.end(); ++iter) + { + LLFace* facep = *iter ; + if(facep->getDrawable()->isRecentlyVisible()) + { + addTextureStats(facep->getVirtualSize()) ; + setAdditionalDecodePriority(facep->getImportanceToCamera()) ; + } + } + } + mNeedsResetMaxVirtualSize = TRUE ; +} + bool LLViewerFetchedTexture::updateFetch() { mFetchState = 0; @@ -1281,6 +1561,15 @@ bool LLViewerFetchedTexture::updateFetch() { // Sets mRawDiscardLevel, mRawImage, mAuxRawImage S32 fetch_discard = current_discard; + + if(mForceToSaveRawImage) + { + if(fetch_discard >= 0) + { + fetch_discard = llmax(fetch_discard, mSavedRawDiscardLevel) ; + } + } + if (mRawImage.notNull()) sRawCount--; if (mAuxRawImage.notNull()) sAuxCount--; bool finished = LLAppViewer::getTextureFetch()->getRequestFinished(getID(), fetch_discard, mRawImage, mAuxRawImage); @@ -1320,11 +1609,24 @@ bool LLViewerFetchedTexture::updateFetch() (*iter)->dirtyTexture() ; } } - mIsRawImageValid = TRUE; - gTextureList.mCreateTextureList.insert(this); - mNeedsCreateTexture = TRUE; mFullWidth = mRawImage->getWidth() << mRawDiscardLevel; mFullHeight = mRawImage->getHeight() << mRawDiscardLevel; + + if(mFullWidth > MAX_IMAGE_SIZE || mFullHeight > MAX_IMAGE_SIZE) + { + //discard all oversized textures. + destroyRawImage(); + setIsMissingAsset(); + mRawDiscardLevel = INVALID_DISCARD_LEVEL ; + mIsFetching = FALSE ; + } + else + { + mIsRawImageValid = TRUE; + addToCreateTexture() ; + } + + return TRUE ; } else { @@ -1347,13 +1649,13 @@ bool LLViewerFetchedTexture::updateFetch() } else { - llwarns << mID << ": Setting min discard to " << current_discard << llendl; + //llwarns << mID << ": Setting min discard to " << current_discard << llendl; mMinDiscardLevel = current_discard; desired_discard = current_discard; } destroyRawImage(); } - else if (mRawImage.isNull()) + else if (mRawImage.notNull()) { // We have data, but our fetch failed to return raw data // *TODO: FIgure out why this is happening and fix it @@ -1362,12 +1664,29 @@ bool LLViewerFetchedTexture::updateFetch() } else { +// // Useful debugging code for undesired deprioritization of textures. +// if (decode_priority <= 0.0f && desired_discard >= 0 && desired_discard < current_discard) +// { +// llinfos << "Calling updateRequestPriority() with decode_priority = 0.0f" << llendl; +// calcDecodePriority(); +// } LLAppViewer::getTextureFetch()->updateRequestPriority(mID, decode_priority); } } - bool make_request = true; - + if (!mDontDiscard) + { + if (mBoostLevel == 0) + { + desired_discard = llmax(desired_discard, current_discard-1); + } + else + { + desired_discard = llmax(desired_discard, current_discard-2); + } + } + + bool make_request = true; if (decode_priority <= 0) { make_request = false; @@ -1380,6 +1699,10 @@ bool LLViewerFetchedTexture::updateFetch() { make_request = false; } + else if (!isJustBound() && mCachedRawImageReady) + { + make_request = false; + } else { if (mIsFetching) @@ -1407,33 +1730,12 @@ bool LLViewerFetchedTexture::updateFetch() h = mGLTexturep->getHeight(0); c = mComponents; } - if (!mDontDiscard) - { - if (mBoostLevel == 0) - { - desired_discard = llmax(desired_discard, current_discard-1); - } - else - { - desired_discard = llmax(desired_discard, current_discard-2); - } - } - + // bypass texturefetch directly by pulling from LLTextureCache bool fetch_request_created = false; - if (mLocalFileName.empty()) - { - fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(getID(), getTargetHost(), decode_priority, - w, h, c, desired_discard, - needsAux()); - } - else - { - fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mLocalFileName, getID(),getTargetHost(), decode_priority, - w, h, c, desired_discard, - needsAux()); - } - + fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), decode_priority, + w, h, c, desired_discard, needsAux()); + if (fetch_request_created) { mHasFetcher = TRUE; @@ -1463,9 +1765,82 @@ bool LLViewerFetchedTexture::updateFetch() return mIsFetching ? true : false; } +// +//force to fetch a new raw image for this texture +// +BOOL LLViewerFetchedTexture::forceFetch() +{ + if(!mForceToSaveRawImage) + { + return false ; + } + if(mDesiredSavedRawDiscardLevel < getDiscardLevel()) + { + //no need to force fetching. normal fetching flow will do the work. + //return false ; + } + if (mNeedsCreateTexture) + { + // We may be fetching still (e.g. waiting on write) + // but don't check until we've processed the raw data we have + //return false; + } + if(mIsFetching) + { + return false ; + } + if (mIsMissingAsset) + { + mForceToSaveRawImage = false ; + llassert_always(!mHasFetcher); + return false; // skip + } + if (!mLoadedCallbackList.empty() && mRawImage.notNull()) + { + return false; // process any raw image data in callbacks before replacing + } + if(mRawImage.notNull() && mRawDiscardLevel <= mDesiredSavedRawDiscardLevel) + { + return false ; // mRawImage is enough + } + + S32 desired_discard = mDesiredSavedRawDiscardLevel ; + S32 current_discard = getDiscardLevel(); + + bool fetch_request_created = false; + S32 w=0, h=0, c=0; + if (current_discard >= 0) + { + w = getWidth(0); + h = getHeight(0); + c = getComponents(); + } + fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), maxDecodePriority(), + w, h, c, desired_discard, needsAux()); + + if (fetch_request_created) + { + mHasFetcher = TRUE; + mIsFetching = TRUE; + mRequestedDiscardLevel = desired_discard ; + + mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, + mFetchPriority, mFetchDeltaTime, mRequestDeltaTime); + } + + return mIsFetching ? true : false; +} + void LLViewerFetchedTexture::setIsMissingAsset() { - llwarns << mLocalFileName << " " << mID << ": Marking image as missing" << llendl; + if (mUrl.empty()) + { + llwarns << mID << ": Marking image as missing" << llendl; + } + else + { + llwarns << mUrl << ": Marking image as missing" << llendl; + } if (mHasFetcher) { LLAppViewer::getTextureFetch()->deleteRequest(getID(), true); @@ -1487,7 +1862,13 @@ void LLViewerFetchedTexture::setLoadedCallback( loaded_callback_func loaded_call { // Put in list to call this->doLoadedCallbacks() periodically gTextureList.mCallbackList.insert(this); + mLoadedCallbackDesiredDiscardLevel = (S8)discard_level; } + else + { + mLoadedCallbackDesiredDiscardLevel = llmin(mLoadedCallbackDesiredDiscardLevel, (S8)discard_level) ; + } + LLLoadedCallbackEntry* entryp = new LLLoadedCallbackEntry(loaded_callback, discard_level, keep_imageraw, userdata); mLoadedCallbackList.push_back(entryp); mNeedsAux |= needs_aux; @@ -1616,7 +1997,7 @@ bool LLViewerFetchedTexture::doLoadedCallbacks() // We have GL data. destroyRawImage(); - readBackRawImage(gl_discard); + reloadRawImage(mLoadedCallbackDesiredDiscardLevel); llassert_always(mRawImage.notNull()); llassert_always(!mNeedsAux || mAuxRawImage.notNull()); } @@ -1725,8 +2106,7 @@ void LLViewerFetchedTexture::forceImmediateUpdate() return ; } -// Was in LLImageGL -LLImageRaw* LLViewerFetchedTexture::readBackRawImage(S8 discard_level) +LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level) { llassert_always(mGLTexturep.notNull()) ; llassert_always(discard_level >= 0); @@ -1736,25 +2116,216 @@ LLImageRaw* LLViewerFetchedTexture::readBackRawImage(S8 discard_level) llerrs << "called with existing mRawImage" << llendl; mRawImage = NULL; } - mRawImage = new LLImageRaw(mGLTexturep->getWidth(discard_level), mGLTexturep->getHeight(discard_level), mComponents); - sRawCount++; - mRawDiscardLevel = discard_level; - mGLTexturep->readBackRaw(mRawDiscardLevel, mRawImage, false); - mIsRawImageValid = TRUE; + + if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level) + { + mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ; + mRawImage->copy(getSavedRawImage()) ; + mRawDiscardLevel = discard_level ; + } + else + { + //force to fetch raw image again if cached raw image is not good enough. + if(mCachedRawDiscardLevel > discard_level) + { + mRawImage = mCachedRawImage ; + mRawDiscardLevel = mCachedRawDiscardLevel; + + forceToSaveRawImage(discard_level) ; + } + else //cached raw image is good enough, copy it. + { + mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ; + mRawImage->copy(mCachedRawImage) ; + mRawDiscardLevel = discard_level ; + } + } + mIsRawImageValid = TRUE ; + sRawCount++; return mRawImage; } void LLViewerFetchedTexture::destroyRawImage() -{ - if (mRawImage.notNull()) sRawCount--; +{ if (mAuxRawImage.notNull()) sAuxCount--; + + if (mRawImage.notNull()) + { + sRawCount--; + setCachedRawImage() ; + + if(mForceToSaveRawImage) + { + saveRawImage() ; + } + } + mRawImage = NULL; mAuxRawImage = NULL; mIsRawImageValid = FALSE; mRawDiscardLevel = INVALID_DISCARD_LEVEL; + + if(mForceToSaveRawImage) + { + forceFetch() ; + } +} + +//use the mCachedRawImage to (re)generate the gl texture. +//virtual +void LLViewerFetchedTexture::switchToCachedImage() +{ + if(mCachedRawImage.notNull()) + { + mRawImage = mCachedRawImage ; + + if (getComponents() != mRawImage->getComponents()) + { + // We've changed the number of components, so we need to move any + // objects using this pool to a different pool. + mComponents = mRawImage->getComponents(); + mGLTexturep->setComponents(mComponents) ; + gTextureList.dirtyImage(this); + } + + mIsRawImageValid = TRUE; + mRawDiscardLevel = mCachedRawDiscardLevel ; + gTextureList.mCreateTextureList.insert(this); + mNeedsCreateTexture = TRUE; + } } +void LLViewerFetchedTexture::setCachedRawImage() +{ + if(mRawImage == mCachedRawImage) + { + return ; + } + if(!mIsRawImageValid) + { + return ; + } + + if(mCachedRawImageReady) + { + return ; + } + + if(mCachedRawDiscardLevel < 0 || mCachedRawDiscardLevel > mRawDiscardLevel) + { + S32 i = 0 ; + S32 w = mRawImage->getWidth() ; + S32 h = mRawImage->getHeight() ; + + S32 max_size = MAX_CACHED_RAW_IMAGE_AREA ; + if(LLViewerTexture::BOOST_TERRAIN == mBoostLevel) + { + max_size = MAX_CACHED_RAW_TERRAIN_IMAGE_AREA ; + } + if(mForSculpt) + { + max_size = MAX_CACHED_RAW_SCULPT_IMAGE_AREA ; + mCachedRawImageReady = !mRawDiscardLevel ; + } + else + { + mCachedRawImageReady = (!mRawDiscardLevel || ((w * h) >= max_size)) ; + } + + while(((w >> i) * (h >> i)) > max_size) + { + ++i ; + } + + if(i) + { + if(!(w >> i) || !(h >> i)) + { + --i ; + } + //if(mForSculpt) + //{ + // mRawImage->scaleDownWithoutBlending(w >> i, h >> i) ; + //} + //else + { + mRawImage->scale(w >> i, h >> i) ; + } + } + mCachedRawImage = mRawImage ; + mCachedRawDiscardLevel = mRawDiscardLevel + i ; + } +} + +void LLViewerFetchedTexture::checkCachedRawSculptImage() +{ + if(mCachedRawImageReady && mCachedRawDiscardLevel > 0) + { + if(getDiscardLevel() != 0) + { + mCachedRawImageReady = FALSE ; + } + else if(isForSculptOnly()) + { + resetTextureStats() ; //do not update this image any more. + } + } +} + +void LLViewerFetchedTexture::saveRawImage() +{ + if(mRawImage.isNull() || mSavedRawDiscardLevel == mRawDiscardLevel) + { + return ; + } + + mSavedRawDiscardLevel = mRawDiscardLevel ; + mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents()) ; + + if(mSavedRawDiscardLevel <= mDesiredSavedRawDiscardLevel) + { + mForceToSaveRawImage = FALSE ; + } + + mLastReferencedSavedRawImageTime = sCurrentTime ; +} + +void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard) +{ + if(!mForceToSaveRawImage && (mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard)) + { + mForceToSaveRawImage = TRUE ; + mDesiredSavedRawDiscardLevel = desired_discard ; + + forceFetch() ; + } +} +void LLViewerFetchedTexture::destroySavedRawImage() +{ + mSavedRawImage = NULL ; + mForceToSaveRawImage = FALSE ; + mSavedRawDiscardLevel = -1 ; + mDesiredSavedRawDiscardLevel = -1 ; + mLastReferencedSavedRawImageTime = 0.0f ; +} + +LLImageRaw* LLViewerFetchedTexture::getSavedRawImage() +{ + mLastReferencedSavedRawImageTime = sCurrentTime ; + + return mSavedRawImage ; +} + +BOOL LLViewerFetchedTexture::hasSavedRawImage() const +{ + return mSavedRawImage.notNull() ; +} + +F32 LLViewerFetchedTexture::getElapsedLastReferencedSavedRawImageTime() const +{ + return mLastReferencedSavedRawImageTime - sCurrentTime ; +} //---------------------------------------------------------------------------------------------- //atlasing //---------------------------------------------------------------------------------------------- @@ -1952,14 +2523,14 @@ BOOL LLViewerFetchedTexture::insertToAtlas() //---------------------------------------------------------------------------------------------- //start of LLViewerLODTexture //---------------------------------------------------------------------------------------------- -LLViewerLODTexture::LLViewerLODTexture(const LLUUID& id, BOOL usemipmaps) - : LLViewerFetchedTexture(id, usemipmaps) +LLViewerLODTexture::LLViewerLODTexture(const LLUUID& id, const LLHost& host, BOOL usemipmaps) + : LLViewerFetchedTexture(id, host, usemipmaps) { init(TRUE) ; } -LLViewerLODTexture::LLViewerLODTexture(const std::string& full_path, const LLUUID& id, BOOL usemipmaps) - : LLViewerFetchedTexture(full_path, id, usemipmaps) +LLViewerLODTexture::LLViewerLODTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps) + : LLViewerFetchedTexture(url, id, usemipmaps) { init(TRUE) ; } @@ -1977,12 +2548,25 @@ S8 LLViewerLODTexture::getType() const return LLViewerTexture::LOD_TEXTURE ; } +BOOL LLViewerLODTexture::isUpdateFrozen() +{ + return LLViewerTexture::sFreezeImageScalingDown && !getDiscardLevel() ; +} + // This is gauranteed to get called periodically for every texture //virtual void LLViewerLODTexture::processTextureStats() { + updateVirtualSize() ; + + static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes"); + + if (textures_fullres) + { + mDesiredDiscardLevel = 0; + } // Generate the request priority and render priority - if (mDontDiscard || !mUseMipMaps) + else if (mDontDiscard || !mUseMipMaps) { mDesiredDiscardLevel = 0; if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) @@ -2011,13 +2595,7 @@ void LLViewerLODTexture::processTextureStats() // If we know the output width and height, we can force the discard // level to the correct value, and thus not decode more texture // data than we need to. - /*if (mBoostLevel == LLViewerTexture::BOOST_UI || - mBoostLevel == LLViewerTexture::BOOST_PREVIEW || - mBoostLevel == LLViewerTexture::BOOST_AVATAR_SELF) // what about AVATAR_BAKED_SELF? - { - discard_level = 0; // full res - } - else*/ if (mKnownDrawWidth && mKnownDrawHeight) + if (mKnownDrawWidth && mKnownDrawHeight) { S32 draw_texels = mKnownDrawWidth * mKnownDrawHeight; @@ -2028,6 +2606,12 @@ void LLViewerLODTexture::processTextureStats() } else { + if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 1.0f) + { + //if is a big image and not being used recently, nor close to the view point, do not load hi-res data. + mMaxVirtualSize = llmin(mMaxVirtualSize, (F32)LLViewerTexture::sMinLargeImageSize) ; + } + if ((mCalculatedDiscardLevel >= 0.f) && (llabs(mMaxVirtualSize - mDiscardVirtualSize) < mMaxVirtualSize*.20f)) { @@ -2044,13 +2628,11 @@ void LLViewerLODTexture::processTextureStats() } if (mBoostLevel < LLViewerTexture::BOOST_HIGH) { - static const F32 discard_bias = -.5f; // Must be < 1 or highest discard will never load! - discard_level += discard_bias; discard_level += sDesiredDiscardBias; discard_level *= sDesiredDiscardScale; // scale + discard_level += sCameraMovingDiscardBias ; } discard_level = floorf(discard_level); -// discard_level -= (gTextureList.mVideoMemorySetting>>1); // more video ram = higher detail F32 min_discard = 0.f; if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) @@ -2069,46 +2651,39 @@ void LLViewerLODTexture::processTextureStats() // proper action if we don't. // - BOOL increase_discard = FALSE; S32 current_discard = getDiscardLevel(); if ((sDesiredDiscardBias > 0.0f) && (current_discard >= 0 && mDesiredDiscardLevel >= current_discard)) { - if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale) + // Limit the amount of GL memory bound each frame + if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale && + (!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel)) { - // Limit the amount of GL memory bound each frame - if (mDesiredDiscardLevel > current_discard) - { - increase_discard = TRUE; - } - } - if ( BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) > sMaxTotalTextureMemInMegaBytes*texmem_middle_bound_scale) - { - // Only allow GL to have 2x the video card memory - if (!mGLTexturep->getBoundRecently()) - { - increase_discard = TRUE; - } + scaleDown() ; } - if (increase_discard) + // Only allow GL to have 2x the video card memory + else if ( BYTES_TO_MEGA_BYTES(sTotalTextureMemoryInBytes) > sMaxTotalTextureMemInMegaBytes*texmem_middle_bound_scale && + (!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel)) { - // llinfos << "DISCARDED: " << mID << " Discard: " << current_discard << llendl; - sBoundTextureMemoryInBytes -= mGLTexturep->mTextureMemory; - sTotalTextureMemoryInBytes -= mGLTexturep->mTextureMemory; - // Increase the discard level (reduce the texture res) - S32 new_discard = current_discard+1; - mGLTexturep->setDiscardLevel(new_discard); - sBoundTextureMemoryInBytes += mGLTexturep->mTextureMemory; - sTotalTextureMemoryInBytes += mGLTexturep->mTextureMemory; - if(LLViewerTextureManager::sTesterp) - { - LLViewerTextureManager::sTesterp->setStablizingTime() ; - } + scaleDown() ; + } } } } +void LLViewerLODTexture::scaleDown() +{ + if(hasGLTexture() && mCachedRawDiscardLevel > getDiscardLevel()) + { + switchToCachedImage() ; + + if(LLViewerTextureManager::sTesterp) + { + LLViewerTextureManager::sTesterp->setStablizingTime() ; + } + } +} //---------------------------------------------------------------------------------------------- //end of LLViewerLODTexture //---------------------------------------------------------------------------------------------- @@ -2189,6 +2764,8 @@ LLViewerMediaTexture::LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps, LL mIsPlaying = FALSE ; setMediaImpl() ; + + setCategory(LLViewerTexture::MEDIA) ; } //virtual @@ -2723,7 +3300,7 @@ void LLTexturePipelineTester::updateTextureLoadingStats(const LLViewerFetchedTex mTotalBytesLoadedForLargeImage += data_size ; } - if(imagep->isForSculpt()) + if(imagep->forSculpt()) { mTotalBytesLoadedForSculpties += data_size ; diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 596bfea670b..6620e9fca3b 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -121,11 +121,23 @@ class LLViewerTexture : public LLTexture BOOST_UI = 15, BOOST_PREVIEW = 16, BOOST_MAP = 17, - BOOST_MAP_LAYER = 18, + BOOST_MAP_VISIBLE = 18, BOOST_AVATAR_SELF = 19, // needed for baking avatar - BOOST_MAX_LEVEL + BOOST_MAX_LEVEL, + + //other texture Categories + LOCAL = BOOST_MAX_LEVEL, + AVATAR_SCRATCH_TEX, + DYNAMIC_TEX, + MEDIA, + ATLAS, + OTHER, + MAX_GL_IMAGE_CATEGORY }; - + static S32 getTotalNumOfCategories() ; + static S32 getIndexFromCategory(S32 category) ; + static S32 getCategoryFromIndex(S32 index) ; + typedef std::list<LLFace*> ll_face_list_t ; protected: @@ -146,7 +158,7 @@ class LLViewerTexture : public LLTexture virtual BOOL isMissingAsset()const ; virtual void dump(); // debug info to llinfos - /*virtual*/ bool bindDefaultImage(const S32 stage = 0) const ; + /*virtual*/ bool bindDefaultImage(const S32 stage = 0) ; /*virtual*/ void forceImmediateUpdate() ; const LLUUID& getID() const { return mID; } @@ -154,9 +166,9 @@ class LLViewerTexture : public LLTexture void setBoostLevel(S32 level); S32 getBoostLevel() { return mBoostLevel; } - //maxVirtualSize of the texture - void addTextureStats(F32 virtual_size) const ; - void resetTextureStats(BOOL zero = FALSE); + void addTextureStats(F32 virtual_size, BOOL needs_gltexture = TRUE) const; + void resetTextureStats(); + virtual F32 getMaxVirtualSize() ; LLFrameTimer* getLastReferencedTimer() {return &mLastReferencedTimer ;} @@ -180,7 +192,7 @@ class LLViewerTexture : public LLTexture BOOL hasGLTexture() const ; LLGLuint getTexName() const ; BOOL createGLTexture() ; - BOOL createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0); + BOOL createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0, BOOL to_create = TRUE, S32 category = LLViewerTexture::OTHER); void setFilteringOption(LLTexUnit::eTextureFilterOptions option); void setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format = 0, BOOL swap_bytes = FALSE); @@ -188,7 +200,8 @@ class LLViewerTexture : public LLTexture BOOL setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height); BOOL setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height); void setGLTextureCreated (bool initialized); - + void setCategory(S32 category) ; + LLTexUnit::eTextureAddressMode getAddressMode(void) const ; S32 getMaxDiscardLevel() const; S32 getDiscardLevel() const; @@ -201,8 +214,8 @@ class LLViewerTexture : public LLTexture BOOL getMask(const LLVector2 &tc); F32 getTimePassedSinceLastBound(); BOOL getMissed() const ; - BOOL isValidForSculpt(S32 discard_level, S32 image_width, S32 image_height, S32 ncomponents) ; - BOOL readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok) const; + BOOL isJustBound()const ; + void forceUpdateBindStats(void) const; U32 getTexelsInAtlas() const ; U32 getTexelsInGLTexture() const ; @@ -220,6 +233,7 @@ class LLViewerTexture : public LLTexture BOOL getDontDiscard() const { return mDontDiscard; } //----------------- + BOOL isLargeImage() ; /*virtual*/ void updateBindStatsForTester() ; protected: void cleanup() ; @@ -228,6 +242,7 @@ class LLViewerTexture : public LLTexture private: //note: do not make this function public. /*virtual*/ LLImageGL* getGLTexture() const ; + virtual void switchToCachedImage(); protected: LLUUID mID; @@ -237,7 +252,9 @@ class LLViewerTexture : public LLTexture BOOL mUseMipMaps ; S8 mComponents; mutable F32 mMaxVirtualSize; // The largest virtual size of the image, in pixels - how much data to we need? + mutable S8 mNeedsGLTexture; mutable BOOL mNeedsResetMaxVirtualSize ; + mutable F32 mAdditionalDecodePriority; // priority add to mDecodePriority. LLFrameTimer mLastReferencedTimer; ll_face_list_t mFaceList ; //reverse pointer pointing to the faces using this image as texture @@ -270,7 +287,12 @@ class LLViewerTexture : public LLTexture static S32 sMaxBoundTextureMemInMegaBytes; static S32 sMaxTotalTextureMemInMegaBytes; static S32 sMaxDesiredTextureMemInBytes ; - static BOOL sDontLoadVolumeTextures; + static S8 sCameraMovingDiscardBias; + static S32 sMaxSculptRez ; + static S32 sMinLargeImageSize ; + static S32 sMaxSmallImageSize ; + static BOOL sFreezeImageScalingDown ;//do not scale down image res if set. + static F32 sCurrentTime ; static BOOL sUseTextureAtlas ; static LLPointer<LLViewerTexture> sNullImagep; // Null texture for non-textured objects. @@ -290,9 +312,9 @@ class LLViewerFetchedTexture : public LLViewerTexture protected: /*virtual*/ ~LLViewerFetchedTexture(); public: - LLViewerFetchedTexture(const LLUUID& id, BOOL usemipmaps = TRUE); + LLViewerFetchedTexture(const LLUUID& id, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE); LLViewerFetchedTexture(const LLImageRaw* raw, BOOL usemipmaps); - LLViewerFetchedTexture(const std::string& full_path, const LLUUID& id, BOOL usemipmaps = TRUE); + LLViewerFetchedTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps = TRUE); public: static F32 maxDecodePriority(); @@ -328,6 +350,8 @@ class LLViewerFetchedTexture : public LLViewerTexture bool hasCallbacks() { return mLoadedCallbackList.empty() ? false : true; } bool doLoadedCallbacks(); + void addToCreateTexture(); + // ONLY call from LLViewerTextureList BOOL createTexture(S32 usename = 0); void destroyTexture() ; @@ -346,7 +370,12 @@ class LLViewerFetchedTexture : public LLViewerTexture // the priority list, and cause horrible things to happen. void setDecodePriority(F32 priority = -1.0f); F32 getDecodePriority() const { return mDecodePriority; }; + + void setAdditionalDecodePriority(F32 priority) ; + F32 maxAdditionalDecodePriority() ; + void updateVirtualSize() ; + // setDesiredDiscardLevel is only used by LLViewerTextureList void setDesiredDiscardLevel(S32 discard) { mDesiredDiscardLevel = discard; } S32 getDesiredDiscardLevel() { return mDesiredDiscardLevel; } @@ -370,15 +399,15 @@ class LLViewerFetchedTexture : public LLViewerTexture BOOL isInImageList() const {return mInImageList ;} void setInImageList(BOOL flag) {mInImageList = flag ;} - const std::string& getLocalFileName() const {return mLocalFileName ;} LLFrameTimer* getLastPacketTimer() {return &mLastPacketTimer;} U32 getFetchPriority() const { return mFetchPriority ;} F32 getDownloadProgress() const {return mDownloadProgress ;} - LLImageRaw* readBackRawImage(S8 discard_level) ; + LLImageRaw* reloadRawImage(S8 discard_level) ; void destroyRawImage(); + const std::string& getUrl() const {return mUrl;} //--------------- BOOL isDeleted() ; BOOL isInactive() ; @@ -389,13 +418,36 @@ class LLViewerFetchedTexture : public LLViewerTexture //--------------- void setForSculpt(); - BOOL isForSculpt() const {return mForSculpt;} + BOOL forSculpt() const {return mForSculpt;} + BOOL isForSculptOnly() const; + + //raw image management + void checkCachedRawSculptImage() ; + LLImageRaw* getRawImage()const { return mRawImage ;} + S32 getRawImageLevel() const {return mRawDiscardLevel;} + LLImageRaw* getCachedRawImage() const { return mCachedRawImage ;} + S32 getCachedRawImageLevel() const {return mCachedRawDiscardLevel;} + BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;} + BOOL isRawImageValid()const { return mIsRawImageValid ; } + void forceToSaveRawImage(S32 desired_discard = 0) ; + void destroySavedRawImage() ; + LLImageRaw* getSavedRawImage() ; + BOOL hasSavedRawImage() const ; + F32 getElapsedLastReferencedSavedRawImageTime() const ; + BOOL isFullyLoaded() const; + +protected: + /*virtual*/ void switchToCachedImage(); private: void init(bool firstinit) ; void cleanup() ; F32 calcDecodePriorityForUnknownTexture(F32 pixel_priority) ; + void saveRawImage() ; + BOOL forceFetch() ; + void setCachedRawImage() ; + BOOL keepReuestedDiscardLevel(); //for atlas void resetFaceAtlas() ; @@ -414,12 +466,8 @@ class LLViewerFetchedTexture : public LLViewerTexture S32 mKnownDrawWidth; S32 mKnownDrawHeight; - std::string mLocalFileName; - - S8 mDesiredDiscardLevel; // The discard level we'd LIKE to have - if we have it and there's space - S8 mMinDesiredDiscardLevel; // The minimum discard level we'd like to have - S32 mMinDiscardLevel; - + std::string mUrl; + S32 mRequestedDiscardLevel; F32 mRequestedDownloadPriority; S32 mFetchState; @@ -429,6 +477,10 @@ class LLViewerFetchedTexture : public LLViewerTexture F32 mRequestDeltaTime; S32 mDecodeFrame; S32 mVisibleFrame; // decode frame where image was last visible + F32 mDecodePriority; // The priority for decoding this image. + S32 mMinDiscardLevel; + S8 mDesiredDiscardLevel; // The discard level we'd LIKE to have - if we have it and there's space + S8 mMinDesiredDiscardLevel; // The minimum discard level we'd like to have S8 mNeedsAux; // We need to decode the auxiliary channels S8 mDecodingAux; // Are we decoding high components @@ -436,10 +488,10 @@ class LLViewerFetchedTexture : public LLViewerTexture S8 mHasFetcher; // We've made a fecth request S8 mIsFetching; // Fetch request is active - mutable S8 mIsMissingAsset; // True if we know that there is no image asset with this image id in the database. + mutable S8 mIsMissingAsset; // True if we know that there is no image asset with this image id in the database. - F32 mDecodePriority; // The priority for decoding this image. typedef std::list<LLLoadedCallbackEntry*> callback_list_t; + S8 mLoadedCallbackDesiredDiscardLevel; callback_list_t mLoadedCallbackList; LLPointer<LLImageRaw> mRawImage; @@ -449,6 +501,19 @@ class LLViewerFetchedTexture : public LLViewerTexture // doing if you use it for anything else! - djs LLPointer<LLImageRaw> mAuxRawImage; + //keep a copy of mRawImage for some special purposes + //when mForceToSaveRawImage is set. + BOOL mForceToSaveRawImage ; + LLPointer<LLImageRaw> mSavedRawImage; + S32 mSavedRawDiscardLevel; + S32 mDesiredSavedRawDiscardLevel; + F32 mLastReferencedSavedRawImageTime ; + + //a small version of the copy of the raw image (<= 64 * 64) + LLPointer<LLImageRaw> mCachedRawImage; + S32 mCachedRawDiscardLevel; + BOOL mCachedRawImageReady; //the rez of the mCachedRawImage reaches the upper limit. + LLHost mTargetHost; // if LLHost::invalid, just request from agent's simulator // Timers @@ -477,15 +542,17 @@ class LLViewerLODTexture : public LLViewerFetchedTexture /*virtual*/ ~LLViewerLODTexture(){} public: - LLViewerLODTexture(const LLUUID& id, BOOL usemipmaps = TRUE); - LLViewerLODTexture(const std::string& full_path, const LLUUID& id, BOOL usemipmaps = TRUE); + LLViewerLODTexture(const LLUUID& id, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE); + LLViewerLODTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps = TRUE); /*virtual*/ S8 getType() const; // Process image stats to determine priority/quality requirements. /*virtual*/ void processTextureStats(); - + BOOL isUpdateFrozen() ; + private: void init(bool firstinit) ; + void scaleDown() ; private: @@ -608,6 +675,15 @@ class LLViewerTextureManager const LLUUID& force_id = LLUUID::null ); + static LLViewerFetchedTexture* getFetchedTextureFromUrl(const std::string& url, + BOOL usemipmap = TRUE, + BOOL level_immediate = FALSE, // Get the requested level immediately upon creation. + S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, + LLGLint internal_format = 0, + LLGLenum primary_format = 0, + const LLUUID& force_id = LLUUID::null + ); + static LLViewerFetchedTexture* getFetchedTextureFromHost(const LLUUID& image_id, LLHost host) ; static void init() ; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 4ad4c8e1ea1..31aedf666bb 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -44,6 +44,7 @@ #include "llimagetga.h" #include "llimagejpeg.h" #include "llimagepng.h" +#include "llimageworker.h" #include "llsdserialize.h" #include "llsys.h" @@ -68,10 +69,15 @@ void (*LLViewerTextureList::sUUIDCallback)(void **, const LLUUID&) = NULL; -const S32 IMAGES_PER_REQUEST = 42; -const S32 IMAGES_MIN_UPDATES = 4; // Always update the highest N images each frame -const S32 IMAGES_MAX_PACKET_UPDATES = 1; // Only send N packets of IMAGES_PER_REQUEST in a frame -const F32 RESEND_IMAGE_REQUEST_TIME = 15.f; // seconds +U32 LLViewerTextureList::sTextureBits = 0; +U32 LLViewerTextureList::sTexturePackets = 0; +S32 LLViewerTextureList::sNumImages = 0; +LLStat LLViewerTextureList::sNumImagesStat(32, TRUE); +LLStat LLViewerTextureList::sNumRawImagesStat(32, TRUE); +LLStat LLViewerTextureList::sGLTexMemStat(32, TRUE); +LLStat LLViewerTextureList::sGLBoundMemStat(32, TRUE); +LLStat LLViewerTextureList::sRawMemStat(32, TRUE); +LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE); LLViewerTextureList gTextureList; static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images"); @@ -88,7 +94,7 @@ LLViewerTextureList::LLViewerTextureList() void LLViewerTextureList::init() { - mNumImages = 0; + sNumImages = 0; mMaxResidentTexMemInMegaBytes = 0; mMaxTotalTextureMemInMegaBytes = 0 ; if (gNoRender) @@ -231,6 +237,10 @@ void LLViewerTextureList::shutdown() { continue; // avoid UI, baked, and other special images } + if(!image->getBoundRecently()) + { + continue ; + } S32 desired = image->getDesiredDiscardLevel(); if (desired >= 0 && desired < MAX_DISCARD_LEVEL) { @@ -321,17 +331,30 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& LLGLenum primary_format, const LLUUID& force_id) { - if (gNoRender) + std::string full_path = gDirUtilp->findSkinnedFilename("textures", filename); + if (full_path.empty()) { - // Never mind that this ignores image_set_id; - // getImage() will handle that later. + llwarns << "Failed to find local image file: " << filename << llendl; return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE); } - std::string full_path = gDirUtilp->findSkinnedFilename("textures", filename); - if (full_path.empty()) + std::string url = "file://" + full_path; + + return getImageFromUrl(url, usemipmaps, level_immediate, texture_type, internal_format, primary_format, force_id); +} + +LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& url, + BOOL usemipmaps, + BOOL level_immediate, + S8 texture_type, + LLGLint internal_format, + LLGLenum primary_format, + const LLUUID& force_id) +{ + if (gNoRender) { - llwarns << "Failed to find local image file: " << filename << llendl; + // Never mind that this ignores image_set_id; + // getImage() will handle that later. return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE); } @@ -343,7 +366,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& } else { - new_id.generate(full_path); + new_id.generate(url); } LLPointer<LLViewerFetchedTexture> imagep = findImage(new_id); @@ -353,10 +376,10 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& switch(texture_type) { case LLViewerTexture::FETCHED_TEXTURE: - imagep = new LLViewerFetchedTexture(full_path, new_id, usemipmaps); + imagep = new LLViewerFetchedTexture(url, new_id, usemipmaps); break ; case LLViewerTexture::LOD_TEXTURE: - imagep = new LLViewerLODTexture(full_path, new_id, usemipmaps); + imagep = new LLViewerLODTexture(url, new_id, usemipmaps); break ; default: llerrs << "Invalid texture type " << texture_type << llendl ; @@ -372,7 +395,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& if (level_immediate) { imagep->dontDiscard(); - imagep->setBoostLevel(LLViewerFetchedTexture::BOOST_UI); + imagep->setBoostLevel(LLViewerTexture::BOOST_UI); } } @@ -424,18 +447,15 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id, switch(texture_type) { case LLViewerTexture::FETCHED_TEXTURE: - imagep = new LLViewerFetchedTexture(image_id, usemipmaps); + imagep = new LLViewerFetchedTexture(image_id, request_from_host, usemipmaps); break ; case LLViewerTexture::LOD_TEXTURE: - imagep = new LLViewerLODTexture(image_id, usemipmaps); + imagep = new LLViewerLODTexture(image_id, request_from_host, usemipmaps); break ; default: llerrs << "Invalid texture type " << texture_type << llendl ; } - // Might want to request from host other than where the agent is. JC - imagep->setTargetHost(request_from_host); - if (internal_format && primary_format) { imagep->setExplicitFormat(internal_format, primary_format); @@ -446,7 +466,7 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id, if (level_immediate) { imagep->dontDiscard(); - imagep->setBoostLevel(LLViewerFetchedTexture::BOOST_UI); + imagep->setBoostLevel(LLViewerTexture::BOOST_UI); } else { @@ -509,7 +529,7 @@ void LLViewerTextureList::addImage(LLViewerFetchedTexture *new_image) { llwarns << "Image with ID " << image_id << " already in list" << llendl; } - mNumImages++; + sNumImages++; addImageToList(new_image); mUUIDMap[image_id] = new_image; @@ -526,7 +546,7 @@ void LLViewerTextureList::deleteImage(LLViewerFetchedTexture *image) } llverify(mUUIDMap.erase(image->getID()) == 1); - mNumImages--; + sNumImages--; removeImageFromList(image); } } @@ -546,7 +566,9 @@ static LLFastTimer::DeclareTimer FTM_IMAGE_MARK_DIRTY("Dirty Images"); void LLViewerTextureList::updateImages(F32 max_time) { - LLViewerStats::getInstance()->mNumImagesStat.addValue(mNumImages); + LLAppViewer::getTextureFetch()->setTextureBandwidth(LLViewerStats::getInstance()->mTextureKBitStat.getMeanPerSec()); + + LLViewerStats::getInstance()->mNumImagesStat.addValue(sNumImages); LLViewerStats::getInstance()->mNumRawImagesStat.addValue(LLImageRaw::sRawImageCount); LLViewerStats::getInstance()->mGLTexMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageGL::sGlobalTextureMemoryInBytes)); LLViewerStats::getInstance()->mGLBoundMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageGL::sBoundTextureMemoryInBytes)); @@ -554,10 +576,13 @@ void LLViewerTextureList::updateImages(F32 max_time) LLViewerStats::getInstance()->mFormattedMemStat.addValue((F32)BYTES_TO_MEGA_BYTES(LLImageFormatted::sGlobalFormattedMemory)); updateImagesDecodePriorities(); + + F32 total_max_time = max_time; max_time -= updateImagesFetchTextures(max_time); - max_time = llmin(llmax(max_time, 0.001f*10.f*gFrameIntervalSeconds), 0.001f); + + max_time = llmax(max_time, total_max_time*.25f); // at least 25% of max_time max_time -= updateImagesCreateTextures(max_time); - max_time = llmin(llmax(max_time, 0.001f*10.f*gFrameIntervalSeconds), 0.001f); + if (!mDirtyTextureList.empty()) { LLFastTimer t(FTM_IMAGE_MARK_DIRTY); @@ -570,7 +595,7 @@ void LLViewerTextureList::updateImages(F32 max_time) { //trigger loaded callbacks on local textures immediately LLViewerFetchedTexture* image = *iter++; - if (!image->getLocalFileName().empty()) + if (!image->getUrl().empty()) { // Do stuff to handle callbacks, update priorities, etc. didone = image->doLoadedCallbacks(); @@ -628,6 +653,14 @@ void LLViewerTextureList::updateImagesDecodePriorities() } else { + if(imagep->hasSavedRawImage()) + { + if(imagep->getElapsedLastReferencedSavedRawImageTime() > MAX_INACTIVE_TIME) + { + imagep->destroySavedRawImage() ; + } + } + if(imagep->isDeleted()) { continue ; @@ -758,74 +791,76 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time) const size_t max_update_count = llmin((S32) (1024*10.f*gFrameIntervalSeconds)+1, 256); // 32 high priority entries - std::set<LLViewerFetchedTexture*> entries; + typedef std::vector<LLViewerFetchedTexture*> entries_list_t; + entries_list_t entries; size_t update_counter = llmin(max_priority_count, mImageList.size()); image_priority_list_t::iterator iter1 = mImageList.begin(); while(update_counter > 0) { - // added extra granularity and verbosity for crash logging during 1.19.1 RC. -Brad - if(iter1 == mImageList.end()) - { - llerrs << "DEV-12002: update_counter not calculated correctly!" << llendl; - return 0.f; - } - - LLPointer<LLViewerFetchedTexture> const & ptr = *iter1; - - LLViewerFetchedTexture * img = ptr.get(); - - // added extra granularity and verbosity for crash logging during 1.19.1 RC. -Brad - if(img == NULL) - { - llwarns << "DEV-12002: image is NULL!" << llendl; - } - - entries.insert(img); - + entries.push_back(*iter1); + ++iter1; update_counter--; } // 256 cycled entries - update_counter = llmin(max_update_count, mUUIDMap.size()); - uuid_map_t::iterator iter2 = mUUIDMap.upper_bound(mLastFetchUUID); - while(update_counter > 0) + update_counter = llmin(max_update_count, mUUIDMap.size()); + if(update_counter > 0) { - if (iter2 == mUUIDMap.end()) + uuid_map_t::iterator iter2 = mUUIDMap.upper_bound(mLastFetchUUID); + uuid_map_t::iterator iter2p = iter2; + while(update_counter > 0) { - iter2 = mUUIDMap.begin(); + if (iter2 == mUUIDMap.end()) + { + iter2 = mUUIDMap.begin(); + } + entries.push_back(iter2->second); + iter2p = iter2++; + update_counter--; } - mLastFetchUUID = iter2->first; - entries.insert(iter2->second); - ++iter2; - update_counter--; + + mLastFetchUUID = iter2p->first; } + S32 fetch_count = 0; S32 min_count = max_priority_count + max_update_count/4; - for (std::set<LLViewerFetchedTexture*>::iterator iter3 = entries.begin(); + for (entries_list_t::iterator iter3 = entries.begin(); iter3 != entries.end(); ) { LLPointer<LLViewerFetchedTexture> imagep = *iter3++; - imagep->updateFetch(); + bool fetching = imagep->updateFetch(); + if (fetching) + { + fetch_count++; + } if (min_count <= 0 && image_op_timer.getElapsedTimeF32() > max_time) { break; } min_count--; } + if (fetch_count == 0) + { + gDebugTimers[0].pause(); + } + else + { + gDebugTimers[0].unpause(); + } return image_op_timer.getElapsedTimeF32(); } void LLViewerTextureList::updateImagesUpdateStats() { - if (mUpdateStats) + if (mUpdateStats && mForceResetTextureStats) { for (image_priority_list_t::iterator iter = mImageList.begin(); iter != mImageList.end(); ) { LLViewerFetchedTexture* imagep = *iter++; - imagep->resetTextureStats(mForceResetTextureStats); + imagep->resetTextureStats(); } mUpdateStats = FALSE; mForceResetTextureStats = FALSE; @@ -1011,6 +1046,9 @@ LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImage return compressedImage; } +const S32 MIN_VIDEO_RAM = 32; +const S32 MAX_VIDEO_RAM = 512; // 512MB max for performance reasons. + // Returns min setting for TextureMemory (in MB) S32 LLViewerTextureList::getMinVideoRamSetting() { @@ -1129,13 +1167,13 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d if (msg->getReceiveCompressedSize()) { - gTextureList.mTextureBits += msg->getReceiveCompressedSize() * 8; + gTextureList.sTextureBits += msg->getReceiveCompressedSize() * 8; } else { - gTextureList.mTextureBits += msg->getReceiveSize() * 8; + gTextureList.sTextureBits += msg->getReceiveSize() * 8; } - gTextureList.mTexturePackets++; + gTextureList.sTexturePackets++; U8 codec; U16 packets; @@ -1194,13 +1232,13 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d if (msg->getReceiveCompressedSize()) { - gTextureList.mTextureBits += msg->getReceiveCompressedSize() * 8; + gTextureList.sTextureBits += msg->getReceiveCompressedSize() * 8; } else { - gTextureList.mTextureBits += msg->getReceiveSize() * 8; + gTextureList.sTextureBits += msg->getReceiveSize() * 8; } - gTextureList.mTexturePackets++; + gTextureList.sTexturePackets++; //llprintline("Start decode, image header..."); msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, id); @@ -1385,7 +1423,7 @@ void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_v // for images grabbed from local files, apply clipping rectangle to restore original dimensions // from power-of-2 gl image - if (success && imagep.notNull() && src_vi && !src_vi->getLocalFileName().empty()) + if (success && imagep.notNull() && src_vi && (src_vi->getUrl().compare(0, 7, "file://")==0)) { F32 clip_x = (F32)src_vi->getOriginalWidth() / (F32)src_vi->getFullWidth(); F32 clip_y = (F32)src_vi->getOriginalHeight() / (F32)src_vi->getFullHeight(); @@ -1442,6 +1480,11 @@ bool LLUIImageList::initFromFile() llwarns << "Unable to parse UI image list file " << base_file_path << llendl; return false; } + if (!root->hasAttribute("version")) + { + llwarns << "No valid version number in UI image list file " << base_file_path << llendl; + return false; + } std::vector<std::string> paths; // path to current selected skin diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index 11d1dd855fa..2a86b88163d 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -53,7 +53,6 @@ const BOOL GL_TEXTURE_NO = FALSE; const BOOL IMMEDIATE_YES = TRUE; const BOOL IMMEDIATE_NO = FALSE; -class LLImageJ2C; class LLMessageSystem; class LLTextureView; @@ -146,6 +145,15 @@ class LLViewerTextureList LLGLenum primary_format = 0, const LLUUID& force_id = LLUUID::null ); + + LLViewerFetchedTexture* getImageFromUrl(const std::string& url, + BOOL usemipmap = TRUE, + BOOL level_immediate = FALSE, // Get the requested level immediately upon creation. + S8 texture_type = LLViewerTexture::FETCHED_TEXTURE, + LLGLint internal_format = 0, + LLGLenum primary_format = 0, + const LLUUID& force_id = LLUUID::null + ); LLViewerFetchedTexture* createImage(const LLUUID &image_id, BOOL usemipmap = TRUE, @@ -190,11 +198,18 @@ class LLViewerTextureList LLFrameTimer mForceDecodeTimer; public: - U32 mTextureBits; - U32 mTexturePackets; + static U32 sTextureBits; + static U32 sTexturePackets; + + static LLStat sNumImagesStat; + static LLStat sNumRawImagesStat; + static LLStat sGLTexMemStat; + static LLStat sGLBoundMemStat; + static LLStat sRawMemStat; + static LLStat sFormattedMemStat; private: - S32 mNumImages; + static S32 sNumImages; static void (*sUUIDCallback)(void**, const LLUUID &); }; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 5f95e9ccf1b..cee3a2a65b5 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -117,6 +117,7 @@ #include "llhudview.h" #include "llimagebmp.h" #include "llimagej2c.h" +#include "llimageworker.h" #include "llkeyboard.h" #include "lllineeditor.h" #include "llmenugl.h" @@ -157,7 +158,6 @@ #include "lltoolselectland.h" #include "lltrans.h" #include "lluictrlfactory.h" -#include "lluploaddialog.h" #include "llurldispatcher.h" // SLURL from other app instance #include "llvieweraudio.h" #include "llviewercamera.h" @@ -189,6 +189,7 @@ #include "llbottomtray.h" #include "llnearbychatbar.h" #include "llagentui.h" +#include "llwearablelist.h" #include "llnotificationmanager.h" @@ -326,7 +327,9 @@ class LLDebugText S32 hours = (S32)(time / (60*60)); S32 mins = (S32)((time - hours*(60*60)) / 60); S32 secs = (S32)((time - hours*(60*60) - mins*60)); - addText(xpos, ypos, llformat(" Debug %d: %d:%02d:%02d", idx, hours,mins,secs)); ypos += y_inc2; + std::string label = gDebugTimerLabel[idx]; + if (label.empty()) label = llformat("Debug: %d", idx); + addText(xpos, ypos, llformat(" %s: %d:%02d:%02d", label.c_str(), hours,mins,secs)); ypos += y_inc2; } F32 time = gFrameTimeSeconds; @@ -1299,6 +1302,7 @@ LLViewerWindow::LLViewerWindow( // Init the image list. Must happen after GL is initialized and before the images that // LLViewerWindow needs are requested. + LLImageGL::initClass(LLViewerTexture::MAX_GL_IMAGE_CATEGORY) ; gTextureList.init(); LLViewerTextureManager::init() ; gBumpImageList.init(); @@ -1657,6 +1661,8 @@ void LLViewerWindow::shutdownGL() gSky.cleanup(); stop_glerror(); + LLWearableList::instance().cleanup() ; + gTextureList.shutdown(); stop_glerror(); @@ -1670,7 +1676,10 @@ void LLViewerWindow::shutdownGL() stop_glerror(); LLViewerTextureManager::cleanup() ; - + LLImageGL::cleanupClass() ; + + llinfos << "All texturs and llimagegl images are destroyed!" << llendl ; + llinfos << "Cleaning up select manager" << llendl; LLSelectMgr::getInstance()->cleanup(); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 231b857d1f0..a279bd8a681 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -321,7 +321,7 @@ class LLViewerWindow : public LLWindowCallbacks } ESnapshotType; BOOL saveSnapshot(const std::string& filename, S32 image_width, S32 image_height, BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR); BOOL rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE, BOOL is_texture = FALSE, - BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_IMAGE_SIZE ); + BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE ); BOOL thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type) ; BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); } void resetSnapshotLoc() const { sSnapshotDir.clear(); } diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp index d124cbcdced..999701ece16 100644 --- a/indra/newview/llvlcomposition.cpp +++ b/indra/newview/llvlcomposition.cpp @@ -279,7 +279,6 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, if (mRawImages[i].isNull()) { // Read back a raw image for this discard level, if it exists - mRawImages[i] = new LLImageRaw; S32 min_dim = llmin(mDetailTextures[i]->getFullWidth(), mDetailTextures[i]->getFullHeight()); S32 ddiscard = 0; while (min_dim > BASE_SIZE && ddiscard < MAX_DISCARD_LEVEL) @@ -287,12 +286,18 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, ddiscard++; min_dim /= 2; } - if (!mDetailTextures[i]->readBackRaw(ddiscard, mRawImages[i], false)) + + mDetailTextures[i]->reloadRawImage(ddiscard) ; + if(mDetailTextures[i]->getRawImageLevel() != ddiscard)//raw iamge is not ready, will enter here again later. { - llwarns << "Unable to read raw data for terrain detail texture: " << mDetailTextures[i]->getID() << llendl; - mRawImages[i] = NULL; + mDetailTextures[i]->destroyRawImage() ; + lldebugs << "cached raw data for terrain detail texture is not ready yet: " << mDetailTextures[i]->getID() << llendl; return FALSE; } + + mRawImages[i] = mDetailTextures[i]->getRawImage() ; + mDetailTextures[i]->destroyRawImage() ; + if (mDetailTextures[i]->getWidth(ddiscard) != BASE_SIZE || mDetailTextures[i]->getHeight(ddiscard) != BASE_SIZE || mDetailTextures[i]->getComponents() != 3) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 469aef62093..229227c1444 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -988,7 +988,7 @@ void LLVOAvatar::resetImpostors() // static void LLVOAvatar::deleteCachedImages(bool clearAll) -{ +{ if (LLTexLayerSet::sHasCaches) { lldebugs << "Deleting layer set caches" << llendl; @@ -3897,7 +3897,7 @@ U32 LLVOAvatar::renderFootShadows() LLGLDepthTest test(GL_TRUE, GL_FALSE); //render foot shadows LLGLEnable blend(GL_BLEND); - gGL.getTexUnit(0)->bind(mShadowImagep.get()); + gGL.getTexUnit(0)->bind(mShadowImagep, TRUE); glColor4fv(mShadow0Facep->getRenderColor().mV); mShadow0Facep->renderIndexed(foot_mask); glColor4fv(mShadow1Facep->getRenderColor().mV); @@ -3945,7 +3945,7 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color, S32 diffuse_channel) //------------------------------------------------------------------------ // LLVOAvatar::updateTextures() //------------------------------------------------------------------------ -void LLVOAvatar::updateTextures(LLAgent &agent) +void LLVOAvatar::updateTextures() { BOOL render_avatar = TRUE; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index e3add8aa78f..c4e68064e75 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -125,7 +125,7 @@ class LLVOAvatar : virtual BOOL updateLOD(); BOOL updateJointLODs(); virtual BOOL isActive() const; // Whether this object needs to do an idleUpdate. - virtual void updateTextures(LLAgent &agent); + virtual void updateTextures(); virtual S32 setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim. virtual void onShift(const LLVector3& shift_vector); virtual U32 getPartitionType() const; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 9a115ea4e6c..673e699c30a 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1141,26 +1141,6 @@ void LLVOAvatarSelf::localTextureLoaded(BOOL success, LLViewerFetchedTexture *sr } } -// virtual -/* //unused -BOOL LLVOAvatarSelf::getLocalTextureRaw(ETextureIndex index, LLImageRaw* image_raw) const -{ - if (!isIndexLocalTexture(index)) return FALSE; - if (getLocalTextureID(index) == IMG_DEFAULT_AVATAR) return TRUE; - - const LocalTextureData *local_tex_data = getLocalTextureData(index)[0]; - if (local_tex_data->mImage->readBackRaw(-1, image_raw, false)) - { - - return TRUE; - } - - // No data loaded yet - setLocalTexture((ETextureIndex)index, getTEImage(index), FALSE); // <-- non-const, move this elsewhere - return FALSE; -} -*/ - // virtual BOOL LLVOAvatarSelf::getLocalTextureGL(ETextureIndex type, LLViewerTexture** tex_pp, U32 index) const { @@ -1812,12 +1792,13 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe if (!covered_by_baked) { - if (getLocalTextureID(type, index) != IMG_DEFAULT_AVATAR) + if (getLocalTextureID(type, index) != IMG_DEFAULT_AVATAR && imagep->getDiscardLevel() != 0) { F32 desired_pixels; desired_pixels = llmin(mPixelArea, (F32)getTexImageArea()); imagep->setBoostLevel(getAvatarBoostLevel()); imagep->addTextureStats( desired_pixels / texel_area_ratio ); + imagep->forceUpdateBindStats() ; if (imagep->getDiscardLevel() < 0) { mHasGrey = TRUE; // for statistics gathering @@ -2115,6 +2096,49 @@ BOOL LLVOAvatarSelf::needsRenderBeam() // static void LLVOAvatarSelf::deleteScratchTextures() { + if(gAuditTexture) + { + S32 total_tex_size = sScratchTexBytes ; + S32 tex_size = SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT ; + + if( sScratchTexNames.checkData( GL_LUMINANCE ) ) + { + LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ; + total_tex_size -= tex_size ; + } + if( sScratchTexNames.checkData( GL_ALPHA ) ) + { + LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ; + total_tex_size -= tex_size ; + } + if( sScratchTexNames.checkData( GL_COLOR_INDEX ) ) + { + LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ; + total_tex_size -= tex_size ; + } + if( sScratchTexNames.checkData( GL_LUMINANCE_ALPHA ) ) + { + LLImageGL::decTextureCounter(tex_size, 2, LLViewerTexture::AVATAR_SCRATCH_TEX) ; + total_tex_size -= 2 * tex_size ; + } + if( sScratchTexNames.checkData( GL_RGB ) ) + { + LLImageGL::decTextureCounter(tex_size, 3, LLViewerTexture::AVATAR_SCRATCH_TEX) ; + total_tex_size -= 3 * tex_size ; + } + if( sScratchTexNames.checkData( GL_RGBA ) ) + { + LLImageGL::decTextureCounter(tex_size, 4, LLViewerTexture::AVATAR_SCRATCH_TEX) ; + total_tex_size -= 4 * tex_size ; + } + //others + while(total_tex_size > 0) + { + LLImageGL::decTextureCounter(tex_size, 4, LLViewerTexture::AVATAR_SCRATCH_TEX) ; + total_tex_size -= 4 * tex_size ; + } + } + for( LLGLuint* namep = sScratchTexNames.getFirstData(); namep; namep = sScratchTexNames.getNextData() ) @@ -2137,7 +2161,8 @@ void LLVOAvatarSelf::deleteScratchTextures() BOOL LLVOAvatarSelf::bindScratchTexture( LLGLenum format ) { U32 texture_bytes = 0; - GLuint gl_name = getScratchTexName( format, &texture_bytes ); + S32 components = 0; + GLuint gl_name = getScratchTexName( format, components, &texture_bytes ); if( gl_name ) { gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name); @@ -2149,12 +2174,12 @@ BOOL LLVOAvatarSelf::bindScratchTexture( LLGLenum format ) if( *last_bind_time != LLImageGL::sLastFrameTime ) { *last_bind_time = LLImageGL::sLastFrameTime; - LLImageGL::updateBoundTexMem(texture_bytes); + LLImageGL::updateBoundTexMem(texture_bytes, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ; } } else { - LLImageGL::updateBoundTexMem(texture_bytes); + LLImageGL::updateBoundTexMem(texture_bytes, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ; sScratchTexLastBindTime.addData( format, new F32(LLImageGL::sLastFrameTime) ); } return TRUE; @@ -2162,9 +2187,8 @@ BOOL LLVOAvatarSelf::bindScratchTexture( LLGLenum format ) return FALSE; } -LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, U32* texture_bytes ) -{ - S32 components; +LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, S32& components, U32* texture_bytes ) +{ GLenum internal_format; switch( format ) { @@ -2210,6 +2234,11 @@ LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, U32* texture_bytes sScratchTexBytes += *texture_bytes; LLImageGL::sGlobalTextureMemoryInBytes += *texture_bytes; + + if(gAuditTexture) + { + LLImageGL::incTextureCounter(SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ; + } return name; } diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index a555d04a633..06b3b25eecd 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -239,7 +239,7 @@ class LLVOAvatarSelf : BOOL bindScratchTexture(LLGLenum format); static void deleteScratchTextures(); protected: - LLGLuint getScratchTexName(LLGLenum format, U32* texture_bytes); + LLGLuint getScratchTexName(LLGLenum format, S32& components, U32* texture_bytes); private: static S32 sScratchTexBytes; static LLMap< LLGLenum, LLGLuint*> sScratchTexNames; diff --git a/indra/newview/llvoclouds.cpp b/indra/newview/llvoclouds.cpp index 8d3c8b6f1a9..177cb16c508 100644 --- a/indra/newview/llvoclouds.cpp +++ b/indra/newview/llvoclouds.cpp @@ -101,7 +101,7 @@ void LLVOClouds::setPixelAreaAndAngle(LLAgent &agent) mPixelArea = 1500*100; } -void LLVOClouds::updateTextures(LLAgent &agent) +void LLVOClouds::updateTextures() { getTEImage(0)->addTextureStats(mPixelArea); } diff --git a/indra/newview/llvoclouds.h b/indra/newview/llvoclouds.h index 95e6b96e4ed..c4a75f5b5ef 100644 --- a/indra/newview/llvoclouds.h +++ b/indra/newview/llvoclouds.h @@ -65,7 +65,7 @@ class LLVOClouds : public LLAlphaObject /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate. F32 getPartSize(S32 idx); - /*virtual*/ void updateTextures(LLAgent &agent); + /*virtual*/ void updateTextures(); /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area void updateFaceSize(S32 idx) { } diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index 570a3334b9e..33c10450a15 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -322,7 +322,7 @@ void LLVOGrass::setPixelAreaAndAngle(LLAgent &agent) // BUG could speed this up by caching the relative_position and range calculations -void LLVOGrass::updateTextures(LLAgent &agent) +void LLVOGrass::updateTextures() { if (getTEImage(0)) { diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h index 124400d3560..6a6fcc31c3b 100644 --- a/indra/newview/llvograss.h +++ b/indra/newview/llvograss.h @@ -72,7 +72,7 @@ class LLVOGrass : public LLAlphaObject LLStrider<U16>& indicesp); void updateFaceSize(S32 idx) { } - /*virtual*/ void updateTextures(LLAgent &agent); + /*virtual*/ void updateTextures(); /*virtual*/ BOOL updateLOD(); /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area diff --git a/indra/newview/llvoground.cpp b/indra/newview/llvoground.cpp index ac2484ddfdd..221c6b61ec2 100644 --- a/indra/newview/llvoground.cpp +++ b/indra/newview/llvoground.cpp @@ -70,7 +70,7 @@ BOOL LLVOGround::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) } -void LLVOGround::updateTextures(LLAgent &agent) +void LLVOGround::updateTextures() { } diff --git a/indra/newview/llvoground.h b/indra/newview/llvoground.h index af3fcd65d46..0ccb0834a2f 100644 --- a/indra/newview/llvoground.h +++ b/indra/newview/llvoground.h @@ -51,7 +51,7 @@ class LLVOGround : public LLStaticViewerObject // Graphical stuff for objects - maybe broken out into render class // later? - /*virtual*/ void updateTextures(LLAgent &agent); + /*virtual*/ void updateTextures(); /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline); /*virtual*/ BOOL updateGeometry(LLDrawable *drawable); diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 7585842623b..f1e42f93758 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -108,7 +108,7 @@ void LLVOPartGroup::setPixelAreaAndAngle(LLAgent &agent) } } -void LLVOPartGroup::updateTextures(LLAgent &agent) +void LLVOPartGroup::updateTextures() { // Texture stats for particles need to be updated in a different way... } diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h index 3dc32929920..18583b4be9a 100644 --- a/indra/newview/llvopartgroup.h +++ b/indra/newview/llvopartgroup.h @@ -61,7 +61,7 @@ class LLVOPartGroup : public LLAlphaObject virtual U32 getPartitionType() const; /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); - /*virtual*/ void updateTextures(LLAgent &agent); + /*virtual*/ void updateTextures(); /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline); /*virtual*/ BOOL updateGeometry(LLDrawable *drawable); diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index d44c5432669..ddf7ea03826 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -289,7 +289,7 @@ void LLSkyTex::create(const F32 brightness) void LLSkyTex::createGLImage(S32 which) { - mTexture[which]->createGLTexture(0, mImageRaw[which]); + mTexture[which]->createGLTexture(0, mImageRaw[which], 0, TRUE, LLViewerTexture::LOCAL); mTexture[which]->setAddressMode(LLTexUnit::TAM_CLAMP); } @@ -1180,7 +1180,7 @@ BOOL LLVOSky::updateSky() return TRUE; } -void LLVOSky::updateTextures(LLAgent &agent) +void LLVOSky::updateTextures() { if (mSunTexturep) { diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h index 62c934fb410..ef74324e58d 100644 --- a/indra/newview/llvosky.h +++ b/indra/newview/llvosky.h @@ -492,7 +492,7 @@ class LLVOSky : public LLStaticViewerObject // Graphical stuff for objects - maybe broken out into render class // later? - /*virtual*/ void updateTextures(LLAgent &agent); + /*virtual*/ void updateTextures(); /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline); /*virtual*/ BOOL updateGeometry(LLDrawable *drawable); diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index 164f0f0cade..ef7b1610036 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -134,7 +134,7 @@ void LLVOSurfacePatch::setPixelAreaAndAngle(LLAgent &agent) } -void LLVOSurfacePatch::updateTextures(LLAgent &agent) +void LLVOSurfacePatch::updateTextures() { } diff --git a/indra/newview/llvosurfacepatch.h b/indra/newview/llvosurfacepatch.h index aaf4d41fa1e..10a5888526c 100644 --- a/indra/newview/llvosurfacepatch.h +++ b/indra/newview/llvosurfacepatch.h @@ -75,7 +75,7 @@ class LLVOSurfacePatch : public LLStaticViewerObject LLStrider<LLVector2> &texCoords1p, LLStrider<U16> &indicesp); - /*virtual*/ void updateTextures(LLAgent &agent); + /*virtual*/ void updateTextures(); /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area /*virtual*/ void updateSpatialExtents(LLVector3& newMin, LLVector3& newMax); diff --git a/indra/newview/llvotextbubble.cpp b/indra/newview/llvotextbubble.cpp index f5094c025ec..75beab519e0 100644 --- a/indra/newview/llvotextbubble.cpp +++ b/indra/newview/llvotextbubble.cpp @@ -115,7 +115,7 @@ BOOL LLVOTextBubble::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) } -void LLVOTextBubble::updateTextures(LLAgent &agent) +void LLVOTextBubble::updateTextures() { // Update the image levels of all textures... diff --git a/indra/newview/llvotextbubble.h b/indra/newview/llvotextbubble.h index 45d4df2a7e1..7f84dbf631e 100644 --- a/indra/newview/llvotextbubble.h +++ b/indra/newview/llvotextbubble.h @@ -44,7 +44,7 @@ class LLVOTextBubble : public LLAlphaObject /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate. /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); - /*virtual*/ void updateTextures(LLAgent &agent); + /*virtual*/ void updateTextures(); /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline); /*virtual*/ BOOL updateGeometry(LLDrawable *drawable); /*virtual*/ BOOL updateLOD(); diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 615ae13bc2c..ee0c36eb9a3 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -463,7 +463,7 @@ void LLVOTree::setPixelAreaAndAngle(LLAgent &agent) #endif } -void LLVOTree::updateTextures(LLAgent &agent) +void LLVOTree::updateTextures() { if (mTreeImagep) { diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h index 13817fa111d..feac9e0675e 100644 --- a/indra/newview/llvotree.h +++ b/indra/newview/llvotree.h @@ -69,7 +69,7 @@ class LLVOTree : public LLViewerObject // Graphical stuff for objects - maybe broken out into render class later? /*virtual*/ void render(LLAgent &agent); /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); - /*virtual*/ void updateTextures(LLAgent &agent); + /*virtual*/ void updateTextures(); /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline); /*virtual*/ BOOL updateGeometry(LLDrawable *drawable); diff --git a/indra/newview/llvotreenew.h b/indra/newview/llvotreenew.h index 3fec5855efe..426470101de 100644 --- a/indra/newview/llvotreenew.h +++ b/indra/newview/llvotreenew.h @@ -156,7 +156,7 @@ class LLVOTreeNew : public LLViewerObject /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); /*virtual*/ void render(LLAgent &agent); - /*virtual*/ void updateTextures(LLAgent &agent); + /*virtual*/ void updateTextures(); /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline); /*virtual*/ BOOL updateGeometry(LLDrawable *drawable); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 583246c23e8..08b342b9781 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -53,12 +53,10 @@ #include "lldrawpoolbump.h" #include "llface.h" #include "llspatialpartition.h" - -// TEMP HACK ventrella #include "llhudmanager.h" #include "llflexibleobject.h" - #include "llsky.h" +#include "lltexturefetch.h" #include "llviewercamera.h" #include "llviewertexturelist.h" #include "llviewerregion.h" @@ -75,7 +73,6 @@ const S32 MIN_QUIET_FRAMES_COALESCE = 30; const F32 FORCE_SIMPLE_RENDER_AREA = 512.f; const F32 FORCE_CULL_AREA = 8.f; const F32 MAX_LOD_DISTANCE = 24.f; -const S32 MAX_SCULPT_REZ = 128; BOOL gAnimateTextures = TRUE; @@ -100,7 +97,6 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re mRelativeXformInvTrans.setIdentity(); mLOD = MIN_LOD; - mSculptLevel = -2; mTextureAnimp = NULL; mVObjRadius = LLVector3(1,1,0.5f).length(); mNumFaces = 0; @@ -499,28 +495,32 @@ BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) return TRUE; } -void LLVOVolume::updateTextures(LLAgent &agent) +void LLVOVolume::updateTextures() { const F32 TEXTURE_AREA_REFRESH_TIME = 5.f; // seconds - if (mDrawable.notNull() && mTextureUpdateTimer.getElapsedTimeF32() > TEXTURE_AREA_REFRESH_TIME) + if (mTextureUpdateTimer.getElapsedTimeF32() > TEXTURE_AREA_REFRESH_TIME) { - if (mDrawable->isVisible()) - { - updateTextures(); - } + updateTextureVirtualSize(); } } -void LLVOVolume::updateTextures() +void LLVOVolume::updateTextureVirtualSize() { // Update the pixel area of all faces + if(mDrawable.isNull() || !mDrawable->isVisible()) + { + return ; + } + if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SIMPLE)) { return; } - - if (LLViewerTexture::sDontLoadVolumeTextures || mDrawable.isNull()) // || !mDrawable->isVisible()) + + static LLCachedControl<bool> dont_load_textures(gSavedSettings,"TextureDisable"); + + if (dont_load_textures || LLAppViewer::getTextureFetch()->mDebugPause) // || !mDrawable->isVisible()) { return; } @@ -537,14 +537,15 @@ void LLVOVolume::updateTextures() LLFace* face = mDrawable->getFace(i); const LLTextureEntry *te = face->getTextureEntry(); LLViewerTexture *imagep = face->getTexture(); - if (!imagep || !te || + if (!imagep || !te || face->mExtents[0] == face->mExtents[1]) { continue; } F32 vsize; - + F32 old_size = face->getVirtualSize(); + if (isHUDAttachment()) { F32 area = (F32) LLViewerCamera::getInstance()->getScreenPixelArea(); @@ -554,12 +555,10 @@ void LLVOVolume::updateTextures() } else { - vsize = getTextureVirtualSize(face); + vsize = face->getTextureVirtualSize(); } - mPixelArea = llmax(mPixelArea, face->getPixelArea()); - - F32 old_size = face->getVirtualSize(); + mPixelArea = llmax(mPixelArea, face->getPixelArea()); if (face->mTextureMatrix != NULL) { @@ -571,7 +570,6 @@ void LLVOVolume::updateTextures() } face->setVirtualSize(vsize); - imagep->addTextureStats(vsize); if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA)) { if (vsize < min_vsize) min_vsize = vsize; @@ -603,32 +601,44 @@ void LLVOVolume::updateTextures() mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); if (mSculptTexture.notNull()) { - S32 lod = llmin(mLOD, 3); - F32 lodf = ((F32)(lod + 1.0f)/4.f); - F32 tex_size = lodf * MAX_SCULPT_REZ; - mSculptTexture->addTextureStats(2.f * tex_size * tex_size); mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(), (S32)LLViewerTexture::BOOST_SCULPTED)); mSculptTexture->setForSculpt() ; - } - - S32 texture_discard = mSculptTexture->getDiscardLevel(); //try to match the texture - S32 current_discard = mSculptLevel; + + if(!mSculptTexture->isCachedRawImageReady()) + { + S32 lod = llmin(mLOD, 3); + F32 lodf = ((F32)(lod + 1.0f)/4.f); + F32 tex_size = lodf * LLViewerTexture::sMaxSculptRez ; + mSculptTexture->addTextureStats(2.f * tex_size * tex_size, FALSE); + + //if the sculpty very close to the view point, load first + { + LLVector3 lookAt = getPositionAgent() - LLViewerCamera::getInstance()->getOrigin(); + F32 dist = lookAt.normVec() ; + F32 cos_angle_to_view_dir = lookAt * LLViewerCamera::getInstance()->getXAxis() ; + mSculptTexture->setAdditionalDecodePriority(0.8f * LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist)) ; + } + } + + S32 texture_discard = mSculptTexture->getDiscardLevel(); //try to match the texture + S32 current_discard = getVolume() ? getVolume()->getSculptLevel() : -2 ; - if (texture_discard >= 0 && //texture has some data available - (texture_discard < current_discard || //texture has more data than last rebuild - current_discard < 0)) //no previous rebuild - { - gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE); - mSculptChanged = TRUE; - } + if (texture_discard >= 0 && //texture has some data available + (texture_discard < current_discard || //texture has more data than last rebuild + current_discard < 0)) //no previous rebuild + { + gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, FALSE); + mSculptChanged = TRUE; + } - if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SCULPTED)) + if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SCULPTED)) { setDebugText(llformat("T%d C%d V%d\n%dx%d", - texture_discard, current_discard, getVolume()->getSculptLevel(), - mSculptTexture->getHeight(), mSculptTexture->getWidth())); + texture_discard, current_discard, getVolume()->getSculptLevel(), + mSculptTexture->getHeight(), mSculptTexture->getWidth())); } + } } if (getLightTextureID().notNull()) @@ -649,10 +659,10 @@ void LLVOVolume::updateTextures() { setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize))); } - else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY)) - { - setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize))); - } + else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY)) + { + setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize))); + } else if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_FACE_AREA)) { setDebugText(llformat("%.0f:%.0f", fsqrtf(min_vsize),fsqrtf(max_vsize))); @@ -664,36 +674,6 @@ void LLVOVolume::updateTextures() } } -F32 LLVOVolume::getTextureVirtualSize(LLFace* face) -{ - //get area of circle around face - LLVector3 center = face->getPositionAgent(); - LLVector3 size = (face->mExtents[1] - face->mExtents[0]) * 0.5f; - - F32 face_area = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance()); - - face->setPixelArea(face_area); - - if (face_area <= 0) - { - return 0.f; - } - - //get area of circle in texture space - LLVector2 tdim = face->mTexExtents[1] - face->mTexExtents[0]; - F32 texel_area = (tdim * 0.5f).lengthSquared()*3.14159f; - if (texel_area <= 0) - { - // Probably animated, use default - texel_area = 1.f; - } - - //apply texel area to face area to get accurate ratio - face_area /= llclamp(texel_area, 1.f/64.f, 16.f); - - return face_area; -} - BOOL LLVOVolume::isActive() const { return !mStatic || mTextureAnimp || (mVolumeImpl && mVolumeImpl->isActive()); @@ -770,7 +750,6 @@ LLDrawable *LLVOVolume::createDrawable(LLPipeline *pipeline) return mDrawable; } - BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume) { // Check if we need to change implementations @@ -825,7 +804,6 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail { sculpt(); } - mSculptLevel = getVolume()->getSculptLevel(); } } else @@ -840,32 +818,22 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail // sculpt replaces generate() for sculpted surfaces void LLVOVolume::sculpt() -{ - U16 sculpt_height = 0; - U16 sculpt_width = 0; - S8 sculpt_components = 0; - const U8* sculpt_data = NULL; - +{ if (mSculptTexture.notNull()) - { - S32 discard_level; - S32 desired_discard = 0; // lower discard levels have MUCH less resolution - - discard_level = desired_discard; + { + U16 sculpt_height = 0; + U16 sculpt_width = 0; + S8 sculpt_components = 0; + const U8* sculpt_data = NULL; + + S32 discard_level = mSculptTexture->getDiscardLevel() ; + LLImageRaw* raw_image = mSculptTexture->getCachedRawImage() ; S32 max_discard = mSculptTexture->getMaxDiscardLevel(); if (discard_level > max_discard) discard_level = max_discard; // clamp to the best we can do - S32 best_discard = mSculptTexture->getDiscardLevel(); - if (discard_level < best_discard) - discard_level = best_discard; // clamp to what we have - - if (best_discard == -1) - discard_level = -1; // and if we have nothing, set to nothing - - - S32 current_discard = getVolume()->getSculptLevel(); + S32 current_discard = getVolume()->getSculptLevel() ; if(current_discard < -2) { llwarns << "WARNING!!: Current discard of sculpty at " << current_discard @@ -886,18 +854,7 @@ void LLVOVolume::sculpt() if (current_discard == discard_level) // no work to do here return; - LLPointer<LLImageRaw> raw_image = new LLImageRaw(); - BOOL is_valid = mSculptTexture->readBackRaw(discard_level, raw_image, FALSE); - - sculpt_height = raw_image->getHeight(); - sculpt_width = raw_image->getWidth(); - sculpt_components = raw_image->getComponents(); - - if(is_valid) - { - is_valid = mSculptTexture->isValidForSculpt(discard_level, sculpt_width, sculpt_height, sculpt_components) ; - } - if(!is_valid) + if(!raw_image) { sculpt_width = 0; sculpt_height = 0; @@ -909,10 +866,10 @@ void LLVOVolume::sculpt() } } else - { - if (raw_image->getDataSize() < sculpt_height * sculpt_width * sculpt_components) - llerrs << "Sculpt: image data size = " << raw_image->getDataSize() - << " < " << sculpt_height << " x " << sculpt_width << " x " <<sculpt_components << llendl; + { + sculpt_height = raw_image->getHeight(); + sculpt_width = raw_image->getWidth(); + sculpt_components = raw_image->getComponents(); sculpt_data = raw_image->getData(); @@ -948,12 +905,6 @@ BOOL LLVOVolume::calcLOD() return FALSE; } - //update face texture sizes on lod calculation - //if (mDrawable->isVisible()) - //{ - // updateTextures(); - //} - S32 cur_detail = 0; F32 radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length(); @@ -2608,7 +2559,7 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e if (face == -1) { start_face = 0; - end_face = volume->getNumFaces(); + end_face = volume->getNumVolumeFaces(); } else { @@ -2623,8 +2574,8 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e if (face_hit >= 0 && mDrawable->getNumFaces() > face_hit) { - LLFace* face = mDrawable->getFace(face_hit); - + LLFace* face = mDrawable->getFace(face_hit); + if (pick_transparent || !face->getTexture() || !face->getTexture()->hasGLTexture() || face->getTexture()->getMask(face->surfaceToTexture(tc, p, n))) { v_end = p; @@ -2870,7 +2821,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) LLVOVolume* vobj = drawablep->getVOVolume(); llassert_always(vobj); - vobj->updateTextures(); + vobj->updateTextureVirtualSize(); vobj->preRebuild(); drawablep->clearState(LLDrawable::HAS_ALPHA); diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 250c3ed9170..6d90de2a6f9 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -139,7 +139,7 @@ class LLVOVolume : public LLViewerObject BOOL getVolumeChanged() const { return mVolumeChanged; } - F32 getTextureVirtualSize(LLFace* face); + /*virtual*/ F32 getRadius() const { return mVObjRadius; }; const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const; @@ -187,8 +187,8 @@ class LLVOVolume : public LLViewerObject /*virtual*/ void updateFaceSize(S32 idx); /*virtual*/ BOOL updateLOD(); void updateRadius(); - /*virtual*/ void updateTextures(LLAgent &agent); - void updateTextures(); + /*virtual*/ void updateTextures(); + void updateTextureVirtualSize(); void updateFaceFlags(); void regenFaces(); @@ -267,7 +267,6 @@ class LLVOVolume : public LLViewerObject LLFrameTimer mTextureUpdateTimer; S32 mLOD; BOOL mLODChanged; - S32 mSculptLevel; BOOL mSculptChanged; F32 mSpotLightPriority; LLMatrix4 mRelativeXform; diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index 0c967f9020c..e5ff62746e3 100644 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -100,7 +100,7 @@ void LLVOWater::setPixelAreaAndAngle(LLAgent &agent) // virtual -void LLVOWater::updateTextures(LLAgent &agent) +void LLVOWater::updateTextures() { } diff --git a/indra/newview/llvowater.h b/indra/newview/llvowater.h index 28a5633c58e..3cc031e589a 100644 --- a/indra/newview/llvowater.h +++ b/indra/newview/llvowater.h @@ -68,7 +68,7 @@ class LLVOWater : public LLStaticViewerObject /*virtual*/ BOOL updateGeometry(LLDrawable *drawable); /*virtual*/ void updateSpatialExtents(LLVector3& newMin, LLVector3& newMax); - /*virtual*/ void updateTextures(LLAgent &agent); + /*virtual*/ void updateTextures(); /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); // generate accurate apparent angle and area virtual U32 getPartitionType() const; diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index da62223aac2..9bde85dcaf8 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -69,6 +69,11 @@ struct LLWearableArrivedData // LLWearableList LLWearableList::~LLWearableList() +{ + llassert_always(mList.empty()) ; +} + +void LLWearableList::cleanup() { for_each(mList.begin(), mList.end(), DeletePairedPointer()); mList.clear(); diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h index e5155c66a4b..cf1a9bddff6 100644 --- a/indra/newview/llwearablelist.h +++ b/indra/newview/llwearablelist.h @@ -44,6 +44,7 @@ class LLWearableList : public LLSingleton<LLWearableList> public: LLWearableList() {} ~LLWearableList(); + void cleanup() ; S32 getLength() const { return mList.size(); } diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 829d631473b..5e83ab8c3c1 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -34,58 +34,82 @@ #include "llworldmap.h" -#include "llregionhandle.h" +#include "llworldmapmessage.h" #include "message.h" - #include "llappviewer.h" // for gPacificDaylightTime -#include "llagent.h" -#include "llmapresponders.h" -#include "llviewercontrol.h" -#include "llfloaterworldmap.h" #include "lltracker.h" #include "llviewertexturelist.h" -#include "llviewerregion.h" -#include "llregionflags.h" #include "lltrans.h" -const F32 REQUEST_ITEMS_TIMER = 10.f * 60.f; // 10 minutes +// Timers to temporise database requests +const F32 AGENTS_UPDATE_TIMER = 60.0; // Seconds between 2 agent requests for a region +const F32 REQUEST_ITEMS_TIMER = 10.f * 60.f; // Seconds before we consider re-requesting item data for the grid + +//--------------------------------------------------------------------------- +// LLItemInfo +//--------------------------------------------------------------------------- -// For DEV-17507, do lazy image loading in llworldmapview.cpp instead, -// limiting requests to currently visible regions and minimizing the -// number of textures being requested simultaneously. -// -// Uncomment IMMEDIATE_IMAGE_LOAD to restore the old behavior -// -//#define IMMEDIATE_IMAGE_LOAD LLItemInfo::LLItemInfo(F32 global_x, F32 global_y, const std::string& name, - LLUUID id, - S32 extra, S32 extra2) + LLUUID id) : mName(name), mToolTip(""), mPosGlobal(global_x, global_y, 40.0), mID(id), - mSelected(FALSE), - mExtra(extra), - mExtra2(extra2) + mCount(1) +// mSelected(false) +// mColor() { - mRegionHandle = to_region_handle(mPosGlobal); } -LLSimInfo::LLSimInfo() -: mHandle(0), +//--------------------------------------------------------------------------- +// LLSimInfo +//--------------------------------------------------------------------------- + +LLSimInfo::LLSimInfo(U64 handle) +: mHandle(handle), mName(), mAgentsUpdateTime(0), - mShowAgentLocations(FALSE), mAccess(0x0), mRegionFlags(0x0), - mWaterHeight(0.f), - mAlpha(-1.f) + mFirstAgentRequest(true) +// mWaterHeight(0.f) +{ +} + +void LLSimInfo::setLandForSaleImage (LLUUID image_id) { + mMapImageID = image_id; + + // Fetch the image + if (mMapImageID.notNull()) + { + mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP); + } + else + { + mOverlayImage = NULL; + } } +LLPointer<LLViewerFetchedTexture> LLSimInfo::getLandForSaleImage () +{ + if (mOverlayImage.isNull() && mMapImageID.notNull()) + { + // Fetch the image if it hasn't been done yet (unlikely but...) + mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP); + } + if (!mOverlayImage.isNull()) + { + // Boost the fetch level when we try to access that image + mOverlayImage->setBoostLevel(LLViewerTexture::BOOST_MAP); + } + return mOverlayImage; +} -LLVector3d LLSimInfo::getGlobalPos(LLVector3 local_pos) const +LLVector3d LLSimInfo::getGlobalPos(const LLVector3& local_pos) const { LLVector3d pos = from_region_handle(mHandle); pos.mdV[VX] += local_pos.mV[VX]; @@ -94,128 +118,184 @@ LLVector3d LLSimInfo::getGlobalPos(LLVector3 local_pos) const return pos; } +LLVector3d LLSimInfo::getGlobalOrigin() const +{ + return from_region_handle(mHandle); +} LLVector3 LLSimInfo::getLocalPos(LLVector3d global_pos) const { LLVector3d sim_origin = from_region_handle(mHandle); return LLVector3(global_pos - sim_origin); } +void LLSimInfo::clearImage() +{ + if (!mOverlayImage.isNull()) + { + mOverlayImage->setBoostLevel(0); + mOverlayImage = NULL; + } +} - -//--------------------------------------------------------------------------- -// World Map -//--------------------------------------------------------------------------- - -LLWorldMap::LLWorldMap() : - mIsTrackingUnknownLocation( FALSE ), - mInvalidLocation( FALSE ), - mIsTrackingDoubleClick( FALSE ), - mIsTrackingCommit( FALSE ), - mUnknownLocation( 0, 0, 0 ), - mRequestLandForSale(true), - mCurrentMap(0), - mMinX(U32_MAX), - mMaxX(U32_MIN), - mMinY(U32_MAX), - mMaxY(U32_MIN), - mNeighborMap(NULL), - mTelehubCoverageMap(NULL), - mNeighborMapWidth(0), - mNeighborMapHeight(0), - mSLURLRegionName(), - mSLURLRegionHandle(0), - mSLURL(), - mSLURLCallback(0), - mSLURLTeleport(false) -{ - for (S32 map=0; map<MAP_SIM_IMAGE_TYPES; ++map) +void LLSimInfo::dropImagePriority() +{ + if (!mOverlayImage.isNull()) { - mMapLoaded[map] = FALSE; - mMapBlockLoaded[map] = new BOOL[MAP_BLOCK_RES*MAP_BLOCK_RES]; - for (S32 idx=0; idx<MAP_BLOCK_RES*MAP_BLOCK_RES; ++idx) - { - mMapBlockLoaded[map][idx] = FALSE; - } + mOverlayImage->setBoostLevel(0); } } +// Update the agent count for that region +void LLSimInfo::updateAgentCount(F64 time) +{ + if ((time - mAgentsUpdateTime > AGENTS_UPDATE_TIMER) || mFirstAgentRequest) + { + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_AGENT_LOCATIONS, mHandle); + mAgentsUpdateTime = time; + mFirstAgentRequest = false; + } +} -LLWorldMap::~LLWorldMap() +// Get the total agents count +const S32 LLSimInfo::getAgentCount() const { - reset(); - for (S32 map=0; map<MAP_SIM_IMAGE_TYPES; ++map) + S32 total_agent_count = 0; + for (LLSimInfo::item_info_list_t::const_iterator it = mAgentLocations.begin(); it != mAgentLocations.end(); ++it) { - delete[] mMapBlockLoaded[map]; + total_agent_count += it->getCount(); } + return total_agent_count; } +bool LLSimInfo::isName(const std::string& name) const +{ + return (LLStringUtil::compareInsensitive(name, mName) == 0); +} -void LLWorldMap::reset() +void LLSimInfo::dump() const { - for_each(mSimInfoMap.begin(), mSimInfoMap.end(), DeletePairedPointer()); - mSimInfoMap.clear(); + U32 x_pos, y_pos; + from_region_handle(mHandle, &x_pos, &y_pos); + + LL_INFOS("World Map") << x_pos << "," << y_pos + << " " << mName + << " " << (S32)mAccess + << " " << std::hex << mRegionFlags << std::dec +// << " " << mWaterHeight + << LL_ENDL; +} + +void LLSimInfo::clearItems() +{ + mTelehubs.clear(); + mInfohubs.clear(); + mPGEvents.clear(); + mMatureEvents.clear(); + mAdultEvents.clear(); + mLandForSale.clear(); + mLandForSaleAdult.clear(); +// We persist the agent count though as it is updated on a frequent basis +// mAgentLocations.clear(); +} + +void LLSimInfo::insertAgentLocation(const LLItemInfo& item) +{ + std::string name = item.getName(); - for (S32 m=0; m<MAP_SIM_IMAGE_TYPES; ++m) + // Find the last item in the list with a different name and erase them + item_info_list_t::iterator lastiter; + for (lastiter = mAgentLocations.begin(); lastiter != mAgentLocations.end(); ++lastiter) + { + LLItemInfo& info = *lastiter; + if (info.isName(name)) + { + break; + } + } + if (lastiter != mAgentLocations.begin()) { - mMapLoaded[m] = FALSE; + mAgentLocations.erase(mAgentLocations.begin(), lastiter); } + // Now append the new location + mAgentLocations.push_back(item); +} + +//--------------------------------------------------------------------------- +// World Map +//--------------------------------------------------------------------------- + +LLWorldMap::LLWorldMap() : + mIsTrackingLocation( false ), + mIsTrackingFound( false ), + mIsInvalidLocation( false ), + mIsTrackingDoubleClick( false ), + mIsTrackingCommit( false ), + mTrackingLocation( 0, 0, 0 ), + mFirstRequest(true) +{ + //LL_INFOS("World Map") << "Creating the World Map -> LLWorldMap::LLWorldMap()" << LL_ENDL; + mMapBlockLoaded = new bool[MAP_BLOCK_RES*MAP_BLOCK_RES]; clearSimFlags(); - - eraseItems(); +} - mMinX = U32_MAX; - mMaxX = U32_MIN; - mMinY = U32_MAX; - mMaxY = U32_MIN; +LLWorldMap::~LLWorldMap() +{ + //LL_INFOS("World Map") << "Destroying the World Map -> LLWorldMap::~LLWorldMap()" << LL_ENDL; + reset(); + delete[] mMapBlockLoaded; +} - delete [] mNeighborMap; - mNeighborMap = NULL; - delete [] mTelehubCoverageMap; - mTelehubCoverageMap = NULL; - mNeighborMapWidth = 0; - mNeighborMapHeight = 0; +void LLWorldMap::reset() +{ + clearItems(true); // Clear the items lists + clearImageRefs(); // Clear the world mipmap and the land for sale tiles + clearSimFlags(); // Clear the block info flags array - for (S32 i=0; i<MAP_SIM_IMAGE_TYPES; i++) - { - mMapLayers[i].clear(); - } + // Finally, clear the region map itself + for_each(mSimInfoMap.begin(), mSimInfoMap.end(), DeletePairedPointer()); + mSimInfoMap.clear(); } -void LLWorldMap::eraseItems() +// Returns true if the items have been cleared +bool LLWorldMap::clearItems(bool force) { - if (mRequestTimer.getElapsedTimeF32() > REQUEST_ITEMS_TIMER) + bool clear = false; + if ((mRequestTimer.getElapsedTimeF32() > REQUEST_ITEMS_TIMER) || mFirstRequest || force) { mRequestTimer.reset(); - mTelehubs.clear(); - mInfohubs.clear(); - mPGEvents.clear(); - mMatureEvents.clear(); - mAdultEvents.clear(); - mLandForSale.clear(); + LLSimInfo* sim_info = NULL; + for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) + { + sim_info = it->second; + if (sim_info) + { + sim_info->clearItems(); + } + } + clear = true; + mFirstRequest = false; } -// mAgentLocationsMap.clear(); // persists -// mNumAgents.clear(); // persists + return clear; } - void LLWorldMap::clearImageRefs() { + // We clear the reference to the images we're holding. + // Images hold by the world mipmap first + mWorldMipmap.reset(); + + // Images hold by the region map + LLSimInfo* sim_info = NULL; for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) { - LLSimInfo* info = (*it).second; - if (info->mCurrentImage) - { - info->mCurrentImage->setBoostLevel(0); - info->mCurrentImage = NULL; - } - if (info->mOverlayImage) + sim_info = it->second; + if (sim_info) { - info->mOverlayImage->setBoostLevel(0); - info->mOverlayImage = NULL; + sim_info->clearImage(); } } } @@ -223,15 +303,25 @@ void LLWorldMap::clearImageRefs() // Doesn't clear the already-loaded sim infos, just re-requests them void LLWorldMap::clearSimFlags() { - for (S32 map=0; map<MAP_SIM_IMAGE_TYPES; ++map) + for (S32 idx=0; idx<MAP_BLOCK_RES*MAP_BLOCK_RES; ++idx) { - for (S32 idx=0; idx<MAP_BLOCK_RES*MAP_BLOCK_RES; ++idx) - { - mMapBlockLoaded[map][idx] = FALSE; - } + mMapBlockLoaded[idx] = false; } } +LLSimInfo* LLWorldMap::createSimInfoFromHandle(const U64 handle) +{ + LLSimInfo* sim_info = new LLSimInfo(handle); + mSimInfoMap[handle] = sim_info; + return sim_info; +} + +void LLWorldMap::equalizeBoostLevels() +{ + mWorldMipmap.equalizeBoostLevels(); + return; +} + LLSimInfo* LLWorldMap::simInfoFromPosGlobal(const LLVector3d& pos_global) { U64 handle = to_region_handle(pos_global); @@ -243,11 +333,7 @@ LLSimInfo* LLWorldMap::simInfoFromHandle(const U64 handle) sim_info_map_t::iterator it = mSimInfoMap.find(handle); if (it != mSimInfoMap.end()) { - LLSimInfo* sim_info = (*it).second; - if (sim_info) - { - return sim_info; - } + return it->second; } return NULL; } @@ -258,762 +344,272 @@ LLSimInfo* LLWorldMap::simInfoFromName(const std::string& sim_name) LLSimInfo* sim_info = NULL; if (!sim_name.empty()) { - for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) + // Iterate through the entire sim info map and compare the name + sim_info_map_t::iterator it; + for (it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) { - sim_info = (*it).second; - if (sim_info - && (0 == LLStringUtil::compareInsensitive(sim_name, sim_info->mName)) ) + sim_info = it->second; + if (sim_info && sim_info->isName(sim_name) ) { + // break out of loop if success break; } - sim_info = NULL; } + // If we got to the end, we haven't found the sim. Reset the ouput value to NULL. + if (it == mSimInfoMap.end()) + sim_info = NULL; } return sim_info; } bool LLWorldMap::simNameFromPosGlobal(const LLVector3d& pos_global, std::string & outSimName ) { - bool gotSimName = true; + LLSimInfo* sim_info = simInfoFromPosGlobal(pos_global); - U64 handle = to_region_handle(pos_global); - - sim_info_map_t::iterator it = mSimInfoMap.find(handle); - if (it != mSimInfoMap.end()) + if (sim_info) { - LLSimInfo* info = (*it).second; - outSimName = info->mName; + outSimName = sim_info->getName(); } else { - gotSimName = false; outSimName = "(unknown region)"; } - return gotSimName; + return (sim_info != NULL); } -void LLWorldMap::setCurrentLayer(S32 layer, bool request_layer) +void LLWorldMap::reloadItems(bool force) { - mCurrentMap = layer; - if (!mMapLoaded[layer] || request_layer) + //LL_INFOS("World Map") << "LLWorldMap::reloadItems()" << LL_ENDL; + if (clearItems(force)) { - sendMapLayerRequest(); + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_TELEHUB); + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_PG_EVENT); + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_MATURE_EVENT); + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_ADULT_EVENT); + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_LAND_FOR_SALE); } - - if (mTelehubs.size() == 0 || - mInfohubs.size() == 0) - { - // Request for telehubs - sendItemRequest(MAP_ITEM_TELEHUB); - } - - if (mPGEvents.size() == 0) - { - // Request for events - sendItemRequest(MAP_ITEM_PG_EVENT); - } - - if (mMatureEvents.size() == 0) - { - // Request for events (mature) - sendItemRequest(MAP_ITEM_MATURE_EVENT); - } - - if (mAdultEvents.size() == 0) - { - // Request for events (adult) - sendItemRequest(MAP_ITEM_ADULT_EVENT); - } - - if (mLandForSale.size() == 0) - { - // Request for Land For Sale - sendItemRequest(MAP_ITEM_LAND_FOR_SALE); - } - - if (mLandForSaleAdult.size() == 0) - { - // Request for Land For Sale - sendItemRequest(MAP_ITEM_LAND_FOR_SALE_ADULT); - } - - clearImageRefs(); - clearSimFlags(); } -void LLWorldMap::sendItemRequest(U32 type, U64 handle) +// static public +// Insert a region in the region map +// returns true if region inserted, false otherwise +bool LLWorldMap::insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& image_id, U32 accesscode, U32 region_flags) { - LLMessageSystem* msg = gMessageSystem; - S32 layer = mCurrentMap; - - msg->newMessageFast(_PREHASH_MapItemRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addU32Fast(_PREHASH_Flags, layer); - msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim - msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim - - msg->nextBlockFast(_PREHASH_RequestData); - msg->addU32Fast(_PREHASH_ItemType, type); - msg->addU64Fast(_PREHASH_RegionHandle, handle); // If zero, filled in on sim - - gAgent.sendReliableMessage(); -} - -// public -void LLWorldMap::sendMapLayerRequest() -{ - if (!gAgent.getRegion()) return; - - LLSD body; - body["Flags"] = mCurrentMap; - std::string url = gAgent.getRegion()->getCapability( - gAgent.isGodlike() ? "MapLayerGod" : "MapLayer"); - - if (!url.empty()) + // This region doesn't exist + if (accesscode == 255) { - llinfos << "LLWorldMap::sendMapLayerRequest via capability" << llendl; - LLHTTPClient::post(url, body, new LLMapLayerResponder()); + // Checks if the track point is in it and invalidates it if it is + if (LLWorldMap::getInstance()->isTrackingInRectangle( x_world, y_world, x_world + REGION_WIDTH_UNITS, y_world + REGION_WIDTH_UNITS)) + { + LLWorldMap::getInstance()->setTrackingInvalid(); + } + // return failure to insert + return false; } else { - llinfos << "LLWorldMap::sendMapLayerRequest via message system" << llendl; - LLMessageSystem* msg = gMessageSystem; - S32 layer = mCurrentMap; - - // Request for layer - msg->newMessageFast(_PREHASH_MapLayerRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addU32Fast(_PREHASH_Flags, layer); - msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim - msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim - gAgent.sendReliableMessage(); - - if (mRequestLandForSale) + U64 handle = to_region_handle(x_world, y_world); + //LL_INFOS("World Map") << "Map sim : " << name << ", ID : " << image_id.getString() << LL_ENDL; + // Insert the region in the region map of the world map + // Loading the LLSimInfo object with what we got and insert it in the map + LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); + if (siminfo == NULL) { - msg->newMessageFast(_PREHASH_MapLayerRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addU32Fast(_PREHASH_Flags, 2); - msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim - msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim - gAgent.sendReliableMessage(); + siminfo = LLWorldMap::getInstance()->createSimInfoFromHandle(handle); } + siminfo->setName(name); + siminfo->setAccess(accesscode); + siminfo->setRegionFlags(region_flags); + // siminfo->setWaterHeight((F32) water_height); + siminfo->setLandForSaleImage(image_id); + + // Handle the location tracking (for teleport, UI feedback and info display) + if (LLWorldMap::getInstance()->isTrackingInRectangle( x_world, y_world, x_world + REGION_WIDTH_UNITS, y_world + REGION_WIDTH_UNITS)) + { + if (siminfo->isDown()) + { + // We were tracking this location, but it's no available + LLWorldMap::getInstance()->setTrackingInvalid(); + } + else + { + // We were tracking this location, and it does exist and is available + LLWorldMap::getInstance()->setTrackingValid(); + } + } + // return insert region success + return true; } } -// public -void LLWorldMap::sendNamedRegionRequest(std::string region_name) -{ - LLMessageSystem* msg = gMessageSystem; - S32 layer = mCurrentMap; - - // Request for layer - msg->newMessageFast(_PREHASH_MapNameRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addU32Fast(_PREHASH_Flags, layer); - msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim - msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim - msg->nextBlockFast(_PREHASH_NameData); - msg->addStringFast(_PREHASH_Name, region_name); - gAgent.sendReliableMessage(); -} -// public -void LLWorldMap::sendNamedRegionRequest(std::string region_name, - url_callback_t callback, - const std::string& callback_url, - bool teleport) // immediately teleport when result returned -{ - mSLURLRegionName = region_name; - mSLURLRegionHandle = 0; - mSLURL = callback_url; - mSLURLCallback = callback; - mSLURLTeleport = teleport; - - sendNamedRegionRequest(region_name); -} - -void LLWorldMap::sendHandleRegionRequest(U64 region_handle, - url_callback_t callback, - const std::string& callback_url, - bool teleport) // immediately teleport when result returned -{ - mSLURLRegionName.clear(); - mSLURLRegionHandle = region_handle; - mSLURL = callback_url; - mSLURLCallback = callback; - mSLURLTeleport = teleport; - - U32 global_x; - U32 global_y; - from_region_handle(region_handle, &global_x, &global_y); - U16 grid_x = (U16)(global_x / REGION_WIDTH_UNITS); - U16 grid_y = (U16)(global_y / REGION_WIDTH_UNITS); - - sendMapBlockRequest(grid_x, grid_y, grid_x, grid_y, true); -} - -// public -void LLWorldMap::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent) -{ - S32 layer = mCurrentMap; - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_MapBlockRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - U32 flags = layer; - flags |= (return_nonexistent ? 0x10000 : 0); - msg->addU32Fast(_PREHASH_Flags, flags); - msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim - msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim - msg->nextBlockFast(_PREHASH_PositionData); - msg->addU16Fast(_PREHASH_MinX, min_x); - msg->addU16Fast(_PREHASH_MinY, min_y); - msg->addU16Fast(_PREHASH_MaxX, max_x); - msg->addU16Fast(_PREHASH_MaxY, max_y); - gAgent.sendReliableMessage(); - - if (mRequestLandForSale) - { - msg->newMessageFast(_PREHASH_MapBlockRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addU32Fast(_PREHASH_Flags, 2); - msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim - msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim - msg->nextBlockFast(_PREHASH_PositionData); - msg->addU16Fast(_PREHASH_MinX, min_x); - msg->addU16Fast(_PREHASH_MinY, min_y); - msg->addU16Fast(_PREHASH_MaxX, max_x); - msg->addU16Fast(_PREHASH_MaxY, max_y); - gAgent.sendReliableMessage(); - } -} - -// public static -void LLWorldMap::processMapLayerReply(LLMessageSystem* msg, void**) +// static public +// Insert an item in the relevant region map +// returns true if item inserted, false otherwise +bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 type, S32 extra, S32 extra2) { - llinfos << "LLWorldMap::processMapLayerReply from message system" << llendl; - - U32 agent_flags; - msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags); - - if (agent_flags != (U32)LLWorldMap::getInstance()->mCurrentMap) - { - llwarns << "Invalid or out of date map image type returned!" << llendl; - return; - } - - LLUUID image_id; - //U32 left, right, top, bottom; - - S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_LayerData); - - LLWorldMap::getInstance()->mMapLayers[agent_flags].clear(); - - BOOL adjust = FALSE; - for (S32 block=0; block<num_blocks; ++block) - { - LLWorldMapLayer new_layer; - new_layer.LayerDefined = TRUE; - msg->getUUIDFast(_PREHASH_LayerData, _PREHASH_ImageID, new_layer.LayerImageID, block); - new_layer.LayerImage = LLViewerTextureManager::getFetchedTexture(new_layer.LayerImageID, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); - - gGL.getTexUnit(0)->bind(new_layer.LayerImage); - new_layer.LayerImage->setAddressMode(LLTexUnit::TAM_CLAMP); - - U32 left, right, top, bottom; - msg->getU32Fast(_PREHASH_LayerData, _PREHASH_Left, left, block); - msg->getU32Fast(_PREHASH_LayerData, _PREHASH_Right, right, block); - msg->getU32Fast(_PREHASH_LayerData, _PREHASH_Top, top, block); - msg->getU32Fast(_PREHASH_LayerData, _PREHASH_Bottom, bottom, block); - - new_layer.LayerExtents.mLeft = left; - new_layer.LayerExtents.mRight = right; - new_layer.LayerExtents.mBottom = bottom; - new_layer.LayerExtents.mTop = top; - - F32 x_meters = F32(left*REGION_WIDTH_UNITS); - F32 y_meters = F32(bottom*REGION_WIDTH_UNITS); - adjust = LLWorldMap::getInstance()->extendAABB(U32(x_meters), U32(y_meters), - U32(x_meters+REGION_WIDTH_UNITS*new_layer.LayerExtents.getWidth()), - U32(y_meters+REGION_WIDTH_UNITS*new_layer.LayerExtents.getHeight())) || adjust; - - LLWorldMap::getInstance()->mMapLayers[agent_flags].push_back(new_layer); - } - - LLWorldMap::getInstance()->mMapLoaded[agent_flags] = TRUE; - if(adjust) gFloaterWorldMap->adjustZoomSliderBounds(); -} + // Create an item record for the received object + LLItemInfo new_item((F32)x_world, (F32)y_world, name, uuid); -// public static -void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**) -{ - U32 agent_flags; - msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags); + // Compute a region handle based on the objects coordinates + LLVector3d pos((F32)x_world, (F32)y_world, 40.0); + U64 handle = to_region_handle(pos); - if ((S32)agent_flags < 0 || agent_flags >= MAP_SIM_IMAGE_TYPES) + // Get the region record for that handle or NULL if we haven't browsed it yet + LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); + if (siminfo == NULL) { - llwarns << "Invalid map image type returned! " << agent_flags << llendl; - return; + siminfo = LLWorldMap::getInstance()->createSimInfoFromHandle(handle); } - S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data); - - bool found_null_sim = false; - - BOOL adjust = FALSE; - for (S32 block=0; block<num_blocks; ++block) + //LL_INFOS("World Map") << "Process item : type = " << type << LL_ENDL; + switch (type) { - U16 x_regions; - U16 y_regions; - std::string name; - U8 accesscode; - U32 region_flags; - U8 water_height; - U8 agents; - LLUUID image_id; - msg->getU16Fast(_PREHASH_Data, _PREHASH_X, x_regions, block); - msg->getU16Fast(_PREHASH_Data, _PREHASH_Y, y_regions, block); - msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block); - msg->getU8Fast(_PREHASH_Data, _PREHASH_Access, accesscode, block); - msg->getU32Fast(_PREHASH_Data, _PREHASH_RegionFlags, region_flags, block); - msg->getU8Fast(_PREHASH_Data, _PREHASH_WaterHeight, water_height, block); - msg->getU8Fast(_PREHASH_Data, _PREHASH_Agents, agents, block); - msg->getUUIDFast(_PREHASH_Data, _PREHASH_MapImageID, image_id, block); - - U32 x_meters = x_regions * REGION_WIDTH_UNITS; - U32 y_meters = y_regions * REGION_WIDTH_UNITS; - - U64 handle = to_region_handle(x_meters, y_meters); - - if (accesscode == 255) - { - // This region doesn't exist - if (LLWorldMap::getInstance()->mIsTrackingUnknownLocation && - LLWorldMap::getInstance()->mUnknownLocation.mdV[0] >= x_meters && - LLWorldMap::getInstance()->mUnknownLocation.mdV[0] < x_meters + 256 && - LLWorldMap::getInstance()->mUnknownLocation.mdV[1] >= y_meters && - LLWorldMap::getInstance()->mUnknownLocation.mdV[1] < y_meters + 256) - { - // We were tracking this location, but it doesn't exist - LLWorldMap::getInstance()->mInvalidLocation = TRUE; - } - - found_null_sim = true; - } - else + case MAP_ITEM_TELEHUB: // telehubs { - adjust = LLWorldMap::getInstance()->extendAABB(x_meters, - y_meters, - x_meters+REGION_WIDTH_UNITS, - y_meters+REGION_WIDTH_UNITS) || adjust; - -// llinfos << "Map sim " << name << " image layer " << agent_flags << " ID " << image_id.getString() << llendl; - - LLSimInfo* siminfo = new LLSimInfo(); - sim_info_map_t::iterator iter = LLWorldMap::getInstance()->mSimInfoMap.find(handle); - if (iter != LLWorldMap::getInstance()->mSimInfoMap.end()) - { - LLSimInfo* oldinfo = iter->second; - for (S32 image=0; image<MAP_SIM_IMAGE_TYPES; ++image) - { - siminfo->mMapImageID[image] = oldinfo->mMapImageID[image]; - } - delete oldinfo; - } - LLWorldMap::getInstance()->mSimInfoMap[handle] = siminfo; - - siminfo->mHandle = handle; - siminfo->mName.assign( name ); - siminfo->mAccess = accesscode; - siminfo->mRegionFlags = region_flags; - siminfo->mWaterHeight = (F32) water_height; - siminfo->mMapImageID[agent_flags] = image_id; - -#ifdef IMMEDIATE_IMAGE_LOAD - siminfo->mCurrentImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); - siminfo->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP); -#endif + /* Merov: we are not using the hub color anymore for display so commenting that out + // Telehub color + U32 X = x_world / REGION_WIDTH_UNITS; + U32 Y = y_world / REGION_WIDTH_UNITS; + F32 red = fmod((F32)X * 0.11f, 1.f) * 0.8f; + F32 green = fmod((F32)Y * 0.11f, 1.f) * 0.8f; + F32 blue = fmod(1.5f * (F32)(X + Y) * 0.11f, 1.f) * 0.8f; + F32 add_amt = (X % 2) ? 0.15f : -0.15f; + add_amt += (Y % 2) ? -0.15f : 0.15f; + LLColor4 color(red + add_amt, green + add_amt, blue + add_amt); + new_item.setColor(color); + */ - if (siminfo->mMapImageID[2].notNull()) + // extra2 specifies whether this is an infohub or a telehub. + if (extra2) { -#ifdef IMMEDIATE_IMAGE_LOAD - siminfo->mOverlayImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[2], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); -#endif + siminfo->insertInfoHub(new_item); } else { - siminfo->mOverlayImage = NULL; - } - - if (LLWorldMap::getInstance()->mIsTrackingUnknownLocation && - LLWorldMap::getInstance()->mUnknownLocation.mdV[0] >= x_meters && - LLWorldMap::getInstance()->mUnknownLocation.mdV[0] < x_meters + 256 && - LLWorldMap::getInstance()->mUnknownLocation.mdV[1] >= y_meters && - LLWorldMap::getInstance()->mUnknownLocation.mdV[1] < y_meters + 256) - { - if (siminfo->mAccess == SIM_ACCESS_DOWN) - { - // We were tracking this location, but it doesn't exist - LLWorldMap::getInstance()->mInvalidLocation = true; - } - else - { - // We were tracking this location, and it does exist - bool is_tracking_dbl = LLWorldMap::getInstance()->mIsTrackingDoubleClick == TRUE; - gFloaterWorldMap->trackLocation(LLWorldMap::getInstance()->mUnknownLocation); - if (is_tracking_dbl) - { - LLVector3d pos_global = LLTracker::getTrackedPositionGlobal(); - gAgent.teleportViaLocation( pos_global ); - } - } + siminfo->insertTeleHub(new_item); } + break; } - - if(LLWorldMap::getInstance()->mSLURLCallback != NULL) + case MAP_ITEM_PG_EVENT: // events + case MAP_ITEM_MATURE_EVENT: + case MAP_ITEM_ADULT_EVENT: { - // Server returns definitive capitalization, SLURL might not have that. - if ((LLStringUtil::compareInsensitive(LLWorldMap::getInstance()->mSLURLRegionName, name)==0) - || (LLWorldMap::getInstance()->mSLURLRegionHandle == handle)) + std::string timeStr = "["+ LLTrans::getString ("TimeHour")+"]:[" + +LLTrans::getString ("TimeMin")+"] [" + +LLTrans::getString ("TimeAMPM")+"]"; + LLSD substitution; + substitution["datetime"] = (S32) extra; + LLStringUtil::format (timeStr, substitution); + new_item.setTooltip(timeStr); + + // HACK: store Z in extra2 + new_item.setElevation((F64)extra2); + if (type == MAP_ITEM_PG_EVENT) { - url_callback_t callback = LLWorldMap::getInstance()->mSLURLCallback; - - LLWorldMap::getInstance()->mSLURLCallback = NULL; - LLWorldMap::getInstance()->mSLURLRegionName.clear(); - LLWorldMap::getInstance()->mSLURLRegionHandle = 0; - - callback(handle, LLWorldMap::getInstance()->mSLURL, image_id, LLWorldMap::getInstance()->mSLURLTeleport); + siminfo->insertPGEvent(new_item); } - } - } - - if(adjust) gFloaterWorldMap->adjustZoomSliderBounds(); - gFloaterWorldMap->updateSims(found_null_sim); -} - -// public static -void LLWorldMap::processMapItemReply(LLMessageSystem* msg, void**) -{ - U32 type; - msg->getU32Fast(_PREHASH_RequestData, _PREHASH_ItemType, type); - - S32 num_blocks = msg->getNumberOfBlocks("Data"); - - for (S32 block=0; block<num_blocks; ++block) - { - U32 X, Y; - std::string name; - S32 extra, extra2; - LLUUID uuid; - msg->getU32Fast(_PREHASH_Data, _PREHASH_X, X, block); - msg->getU32Fast(_PREHASH_Data, _PREHASH_Y, Y, block); - msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block); - msg->getUUIDFast(_PREHASH_Data, _PREHASH_ID, uuid, block); - msg->getS32Fast(_PREHASH_Data, _PREHASH_Extra, extra, block); - msg->getS32Fast(_PREHASH_Data, _PREHASH_Extra2, extra2, block); - - F32 world_x = (F32)X; - X /= REGION_WIDTH_UNITS; - F32 world_y = (F32)Y; - Y /= REGION_WIDTH_UNITS; - - LLItemInfo new_item(world_x, world_y, name, uuid, extra, extra2); - LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(new_item.mRegionHandle); - - switch (type) - { - case MAP_ITEM_TELEHUB: // telehubs + else if (type == MAP_ITEM_MATURE_EVENT) { - // Telehub color, store in extra as 4 U8's - U8 *color = (U8 *)&new_item.mExtra; - - F32 red = fmod((F32)X * 0.11f, 1.f) * 0.8f; - F32 green = fmod((F32)Y * 0.11f, 1.f) * 0.8f; - F32 blue = fmod(1.5f * (F32)(X + Y) * 0.11f, 1.f) * 0.8f; - F32 add_amt = (X % 2) ? 0.15f : -0.15f; - add_amt += (Y % 2) ? -0.15f : 0.15f; - color[0] = U8((red + add_amt) * 255); - color[1] = U8((green + add_amt) * 255); - color[2] = U8((blue + add_amt) * 255); - color[3] = 255; - - // extra2 specifies whether this is an infohub or a telehub. - if (extra2) - { - LLWorldMap::getInstance()->mInfohubs.push_back(new_item); - } - else - { - LLWorldMap::getInstance()->mTelehubs.push_back(new_item); - } - - break; + siminfo->insertMatureEvent(new_item); } - case MAP_ITEM_PG_EVENT: // events - case MAP_ITEM_MATURE_EVENT: - case MAP_ITEM_ADULT_EVENT: + else if (type == MAP_ITEM_ADULT_EVENT) { - std::string timeStr = "["+ LLTrans::getString ("TimeHour")+"]:[" - +LLTrans::getString ("TimeMin")+"] [" - +LLTrans::getString ("TimeAMPM")+"]"; - LLSD substitution; - substitution["datetime"] = (S32) extra; - LLStringUtil::format (timeStr, substitution); - new_item.mToolTip = timeStr; - - // HACK: store Z in extra2 - new_item.mPosGlobal.mdV[VZ] = (F64)extra2; - if (type == MAP_ITEM_PG_EVENT) - { - LLWorldMap::getInstance()->mPGEvents.push_back(new_item); - } - else if (type == MAP_ITEM_MATURE_EVENT) - { - LLWorldMap::getInstance()->mMatureEvents.push_back(new_item); - } - else if (type == MAP_ITEM_ADULT_EVENT) - { - LLWorldMap::getInstance()->mAdultEvents.push_back(new_item); - } - - break; + siminfo->insertAdultEvent(new_item); } - case MAP_ITEM_LAND_FOR_SALE: // land for sale - case MAP_ITEM_LAND_FOR_SALE_ADULT: // adult land for sale + break; + } + case MAP_ITEM_LAND_FOR_SALE: // land for sale + case MAP_ITEM_LAND_FOR_SALE_ADULT: // adult land for sale + { + std::string tooltip = llformat("%d sq. m. L$%d", extra, extra2); + new_item.setTooltip(tooltip); + if (type == MAP_ITEM_LAND_FOR_SALE) { - new_item.mToolTip = llformat("%d sq. m. L$%d", new_item.mExtra, new_item.mExtra2); - if (type == MAP_ITEM_LAND_FOR_SALE) - { - LLWorldMap::getInstance()->mLandForSale.push_back(new_item); - } - else if (type == MAP_ITEM_LAND_FOR_SALE_ADULT) - { - LLWorldMap::getInstance()->mLandForSaleAdult.push_back(new_item); - } - break; + siminfo->insertLandForSale(new_item); } - case MAP_ITEM_CLASSIFIED: // classifieds + else if (type == MAP_ITEM_LAND_FOR_SALE_ADULT) { - //DEPRECATED: no longer used - break; + siminfo->insertLandForSaleAdult(new_item); } - case MAP_ITEM_AGENT_LOCATIONS: // agent locations + break; + } + case MAP_ITEM_CLASSIFIED: // classifieds + { + //DEPRECATED: no longer used + break; + } + case MAP_ITEM_AGENT_LOCATIONS: // agent locations + { +// LL_INFOS("World Map") << "New Location " << new_item.mName << LL_ENDL; + if (extra > 0) { - if (!siminfo) - { - llinfos << "siminfo missing for " << new_item.mPosGlobal.mdV[0] << ", " << new_item.mPosGlobal.mdV[1] << llendl; - break; - } -// llinfos << "New Location " << new_item.mName << llendl; - - item_info_list_t& agentcounts = LLWorldMap::getInstance()->mAgentLocationsMap[new_item.mRegionHandle]; - - // Find the last item in the list with a different name and erase them - item_info_list_t::iterator lastiter; - for (lastiter = agentcounts.begin(); lastiter!=agentcounts.end(); ++lastiter) - { - const LLItemInfo& info = *lastiter; - if (info.mName == new_item.mName) - { - break; - } - } - if (lastiter != agentcounts.begin()) - { - agentcounts.erase(agentcounts.begin(), lastiter); - } - // Now append the new location - if (new_item.mExtra > 0) - { - agentcounts.push_back(new_item); - } - break; + new_item.setCount(extra); + siminfo->insertAgentLocation(new_item); } - default: - break; - }; - } -} - -void LLWorldMap::dump() -{ - for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) - { - U64 handle = (*it).first; - LLSimInfo* info = (*it).second; - - U32 x_pos, y_pos; - from_region_handle(handle, &x_pos, &y_pos); - - llinfos << x_pos << "," << y_pos - << " " << info->mName - << " " << (S32)info->mAccess - << " " << std::hex << info->mRegionFlags << std::dec - << " " << info->mWaterHeight - //<< " " << info->mTelehubName - //<< " " << info->mTelehubPosition - << llendl; - - if (info->mCurrentImage) - { - llinfos << "image discard " << (S32)info->mCurrentImage->getDiscardLevel() - << " fullwidth " << info->mCurrentImage->getFullWidth() - << " fullheight " << info->mCurrentImage->getFullHeight() - << " maxvirt " << info->mCurrentImage->getMaxVirtualSize() - //<< " maxdisc " << (S32)info->mCurrentImage->getMaxDiscardLevel() - << llendl; + break; } + default: + break; } + return true; } - -BOOL LLWorldMap::extendAABB(U32 min_x, U32 min_y, U32 max_x, U32 max_y) +bool LLWorldMap::isTrackingInRectangle(F64 x0, F64 y0, F64 x1, F64 y1) { - BOOL rv = FALSE; - if (min_x < mMinX) - { - rv = TRUE; - mMinX = min_x; - } - if (min_y < mMinY) - { - rv = TRUE; - mMinY = min_y; - } - if (max_x > mMaxX) - { - rv = TRUE; - mMaxX = max_x; - } - if (max_y > mMaxY) - { - rv = TRUE; - mMaxY = max_y; - } - lldebugs << "World map aabb: (" << mMinX << ", " << mMinY << "), (" - << mMaxX << ", " << mMaxY << ")" << llendl; - return rv; + if (!mIsTrackingLocation) + return false; + return ((mTrackingLocation[0] >= x0) && (mTrackingLocation[0] < x1) && (mTrackingLocation[1] >= y0) && (mTrackingLocation[1] < y1)); } - -U32 LLWorldMap::getWorldWidth() const +// Drop priority of all images being fetched by the map +void LLWorldMap::dropImagePriorities() { - return mMaxX - mMinX; -} - - -U32 LLWorldMap::getWorldHeight() const -{ - return mMaxY - mMinY; -} - -BOOL LLWorldMap::coveredByTelehub(LLSimInfo* infop) -{ - /*if (!mTelehubCoverageMap) + // Drop the download of tiles priority to nil + mWorldMipmap.dropBoostLevels(); + // Same for the "land for sale" tiles per region + for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) { - return FALSE; + LLSimInfo* info = it->second; + info->dropImagePriority(); } - U32 x_pos, y_pos; - from_region_handle(infop->mHandle, &x_pos, &y_pos); - x_pos /= REGION_WIDTH_UNITS; - y_pos /= REGION_WIDTH_UNITS; - - S32 index = x_pos - (mMinX / REGION_WIDTH_UNITS - 1) + (mNeighborMapWidth * (y_pos - (mMinY / REGION_WIDTH_UNITS - 1))); - return mTelehubCoverageMap[index] != 0; */ - return FALSE; } -void LLWorldMap::updateTelehubCoverage() +// Load all regions in a given rectangle (in region grid coordinates, i.e. world / 256 meters) +void LLWorldMap::updateRegions(S32 x0, S32 y0, S32 x1, S32 y1) { - /*S32 neighbor_width = getWorldWidth() / REGION_WIDTH_UNITS + 2; - S32 neighbor_height = getWorldHeight() / REGION_WIDTH_UNITS + 2; - if (neighbor_width > mNeighborMapWidth || neighbor_height > mNeighborMapHeight) - { - mNeighborMapWidth = neighbor_width; - mNeighborMapHeight = neighbor_height; - delete mNeighborMap; - delete mTelehubCoverageMap; - - mNeighborMap = new U8[mNeighborMapWidth * mNeighborMapHeight]; - mTelehubCoverageMap = new U8[mNeighborMapWidth * mNeighborMapHeight]; - } - - memset(mNeighborMap, 0, mNeighborMapWidth * mNeighborMapHeight * sizeof(U8)); - memset(mTelehubCoverageMap, 0, mNeighborMapWidth * mNeighborMapHeight * sizeof(U8)); + // Convert those boundaries to the corresponding (MAP_BLOCK_SIZE x MAP_BLOCK_SIZE) block coordinates + x0 = x0 / MAP_BLOCK_SIZE; + x1 = x1 / MAP_BLOCK_SIZE; + y0 = y0 / MAP_BLOCK_SIZE; + y1 = y1 / MAP_BLOCK_SIZE; - // leave 1 sim border - S32 min_x = (mMinX / REGION_WIDTH_UNITS) - 1; - S32 min_y = (mMinY / REGION_WIDTH_UNITS) - 1; - - std::map<U64, LLSimInfo*>::const_iterator it; - for (it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) + // Load the region info those blocks + for (S32 block_x = llmax(x0, 0); block_x <= llmin(x1, MAP_BLOCK_RES-1); ++block_x) { - U64 handle = (*it).first; - //LLSimInfo* info = (*it).second; - - U32 x_pos, y_pos; - from_region_handle(handle, &x_pos, &y_pos); - x_pos /= REGION_WIDTH_UNITS; - y_pos /= REGION_WIDTH_UNITS; - x_pos -= min_x; - y_pos -= min_y; - - S32 index = x_pos + (mNeighborMapWidth * y_pos); - mNeighborMap[index - 1]++; - mNeighborMap[index + 1]++; - mNeighborMap[index - mNeighborMapWidth]++; - mNeighborMap[index + mNeighborMapWidth]++; - } - - for (it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) - { - U64 handle = (*it).first; - LLSimInfo* info = (*it).second; - - U32 x_pos, y_pos; - from_region_handle(handle, &x_pos, &y_pos); - x_pos /= REGION_WIDTH_UNITS; - y_pos /= REGION_WIDTH_UNITS; - x_pos -= min_x; - y_pos -= min_y; - - S32 index = x_pos + (mNeighborMapWidth * y_pos); - - if (!info->mTelehubName.empty() && mNeighborMap[index]) + for (S32 block_y = llmax(y0, 0); block_y <= llmin(y1, MAP_BLOCK_RES-1); ++block_y) { - S32 x_start = llmax(0, S32(x_pos - 5)); - S32 x_span = llmin(mNeighborMapWidth - 1, (S32)(x_pos + 5)) - x_start + 1; - S32 y_start = llmax(0, (S32)y_pos - 5); - S32 y_end = llmin(mNeighborMapHeight - 1, (S32)(y_pos + 5)); - for (S32 y_index = y_start; y_index <= y_end; y_index++) + S32 offset = block_x | (block_y * MAP_BLOCK_RES); + if (!mMapBlockLoaded[offset]) { - memset(&mTelehubCoverageMap[x_start + y_index * mNeighborMapWidth], 0xff, sizeof(U8) * x_span); + //LL_INFOS("World Map") << "Loading Block (" << block_x << "," << block_y << ")" << LL_ENDL; + LLWorldMapMessage::getInstance()->sendMapBlockRequest(block_x * MAP_BLOCK_SIZE, block_y * MAP_BLOCK_SIZE, (block_x * MAP_BLOCK_SIZE) + MAP_BLOCK_SIZE - 1, (block_y * MAP_BLOCK_SIZE) + MAP_BLOCK_SIZE - 1); + mMapBlockLoaded[offset] = true; } } } +} - for (it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) +void LLWorldMap::dump() +{ + LL_INFOS("World Map") << "LLWorldMap::dump()" << LL_ENDL; + for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) { - U64 handle = (*it).first; - //LLSimInfo* info = (*it).second; - - U32 x_pos, y_pos; - from_region_handle(handle, &x_pos, &y_pos); - x_pos /= REGION_WIDTH_UNITS; - y_pos /= REGION_WIDTH_UNITS; - - S32 index = x_pos - min_x + (mNeighborMapWidth * (y_pos - min_y)); - mTelehubCoverageMap[index] *= mNeighborMap[index]; - }*/ + LLSimInfo* info = it->second; + if (info) + { + info->dump(); + } + } } + diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h index 366de8f0719..7e37727b866 100644 --- a/indra/newview/llworldmap.h +++ b/indra/newview/llworldmap.h @@ -33,203 +33,243 @@ #ifndef LL_LLWORLDMAP_H #define LL_LLWORLDMAP_H -#include <map> -#include <string> -#include <vector> +#include "llworldmipmap.h" #include <boost/function.hpp> -#include "v3math.h" #include "v3dmath.h" -#include "llframetimer.h" -#include "llmapimagetype.h" #include "lluuid.h" #include "llpointer.h" #include "llsingleton.h" +#include "llviewerregion.h" #include "llviewertexture.h" -#include "lleventinfo.h" -#include "v3color.h" - -class LLMessageSystem; - +// Description of objects like hubs, events, land for sale, people and more (TBD). +// Note: we don't store a "type" in there so we need to store instances of this class in +// well known objects (i.e. list of objects which type is "well known"). class LLItemInfo { public: - LLItemInfo(F32 global_x, F32 global_y, const std::string& name, LLUUID id, S32 extra = 0, S32 extra2 = 0); - - std::string mName; - std::string mToolTip; - LLVector3d mPosGlobal; - LLUUID mID; - BOOL mSelected; - S32 mExtra; - S32 mExtra2; - U64 mRegionHandle; -}; + LLItemInfo(F32 global_x, F32 global_y, const std::string& name, LLUUID id); + + // Setters + void setTooltip(std::string& tooltip) { mToolTip = tooltip; } + void setElevation(F64 z) { mPosGlobal.mdV[VZ] = z; } + void setCount(S32 count) { mCount = count; } +// void setSelected(bool selected) { mSelected = selected; } +// void setColor(LLColor4 color) { mColor = color; } + + // Accessors + const LLVector3d& getGlobalPosition() const { return mPosGlobal; } + const std::string& getName() const { return mName; } + const std::string& getToolTip() const { return mToolTip; } + const LLUUID& getUUID() const { return mID; } + S32 getCount() const { return mCount; } + + U64 getRegionHandle() const { return to_region_handle(mPosGlobal); } // Build the handle on the fly -// Map layers, see indra_constants.h -// 0 - Prim -// 1 - Terrain Only -// 2 - Overlay: Land For Sale + bool isName(const std::string& name) const { return (mName == name); } // True if name same as item's name +// bool isSelected() const { return mSelected; } +private: + std::string mName; // Name of the individual item + std::string mToolTip; // Tooltip : typically, something to be displayed to the user when selecting this item + LLVector3d mPosGlobal; // Global world position + LLUUID mID; // UUID of the item + S32 mCount; // Number of elements in item (e.g. people count) + // Currently not used but might prove useful one day so we comment out +// bool mSelected; // Selected or not: updated by the viewer UI, not the simulator or asset DB +// LLColor4 mColor; // Color of the item +}; + +// Info per region +// Such records are stored in a global map hold by the LLWorldMap and indexed by region handles. +// To avoid creating too many of them, they are requested in "blocks" corresponding to areas covered by the screen. +// Unfortunately, when the screen covers the whole world (zoomed out), that can translate in requesting info for +// every sim on the grid... Not good... +// To avoid this, the code implements a cut-off threshold for overlay graphics and, therefore, all LLSimInfo. +// In other words, when zooming out too much, we simply stop requesting LLSimInfo and +// LLItemInfo and just display the map tiles. +// As they are stored in different structures (LLSimInfo and LLWorldMipmap), this strategy is now workable. class LLSimInfo { public: - LLSimInfo(); + LLSimInfo(U64 handle); - LLVector3d getGlobalPos(LLVector3 local_pos) const; + // Convert local region coordinates into world coordinates + LLVector3d getGlobalPos(const LLVector3& local_pos) const; + // Get the world coordinates of the SW corner of that region + LLVector3d getGlobalOrigin() const; LLVector3 getLocalPos(LLVector3d global_pos) const; -public: - U64 mHandle; - std::string mName; - - F64 mAgentsUpdateTime; - BOOL mShowAgentLocations; // are agents visible? + void clearImage(); // Clears the reference to the Land for sale image for that region + void dropImagePriority(); // Drops the boost level of the Land for sale image for that region + void updateAgentCount(F64 time); // Send an item request for agent count on that region if time's up - U8 mAccess; - U32 mRegionFlags; - F32 mWaterHeight; + // Setters + void setName(std::string& name) { mName = name; } + void setAccess (U32 accesscode) { mAccess = accesscode; } + void setRegionFlags (U32 region_flags) { mRegionFlags = region_flags; } + void setLandForSaleImage (LLUUID image_id); +// void setWaterHeight (F32 water_height) { mWaterHeight = water_height; } - F32 mAlpha; + // Accessors + std::string getName() const { return mName; } + const std::string getFlagsString() const { return LLViewerRegion::regionFlagsToString(mRegionFlags); } + const std::string getAccessString() const { return LLViewerRegion::accessToString((U8)mAccess); } - // Image ID for the current overlay mode. - LLUUID mMapImageID[MAP_SIM_IMAGE_TYPES]; + const S32 getAgentCount() const; // Compute the total agents count + LLPointer<LLViewerFetchedTexture> getLandForSaleImage(); // Get the overlay image, fetch it if necessary - // Hold a reference to the currently displayed image. - LLPointer<LLViewerFetchedTexture> mCurrentImage; - LLPointer<LLViewerFetchedTexture> mOverlayImage; -}; + bool isName(const std::string& name) const; + bool isDown() { return (mAccess == SIM_ACCESS_DOWN); } + bool isPG() { return (mAccess <= SIM_ACCESS_PG); } -#define MAP_BLOCK_RES 256 + // Debug only + void dump() const; // Print the region info to the standard output -struct LLWorldMapLayer -{ - BOOL LayerDefined; - LLPointer<LLViewerFetchedTexture> LayerImage; - LLUUID LayerImageID; - LLRect LayerExtents; + // Items lists handling + typedef std::vector<LLItemInfo> item_info_list_t; + void clearItems(); + + void insertTeleHub(const LLItemInfo& item) { mTelehubs.push_back(item); } + void insertInfoHub(const LLItemInfo& item) { mInfohubs.push_back(item); } + void insertPGEvent(const LLItemInfo& item) { mPGEvents.push_back(item); } + void insertMatureEvent(const LLItemInfo& item) { mMatureEvents.push_back(item); } + void insertAdultEvent(const LLItemInfo& item) { mAdultEvents.push_back(item); } + void insertLandForSale(const LLItemInfo& item) { mLandForSale.push_back(item); } + void insertLandForSaleAdult(const LLItemInfo& item) { mLandForSaleAdult.push_back(item); } + void insertAgentLocation(const LLItemInfo& item); + + const LLSimInfo::item_info_list_t& getTeleHub() const { return mTelehubs; } + const LLSimInfo::item_info_list_t& getInfoHub() const { return mInfohubs; } + const LLSimInfo::item_info_list_t& getPGEvent() const { return mPGEvents; } + const LLSimInfo::item_info_list_t& getMatureEvent() const { return mMatureEvents; } + const LLSimInfo::item_info_list_t& getAdultEvent() const { return mAdultEvents; } + const LLSimInfo::item_info_list_t& getLandForSale() const { return mLandForSale; } + const LLSimInfo::item_info_list_t& getLandForSaleAdult() const { return mLandForSaleAdult; } + const LLSimInfo::item_info_list_t& getAgentLocation() const { return mAgentLocations; } - LLWorldMapLayer() : LayerDefined(FALSE) { } +private: + U64 mHandle; // This is a hash of the X and Y world coordinates of the SW corner of the sim + std::string mName; // Region name + + F64 mAgentsUpdateTime; // Time stamp giving the last time the agents information was requested for that region + bool mFirstAgentRequest; // Init agent request flag + + U32 mAccess; // Down/up and maturity rating of the region + U32 mRegionFlags; // Tell us if the siminfo has been received (if non 0) and what kind of region it is (Sandbox, allow damage) + // Currently not used but might prove useful one day so we comment out +// F32 mWaterHeight; // Water height on the region (not actively used) + + // Handling the "land for sale / land for auction" overlay image + LLUUID mMapImageID; // Image ID of the overlay image + LLPointer<LLViewerFetchedTexture> mOverlayImage; // Reference to the overlay image + + // Items for this region + // Those are data received through item requests (as opposed to block requests for the rest of the data) + item_info_list_t mTelehubs; // List of tele hubs in the region + item_info_list_t mInfohubs; // List of info hubs in the region + item_info_list_t mPGEvents; // List of PG events in the region + item_info_list_t mMatureEvents; // List of Mature events in the region + item_info_list_t mAdultEvents; // List of Adult events in the region (AO) + item_info_list_t mLandForSale; // List of Land for sales in the region + item_info_list_t mLandForSaleAdult; // List of Adult Land for sales in the region (AO) + item_info_list_t mAgentLocations; // List of agents in the region }; +// We request region data on the world by "blocks" of (MAP_BLOCK_SIZE x MAP_BLOCK_SIZE) regions +// This is to reduce the number of requests to the asset DB and get things in big "blocks" +const S32 MAP_MAX_SIZE = 2048; +const S32 MAP_BLOCK_SIZE = 4; +const S32 MAP_BLOCK_RES = (MAP_MAX_SIZE / MAP_BLOCK_SIZE); class LLWorldMap : public LLSingleton<LLWorldMap> { public: - typedef boost::function<void(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)> - url_callback_t; - LLWorldMap(); ~LLWorldMap(); - // clears the list + // Clear all: list of region info, tiles, blocks and items void reset(); - // clear the visible items - void eraseItems(); + void clearImageRefs(); // Clears the image references + void dropImagePriorities(); // Drops the priority of the images being fetched + void reloadItems(bool force = false); // Reload the items (people, hub, etc...) - // Removes references to cached images - void clearImageRefs(); + // Region Map access + typedef std::map<U64, LLSimInfo*> sim_info_map_t; + const LLWorldMap::sim_info_map_t& getRegionMap() const { return mSimInfoMap; } + void updateRegions(S32 x0, S32 y0, S32 x1, S32 y1); // Requests region info for a rectangle of regions (in grid coordinates) - // Clears the flags indicating that we've received sim infos - // Causes a re-request of the sim info without erasing extisting info - void clearSimFlags(); + // Insert a region and items in the map global instance + // Note: x_world and y_world in world coordinates (meters) + static bool insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 accesscode, U32 region_flags); + static bool insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 type, S32 extra, S32 extra2); - // Returns simulator information, or NULL if out of range + // Get info on sims (region) : note that those methods only search the range of loaded sims (the one that are being browsed) + // *not* the entire world. So a NULL return does not mean a down or unexisting region, just an out of range region. LLSimInfo* simInfoFromHandle(const U64 handle); - - // Returns simulator information, or NULL if out of range LLSimInfo* simInfoFromPosGlobal(const LLVector3d& pos_global); - - // Returns simulator information for named sim, or NULL if non-existent LLSimInfo* simInfoFromName(const std::string& sim_name); - // Gets simulator name for a global position, returns true if it was found + // Gets simulator name from a global position, returns true if found bool simNameFromPosGlobal(const LLVector3d& pos_global, std::string& outSimName ); - // Sets the current layer - void setCurrentLayer(S32 layer, bool request_layer = false); - - void sendMapLayerRequest(); - void sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent = false); - void sendNamedRegionRequest(std::string region_name); - void sendNamedRegionRequest(std::string region_name, - url_callback_t callback, - const std::string& callback_url, - bool teleport); - void sendHandleRegionRequest(U64 region_handle, - url_callback_t callback, - const std::string& callback_url, - bool teleport); - void sendItemRequest(U32 type, U64 handle = 0); - - static void processMapLayerReply(LLMessageSystem*, void**); - static void processMapBlockReply(LLMessageSystem*, void**); - static void processMapItemReply(LLMessageSystem*, void**); - - void dump(); - - // Extend the bounding box of the list of simulators. Returns true - // if the extents changed. - BOOL extendAABB(U32 x_min, U32 y_min, U32 x_max, U32 y_max); - - // build coverage maps for telehub region visualization - void updateTelehubCoverage(); - BOOL coveredByTelehub(LLSimInfo* infop); - - // Bounds of the world, in meters - U32 getWorldWidth() const; - U32 getWorldHeight() const; -public: - // Map from region-handle to simulator info - typedef std::map<U64, LLSimInfo*> sim_info_map_t; - sim_info_map_t mSimInfoMap; + // Debug only + void dump(); // Print the world info to the standard output - BOOL mIsTrackingUnknownLocation, mInvalidLocation, mIsTrackingDoubleClick, mIsTrackingCommit; - LLVector3d mUnknownLocation; + // Track handling + void cancelTracking() { mIsTrackingLocation = false; mIsTrackingFound = false; mIsInvalidLocation = false; mIsTrackingDoubleClick = false; mIsTrackingCommit = false; } - bool mRequestLandForSale; + void setTracking(const LLVector3d& loc) { mIsTrackingLocation = true; mTrackingLocation = loc; mIsTrackingFound = false; mIsInvalidLocation = false; mIsTrackingDoubleClick = false; mIsTrackingCommit = false;} + void setTrackingInvalid() { mIsTrackingFound = true; mIsInvalidLocation = true; } + void setTrackingValid() { mIsTrackingFound = true; mIsInvalidLocation = false; } + void setTrackingDoubleClick() { mIsTrackingDoubleClick = true; } + void setTrackingCommit() { mIsTrackingCommit = true; } - typedef std::vector<LLItemInfo> item_info_list_t; - item_info_list_t mTelehubs; - item_info_list_t mInfohubs; - item_info_list_t mPGEvents; - item_info_list_t mMatureEvents; - item_info_list_t mAdultEvents; - item_info_list_t mLandForSale; - item_info_list_t mLandForSaleAdult; - - std::map<U64,S32> mNumAgents; - - typedef std::map<U64, item_info_list_t> agent_list_map_t; - agent_list_map_t mAgentLocationsMap; - - std::vector<LLWorldMapLayer> mMapLayers[MAP_SIM_IMAGE_TYPES]; - BOOL mMapLoaded[MAP_SIM_IMAGE_TYPES]; - BOOL * mMapBlockLoaded[MAP_SIM_IMAGE_TYPES]; - S32 mCurrentMap; - - // AABB of the list of simulators - U32 mMinX; - U32 mMaxX; - U32 mMinY; - U32 mMaxY; - - U8* mNeighborMap; - U8* mTelehubCoverageMap; - S32 mNeighborMapWidth; - S32 mNeighborMapHeight; + bool isTracking() { return mIsTrackingLocation; } + bool isTrackingValidLocation() { return mIsTrackingFound && !mIsInvalidLocation; } + bool isTrackingInvalidLocation() { return mIsTrackingFound && mIsInvalidLocation; } + bool isTrackingDoubleClick() { return mIsTrackingDoubleClick; } + bool isTrackingCommit() { return mIsTrackingCommit; } + bool isTrackingInRectangle(F64 x0, F64 y0, F64 x1, F64 y1); + + LLVector3d getTrackedPositionGlobal() const { return mTrackingLocation; } + + // World Mipmap delegation: currently used when drawing the mipmap + void equalizeBoostLevels(); + LLPointer<LLViewerFetchedTexture> getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load = true) { return mWorldMipmap.getObjectsTile(grid_x, grid_y, level, load); } private: - LLTimer mRequestTimer; - - // search for named region for url processing - std::string mSLURLRegionName; - U64 mSLURLRegionHandle; - std::string mSLURL; - url_callback_t mSLURLCallback; - bool mSLURLTeleport; + bool clearItems(bool force = false); // Clears the item lists + void clearSimFlags(); // Clears the block flags indicating that we've already requested region infos + + // Create a region record corresponding to the handle, insert it in the region map and returns a pointer + LLSimInfo* createSimInfoFromHandle(const U64 handle); + + // Map from region-handle to region info + sim_info_map_t mSimInfoMap; + + // Holds the tiled mipmap of the world. This is the structure that contains the images used for rendering. + LLWorldMipmap mWorldMipmap; + + // The World is divided in "blocks" of (MAP_BLOCK_SIZE x MAP_BLOCK_SIZE) regions that get requested at once. + // This boolean table avoids "blocks" to be requested multiple times. + // Issue: Not sure this scheme is foolproof though as I've seen + // cases where a block is never retrieved and, because of this boolean being set, never re-requested + bool * mMapBlockLoaded; // Telling us if the block of regions has been requested or not + + // Track location data : used while there's nothing tracked yet by LLTracker + bool mIsTrackingLocation; // True when we're tracking a point + bool mIsTrackingFound; // True when the tracking position has been found, valid or not + bool mIsInvalidLocation; // The region is down or the location does not correspond to an existing region + bool mIsTrackingDoubleClick; // User double clicked to set the location (i.e. teleport when found please...) + bool mIsTrackingCommit; // User used the search or landmark fields to set the location + LLVector3d mTrackingLocation; // World global position being tracked + + // General grid items request timing flags (used for events,hubs and land for sale) + LLTimer mRequestTimer; + bool mFirstRequest; }; #endif diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp new file mode 100644 index 00000000000..6a074d9697f --- /dev/null +++ b/indra/newview/llworldmapmessage.cpp @@ -0,0 +1,261 @@ +/** + * @file llworldmapmessage.cpp + * @brief Handling of the messages to the DB made by and for the world map. + * + * $LicenseInfo:firstyear=2003&license=viewergpl$ + * + * Copyright (c) 2003-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llworldmapmessage.h" + +#include "llworldmap.h" +#include "llagent.h" +#include "llfloaterworldmap.h" + +const U32 LAYER_FLAG = 2; + +//--------------------------------------------------------------------------- +// World Map Message Handling +//--------------------------------------------------------------------------- + +LLWorldMapMessage::LLWorldMapMessage() : + mSLURLRegionName(), + mSLURLRegionHandle(0), + mSLURL(), + mSLURLCallback(0), + mSLURLTeleport(false) +{ +} + +LLWorldMapMessage::~LLWorldMapMessage() +{ +} + +void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle) +{ + //LL_INFOS("World Map") << "Send item request : type = " << type << LL_ENDL; + LLMessageSystem* msg = gMessageSystem; + + msg->newMessageFast(_PREHASH_MapItemRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addU32Fast(_PREHASH_Flags, LAYER_FLAG); + msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim + msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim + + msg->nextBlockFast(_PREHASH_RequestData); + msg->addU32Fast(_PREHASH_ItemType, type); + msg->addU64Fast(_PREHASH_RegionHandle, handle); // If zero, filled in on sim + + gAgent.sendReliableMessage(); +} + +void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name) +{ + //LL_INFOS("World Map") << "LLWorldMap::sendNamedRegionRequest()" << LL_ENDL; + LLMessageSystem* msg = gMessageSystem; + + // Request for region data + msg->newMessageFast(_PREHASH_MapNameRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addU32Fast(_PREHASH_Flags, LAYER_FLAG); + msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim + msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim + msg->nextBlockFast(_PREHASH_NameData); + msg->addStringFast(_PREHASH_Name, region_name); + gAgent.sendReliableMessage(); +} + +void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name, + url_callback_t callback, + const std::string& callback_url, + bool teleport) // immediately teleport when result returned +{ + //LL_INFOS("World Map") << "LLWorldMap::sendNamedRegionRequest()" << LL_ENDL; + mSLURLRegionName = region_name; + mSLURLRegionHandle = 0; + mSLURL = callback_url; + mSLURLCallback = callback; + mSLURLTeleport = teleport; + + sendNamedRegionRequest(region_name); +} + +void LLWorldMapMessage::sendHandleRegionRequest(U64 region_handle, + url_callback_t callback, + const std::string& callback_url, + bool teleport) // immediately teleport when result returned +{ + //LL_INFOS("World Map") << "LLWorldMap::sendHandleRegionRequest()" << LL_ENDL; + mSLURLRegionName.clear(); + mSLURLRegionHandle = region_handle; + mSLURL = callback_url; + mSLURLCallback = callback; + mSLURLTeleport = teleport; + + U32 global_x; + U32 global_y; + from_region_handle(region_handle, &global_x, &global_y); + U16 grid_x = (U16)(global_x / REGION_WIDTH_UNITS); + U16 grid_y = (U16)(global_y / REGION_WIDTH_UNITS); + + sendMapBlockRequest(grid_x, grid_y, grid_x, grid_y, true); +} + +void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent) +{ + //LL_INFOS("World Map") << "LLWorldMap::sendMapBlockRequest()" << ", min = (" << min_x << ", " << min_y << "), max = (" << max_x << ", " << max_y << "), nonexistent = " << return_nonexistent << LL_ENDL; + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_MapBlockRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + U32 flags = LAYER_FLAG; + flags |= (return_nonexistent ? 0x10000 : 0); + msg->addU32Fast(_PREHASH_Flags, flags); + msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim + msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim + msg->nextBlockFast(_PREHASH_PositionData); + msg->addU16Fast(_PREHASH_MinX, min_x); + msg->addU16Fast(_PREHASH_MinY, min_y); + msg->addU16Fast(_PREHASH_MaxX, max_x); + msg->addU16Fast(_PREHASH_MaxY, max_y); + gAgent.sendReliableMessage(); +} + +// public static +void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**) +{ + U32 agent_flags; + msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags); + + // There's only one flag that we ever use here + if (agent_flags != LAYER_FLAG) + { + llwarns << "Invalid map image type returned! layer = " << agent_flags << llendl; + return; + } + + S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data); + //LL_INFOS("World Map") << "LLWorldMap::processMapBlockReply(), num_blocks = " << num_blocks << LL_ENDL; + + bool found_null_sim = false; + + for (S32 block=0; block<num_blocks; ++block) + { + U16 x_regions; + U16 y_regions; + std::string name; + U8 accesscode; + U32 region_flags; +// U8 water_height; +// U8 agents; + LLUUID image_id; + msg->getU16Fast(_PREHASH_Data, _PREHASH_X, x_regions, block); + msg->getU16Fast(_PREHASH_Data, _PREHASH_Y, y_regions, block); + msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block); + msg->getU8Fast(_PREHASH_Data, _PREHASH_Access, accesscode, block); + msg->getU32Fast(_PREHASH_Data, _PREHASH_RegionFlags, region_flags, block); +// msg->getU8Fast(_PREHASH_Data, _PREHASH_WaterHeight, water_height, block); +// msg->getU8Fast(_PREHASH_Data, _PREHASH_Agents, agents, block); + msg->getUUIDFast(_PREHASH_Data, _PREHASH_MapImageID, image_id, block); + + U32 x_world = (U32)(x_regions) * REGION_WIDTH_UNITS; + U32 y_world = (U32)(y_regions) * REGION_WIDTH_UNITS; + + // Insert that region in the world map, if failure, flag it as a "null_sim" + if (!(LLWorldMap::getInstance()->insertRegion(x_world, y_world, name, image_id, (U32)accesscode, region_flags))) + { + found_null_sim = true; + } + + // If we hit a valid tracking location, do what needs to be done app level wise + if (LLWorldMap::getInstance()->isTrackingValidLocation()) + { + LLVector3d pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal(); + if (LLWorldMap::getInstance()->isTrackingDoubleClick()) + { + // Teleport if the user double clicked + gAgent.teleportViaLocation(pos_global); + } + // Update the "real" tracker information + gFloaterWorldMap->trackLocation(pos_global); + } + + // Handle the SLURL callback if any + if(LLWorldMapMessage::getInstance()->mSLURLCallback != NULL) + { + U64 handle = to_region_handle(x_world, y_world); + // Check if we reached the requested region + if ((LLStringUtil::compareInsensitive(LLWorldMapMessage::getInstance()->mSLURLRegionName, name)==0) + || (LLWorldMapMessage::getInstance()->mSLURLRegionHandle == handle)) + { + url_callback_t callback = LLWorldMapMessage::getInstance()->mSLURLCallback; + + LLWorldMapMessage::getInstance()->mSLURLCallback = NULL; + LLWorldMapMessage::getInstance()->mSLURLRegionName.clear(); + LLWorldMapMessage::getInstance()->mSLURLRegionHandle = 0; + + callback(handle, LLWorldMapMessage::getInstance()->mSLURL, image_id, LLWorldMapMessage::getInstance()->mSLURLTeleport); + } + } + } + // Tell the UI to update itself + gFloaterWorldMap->updateSims(found_null_sim); +} + +// public static +void LLWorldMapMessage::processMapItemReply(LLMessageSystem* msg, void**) +{ + //LL_INFOS("World Map") << "LLWorldMap::processMapItemReply()" << LL_ENDL; + U32 type; + msg->getU32Fast(_PREHASH_RequestData, _PREHASH_ItemType, type); + + S32 num_blocks = msg->getNumberOfBlocks("Data"); + + for (S32 block=0; block<num_blocks; ++block) + { + U32 X, Y; + std::string name; + S32 extra, extra2; + LLUUID uuid; + msg->getU32Fast(_PREHASH_Data, _PREHASH_X, X, block); + msg->getU32Fast(_PREHASH_Data, _PREHASH_Y, Y, block); + msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block); + msg->getUUIDFast(_PREHASH_Data, _PREHASH_ID, uuid, block); + msg->getS32Fast(_PREHASH_Data, _PREHASH_Extra, extra, block); + msg->getS32Fast(_PREHASH_Data, _PREHASH_Extra2, extra2, block); + + LLWorldMap::getInstance()->insertItem(X, Y, name, uuid, type, extra, extra2); + } +} + diff --git a/indra/newview/llworldmapmessage.h b/indra/newview/llworldmapmessage.h new file mode 100644 index 00000000000..2c8fedcb10e --- /dev/null +++ b/indra/newview/llworldmapmessage.h @@ -0,0 +1,83 @@ +/** + * @file llworldmapmessage.h + * @brief Handling of the messages to the DB made by and for the world map. + * + * $LicenseInfo:firstyear=2003&license=viewergpl$ + * + * Copyright (c) 2003-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLWORLDMAPMESSAGE_H +#define LL_LLWORLDMAPMESSAGE_H + +// Handling of messages (send and process) as well as SLURL callback if necessary +class LLMessageSystem; + +class LLWorldMapMessage : public LLSingleton<LLWorldMapMessage> +{ +public: + typedef boost::function<void(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)> + url_callback_t; + + LLWorldMapMessage(); + ~LLWorldMapMessage(); + + // Process incoming answers to map stuff requests + static void processMapBlockReply(LLMessageSystem*, void**); + static void processMapItemReply(LLMessageSystem*, void**); + + // Request data for all regions in a rectangular area. Coordinates in grids (i.e. meters / 256). + void sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent = false); + + // Various methods to request LLSimInfo data to the simulator and asset DB + void sendNamedRegionRequest(std::string region_name); + void sendNamedRegionRequest(std::string region_name, + url_callback_t callback, + const std::string& callback_url, + bool teleport); + void sendHandleRegionRequest(U64 region_handle, + url_callback_t callback, + const std::string& callback_url, + bool teleport); + + // Request item data for regions + // Note: the handle works *only* when requesting agent count (type = MAP_ITEM_AGENT_LOCATIONS). In that case, + // the request will actually be transitting through the spaceserver (all that is done on the sim). + // All other values of type do create a global grid request to the asset DB. So no need to try to get, say, + // the events for one particular region. For such a request, the handle is ignored. + void sendItemRequest(U32 type, U64 handle = 0); + +private: + // Search for region (by name or handle) for SLURL processing and teleport + // None of this relies explicitly on the LLWorldMap instance so better handle it here + std::string mSLURLRegionName; + U64 mSLURLRegionHandle; + std::string mSLURL; + url_callback_t mSLURLCallback; + bool mSLURLTeleport; +}; + +#endif // LL_LLWORLDMAPMESSAGE_H diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 3aad5c7378b..ede9ddb837b 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -46,7 +46,6 @@ #include "llagent.h" #include "llcallingcard.h" #include "llviewercontrol.h" -#include "llcylinder.h" #include "llfloatermap.h" #include "llfloaterworldmap.h" #include "llfocusmgr.h" @@ -57,25 +56,29 @@ #include "llviewercamera.h" #include "llviewertexture.h" #include "llviewertexturelist.h" -#include "llviewermenu.h" -#include "llviewerparceloverlay.h" #include "llviewerregion.h" #include "llviewerwindow.h" -#include "llworldmap.h" -#include "lltexturefetch.h" -#include "llappviewer.h" // Only for constants! #include "lltrans.h" #include "llglheaders.h" +// Basically a C++ implementation of the OCEAN_COLOR defined in mapstitcher.py +// Please ensure consistency between those 2 files (TODO: would be better to get that color from an asset source...) +// # Constants +// OCEAN_COLOR = "#1D475F" +const F32 OCEAN_RED = (F32)(0x1D)/255.f; +const F32 OCEAN_GREEN = (F32)(0x47)/255.f; +const F32 OCEAN_BLUE = (F32)(0x5F)/255.f; + const F32 GODLY_TELEPORT_HEIGHT = 200.f; const S32 SCROLL_HINT_WIDTH = 65; const F32 BIG_DOT_RADIUS = 5.f; BOOL LLWorldMapView::sHandledLastClick = FALSE; -LLUIImagePtr LLWorldMapView::sAvatarYouSmallImage = NULL; LLUIImagePtr LLWorldMapView::sAvatarSmallImage = NULL; -LLUIImagePtr LLWorldMapView::sAvatarLargeImage = NULL; +LLUIImagePtr LLWorldMapView::sAvatarYouImage = NULL; +LLUIImagePtr LLWorldMapView::sAvatarYouLargeImage = NULL; +LLUIImagePtr LLWorldMapView::sAvatarLevelImage = NULL; LLUIImagePtr LLWorldMapView::sAvatarAboveImage = NULL; LLUIImagePtr LLWorldMapView::sAvatarBelowImage = NULL; @@ -93,35 +96,34 @@ LLUIImagePtr LLWorldMapView::sClassifiedsImage = NULL; LLUIImagePtr LLWorldMapView::sForSaleImage = NULL; LLUIImagePtr LLWorldMapView::sForSaleAdultImage = NULL; -F32 LLWorldMapView::sThresholdA = 48.f; -F32 LLWorldMapView::sThresholdB = 96.f; F32 LLWorldMapView::sPanX = 0.f; F32 LLWorldMapView::sPanY = 0.f; F32 LLWorldMapView::sTargetPanX = 0.f; F32 LLWorldMapView::sTargetPanY = 0.f; S32 LLWorldMapView::sTrackingArrowX = 0; S32 LLWorldMapView::sTrackingArrowY = 0; -F32 LLWorldMapView::sPixelsPerMeter = 1.f; -F32 CONE_SIZE = 0.6f; +bool LLWorldMapView::sVisibleTilesLoaded = false; +F32 LLWorldMapView::sMapScale = 128.f; std::map<std::string,std::string> LLWorldMapView::sStringsMap; -#define SIM_NULL_MAP_SCALE 1 // width in pixels, where we start drawing "null" sims -#define SIM_MAP_AGENT_SCALE 2 // width in pixels, where we start drawing agents -#define SIM_MAP_SCALE 1 // width in pixels, where we start drawing sim tiles - -// Updates for agent locations. -#define AGENTS_UPDATE_TIME 60.0 // in seconds +// Fetch and draw info thresholds +const F32 DRAW_TEXT_THRESHOLD = 96.f; // Don't draw text under that resolution value (res = width region in meters) +const S32 DRAW_SIMINFO_THRESHOLD = 3; // Max level for which we load or display sim level information (level in LLWorldMipmap sense) +const S32 DRAW_LANDFORSALE_THRESHOLD = 2; // Max level for which we load or display land for sale picture data (level in LLWorldMipmap sense) +// When on, draw an outline for each mipmap tile gotten from S3 +#define DEBUG_DRAW_TILE 0 void LLWorldMapView::initClass() { - sAvatarYouSmallImage = LLUI::getUIImage("map_avatar_you_8.tga"); - sAvatarSmallImage = LLUI::getUIImage("map_avatar_8.tga"); - sAvatarLargeImage = LLUI::getUIImage("map_avatar_16.tga"); - sAvatarAboveImage = LLUI::getUIImage("map_avatar_above_8.tga"); - sAvatarBelowImage = LLUI::getUIImage("map_avatar_below_8.tga"); + sAvatarSmallImage = LLUI::getUIImage("map_avatar_8.tga"); + sAvatarYouImage = LLUI::getUIImage("map_avatar_16.tga"); + sAvatarYouLargeImage = LLUI::getUIImage("map_avatar_you_32.tga"); + sAvatarLevelImage = LLUI::getUIImage("map_avatar_32.tga"); + sAvatarAboveImage = LLUI::getUIImage("map_avatar_above_32.tga"); + sAvatarBelowImage = LLUI::getUIImage("map_avatar_below_32.tga"); sHomeImage = LLUI::getUIImage("map_home.tga"); sTelehubImage = LLUI::getUIImage("map_telehub.tga"); @@ -145,9 +147,10 @@ void LLWorldMapView::initClass() // static void LLWorldMapView::cleanupClass() { - sAvatarYouSmallImage = NULL; sAvatarSmallImage = NULL; - sAvatarLargeImage = NULL; + sAvatarYouImage = NULL; + sAvatarYouLargeImage = NULL; + sAvatarLevelImage = NULL; sAvatarAboveImage = NULL; sAvatarBelowImage = NULL; @@ -167,7 +170,7 @@ void LLWorldMapView::cleanupClass() LLWorldMapView::LLWorldMapView() : LLPanel(), - mBackgroundColor( LLColor4( 4.f/255.f, 4.f/255.f, 75.f/255.f, 1.f ) ), + mBackgroundColor( LLColor4( OCEAN_RED, OCEAN_GREEN, OCEAN_BLUE, 1.f ) ), mItemPicked(FALSE), mPanning( FALSE ), mMouseDownPanX( 0 ), @@ -176,7 +179,8 @@ LLWorldMapView::LLWorldMapView() mMouseDownY( 0 ), mSelectIDStart(0) { - sPixelsPerMeter = gMapScale / REGION_WIDTH_METERS; + //LL_INFOS("World Map") << "Creating the Map -> LLWorldMapView::LLWorldMapView()" << LL_ENDL; + clearLastClick(); } @@ -215,6 +219,7 @@ BOOL LLWorldMapView::postBuild() LLWorldMapView::~LLWorldMapView() { + //LL_INFOS("World Map") << "Destroying the map -> LLWorldMapView::~LLWorldMapView()" << LL_ENDL; cleanupTextures(); } @@ -228,14 +233,14 @@ void LLWorldMapView::cleanupTextures() // static void LLWorldMapView::setScale( F32 scale ) { - if (scale != gMapScale) + if (scale != sMapScale) { - F32 old_scale = gMapScale; + F32 old_scale = sMapScale; - gMapScale = scale; - if (gMapScale == 0.f) + sMapScale = scale; + if (sMapScale <= 0.f) { - gMapScale = 0.1f; + sMapScale = 0.1f; } F32 ratio = (scale / old_scale); @@ -243,8 +248,7 @@ void LLWorldMapView::setScale( F32 scale ) sPanY *= ratio; sTargetPanX = sPanX; sTargetPanY = sPanY; - - sPixelsPerMeter = gMapScale / REGION_WIDTH_METERS; + sVisibleTilesLoaded = false; } } @@ -256,6 +260,7 @@ void LLWorldMapView::translatePan( S32 delta_x, S32 delta_y ) sPanY += delta_y; sTargetPanX = sPanX; sTargetPanY = sPanY; + sVisibleTilesLoaded = false; } @@ -269,18 +274,22 @@ void LLWorldMapView::setPan( S32 x, S32 y, BOOL snap ) sPanX = sTargetPanX; sPanY = sTargetPanY; } + sVisibleTilesLoaded = false; } +bool LLWorldMapView::showRegionInfo() +{ + return (LLWorldMipmap::scaleToLevel(sMapScale) <= DRAW_SIMINFO_THRESHOLD ? true : false); +} /////////////////////////////////////////////////////////////////////////////////// // HELPERS BOOL is_agent_in_region(LLViewerRegion* region, LLSimInfo* info) { - return ((region && info) && (info->mName == region->getName())); + return (region && info && info->isName(region->getName())); } - /////////////////////////////////////////////////////////////////////////////////// void LLWorldMapView::draw() @@ -292,7 +301,7 @@ void LLWorldMapView::draw() F64 current_time = LLTimer::getElapsedSeconds(); mVisibleRegions.clear(); - + // animate pan if necessary sPanX = lerp(sPanX, sTargetPanX, LLCriticalDamp::getInterpolant(0.1f)); sPanY = lerp(sPanY, sTargetPanY, LLCriticalDamp::getInterpolant(0.1f)); @@ -303,10 +312,12 @@ void LLWorldMapView::draw() const F32 half_height = F32(height) / 2.0f; LLVector3d camera_global = gAgent.getCameraPositionGlobal(); + S32 level = LLWorldMipmap::scaleToLevel(sMapScale); + LLLocalClipRect clip(getLocalRect()); { gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - + glMatrixMode(GL_MODELVIEW); // Clear the background alpha to 0 @@ -319,307 +330,58 @@ void LLWorldMapView::draw() } gGL.flush(); + gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); gGL.setColorMask(true, true); - gGL.setSceneBlendType(LLRender::BT_ALPHA); - - F32 layer_alpha = 1.f; - - // Draw one image per layer - for (U32 layer_idx=0; layer_idx<LLWorldMap::getInstance()->mMapLayers[LLWorldMap::getInstance()->mCurrentMap].size(); ++layer_idx) - { - if (!LLWorldMap::getInstance()->mMapLayers[LLWorldMap::getInstance()->mCurrentMap][layer_idx].LayerDefined) - { - continue; - } - LLWorldMapLayer *layer = &LLWorldMap::getInstance()->mMapLayers[LLWorldMap::getInstance()->mCurrentMap][layer_idx]; - LLViewerFetchedTexture *current_image = layer->LayerImage; - - if (current_image->isMissingAsset()) - { - continue; // better to draw nothing than the missing asset image - } - - LLVector3d origin_global((F64)layer->LayerExtents.mLeft * REGION_WIDTH_METERS, (F64)layer->LayerExtents.mBottom * REGION_WIDTH_METERS, 0.f); - - // Find x and y position relative to camera's center. - LLVector3d rel_region_pos = origin_global - camera_global; - F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * gMapScale; - F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * gMapScale; - - F32 pix_width = gMapScale*(layer->LayerExtents.getWidth() + 1); - F32 pix_height = gMapScale*(layer->LayerExtents.getHeight() + 1); - - // When the view isn't panned, 0,0 = center of rectangle - F32 bottom = sPanY + half_height + relative_y; - F32 left = sPanX + half_width + relative_x; - F32 top = bottom + pix_height; - F32 right = left + pix_width; - F32 pixel_area = pix_width*pix_height; - // discard layers that are outside the rectangle - // and discard small layers - if (top < 0.f || - bottom > height || - right < 0.f || - left > width || - (pixel_area < 4*4)) - { - current_image->setBoostLevel(0); - continue; - } - - current_image->setBoostLevel(LLViewerTexture::BOOST_MAP_LAYER); - current_image->setKnownDrawSize(llround(pix_width * LLUI::sGLScaleFactor.mV[VX]), llround(pix_height * LLUI::sGLScaleFactor.mV[VY])); - - if (!current_image->hasGLTexture()) - { - continue; // better to draw nothing than the default image - } - -// LLTextureView::addDebugImage(current_image); - - // Draw using the texture. If we don't clamp we get artifact at - // the edge. - gGL.getTexUnit(0)->bind(current_image); - - // Draw map image into RGB - //gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - gGL.flush(); - gGL.setColorMask(true, false); - gGL.color4f(1.f, 1.f, 1.f, layer_alpha); - - gGL.begin(LLRender::QUADS); - gGL.texCoord2f(0.0f, 1.0f); - gGL.vertex3f(left, top, -1.0f); - gGL.texCoord2f(0.0f, 0.0f); - gGL.vertex3f(left, bottom, -1.0f); - gGL.texCoord2f(1.0f, 0.0f); - gGL.vertex3f(right, bottom, -1.0f); - gGL.texCoord2f(1.0f, 1.0f); - gGL.vertex3f(right, top, -1.0f); - gGL.end(); - - // draw an alpha of 1 where the sims are visible - gGL.flush(); - gGL.setColorMask(false, true); - gGL.color4f(1.f, 1.f, 1.f, 1.f); - - gGL.begin(LLRender::QUADS); - gGL.texCoord2f(0.0f, 1.0f); - gGL.vertex2f(left, top); - gGL.texCoord2f(0.0f, 0.0f); - gGL.vertex2f(left, bottom); - gGL.texCoord2f(1.0f, 0.0f); - gGL.vertex2f(right, bottom); - gGL.texCoord2f(1.0f, 1.0f); - gGL.vertex2f(right, top); - gGL.end(); - } +#if 1 + // Draw the image tiles + drawMipmap(width, height); gGL.flush(); + gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); gGL.setColorMask(true, true); - // there used to be an #if 1 here, but it was uncommented; perhaps marking a block of code? - F32 sim_alpha = 1.f; - - // Draw one image per region, centered on the camera position. - const S32 MAX_SIMULTANEOUS_TEX = 100; - const S32 MAX_REQUEST_PER_TICK = 5; - const S32 MIN_REQUEST_PER_TICK = 1; - S32 textures_requested_this_tick = 0; - - for (LLWorldMap::sim_info_map_t::iterator it = LLWorldMap::getInstance()->mSimInfoMap.begin(); - it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it) + // Draw per sim overlayed information (names, mature, offline...) + for (LLWorldMap::sim_info_map_t::const_iterator it = LLWorldMap::getInstance()->getRegionMap().begin(); + it != LLWorldMap::getInstance()->getRegionMap().end(); ++it) { - U64 handle = (*it).first; - LLSimInfo* info = (*it).second; + U64 handle = it->first; + LLSimInfo* info = it->second; - LLViewerFetchedTexture* simimage = info->mCurrentImage; - LLViewerFetchedTexture* overlayimage = info->mOverlayImage; - - if (gMapScale < SIM_MAP_SCALE) - { - if (simimage != NULL) simimage->setBoostLevel(0); - if (overlayimage != NULL) overlayimage->setBoostLevel(0); - continue; - } - LLVector3d origin_global = from_region_handle(handle); - LLVector3d camera_global = gAgent.getCameraPositionGlobal(); // Find x and y position relative to camera's center. LLVector3d rel_region_pos = origin_global - camera_global; - F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * gMapScale; - F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * gMapScale; + F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * sMapScale; + F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * sMapScale; + // Coordinates of the sim in pixels in the UI panel // When the view isn't panned, 0,0 = center of rectangle - F32 bottom = sPanY + half_height + relative_y; - F32 left = sPanX + half_width + relative_x; - F32 top = bottom + gMapScale ; - F32 right = left + gMapScale ; - - // Switch to world map texture (if available for this region) if either: - // 1. Tiles are zoomed out small enough, or - // 2. Sim's texture has not been loaded yet - F32 map_scale_cutoff = SIM_MAP_SCALE; - if ((info->mRegionFlags & REGION_FLAGS_NULL_LAYER) > 0) - { - map_scale_cutoff = SIM_NULL_MAP_SCALE; - } - - info->mShowAgentLocations = (gMapScale >= SIM_MAP_AGENT_SCALE); - - bool sim_visible = - (gMapScale >= map_scale_cutoff) && - (simimage != NULL) && - (simimage->hasGLTexture()); - - if (sim_visible) - { - // Fade in - if (info->mAlpha < 0.0f) - info->mAlpha = 1.f; // don't fade initially - else - info->mAlpha = lerp(info->mAlpha, 1.f, LLCriticalDamp::getInterpolant(0.15f)); - } - else - { - // Fade out - if (info->mAlpha < 0.0f) - info->mAlpha = 0.f; // don't fade initially - else - info->mAlpha = lerp(info->mAlpha, 0.f, LLCriticalDamp::getInterpolant(0.15f)); - } - - // discard regions that are outside the rectangle - // and discard small regions - if (top < 0.f || - bottom > height || - right < 0.f || - left > width ) + F32 bottom = sPanY + half_height + relative_y; + F32 left = sPanX + half_width + relative_x; + F32 top = bottom + sMapScale ; + F32 right = left + sMapScale ; + + // Discard if region is outside the screen rectangle (not visible on screen) + if ((top < 0.f) || (bottom > height) || + (right < 0.f) || (left > width) ) { - if (simimage != NULL) simimage->setBoostLevel(0); - if (overlayimage != NULL) overlayimage->setBoostLevel(0); + // Drop the "land for sale" fetching priority since it's outside the view rectangle + info->dropImagePriority(); continue; } - if (info->mCurrentImage.isNull()) - { - if ((textures_requested_this_tick < MIN_REQUEST_PER_TICK) || - ((LLAppViewer::getTextureFetch()->getNumRequests() < MAX_SIMULTANEOUS_TEX) && - (textures_requested_this_tick < MAX_REQUEST_PER_TICK))) - { - textures_requested_this_tick++; - info->mCurrentImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); - info->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP); - simimage = info->mCurrentImage; - gGL.getTexUnit(0)->bind(simimage); - } - } - if (info->mOverlayImage.isNull() && info->mMapImageID[2].notNull()) - { - if ((textures_requested_this_tick < MIN_REQUEST_PER_TICK) || - ((LLAppViewer::getTextureFetch()->getNumRequests() < MAX_SIMULTANEOUS_TEX) && - (textures_requested_this_tick < MAX_REQUEST_PER_TICK))) - { - textures_requested_this_tick++; - info->mOverlayImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[2], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); - info->mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP); - overlayimage = info->mOverlayImage; - gGL.getTexUnit(0)->bind(overlayimage); - } - } - + // This list is used by other methods to know which regions are indeed displayed on screen mVisibleRegions.push_back(handle); - // See if the agents need updating - if (current_time - info->mAgentsUpdateTime > AGENTS_UPDATE_TIME) - { - LLWorldMap::getInstance()->sendItemRequest(MAP_ITEM_AGENT_LOCATIONS, info->mHandle); - info->mAgentsUpdateTime = current_time; - } - - // Bias the priority escalation for images nearer - LLVector3d center_global = origin_global; - center_global.mdV[VX] += 128.0; - center_global.mdV[VY] += 128.0; - - S32 draw_size = llround(gMapScale); - if (simimage != NULL) - { - simimage->setBoostLevel(LLViewerTexture::BOOST_MAP); - simimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); - } - if (overlayimage != NULL) + // Update the agent count for that region if we're not too zoomed out already + if (level <= DRAW_SIMINFO_THRESHOLD) { - overlayimage->setBoostLevel(LLViewerTexture::BOOST_MAP); - overlayimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); - } - -// LLTextureView::addDebugImage(simimage); - - if (sim_visible && info->mAlpha > 0.001f) - { - // Draw using the texture. If we don't clamp we get artifact at - // the edge. - LLGLSUIDefault gls_ui; - if (simimage != NULL) - gGL.getTexUnit(0)->bind(simimage); - - gGL.setSceneBlendType(LLRender::BT_ALPHA); - F32 alpha = sim_alpha * info->mAlpha; - gGL.color4f(1.f, 1.0f, 1.0f, alpha); - - gGL.begin(LLRender::QUADS); - gGL.texCoord2f(0.f, 1.f); - gGL.vertex3f(left, top, 0.f); - gGL.texCoord2f(0.f, 0.f); - gGL.vertex3f(left, bottom, 0.f); - gGL.texCoord2f(1.f, 0.f); - gGL.vertex3f(right, bottom, 0.f); - gGL.texCoord2f(1.f, 1.f); - gGL.vertex3f(right, top, 0.f); - gGL.end(); - - if (gSavedSettings.getBOOL("MapShowLandForSale") && overlayimage && overlayimage->hasGLTexture()) - { - gGL.getTexUnit(0)->bind(overlayimage); - gGL.color4f(1.f, 1.f, 1.f, alpha); - gGL.begin(LLRender::QUADS); - gGL.texCoord2f(0.f, 1.f); - gGL.vertex3f(left, top, -0.5f); - gGL.texCoord2f(0.f, 0.f); - gGL.vertex3f(left, bottom, -0.5f); - gGL.texCoord2f(1.f, 0.f); - gGL.vertex3f(right, bottom, -0.5f); - gGL.texCoord2f(1.f, 1.f); - gGL.vertex3f(right, top, -0.5f); - gGL.end(); - } - - if ((info->mRegionFlags & REGION_FLAGS_NULL_LAYER) == 0) - { - // draw an alpha of 1 where the sims are visible (except NULL sims) - gGL.flush(); - gGL.setSceneBlendType(LLRender::BT_REPLACE); - gGL.setColorMask(false, true); - gGL.color4f(1.f, 1.f, 1.f, 1.f); - - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.begin(LLRender::QUADS); - gGL.vertex2f(left, top); - gGL.vertex2f(left, bottom); - gGL.vertex2f(right, bottom); - gGL.vertex2f(right, top); - gGL.end(); - - gGL.flush(); - gGL.setColorMask(true, true); - } + info->updateAgentCount(current_time); } - if (info->mAccess == SIM_ACCESS_DOWN) + if (info->isDown()) { // Draw a transparent red square over down sims gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_SOURCE_ALPHA); @@ -633,18 +395,15 @@ void LLWorldMapView::draw() gGL.vertex2f(right, top); gGL.end(); } - - // As part of the AO project, we no longer want to draw access indicators; - // it's too complicated to get all the rules straight and will only + // As part of the AO project, we no longer want to draw access indicators; + // it's too complicated to get all the rules straight and will only // cause confusion. /********************** - // If this is mature, and you are not, draw a line across it - if (info->mAccess != SIM_ACCESS_DOWN - && info->mAccess > SIM_ACCESS_PG - && gAgent.isTeen()) + else if (!info->isPG() && gAgent.isTeen()) { + // If this is a mature region, and you are not, draw a line across it gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); - + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.color3f(1.f, 0.f, 0.f); gGL.begin(LLRender::LINES); @@ -655,68 +414,67 @@ void LLWorldMapView::draw() gGL.end(); } **********************/ - - // Draw the region name in the lower left corner - LLFontGL* font = LLFontGL::getFontSansSerifSmall(); - - std::string mesg; - if (gMapScale < sThresholdA) + else if (gSavedSettings.getBOOL("MapShowLandForSale") && (level <= DRAW_LANDFORSALE_THRESHOLD)) { + // Draw the overlay image "Land for Sale / Land for Auction" + LLViewerFetchedTexture* overlayimage = info->getLandForSaleImage(); + if (overlayimage) + { + // Inform the fetch mechanism of the size we need + S32 draw_size = llround(sMapScale); + overlayimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); + // Draw something whenever we have enough info + if (overlayimage->hasGLTexture()) + { + gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); + gGL.getTexUnit(0)->bind(overlayimage); + gGL.color4f(1.f, 1.f, 1.f, 1.f); + gGL.begin(LLRender::QUADS); + gGL.texCoord2f(0.f, 1.f); + gGL.vertex3f(left, top, -0.5f); + gGL.texCoord2f(0.f, 0.f); + gGL.vertex3f(left, bottom, -0.5f); + gGL.texCoord2f(1.f, 0.f); + gGL.vertex3f(right, bottom, -0.5f); + gGL.texCoord2f(1.f, 1.f); + gGL.vertex3f(right, top, -0.5f); + gGL.end(); + } + } } - else if (gMapScale < sThresholdB) + else { - // mesg = llformat( info->mAgents); + // If we're not displaying the "land for sale", drop its fetching priority + info->dropImagePriority(); } - else + + // Draw the region name in the lower left corner + if (sMapScale >= DRAW_TEXT_THRESHOLD) { - //mesg = llformat("%d / %s (%s)", - // info->mAgents, - // info->mName.c_str(), - // LLViewerRegion::accessToShortString(info->mAccess).c_str() ); - if (info->mAccess == SIM_ACCESS_DOWN) + LLFontGL* font = LLFontGL::getFontSansSerifSmall(); + std::string mesg; + if (info->isDown()) { - mesg = llformat( "%s (%s)", info->mName.c_str(), sStringsMap["offline"].c_str()); + mesg = llformat( "%s (%s)", info->getName().c_str(), sStringsMap["offline"].c_str()); } else { - mesg = info->mName; + mesg = info->getName(); } - } - - if (!mesg.empty()) - { - font->renderUTF8( - mesg, 0, - llfloor(left + 3), - llfloor(bottom + 2), - LLColor4::white, - LLFontGL::LEFT, - LLFontGL::BASELINE, - LLFontGL::NORMAL, - LLFontGL::DROP_SHADOW); - - // If map texture is still loading, - // display "Loading" placeholder text. - if ((simimage != NULL) && - simimage->getDiscardLevel() != 1 && - simimage->getDiscardLevel() != 0) + if (!mesg.empty()) { font->renderUTF8( - sStringsMap["loading"], 0, - llfloor(left + 18), - llfloor(top - 25), + mesg, 0, + llfloor(left + 3), llfloor(bottom + 2), LLColor4::white, - LLFontGL::LEFT, - LLFontGL::BASELINE, - LLFontGL::NORMAL, - LLFontGL::DROP_SHADOW); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW); } } } - // #endif used to be here + #endif - // there used to be an #if 1 here, but it was uncommented; perhaps marking a block of code? + #if 1 // Draw background rectangle LLGLSUIDefault gls_ui; { @@ -726,69 +484,49 @@ void LLWorldMapView::draw() gGL.color4fv( mBackgroundColor.mV ); gl_rect_2d(0, height, width, 0); } - + gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); gGL.setSceneBlendType(LLRender::BT_ALPHA); - // Infohubs - if (gSavedSettings.getBOOL("MapShowInfohubs")) //(gMapScale >= sThresholdB) + // Draw item infos if we're not zoomed out too much and there's something to draw + if ((level <= DRAW_SIMINFO_THRESHOLD) && (gSavedSettings.getBOOL("MapShowInfohubs") || + gSavedSettings.getBOOL("MapShowTelehubs") || + gSavedSettings.getBOOL("MapShowLandForSale") || + gSavedSettings.getBOOL("MapShowEvents") || + gSavedSettings.getBOOL("ShowMatureEvents") || + gSavedSettings.getBOOL("ShowAdultEvents"))) { - drawGenericItems(LLWorldMap::getInstance()->mInfohubs, sInfohubImage); + drawItems(); } - // Telehubs - if (gSavedSettings.getBOOL("MapShowTelehubs")) //(gMapScale >= sThresholdB) - { - drawGenericItems(LLWorldMap::getInstance()->mTelehubs, sTelehubImage); - } - - // Home Sweet Home + // Draw the Home location (always) LLVector3d home; if (gAgent.getHomePosGlobal(&home)) { drawImage(home, sHomeImage); } - if (gSavedSettings.getBOOL("MapShowLandForSale")) - { - drawGenericItems(LLWorldMap::getInstance()->mLandForSale, sForSaleImage); - // for 1.23, we're showing normal land and adult land in the same UI; you don't - // get a choice about which ones you want. If you're currently asking for adult - // content and land you'll get the adult land. - if (gAgent.canAccessAdult()) - { - drawGenericItems(LLWorldMap::getInstance()->mLandForSaleAdult, sForSaleAdultImage); - } - } - - if (gSavedSettings.getBOOL("MapShowEvents") || - gSavedSettings.getBOOL("ShowMatureEvents") || - gSavedSettings.getBOOL("ShowAdultEvents") ) - { - drawEvents(); - } - - // Now draw your avatar after all that other stuff. + // Draw the current agent after all that other stuff. LLVector3d pos_global = gAgent.getPositionGlobal(); - drawImage(pos_global, sAvatarLargeImage); + drawImage(pos_global, sAvatarYouImage); LLVector3 pos_map = globalPosToView(pos_global); if (!pointInView(llround(pos_map.mV[VX]), llround(pos_map.mV[VY]))) { - drawTracking(pos_global, - lerp(LLColor4::yellow, LLColor4::orange, 0.4f), - TRUE, - "You are here", - "", - llround(LLFontGL::getFontSansSerifSmall()->getLineHeight())); // offset vertically by one line, to avoid overlap with target tracking + drawTracking(pos_global, + lerp(LLColor4::yellow, LLColor4::orange, 0.4f), + TRUE, + "You are here", + "", + llround(LLFontGL::getFontSansSerifSmall()->getLineHeight())); // offset vertically by one line, to avoid overlap with target tracking } - // Show your viewing angle + // Draw the current agent viewing angle drawFrustum(); // Draw icons for the avatars in each region. - // Drawn after your avatar so you can see nearby people. - if (gSavedSettings.getBOOL("MapShowPeople")) + // Drawn this after the current agent avatar so one can see nearby people + if (gSavedSettings.getBOOL("MapShowPeople") && (level <= DRAW_SIMINFO_THRESHOLD)) { drawAgents(); } @@ -798,9 +536,9 @@ void LLWorldMapView::draw() if ( LLTracker::TRACKING_AVATAR == tracking_status ) { drawTracking( LLAvatarTracker::instance().getGlobalPos(), map_track_color, TRUE, LLTracker::getLabel(), "" ); - } - else if ( LLTracker::TRACKING_LANDMARK == tracking_status - || LLTracker::TRACKING_LOCATION == tracking_status ) + } + else if ( LLTracker::TRACKING_LANDMARK == tracking_status + || LLTracker::TRACKING_LOCATION == tracking_status ) { // While fetching landmarks, will have 0,0,0 location for a while, // so don't draw. JC @@ -810,31 +548,33 @@ void LLWorldMapView::draw() drawTracking( pos_global, map_track_color, TRUE, LLTracker::getLabel(), LLTracker::getToolTip() ); } } - else if (LLWorldMap::getInstance()->mIsTrackingUnknownLocation) + else if (LLWorldMap::getInstance()->isTracking()) { - if (LLWorldMap::getInstance()->mInvalidLocation) + if (LLWorldMap::getInstance()->isTrackingInvalidLocation()) { - // We know this location to be invalid + // We know this location to be invalid, draw a blue circle LLColor4 loading_color(0.0, 0.5, 1.0, 1.0); - drawTracking( LLWorldMap::getInstance()->mUnknownLocation, loading_color, TRUE, getString("InvalidLocation"), ""); + drawTracking( LLWorldMap::getInstance()->getTrackedPositionGlobal(), loading_color, TRUE, getString("InvalidLocation"), ""); } else { + // We don't know yet what that location is, draw a throbing blue circle double value = fmod(current_time, 2); value = 0.5 + 0.5*cos(value * 3.14159f); LLColor4 loading_color(0.0, F32(value/2), F32(value), 1.0); - drawTracking( LLWorldMap::getInstance()->mUnknownLocation, loading_color, TRUE, getString("Loading"), ""); + drawTracking( LLWorldMap::getInstance()->getTrackedPositionGlobal(), loading_color, TRUE, getString("Loading"), ""); } } - // #endif used to be here - + #endif + // turn off the scissor LLGLDisable no_scissor(GL_SCISSOR_TEST); - + updateDirections(); LLView::draw(); + // Get sim info for all sims in view updateVisibleBlocks(); } // end draw() @@ -845,36 +585,182 @@ void LLWorldMapView::setVisible(BOOL visible) LLPanel::setVisible(visible); if (!visible) { - for (S32 map = 0; map < MAP_SIM_IMAGE_TYPES; map++) + // Drop the download of tiles and images priority to nil if we hide the map + LLWorldMap::getInstance()->dropImagePriorities(); + } +} + +void LLWorldMapView::drawMipmap(S32 width, S32 height) +{ + // Compute the level of the mipmap to use for the current scale level + S32 level = LLWorldMipmap::scaleToLevel(sMapScale); + // Set the tile boost level so that unused tiles get to 0 + LLWorldMap::getInstance()->equalizeBoostLevels(); + + // Render whatever we already have loaded if we haven't the current level + // complete and use it as a background (scaled up or scaled down) + if (!sVisibleTilesLoaded) + { + // Note: the (load = false) parameter avoids missing tiles to be fetched (i.e. we render what we have, no more) + // Check all the lower res levels and render them in reverse order (worse to best) + // We need to traverse all the levels as the user can zoom in very fast + for (S32 l = LLWorldMipmap::MAP_LEVELS; l > level; l--) { - for (U32 layer_idx=0; layer_idx<LLWorldMap::getInstance()->mMapLayers[map].size(); ++layer_idx) - { - if (LLWorldMap::getInstance()->mMapLayers[map][layer_idx].LayerDefined) - { - LLWorldMapLayer *layer = &LLWorldMap::getInstance()->mMapLayers[map][layer_idx]; - layer->LayerImage->setBoostLevel(0); - } - } + drawMipmapLevel(width, height, l, false); + } + // Skip the current level, as we'll do it anyway here under... + + // Just go one level down in res as it can really get too much stuff + // when zooming out and too small to see anyway... + if (level > 1) + { + drawMipmapLevel(width, height, level - 1, false); } - for (LLWorldMap::sim_info_map_t::iterator it = LLWorldMap::getInstance()->mSimInfoMap.begin(); - it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it) + } + else + { + //LL_INFOS("World Map") << "Render complete, don't draw background..." << LL_ENDL; + } + + // Render the current level + sVisibleTilesLoaded = drawMipmapLevel(width, height, level); + + return; +} + +// Return true if all the tiles required to render that level have been fetched or are truly missing +bool LLWorldMapView::drawMipmapLevel(S32 width, S32 height, S32 level, bool load) +{ + // Check input level + llassert (level > 0); + if (level <= 0) + return false; + + // Count tiles hit and completed + S32 completed_tiles = 0; + S32 total_tiles = 0; + + // Size in meters (global) of each tile of that level + S32 tile_width = LLWorldMipmap::MAP_TILE_SIZE * (1 << (level - 1)); + // Dimension of the screen in meter at that scale + LLVector3d pos_SW = viewPosToGlobal(0, 0); + LLVector3d pos_NE = viewPosToGlobal(width, height); + // Add external band of tiles on the outskirt so to hit the partially displayed tiles right and top + pos_NE[VX] += tile_width; + pos_NE[VY] += tile_width; + + // Iterate through the tiles on screen: we just need to ask for one tile every tile_width meters + U32 grid_x, grid_y; + for (F64 index_y = pos_SW[VY]; index_y < pos_NE[VY]; index_y += tile_width) + { + for (F64 index_x = pos_SW[VX]; index_x < pos_NE[VX]; index_x += tile_width) { - LLSimInfo* info = (*it).second; - if (info->mCurrentImage.notNull()) + // Compute the world coordinates of the current point + LLVector3d pos_global(index_x, index_y, pos_SW[VZ]); + // Convert to the mipmap level coordinates for that point (i.e. which tile to we hit) + LLWorldMipmap::globalToMipmap(pos_global[VX], pos_global[VY], level, &grid_x, &grid_y); + // Get the tile. Note: NULL means that the image does not exist (so it's considered "complete" as far as fetching is concerned) + LLPointer<LLViewerFetchedTexture> simimage = LLWorldMap::getInstance()->getObjectsTile(grid_x, grid_y, level, load); + if (simimage) { - info->mCurrentImage->setBoostLevel(0); + // Checks that the image has a valid texture + if (simimage->hasGLTexture()) + { + // Increment the number of completly fetched tiles + completed_tiles++; + + // Convert those coordinates (SW corner of the mipmap tile) into world (meters) coordinates + pos_global[VX] = grid_x * REGION_WIDTH_METERS; + pos_global[VY] = grid_y * REGION_WIDTH_METERS; + // Now to screen coordinates for SW corner of that tile + LLVector3 pos_screen = globalPosToView (pos_global); + F32 left = pos_screen[VX]; + F32 bottom = pos_screen[VY]; + // Compute the NE corner coordinates of the tile now + pos_global[VX] += tile_width; + pos_global[VY] += tile_width; + pos_screen = globalPosToView (pos_global); + F32 right = pos_screen[VX]; + F32 top = pos_screen[VY]; + + // Draw the tile + LLGLSUIDefault gls_ui; + gGL.getTexUnit(0)->bind(simimage.get()); + simimage->setAddressMode(LLTexUnit::TAM_CLAMP); + + gGL.setSceneBlendType(LLRender::BT_ALPHA); + gGL.color4f(1.f, 1.0f, 1.0f, 1.0f); + + gGL.begin(LLRender::QUADS); + gGL.texCoord2f(0.f, 1.f); + gGL.vertex3f(left, top, 0.f); + gGL.texCoord2f(0.f, 0.f); + gGL.vertex3f(left, bottom, 0.f); + gGL.texCoord2f(1.f, 0.f); + gGL.vertex3f(right, bottom, 0.f); + gGL.texCoord2f(1.f, 1.f); + gGL.vertex3f(right, top, 0.f); + gGL.end(); +#if DEBUG_DRAW_TILE + drawTileOutline(level, top, left, bottom, right); +#endif // DEBUG_DRAW_TILE + } + //else + //{ + // Waiting for a tile -> the level is not complete + // LL_INFOS("World Map") << "Unfetched tile. level = " << level << LL_ENDL; + //} } - if (info->mOverlayImage.notNull()) + else { - info->mOverlayImage->setBoostLevel(0); + // Unexistent tiles are counted as "completed" + completed_tiles++; } + // Increment the number of tiles in that level / screen + total_tiles++; } } + return (completed_tiles == total_tiles); +} + +// Draw lines (rectangle outline and cross) to visualize the position of the tile +// Used for debug only +void LLWorldMapView::drawTileOutline(S32 level, F32 top, F32 left, F32 bottom, F32 right) +{ + gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); + + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + if (level == 1) + gGL.color3f(1.f, 0.f, 0.f); // red + else if (level == 2) + gGL.color3f(0.f, 1.f, 0.f); // green + else if (level == 3) + gGL.color3f(0.f, 0.f, 1.f); // blue + else if (level == 4) + gGL.color3f(1.f, 1.f, 0.f); // yellow + else if (level == 5) + gGL.color3f(1.f, 0.f, 1.f); // magenta + else if (level == 6) + gGL.color3f(0.f, 1.f, 1.f); // cyan + else if (level == 7) + gGL.color3f(1.f, 1.f, 1.f); // white + else + gGL.color3f(0.f, 0.f, 0.f); // black + gGL.begin(LLRender::LINE_STRIP); + gGL.vertex2f(left, top); + gGL.vertex2f(right, bottom); + gGL.vertex2f(left, bottom); + gGL.vertex2f(right, top); + gGL.vertex2f(left, top); + gGL.vertex2f(left, bottom); + gGL.vertex2f(right, bottom); + gGL.vertex2f(right, top); + gGL.end(); } -void LLWorldMapView::drawGenericItems(const LLWorldMap::item_info_list_t& items, LLUIImagePtr image) +void LLWorldMapView::drawGenericItems(const LLSimInfo::item_info_list_t& items, LLUIImagePtr image) { - LLWorldMap::item_info_list_t::const_iterator e; + LLSimInfo::item_info_list_t::const_iterator e; for (e = items.begin(); e != items.end(); ++e) { drawGenericItem(*e, image); @@ -883,7 +769,7 @@ void LLWorldMapView::drawGenericItems(const LLWorldMap::item_info_list_t& items, void LLWorldMapView::drawGenericItem(const LLItemInfo& item, LLUIImagePtr image) { - drawImage(item.mPosGlobal, image); + drawImage(item.getGlobalPosition(), image); } @@ -906,137 +792,91 @@ void LLWorldMapView::drawImageStack(const LLVector3d& global_pos, LLUIImagePtr i } } - -void LLWorldMapView::drawAgents() +void LLWorldMapView::drawItems() { - static LLUIColor map_avatar_color = LLUIColorTable::instance().getColor("MapAvatarColor", LLColor4::white); - static LLUIColor map_avatar_friend_color = LLUIColorTable::instance().getColor("MapAvatarFriendColor", LLColor4::white); - - F32 agents_scale = (gMapScale * 0.9f) / 256.f; + bool mature_enabled = gAgent.canAccessMature(); + bool adult_enabled = gAgent.canAccessAdult(); + + BOOL show_mature = mature_enabled && gSavedSettings.getBOOL("ShowMatureEvents"); + BOOL show_adult = adult_enabled && gSavedSettings.getBOOL("ShowAdultEvents"); for (handle_list_t::iterator iter = mVisibleRegions.begin(); iter != mVisibleRegions.end(); ++iter) { U64 handle = *iter; - LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); - if (siminfo && (siminfo->mAccess == SIM_ACCESS_DOWN)) + LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle); + if ((info == NULL) || (info->isDown())) { continue; } - LLWorldMap::agent_list_map_t::iterator counts_iter = LLWorldMap::getInstance()->mAgentLocationsMap.find(handle); - if (siminfo && siminfo->mShowAgentLocations && counts_iter != LLWorldMap::getInstance()->mAgentLocationsMap.end()) + // Infohubs + if (gSavedSettings.getBOOL("MapShowInfohubs")) { - // Show Individual agents (or little stacks where real agents are) - LLWorldMap::item_info_list_t& agentcounts = counts_iter->second; - S32 sim_agent_count = 0; - for (LLWorldMap::item_info_list_t::iterator iter = agentcounts.begin(); - iter != agentcounts.end(); ++iter) - { - const LLItemInfo& info = *iter; - S32 agent_count = info.mExtra; - sim_agent_count += info.mExtra; - // Here's how we'd choose the color if info.mID were available but it's not being sent: - //LLColor4 color = (agent_count == 1 && is_agent_friend(info.mID)) ? map_avatar_friend_color : map_avatar_color; - drawImageStack(info.mPosGlobal, sAvatarSmallImage, agent_count, 3.f, map_avatar_color); - } - LLWorldMap::getInstance()->mNumAgents[handle] = sim_agent_count; // override mNumAgents for this sim + drawGenericItems(info->getInfoHub(), sInfohubImage); } - else + // Telehubs + if (gSavedSettings.getBOOL("MapShowTelehubs")) { - // Show agent 'stack' at center of sim - S32 num_agents = LLWorldMap::getInstance()->mNumAgents[handle]; - if (num_agents > 0) + drawGenericItems(info->getTeleHub(), sTelehubImage); + } + // Land for sale + if (gSavedSettings.getBOOL("MapShowLandForSale")) + { + drawGenericItems(info->getLandForSale(), sForSaleImage); + // for 1.23, we're showing normal land and adult land in the same UI; you don't + // get a choice about which ones you want. If you're currently asking for adult + // content and land you'll get the adult land. + if (gAgent.canAccessAdult()) { - LLVector3d region_center = from_region_handle(handle); - region_center[VX] += REGION_WIDTH_METERS / 2; - region_center[VY] += REGION_WIDTH_METERS / 2; - // Reduce the stack size as you zoom out - always display at lease one agent where there is one or more - S32 agent_count = (S32)(((num_agents-1) * agents_scale + (num_agents-1) * 0.1f)+.1f) + 1; - drawImageStack(region_center, sAvatarSmallImage, agent_count, 3.f, map_avatar_color); + drawGenericItems(info->getLandForSaleAdult(), sForSaleAdultImage); } } + // PG Events + if (gSavedSettings.getBOOL("MapShowEvents")) + { + drawGenericItems(info->getPGEvent(), sEventImage); + } + // Mature Events + if (show_mature) + { + drawGenericItems(info->getMatureEvent(), sEventMatureImage); + } + // Adult Events + if (show_adult) + { + drawGenericItems(info->getAdultEvent(), sEventAdultImage); + } } } - -void LLWorldMapView::drawEvents() +void LLWorldMapView::drawAgents() { - bool mature_enabled = gAgent.canAccessMature(); - bool adult_enabled = gAgent.canAccessAdult(); - - BOOL show_pg = gSavedSettings.getBOOL("MapShowEvents"); - BOOL show_mature = mature_enabled && gSavedSettings.getBOOL("ShowMatureEvents"); - BOOL show_adult = adult_enabled && gSavedSettings.getBOOL("ShowAdultEvents"); + static LLUIColor map_avatar_color = LLUIColorTable::instance().getColor("MapAvatarColor", LLColor4::white); - // First the non-selected events - LLWorldMap::item_info_list_t::const_iterator e; - if (show_pg) + for (handle_list_t::iterator iter = mVisibleRegions.begin(); iter != mVisibleRegions.end(); ++iter) { - for (e = LLWorldMap::getInstance()->mPGEvents.begin(); e != LLWorldMap::getInstance()->mPGEvents.end(); ++e) + U64 handle = *iter; + LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); + if ((siminfo == NULL) || (siminfo->isDown())) { - if (!e->mSelected) - { - drawGenericItem(*e, sEventImage); - } + continue; } - } - if (show_mature) - { - for (e = LLWorldMap::getInstance()->mMatureEvents.begin(); e != LLWorldMap::getInstance()->mMatureEvents.end(); ++e) - { - if (!e->mSelected) - { - drawGenericItem(*e, sEventMatureImage); - } - } - } - if (show_adult) - { - for (e = LLWorldMap::getInstance()->mAdultEvents.begin(); e != LLWorldMap::getInstance()->mAdultEvents.end(); ++e) - { - if (!e->mSelected) - { - drawGenericItem(*e, sEventAdultImage); - } - } - } - // Then the selected events - if (show_pg) - { - for (e = LLWorldMap::getInstance()->mPGEvents.begin(); e != LLWorldMap::getInstance()->mPGEvents.end(); ++e) + LLSimInfo::item_info_list_t::const_iterator it = siminfo->getAgentLocation().begin(); + while (it != siminfo->getAgentLocation().end()) { - if (e->mSelected) - { - drawGenericItem(*e, sEventImage); - } + // Show Individual agents (or little stacks where real agents are) + + // Here's how we'd choose the color if info.mID were available but it's not being sent: + // LLColor4 color = (agent_count == 1 && is_agent_friend(info.mID)) ? friend_color : avatar_color; + drawImageStack(it->getGlobalPosition(), sAvatarSmallImage, it->getCount(), 3.f, map_avatar_color); + ++it; } } - if (show_mature) - { - for (e = LLWorldMap::getInstance()->mMatureEvents.begin(); e != LLWorldMap::getInstance()->mMatureEvents.end(); ++e) - { - if (e->mSelected) - { - drawGenericItem(*e, sEventMatureImage); - } - } - } - if (show_adult) - { - for (e = LLWorldMap::getInstance()->mAdultEvents.begin(); e != LLWorldMap::getInstance()->mAdultEvents.end(); ++e) - { - if (e->mSelected) - { - drawGenericItem(*e, sEventAdultImage); - } - } - } } - void LLWorldMapView::drawFrustum() { // Draw frustum - F32 meters_to_pixels = gMapScale/ REGION_WIDTH_METERS; + F32 meters_to_pixels = sMapScale/ REGION_WIDTH_METERS; F32 horiz_fov = LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect(); F32 far_clip_meters = LLViewerCamera::getInstance()->getFar(); @@ -1077,8 +917,8 @@ LLVector3 LLWorldMapView::globalPosToView( const LLVector3d& global_pos ) LLVector3 pos_local; pos_local.setVec(relative_pos_global); // convert to floats from doubles - pos_local.mV[VX] *= sPixelsPerMeter; - pos_local.mV[VY] *= sPixelsPerMeter; + pos_local.mV[VX] *= sMapScale / REGION_WIDTH_METERS; + pos_local.mV[VY] *= sMapScale / REGION_WIDTH_METERS; // leave Z component in meters @@ -1162,7 +1002,7 @@ LLVector3d LLWorldMapView::viewPosToGlobal( S32 x, S32 y ) LLVector3 pos_local( (F32)x, (F32)y, 0.f ); - pos_local *= ( REGION_WIDTH_METERS / gMapScale ); + pos_local *= ( REGION_WIDTH_METERS / sMapScale ); LLVector3d pos_global; pos_global.setVec( pos_local ); @@ -1183,23 +1023,20 @@ LLVector3d LLWorldMapView::viewPosToGlobal( S32 x, S32 y ) BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, MASK mask ) { LLVector3d pos_global = viewPosToGlobal(x, y); - + U64 handle = to_region_handle(pos_global); std::string tooltip_msg; - LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global); + LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle); if (info) { LLViewerRegion *region = gAgent.getRegion(); - std::string message = - llformat("%s (%s)", - info->mName.c_str(), - LLViewerRegion::accessToString(info->mAccess).c_str()); + std::string message = llformat("%s (%s)", info->getName().c_str(), info->getAccessString().c_str()); - if (info->mAccess != SIM_ACCESS_DOWN) + if (!info->isDown()) { - S32 agent_count = LLWorldMap::getInstance()->mNumAgents[info->mHandle]; - if (region && region->getHandle() == info->mHandle) + S32 agent_count = info->getAgentCount(); + if (region && (region->getHandle() == handle)) { ++agent_count; // Bump by 1 if we're here } @@ -1208,6 +1045,8 @@ 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) @@ -1223,7 +1062,7 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, MASK mask ) tooltip_msg.assign( message ); // Optionally show region flags - std::string region_flags = LLViewerRegion::regionFlagsToString(info->mRegionFlags); + std::string region_flags = info->getFlagsString(); if (!region_flags.empty()) { @@ -1263,6 +1102,9 @@ static void drawDot(F32 x_pixels, F32 y_pixels, } else { + // Draw V indicator for above or below + // *TODO: Replace this vector drawing with icons + F32 left = x_pixels - dot_radius; F32 right = x_pixels + dot_radius; F32 center = (left + right) * 0.5f; @@ -1271,13 +1113,14 @@ static void drawDot(F32 x_pixels, F32 y_pixels, gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.color4fv( color.mV ); - LLUI::setLineWidth(1.5f); - F32 h_bar = relative_z > HEIGHT_THRESHOLD ? top : bottom; // horizontal bar Y + LLUI::setLineWidth(3.0f); + F32 point = relative_z > HEIGHT_THRESHOLD ? top : bottom; // Y pos of the point of the V + F32 back = relative_z > HEIGHT_THRESHOLD ? bottom : top; // Y pos of the ends of the V gGL.begin( LLRender::LINES ); - gGL.vertex2f(center, top); - gGL.vertex2f(left, h_bar); - gGL.vertex2f(right, h_bar); - gGL.vertex2f(right, bottom); + gGL.vertex2f(left, back); + gGL.vertex2f(center, point); + gGL.vertex2f(center, point); + gGL.vertex2f(right, back); gGL.end(); LLUI::setLineWidth(1.0f); } @@ -1292,7 +1135,7 @@ void LLWorldMapView::drawAvatar(F32 x_pixels, F32 dot_radius) { const F32 HEIGHT_THRESHOLD = 7.f; - LLUIImagePtr dot_image = sAvatarSmallImage; + LLUIImagePtr dot_image = sAvatarLevelImage; if(relative_z < -HEIGHT_THRESHOLD) { dot_image = sAvatarBelowImage; @@ -1301,10 +1144,12 @@ void LLWorldMapView::drawAvatar(F32 x_pixels, { dot_image = sAvatarAboveImage; } - dot_image->draw( - llround(x_pixels) - dot_image->getWidth()/2, - llround(y_pixels) - dot_image->getHeight()/2, - color); + S32 dot_width = llround(dot_radius * 2.f); + dot_image->draw(llround(x_pixels - dot_radius), + llround(y_pixels - dot_radius), + dot_width, + dot_width, + color); } // Pass relative Z of 0 to draw at same level. @@ -1565,7 +1410,7 @@ void LLWorldMapView::reshape( S32 width, S32 height, BOOL called_from_parent ) bool LLWorldMapView::checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bool track) { - LLVector3 pos_view = globalPosToView(item.mPosGlobal); + LLVector3 pos_view = globalPosToView(item.getGlobalPosition()); S32 item_x = llround(pos_view.mV[VX]); S32 item_y = llround(pos_view.mV[VY]); @@ -1574,12 +1419,12 @@ bool LLWorldMapView::checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bo if (y < item_y - BIG_DOT_RADIUS) return false; if (y > item_y + BIG_DOT_RADIUS) return false; - LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromHandle(item.mRegionHandle); + LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromHandle(item.getRegionHandle()); if (sim_info) { if (track) { - gFloaterWorldMap->trackLocation(item.mPosGlobal); + gFloaterWorldMap->trackLocation(item.getGlobalPosition()); } } @@ -1588,8 +1433,8 @@ bool LLWorldMapView::checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bo gFloaterWorldMap->trackGenericItem(item); } - item.mSelected = TRUE; - *id = item.mID; +// item.setSelected(true); + *id = item.getUUID(); return true; } @@ -1612,108 +1457,116 @@ void LLWorldMapView::handleClick(S32 x, S32 y, MASK mask, *hit_type = 0; // hit nothing - LLWorldMap::getInstance()->mIsTrackingUnknownLocation = FALSE; - LLWorldMap::getInstance()->mIsTrackingDoubleClick = FALSE; - LLWorldMap::getInstance()->mIsTrackingCommit = FALSE; - - LLWorldMap::item_info_list_t::iterator it; - - // clear old selected stuff - for (it = LLWorldMap::getInstance()->mPGEvents.begin(); it != LLWorldMap::getInstance()->mPGEvents.end(); ++it) - { - (*it).mSelected = FALSE; - } - for (it = LLWorldMap::getInstance()->mMatureEvents.begin(); it != LLWorldMap::getInstance()->mMatureEvents.end(); ++it) - { - (*it).mSelected = FALSE; - } - for (it = LLWorldMap::getInstance()->mAdultEvents.begin(); it != LLWorldMap::getInstance()->mAdultEvents.end(); ++it) - { - (*it).mSelected = FALSE; - } - for (it = LLWorldMap::getInstance()->mLandForSale.begin(); it != LLWorldMap::getInstance()->mLandForSale.end(); ++it) - { - (*it).mSelected = FALSE; - } - - // Select event you clicked on - if (gSavedSettings.getBOOL("MapShowEvents")) - { - for (it = LLWorldMap::getInstance()->mPGEvents.begin(); it != LLWorldMap::getInstance()->mPGEvents.end(); ++it) - { - LLItemInfo& event = *it; - - if (checkItemHit(x, y, event, id, false)) - { - *hit_type = MAP_ITEM_PG_EVENT; - mItemPicked = TRUE; - gFloaterWorldMap->trackEvent(event); - return; - } - } - } - if (gSavedSettings.getBOOL("ShowMatureEvents")) - { - for (it = LLWorldMap::getInstance()->mMatureEvents.begin(); it != LLWorldMap::getInstance()->mMatureEvents.end(); ++it) - { - LLItemInfo& event = *it; - - if (checkItemHit(x, y, event, id, false)) - { - *hit_type = MAP_ITEM_MATURE_EVENT; - mItemPicked = TRUE; - gFloaterWorldMap->trackEvent(event); - return; - } - } - } - if (gSavedSettings.getBOOL("ShowAdultEvents")) - { - for (it = LLWorldMap::getInstance()->mAdultEvents.begin(); it != LLWorldMap::getInstance()->mAdultEvents.end(); ++it) - { - LLItemInfo& event = *it; - - if (checkItemHit(x, y, event, id, false)) - { - *hit_type = MAP_ITEM_ADULT_EVENT; - mItemPicked = TRUE; - gFloaterWorldMap->trackEvent(event); - return; - } - } - } + LLWorldMap::getInstance()->cancelTracking(); - if (gSavedSettings.getBOOL("MapShowLandForSale")) + S32 level = LLWorldMipmap::scaleToLevel(sMapScale); + // If the zoom level is not too far out already, test hits + if (level <= DRAW_SIMINFO_THRESHOLD) { - for (it = LLWorldMap::getInstance()->mLandForSale.begin(); it != LLWorldMap::getInstance()->mLandForSale.end(); ++it) - { - LLItemInfo& land = *it; + bool show_mature = gAgent.canAccessMature() && gSavedSettings.getBOOL("ShowMatureEvents"); + bool show_adult = gAgent.canAccessAdult() && gSavedSettings.getBOOL("ShowAdultEvents"); - if (checkItemHit(x, y, land, id, true)) - { - *hit_type = MAP_ITEM_LAND_FOR_SALE; - mItemPicked = TRUE; - return; - } - } - - for (it = LLWorldMap::getInstance()->mLandForSaleAdult.begin(); it != LLWorldMap::getInstance()->mLandForSaleAdult.end(); ++it) + // Test hits if trackable data are displayed, otherwise, we don't even bother + if (gSavedSettings.getBOOL("MapShowEvents") || show_mature || show_adult || gSavedSettings.getBOOL("MapShowLandForSale")) { - LLItemInfo& land = *it; - - if (checkItemHit(x, y, land, id, true)) + // Iterate through the visible regions + for (handle_list_t::iterator iter = mVisibleRegions.begin(); iter != mVisibleRegions.end(); ++iter) { - *hit_type = MAP_ITEM_LAND_FOR_SALE_ADULT; - mItemPicked = TRUE; - return; + U64 handle = *iter; + LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); + if ((siminfo == NULL) || (siminfo->isDown())) + { + continue; + } + // If on screen check hits with the visible item lists + if (gSavedSettings.getBOOL("MapShowEvents")) + { + LLSimInfo::item_info_list_t::const_iterator it = siminfo->getPGEvent().begin(); + while (it != siminfo->getPGEvent().end()) + { + LLItemInfo event = *it; + if (checkItemHit(x, y, event, id, false)) + { + *hit_type = MAP_ITEM_PG_EVENT; + mItemPicked = TRUE; + gFloaterWorldMap->trackEvent(event); + return; + } + ++it; + } + } + if (show_mature) + { + LLSimInfo::item_info_list_t::const_iterator it = siminfo->getMatureEvent().begin(); + while (it != siminfo->getMatureEvent().end()) + { + LLItemInfo event = *it; + if (checkItemHit(x, y, event, id, false)) + { + *hit_type = MAP_ITEM_MATURE_EVENT; + mItemPicked = TRUE; + gFloaterWorldMap->trackEvent(event); + return; + } + ++it; + } + } + if (show_adult) + { + LLSimInfo::item_info_list_t::const_iterator it = siminfo->getAdultEvent().begin(); + while (it != siminfo->getAdultEvent().end()) + { + LLItemInfo event = *it; + if (checkItemHit(x, y, event, id, false)) + { + *hit_type = MAP_ITEM_ADULT_EVENT; + mItemPicked = TRUE; + gFloaterWorldMap->trackEvent(event); + return; + } + ++it; + } + } + if (gSavedSettings.getBOOL("MapShowLandForSale")) + { + LLSimInfo::item_info_list_t::const_iterator it = siminfo->getLandForSale().begin(); + while (it != siminfo->getLandForSale().end()) + { + LLItemInfo event = *it; + if (checkItemHit(x, y, event, id, true)) + { + *hit_type = MAP_ITEM_LAND_FOR_SALE; + mItemPicked = TRUE; + return; + } + ++it; + } + // for 1.23, we're showing normal land and adult land in the same UI; you don't + // get a choice about which ones you want. If you're currently asking for adult + // content and land you'll get the adult land. + if (gAgent.canAccessAdult()) + { + LLSimInfo::item_info_list_t::const_iterator it = siminfo->getLandForSaleAdult().begin(); + while (it != siminfo->getLandForSaleAdult().end()) + { + LLItemInfo event = *it; + if (checkItemHit(x, y, event, id, true)) + { + *hit_type = MAP_ITEM_LAND_FOR_SALE_ADULT; + mItemPicked = TRUE; + return; + } + ++it; + } + } + } } } } - // If we get here, we haven't clicked on an icon + // If we get here, we haven't clicked on anything gFloaterWorldMap->trackLocation(pos_global); mItemPicked = FALSE; - *id = LLUUID::null; return; } @@ -1774,59 +1627,36 @@ BOOL LLWorldMapView::handleMouseUp( S32 x, S32 y, MASK mask ) return FALSE; } -U32 LLWorldMapView::updateBlock(S32 block_x, S32 block_y) +void LLWorldMapView::updateVisibleBlocks() { - U32 blocks_requested = 0; - S32 offset = block_x | (block_y * MAP_BLOCK_RES); - if (!LLWorldMap::getInstance()->mMapBlockLoaded[LLWorldMap::getInstance()->mCurrentMap][offset]) + if (LLWorldMipmap::scaleToLevel(sMapScale) > DRAW_SIMINFO_THRESHOLD) { -// llinfos << "Loading Block (" << block_x << "," << block_y << ")" << llendl; - LLWorldMap::getInstance()->sendMapBlockRequest(block_x << 3, block_y << 3, (block_x << 3) + 7, (block_y << 3) + 7); - LLWorldMap::getInstance()->mMapBlockLoaded[LLWorldMap::getInstance()->mCurrentMap][offset] = TRUE; - blocks_requested++; + // If we're zoomed out too much, we just don't load all those sim info: too much! + return; } - return blocks_requested; -} -U32 LLWorldMapView::updateVisibleBlocks() -{ - if (gMapScale < SIM_MAP_SCALE) - { - // We don't care what is loaded if we're zoomed out - return 0; - } + // Load the blocks visible in the current World Map view + // Get the World Map view coordinates and boundaries LLVector3d camera_global = gAgent.getCameraPositionGlobal(); - - F32 pixels_per_region = gMapScale; const S32 width = getRect().getWidth(); const S32 height = getRect().getHeight(); - // Convert pan to sim coordinates - S32 world_center_x_lo = S32(((-sPanX - width/2) / pixels_per_region) + (camera_global.mdV[0] / REGION_WIDTH_METERS)); - S32 world_center_x_hi = S32(((-sPanX + width/2) / pixels_per_region) + (camera_global.mdV[0] / REGION_WIDTH_METERS)); - S32 world_center_y_lo = S32(((-sPanY - height/2) / pixels_per_region) + (camera_global.mdV[1] / REGION_WIDTH_METERS)); - S32 world_center_y_hi = S32(((-sPanY + height/2)/ pixels_per_region) + (camera_global.mdV[1] / REGION_WIDTH_METERS)); - - // Find the corresponding 8x8 block - S32 world_block_x_lo = world_center_x_lo >> 3; - S32 world_block_x_hi = world_center_x_hi >> 3; - S32 world_block_y_lo = world_center_y_lo >> 3; - S32 world_block_y_hi = world_center_y_hi >> 3; - - U32 blocks_requested = 0; - const U32 max_blocks_requested = 9; + const F32 half_width = F32(width) / 2.0f; + const F32 half_height = F32(height) / 2.0f; - for (S32 block_x = llmax(world_block_x_lo, 0); block_x <= llmin(world_block_x_hi, MAP_BLOCK_RES-1); ++block_x) - { - for (S32 block_y = llmax(world_block_y_lo, 0); block_y <= llmin(world_block_y_hi, MAP_BLOCK_RES-1); ++block_y) - { - blocks_requested += updateBlock(block_x, block_y); - if (blocks_requested >= max_blocks_requested) - return blocks_requested; - } - } - return blocks_requested; -} + // Compute center into sim grid coordinates + S32 world_center_x = S32((-sPanX / sMapScale) + (camera_global.mdV[0] / REGION_WIDTH_METERS)); + S32 world_center_y = S32((-sPanY / sMapScale) + (camera_global.mdV[1] / REGION_WIDTH_METERS)); + + // Compute the boundaries into sim grid coordinates + S32 world_left = world_center_x - S32(half_width / sMapScale) - 1; + S32 world_right = world_center_x + S32(half_width / sMapScale) + 1; + S32 world_bottom = world_center_y - S32(half_height / sMapScale) - 1; + S32 world_top = world_center_y + S32(half_height / sMapScale) + 1; + + //LL_INFOS("World Map") << "LLWorldMapView::updateVisibleBlocks() : sMapScale = " << sMapScale << ", left = " << world_left << ", right = " << world_right << ", bottom = " << world_bottom << ", top = " << world_top << LL_ENDL; + LLWorldMap::getInstance()->updateRegions(world_left, world_bottom, world_right, world_top); +} BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask ) { @@ -1915,16 +1745,16 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask ) } default: { - if (LLWorldMap::getInstance()->mIsTrackingUnknownLocation) + if (LLWorldMap::getInstance()->isTracking()) { - LLWorldMap::getInstance()->mIsTrackingDoubleClick = TRUE; + LLWorldMap::getInstance()->setTrackingDoubleClick(); } else { // Teleport if we got a valid location LLVector3d pos_global = viewPosToGlobal(x,y); LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global); - if (sim_info && sim_info->mAccess != SIM_ACCESS_DOWN) + if (sim_info && !sim_info->isDown()) { gAgent.teleportViaLocation( pos_global ); } diff --git a/indra/newview/llworldmapview.h b/indra/newview/llworldmapview.h index 66793f01018..9eecacb2d83 100644 --- a/indra/newview/llworldmapview.h +++ b/indra/newview/llworldmapview.h @@ -30,27 +30,23 @@ * $/LicenseInfo$ */ -// Global map of the world. +// View of the global map of the world + +// The data (model) for the global map (a singleton, unique to the application instance) is +// in LLWorldMap and is typically accessed using LLWorldMap::getInstance() #ifndef LL_LLWORLDMAPVIEW_H #define LL_LLWORLDMAPVIEW_H #include "llpanel.h" -#include "v3math.h" -#include "v3dmath.h" -#include "v4color.h" -#include "llviewertexture.h" -#include "llmapimagetype.h" #include "llworldmap.h" - -class LLItemInfo; +#include "v4color.h" const S32 DEFAULT_TRACKING_ARROW_SIZE = 16; -class LLColor4; -class LLColor4U; -class LLCoordGL; -class LLViewerTexture; +class LLUUID; +class LLVector3d; +class LLVector3; class LLTextBox; @@ -77,22 +73,26 @@ class LLWorldMapView : public LLPanel bool checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bool track); void handleClick(S32 x, S32 y, MASK mask, S32* hit_type, LLUUID* id); - // Scale and pan are shared across all instances. + // Scale and pan are shared across all instances! (i.e. Terrain and Objects maps are always registered) static void setScale( F32 scale ); static void translatePan( S32 delta_x, S32 delta_y ); static void setPan( S32 x, S32 y, BOOL snap = TRUE ); + // Return true if the current scale level is above the threshold for accessing region info + static bool showRegionInfo(); LLVector3 globalPosToView(const LLVector3d& global_pos); LLVector3d viewPosToGlobal(S32 x,S32 y); virtual void draw(); - void drawGenericItems(const LLWorldMap::item_info_list_t& items, LLUIImagePtr image); + void drawGenericItems(const LLSimInfo::item_info_list_t& items, LLUIImagePtr image); void drawGenericItem(const LLItemInfo& item, LLUIImagePtr image); void drawImage(const LLVector3d& global_pos, LLUIImagePtr image, const LLColor4& color = LLColor4::white); void drawImageStack(const LLVector3d& global_pos, LLUIImagePtr image, U32 count, F32 offset, const LLColor4& color); void drawAgents(); - void drawEvents(); + void drawItems(); void drawFrustum(); + void drawMipmap(S32 width, S32 height); + bool drawMipmapLevel(S32 width, S32 height, S32 level, bool load = true); static void cleanupTextures(); @@ -108,7 +108,7 @@ class LLWorldMapView : public LLPanel F32 y_pixels, const LLColor4& color, F32 relative_z = 0.f, - F32 dot_radius = 3.f); + F32 dot_radius = 5.f); static void drawTrackingCircle( const LLRect& rect, S32 x, S32 y, const LLColor4& color, @@ -129,9 +129,7 @@ class LLWorldMapView : public LLPanel static void clearLastClick() { sHandledLastClick = FALSE; } // if the view changes, download additional sim info as needed - // return value is number of blocks newly requested. - U32 updateBlock(S32 block_x, S32 block_y); - U32 updateVisibleBlocks(); + void updateVisibleBlocks(); protected: void setDirectionPos( LLTextBox* text_box, F32 rotation ); @@ -140,11 +138,13 @@ class LLWorldMapView : public LLPanel public: LLColor4 mBackgroundColor; - static LLUIImagePtr sAvatarYouSmallImage; static LLUIImagePtr sAvatarSmallImage; - static LLUIImagePtr sAvatarLargeImage; + static LLUIImagePtr sAvatarYouImage; + static LLUIImagePtr sAvatarYouLargeImage; + static LLUIImagePtr sAvatarLevelImage; static LLUIImagePtr sAvatarAboveImage; static LLUIImagePtr sAvatarBelowImage; + static LLUIImagePtr sTelehubImage; static LLUIImagePtr sInfohubImage; static LLUIImagePtr sHomeImage; @@ -157,9 +157,7 @@ class LLWorldMapView : public LLPanel static LLUIImagePtr sForSaleImage; static LLUIImagePtr sForSaleAdultImage; - static F32 sThresholdA; - static F32 sThresholdB; - static F32 sPixelsPerMeter; // world meters to map pixels + static F32 sMapScale; // scale = size of a region in pixels BOOL mItemPicked; @@ -169,6 +167,7 @@ class LLWorldMapView : public LLPanel static F32 sTargetPanY; // in pixels static S32 sTrackingArrowX; static S32 sTrackingArrowY; + static bool sVisibleTilesLoaded; // Are we mid-pan from a user drag? BOOL mPanning; @@ -191,10 +190,14 @@ class LLWorldMapView : public LLPanel static BOOL sHandledLastClick; S32 mSelectIDStart; + // Keep the list of regions that are displayed on screen. Avoids iterating through the whole region map after draw(). typedef std::vector<U64> handle_list_t; handle_list_t mVisibleRegions; // set every frame static std::map<std::string,std::string> sStringsMap; + +private: + void drawTileOutline(S32 level, F32 top, F32 left, F32 bottom, F32 right); }; #endif diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp new file mode 100644 index 00000000000..8d3165b98c6 --- /dev/null +++ b/indra/newview/llworldmipmap.cpp @@ -0,0 +1,275 @@ +/** + * @file llworldmipmap.cpp + * @brief Data storage for the S3 mipmap of the entire world. + * + * $LicenseInfo:firstyear=2003&license=viewergpl$ + * + * Copyright (c) 2003-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llworldmipmap.h" + +#include "llviewertexturelist.h" +#include "math.h" // log() + +// Turn this on to output tile stats in the standard output +#define DEBUG_TILES_STAT 0 + +LLWorldMipmap::LLWorldMipmap() : + mCurrentLevel(0) +{ +} + +LLWorldMipmap::~LLWorldMipmap() +{ + reset(); +} + +// Delete all sublevel maps and clean them +void LLWorldMipmap::reset() +{ + for (int level = 0; level < MAP_LEVELS; level++) + { + mWorldObjectsMipMap[level].clear(); + } +} + +// This method should be called before each use of the mipmap (typically, before each draw), so that to let +// the boost level of unused tiles to drop to 0 (BOOST_NONE). +// Tiles that are accessed have had their boost level pushed to BOOST_MAP_VISIBLE so we can identify them. +// The result of this strategy is that if a tile is not used during 2 consecutive loops, its boost level drops to 0. +void LLWorldMipmap::equalizeBoostLevels() +{ +#if DEBUG_TILES_STAT + S32 nb_missing = 0; + S32 nb_tiles = 0; + S32 nb_visible = 0; +#endif // DEBUG_TILES_STAT + // For each level + for (S32 level = 0; level < MAP_LEVELS; level++) + { + sublevel_tiles_t& level_mipmap = mWorldObjectsMipMap[level]; + // For each tile + for (sublevel_tiles_t::iterator iter = level_mipmap.begin(); iter != level_mipmap.end(); iter++) + { + LLPointer<LLViewerFetchedTexture> img = iter->second; + S32 current_boost_level = img->getBoostLevel(); + if (current_boost_level == LLViewerTexture::BOOST_MAP_VISIBLE) + { + // If level was BOOST_MAP_VISIBLE, the tile has been used in the last draw so keep it high + img->setBoostLevel(LLViewerTexture::BOOST_MAP); + } + else + { + // If level was BOOST_MAP only (or anything else...), the tile wasn't used in the last draw + // so we drop its boost level to BOOST_NONE. + img->setBoostLevel(LLViewerTexture::BOOST_NONE); + } +#if DEBUG_TILES_STAT + // Increment some stats if compile option on + nb_tiles++; + if (current_boost_level == LLViewerTexture::BOOST_MAP_VISIBLE) + { + nb_visible++; + } + if (img->isMissingAsset()) + { + nb_missing++; + } +#endif // DEBUG_TILES_STAT + } + } +#if DEBUG_TILES_STAT + LL_INFOS("World Map") << "LLWorldMipmap tile stats : total requested = " << nb_tiles << ", visible = " << nb_visible << ", missing = " << nb_missing << LL_ENDL; +#endif // DEBUG_TILES_STAT +} + +// This method should be used when the mipmap is not actively used for a while, e.g., the map UI is hidden +void LLWorldMipmap::dropBoostLevels() +{ + // For each level + for (S32 level = 0; level < MAP_LEVELS; level++) + { + sublevel_tiles_t& level_mipmap = mWorldObjectsMipMap[level]; + // For each tile + for (sublevel_tiles_t::iterator iter = level_mipmap.begin(); iter != level_mipmap.end(); iter++) + { + LLPointer<LLViewerFetchedTexture> img = iter->second; + img->setBoostLevel(LLViewerTexture::BOOST_NONE); + } + } +} + +LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load) +{ + // Check the input data + llassert(level <= MAP_LEVELS); + llassert(level >= 1); + + // If the *loading* level changed, cleared the new level from "missed" tiles + // so that we get a chance to reload them + if (load && (level != mCurrentLevel)) + { + cleanMissedTilesFromLevel(level); + mCurrentLevel = level; + } + + // Build the region handle + U64 handle = convertGridToHandle(grid_x, grid_y); + + // Check if the image is around already + sublevel_tiles_t& level_mipmap = mWorldObjectsMipMap[level-1]; + sublevel_tiles_t::iterator found = level_mipmap.find(handle); + + // If not there and load on, go load it + if (found == level_mipmap.end()) + { + if (load) + { + // Load it + LLPointer<LLViewerFetchedTexture> img = loadObjectsTile(grid_x, grid_y, level); + // Insert the image in the map + level_mipmap.insert(sublevel_tiles_t::value_type( handle, img )); + // Find the element again in the map (it's there now...) + found = level_mipmap.find(handle); + } + else + { + // Return with NULL if not found and we're not trying to load + return NULL; + } + } + + // Get the image pointer and check if this asset is missing + LLPointer<LLViewerFetchedTexture> img = found->second; + if (img->isMissingAsset()) + { + // Return NULL if asset missing + return NULL; + } + else + { + // Boost the tile level so to mark it's in use *if* load on + if (load) + { + img->setBoostLevel(LLViewerTexture::BOOST_MAP_VISIBLE); + } + return img; + } +} + +LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 grid_y, S32 level) +{ + // Get the grid coordinates +// std::string imageurl = llformat("http://map.secondlife.com.s3.amazonaws.com/%d/%05d/%05d/map-%d-%d-%d-objects.jpg", + std::string imageurl = llformat("http://map.secondlife.com.s3.amazonaws.com/map-%d-%d-%d-objects.jpg", + level, grid_x, grid_y, level, grid_x, grid_y); + + // DO NOT COMMIT!! DEBUG ONLY!!! + // Use a local jpeg for every tile to test map speed without S3 access + //imageurl = "file://C:\\Develop\\mapserver-distribute-3\\indra\\build-vc80\\mapserver\\relwithdebinfo\\regions\\00995\\01001\\region-995-1001-prims.jpg"; + // END DEBUG + //LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL; + + LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); + img->setBoostLevel(LLViewerTexture::BOOST_MAP); + + // Return the smart pointer + return img; +} + +// This method is used to clean up a level from tiles marked as "missing". +// The idea is to allow tiles that have been improperly marked missing to be reloaded when retraversing the level again. +// When zooming in and out rapidly, some tiles are never properly loaded and, eventually marked missing. +// This creates "blue" areas in a subresolution that never got a chance to reload if we don't clean up the level. +void LLWorldMipmap::cleanMissedTilesFromLevel(S32 level) +{ + // Check the input data + llassert(level <= MAP_LEVELS); + llassert(level >= 0); + + // This happens when the object is first initialized + if (level == 0) + { + return; + } + + // Iterate through the subresolution level and suppress the tiles that are marked as missing + // Note: erasing in a map while iterating through it is bug prone. Using a postfix increment is mandatory here. + sublevel_tiles_t& level_mipmap = mWorldObjectsMipMap[level-1]; + sublevel_tiles_t::iterator it = level_mipmap.begin(); + while (it != level_mipmap.end()) + { + LLPointer<LLViewerFetchedTexture> img = it->second; + if (img->isMissingAsset()) + { + level_mipmap.erase(it++); + } + else + { + ++it; + } + } + return; +} + +// static methods +// Compute the level in the world mipmap (between 1 and MAP_LEVELS, as in the URL) given the scale (size of a sim in screen pixels) +S32 LLWorldMipmap::scaleToLevel(F32 scale) +{ + // If scale really small, picks up the higest level there is (lowest resolution) + if (scale <= F32_MIN) + return MAP_LEVELS; + // Compute the power of two resolution level knowing the base level + S32 level = llfloor((log(REGION_WIDTH_METERS/scale)/log(2.0f)) + 1.0f); + // Check bounds and return the value + if (level > MAP_LEVELS) + return MAP_LEVELS; + else if (level < 1) + return 1; + else + return level; +} + +// Convert world coordinates to mipmap grid coordinates at a given level (between 1 and MAP_LEVELS) +void LLWorldMipmap::globalToMipmap(F64 global_x, F64 global_y, S32 level, U32* grid_x, U32* grid_y) +{ + // Check the input data + llassert(level <= MAP_LEVELS); + llassert(level >= 1); + + // Convert world coordinates into grid coordinates + *grid_x = lltrunc(global_x/REGION_WIDTH_METERS); + *grid_y = lltrunc(global_y/REGION_WIDTH_METERS); + // Compute the valid grid coordinates at that level of the mipmap + S32 regions_in_tile = 1 << (level - 1); + *grid_x = *grid_x - (*grid_x % regions_in_tile); + *grid_y = *grid_y - (*grid_y % regions_in_tile); +} + + diff --git a/indra/newview/llworldmipmap.h b/indra/newview/llworldmipmap.h new file mode 100644 index 00000000000..ecf10034686 --- /dev/null +++ b/indra/newview/llworldmipmap.h @@ -0,0 +1,100 @@ +/** + * @file llworldmipmap.h + * @brief Data storage for the S3 mipmap of the entire world. + * + * $LicenseInfo:firstyear=2003&license=viewergpl$ + * + * Copyright (c) 2003-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLWORLDMIPMAP_H +#define LL_LLWORLDMIPMAP_H + +#include <map> + +#include "llmemory.h" // LLPointer +#include "indra_constants.h" // REGION_WIDTH_UNITS +#include "llregionhandle.h" // to_region_handle() + +class LLViewerFetchedTexture; + +// LLWorldMipmap : Mipmap handling of all the tiles used to render the world at any resolution. +// This class provides a clean structured access to the hierarchy of tiles stored in the +// Amazon S3 repository and abstracts its directory/file structure. +// The interface of this class though still assumes that the caller knows the general level/tiles +// structure (at least, that it exists...) but doesn't requite the caller to know the details of it. +// IOW, you need to know that rendering levels exists as well as grid coordinates for regions, +// but you can ignore where those tiles are located, how to get them, etc... +// The class API gives you back LLPointer<LLViewerFetchedTexture> per tile. + +// See llworldmipmapview.cpp for the implementation of a class who knows how to render an LLWorldMipmap. + +// Implementation notes: +// - On the S3 servers, the tiles are rendered in 2 flavors: Objects and Terrain. +// - For the moment, LLWorldMipmap implements access only to the Objects tiles. +class LLWorldMipmap +{ +public: + // Parameters of the mipmap + static const S32 MAP_LEVELS = 8; // Number of subresolution levels computed by the mapserver + static const S32 MAP_TILE_SIZE = 256; // Width in pixels of the tiles computed by the mapserver + + LLWorldMipmap(); + ~LLWorldMipmap(); + + // Clear up the maps and release all image handles + void reset(); + // Manage the boost levels between loops (typically draw() loops) + void equalizeBoostLevels(); + // Drop the boost levels to none (used when hiding the map) + void dropBoostLevels(); + // Get the tile smart pointer, does the loading if necessary + LLPointer<LLViewerFetchedTexture> getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load = true); + + // Helper functions: those are here as they depend solely on the topology of the mipmap though they don't access it + // Convert sim scale (given in sim width in display pixels) into a mipmap level + static S32 scaleToLevel(F32 scale); + // Convert world coordinates to mipmap grid coordinates at a given level + static void globalToMipmap(F64 global_x, F64 global_y, S32 level, U32* grid_x, U32* grid_y); + +private: + // Get a handle (key) from grid coordinates + U64 convertGridToHandle(U32 grid_x, U32 grid_y) { return to_region_handle(grid_x * REGION_WIDTH_UNITS, grid_y * REGION_WIDTH_UNITS); } + // Load the relevant tile from S3 + LLPointer<LLViewerFetchedTexture> loadObjectsTile(U32 grid_x, U32 grid_y, S32 level); + // Clear a level from its "missing" tiles + void cleanMissedTilesFromLevel(S32 level); + + // The mipmap is organized by resolution level (MAP_LEVELS of them). Each resolution level is an std::map + // using a region_handle as a key and storing a smart pointer to the image as a value. + typedef std::map<U64, LLPointer<LLViewerFetchedTexture> > sublevel_tiles_t; + sublevel_tiles_t mWorldObjectsMipMap[MAP_LEVELS]; +// sublevel_tiles_t mWorldTerrainMipMap[MAP_LEVELS]; + + S32 mCurrentLevel; // The level last accessed by a getObjectsTile() +}; + +#endif // LL_LLWORLDMIPMAP_H diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index b01a4f5161d..17c04a81c27 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1464,6 +1464,7 @@ F32 LLPipeline::calcPixelArea(LLVector3 center, LLVector3 size, LLCamera &camera F32 dist = lookAt.length(); //ramp down distance for nearby objects + //shrink dist by dist/16. if (dist < 16.f) { dist /= 16.f; @@ -3001,15 +3002,6 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate) LLAppViewer::instance()->pingMainloopTimeout("Pipeline:ForceVBO"); - //by bao - //fake vertex buffer updating - //to guaranttee at least updating one VBO buffer every frame - //to walk around the bug caused by ATI card --> DEV-3855 - // - if(forceVBOUpdate) - gSky.mVOSkyp->updateDummyVertexBuffer() ; - - // Initialize lots of GL state to "safe" values glMatrixMode(GL_TEXTURE); glLoadIdentity(); diff --git a/indra/newview/skins/default/textures/map_avatar_32.tga b/indra/newview/skins/default/textures/map_avatar_32.tga new file mode 100644 index 0000000000000000000000000000000000000000..aebeab409366d632722c33328566919423f383fb GIT binary patch literal 2894 zcmZvedq|ac7{|{!>dAA=lRDFF)Rq-x^Aat}G-v8?!?BWSP9<v1g>Dm6Xl*q5W1Vc) zRzWv!wS}QwSc(({x=b)aC5;Tc<pLwSt-E$L^V#?N*n7?fd*$=`p7)&h`&@s|?=_k1 zCgYf9!k_og{5Tnyffw)wKENNm3*HCuAQ>zL%U)l{;{SXQ0cL@zfI1Ff16JVS#L2Xo zr(j?Kyv?tJ0HrCp9{d4XKqu${9iS0ZfFHrvfTkCNa4-$L0q81Swrs@7RKyca&=jNL z*P$Q}w1UxMoP<dj1%2QkC<JsQ8q5ZC))!0wR5F=1@#G2k(E~6&37~E}PC^g506%;I z5<wVv6HrJ!R1H2$7=Hm6<6W8Ha5yABK3=l2vSj7Tm9lEpDoII6k(ihm2?z)f1||%w z7BHA3@E)LriNLDrEF!b=ldAfJg@s9JX{nq$cTSp`nxwwIUXC9>F2{}?lj`bfIdI^B zl$Di9VPT=nnKMW9DW<Ifd<z%{6A}pQPMow&n7$nSt;6YbN^ftkT)K2g+S}WurKLrh zo15kI>C<xR)G4W}tCJ%~j!0!?rIeSK%dTC!G&Zx@EYuU`v<7?$n0~gLLu+Zll?R9c zL%bvYUS3{OQ&S_?uV0sefdRRE`Lc9(cS~nyr*w35NNa1WoIQJ1t)D!3Qh!@jRVDlO z?UUWRcS}J*f%y3Nj9aGmUho-+1e4V&>+%*j2!vkpKcg5L8j`zr@5-%Px8&NjYij?> zl`GQM*C$<FU2^f_MLB=|yxMPQXwYX49XcfY_wQHR%&|sHyZwMo$3--i=6IL^TU<On zJ;i3T$<CcSWo&FrUc7iAPo6xHhYugB3%76ImK!&2$l&0h%Z;9%9!&#NaOTVzIdS5I z96o&5Wq$SQ)#K)w)=H29X0g^hCV?$L{QUeRF)>k`g2Vsi%a`)}`ExbS_#ZrYAouRw zlRJ0rxbnapFn-3)9;0E#&78B^k&%(2)uZ8F@D+$K3^VbAR;yK}Oqrr(+eE{DjM^~% z^yyP|V0d^~9zA-b4zLJp07gy2jF?4YvDs#>WHYDVgZVT_50(N63=EXe&`_b|W*VII z>eVYXI5IM#5kGtOOddaetSM)@X^c@ay{s;~kUh=S6BHCQ9wCjDfH*caC(n8yAt51> zot-VkG~{4pG&VXqss{gETSmonvYpw+TtG*U9@S+U8yo93QV-oE8sWMuqmj9D=Sp#L zv23N0jWlAX1w)-hW7Be}GGC32jjjewPfvF%cR=hDD!&b?sk~^>A}J{;kzZWOHdclS zVm1EHXC`OOnl*0KZU`kCs#R2ti;I(riVFFas&@KIciC&K3H$5n)vKEEwzf8H4E9w{ zPL5lYJH>}a61b36bjOYzvW=oPW|`&W%DI34zOEK7)(aOd=!oJl%*e=a3pPVzF$Fo_ z*fg?m;X+xrZry7^qbb>tTnRUC-qdn&_OUOT(EVIH+U@LxgCNpqypJh3bLLDP>#T=* z=}l3F&E;h@8oQd~jAJ`EIM^+i4~?nD(&7Hn?d$6+X=!O%(CrM{%Hl9&&MFRw{{DWQ z&a9z&##Jx`5`aIq6dv59oIu!Txw*NTG4;@Dc*yBvtULBmczC#5@J~EThkOh{T8RcD zoG6)@nK~2HLr+$k9x@4><V8hA?$MNmXV}%=^i{WT*KC?MZ=S4Ju|kWdN*0!viDSd5 z_nfW2fe^qddZ`M1GJ^>47iW4xLc)KQ%(b<(VzF4p17Z&h1HPYd8SC@Z*B1hQS`Ktf z8%msb><e8bragQ1jPIrNCj&6OMkBm_ncyn{UCai$(J(x2|9N?NT22;Ehm$8~Jsn)K zWQo}AcDJLH&joxLp}dENTZAipg`w}MU;yY_1m7@HQ&Y7C*REYF8#ZjvRmfSLpP#Q| zYQ~HiI*eI2ZbW<*{0$hjAD~&Y=3_IibgWLm|Jh&*J>ceLlj+l^%Yp?9Bq}OOS7vl{ zw7z8UK3{3Lnd`4Dcw{SJ|JYQq7*}eA)}p`<pq+Pxw%fpW-~$k#zvbgvDkeGvu=R2Q zm+|j_O~DQK8^9Necfdq_Y8$S!J8Zl~hl0#Fu{1XQ4i|bXPfbtyJUJ~nWm!b#N6DWi HMVkHrK6S2I literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/map_avatar_above_32.tga b/indra/newview/skins/default/textures/map_avatar_above_32.tga new file mode 100644 index 0000000000000000000000000000000000000000..65bd0561a784cf0402f9978b95e31b45f7127c5b GIT binary patch literal 2909 zcmZuzX=qee7=7=}Ow7J7#>NmZt-(fZM6xuS3R<-_N^EOO7bv7)2`$n;()L%3OKdI4 z4}Y|!Et-Y|6a`U#L=YQL1BtkV#0}g?qFFUbHIvL_=Ic4%^NmjJ4ClV>-gEAEzVF`m z3?tfbemMsIk+HaR0dE7}1C79Mz_-9VKrxUDqyg+Z4=@|h7*RX}JU|SP4}1lX;a7kR zmB5>TQM((BaBws5F;D?421v}|5rDZDjo}6?z#%TexwjsTP_7*)1&qNxXq2)AC!YdT zdjklgq_9%HJl7K3^Xhm$eV5Hh9U3ur?AReWIXSY6SI&Gt$Hgk(6>|1^g}e;+W|hr~ zh=`Dyni}zVJfe5le+!#QyTi3>*W~QkvyzpSWlP54*&o1X0ONTbNClWT8e#(c@yKgh zR}T1;&lMFFCC$yva`EED|A^Axe=N%q9Oc%nTXO&YeK~dNlw@XR+R~)@6QGsMjw9`4 zhh;(*PKD3sRMH(A8!JbS9FgwsZn<#bLb&W^S~vw80&cfk9z1v;LqkI<fBg7yNl#C= zrCCeA1OF$@XPm-nz?SqRBqYd*6DOp%w^uG*y7a2-mPmA-fEj`K_;{6^nwpaS{(c?O z*48FzX=%1JBVxJIa7M)(X8_5-I<10;#Kc57bLNcPxpPPQ`ugPZ<;&99*%=<`7S3}V zW&|@bGGusoSc1WzJbwIG?%uttLt0u|Bqb%qmSvIu0(=6j0+s^XRBj&obaZsc!-o&$ z-o1Nr<HikPopg0|g-cd36XP%=$ch~q84><`KA)c7zI|JBa_G<@NlHqx>yJ4M0+jv& z_(3Hj=>{Vj8yk~Hj~;2FIGzSGTGp{<8$*nZBpFLiP7dVd<;m#isMJx{<Mn!V&YUlc zfx^s`4m2@_!p$leHGlqm&DxVEPh@<2T>WBtXt5J-nCKdc4yC5129_^huJhcbqEDYb zm4Sf)9YoQ?hYzbLm%UgE7A%nS=g(^z>Zs-6bZIQBpAlZaemy+8LJAGQklB?hSIX6^ zSEXKsSU?oIdGn^;ZEbCpxVX6IONWbyIb#y2GchrtM;gkCcVatz`gFM5Viv-8E|<%X zxV-DvuU8S3Or|8~>X>r$=us&tDbW>NT3V`tB&P@kCnqQM=omUUIH*OFo16P034cK^ zouZk*SafvsbWu@JVEgv%vYT-xK6~~|bIKXhBv$XabLTVymIe)EgcRchDa<No<eY4E zb+zpYGtQkUmfIA6Zvlb~dO7!|rY2j^nwgnV5-lXI8yBe<lOt0{9hW1-ehm!`wul8z zE};Y<l7*(b@m3tUi~GyU%7m6{XjUK)km>1Zopv4R3<gn8cFSSswxlJ>GT09!0bJTH z-c|PfrfCNA^YiD(-qX_~duW`?@AnI1p#n{;V`;icP8G(&`ee!If?x_dfD|CKxvK{K z;_mY|woHFvVPUYUs!CVoUh2$yS%(rYD-;wIykH*&$1;GMCpqbrVbrsscor}g6BFYr zFE5wc+FIF1dXGcT5J=65^A#2{WevvhEybPPRLghcOeqU+<j(4^tgMuS2M>zQ*iGN* z3@PaapM>bX#299ebhgKPaHe$IaFj)h76mIRDx|%=-KMi<XJ?g)Te8wH8g6Jbjj7_b z$tT8MHoR;?&IBtg$Y4V`v$$7syWxu{l$CDu4}0aRWlH6wrVFVFAT_dS(<ZHYEijYb zu_!`R6QE+*J1H>Ls(rYlvw983DWqVID<ZT6jh#DpzVK%w`p|B^r%bg*zrGlh+Ksn` zx45`i8XFr$w?y;Uv17t;brvk+Z-7LAFGWk^U|}2afUcD6>}=nP6)WWA$&)Mr^@neD z>`L6Sx!<$^j=iL`ztn!jnSK=>fL?%^TC!w`T)A>ZScoWfXLuj_<pNHjTWWz0r!{2m zgxVY^0^D|)4_pUu-v>BVtR86iKjE(CnpHfBH-&HE!i7P8{otBd{rtHO(Qpsoj#ioO zL--<_!8N;n4KT49m(J;DT<LP5!~7a9pqHjH;6#7#SAVef!wp+EY_3}R(Yg)qtzBmP E3s5sy=l}o! literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/map_avatar_below_32.tga b/indra/newview/skins/default/textures/map_avatar_below_32.tga new file mode 100644 index 0000000000000000000000000000000000000000..496c44b369a473a38831885aab44c5b0d7e5a939 GIT binary patch literal 3037 zcmZXWSxgmY6vyW-Ty}&ao5g|xBD5-4BrPBn>l&>ZwNz}HP?Dz0voC00Kv8NnvDJqr zZH*xs`_|_+Dn_G%h>E!3Lflazi)Fc7xHG5!|GCb+-ge0EWA4m+=l`AMJ2Qq6W7tQw zfxoD|{22$Fzzw3oN8k@o14=;=$N?#U1|ooC4+cZ0bE*qOg2jy(gl9Cc0hEC}kPK*? zB97e{j2}2~A`Ng#E*RR0K|C0K16u$MWP?Ny1zbA08E3)CeEe<D-he@j<m6=0b@2Lr zuo;wqOppL*#@U3yP%pR!2cTc{?<bw?IDGi9%$zw>)F{_C2)+lOfcYQ;Fm{x2?80E^ z(rlOPaMr0gS95c-bar-1OG}Hm-R_Xt9!&fOtN?`|6~qD!Gs6)u%P0{pzEVxP>+0&{ z&Ye4Q_3BkQckY}tHZ}$v=W723bzli#0^R~lfO^aMhDN|%EvMvzVRhG2R#qm@pFfx0 z-d?$W{kpWbw@YhltJK!khGN@-=RXG@f@}~>k($?ts2XlDModwgnvY6NO_gicuF1=n zFXi#$$LhtED_7Ku6DLkcX=!OFKz_{I2R4ECL0B4T&(J8@Qg#}D;VLBh^y$+wHZ~^1 z!^868#S3}x;DOw_bxST?x+G`LoRMS4j!8yFMo4Y|)0pP9fN4$#!8GICFw{LeaN%i= zJ#yrTOifM6#KeTk4h;=SUteD^kQXmr)Ic6ObVwWyM@Y6ChQ9_Zg95<a7Ayl*bm9sL zRY2UfZQI1MEHO<pOm%Q@P@X+|Cim~(*EqMewaKYdr)0;D9ijC71zWX%`#l%f72?*I z+TpYdV?;COtgNh5MZwWP>1e;-FFv0y=q+{c-Mc4UU0rhF!UZ{b@}$(%)C6>yoZrD# z@BzpMS~d(L4?1WUONUB2($dm2YmL;51tw3Z%|MTjj|+qRrYtuD%c!KJBoJWAP60No zH_IrVvJOCRx%Yns(tyNR24ZG4P{~0xo^SzHG|wnbpI^OtrP-yw_AWen^r%dqK0P2z z`~9FEtO4^t8vUc64DFXdoKC0T<#L&<#l5ueVNgd#MsyF}y?a-<InJIvD+doA3<Q!3 z?gC$dDv(PT=}9>d7_%ZHBhBsGw@VWZ+CG^2D}oz>+ne2kO^F+!zP>(SnoIi=RD*?d zAPbCOjaFP-oUB^4N;E7SEX|3*GreZ8Pwb+gO0e*6-@Yv!9UWTq)z#Gj2`-em_=x74 zX*w}6(V9DVt~`45NcPZx`|{<>QdLzYGiJ<?l`B{3rroKgM@L8H>C>lj^X5%qWw)X+ zEm*K15OJFB1j`wr$5ByHf@b6AZdbD&rYSQslUD_Ir)JHXWiDE@NY@!K&!j$l_)s^_ z`Sa)H`0?Ws5fKqE52MC<njVRXiQ(Ez=6*NV6~!c_r>6^iF_8iGEz{%i_zDUN{1p`y z($mwUH6#(NpMik^-Jf>f3zOJDiHX?QSjo!Dvbc>kaWM=^N=k}EM@L(%7(C?zmB5dL zPaq7|(xpo^v6>q<%anc3PIZ{fM#^}Z*4eXXtBfWujzLOFN@5+Ex)}^(5>HkD_9V7N zKZ57w23xjlndV02T+GdrCr>mt@I4f?Y7JU^e7xl4<!L+AXgm0J32ql|K?*GfJZDj} z9Nz<e`0PcdEL%`3&c#r2|Ff@$34TGre-aWBBtJi21$Bjv8#iufmKtzdSbq#618566 zct?Lx)<;?R>1Qo+?(4&1VEg;~!$m)1a~_>GZJMx{d-3*sefUwVQ}~>iWH?ot%c}yx zCchIu^cDRs{!c)5yr`(iEH5wDH?S?st`O$u8nzMde<V$$+k)S$zsaE7$9OU**MuMX zE}@){*(@w9^cNQwOLup-s<8>7s6shh!d!S6QhL`w_ad=I!4->}7<UEOGVF7K4@E9f zy@EM!Zf@=vr1S*=9WzX#i0kX4#GE;E<iLRg`YphcXHUbu{|V@KB&7<05B_=)W^YbT zjx;qjg|Gh|rnnn5IF8$s+1c49-ux!M##jP0%zW@8Nt@}9IMFk{j(ylSK6VlW+QRvi z29-}FaoD;GgE%noW5~ms&ixp)C3F4+v#Ss6!$~9scoc*0z_)<!#Jry|=tnZYa@GOf f;S&pKGk9#?`04WM)tgqYUpH^diq&hE&o}-BvoJ<J literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/map_avatar_you_32.tga b/indra/newview/skins/default/textures/map_avatar_you_32.tga new file mode 100644 index 0000000000000000000000000000000000000000..782207efd6c28747686bcaf4355e2fe7388dbe94 GIT binary patch literal 3395 zcmYk9d0bXi9>x!gtRn6}A|kT7P`M?9rI|D16q-%bO!ME^nBjt&`^N>5O~y4f^^=tr zGme^NMk!93shEf+Dkz#InlfUNA*rCC&pgk$yx`^Yz3+SPd+&M9?{|L7!5BZ|I>HVA ze6n@vL)=KKrtkjzY)8UKUowP@Naty!UjHK*O!|{PB%0{S&LoiN8870#h$oY!QxI_{ zx~-o(5e=M7=8$dV2suT{NeS6U-Xn9#n`9Junn*I7bR?~bH}TZuOr}nf@FcQDcEphs zQbZbac!DPIfLtJXWGd0%2_%LDlK`TDJ%}+GI%!asljNMCWQVMSoALF931|a*C1;)^ zE65l!jPxQQqz%#U?sh~CF650=@=y+guSt3aX4YJok9Wcx`3~k_5zN<xF#r7q=EKb} zlc&K9d<q%^GWRnwkqjqNav9)dRW#=gWT72Bz&!Un%)6Ul$}hr{eh*V}7UtM#n4%Lf zhmXO0^DWF*2Vi#Xh55VyCU+Uk&|$D|%c)uysXa$xiDvJwU#)lK+!Xt4pc$VEbLD54 zivPj<a0TZ4C7826I;tnjVUCwNs)vrk>^lUrd!M8DNj}W0uQ`hH`cCq9l1RcyU^-7W zp4|DVn5fkqv@>(lV1BNJsrnVBvKr>6>n-ZvUxqnX0aJDXM(VQp+v70%55w%)-=aKb ztfQ=zd6&FQ;z?(#sz{c9^9bDB+#Z_Lw_tv2fcdo!rusI_^;=fI&51IEeVUKx)oamf z&OAg<n}Oi0Tm)>`2v6x9ErB_3#L>>*10$<n`3tNi(!NM$5T#n!V?61Q!HQLQczD2j z<V*0Z1B|%c2y^QmJg(OunzD&Ymm}ey%P=527f&wALZA5y5i@fRx=)^pF5|`{V983D z;!{p=J!<~%M>tcE(tn7|k8#Pj<;7wGe}8}Y@7xU^N^1&k#GUfJ{=F3m%T{8@%2k-Y zaT7lNYA?>5IfJsYGHlHM0<W)Hjp*q!(RKVJw9UwIrr`2|qHX!=7I`J;coMI)(eWg? z<mu^&4#S3{Z9Nb`SzqEsB0k@R0kk@K%~}*3Jcz2QD%`z$7wHckJb>SwJ9ki7S&6N? z3($Y=d~}<TindEuILn|ADEQh50Vbba0yk<cApKPebc`kl2nay%idE=D@perU2;xfj zrJEC%EXS?`2T)sEi-!*%A_F{prCw80gRKPxh-VyhpEwy_5>sX?tCeTdX0?cZK%Hk* z*py21BpMVHgwVobgiuhzvOIEQ9^$#K3qJe^H*Vapf>{#uk>Is!*Dzu2dc<<YJFS1; zNj0U}-h(iCTUx~SbNm-nCKcBkBo-bXj_%ifK^R3O*zvdf=t+k?u`mP2OG<G6{(a;~ z$iJ?x4xjGbhbPj~(PQxvC#zINR6$g$yuG0jNf{X}d%BP<1kusah~m%@ln9knMJ1wU z&c@KpY+Sr}5sR&aY$-1<N5W!8@q%=?pE~E*qC%xr>)6R9@x!AM+a%GmXHWE`L^OvF zCtWUFM#R+V7`iAE6%`dt5?ZPA=g(sZLuX)S4m?hucPvqUs`9q);F3^Pe^Jg-r&DRL z67g5AqZfydB4NMWM%bjuh?_ABXU?8QV`HP^EN{83@My6Ok^#%#hPm*QQwUWA3y-y| z$Z?K4Od@hunna?aqR{tnF&?Kt9O*&2EM19EhVbgG+ibjL%UwRQrMkKrX?g!b0;4f@ z^H!K2uR2v%HIId%Ik-RJ*!>h|iu9Kx6cQ4Gfp5Qq{`Y`*io}wxJMs}SE(L>T&&6pb zaeaL~G9~6KF=f@Eqet;PEgHmX)8PmUs>;1ey_!pUR*T?#YIJj@^5eX?<jcO9@Y>(- z6a`(PF%%8S$VTuRDM;o@ohmKGty{OOE7K+1rlFw$H*elVVR11=uUdotjJ>EW+nuVf zimzUy?xsFUvq(J|N!qyzSs*W#62!&DA#wX>7}PX{K9rBVd<{Wd#h|g{&~L_U<kFp` zw7r5squBiJ<Vj@mUQ$jj;u$ir>o%a(l^ag!SKE;XHf(Y%R~;=P{fNIyUN?u3d#s}k zNl8gas;#$E=*MYj3OzK1ti|a3k8ucQx$d4i1&Q<KV{qC+L^G+QSV>~%r6K&I&1j{L z$J%SVPZc}gRZfLn-mbKi-X!YM-nwHmy*)qQA&7{Gz~E&okVIX%z@@KM2>oIYg6LbV z#A7KF(RI=kbel2_q3hm5Czc}>UDbWtdTQ#O&O2^`qpJ?KgTxX=ax1H?#8J3u>v)yj z6TN%)#xrZyHS4>gK%u8N?^aWX5aw+#>3F-Lx#s#&x0SSox-b1<?bUuko4X-Ix-A<~ z?H7H?>%_KCY0LJfn|$xmR*or|yAxZQ_}Q7b>b<Mysq-(ggYlF~)E%`$(j1yLjoNrA z<liFNE;tS!`vwwse%T!MN^DgS6)M$3SLt=t`qn$Xg!c={_I+!loU7g>lO*VFotw#T zcAeF+#*iw4)~#DxFAo|u3Io}h`yMJn{K+%6GRn$`6Q$_N>JrRA?!aB8I=eO(dY9ZK zil6q9cw|Sfxbh(b$a*^|UoS5&+o~cXBW-zC{f&u<L1<{Gy|0;QWc#$<*X}-%_+{~A zv^Q_w4*#L)Myc*X_MUFKquo!CeKwchtgq$w-Xxjmzlj_vY}YDe5VcUfq@8h~eMgCJ q{ibkGB?u*5i5%x=f8`f@yz=s&hrc@FPa{T+?DN;(jd*c*y!k(<xp_<g literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index f37c0e90224..14fdbeaaa1a 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -14,38 +14,15 @@ single_instance="true" title="World Map" width="800"> - <tab_container + <panel + filename="panel_world_map.xml" follows="left|top|right|bottom" height="565" layout="topleft" left="15" - name="maptab" - tab_position="top" + name="objects_mapview" top="25" - width="542"> - <panel - filename="panel_world_map.xml" - follows="left|top|right|bottom" - height="550" - label="Objects" - layout="topleft" - left="1" - help_topic="worldmap_objects_tab" - name="objects_mapview" - top="19" - width="540" /> - <panel - filename="panel_world_map.xml" - follows="left|top|right|bottom" - height="550" - label="Terrain" - layout="topleft" - left_delta="0" - help_topic="worldmap_terrain_tab" - name="terrain_mapview" - top_delta="3" - width="540" /> - </tab_container> + width="542" /> <icon follows="top|right" height="16" @@ -209,7 +186,7 @@ label="Telehub" layout="topleft" left_pad="4" - name="telehubchk" + name="telehub_chk" top_delta="0" width="110" /> <icon diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 284594426c7..6ebb5f8681f 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -1672,6 +1672,42 @@ function="Advanced.ToggleConsole" parameter="debug" /> </menu_item_check> + <menu_item_check + label="Notifications Console" + layout="topleft" + name="Notifications" + shortcut="control|shift|5"> + <menu_item_check.on_check + function="Advanced.CheckConsole" + parameter="notifications" /> + <menu_item_check.on_click + function="Floater.Show" + parameter="notifications_console" /> + </menu_item_check> + <menu_item_check + label="Texture Size Console" + layout="topleft" + name="Texture Size" + shortcut="control|shift|6"> + <menu_item_check.on_check + function="Advanced.CheckConsole" + parameter="texture size" /> + <menu_item_check.on_click + function="Advanced.ToggleConsole" + parameter="texture size" /> + </menu_item_check> + <menu_item_check + label="Texture Category Console" + layout="topleft" + name="Texture Category" + shortcut="control|shift|7"> + <menu_item_check.on_check + function="Advanced.CheckConsole" + parameter="texture category" /> + <menu_item_check.on_click + function="Advanced.ToggleConsole" + parameter="texture category" /> + </menu_item_check> <menu_item_check label="Fast Timers" layout="topleft" @@ -2229,19 +2265,43 @@ label="Disable Textures" name="Disable Textures"> <menu_item_check.on_check - function="Advanced.CheckDisableTextures" - parameter="DisableTextures" /> + function="CheckControl" + parameter="TextureDisable" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="TextureDisable" /> + </menu_item_check> + <menu_item_check + label="Full Res Textures" + layout="topleft" + name="Rull Res Textures"> + <menu_item_check.on_check + function="CheckControl" + parameter="TextureLoadFullRes" /> <menu_item_check.on_click - function="Advanced.ToggleDisableTextures" /> + function="ToggleControl" + parameter="TextureLoadFullRes" /> + </menu_item_check> + <menu_item_check + label="Audit Textures" + layout="topleft" + name="Audit Textures"> + <menu_item_check.on_check + function="CheckControl" + parameter="AuditTexture" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="AuditTexture" /> </menu_item_check> <menu_item_check label="Texture Atlas" name="Texture Atlas"> <menu_item_check.on_check - function="Advanced.CheckTextureAtlas" + function="CheckControl" parameter="TextureAtlas" /> <menu_item_check.on_click - function="Advanced.ToggleTextureAtlas" /> + function="ToggleControl" + parameter="TextureAtlas" /> </menu_item_check> <menu_item_check label="Render Attached Lights" diff --git a/indra/newview/tests/lltextureinfo_test.cpp b/indra/newview/tests/lltextureinfo_test.cpp new file mode 100644 index 00000000000..8dfba46262a --- /dev/null +++ b/indra/newview/tests/lltextureinfo_test.cpp @@ -0,0 +1,284 @@ +/** + * @file llwtextureinfo_test.cpp + * @author Si & Gabriel + * @date 2009-03-30 + * + * $LicenseInfo:firstyear=2006&license=viewergpl$ + * + * Copyright (c) 2006-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +// Precompiled header: almost always required for newview cpp files +#include "../llviewerprecompiledheaders.h" +// Class to test +#include "../lltextureinfo.h" +// Dependencies +#include "../lltextureinfodetails.cpp" + +// Tut header +#include "../test/lltut.h" + +// ------------------------------------------------------------------------------------------- +// Stubbing: Declarations required to link and run the class being tested +// Notes: +// * Add here stubbed implementation of the few classes and methods used in the class to be tested +// * Add as little as possible (let the link errors guide you) +// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code) +// * A simulator for a class can be implemented here. Please comment and document thoroughly. + + +// End Stubbing +// ------------------------------------------------------------------------------------------- + +// ------------------------------------------------------------------------------------------- +// TUT +// ------------------------------------------------------------------------------------------- + +namespace tut +{ + // Test wrapper declarations + struct textureinfo_test + { + // Constructor and destructor of the test wrapper + textureinfo_test() + { + } + ~textureinfo_test() + { + } + }; + + // Tut templating thingamagic: test group, object and test instance + typedef test_group<textureinfo_test> textureinfo_t; + typedef textureinfo_t::object textureinfo_object_t; + tut::textureinfo_t tut_textureinfo("textureinfo"); + + + // --------------------------------------------------------------------------------------- + // Test functions + // Notes: + // * Test as many as you possibly can without requiring a full blown simulation of everything + // * The tests are executed in sequence so the test instance state may change between calls + // * Remember that you cannot test private methods with tut + // --------------------------------------------------------------------------------------- + + // --------------------------------------------------------------------------------------- + // Test the LLTextureInfo + // --------------------------------------------------------------------------------------- + + + // Test instantiation + template<> template<> + void textureinfo_object_t::test<1>() + { + LLTextureInfo tex_info; + tex_info.setUpLogging(true, true); + ensure("have we crashed?", true); + } + + // Check lltextureinfo does not contain UUIDs we haven't added + template<> template<> + void textureinfo_object_t::test<2>() + { + LLTextureInfo tex_info; + tex_info.setUpLogging(true, true); + + LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1"); + ensure(!tex_info.has(nonExistant)); + } + + // Check we can add a request time for a texture + template<> template<> + void textureinfo_object_t::test<3>() + { + LLTextureInfo tex_info; + tex_info.setUpLogging(true, true); + + LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); + tex_info.setRequestStartTime(id, 200); + + ensure_equals(tex_info.getRequestStartTime(id), 200); + } + + // Check time for non-existant texture + template<> template<> + void textureinfo_object_t::test<4>() + { + LLTextureInfo tex_info; + tex_info.setUpLogging(true, true); + + LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1"); + ensure_equals(tex_info.getRequestStartTime(nonExistant), 0); + } + + // Check download complete time for non existant texture + template<> template<> + void textureinfo_object_t::test<5>() + { + LLTextureInfo tex_info; + tex_info.setUpLogging(true, true); + + LLUUID nonExistant("3a0efa3b-84dc-4e17-9b8c-79ea028850c1"); + ensure_equals(tex_info.getRequestCompleteTime(nonExistant), 0); + } + + // requested size is passed in correctly + template<> template<> + void textureinfo_object_t::test<6>() + { + LLTextureInfo tex_info; + tex_info.setUpLogging(true, true); + + LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); + tex_info.setRequestSize(id, 600); + + ensure_equals(tex_info.getRequestSize(id), 600); + } + + // transport type is recorded correctly (http) + template<> template<> + void textureinfo_object_t::test<7>() + { + LLTextureInfo tex_info; + tex_info.setUpLogging(true, true); + + LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); + tex_info.setRequestType(id, LLTextureInfoDetails::REQUEST_TYPE_HTTP); + + ensure_equals(tex_info.getRequestType(id), LLTextureInfoDetails::REQUEST_TYPE_HTTP); + } + + // transport type is recorded correctly (udp) + template<> template<> + void textureinfo_object_t::test<8>() + { + LLTextureInfo tex_info; + tex_info.setUpLogging(true, true); + + LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); + tex_info.setRequestType(id, LLTextureInfoDetails::REQUEST_TYPE_UDP); + + ensure_equals(tex_info.getRequestType(id), LLTextureInfoDetails::REQUEST_TYPE_UDP); + } + + // request offset is recorded correctly + template<> template<> + void textureinfo_object_t::test<9>() + { + LLTextureInfo tex_info; + tex_info.setUpLogging(true, true); + + LLUUID id("10e65d70-46fd-429f-841a-bf698e9424d3"); + tex_info.setRequestOffset(id, 1234); + + ensure_equals(tex_info.getRequestOffset(id), 1234); + } + + // ask for averages gives us correct figure + template<> template<> + void textureinfo_object_t::test<10>() + { + LLTextureInfo tex_info; + tex_info.setUpLogging(true, true); + + S32 requestStartTimeOne = 200; + S32 requestEndTimeOne = 400; + S32 requestSizeOne = 1024; + S32 requestSizeOneBits = requestSizeOne * 8; + LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3"); + tex_info.setRequestStartTime(id1, requestStartTimeOne); + tex_info.setRequestSize(id1, requestSizeOne); + tex_info.setRequestType(id1, LLTextureInfoDetails::REQUEST_TYPE_HTTP); + tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne); + + U32 requestStartTimeTwo = 100; + U32 requestEndTimeTwo = 500; + U32 requestSizeTwo = 2048; + S32 requestSizeTwoBits = requestSizeTwo * 8; + LLUUID id2("10e65d70-46fd-429f-841a-bf698e9424d4"); + tex_info.setRequestStartTime(id2, requestStartTimeTwo); + tex_info.setRequestSize(id2, requestSizeTwo); + tex_info.setRequestType(id2, LLTextureInfoDetails::REQUEST_TYPE_HTTP); + tex_info.setRequestCompleteTimeAndLog(id2, requestEndTimeTwo); + + S32 averageBitRate = ((requestSizeOneBits/(requestEndTimeOne - requestStartTimeOne)) + + (requestSizeTwoBits/(requestEndTimeTwo - requestStartTimeTwo))) / 2; + + S32 totalBytes = requestSizeOne + requestSizeTwo; + + LLSD results = tex_info.getAverages(); + ensure_equals("is average bits per second correct", results["bits_per_second"].asInteger(), averageBitRate); + ensure_equals("is total bytes is correct", results["bytes_downloaded"].asInteger(), totalBytes); + ensure_equals("is transport correct", results["transport"].asString(), std::string("HTTP")); + } + + // make sure averages cleared when reset is called + template<> template<> + void textureinfo_object_t::test<11>() + { + LLTextureInfo tex_info; + tex_info.setUpLogging(true, true); + + S32 requestStartTimeOne = 200; + S32 requestEndTimeOne = 400; + S32 requestSizeOne = 1024; + LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3"); + tex_info.setRequestStartTime(id1, requestStartTimeOne); + tex_info.setRequestSize(id1, requestSizeOne); + tex_info.setRequestType(id1, LLTextureInfoDetails::REQUEST_TYPE_HTTP); + tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne); + + tex_info.getAverages(); + tex_info.reset(); + LLSD results = tex_info.getAverages(); + ensure_equals("is average bits per second correct", results["bits_per_second"].asInteger(), 0); + ensure_equals("is total bytes is correct", results["bytes_downloaded"].asInteger(), 0); + ensure_equals("is transport correct", results["transport"].asString(), std::string("NONE")); + } + + // make sure map item removed when expired + template<> template<> + void textureinfo_object_t::test<12>() + { + LLTextureInfo tex_info; + tex_info.setUpLogging(true, true); + + S32 requestStartTimeOne = 200; + S32 requestEndTimeOne = 400; + S32 requestSizeOne = 1024; + LLUUID id1("10e65d70-46fd-429f-841a-bf698e9424d3"); + tex_info.setRequestStartTime(id1, requestStartTimeOne); + tex_info.setRequestSize(id1, requestSizeOne); + tex_info.setRequestType(id1, LLTextureInfoDetails::REQUEST_TYPE_HTTP); + + ensure_equals("map item created", tex_info.getTextureInfoMapSize(), 1); + + tex_info.setRequestCompleteTimeAndLog(id1, requestEndTimeOne); + + ensure_equals("map item removed when consumed", tex_info.getTextureInfoMapSize(), 0); + } +} + diff --git a/indra/newview/tests/lltextureinfodetails_test.cpp b/indra/newview/tests/lltextureinfodetails_test.cpp new file mode 100644 index 00000000000..aa2697fb8eb --- /dev/null +++ b/indra/newview/tests/lltextureinfodetails_test.cpp @@ -0,0 +1,98 @@ +/** + * @file llwtextureinfodetails_test.cpp + * @author Si & Gabriel + * @date 2009-03-30 + * + * $LicenseInfo:firstyear=2006&license=viewergpl$ + * + * Copyright (c) 2006-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +// Precompiled header: almost always required for newview cpp files +#include "../llviewerprecompiledheaders.h" +// Class to test +#include "../lltextureinfodetails.h" +// Dependencies + +// Tut header +#include "../test/lltut.h" + +// ------------------------------------------------------------------------------------------- +// Stubbing: Declarations required to link and run the class being tested +// Notes: +// * Add here stubbed implementation of the few classes and methods used in the class to be tested +// * Add as little as possible (let the link errors guide you) +// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code) +// * A simulator for a class can be implemented here. Please comment and document thoroughly. + + +// End Stubbing +// ------------------------------------------------------------------------------------------- + +// ------------------------------------------------------------------------------------------- +// TUT +// ------------------------------------------------------------------------------------------- + +namespace tut +{ + // Test wrapper declarations + struct textureinfodetails_test + { + // Constructor and destructor of the test wrapper + textureinfodetails_test() + { + } + ~textureinfodetails_test() + { + } + }; + + // Tut templating thingamagic: test group, object and test instance + typedef test_group<textureinfodetails_test> textureinfodetails_t; + typedef textureinfodetails_t::object textureinfodetails_object_t; + tut::textureinfodetails_t tut_textureinfodetails("textureinfodetails"); + + + // --------------------------------------------------------------------------------------- + // Test functions + // Notes: + // * Test as many as you possibly can without requiring a full blown simulation of everything + // * The tests are executed in sequence so the test instance state may change between calls + // * Remember that you cannot test private methods with tut + // --------------------------------------------------------------------------------------- + + // --------------------------------------------------------------------------------------- + // Test the LLTextureInfo + // --------------------------------------------------------------------------------------- + + + // Test instantiation + template<> template<> + void textureinfodetails_object_t::test<1>() + { + ensure("have we crashed?", true); + } +} diff --git a/indra/newview/tests/lltexturestatsuploader_test.cpp b/indra/newview/tests/lltexturestatsuploader_test.cpp new file mode 100644 index 00000000000..77a3e2c3d88 --- /dev/null +++ b/indra/newview/tests/lltexturestatsuploader_test.cpp @@ -0,0 +1,156 @@ +/** + * @file lltexturestatsuploader_test.cpp + * @author Si + * @date 2009-05-27 + * + * $LicenseInfo:firstyear=2006&license=viewergpl$ + * + * Copyright (c) 2006-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +// Precompiled header: almost always required for newview cpp files +#include "../llviewerprecompiledheaders.h" +// Class to test +#include "../lltexturestatsuploader.h" +// Dependencies + +// Tut header +#include "../test/lltut.h" + +// ------------------------------------------------------------------------------------------- +// Stubbing: Declarations required to link and run the class being tested +// Notes: +// * Add here stubbed implementation of the few classes and methods used in the class to be tested +// * Add as little as possible (let the link errors guide you) +// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code) +// * A simulator for a class can be implemented here. Please comment and document thoroughly. + +#include "boost/intrusive_ptr.hpp" +void boost::intrusive_ptr_add_ref(LLCurl::Responder*){} +void boost::intrusive_ptr_release(LLCurl::Responder* p){} +const F32 HTTP_REQUEST_EXPIRY_SECS = 0.0f; + +static std::string most_recent_url; +static LLSD most_recent_body; + +void LLHTTPClient::post( + const std::string& url, + const LLSD& body, + ResponderPtr, + const LLSD& headers, + const F32 timeout) +{ + // set some sensor code + most_recent_url = url; + most_recent_body = body; + return; +} + +// End Stubbing +// ------------------------------------------------------------------------------------------- + +// ------------------------------------------------------------------------------------------- +// TUT +// ------------------------------------------------------------------------------------------- + +namespace tut +{ + // Test wrapper declarations + struct texturestatsuploader_test + { + // Constructor and destructor of the test wrapper + texturestatsuploader_test() + { + most_recent_url = "some sort of default text that should never match anything the tests are expecting!"; + LLSD blank_llsd; + most_recent_body = blank_llsd; + } + ~texturestatsuploader_test() + { + } + }; + + // Tut templating thingamagic: test group, object and test instance + typedef test_group<texturestatsuploader_test> texturestatsuploader_t; + typedef texturestatsuploader_t::object texturestatsuploader_object_t; + tut::texturestatsuploader_t tut_texturestatsuploader("texturestatsuploader"); + + + // --------------------------------------------------------------------------------------- + // Test functions + // Notes: + // * Test as many as you possibly can without requiring a full blown simulation of everything + // * The tests are executed in sequence so the test instance state may change between calls + // * Remember that you cannot test private methods with tut + // --------------------------------------------------------------------------------------- + + // --------------------------------------------------------------------------------------- + // Test the LLTextureInfo + // --------------------------------------------------------------------------------------- + + + // Test instantiation + template<> template<> + void texturestatsuploader_object_t::test<1>() + { + LLTextureStatsUploader tsu; + llinfos << &tsu << llendl; + ensure("have we crashed?", true); + } + + // does it call out to the provided url if we ask it to? + template<> template<> + void texturestatsuploader_object_t::test<2>() + { + LLTextureStatsUploader tsu; + std::string url = "http://blahblahblah"; + LLSD texture_stats; + tsu.uploadStatsToSimulator(url, texture_stats); + ensure_equals("did the right url get called?", most_recent_url, url); + ensure_equals("did the right body get sent?", most_recent_body, texture_stats); + } + + // does it not call out to the provided url if we send it an ungranted cap? + template<> template<> + void texturestatsuploader_object_t::test<3>() + { + LLTextureStatsUploader tsu; + + // this url left intentionally blank to mirror + // not getting a cap in the caller. + std::string url_for_ungranted_cap = ""; + + LLSD texture_stats; + std::string most_recent_url_before_test = most_recent_url; + tsu.uploadStatsToSimulator(url_for_ungranted_cap, texture_stats); + + ensure_equals("hopefully no url got called!", most_recent_url, most_recent_url_before_test); + } + + // does it call out if the data is empty? + // should it even do that? +} + diff --git a/indra/newview/tests/llworldmap_test.cpp b/indra/newview/tests/llworldmap_test.cpp new file mode 100644 index 00000000000..56cf86f6df9 --- /dev/null +++ b/indra/newview/tests/llworldmap_test.cpp @@ -0,0 +1,523 @@ +/** + * @file llworldmap_test.cpp + * @author Merov Linden + * @date 2009-03-09 + * + * $LicenseInfo:firstyear=2006&license=viewergpl$ + * + * Copyright (c) 2006-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +// Precompiled header: almost always required for newview cpp files +#include "../llviewerprecompiledheaders.h" +// Class to test +#include "../llworldmap.h" +// Dependencies +#include "../llviewerimagelist.h" +#include "../llworldmapmessage.h" +// Tut header +#include "../test/lltut.h" + +// ------------------------------------------------------------------------------------------- +// Stubbing: Declarations required to link and run the class being tested +// Notes: +// * Add here stubbed implementation of the few classes and methods used in the class to be tested +// * Add as little as possible (let the link errors guide you) +// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code) +// * A simulator for a class can be implemented here. Please comment and document thoroughly. + +// Stub image calls +LLViewerImageList::LLViewerImageList() { } +LLViewerImageList::~LLViewerImageList() { } +LLViewerImageList gImageList; +LLViewerImage* LLViewerImageList::getImage(const LLUUID &image_id, + BOOL usemipmaps, + BOOL level_immediate, + LLGLint internal_format, + LLGLenum primary_format, + LLHost request_from_host) +{ return NULL; } +void LLViewerImage::setBoostLevel(S32 level) { } +void LLImageGL::setAddressMode(LLTexUnit::eTextureAddressMode mode) { } + +// Stub related map calls +LLWorldMapMessage::LLWorldMapMessage() { } +LLWorldMapMessage::~LLWorldMapMessage() { } +void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle) { } +void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent) { } +LLWorldMipmap::LLWorldMipmap() { } +LLWorldMipmap::~LLWorldMipmap() { } +void LLWorldMipmap::reset() { } +void LLWorldMipmap::dropBoostLevels() { } +void LLWorldMipmap::equalizeBoostLevels() { } +LLPointer<LLViewerImage> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load) +{ return NULL; } + +// Stub other stuff +BOOL gPacificDaylightTime; + +// End Stubbing +// ------------------------------------------------------------------------------------------- + +// ------------------------------------------------------------------------------------------- +// TUT +// ------------------------------------------------------------------------------------------- + +const F32 X_WORLD_TEST = 1000.0f * REGION_WIDTH_METERS; +const F32 Y_WORLD_TEST = 2000.0f * REGION_WIDTH_METERS; +const F32 Z_WORLD_TEST = 240.0f; +const std::string ITEM_NAME_TEST = "Item Foo"; +const std::string TOOLTIP_TEST = "Tooltip Foo"; + +const std::string SIM_NAME_TEST = "Sim Foo"; + +namespace tut +{ + // Test wrapper declarations + struct iteminfo_test + { + // Instance to be tested + LLItemInfo* mItem; + + // Constructor and destructor of the test wrapper + iteminfo_test() + { + LLUUID id; + mItem = new LLItemInfo(X_WORLD_TEST, Y_WORLD_TEST, ITEM_NAME_TEST, id); + } + ~iteminfo_test() + { + delete mItem; + } + }; + + struct siminfo_test + { + // Instance to be tested + LLSimInfo* mSim; + + // Constructor and destructor of the test wrapper + siminfo_test() + { + U64 handle = to_region_handle_global(X_WORLD_TEST, Y_WORLD_TEST); + mSim = new LLSimInfo(handle); + } + ~siminfo_test() + { + delete mSim; + } + }; + + struct worldmap_test + { + // Instance to be tested + LLWorldMap* mWorld; + + // Constructor and destructor of the test wrapper + worldmap_test() + { + mWorld = LLWorldMap::getInstance(); + } + ~worldmap_test() + { + mWorld = NULL; + } + }; + + // Tut templating thingamagic: test group, object and test instance + typedef test_group<iteminfo_test> iteminfo_t; + typedef iteminfo_t::object iteminfo_object_t; + tut::iteminfo_t tut_iteminfo("iteminfo"); + + typedef test_group<siminfo_test> siminfo_t; + typedef siminfo_t::object siminfo_object_t; + tut::siminfo_t tut_siminfo("siminfo"); + + typedef test_group<worldmap_test> worldmap_t; + typedef worldmap_t::object worldmap_object_t; + tut::worldmap_t tut_worldmap("worldmap"); + + // --------------------------------------------------------------------------------------- + // Test functions + // Notes: + // * Test as many as you possibly can without requiring a full blown simulation of everything + // * The tests are executed in sequence so the test instance state may change between calls + // * Remember that you cannot test private methods with tut + // --------------------------------------------------------------------------------------- + + // --------------------------------------------------------------------------------------- + // Test the LLItemInfo interface + // --------------------------------------------------------------------------------------- + template<> template<> + void iteminfo_object_t::test<1>() + { + // Test 1 : setCount() / getCount() + mItem->setCount(10); + ensure("LLItemInfo::setCount() test failed", mItem->getCount() == 10); + // Test 2 : setTooltip() / getToolTip() + std::string tooltip = TOOLTIP_TEST; + mItem->setTooltip(tooltip); + ensure("LLItemInfo::setTooltip() test failed", mItem->getToolTip() == TOOLTIP_TEST); + // Test 3 : setElevation() / getGlobalPosition() + mItem->setElevation(Z_WORLD_TEST); + LLVector3d pos = mItem->getGlobalPosition(); + LLVector3d ref(X_WORLD_TEST, Y_WORLD_TEST, Z_WORLD_TEST); + ensure("LLItemInfo::getGlobalPosition() test failed", pos == ref); + // Test 4 : getName() + std::string name = mItem->getName(); + ensure("LLItemInfo::getName() test failed", name == ITEM_NAME_TEST); + // Test 5 : isName() + ensure("LLItemInfo::isName() test failed", mItem->isName(name)); + // Test 6 : getUUID() + LLUUID id; + ensure("LLItemInfo::getUUID() test failed", mItem->getUUID() == id); + // Test 7 : getRegionHandle() + U64 handle = to_region_handle_global(X_WORLD_TEST, Y_WORLD_TEST); + ensure("LLItemInfo::getRegionHandle() test failed", mItem->getRegionHandle() == handle); + } + // --------------------------------------------------------------------------------------- + // Test the LLSimInfo interface + // --------------------------------------------------------------------------------------- + // Test Setters and Accessors methods + template<> template<> + void siminfo_object_t::test<1>() + { + // Test 1 : setName() / getName() + std::string name = SIM_NAME_TEST; + mSim->setName(name); + ensure("LLSimInfo::setName() test failed", mSim->getName() == SIM_NAME_TEST); + // Test 2 : isName() + ensure("LLSimInfo::isName() test failed", mSim->isName(name)); + // Test 3 : getGlobalPos() + LLVector3 local; + LLVector3d ref(X_WORLD_TEST, Y_WORLD_TEST, 0.0f); + LLVector3d pos = mSim->getGlobalPos(local); + ensure("LLSimInfo::getGlobalPos() test failed", pos == ref); + // Test 4 : getGlobalOrigin() + pos = mSim->getGlobalOrigin(); + ensure("LLSimInfo::getGlobalOrigin() test failed", pos == ref); + // Test 5 : clearImage() + try { + mSim->clearImage(); + } catch (...) { + fail("LLSimInfo::clearImage() test failed"); + } + // Test 6 : dropImagePriority() + try { + mSim->dropImagePriority(); + } catch (...) { + fail("LLSimInfo::dropImagePriority() test failed"); + } + // Test 7 : updateAgentCount() + try { + mSim->updateAgentCount(0.0f); + } catch (...) { + fail("LLSimInfo::updateAgentCount() test failed"); + } + // Test 8 : getAgentCount() + S32 agents = mSim->getAgentCount(); + ensure("LLSimInfo::getAgentCount() test failed", agents == 0); + // Test 9 : setLandForSaleImage() / getLandForSaleImage() + LLUUID id; + mSim->setLandForSaleImage(id); + LLPointer<LLViewerImage> image = mSim->getLandForSaleImage(); + ensure("LLSimInfo::getLandForSaleImage() test failed", image.isNull()); + // Test 10 : isPG() + mSim->setAccess(SIM_ACCESS_PG); + ensure("LLSimInfo::isPG() test failed", mSim->isPG()); + // Test 11 : isDown() + mSim->setAccess(SIM_ACCESS_DOWN); + ensure("LLSimInfo::isDown() test failed", mSim->isDown()); + // Test 12 : Access strings can't be accessed from unit test... + //ensure("LLSimInfo::getAccessString() test failed", mSim->getAccessString() == "Offline"); + // Test 13 : Region strings can't be accessed from unit test... + //mSim->setRegionFlags(REGION_FLAGS_SANDBOX); + //ensure("LLSimInfo::setRegionFlags() test failed", mSim->getFlagsString() == "Sandbox"); + } + // Test management of LLInfoItem lists + template<> template<> + void siminfo_object_t::test<2>() + { + // Test 14 : clearItems() + try { + mSim->clearItems(); + } catch (...) { + fail("LLSimInfo::clearItems() at init test failed"); + } + + // Test 15 : Verify that all the lists are empty + LLSimInfo::item_info_list_t list; + list = mSim->getTeleHub(); + ensure("LLSimInfo::getTeleHub() empty at init test failed", list.empty()); + list = mSim->getInfoHub(); + ensure("LLSimInfo::getInfoHub() empty at init test failed", list.empty()); + list = mSim->getPGEvent(); + ensure("LLSimInfo::getPGEvent() empty at init test failed", list.empty()); + list = mSim->getMatureEvent(); + ensure("LLSimInfo::getMatureEvent() empty at init test failed", list.empty()); + list = mSim->getLandForSale(); + ensure("LLSimInfo::getLandForSale() empty at init test failed", list.empty()); + list = mSim->getAgentLocation(); + ensure("LLSimInfo::getAgentLocation() empty at init test failed", list.empty()); + + // Create an item to be inserted + LLUUID id; + LLItemInfo item(X_WORLD_TEST, Y_WORLD_TEST, ITEM_NAME_TEST, id); + + // Insert the item in each list + mSim->insertTeleHub(item); + mSim->insertInfoHub(item); + mSim->insertPGEvent(item); + mSim->insertMatureEvent(item); + mSim->insertLandForSale(item); + mSim->insertAgentLocation(item); + + // Test 16 : Verify that the lists contain 1 item each + list = mSim->getTeleHub(); + ensure("LLSimInfo::insertTeleHub() test failed", list.size() == 1); + list = mSim->getInfoHub(); + ensure("LLSimInfo::insertInfoHub() test failed", list.size() == 1); + list = mSim->getPGEvent(); + ensure("LLSimInfo::insertPGEvent() test failed", list.size() == 1); + list = mSim->getMatureEvent(); + ensure("LLSimInfo::insertMatureEvent() test failed", list.size() == 1); + list = mSim->getLandForSale(); + ensure("LLSimInfo::insertLandForSale() test failed", list.size() == 1); + list = mSim->getAgentLocation(); + ensure("LLSimInfo::insertAgentLocation() test failed", list.size() == 1); + + // Test 17 : clearItems() + try { + mSim->clearItems(); + } catch (...) { + fail("LLSimInfo::clearItems() at end test failed"); + } + + // Test 18 : Verify that all the lists are empty again... *except* agent which is persisted!! (on purpose) + list = mSim->getTeleHub(); + ensure("LLSimInfo::getTeleHub() empty after clear test failed", list.empty()); + list = mSim->getInfoHub(); + ensure("LLSimInfo::getInfoHub() empty after clear test failed", list.empty()); + list = mSim->getPGEvent(); + ensure("LLSimInfo::getPGEvent() empty after clear test failed", list.empty()); + list = mSim->getMatureEvent(); + ensure("LLSimInfo::getMatureEvent() empty after clear test failed", list.empty()); + list = mSim->getLandForSale(); + ensure("LLSimInfo::getLandForSale() empty after clear test failed", list.empty()); + list = mSim->getAgentLocation(); + ensure("LLSimInfo::getAgentLocation() empty after clear test failed", list.size() == 1); + } + + // --------------------------------------------------------------------------------------- + // Test the LLWorldMap interface + // --------------------------------------------------------------------------------------- + // Test Setters and Accessors methods + template<> template<> + void worldmap_object_t::test<1>() + { + // Test 1 : reset() + try { + mWorld->reset(); + } catch (...) { + fail("LLWorldMap::reset() at init test failed"); + } + // Test 2 : clearImageRefs() + try { + mWorld->clearImageRefs(); + } catch (...) { + fail("LLWorldMap::clearImageRefs() test failed"); + } + // Test 3 : dropImagePriorities() + try { + mWorld->dropImagePriorities(); + } catch (...) { + fail("LLWorldMap::dropImagePriorities() test failed"); + } + // Test 4 : reloadItems() + try { + mWorld->reloadItems(true); + } catch (...) { + fail("LLWorldMap::reloadItems() test failed"); + } + // Test 5 : updateRegions() + try { + mWorld->updateRegions(1000, 1000, 1004, 1004); + } catch (...) { + fail("LLWorldMap::updateRegions() test failed"); + } + // Test 6 : equalizeBoostLevels() + try { + mWorld->equalizeBoostLevels(); + } catch (...) { + fail("LLWorldMap::equalizeBoostLevels() test failed"); + } + // Test 7 : getObjectsTile() + try { + LLPointer<LLViewerImage> image = mWorld->getObjectsTile((U32)(X_WORLD_TEST/REGION_WIDTH_METERS), (U32)(Y_WORLD_TEST/REGION_WIDTH_METERS), 1); + ensure("LLWorldMap::getObjectsTile() failed", image.isNull()); + } catch (...) { + fail("LLWorldMap::getObjectsTile() test failed with exception"); + } + } + // Test management of LLSimInfo lists + template<> template<> + void worldmap_object_t::test<2>() + { + // Test 8 : reset() + try { + mWorld->reset(); + } catch (...) { + fail("LLWorldMap::reset() at init test failed"); + } + + // Test 9 : Verify that all the region list is empty + LLWorldMap::sim_info_map_t list; + list = mWorld->getRegionMap(); + ensure("LLWorldMap::getRegionMap() empty at init test failed", list.empty()); + + // Test 10 : Insert a region + bool success; + LLUUID id; + std::string name_sim = SIM_NAME_TEST; + success = mWorld->insertRegion( U32(X_WORLD_TEST), + U32(Y_WORLD_TEST), + name_sim, + id, + SIM_ACCESS_PG, + REGION_FLAGS_SANDBOX); + list = mWorld->getRegionMap(); + ensure("LLWorldMap::insertRegion() failed", success && (list.size() == 1)); + + // Test 11 : Insert an item in the same region -> number of regions doesn't increase + std::string name_item = ITEM_NAME_TEST; + success = mWorld->insertItem( U32(X_WORLD_TEST + REGION_WIDTH_METERS/2), + U32(Y_WORLD_TEST + REGION_WIDTH_METERS/2), + name_item, + id, + MAP_ITEM_LAND_FOR_SALE, + 0, 0); + list = mWorld->getRegionMap(); + ensure("LLWorldMap::insertItem() in existing region failed", success && (list.size() == 1)); + + // Test 12 : Insert an item in another region -> number of regions increases + success = mWorld->insertItem( U32(X_WORLD_TEST + REGION_WIDTH_METERS*2), + U32(Y_WORLD_TEST + REGION_WIDTH_METERS*2), + name_item, + id, + MAP_ITEM_LAND_FOR_SALE, + 0, 0); + list = mWorld->getRegionMap(); + ensure("LLWorldMap::insertItem() in unexisting region failed", success && (list.size() == 2)); + + // Test 13 : simInfoFromPosGlobal() in region + LLVector3d pos1( X_WORLD_TEST + REGION_WIDTH_METERS*2 + REGION_WIDTH_METERS/2, + Y_WORLD_TEST + REGION_WIDTH_METERS*2 + REGION_WIDTH_METERS/2, + 0.0f); + LLSimInfo* sim; + sim = mWorld->simInfoFromPosGlobal(pos1); + ensure("LLWorldMap::simInfoFromPosGlobal() test on existing region failed", sim != NULL); + + // Test 14 : simInfoFromPosGlobal() outside region + LLVector3d pos2( X_WORLD_TEST + REGION_WIDTH_METERS*4 + REGION_WIDTH_METERS/2, + Y_WORLD_TEST + REGION_WIDTH_METERS*4 + REGION_WIDTH_METERS/2, + 0.0f); + sim = mWorld->simInfoFromPosGlobal(pos2); + ensure("LLWorldMap::simInfoFromPosGlobal() test outside region failed", sim == NULL); + + // Test 15 : simInfoFromName() + sim = mWorld->simInfoFromName(name_sim); + ensure("LLWorldMap::simInfoFromName() test on existing region failed", sim != NULL); + + // Test 16 : simInfoFromHandle() + U64 handle = to_region_handle_global(X_WORLD_TEST, Y_WORLD_TEST); + sim = mWorld->simInfoFromHandle(handle); + ensure("LLWorldMap::simInfoFromHandle() test on existing region failed", sim != NULL); + + // Test 17 : simNameFromPosGlobal() + LLVector3d pos3( X_WORLD_TEST + REGION_WIDTH_METERS/2, + Y_WORLD_TEST + REGION_WIDTH_METERS/2, + 0.0f); + success = mWorld->simNameFromPosGlobal(pos3, name_sim); + ensure("LLWorldMap::simNameFromPosGlobal() test on existing region failed", success && (name_sim == SIM_NAME_TEST)); + + // Test 18 : reset() + try { + mWorld->reset(); + } catch (...) { + fail("LLWorldMap::reset() at end test failed"); + } + + // Test 19 : Verify that all the region list is empty + list = mWorld->getRegionMap(); + ensure("LLWorldMap::getRegionMap() empty at end test failed", list.empty()); + } + // Test tracking + template<> template<> + void worldmap_object_t::test<3>() + { + // Point to track + LLVector3d pos( X_WORLD_TEST + REGION_WIDTH_METERS/2, Y_WORLD_TEST + REGION_WIDTH_METERS/2, Z_WORLD_TEST); + + // Test 20 : no tracking + mWorld->cancelTracking(); + ensure("LLWorldMap::cancelTracking() at begin test failed", mWorld->isTracking() == false); + + // Test 21 : set tracking + mWorld->setTracking(pos); + ensure("LLWorldMap::setTracking() failed", mWorld->isTracking() && !mWorld->isTrackingValidLocation()); + + // Test 22 : set click and commit flags + mWorld->setTrackingDoubleClick(); + ensure("LLWorldMap::setTrackingDoubleClick() failed", mWorld->isTrackingDoubleClick()); + mWorld->setTrackingCommit(); + ensure("LLWorldMap::setTrackingCommit() failed", mWorld->isTrackingCommit()); + + // Test 23 : in rectangle test + bool inRect = mWorld->isTrackingInRectangle( X_WORLD_TEST, Y_WORLD_TEST, + X_WORLD_TEST + REGION_WIDTH_METERS, + Y_WORLD_TEST + REGION_WIDTH_METERS); + ensure("LLWorldMap::isTrackingInRectangle() in rectangle failed", inRect); + inRect = mWorld->isTrackingInRectangle( X_WORLD_TEST + REGION_WIDTH_METERS, + Y_WORLD_TEST + REGION_WIDTH_METERS, + X_WORLD_TEST + 2 * REGION_WIDTH_METERS, + Y_WORLD_TEST + 2 * REGION_WIDTH_METERS); + ensure("LLWorldMap::isTrackingInRectangle() outside rectangle failed", !inRect); + + // Test 24 : set tracking to valid and invalid + mWorld->setTrackingValid(); + ensure("LLWorldMap::setTrackingValid() failed", mWorld->isTrackingValidLocation() && !mWorld->isTrackingInvalidLocation()); + mWorld->setTrackingInvalid(); + ensure("LLWorldMap::setTrackingInvalid() failed", !mWorld->isTrackingValidLocation() && mWorld->isTrackingInvalidLocation()); + + // Test 25 : getTrackedPositionGlobal() + LLVector3d res = mWorld->getTrackedPositionGlobal(); + ensure("LLWorldMap::getTrackedPositionGlobal() failed", res == pos); + + // Test 26 : reset tracking + mWorld->cancelTracking(); + ensure("LLWorldMap::cancelTracking() at end test failed", mWorld->isTracking() == false); + } +} diff --git a/indra/newview/tests/llworldmipmap_test.cpp b/indra/newview/tests/llworldmipmap_test.cpp new file mode 100644 index 00000000000..9938175c558 --- /dev/null +++ b/indra/newview/tests/llworldmipmap_test.cpp @@ -0,0 +1,176 @@ +/** + * @file llworldmipmap_test.cpp + * @author Merov Linden + * @date 2009-02-03 + * + * $LicenseInfo:firstyear=2006&license=viewergpl$ + * + * Copyright (c) 2006-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +// Precompiled header: almost always required for newview cpp files +#include "../llviewerprecompiledheaders.h" +// Class to test +#include "../llworldmipmap.h" +// Dependencies +#include "../llviewerimagelist.h" +// Tut header +#include "../test/lltut.h" + +// ------------------------------------------------------------------------------------------- +// Stubbing: Declarations required to link and run the class being tested +// Notes: +// * Add here stubbed implementation of the few classes and methods used in the class to be tested +// * Add as little as possible (let the link errors guide you) +// * Do not make any assumption as to how those classes or methods work (i.e. don't copy/paste code) +// * A simulator for a class can be implemented here. Please comment and document thoroughly. + +LLViewerImageList::LLViewerImageList() { } +LLViewerImageList::~LLViewerImageList() { } + +LLViewerImageList gImageList; + +LLViewerImage* LLViewerImageList::getImageFromUrl(const std::string& url, + BOOL usemipmaps, + BOOL level_immediate, + LLGLint internal_format, + LLGLenum primary_format, + const LLUUID& force_id) +{ return NULL; } +void LLViewerImage::setBoostLevel(S32 level) { } + +// End Stubbing +// ------------------------------------------------------------------------------------------- + +// ------------------------------------------------------------------------------------------- +// TUT +// ------------------------------------------------------------------------------------------- +namespace tut +{ + // Test wrapper declaration + struct worldmipmap_test + { + // Derived test class + class LLTestWorldMipmap : public LLWorldMipmap + { + // Put here stubbs of virtual methods we shouldn't call all the way down + }; + // Instance to be tested + LLTestWorldMipmap* mMap; + + // Constructor and destructor of the test wrapper + worldmipmap_test() + { + mMap = new LLTestWorldMipmap; + } + ~worldmipmap_test() + { + delete mMap; + } + }; + + // Tut templating thingamagic: test group, object and test instance + typedef test_group<worldmipmap_test> worldmipmap_t; + typedef worldmipmap_t::object worldmipmap_object_t; + tut::worldmipmap_t tut_worldmipmap("worldmipmap"); + + // --------------------------------------------------------------------------------------- + // Test functions + // Notes: + // * Test as many as you possibly can without requiring a full blown simulation of everything + // * The tests are executed in sequence so the test instance state may change between calls + // * Remember that you cannot test private methods with tut + // --------------------------------------------------------------------------------------- + // Test static methods + // Test 1 : scaleToLevel() + template<> template<> + void worldmipmap_object_t::test<1>() + { + S32 level = mMap->scaleToLevel(0.0); + ensure("scaleToLevel() test 1 failed", level == LLWorldMipmap::MAP_LEVELS); + level = mMap->scaleToLevel(LLWorldMipmap::MAP_TILE_SIZE); + ensure("scaleToLevel() test 2 failed", level == 1); + level = mMap->scaleToLevel(10 * LLWorldMipmap::MAP_TILE_SIZE); + ensure("scaleToLevel() test 3 failed", level == 1); + } + // Test 2 : globalToMipmap() + template<> template<> + void worldmipmap_object_t::test<2>() + { + U32 grid_x, grid_y; + mMap->globalToMipmap(1000.f*REGION_WIDTH_METERS, 1000.f*REGION_WIDTH_METERS, 1, &grid_x, &grid_y); + ensure("globalToMipmap() test 1 failed", (grid_x == 1000) && (grid_y == 1000)); + mMap->globalToMipmap(0.0, 0.0, LLWorldMipmap::MAP_LEVELS, &grid_x, &grid_y); + ensure("globalToMipmap() test 2 failed", (grid_x == 0) && (grid_y == 0)); + } + // Test 3 : getObjectsTile() + template<> template<> + void worldmipmap_object_t::test<3>() + { + // Depends on some inline methods in LLViewerImage... Thinking about how to make this work + // LLPointer<LLViewerImage> img = mMap->getObjectsTile(0, 0, 1); + // ensure("getObjectsTile() test failed", img.isNull()); + } + // Test 4 : equalizeBoostLevels() + template<> template<> + void worldmipmap_object_t::test<4>() + { + try + { + mMap->equalizeBoostLevels(); + } + catch (...) + { + fail("equalizeBoostLevels() test failed"); + } + } + // Test 5 : dropBoostLevels() + template<> template<> + void worldmipmap_object_t::test<5>() + { + try + { + mMap->dropBoostLevels(); + } + catch (...) + { + fail("dropBoostLevels() test failed"); + } + } + // Test 6 : reset() + template<> template<> + void worldmipmap_object_t::test<6>() + { + try + { + mMap->reset(); + } + catch (...) + { + fail("reset() test failed"); + } + } +} diff --git a/install.xml b/install.xml index 44224664cae..5349932d001 100644 --- a/install.xml +++ b/install.xml @@ -132,9 +132,9 @@ <key>windows</key> <map> <key>md5sum</key> - <string>6a53b02a07527de680f1336e20f74f08</string> + <string>70b51d0cc93c305026e4e2778cde6d19</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.4.0-windows-20080723.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.6.0-windows-20090722.tar.bz2</uri> </map> </map> </map> @@ -254,9 +254,9 @@ <key>windows</key> <map> <key>md5sum</key> - <string>8c9d135f0e7cd1fae5681d4595942ee3</string> + <string>f6cb20db3ace7f6f25053b7a97b797f4</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4-windows-20090306.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.19.6-windows-20090722.tar.bz2</uri> </map> </map> </map> -- GitLab From 56281befc1815fb26c25c75b8bf9f0295f43e319 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Fri, 6 Nov 2009 12:06:35 +0000 Subject: [PATCH 210/306] fix the Ext-2191 linux compile failure min->llmin, max->llmax --- indra/newview/llvowlsky.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index 7a7538ae629..d3238f16a8a 100644 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -49,12 +49,12 @@ const U32 LLVOWLSky::MAX_SKY_DETAIL = 180; inline U32 LLVOWLSky::getNumStacks(void) { - return min(MAX_SKY_DETAIL, max(MIN_SKY_DETAIL, gSavedSettings.getU32("WLSkyDetail"))); + return llmin(MAX_SKY_DETAIL, llmax(MIN_SKY_DETAIL, gSavedSettings.getU32("WLSkyDetail"))); } inline U32 LLVOWLSky::getNumSlices(void) { - return 2 * min(MAX_SKY_DETAIL, max(MIN_SKY_DETAIL, gSavedSettings.getU32("WLSkyDetail"))); + return 2 * llmin(MAX_SKY_DETAIL, llmax(MIN_SKY_DETAIL, gSavedSettings.getU32("WLSkyDetail"))); } inline U32 LLVOWLSky::getFanNumVerts(void) -- GitLab From 1c591c06b72d222cff7775ef3aa067cba9c52cd3 Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Fri, 6 Nov 2009 12:08:15 +0000 Subject: [PATCH 211/306] EXT-2232: Arghhh! Code Duplication == Bugs. Apparently, pre-login notifications use LLAlertDialog, but post-login notifications use LLToastAlertPanel. The latter is basically a copy and paste of the former, with some local modifications. However, the person who copy/pasted the code did not initialize the URLLoader callback, so all notifications that tried to open a web page on a button click after login were failing. I've added comments that this code should be refactored, preferably as a subclass of LLAlertDialog. In the meantime, I've tried to clean it up a bit by not duplicating the nested URLLoader class (which would've required further duplication to reimplement the exact same loader class that LLAlertDialog uses). This let me then initialize the URLLoader callback for LLToastAlertPanel, to fix this specific bug. Again... arghhh!! --- indra/newview/lltoastalertpanel.cpp | 5 ++++- indra/newview/lltoastalertpanel.h | 16 +++++++--------- indra/newview/llweb.cpp | 4 +++- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index e4a3f8603b8..beb31bc8334 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -30,6 +30,9 @@ * $/LicenseInfo$ */ +// *NOTE: this module is a copy-paste of llui/llalertdialog.h +// Can we re-implement this as a subclass of LLAlertDialog and +// avoid all this code duplication? It already caused EXT-2232. #include "llviewerprecompiledheaders.h" // must be first include @@ -56,7 +59,7 @@ const F32 DEFAULT_BUTTON_DELAY = 0.5f; const S32 MSG_PAD = 8; /*static*/ LLControlGroup* LLToastAlertPanel::sSettings = NULL; -/*static*/ LLToastAlertPanel::URLLoader* LLToastAlertPanel::sURLLoader; +/*static*/ LLAlertURLLoader* LLToastAlertPanel::sURLLoader; //----------------------------------------------------------------------------- // Private methods diff --git a/indra/newview/lltoastalertpanel.h b/indra/newview/lltoastalertpanel.h index af0c9a9ddd9..840143a2a93 100644 --- a/indra/newview/lltoastalertpanel.h +++ b/indra/newview/lltoastalertpanel.h @@ -30,6 +30,10 @@ * $/LicenseInfo$ */ +// *NOTE: this module is a copy-paste of llui/llalertdialog.h +// Can we re-implement this as a subclass of LLAlertDialog and +// avoid all this code duplication? It already caused EXT-2232. + #ifndef LL_TOASTALERTPANEL_H #define LL_TOASTALERTPANEL_H @@ -37,6 +41,7 @@ #include "llfloater.h" #include "llui.h" #include "llnotifications.h" +#include "llalertdialog.h" class LLButton; class LLCheckBoxCtrl; @@ -57,14 +62,7 @@ class LLToastAlertPanel public: typedef bool (*display_callback_t)(S32 modal); - class URLLoader - { - public: - virtual void load(const std::string& url, bool force_open_externally = 0 ) = 0; - virtual ~URLLoader() {} - }; - - static void setURLLoader(URLLoader* loader) + static void setURLLoader(LLAlertURLLoader* loader) { sURLLoader = loader; } @@ -97,7 +95,7 @@ class LLToastAlertPanel BOOL hasTitleBar() const; private: - static URLLoader* sURLLoader; + static LLAlertURLLoader* sURLLoader; static LLControlGroup* sSettings; struct ButtonData diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 3204c2d2642..72431bd22f2 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -43,8 +43,9 @@ #include "llfloatermediabrowser.h" #include "llfloaterreg.h" #include "llalertdialog.h" +#include "lltoastalertpanel.h" -class URLLoader : public LLAlertDialog::URLLoader +class URLLoader : public LLAlertURLLoader { virtual void load(const std::string& url , bool force_open_externally) { @@ -65,6 +66,7 @@ static URLLoader sAlertURLLoader; void LLWeb::initClass() { LLAlertDialog::setURLLoader(&sAlertURLLoader); + LLToastAlertPanel::setURLLoader(&sAlertURLLoader); } -- GitLab From bc3377c1f6ed295afd7636d907702976adfd846d Mon Sep 17 00:00:00 2001 From: Eugene Kondrashev <ekondrashev@productengine.com> Date: Fri, 6 Nov 2009 14:49:35 +0200 Subject: [PATCH 212/306] Partial implementation of EXT-1906 All speakers handling functional in old IM Floaters (Communicate) should be present in new IM Floaters/IM control panels, EXCLUDING voice related mute/moderation stuff --HG-- branch : product-engine --- indra/newview/llimfloater.cpp | 31 ++++++++++++++- indra/newview/llimfloater.h | 1 + indra/newview/llimview.cpp | 38 ++++++++++++------- indra/newview/llimview.h | 1 + .../newview/skins/default/xui/en/strings.xml | 2 + 5 files changed, 57 insertions(+), 16 deletions(-) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 85863ed85bf..720cea8b1ac 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -235,7 +235,7 @@ BOOL LLIMFloater::postBuild() std::string session_name(LLIMModel::instance().getName(mSessionID)); - mInputEditor->setLabel(mInputEditor->getLabel() + " " + session_name); + mInputEditor->setLabel(LLTrans::getString("IM_default_text_label")); LLStringUtil::toUpper(session_name); setTitle(session_name); @@ -498,7 +498,8 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void* // Allow enabling the LLIMFloater input editor only if session can accept text LLIMModel::LLIMSession* im_session = LLIMModel::instance().findIMSession(self->mSessionID); - if( im_session && im_session->mTextIMPossible ) + //TODO: While disabled lllineeditor can receive focus we need to check if it is enabled (EK) + if( im_session && im_session->mTextIMPossible && !self->mInputEditor->getEnabled()) { //in disconnected state IM input editor should be disabled self->mInputEditor->setEnabled(!gDisconnected); @@ -588,6 +589,32 @@ void LLIMFloater::processIMTyping(const LLIMInfo* im_info, BOOL typing) } } +void LLIMFloater::processAgentListUpdates(const LLSD& body) +{ + if ( !body.isMap() ) return; + + if ( body.has("agent_updates") && body["agent_updates"].isMap() ) + { + LLSD agent_data = body["agent_updates"].get(gAgentID.asString()); + if (agent_data.isMap() && agent_data.has("info")) + { + LLSD agent_info = agent_data["info"]; + + if (agent_info.has("mutes")) + { + BOOL moderator_muted_text = agent_info["mutes"]["text"].asBoolean(); + mInputEditor->setEnabled(!moderator_muted_text); + std::string label; + if (moderator_muted_text) + label = LLTrans::getString("IM_muted_text_label"); + else + label = LLTrans::getString("IM_default_text_label"); + mInputEditor->setLabel(label); + } + } + } +} + void LLIMFloater::processSessionUpdate(const LLSD& session_update) { // *TODO : verify following code when moderated mode will be implemented diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index f5edb3188ab..065441b1889 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -90,6 +90,7 @@ class LLIMFloater : public LLTransientDockableFloater void onVisibilityChange(const LLSD& new_visibility); void processIMTyping(const LLIMInfo* im_info, BOOL typing); + void processAgentListUpdates(const LLSD& body); void processSessionUpdate(const LLSD& session_update); BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 7e8701bf212..095a18f3227 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1848,6 +1848,29 @@ void LLIMMgr::clearPendingInvitation(const LLUUID& session_id) } } +void LLIMMgr::processAgentListUpdates(const LLUUID& session_id, const LLSD& body) +{ + LLIMFloater* im_floater = LLIMFloater::findInstance(session_id); + if ( im_floater ) + { + im_floater->processAgentListUpdates(body); + } + LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id); + if (speaker_mgr) + { + speaker_mgr->updateSpeakers(body); + } + else + { + //we don't have a speaker manager yet..something went wrong + //we are probably receiving an update here before + //a start or an acceptance of an invitation. Race condition. + gIMMgr->addPendingAgentListUpdates( + session_id, + body); + } +} + LLSD LLIMMgr::getPendingAgentListUpdates(const LLUUID& session_id) { if ( mPendingAgentListUpdates.has(session_id.asString()) ) @@ -2232,20 +2255,7 @@ class LLViewerChatterBoxSessionAgentListUpdates : public LLHTTPNode const LLSD& input) const { const LLUUID& session_id = input["body"]["session_id"].asUUID(); - LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id); - if (speaker_mgr) - { - speaker_mgr->updateSpeakers(input["body"]); - } - else - { - //we don't have a speaker manager yet..something went wrong - //we are probably receiving an update here before - //a start or an acceptance of an invitation. Race condition. - gIMMgr->addPendingAgentListUpdates( - input["body"]["session_id"].asUUID(), - input["body"]); - } + gIMMgr->processAgentListUpdates(session_id, input["body"]); } }; diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index f986d9dcdbe..769d49f388b 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -315,6 +315,7 @@ class LLIMMgr : public LLSingleton<LLIMMgr> void clearPendingInvitation(const LLUUID& session_id); + void processAgentListUpdates(const LLUUID& session_id, const LLSD& body); LLSD getPendingAgentListUpdates(const LLUUID& session_id); void addPendingAgentListUpdates( const LLUUID& sessioN_id, diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index ec2673644f0..101426ee28f 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2845,6 +2845,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Unnamed">(Unnamed)</string> <string name="IM_moderated_chat_label">(Moderated: Voices off by default)</string> <string name="IM_unavailable_text_label">Text chat is not available for this call.</string> + <string name="IM_muted_text_label">Your text chat has been disabled by a Group Moderator.</string> + <string name="IM_default_text_label">Click here to instant message.</string> <string name="ringing-im"> -- GitLab From 904f6124b282e3e9668289bef9f7d44f8539ce51 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Fri, 6 Nov 2009 13:27:28 +0000 Subject: [PATCH 213/306] magic number removal rampage: 3.14159 -> M_PI or F_PI --HG-- branch : texture-pipeline --- indra/newview/llfloaterworldmap.cpp | 2 +- indra/newview/lltracker.cpp | 6 +++--- indra/newview/llvoavatar.cpp | 4 ++-- indra/newview/llvovolume.cpp | 8 ++++---- indra/newview/llworldmapview.cpp | 2 +- indra/newview/pipeline.cpp | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index b7e8835fb88..d3c6248fafb 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -427,7 +427,7 @@ void LLFloaterWorldMap::draw() { F64 seconds = LLTimer::getElapsedSeconds(); double value = fmod(seconds, 2); - value = 0.5 + 0.5*cos(value * 3.14159f); + value = 0.5 + 0.5*cos(value * M_PI); LLColor4 loading_color(0.0, F32(value/2), F32(value), 1.0); childSetColor("location_icon", loading_color); } diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index 5929ecd928a..1a617176588 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -416,10 +416,10 @@ F32 pulse_func(F32 t, F32 z) return 0.f; } - t *= 3.14159f; + t *= F_PI; z -= t*64.f - 256.f; - F32 a = cosf(z*3.14159/512.f)*10.0f; + F32 a = cosf(z*F_PI/512.f)*10.0f; a = llmax(a, 9.9f); a -= 9.9f; a *= 10.f; @@ -433,7 +433,7 @@ void draw_shockwave(F32 center_z, F32 t, S32 steps, LLColor4 color) return; } - t *= 0.6284f/3.14159f; + t *= 0.6284f/F_PI; t -= (F32) (S32) t; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 76e00db91c7..3aca2ed904c 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2381,7 +2381,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update) F32 old_angle = mImpostorAngle.mV[i]; F32 angle_diff = fabsf(cur_angle-old_angle); - if (angle_diff > 3.14159f/512.f*distance*mUpdatePeriod) + if (angle_diff > F_PI/512.f*distance*mUpdatePeriod) { mNeedsImpostorUpdate = TRUE; } @@ -2542,7 +2542,7 @@ void LLVOAvatar::idleUpdateLoadingEffect() particle_parameters.mPartImageID = cloud->getID(); particle_parameters.mMaxAge = 0.f; particle_parameters.mPattern = LLPartSysData::LL_PART_SRC_PATTERN_ANGLE_CONE; - particle_parameters.mInnerAngle = 3.14159f; + particle_parameters.mInnerAngle = F_PI; particle_parameters.mOuterAngle = 0.f; particle_parameters.mBurstRate = 0.02f; particle_parameters.mBurstRadius = 0.0f; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 1704f633765..421e6fdff52 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -739,15 +739,15 @@ F32 LLVOVolume::getTextureVirtualSize(LLFace* face) face->setPixelArea(face_area); - if (face_area <= 0) + if (face_area <= 0.f) { return 0.f; } //get area of circle in texture space LLVector2 tdim = face->mTexExtents[1] - face->mTexExtents[0]; - F32 texel_area = (tdim * 0.5f).lengthSquared()*3.14159f; - if (texel_area <= 0) + F32 texel_area = (tdim * 0.5f).lengthSquared()*F_PI; + if (texel_area <= 0.f) { // Probably animated, use default texel_area = 1.f; @@ -1036,7 +1036,7 @@ BOOL LLVOVolume::calcLOD() } // DON'T Compensate for field of view changing on FOV zoom. - distance *= 3.14159f/3.f; + distance *= F_PI/3.f; cur_detail = computeLODDetail(llround(distance, 0.01f), llround(radius, 0.01f)); diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 5446a08ebf3..bd2e1e66215 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -821,7 +821,7 @@ void LLWorldMapView::draw() else { double value = fmod(current_time, 2); - value = 0.5 + 0.5*cos(value * 3.14159f); + value = 0.5 + 0.5*cos(value * M_PI); LLColor4 loading_color(0.0, F32(value/2), F32(value), 1.0); drawTracking( LLWorldMap::getInstance()->mUnknownLocation, loading_color, TRUE, getString("Loading"), ""); } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index b50e71bf485..f2442a49c01 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1474,7 +1474,7 @@ F32 LLPipeline::calcPixelArea(LLVector3 center, LLVector3 size, LLCamera &camera //get area of circle around node F32 app_angle = atanf(size.length()/dist); F32 radius = app_angle*LLDrawable::sCurPixelAngle; - return radius*radius * 3.14159f; + return radius*radius * F_PI; } void LLPipeline::grabReferences(LLCullResult& result) -- GitLab From e4fdc0ba558ec8960796c9663c4a7e2ec92d8916 Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Fri, 6 Nov 2009 15:41:05 +0200 Subject: [PATCH 214/306] no ticket. major crash in Panel Landmark has been fixed. It was founded while investigating EXT-1607. --HG-- branch : product-engine --- indra/newview/llpanellandmarks.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index c5165462828..62dc881738c 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -829,17 +829,18 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co // then ask LLFolderView permissions if (can_be_modified) { + LLFolderViewItem* selected = getCurSelectedItem(); if ("cut" == command_name) { can_be_modified = mCurrentSelectedList->getRootFolder()->canCut(); } else if ("rename" == command_name) { - can_be_modified = getCurSelectedItem()->getListener()->isItemRenameable(); + can_be_modified = selected? selected->getListener()->isItemRenameable() : false; } else if ("delete" == command_name) { - can_be_modified = getCurSelectedItem()->getListener()->isItemRemovable(); + can_be_modified = selected? selected->getListener()->isItemRemovable(): false; } else if("paste" == command_name) { -- GitLab From 0c95cc78e56e9249df223dedd93e708d9f7698ab Mon Sep 17 00:00:00 2001 From: Eugene Kondrashev <ekondrashev@productengine.com> Date: Fri, 6 Nov 2009 15:48:27 +0200 Subject: [PATCH 215/306] No ticket fixed dropped functionaliti by prev commit --HG-- branch : product-engine --- indra/newview/llimfloater.cpp | 4 ++-- indra/newview/skins/default/xui/en/strings.xml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 720cea8b1ac..83e1a333f7a 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -235,7 +235,7 @@ BOOL LLIMFloater::postBuild() std::string session_name(LLIMModel::instance().getName(mSessionID)); - mInputEditor->setLabel(LLTrans::getString("IM_default_text_label")); + mInputEditor->setLabel(LLTrans::getString("IM_to_label") + " " + session_name); LLStringUtil::toUpper(session_name); setTitle(session_name); @@ -608,7 +608,7 @@ void LLIMFloater::processAgentListUpdates(const LLSD& body) if (moderator_muted_text) label = LLTrans::getString("IM_muted_text_label"); else - label = LLTrans::getString("IM_default_text_label"); + label = LLTrans::getString("IM_to_label") + " " + LLIMModel::instance().getName(mSessionID); mInputEditor->setLabel(label); } } diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 101426ee28f..b44420238f0 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2847,6 +2847,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="IM_unavailable_text_label">Text chat is not available for this call.</string> <string name="IM_muted_text_label">Your text chat has been disabled by a Group Moderator.</string> <string name="IM_default_text_label">Click here to instant message.</string> + <string name="IM_to_label">To</string> <string name="ringing-im"> -- GitLab From ddb42652e3205a96289ad4ac8031a022cce46c4a Mon Sep 17 00:00:00 2001 From: Igor Borovkov <iborovkov@productengine.com> Date: Fri, 6 Nov 2009 15:49:56 +0200 Subject: [PATCH 216/306] IM: minor refac., moved floater registation of llviewerfloaterreg --HG-- branch : product-engine --- indra/newview/llimview.cpp | 7 ------- indra/newview/llviewerfloaterreg.cpp | 1 + 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 095a18f3227..4f844ed8c82 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1350,13 +1350,6 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response) LLIMMgr::LLIMMgr() : mIMReceived(FALSE) { - static bool registered_dialog = false; - if (!registered_dialog) - { - LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>); - registered_dialog = true; - } - mPendingInvitations = LLSD::emptyMap(); mPendingAgentListUpdates = LLSD::emptyMap(); } diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 9ca2d3f61d8..edbac69e1b8 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -170,6 +170,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("hud", "floater_hud.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHUD>); LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloater>); + LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>); LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>); LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>); LLInspectAvatarUtil::registerFloater(); -- GitLab From 4b804902229f610156920333dfb18f2f3fabf12b Mon Sep 17 00:00:00 2001 From: Eugene Mutavchi <emutavchi@productengine.com> Date: Fri, 6 Nov 2009 16:01:11 +0200 Subject: [PATCH 217/306] Fixed low bug EXT-2109 (Add moderator label if user is a moderator of a group chat(See old communication floater)) --HG-- branch : product-engine --- indra/newview/llparticipantlist.cpp | 98 ++++++++++++++++++- indra/newview/llparticipantlist.h | 20 +++- indra/newview/llspeakers.cpp | 23 +++++ indra/newview/llspeakers.h | 10 ++ .../newview/skins/default/xui/en/strings.xml | 1 + 5 files changed, 145 insertions(+), 7 deletions(-) diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index edff706fee5..94e47318ded 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -50,13 +50,16 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av mSpeakerAddListener = new SpeakerAddListener(*this); mSpeakerRemoveListener = new SpeakerRemoveListener(*this); mSpeakerClearListener = new SpeakerClearListener(*this); + mSpeakerModeratorListener = new SpeakerModeratorUpdateListener(*this); mSpeakerMgr->addListener(mSpeakerAddListener, "add"); mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove"); mSpeakerMgr->addListener(mSpeakerClearListener, "clear"); + mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator"); mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); + mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2)); //Lets fill avatarList with existing speakers LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); @@ -65,7 +68,12 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av mSpeakerMgr->getSpeakerList(&speaker_list, true); for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++) { - group_members.push_back((*it)->mID); + const LLPointer<LLSpeaker>& speakerp = *it; + group_members.push_back(speakerp->mID); + if ( speakerp->mIsModerator ) + { + mModeratorList.insert(speakerp->mID); + } } sort(); } @@ -84,6 +92,56 @@ void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list) LLAvatarActions::startIM(clicked_id); } +void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param) +{ + LLAvatarList* list = dynamic_cast<LLAvatarList*>(ctrl); + if (list) + { + const std::string moderator_indicator(LLTrans::getString("IM_moderator_label")); + const std::size_t moderator_indicator_len = moderator_indicator.length(); + + // Firstly remove moderators indicator + std::set<LLUUID>::const_iterator + moderator_list_it = mModeratorToRemoveList.begin(), + moderator_list_end = mModeratorToRemoveList.end(); + for (;moderator_list_it != moderator_list_end; ++moderator_list_it) + { + LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*> (list->getItemByValue(*moderator_list_it)); + if ( item ) + { + std::string name = item->getAvatarName(); + size_t found = name.find(moderator_indicator); + if (found == std::string::npos) + { + name.erase(found, moderator_indicator_len); + item->setName(name); + } + } + } + + mModeratorToRemoveList.clear(); + + // Add moderators indicator + moderator_list_it = mModeratorList.begin(); + moderator_list_end = mModeratorList.end(); + for (;moderator_list_it != moderator_list_end; ++moderator_list_it) + { + LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*> (list->getItemByValue(*moderator_list_it)); + if ( item ) + { + std::string name = item->getAvatarName(); + size_t found = name.find(moderator_indicator); + if (found == std::string::npos) + { + name += " "; + name += moderator_indicator; + item->setName(name); + } + } + } + } +} + void LLParticipantList::setSortOrder(EParticipantSortOrder order) { if ( mSortOrder != order ) @@ -106,6 +164,8 @@ bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, co } group_members.push_back(uu_id); + // Mark AvatarList as dirty one + mAvatarList->setDirty(); sort(); return true; } @@ -130,14 +190,36 @@ bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, return true; } +bool LLParticipantList::onModeratorUpdateEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ + const LLSD& evt_data = event->getValue(); + if ( evt_data.has("id") && evt_data.has("is_moderator") ) + { + LLUUID id = evt_data["id"]; + bool is_moderator = evt_data["is_moderator"]; + if ( id.notNull() ) + { + if ( is_moderator ) + mModeratorList.insert(id); + else + { + std::set<LLUUID>::iterator it = mModeratorList.find (id); + if ( it != mModeratorList.end () ) + { + mModeratorToRemoveList.insert(id); + mModeratorList.erase(id); + } + } + } + } + return true; +} + void LLParticipantList::sort() { if ( !mAvatarList ) return; - // Mark AvatarList as dirty one - mAvatarList->setDirty(); - // TODO: Implement more sorting orders after specs updating (EM) switch ( mSortOrder ) { case E_SORT_BY_NAME : @@ -172,3 +254,11 @@ bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents: { return mParent.onClearListEvent(event, userdata); } + +// +// LLParticipantList::SpeakerModeratorListener +// +bool LLParticipantList::SpeakerModeratorUpdateListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ + return mParent.onModeratorUpdateEvent(event, userdata); +} diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 8c209c0b208..fc34dd308ba 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -35,6 +35,7 @@ class LLSpeakerMgr; class LLAvatarList; +class LLUICtrl; class LLParticipantList { @@ -59,6 +60,7 @@ class LLParticipantList bool onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); bool onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); bool onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + bool onModeratorUpdateEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); /** * Sorts the Avatarlist by stored order @@ -97,15 +99,27 @@ class LLParticipantList /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); }; + class SpeakerModeratorUpdateListener : public BaseSpeakerListner + { + public: + SpeakerModeratorUpdateListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} + /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + }; + private: void onAvatarListDoubleClicked(LLAvatarList* list); + void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param); LLSpeakerMgr* mSpeakerMgr; LLAvatarList* mAvatarList; - LLPointer<SpeakerAddListener> mSpeakerAddListener; - LLPointer<SpeakerRemoveListener> mSpeakerRemoveListener; - LLPointer<SpeakerClearListener> mSpeakerClearListener; + std::set<LLUUID> mModeratorList; + std::set<LLUUID> mModeratorToRemoveList; + + LLPointer<SpeakerAddListener> mSpeakerAddListener; + LLPointer<SpeakerRemoveListener> mSpeakerRemoveListener; + LLPointer<SpeakerClearListener> mSpeakerClearListener; + LLPointer<SpeakerModeratorUpdateListener> mSpeakerModeratorListener; EParticipantSortOrder mSortOrder; }; diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 2341fcfc6d6..2ed82b7d621 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -87,6 +87,21 @@ void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const std::string& first, c mDisplayName = first + " " + last; } +LLSpeakerUpdateModeratorEvent::LLSpeakerUpdateModeratorEvent(LLSpeaker* source) +: LLEvent(source, "Speaker add moderator event"), + mSpeakerID (source->mID), + mIsModerator (source->mIsModerator) +{ +} + +LLSD LLSpeakerUpdateModeratorEvent::getValue() +{ + LLSD ret; + ret["id"] = mSpeakerID; + ret["is_moderator"] = mIsModerator; + return ret; +} + LLSpeakerTextModerationEvent::LLSpeakerTextModerationEvent(LLSpeaker* source) : LLEvent(source, "Speaker text moderation event") { @@ -437,9 +452,13 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers) if ( speaker_it->second.isMap() ) { + BOOL is_moderator = speakerp->mIsModerator; speakerp->mIsModerator = speaker_it->second["is_moderator"]; speakerp->mModeratorMutedText = speaker_it->second["mutes"]["text"]; + // Fire event only if moderator changed + if ( is_moderator != speakerp->mIsModerator ) + fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator"); } } } @@ -507,7 +526,11 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update) if (agent_info.has("is_moderator")) { + BOOL is_moderator = speakerp->mIsModerator; speakerp->mIsModerator = agent_info["is_moderator"]; + // Fire event only if moderator changed + if ( is_moderator != speakerp->mIsModerator ) + fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator"); } if (agent_info.has("mutes")) diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index e0f22bff4f4..04046a85878 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -84,6 +84,16 @@ class LLSpeaker : public LLRefCount, public LLOldEvents::LLObservable, public LL BOOL mModeratorMutedText; }; +class LLSpeakerUpdateModeratorEvent : public LLOldEvents::LLEvent +{ +public: + LLSpeakerUpdateModeratorEvent(LLSpeaker* source); + /*virtual*/ LLSD getValue(); +private: + const LLUUID& mSpeakerID; + BOOL mIsModerator; +}; + class LLSpeakerTextModerationEvent : public LLOldEvents::LLEvent { public: diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index b44420238f0..c850dce1419 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2848,6 +2848,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="IM_muted_text_label">Your text chat has been disabled by a Group Moderator.</string> <string name="IM_default_text_label">Click here to instant message.</string> <string name="IM_to_label">To</string> + <string name="IM_moderator_label">(Moderator)</string> <string name="ringing-im"> -- GitLab From 30fe1aa19715076be2cef2f3cf78a79b6343c9ba Mon Sep 17 00:00:00 2001 From: Andrew Polunin <apolunin@productengine.com> Date: Fri, 6 Nov 2009 17:00:26 +0200 Subject: [PATCH 218/306] fixed normal bug EXT-2193 Group Profile, Group Chat bttns and Profile chevron are enabled for None Group --HG-- branch : product-engine --- indra/newview/llgrouplist.cpp | 5 +++++ indra/newview/llpanelpeople.cpp | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index 2e2b2d51011..010ed23918d 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -183,6 +183,11 @@ void LLGroupList::addNewItem(const LLUUID& id, const std::string& name, const LL item->childSetVisible("info_btn", false); item->setGroupIconVisible(mShowIcons); + if (id.isNull()) + { + item->childSetVisible("profile_btn", false); + } + addItem(item, id, pos); // setCommentVisible(false); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 65a7b5322b5..bb6cdd2f78e 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -667,8 +667,10 @@ void LLPanelPeople::updateButtons() buttonSetEnabled("im_btn", (selected_uuids.size() >= 1)); // allow starting the friends conference for multiple selection buttonSetEnabled("call_btn", item_selected && false); // not implemented yet buttonSetEnabled("share_btn", item_selected && false); // not implemented yet - buttonSetEnabled("group_info_btn", item_selected); - buttonSetEnabled("chat_btn", item_selected); + + bool none_group_selected = item_selected && selected_id.isNull(); + buttonSetEnabled("group_info_btn", !none_group_selected); + buttonSetEnabled("chat_btn", !none_group_selected); } std::string LLPanelPeople::getActiveTabName() const -- GitLab From a3830dee59e9014605746b3425e5378b64c584fe Mon Sep 17 00:00:00 2001 From: Igor Borovkov <iborovkov@productengine.com> Date: Fri, 6 Nov 2009 17:03:48 +0200 Subject: [PATCH 219/306] implement normal subtask EXT-2265 IM unread messages counter should not be increased for system messages (comming from 'Second Life', zero uuid) --HG-- branch : product-engine --- indra/newview/llimfloater.cpp | 2 +- indra/newview/llimview.cpp | 4 ++-- indra/newview/llimview.h | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 83e1a333f7a..a634a1b0fd0 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -115,7 +115,7 @@ void LLIMFloater::onClose(bool app_quitting) /* static */ void LLIMFloater::newIMCallback(const LLSD& data){ - if (data["num_unread"].asInteger() > 0) + if (data["num_unread"].asInteger() > 0 || data["from_id"].asUUID().isNull()) { LLUUID session_id = data["session_id"].asUUID(); diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 4f844ed8c82..ac5bd719e23 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -134,7 +134,6 @@ void LLIMModel::setActiveSessionID(const LLUUID& session_id) LLIMModel::LLIMModel() { addNewMsgCallback(LLIMFloater::newIMCallback); - addNoUnreadMsgsCallback(LLIMFloater::newIMCallback); addNewMsgCallback(toast_callback); } @@ -440,7 +439,8 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co addToHistory(session_id, from, from_id, utf8_text); if (log2file) logToFile(session_id, from, from_id, utf8_text); - session->mNumUnread++; + //we do not count system messages + if (from_id.notNull()) session->mNumUnread++; // notify listeners LLSD arg; diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 769d49f388b..bd55bd2c306 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -66,7 +66,10 @@ class LLIMModel : public LLSingleton<LLIMModel> EInstantMessage mType; LLUUID mOtherParticipantID; std::vector<LLUUID> mInitialTargetIDs; + + //does NOT include system messages S32 mNumUnread; + std::list<LLSD> mMsgs; LLVoiceChannel* mVoiceChannel; -- GitLab From 66171216b01c1c5afafd3405a9d17e81f50c1925 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Fri, 6 Nov 2009 15:19:30 +0000 Subject: [PATCH 220/306] SNOW-329 Handling of error case in llimage.cpp incorrect This is the same fix as DEV-32269, trivially ported to viewer2. reviewed by merov, james, moss! --- indra/llimage/llimage.cpp | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 9bbc55509dd..73c23fa8d81 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -1223,25 +1223,28 @@ bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip ifs.read ((char*)buffer, length); ifs.close(); - image->updateData(); - - if (j2c_lowest_mip_only && codec == IMG_CODEC_J2C) + BOOL success; + + success = image->updateData(); + if (success) { - S32 width = image->getWidth(); - S32 height = image->getHeight(); - S32 discard_level = 0; - while (width > 1 && height > 1 && discard_level < MAX_DISCARD_LEVEL) + if (j2c_lowest_mip_only && codec == IMG_CODEC_J2C) { - width >>= 1; - height >>= 1; - discard_level++; + S32 width = image->getWidth(); + S32 height = image->getHeight(); + S32 discard_level = 0; + while (width > 1 && height > 1 && discard_level < MAX_DISCARD_LEVEL) + { + width >>= 1; + height >>= 1; + discard_level++; + } + ((LLImageJ2C *)((LLImageFormatted*)image))->setDiscardLevel(discard_level); } - ((LLImageJ2C *)((LLImageFormatted*)image))->setDiscardLevel(discard_level); + success = image->decode(this, 100000.0f); } - - BOOL success = image->decode(this, 100000.0f); - image = NULL; // deletes image + image = NULL; // deletes image if (!success) { deleteData(); -- GitLab From f6aa7f8c80d3e6fd159cd6252df1baa90701c2de Mon Sep 17 00:00:00 2001 From: Igor Borovkov <iborovkov@productengine.com> Date: Fri, 6 Nov 2009 17:25:50 +0200 Subject: [PATCH 221/306] implemented normal subtask EXT-2263 IM P2P: avatar name under avatar icon should follow avatar icon and should not overlap it when being resized --HG-- branch : product-engine --- indra/newview/skins/default/xui/en/floater_im_session.xml | 2 +- indra/newview/skins/default/xui/en/panel_im_control_panel.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 70af2f63b64..452d28d4eab 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -15,7 +15,7 @@ width="520" can_resize="true" min_width="350" - min_height="350"> + min_height="369"> <layout_stack follows="left|top|right|bottom" height="354" width="520" 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 c8b134cdf0d..e81532ec3eb 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 @@ -14,7 +14,7 @@ width="125"/> <text - follows="left|right" + follows="top|left|right" font="SansSerifBig" height="16" layout="topleft" -- GitLab From 2ea6893b15715e5ef21b3d4ba37633033140b030 Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Fri, 6 Nov 2009 16:35:30 +0000 Subject: [PATCH 222/306] EXT-2231: Let users view release notes for a server change. I've added a hyperlink to the "You just entered a region using a different server version" notification. Users can click over this link to view the release notes for that server version. This notification recently started turning up in the local chat log, so the above solution works in that case as well as if it remained as a popup notification panel. --- indra/newview/llviewermessage.cpp | 55 ++++++++----------- indra/newview/llviewermessage.h | 1 - .../skins/default/xui/en/notifications.xml | 2 +- 3 files changed, 24 insertions(+), 34 deletions(-) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index d8e6c52c8cc..ea1097c4779 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2914,46 +2914,37 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) if (!gLastVersionChannel.empty()) { - LLSD payload; - payload["message"] = version_channel; - LLNotifications::instance().add("ServerVersionChanged", LLSD(), payload, server_version_changed_callback); - } - - gLastVersionChannel = version_channel; -} - -bool server_version_changed_callback(const LLSD& notification, const LLSD& response) -{ - if(notification["payload"]["message"].asString() =="") - return false; - std::string url ="http://wiki.secondlife.com/wiki/Release_Notes/"; - //parse the msg string - std::string server_version = notification["payload"]["message"].asString(); - std::vector<std::string> s_vect; - boost::algorithm::split(s_vect, server_version, isspace); - for(U32 i = 0; i < s_vect.size(); i++) - { - if (i != (s_vect.size() - 1)) - { - if(i != (s_vect.size() - 2)) + // work out the URL for this server's Release Notes + std::string url ="http://wiki.secondlife.com/wiki/Release_Notes/"; + std::string server_version = version_channel; + std::vector<std::string> s_vect; + boost::algorithm::split(s_vect, server_version, isspace); + for(U32 i = 0; i < s_vect.size(); i++) + { + if (i != (s_vect.size() - 1)) { - url += s_vect[i] + "_"; + if(i != (s_vect.size() - 2)) + { + url += s_vect[i] + "_"; + } + else + { + url += s_vect[i] + "/"; + } } else { - url += s_vect[i] + "/"; + url += s_vect[i].substr(0,4); } } - else - { - url += s_vect[i].substr(0,4); - } + + LLSD args; + args["URL"] = url; + LLNotifications::instance().add("ServerVersionChanged", args); } - - LLWeb::loadURL(url); - return false; -} + gLastVersionChannel = version_channel; +} void process_crossed_region(LLMessageSystem* msg, void**) { diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index c15e5df675a..e24da2013d1 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -132,7 +132,6 @@ void container_inventory_arrived(LLViewerObject* object, // agent movement void send_complete_agent_movement(const LLHost& sim_host); void process_agent_movement_complete(LLMessageSystem* msg, void**); -bool server_version_changed_callback(const LLSD& notification, const LLSD& response); void process_crossed_region(LLMessageSystem* msg, void**); void process_teleport_start(LLMessageSystem* msg, void**); void process_teleport_progress(LLMessageSystem* msg, void**); diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index f26a4d09d45..989dc888512 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -5669,7 +5669,7 @@ An error has occurred while trying to connect to voice chat for [VOICE_CHANNEL_N name="ServerVersionChanged" priority="high" type="notifytip"> -You just entered a region using a different server version, which may affect performance. Click to see the release notes. +You just entered a region using a different server version, which may affect performance. [[URL] View the release notes.] </notification> <notification -- GitLab From 01c83aa21e616777adf9e1ab0319f95e656e4f7a Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Fri, 6 Nov 2009 18:39:00 +0200 Subject: [PATCH 223/306] partial fix for minor bug EXT-1607 Trash and Gear buttons are enabled when nothing is selected. Now gear button will disabled when nothing is selected. --HG-- branch : product-engine --- indra/newview/llpanellandmarks.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 62dc881738c..9840c911589 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -499,6 +499,7 @@ void LLLandmarksPanel::updateListCommands() // keep Options & Add Landmark buttons always enabled mListCommands->childSetEnabled(ADD_FOLDER_BUTTON_NAME, add_folder_enabled); mListCommands->childSetEnabled(TRASH_BUTTON_NAME, trash_enabled); + mListCommands->childSetEnabled(OPTIONS_BUTTON_NAME,getCurSelectedItem() != NULL); } void LLLandmarksPanel::onActionsButtonClick() -- GitLab From 956ce3af6564c12d252aed8ae26581068064fb76 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Fri, 6 Nov 2009 16:41:56 +0000 Subject: [PATCH 224/306] M_PI -> F_PI - who knew that M_PI was dropped from C99 onwards?! Oh well, this should still be better. --- indra/newview/llfloaterworldmap.cpp | 2 +- indra/newview/llworldmapview.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 823c8e79113..412011e76ad 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -457,7 +457,7 @@ void LLFloaterWorldMap::draw() { F64 seconds = LLTimer::getElapsedSeconds(); double value = fmod(seconds, 2); - value = 0.5 + 0.5*cos(value * M_PI); + value = 0.5 + 0.5*cos(value * F_PI); LLColor4 loading_color(0.0, F32(value/2), F32(value), 1.0); childSetColor("location_icon", loading_color); } diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 0509898f40f..9a249d14f8f 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -822,7 +822,7 @@ void LLWorldMapView::draw() else { double value = fmod(current_time, 2); - value = 0.5 + 0.5*cos(value * M_PI); + value = 0.5 + 0.5*cos(value * F_PI); LLColor4 loading_color(0.0, F32(value/2), F32(value), 1.0); drawTracking( LLWorldMap::getInstance()->mUnknownLocation, loading_color, TRUE, getString("Loading"), ""); } -- GitLab From 8a4e36a9bdd94ebd183d1f315aa51c6c52d0abbd Mon Sep 17 00:00:00 2001 From: Alexei Arabadji <aarabadji@productengine.com> Date: Fri, 6 Nov 2009 19:31:27 +0200 Subject: [PATCH 225/306] fixed EXT-2295 "'Group Chat' btn makes chicklet appear only" --HG-- branch : product-engine --- indra/newview/llavataractions.cpp | 11 +++++++++-- indra/newview/llavatariconctrl.cpp | 7 ++++++- indra/newview/llgroupactions.cpp | 7 ++++++- indra/newview/llimview.cpp | 16 ++++++++++++++-- indra/newview/llinventorybridge.cpp | 7 ++++++- indra/newview/llinventorypanel.cpp | 7 ++++++- indra/newview/llnotificationofferhandler.cpp | 4 ++++ indra/newview/llviewermenu.cpp | 7 ++++++- 8 files changed, 57 insertions(+), 9 deletions(-) diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 67ffe54b7e6..3fc37aa3d50 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -178,7 +178,10 @@ void LLAvatarActions::startIM(const LLUUID& id) std::string name; gCacheName->getFullName(id, name); LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); - LLIMFloater::show(session_id); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } make_ui_sound("UISndStartIM"); } @@ -191,7 +194,11 @@ void LLAvatarActions::startConference(const std::vector<LLUUID>& ids) { id_array.push_back(*it); } - gIMMgr->addSession("Friends Conference", IM_SESSION_CONFERENCE_START, ids[0], id_array); + LLUUID session_id = gIMMgr->addSession("Friends Conference", IM_SESSION_CONFERENCE_START, ids[0], id_array); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } make_ui_sound("UISndStartIM"); } diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index b56e8d1ec25..0ee3e784095 100644 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -44,6 +44,7 @@ #include "llcachename.h" #include "llagentdata.h" +#include "llimfloater.h" #define MENU_ITEM_VIEW_PROFILE 0 #define MENU_ITEM_SEND_IM 1 @@ -354,7 +355,11 @@ void LLAvatarIconCtrl::onAvatarIconContextMenuItemClicked(const LLSD& userdata) name.append(" "); name.append(getLastName()); - gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); + LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } } else if (level == "add") { diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index c46eedbef24..e60bde9fd89 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -43,6 +43,7 @@ #include "llimview.h" // for gIMMgr #include "llsidetray.h" #include "llstatusbar.h" // can_afford_transaction() +#include "llimfloater.h" // // Globals @@ -279,10 +280,14 @@ void LLGroupActions::startChat(const LLUUID& group_id) LLGroupData group_data; if (gAgent.getGroupData(group_id, group_data)) { - gIMMgr->addSession( + LLUUID session_id = gIMMgr->addSession( group_data.mName, IM_SESSION_GROUP_START, group_id); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } make_ui_sound("UISndStartIM"); } else diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 7e8701bf212..6055719233d 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1192,10 +1192,14 @@ void LLIncomingCallDialog::processCallResponse(S32 response) } else { - gIMMgr->addSession( + LLUUID session_id = gIMMgr->addSession( mPayload["session_name"].asString(), type, session_id); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } std::string url = gAgent.getRegion()->getCapability( "ChatSessionRequest"); @@ -1279,10 +1283,14 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response) } else { - gIMMgr->addSession( + LLUUID session_id = gIMMgr->addSession( payload["session_name"].asString(), type, session_id); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } std::string url = gAgent.getRegion()->getCapability( "ChatSessionRequest"); @@ -1555,6 +1563,10 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name, const std::string& caller_uri) { LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id); if (speaker_mgr) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index b9a25d5dc74..ef61c45d4de 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -97,6 +97,7 @@ #include "llfloateropenobject.h" #include "lltrans.h" #include "llappearancemgr.h" +#include "llimfloater.h" using namespace LLOldEvents; @@ -3347,7 +3348,11 @@ void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* { std::string callingcard_name; gCacheName->getFullName(item->getCreatorUUID(), callingcard_name); - gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID()); + LLUUID session_id = gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID()); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } } } else if ("lure" == action) diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 178e7d0823e..80710610d4f 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -86,6 +86,7 @@ #include "llviewerwindow.h" #include "llvoavatarself.h" #include "llwearablelist.h" +#include "llimfloater.h" static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel"); @@ -800,7 +801,11 @@ bool LLInventoryPanel::beginIMSession() name = llformat("Session %d", session_num++); } - gIMMgr->addSession(name, type, members[0], members); + LLUUID session_id = gIMMgr->addSession(name, type, members[0], members); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } return true; } diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index 8e3a44682c8..75ef5208e76 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -99,6 +99,10 @@ bool LLOfferHandler::processNotification(const LLSD& notify) session_id = LLIMMgr::instance().addSession( notification->getSubstitutions()["NAME"], IM_NOTHING_SPECIAL, notification->getPayload()["from_id"]); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } } LLIMMgr::instance().addMessage(session_id, LLUUID(), notification->getSubstitutions()["NAME"], diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 300ebf4e243..053a8d19e55 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -210,6 +210,7 @@ #include "lltexlayer.h" #include "llappearancemgr.h" +#include "llimfloater.h" using namespace LLVOAvatarDefines; @@ -6265,9 +6266,13 @@ class LLAvatarSendIM : public view_listener_t //EInstantMessage type = have_agent_callingcard(gLastHitObjectID) // ? IM_SESSION_ADD : IM_SESSION_CARDLESS_START; - gIMMgr->addSession(name, + LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, avatar->getID()); + if (session_id != LLUUID::null) + { + LLIMFloater::show(session_id); + } } return true; } -- GitLab From dbd749d533532368f209c5d5687a38cf9b4f1657 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Fri, 6 Nov 2009 17:57:15 +0000 Subject: [PATCH 226/306] DEV-42322 webkit plugin fails to start on linux in mercurial repo --- indra/cmake/WebKitLibPlugin.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake index 9ec23e80ca1..1c572ab27f2 100644 --- a/indra/cmake/WebKitLibPlugin.cmake +++ b/indra/cmake/WebKitLibPlugin.cmake @@ -51,6 +51,7 @@ elseif (LINUX) QtGui QtCore + jpeg fontconfig X11 Xrender -- GitLab From dae2e04f1930404296f39a39ec91c8cdb95eb733 Mon Sep 17 00:00:00 2001 From: Dmitry Oleshko <doleshko@productengine.com> Date: Fri, 6 Nov 2009 20:03:03 +0200 Subject: [PATCH 227/306] partial implementation for the major task (EXT-989) IM chiclets should expand to show active voice indicator --HG-- branch : product-engine --- indra/newview/llchiclet.cpp | 194 ++++++++++++++++++------------- indra/newview/llchiclet.h | 76 +++++++----- indra/newview/llvoicechannel.cpp | 3 + indra/newview/llvoicechannel.h | 7 ++ 4 files changed, 168 insertions(+), 112 deletions(-) diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 6fd7e6b07db..041baf06e7c 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -200,7 +200,9 @@ void LLChiclet::setValue(const LLSD& value) LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p) : LLChiclet(p) +, mShowSpeaker(false) , mNewMessagesIcon(NULL) +, mSpeakerCtrl(NULL) , mCounterCtrl(NULL) { // initialize an overlay icon for new messages @@ -219,6 +221,40 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p) setShowCounter(false); } +void LLIMChiclet::setShowSpeaker(bool show) +{ + bool needs_resize = getShowSpeaker() != show; + if(needs_resize) + { + mShowSpeaker = show; + toggleSpeakerControl(); + onChicletSizeChanged(); + } +} +void LLIMChiclet::initSpeakerControl() +{ + mSpeakerCtrl->setSpeakerId(getOtherParticipantId()); +} + +void LLIMChiclet::toggleSpeakerControl() +{ + LLRect speaker_rect = mSpeakerCtrl->getRect(); + S32 required_width = getRect().getWidth(); + + if(getShowSpeaker()) + { + required_width = required_width + speaker_rect.getWidth(); + initSpeakerControl(); + } + else + { + required_width = required_width - speaker_rect.getWidth(); + } + + reshape(required_width, getRect().getHeight()); + mSpeakerCtrl->setVisible(getShowSpeaker()); +} + void LLIMChiclet::setShowNewMessagesIcon(bool show) { if(mNewMessagesIcon) @@ -310,7 +346,7 @@ LLIMP2PChiclet::Params::Params() // Changed icon height from 25 to 24 to fix ticket EXT-794. // In some cases(after changing UI scale) 25 pixel height icon was // drawn incorrectly, i'm not sure why. - avatar_icon.rect(LLRect(0, 24, 25, 0)); + avatar_icon.rect(LLRect(0, 24, 24, 0)); avatar_icon.mouse_opaque(false); unread_notifications.name("unread"); @@ -323,7 +359,9 @@ LLIMP2PChiclet::Params::Params() unread_notifications.visible(false); speaker.name("speaker"); - speaker.rect(LLRect(45, 25, 65, 0)); + speaker.rect(LLRect(25, 25, 45, 0)); + speaker.auto_update(true); + speaker.draw_border(false); show_speaker = false; } @@ -331,7 +369,6 @@ LLIMP2PChiclet::Params::Params() LLIMP2PChiclet::LLIMP2PChiclet(const Params& p) : LLIMChiclet(p) , mChicletIconCtrl(NULL) -, mSpeakerCtrl(NULL) , mPopupMenu(NULL) { LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon; @@ -359,18 +396,9 @@ void LLIMP2PChiclet::setCounter(S32 counter) setShowNewMessagesIcon(counter); } -LLRect LLIMP2PChiclet::getRequiredRect() +void LLIMP2PChiclet::initSpeakerControl() { - LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0); - if(getShowCounter()) - { - rect.mRight += mCounterCtrl->getRequiredRect().getWidth(); - } - if(getShowSpeaker()) - { - rect.mRight += mSpeakerCtrl->getRect().getWidth(); - } - return rect; + mSpeakerCtrl->setSpeakerId(getOtherParticipantId()); } void LLIMP2PChiclet::setOtherParticipantId(const LLUUID& other_participant_id) @@ -447,18 +475,6 @@ void LLIMP2PChiclet::onMenuItemClicked(const LLSD& user_data) } } -void LLIMP2PChiclet::setShowSpeaker(bool show) -{ - LLIMChiclet::setShowSpeaker(show); - - bool needs_resize = getShowSpeaker() != show; - mSpeakerCtrl->setVisible(getShowSpeaker()); - if(needs_resize) - { - onChicletSizeChanged(); - } -} - ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -494,7 +510,9 @@ LLAdHocChiclet::Params::Params() speaker.name("speaker"); - speaker.rect(LLRect(45, 25, 65, 0)); + speaker.rect(LLRect(25, 25, 45, 0)); + speaker.auto_update(true); + speaker.draw_border(false); show_speaker = false; } @@ -502,7 +520,6 @@ LLAdHocChiclet::Params::Params() LLAdHocChiclet::LLAdHocChiclet(const Params& p) : LLIMChiclet(p) , mChicletIconCtrl(NULL) -, mSpeakerCtrl(NULL) , mPopupMenu(NULL) { LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon; @@ -533,24 +550,35 @@ void LLAdHocChiclet::setSessionId(const LLUUID& session_id) mChicletIconCtrl->setValue(im_session->mOtherParticipantID); } -void LLAdHocChiclet::setCounter(S32 counter) +void LLAdHocChiclet::draw() { - mCounterCtrl->setCounter(counter); - setShowNewMessagesIcon(counter); + initSpeakerControl(); + LLIMChiclet::draw(); } -LLRect LLAdHocChiclet::getRequiredRect() +void LLAdHocChiclet::initSpeakerControl() { - LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0); - if(getShowCounter()) - { - rect.mRight += mCounterCtrl->getRequiredRect().getWidth(); - } - if(getShowSpeaker()) + LLUUID speaker_id; + LLSpeakerMgr::speaker_list_t speaker_list; + + LLIMModel::getInstance()->findIMSession(getSessionId())->mSpeakers->getSpeakerList(&speaker_list, FALSE); + for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i) { - rect.mRight += mSpeakerCtrl->getRect().getWidth(); + LLPointer<LLSpeaker> s = *i; + if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING) + { + speaker_id = s->mID; + break; + } } - return rect; + + mSpeakerCtrl->setSpeakerId(speaker_id); +} + +void LLAdHocChiclet::setCounter(S32 counter) +{ + mCounterCtrl->setCounter(counter); + setShowNewMessagesIcon(counter); } BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) @@ -584,7 +612,9 @@ LLIMGroupChiclet::Params::Params() unread_notifications.visible(false); speaker.name("speaker"); - speaker.rect(LLRect(45, 25, 65, 0)); + speaker.rect(LLRect(25, 25, 45, 0)); + speaker.auto_update(true); + speaker.draw_border(false); show_speaker = false; } @@ -593,7 +623,6 @@ LLIMGroupChiclet::LLIMGroupChiclet(const Params& p) : LLIMChiclet(p) , LLGroupMgrObserver(LLUUID::null) , mChicletIconCtrl(NULL) -, mSpeakerCtrl(NULL) , mPopupMenu(NULL) { LLChicletGroupIconCtrl::Params avatar_params = p.group_icon; @@ -626,18 +655,32 @@ void LLIMGroupChiclet::setCounter(S32 counter) setShowNewMessagesIcon(counter); } -LLRect LLIMGroupChiclet::getRequiredRect() +void LLIMGroupChiclet::draw() { - LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0); - if(getShowCounter()) - { - rect.mRight += mCounterCtrl->getRequiredRect().getWidth(); - } - if(getShowSpeaker()) + initSpeakerControl(); + LLIMChiclet::draw(); +} + +void LLIMGroupChiclet::initSpeakerControl() +{ + LLUUID speaker_id; + LLSpeakerMgr* speaker_mgr = NULL; + LLSpeakerMgr::speaker_list_t speaker_list; + + speaker_mgr = LLIMModel::getInstance()->findIMSession(getSessionId())->mSpeakers; + speaker_mgr->update(TRUE); + speaker_mgr->getSpeakerList(&speaker_list, FALSE); + for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i) { - rect.mRight += mSpeakerCtrl->getRect().getWidth(); + LLPointer<LLSpeaker> s = *i; + if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING) + { + speaker_id = s->mID; + break; + } } - return rect; + + mSpeakerCtrl->setSpeakerId(speaker_id); } void LLIMGroupChiclet::setSessionId(const LLUUID& session_id) @@ -724,17 +767,6 @@ void LLIMGroupChiclet::onMenuItemClicked(const LLSD& user_data) } } -void LLIMGroupChiclet::setShowSpeaker(bool show) -{ - LLIMChiclet::setShowSpeaker(show); - - bool needs_resize = getShowSpeaker() != show; - mSpeakerCtrl->setVisible(getShowSpeaker()); - if(needs_resize) - { - onChicletSizeChanged(); - } -} ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -850,10 +882,28 @@ BOOL LLChicletPanel::postBuild() LLIMModel::instance().addNewMsgCallback(boost::bind(im_chiclet_callback, this, _1)); LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(im_chiclet_callback, this, _1)); LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLChicletPanel::findChiclet<LLChiclet>, this, _1)); + LLVoiceChannel::setOnCurrentVoiceChannelChanged(boost::bind(&LLChicletPanel::onCurrentVoiceChannelChanged, this, _1)); return TRUE; } +void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id) +{ + for(chiclet_list_t::iterator it = mChicletList.begin(); it != mChicletList.end(); ++it) + { + LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it); + if(chiclet) + { + if(chiclet->getSessionId() == session_id) + { + chiclet->setShowSpeaker(true); + continue; + } + chiclet->setShowSpeaker(false); + } + } +} + S32 LLChicletPanel::calcChickletPanleWidth() { S32 res = 0; @@ -897,23 +947,7 @@ bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index) void LLChicletPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param) { - S32 chiclet_width = ctrl->getRect().getWidth(); - S32 chiclet_new_width = ctrl->getRequiredRect().getWidth(); - - if(chiclet_new_width == chiclet_width) - { - return; - } - - LLRect chiclet_rect = ctrl->getRect(); - chiclet_rect.mRight = chiclet_rect.mLeft + chiclet_new_width; - - ctrl->setRect(chiclet_rect); - - S32 offset = chiclet_new_width - chiclet_width; - S32 index = getChicletIndex(ctrl); - - shiftChiclets(offset, index + 1); + arrange(); trimChiclets(); showScrollButtonsIfNeeded(); } @@ -1452,6 +1486,6 @@ void LLChicletGroupIconCtrl::setValue(const LLSD& value ) ////////////////////////////////////////////////////////////////////////// LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p) - : LLIconCtrl(p) + : LLOutputMonitorCtrl(p) { } diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index a830240b7d4..21909d2577f 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -149,11 +149,11 @@ class LLChicletGroupIconCtrl : public LLIconCtrl /* * Class for displaying status of Voice Chat */ -class LLChicletSpeakerCtrl : public LLIconCtrl +class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl { public: - struct Params : public LLInitParam::Block<Params, LLIconCtrl::Params> + struct Params : public LLInitParam::Block<Params, LLOutputMonitorCtrl::Params> { Params(){}; }; @@ -266,8 +266,6 @@ class LLChiclet : public LLUICtrl * Base class for Instant Message chiclets. * IMChiclet displays icon, number of unread messages(optional) * and voice chat status(optional). -* Every chiclet should override LLUICtrl::getRequiredRect and return -* desired width. */ class LLIMChiclet : public LLChiclet { @@ -306,15 +304,25 @@ class LLIMChiclet : public LLChiclet virtual LLUUID getOtherParticipantId() { return mOtherParticipantId; } /* - * Shows/hides voice chat status control. + * Init Speaker Control with speaker's ID */ - virtual void setShowSpeaker(bool show) { mShowSpeaker = show; } + virtual void initSpeakerControl(); + + /* + * set status (Shows/Hide) for voice control. + */ + virtual void setShowSpeaker(bool show); /* * Returns voice chat status control visibility. */ virtual bool getShowSpeaker() {return mShowSpeaker;}; + /* + * Shows/Hides for voice control for a chiclet. + */ + virtual void toggleSpeakerControl(); + /* * Shows/hides overlay icon concerning new unread messages. */ @@ -325,10 +333,7 @@ class LLIMChiclet : public LLChiclet */ virtual bool getShowNewMessagesIcon(); - /* - * Draws border around chiclet. - */ - /*virtual*/ void draw(); + virtual void draw(); /** * Determine whether given ID refers to a group or an IM chat session. @@ -363,6 +368,8 @@ class LLIMChiclet : public LLChiclet LLIconCtrl* mNewMessagesIcon; LLChicletNotificationCounterCtrl* mCounterCtrl; + LLChicletSpeakerCtrl* mSpeakerCtrl; + /** the id of another participant, either an avatar id or a group id*/ LLUUID mOtherParticipantId; @@ -410,8 +417,6 @@ class LLIMP2PChiclet : public LLIMChiclet /* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id); - /*virtual*/ void setShowSpeaker(bool show); - /* * Sets number of unread messages. Will update chiclet's width if number text * exceeds size of counter and notify it's parent about size change. @@ -419,15 +424,14 @@ class LLIMP2PChiclet : public LLIMChiclet /*virtual*/ void setCounter(S32); /* - * Returns number of unread messages. + * Init Speaker Control with speaker's ID */ - /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } + /*virtual*/ void initSpeakerControl(); /* - * Returns rect, required to display chiclet. - * Width is the only valid value. + * Returns number of unread messages. */ - /*virtual*/ LLRect getRequiredRect(); + /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } protected: LLIMP2PChiclet(const Params& p); @@ -457,7 +461,6 @@ class LLIMP2PChiclet : public LLIMChiclet private: LLChicletAvatarIconCtrl* mChicletIconCtrl; - LLChicletSpeakerCtrl* mSpeakerCtrl; LLMenuGL* mPopupMenu; }; @@ -495,15 +498,19 @@ class LLAdHocChiclet : public LLIMChiclet /*virtual*/ void setCounter(S32); /* - * Returns number of unread messages. + * Keep Speaker Control with actual speaker's ID */ - /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } + /*virtual*/ void draw(); /* - * Returns rect, required to display chiclet. - * Width is the only valid value. + * Init Speaker Control with speaker's ID */ - /*virtual*/ LLRect getRequiredRect(); + /*virtual*/ void initSpeakerControl(); + + /* + * Returns number of unread messages. + */ + /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } protected: LLAdHocChiclet(const Params& p); @@ -517,7 +524,6 @@ class LLAdHocChiclet : public LLIMChiclet private: LLChicletAvatarIconCtrl* mChicletIconCtrl; - LLChicletSpeakerCtrl* mSpeakerCtrl; LLMenuGL* mPopupMenu; }; @@ -547,14 +553,17 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver */ /*virtual*/ void setSessionId(const LLUUID& session_id); + /* + * Keep Speaker Control with actual speaker's ID + */ + /*virtual*/ void draw(); + /** * Callback for LLGroupMgrObserver, we get this when group data is available or changed. * Sets group icon. */ /*virtual*/ void changed(LLGroupChange gc); - /*virtual*/ void setShowSpeaker(bool show); - /* * Sets number of unread messages. Will update chiclet's width if number text * exceeds size of counter and notify it's parent about size change. @@ -562,15 +571,14 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver /*virtual*/ void setCounter(S32); /* - * Returns number of unread messages. + * Init Speaker Control with speaker's ID */ - /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } + /*virtual*/ void initSpeakerControl(); /* - * Returns rect, required to display chiclet. - * Width is the only valid value. + * Returns number of unread messages. */ - /*virtual*/ LLRect getRequiredRect(); + /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } ~LLIMGroupChiclet(); @@ -597,7 +605,6 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver private: LLChicletGroupIconCtrl* mChicletIconCtrl; - LLChicletSpeakerCtrl* mSpeakerCtrl; LLMenuGL* mPopupMenu; }; @@ -735,6 +742,11 @@ class LLChicletPanel : public LLPanel /*virtual*/ BOOL postBuild(); + /* + * Handler for the Voice Client's signal. Finds a corresponding chiclet and toggles its SpeakerControl + */ + void onCurrentVoiceChannelChanged(const LLUUID& session_id); + /* * Reshapes controls and rearranges chiclets if needed. */ diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index cefc88ebee8..5ab3a2aaf30 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -46,6 +46,7 @@ LLVoiceChannel::voice_channel_map_t LLVoiceChannel::sVoiceChannelMap; LLVoiceChannel::voice_channel_map_uri_t LLVoiceChannel::sVoiceChannelURIMap; LLVoiceChannel* LLVoiceChannel::sCurrentVoiceChannel = NULL; LLVoiceChannel* LLVoiceChannel::sSuspendedVoiceChannel = NULL; +LLVoiceChannel::channel_changed_signal_t LLVoiceChannel::sCurrentVoiceChannelChanged; BOOL LLVoiceChannel::sSuspended = FALSE; @@ -320,6 +321,8 @@ void LLVoiceChannel::activate() { setState(STATE_CALL_STARTED); } + + sCurrentVoiceChannelChanged(this->mSessionID); } void LLVoiceChannel::getChannelInfo() diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index 8f1e9ff02d3..dfa886c99ce 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -54,6 +54,13 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver typedef boost::function<void(const EState& old_state, const EState& new_state)> state_changed_callback_t; + // on current channel changed signal + typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t; + typedef boost::signals2::signal<void(const LLUUID& session_id)> channel_changed_signal_t; + static channel_changed_signal_t sCurrentVoiceChannelChanged; + static boost::signals2::connection setOnCurrentVoiceChannelChanged(channel_changed_callback_t cb) { return sCurrentVoiceChannelChanged.connect(cb); } + + LLVoiceChannel(const LLUUID& session_id, const std::string& session_name); virtual ~LLVoiceChannel(); -- GitLab From 258eb3d7dd298390eca2740dc3c18c7c454df5e0 Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Fri, 6 Nov 2009 13:10:38 -0500 Subject: [PATCH 228/306] EXT-1823 avatar shape corrupted with huge legs/feet As suspected a morph mask issue. Apparently we were setting success to false if the user specifies a pant or shrit texture without an alpha channel. Result: bad morph masks. Patch begins to clean up the isMorphMaskValid issue, as well as fixing this error. Code reviewed by Vir --- indra/newview/lltexlayer.cpp | 113 +++++++++++++++++-------------- indra/newview/lltexlayer.h | 19 +++--- indra/newview/llvoavatar.cpp | 38 ++++------- indra/newview/llvoavatar.h | 3 - indra/newview/llvoavatarself.cpp | 2 +- 5 files changed, 86 insertions(+), 89 deletions(-) diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index 5d9046ac905..73340cbc03d 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -670,8 +670,6 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height ) LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE); gGL.setColorMask(true, true); - BOOL render_morph = mAvatar->morphMaskNeedsUpdate(mBakedTexIndex); - // clear buffer area to ensure we don't pick up UI elements { gGL.flush(); @@ -691,12 +689,8 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height ) if (layer->getRenderPass() == LLTexLayer::RP_COLOR) { gGL.flush(); - success &= layer->render(x, y, width, height, render_morph); + success &= layer->render(x, y, width, height); gGL.flush(); - if (layer->isMorphValid()) - { - mAvatar->setMorphMasksValid(TRUE, mBakedTexIndex); - } } } @@ -786,12 +780,10 @@ void LLTexLayerSet::gatherMorphMaskAlpha(U8 *data, S32 width, S32 height) { memset(data, 255, width * height); - BOOL render_morph = mAvatar->morphMaskNeedsUpdate(mBakedTexIndex); - for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) { LLTexLayerInterface* layer = *iter; - layer->gatherAlphaMasks(data, mComposite->getOriginX(),mComposite->getOriginY(), width, height, render_morph); + layer->gatherAlphaMasks(data, mComposite->getOriginX(),mComposite->getOriginY(), width, height); } // Set alpha back to that of our alpha masks. @@ -863,6 +855,31 @@ void LLTexLayerSet::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_ mAvatar->applyMorphMask(tex_data, width, height, num_components, mBakedTexIndex); } +BOOL LLTexLayerSet::isMorphValid() +{ + for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) + { + LLTexLayerInterface* layer = *iter; + if (layer && !layer->isMorphValid()) + { + return FALSE; + } + } + return TRUE; +} + +void LLTexLayerSet::invalidateMorphMasks() +{ + for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) + { + LLTexLayerInterface* layer = *iter; + if (layer) + { + layer->invalidateMorphMasks(); + } + } +} + //----------------------------------------------------------------------------- // LLTexLayerInfo @@ -1282,7 +1299,7 @@ void LLTexLayer::calculateTexLayerColor(const param_color_list_t ¶m_list, LL } } -BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph) +BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height) { LLGLEnable color_mat(GL_COLOR_MATERIAL); gPipeline.disableLights(); @@ -1333,7 +1350,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph) } }//*/ - renderMorphMasks(x, y, width, height, net_color, render_morph); + renderMorphMasks(x, y, width, height, net_color); alpha_mask_specified = TRUE; gGL.flush(); gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ONE_MINUS_DEST_ALPHA); @@ -1534,12 +1551,12 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height) return success; } -/*virtual*/ void LLTexLayer::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph) +/*virtual*/ void LLTexLayer::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) { - addAlphaMask(data, originX, originY, width, height, render_morph); + addAlphaMask(data, originX, originY, width, height); } -BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color, BOOL render_morph) +BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color) { BOOL success = TRUE; @@ -1578,46 +1595,38 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC // Accumulate the alpha component of the texture if( getInfo()->mLocalTexture != -1 ) { - LLViewerTexture* tex = mLocalTextureObject->getImage(); - if( tex && (tex->getComponents() == 4) ) - { - LLGLSNoAlphaTest gls_no_alpha_test; + LLViewerTexture* tex = mLocalTextureObject->getImage(); + if( tex && (tex->getComponents() == 4) ) + { + LLGLSNoAlphaTest gls_no_alpha_test; - LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode(); - - gGL.getTexUnit(0)->bind(tex); - gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); + LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode(); + + gGL.getTexUnit(0)->bind(tex); + gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); - gl_rect_2d_simple_tex( width, height ); + gl_rect_2d_simple_tex( width, height ); - gGL.getTexUnit(0)->setTextureAddressMode(old_mode); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - } - else - { - success = FALSE; - } + gGL.getTexUnit(0)->setTextureAddressMode(old_mode); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } + } if( !getInfo()->mStaticImageFileName.empty() ) { - LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); - if( tex ) - { - if( (tex->getComponents() == 4) || - ( (tex->getComponents() == 1) && getInfo()->mStaticImageIsMask ) ) - { - LLGLSNoAlphaTest gls_no_alpha_test; - gGL.getTexUnit(0)->bind(tex); - gl_rect_2d_simple_tex( width, height ); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - } - } - else + LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask); + if( tex ) + { + if( (tex->getComponents() == 4) || + ( (tex->getComponents() == 1) && getInfo()->mStaticImageIsMask ) ) { - success = FALSE; + LLGLSNoAlphaTest gls_no_alpha_test; + gGL.getTexUnit(0)->bind(tex); + gl_rect_2d_simple_tex( width, height ); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } } + } // Draw a rectangle with the layer color to multiply the alpha by that color's alpha. // Note: we're still using gGL.blendFunc( GL_DST_ALPHA, GL_ZERO ); @@ -1634,7 +1643,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC gGL.setColorMask(true, true); - if (render_morph && mHasMorph && success) + if (hasMorph() && success) { LLCRC alpha_mask_crc; const LLUUID& uuid = getUUID(); @@ -1674,7 +1683,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC return success; } -void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph) +void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height) { S32 size = width * height; U8* alphaData = getAlphaData(); @@ -1684,7 +1693,7 @@ void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 findNetColor( &net_color ); // TODO: eliminate need for layer morph mask valid flag invalidateMorphMasks(); - renderMorphMasks(originX, originY, width, height, net_color, render_morph); + renderMorphMasks(originX, originY, width, height, net_color); alphaData = getAlphaData(); } if (alphaData) @@ -1805,7 +1814,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) return layer; } -/*virtual*/ BOOL LLTexLayerTemplate::render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph) +/*virtual*/ BOOL LLTexLayerTemplate::render(S32 x, S32 y, S32 width, S32 height) { BOOL success = TRUE; updateWearableCache(); @@ -1827,7 +1836,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) { wearable->writeToAvatar(FALSE, FALSE); layer->setLTO(lto); - success &= layer->render(x,y,width,height,render_morph); + success &= layer->render(x,y,width,height); } } @@ -1849,7 +1858,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) return success; } -/*virtual*/ void LLTexLayerTemplate::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph) +/*virtual*/ void LLTexLayerTemplate::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) { U32 num_wearables = updateWearableCache(); for (U32 i = 0; i < num_wearables; i++) @@ -1857,7 +1866,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) LLTexLayer *layer = getLayer(i); if (layer) { - layer->addAlphaMask(data, originX, originY, width, height, render_morph); + layer->addAlphaMask(data, originX, originY, width, height); } } } diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h index e4a6e82ba5b..cd8f27a96b4 100644 --- a/indra/newview/lltexlayer.h +++ b/indra/newview/lltexlayer.h @@ -81,13 +81,14 @@ class LLTexLayerInterface const LLTexLayerInfo* getInfo() const { return mInfo; } virtual BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions - virtual BOOL render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph) = 0; + virtual BOOL render(S32 x, S32 y, S32 width, S32 height) = 0; void requestUpdate(); LLTexLayerSet* const getTexLayerSet() const { return mTexLayerSet; } virtual void deleteCaches() = 0; void invalidateMorphMasks(); virtual void setHasMorph(BOOL newval) { mHasMorph = newval; } + BOOL hasMorph() { return mHasMorph; } BOOL isMorphValid() { return mMorphMasksValid; } const std::string& getName() const; @@ -95,7 +96,7 @@ class LLTexLayerInterface const std::string& getGlobalColor() const; virtual BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height) = 0; - virtual void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph) = 0; + virtual void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) = 0; BOOL hasAlphaParams() const { return !mParamAlphaList.empty(); } BOOL isVisibilityMask() const; @@ -134,10 +135,10 @@ class LLTexLayerTemplate : public LLTexLayerInterface LLTexLayerTemplate(const LLTexLayerTemplate &layer); /*virtual*/ ~LLTexLayerTemplate(); - /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph); + /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height); /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions /*virtual*/ BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer - /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph); + /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height); /*virtual*/ void setHasMorph(BOOL newval); /*virtual*/ void deleteCaches(); private: @@ -162,16 +163,16 @@ class LLTexLayer : public LLTexLayerInterface /*virtual*/ ~LLTexLayer(); /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions - /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height, BOOL render_morph); + /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height); /*virtual*/ void deleteCaches(); U8* getAlphaData(); BOOL findNetColor(LLColor4* color) const; /*virtual*/ BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer - /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph); - BOOL renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color, BOOL render_morph); - void addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height, BOOL render_morph); + /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height); + BOOL renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color); + void addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height); void setLTO(LLLocalTextureObject *lto) { mLocalTextureObject = lto; } LLLocalTextureObject* getLTO() { return mLocalTextureObject; } @@ -261,6 +262,8 @@ class LLTexLayerSet void deleteCaches(); void gatherMorphMaskAlpha(U8 *data, S32 width, S32 height); void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components); + BOOL isMorphValid(); + void invalidateMorphMasks(); LLTexLayerInterface* findLayerByName(const std::string& name); void cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable* wearable); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 60ab6f80758..acf12224553 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -689,7 +689,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mBakedTextureDatas[i].mIsUsed = false; mBakedTextureDatas[i].mMaskTexName = 0; mBakedTextureDatas[i].mTextureIndex = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)i); - mBakedTextureDatas[i].mMorphMasksValid = FALSE; } mDirtyMesh = TRUE; // Dirty geometry, need to regenerate. @@ -6091,28 +6090,6 @@ void LLVOAvatar::addMaskedMorph(EBakedTextureIndex index, LLPolyMorphTarget* mor } } -// invalidates morph masks for a given layer. Don't pass a parameter to invalidate all morph masks. -void LLVOAvatar::invalidateMorphMasks(LLVOAvatarDefines::EBakedTextureIndex index) -{ - setMorphMasksValid(FALSE, index); -} - -// updates morph masks to be a value for a given layer. Don't pass an argument to set value for all morph masks -void LLVOAvatar::setMorphMasksValid(BOOL new_status, LLVOAvatarDefines::EBakedTextureIndex index) -{ - if (index == BAKED_NUM_INDICES) - { - for (U8 tex = 0; tex < (U8)BAKED_NUM_INDICES; tex++) - { - mBakedTextureDatas[tex].mMorphMasksValid = new_status; - } - } - else if (index < BAKED_NUM_INDICES) - { - mBakedTextureDatas[index].mMorphMasksValid = new_status; - } -} - // returns TRUE if morph masks are present and not valid for a given baked texture, FALSE otherwise BOOL LLVOAvatar::morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex index) { @@ -6121,9 +6098,20 @@ BOOL LLVOAvatar::morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex inde return FALSE; } - if (!mBakedTextureDatas[index].mMaskedMorphs.empty() && !mBakedTextureDatas[index].mMorphMasksValid) + if (!mBakedTextureDatas[index].mMaskedMorphs.empty()) { - return TRUE; + if (isSelf()) + { + LLTexLayerSet *layer_set = mBakedTextureDatas[index].mTexLayerSet; + if (layer_set) + { + return !layer_set->isMorphValid(); + } + } + else + { + return FALSE; + } } return FALSE; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index f7c794defeb..cf86612ce6a 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -355,10 +355,8 @@ class LLVOAvatar : // Morph masks //-------------------------------------------------------------------- public: - void invalidateMorphMasks(LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES); BOOL morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES); void addMaskedMorph(LLVOAvatarDefines::EBakedTextureIndex index, LLPolyMorphTarget* morph_target, BOOL invert, std::string layer); - void setMorphMasksValid(BOOL new_status, LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES); void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLVOAvatarDefines::EBakedTextureIndex index = LLVOAvatarDefines::BAKED_NUM_INDICES); //-------------------------------------------------------------------- @@ -489,7 +487,6 @@ class LLVOAvatar : // Stores pointers to the joint meshes that this baked texture deals with std::vector< LLViewerJointMesh * > mMeshes; // std::vector<LLViewerJointMesh> mJoints[i]->mMeshParts morph_list_t mMaskedMorphs; - BOOL mMorphMasksValid; }; typedef std::vector<BakedTextureData> bakedtexturedata_vec_t; bakedtexturedata_vec_t mBakedTextureDatas; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 85a68fdd3f5..6c3348b247f 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1387,8 +1387,8 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_u } // llinfos << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegion() << llendl; - invalidateMorphMasks(layerset->getBakedTexIndex()); layerset->requestUpdate(); + layerset->invalidateMorphMasks(); if( set_by_user ) { -- GitLab From b99ebeed9c6afe8baab18dd0d43103c6991ed1c0 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Fri, 6 Nov 2009 18:44:48 +0000 Subject: [PATCH 229/306] Backed out changeset ad70c07b05b6 (ad70c07b05b6 was 'Reduced "Medium" font size, which is a temporary fix until menu font can be defined specifically. http://jira.secondlife.com/browse/EXT-1315') This change was too all-around impactful just for the sake of the menu font - it made medium and small font sizes indistinguishable, leading to lots of invisible mismatches as long as this hack persisted... --- indra/newview/skins/default/xui/en/fonts.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index b261281c640..dec9839d1a6 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -150,11 +150,9 @@ comment="Size of large font (points, or 1/72 of an inch)" size="10.0" /> - <!-- Changed Medium size to address menu font size not matching spec. - May want to revert/update after menu font configuration has been enabled. --> <font_size name="Medium" comment="Size of medium font (points, or 1/72 of an inch)" - size="8.0" + size="9.0" /> <font_size name="Small" comment="Size of small font (points, or 1/72 of an inch)" -- GitLab From a9653b37ec29a1bd4c23efdd1d83df15c8bcccdd Mon Sep 17 00:00:00 2001 From: Sergey Borushevsky <sborushevsky@productengine.com> Date: Fri, 6 Nov 2009 20:46:50 +0200 Subject: [PATCH 230/306] No ticket, added comments to split-by-date code. --HG-- branch : product-engine --- indra/newview/llpanelteleporthistory.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index a34f029095b..58ecfb60c21 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -406,6 +406,7 @@ void LLTeleportHistoryPanel::getNextTab(const LLDate& item_date, S32& tab_idx, L if (tab_idx <= tabs_cnt - 4) { + // All tabs, except last three, are tabs for one day, so just push tab_date back by one day tab_date.secondsSinceEpoch(tab_date.secondsSinceEpoch() - seconds_in_day); } else if (tab_idx == tabs_cnt - 3) // 6 day and older, low boundary is 1 month @@ -442,6 +443,7 @@ void LLTeleportHistoryPanel::getNextTab(const LLDate& item_date, S32& tab_idx, L } } +// Called to add items, no more, than ADD_LIMIT at time void LLTeleportHistoryPanel::refresh() { if (!mHistoryAccordion) @@ -452,12 +454,16 @@ void LLTeleportHistoryPanel::refresh() const LLTeleportHistoryStorage::slurl_list_t& items = mTeleportHistory->getItems(); + // Setting tab_boundary_date to "now", so date from any item would be earlier, than boundary. + // That leads to call to getNextTab to get right tab_idx in first pass LLDate tab_boundary_date = LLDate::now(); + LLFlatListView* curr_flat_view = NULL; U32 added_items = 0; while (mCurrentItem >= 0) { + // Filtering std::string landmark_title = items[mCurrentItem].mTitle; LLStringUtil::toUpper(landmark_title); @@ -470,10 +476,14 @@ void LLTeleportHistoryPanel::refresh() continue; } + // Checking whether date of item is earlier, than tab_boundary_date. + // In that case, item should be added to another tab const LLDate &date = items[mCurrentItem].mDate; if (date < tab_boundary_date) { + // Getting apropriate tab_idx for this and subsequent items, + // tab_boundary_date would be earliest possible date for this tab S32 tab_idx = 0; getNextTab(date, tab_idx, tab_boundary_date); @@ -580,6 +590,9 @@ void LLTeleportHistoryPanel::replaceItem(S32 removed_index) void LLTeleportHistoryPanel::showTeleportHistory() { mDirty = true; + + // Starting to add items from last one, in reverse order, + // since TeleportHistory keeps most recent item at the end mCurrentItem = mTeleportHistory->getItems().size() - 1; for (S32 n = mItemContainers.size() - 1; n >= 0; --n) -- GitLab From f716bb1e3afd4c950c379dfa702246979de467e6 Mon Sep 17 00:00:00 2001 From: Vadim Savchuk <vsavchuk@productengine.com> Date: Fri, 6 Nov 2009 21:04:04 +0200 Subject: [PATCH 231/306] Backed out changeset c3b8509f465a (EXT-989) as causing numerous conflicts. Will reapply the changes later. --HG-- branch : product-engine --- indra/newview/llchiclet.cpp | 194 +++++++++++++------------------ indra/newview/llchiclet.h | 76 +++++------- indra/newview/llvoicechannel.cpp | 3 - indra/newview/llvoicechannel.h | 7 -- 4 files changed, 112 insertions(+), 168 deletions(-) diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 041baf06e7c..6fd7e6b07db 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -200,9 +200,7 @@ void LLChiclet::setValue(const LLSD& value) LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p) : LLChiclet(p) -, mShowSpeaker(false) , mNewMessagesIcon(NULL) -, mSpeakerCtrl(NULL) , mCounterCtrl(NULL) { // initialize an overlay icon for new messages @@ -221,40 +219,6 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p) setShowCounter(false); } -void LLIMChiclet::setShowSpeaker(bool show) -{ - bool needs_resize = getShowSpeaker() != show; - if(needs_resize) - { - mShowSpeaker = show; - toggleSpeakerControl(); - onChicletSizeChanged(); - } -} -void LLIMChiclet::initSpeakerControl() -{ - mSpeakerCtrl->setSpeakerId(getOtherParticipantId()); -} - -void LLIMChiclet::toggleSpeakerControl() -{ - LLRect speaker_rect = mSpeakerCtrl->getRect(); - S32 required_width = getRect().getWidth(); - - if(getShowSpeaker()) - { - required_width = required_width + speaker_rect.getWidth(); - initSpeakerControl(); - } - else - { - required_width = required_width - speaker_rect.getWidth(); - } - - reshape(required_width, getRect().getHeight()); - mSpeakerCtrl->setVisible(getShowSpeaker()); -} - void LLIMChiclet::setShowNewMessagesIcon(bool show) { if(mNewMessagesIcon) @@ -346,7 +310,7 @@ LLIMP2PChiclet::Params::Params() // Changed icon height from 25 to 24 to fix ticket EXT-794. // In some cases(after changing UI scale) 25 pixel height icon was // drawn incorrectly, i'm not sure why. - avatar_icon.rect(LLRect(0, 24, 24, 0)); + avatar_icon.rect(LLRect(0, 24, 25, 0)); avatar_icon.mouse_opaque(false); unread_notifications.name("unread"); @@ -359,9 +323,7 @@ LLIMP2PChiclet::Params::Params() unread_notifications.visible(false); speaker.name("speaker"); - speaker.rect(LLRect(25, 25, 45, 0)); - speaker.auto_update(true); - speaker.draw_border(false); + speaker.rect(LLRect(45, 25, 65, 0)); show_speaker = false; } @@ -369,6 +331,7 @@ LLIMP2PChiclet::Params::Params() LLIMP2PChiclet::LLIMP2PChiclet(const Params& p) : LLIMChiclet(p) , mChicletIconCtrl(NULL) +, mSpeakerCtrl(NULL) , mPopupMenu(NULL) { LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon; @@ -396,9 +359,18 @@ void LLIMP2PChiclet::setCounter(S32 counter) setShowNewMessagesIcon(counter); } -void LLIMP2PChiclet::initSpeakerControl() +LLRect LLIMP2PChiclet::getRequiredRect() { - mSpeakerCtrl->setSpeakerId(getOtherParticipantId()); + LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0); + if(getShowCounter()) + { + rect.mRight += mCounterCtrl->getRequiredRect().getWidth(); + } + if(getShowSpeaker()) + { + rect.mRight += mSpeakerCtrl->getRect().getWidth(); + } + return rect; } void LLIMP2PChiclet::setOtherParticipantId(const LLUUID& other_participant_id) @@ -475,6 +447,18 @@ void LLIMP2PChiclet::onMenuItemClicked(const LLSD& user_data) } } +void LLIMP2PChiclet::setShowSpeaker(bool show) +{ + LLIMChiclet::setShowSpeaker(show); + + bool needs_resize = getShowSpeaker() != show; + mSpeakerCtrl->setVisible(getShowSpeaker()); + if(needs_resize) + { + onChicletSizeChanged(); + } +} + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -510,9 +494,7 @@ LLAdHocChiclet::Params::Params() speaker.name("speaker"); - speaker.rect(LLRect(25, 25, 45, 0)); - speaker.auto_update(true); - speaker.draw_border(false); + speaker.rect(LLRect(45, 25, 65, 0)); show_speaker = false; } @@ -520,6 +502,7 @@ LLAdHocChiclet::Params::Params() LLAdHocChiclet::LLAdHocChiclet(const Params& p) : LLIMChiclet(p) , mChicletIconCtrl(NULL) +, mSpeakerCtrl(NULL) , mPopupMenu(NULL) { LLChicletAvatarIconCtrl::Params avatar_params = p.avatar_icon; @@ -550,35 +533,24 @@ void LLAdHocChiclet::setSessionId(const LLUUID& session_id) mChicletIconCtrl->setValue(im_session->mOtherParticipantID); } -void LLAdHocChiclet::draw() +void LLAdHocChiclet::setCounter(S32 counter) { - initSpeakerControl(); - LLIMChiclet::draw(); + mCounterCtrl->setCounter(counter); + setShowNewMessagesIcon(counter); } -void LLAdHocChiclet::initSpeakerControl() +LLRect LLAdHocChiclet::getRequiredRect() { - LLUUID speaker_id; - LLSpeakerMgr::speaker_list_t speaker_list; - - LLIMModel::getInstance()->findIMSession(getSessionId())->mSpeakers->getSpeakerList(&speaker_list, FALSE); - for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i) + LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0); + if(getShowCounter()) { - LLPointer<LLSpeaker> s = *i; - if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING) - { - speaker_id = s->mID; - break; - } + rect.mRight += mCounterCtrl->getRequiredRect().getWidth(); } - - mSpeakerCtrl->setSpeakerId(speaker_id); -} - -void LLAdHocChiclet::setCounter(S32 counter) -{ - mCounterCtrl->setCounter(counter); - setShowNewMessagesIcon(counter); + if(getShowSpeaker()) + { + rect.mRight += mSpeakerCtrl->getRect().getWidth(); + } + return rect; } BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) @@ -612,9 +584,7 @@ LLIMGroupChiclet::Params::Params() unread_notifications.visible(false); speaker.name("speaker"); - speaker.rect(LLRect(25, 25, 45, 0)); - speaker.auto_update(true); - speaker.draw_border(false); + speaker.rect(LLRect(45, 25, 65, 0)); show_speaker = false; } @@ -623,6 +593,7 @@ LLIMGroupChiclet::LLIMGroupChiclet(const Params& p) : LLIMChiclet(p) , LLGroupMgrObserver(LLUUID::null) , mChicletIconCtrl(NULL) +, mSpeakerCtrl(NULL) , mPopupMenu(NULL) { LLChicletGroupIconCtrl::Params avatar_params = p.group_icon; @@ -655,32 +626,18 @@ void LLIMGroupChiclet::setCounter(S32 counter) setShowNewMessagesIcon(counter); } -void LLIMGroupChiclet::draw() +LLRect LLIMGroupChiclet::getRequiredRect() { - initSpeakerControl(); - LLIMChiclet::draw(); -} - -void LLIMGroupChiclet::initSpeakerControl() -{ - LLUUID speaker_id; - LLSpeakerMgr* speaker_mgr = NULL; - LLSpeakerMgr::speaker_list_t speaker_list; - - speaker_mgr = LLIMModel::getInstance()->findIMSession(getSessionId())->mSpeakers; - speaker_mgr->update(TRUE); - speaker_mgr->getSpeakerList(&speaker_list, FALSE); - for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i) + LLRect rect(0, 0, mChicletIconCtrl->getRect().getWidth(), 0); + if(getShowCounter()) { - LLPointer<LLSpeaker> s = *i; - if (s->mSpeechVolume > 0 || s->mStatus == LLSpeaker::STATUS_SPEAKING) - { - speaker_id = s->mID; - break; - } + rect.mRight += mCounterCtrl->getRequiredRect().getWidth(); } - - mSpeakerCtrl->setSpeakerId(speaker_id); + if(getShowSpeaker()) + { + rect.mRight += mSpeakerCtrl->getRect().getWidth(); + } + return rect; } void LLIMGroupChiclet::setSessionId(const LLUUID& session_id) @@ -767,6 +724,17 @@ void LLIMGroupChiclet::onMenuItemClicked(const LLSD& user_data) } } +void LLIMGroupChiclet::setShowSpeaker(bool show) +{ + LLIMChiclet::setShowSpeaker(show); + + bool needs_resize = getShowSpeaker() != show; + mSpeakerCtrl->setVisible(getShowSpeaker()); + if(needs_resize) + { + onChicletSizeChanged(); + } +} ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -882,28 +850,10 @@ BOOL LLChicletPanel::postBuild() LLIMModel::instance().addNewMsgCallback(boost::bind(im_chiclet_callback, this, _1)); LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(im_chiclet_callback, this, _1)); LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLChicletPanel::findChiclet<LLChiclet>, this, _1)); - LLVoiceChannel::setOnCurrentVoiceChannelChanged(boost::bind(&LLChicletPanel::onCurrentVoiceChannelChanged, this, _1)); return TRUE; } -void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id) -{ - for(chiclet_list_t::iterator it = mChicletList.begin(); it != mChicletList.end(); ++it) - { - LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it); - if(chiclet) - { - if(chiclet->getSessionId() == session_id) - { - chiclet->setShowSpeaker(true); - continue; - } - chiclet->setShowSpeaker(false); - } - } -} - S32 LLChicletPanel::calcChickletPanleWidth() { S32 res = 0; @@ -947,7 +897,23 @@ bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index) void LLChicletPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param) { - arrange(); + S32 chiclet_width = ctrl->getRect().getWidth(); + S32 chiclet_new_width = ctrl->getRequiredRect().getWidth(); + + if(chiclet_new_width == chiclet_width) + { + return; + } + + LLRect chiclet_rect = ctrl->getRect(); + chiclet_rect.mRight = chiclet_rect.mLeft + chiclet_new_width; + + ctrl->setRect(chiclet_rect); + + S32 offset = chiclet_new_width - chiclet_width; + S32 index = getChicletIndex(ctrl); + + shiftChiclets(offset, index + 1); trimChiclets(); showScrollButtonsIfNeeded(); } @@ -1486,6 +1452,6 @@ void LLChicletGroupIconCtrl::setValue(const LLSD& value ) ////////////////////////////////////////////////////////////////////////// LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p) - : LLOutputMonitorCtrl(p) + : LLIconCtrl(p) { } diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index 21909d2577f..a830240b7d4 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -149,11 +149,11 @@ class LLChicletGroupIconCtrl : public LLIconCtrl /* * Class for displaying status of Voice Chat */ -class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl +class LLChicletSpeakerCtrl : public LLIconCtrl { public: - struct Params : public LLInitParam::Block<Params, LLOutputMonitorCtrl::Params> + struct Params : public LLInitParam::Block<Params, LLIconCtrl::Params> { Params(){}; }; @@ -266,6 +266,8 @@ class LLChiclet : public LLUICtrl * Base class for Instant Message chiclets. * IMChiclet displays icon, number of unread messages(optional) * and voice chat status(optional). +* Every chiclet should override LLUICtrl::getRequiredRect and return +* desired width. */ class LLIMChiclet : public LLChiclet { @@ -304,25 +306,15 @@ class LLIMChiclet : public LLChiclet virtual LLUUID getOtherParticipantId() { return mOtherParticipantId; } /* - * Init Speaker Control with speaker's ID + * Shows/hides voice chat status control. */ - virtual void initSpeakerControl(); - - /* - * set status (Shows/Hide) for voice control. - */ - virtual void setShowSpeaker(bool show); + virtual void setShowSpeaker(bool show) { mShowSpeaker = show; } /* * Returns voice chat status control visibility. */ virtual bool getShowSpeaker() {return mShowSpeaker;}; - /* - * Shows/Hides for voice control for a chiclet. - */ - virtual void toggleSpeakerControl(); - /* * Shows/hides overlay icon concerning new unread messages. */ @@ -333,7 +325,10 @@ class LLIMChiclet : public LLChiclet */ virtual bool getShowNewMessagesIcon(); - virtual void draw(); + /* + * Draws border around chiclet. + */ + /*virtual*/ void draw(); /** * Determine whether given ID refers to a group or an IM chat session. @@ -368,8 +363,6 @@ class LLIMChiclet : public LLChiclet LLIconCtrl* mNewMessagesIcon; LLChicletNotificationCounterCtrl* mCounterCtrl; - LLChicletSpeakerCtrl* mSpeakerCtrl; - /** the id of another participant, either an avatar id or a group id*/ LLUUID mOtherParticipantId; @@ -417,6 +410,8 @@ class LLIMP2PChiclet : public LLIMChiclet /* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id); + /*virtual*/ void setShowSpeaker(bool show); + /* * Sets number of unread messages. Will update chiclet's width if number text * exceeds size of counter and notify it's parent about size change. @@ -424,14 +419,15 @@ class LLIMP2PChiclet : public LLIMChiclet /*virtual*/ void setCounter(S32); /* - * Init Speaker Control with speaker's ID + * Returns number of unread messages. */ - /*virtual*/ void initSpeakerControl(); + /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } /* - * Returns number of unread messages. + * Returns rect, required to display chiclet. + * Width is the only valid value. */ - /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } + /*virtual*/ LLRect getRequiredRect(); protected: LLIMP2PChiclet(const Params& p); @@ -461,6 +457,7 @@ class LLIMP2PChiclet : public LLIMChiclet private: LLChicletAvatarIconCtrl* mChicletIconCtrl; + LLChicletSpeakerCtrl* mSpeakerCtrl; LLMenuGL* mPopupMenu; }; @@ -498,19 +495,15 @@ class LLAdHocChiclet : public LLIMChiclet /*virtual*/ void setCounter(S32); /* - * Keep Speaker Control with actual speaker's ID - */ - /*virtual*/ void draw(); - - /* - * Init Speaker Control with speaker's ID + * Returns number of unread messages. */ - /*virtual*/ void initSpeakerControl(); + /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } /* - * Returns number of unread messages. + * Returns rect, required to display chiclet. + * Width is the only valid value. */ - /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } + /*virtual*/ LLRect getRequiredRect(); protected: LLAdHocChiclet(const Params& p); @@ -524,6 +517,7 @@ class LLAdHocChiclet : public LLIMChiclet private: LLChicletAvatarIconCtrl* mChicletIconCtrl; + LLChicletSpeakerCtrl* mSpeakerCtrl; LLMenuGL* mPopupMenu; }; @@ -553,17 +547,14 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver */ /*virtual*/ void setSessionId(const LLUUID& session_id); - /* - * Keep Speaker Control with actual speaker's ID - */ - /*virtual*/ void draw(); - /** * Callback for LLGroupMgrObserver, we get this when group data is available or changed. * Sets group icon. */ /*virtual*/ void changed(LLGroupChange gc); + /*virtual*/ void setShowSpeaker(bool show); + /* * Sets number of unread messages. Will update chiclet's width if number text * exceeds size of counter and notify it's parent about size change. @@ -571,14 +562,15 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver /*virtual*/ void setCounter(S32); /* - * Init Speaker Control with speaker's ID + * Returns number of unread messages. */ - /*virtual*/ void initSpeakerControl(); + /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } /* - * Returns number of unread messages. + * Returns rect, required to display chiclet. + * Width is the only valid value. */ - /*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); } + /*virtual*/ LLRect getRequiredRect(); ~LLIMGroupChiclet(); @@ -605,6 +597,7 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver private: LLChicletGroupIconCtrl* mChicletIconCtrl; + LLChicletSpeakerCtrl* mSpeakerCtrl; LLMenuGL* mPopupMenu; }; @@ -742,11 +735,6 @@ class LLChicletPanel : public LLPanel /*virtual*/ BOOL postBuild(); - /* - * Handler for the Voice Client's signal. Finds a corresponding chiclet and toggles its SpeakerControl - */ - void onCurrentVoiceChannelChanged(const LLUUID& session_id); - /* * Reshapes controls and rearranges chiclets if needed. */ diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 5ab3a2aaf30..cefc88ebee8 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -46,7 +46,6 @@ LLVoiceChannel::voice_channel_map_t LLVoiceChannel::sVoiceChannelMap; LLVoiceChannel::voice_channel_map_uri_t LLVoiceChannel::sVoiceChannelURIMap; LLVoiceChannel* LLVoiceChannel::sCurrentVoiceChannel = NULL; LLVoiceChannel* LLVoiceChannel::sSuspendedVoiceChannel = NULL; -LLVoiceChannel::channel_changed_signal_t LLVoiceChannel::sCurrentVoiceChannelChanged; BOOL LLVoiceChannel::sSuspended = FALSE; @@ -321,8 +320,6 @@ void LLVoiceChannel::activate() { setState(STATE_CALL_STARTED); } - - sCurrentVoiceChannelChanged(this->mSessionID); } void LLVoiceChannel::getChannelInfo() diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index dfa886c99ce..8f1e9ff02d3 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -54,13 +54,6 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver typedef boost::function<void(const EState& old_state, const EState& new_state)> state_changed_callback_t; - // on current channel changed signal - typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t; - typedef boost::signals2::signal<void(const LLUUID& session_id)> channel_changed_signal_t; - static channel_changed_signal_t sCurrentVoiceChannelChanged; - static boost::signals2::connection setOnCurrentVoiceChannelChanged(channel_changed_callback_t cb) { return sCurrentVoiceChannelChanged.connect(cb); } - - LLVoiceChannel(const LLUUID& session_id, const std::string& session_name); virtual ~LLVoiceChannel(); -- GitLab From 30467bda7cd8bc79e9f5fa400cb009ce3dd21a05 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Fri, 6 Nov 2009 11:06:20 -0800 Subject: [PATCH 232/306] Show glow around interactive objects on hover. Glow shows through objects/avatars - this is expected. Effect from DaveP long ago, hover code by me long ago, just changing the default setting. --- indra/newview/app_settings/settings.xml | 2 +- indra/newview/lltoolpie.cpp | 2 ++ indra/newview/skins/default/xui/en/menu_viewer.xml | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index e8af26c7436..330bfa0c22c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -6247,7 +6247,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>RenderHighlightFadeTime</key> diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 24017202cc6..93da32b115f 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -494,6 +494,8 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) } else if (handleMediaHover(mHoverPick)) { + // *NOTE: If you think the hover glow conflicts with the media outline, you + // could disable it here. show_highlight = true; // cursor set by media object lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index ebdfb017879..294c86a1b90 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2506,8 +2506,8 @@ parameter="RenderAttachedParticles" /> </menu_item_check> <menu_item_check - label="Hover Highlight Objects" - name="Hover Highlight Objects"> + label="Hover Glow Objects" + name="Hover Glow Objects"> <menu_item_check.on_check function="CheckControl" parameter="RenderHighlightEnable" /> -- GitLab From d8864522a40b870a0d693dc7b5c76d140936ee25 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Fri, 6 Nov 2009 11:09:09 -0800 Subject: [PATCH 233/306] Changed default help URL for board demo per email discussion on viewer2009@lists. --- indra/newview/app_settings/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 330bfa0c22c..b17d6219105 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3574,7 +3574,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://www.google.com/search?q=site%3Awiki.secondlife.com+[TOPIC]&ignore_channel=[CHANNEL]&ignore_version=[VERSION]&ignore_os=[OS]&ignore_language=[LANGUAGE]&ignore_version_major=[VERSION_MAJOR]&ignore_version_minor=[VERSION_MINOR]&ignore_version_patch=[VERSION_PATCH]&ignore_version_build=[VERSION_BUILD]</string> + <string>http://docs.lindenlab.com/help/helpfloater.php?topic=[TOPIC]&channel=[CHANNEL]&version=[VERSION]&os=[OS]&language=[LANGUAGE]&version_major=[VERSION_MAJOR]&version_minor=[VERSION_MINOR]&version_patch=[VERSION_PATCH]&version_build=[VERSION_BUILD]</string> </map> <key>HighResSnapshot</key> <map> -- GitLab From cd9c07258dc0e1e0534f175a6c7248e64673f3e1 Mon Sep 17 00:00:00 2001 From: Denis Serdjuk <dserduk@productengine.com> Date: Fri, 6 Nov 2009 21:17:08 +0200 Subject: [PATCH 234/306] fixed bug EXT-2111 Unable to edit the Notes & Privacy content --HG-- branch : product-engine --- indra/newview/skins/default/xui/en/panel_notes.xml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml index 5333dfa2f5b..b9c9100ebcd 100644 --- a/indra/newview/skins/default/xui/en/panel_notes.xml +++ b/indra/newview/skins/default/xui/en/panel_notes.xml @@ -17,13 +17,16 @@ left="0" top="0" height="517" + width="313" border_size="0"> <panel name="notes_stack" follows="all" layout="topleft" top="0" - left="0"> + left="0" + height="475" + width="313"> <scroll_container color="DkGray2" follows="all" @@ -31,8 +34,11 @@ left="0" name="profile_scroll" opaque="true" + height="475" + width="313" top="0"> <panel + height="450" layout="topleft" name="profile_scroll_panel" top="0" @@ -104,7 +110,8 @@ layout="topleft" left="0" name="notes_buttons_panel" - auto_resize="false"> + auto_resize="false" + width="313"> <button follows="bottom|left" height="19" -- GitLab From 9c55ff93903d19b22dec63a6db26e9ec3436fbf5 Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk <slitovchuk@productengine.com> Date: Fri, 6 Nov 2009 22:13:59 +0200 Subject: [PATCH 235/306] Fixed normal bug EXT-1509 "Going into mouselook while in a private call ruins the call floater.": - Made callfloater a single instance floater. - Updated floater IM panel visibility change logic. - Added NULL checks for voice client pointers in LLFloaterIMPanel. --HG-- branch : product-engine --- indra/newview/llimpanel.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 7399f1e1b3a..0b8b5935f87 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -321,6 +321,9 @@ void LLFloaterIMPanel::draw() // hide/show start call and end call buttons LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionUUID); + if (!voice_channel) + return; + childSetVisible("end_call_btn", LLVoiceClient::voiceEnabled() && voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED); childSetVisible("start_call_btn", LLVoiceClient::voiceEnabled() && voice_channel->getState() < LLVoiceChannel::STATE_CALL_STARTED); childSetEnabled("start_call_btn", enable_connect); @@ -770,10 +773,13 @@ void LLFloaterIMPanel::onVisibilityChange(const LLSD& new_visibility) } LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionUUID); - if (new_visibility.asBoolean() && voice_channel->getState() == LLVoiceChannel::STATE_CONNECTED) - LLFloaterReg::showInstance("voice_call", mSessionUUID); - else - LLFloaterReg::hideInstance("voice_call", mSessionUUID); + if (voice_channel && voice_channel->getState() == LLVoiceChannel::STATE_CONNECTED) + { + if (new_visibility.asBoolean()) + LLFloaterReg::showInstance("voice_call", mSessionUUID); + else + LLFloaterReg::hideInstance("voice_call", mSessionUUID); + } } void LLFloaterIMPanel::sendMsg() -- GitLab From 5b5df4769773025978409590e14a807ea2790c84 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Fri, 6 Nov 2009 12:15:36 -0800 Subject: [PATCH 236/306] Make test text floaters so Erica can make a call on final font sizes. --- .../default/xui/en/floater_test_textbox.xml | 77 ++++++++++++------- .../default/xui/en/floater_test_widgets.xml | 44 ++++++++++- .../skins/default/xui/en/menu_login.xml | 17 ---- 3 files changed, 90 insertions(+), 48 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml index 9e2e9e74e3f..8dba05f1eeb 100644 --- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml +++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml @@ -2,11 +2,11 @@ <floater legacy_header_height="18" can_resize="true" - height="400" + height="450" layout="topleft" name="floater_test_textbox" help_topic="floater_test_textbox" - width="400"> + width="600"> <text type="string" length="1" @@ -48,61 +48,80 @@ First line of multiple lines Second line of multiple lines </text> + <text + top_pad="10" + left="10" + right="-10" + follows="top|left" + font.name="SansSerifSmall" + name="test_text10" + tool_tip="text"> + SansSerifSmall. РуÑÑкий ä¸æ–‡ (简体) The quick brown fox jumped over the lazy dog. + </text> + <text + top_pad="10" + left="10" + right="-10" + follows="top|left" + font.name="SansSerif" + name="test_text11" + tool_tip="text"> + SansSerif. РуÑÑкий ä¸æ–‡ (简体) The quick brown fox jumped over the lazy dog. + </text> + <text + top_pad="10" + left="10" + right="-10" + follows="top|left" + font.name="SansSerifLarge" + name="test_text12" + tool_tip="text"> + SansSerifLarge. РуÑÑкий ä¸æ–‡ (简体) The quick brown fox jumped over the lazy dog. + </text> + <text + top_pad="10" + left="10" + right="-10" + follows="top|left" + font.name="SansSerifHuge" + name="test_text13" + tool_tip="text"> + SansSerifHuge. РуÑÑкий ä¸æ–‡ (简体) The quick brown fox jumped over the lazy dog. + </text> <text type="string" length="1" font="SansSerif" - height="10" - layout="topleft" - left_delta="0" - top_pad="30" - width="300"> - font SansSerif - </text> - <text - type="string" - length="1" - follows="bottom|right" - height="10" - layout="topleft" - left_delta="0" - top_pad="10" - width="300"> - follows bottom right - </text> - <text - type="string" - length="1" - font="SansSerifSmall" font.style="BOLD" height="10" layout="topleft" left_delta="0" - top_pad="10" + top_pad="40" width="300"> - font style BOLD + SansSerif BOLD </text> <text type="string" length="1" - font="SansSerifSmall" + font="SansSerif" font.style="BOLD|UNDERLINE" height="10" layout="topleft" left_delta="0" top_pad="10" width="300"> - font style BOLD UNDERLINE + SansSerif BOLD UNDERLINE </text> <text type="string" length="1" + font="SansSerif" height="10" layout="topleft" left_delta="0" top_pad="10" width="300"> - font style UNDERLINE + SansSerif UNDERLINE </text> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_test_widgets.xml b/indra/newview/skins/default/xui/en/floater_test_widgets.xml index 718d724aa6a..44dcb075264 100644 --- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml +++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml @@ -338,13 +338,13 @@ line to actually fit height="400" halign="center" layout="topleft" - left="575" + left="525" name="group_tab_container" tab_position="top" tab_height="20" tool_tip="tab container" top="80" - width="250"> + width="300"> <!-- "panel" is a container for widgets. It is automatically resized to fit the parent tab_container. --> <panel @@ -380,6 +380,46 @@ line to actually fit tool_tip="Color Swatch: Click to open Color Picker" top_delta="0" width="80" /> + <text + top_pad="10" + left="10" + width="250" + follows="top|left" + font.name="SansSerifSmall" + name="test_text10" + tool_tip="text"> + SansSerifSmall. РуÑÑкий ä¸æ–‡ (简体) + </text> + <text + top_pad="10" + left="10" + width="250" + follows="top|left" + font.name="SansSerif" + name="test_text11" + tool_tip="text"> + SansSerif. РуÑÑкий ä¸æ–‡ (简体) + </text> + <text + top_pad="10" + left="10" + width="250" + follows="top|left" + font.name="SansSerifLarge" + name="test_text12" + tool_tip="text"> + SansSerifLarge. РуÑÑкий ä¸æ–‡ (简体) + </text> + <text + top_pad="10" + left="10" + width="250" + follows="top|left" + font.name="SansSerifHuge" + name="test_text13" + tool_tip="text"> + SansSerifHuge. РуÑÑкий ä¸æ–‡ (简体) + </text> </panel> <!-- panels can also refer to other floaters or panels --> <panel diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index dfa5adb743a..5eb0560962d 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -179,23 +179,6 @@ parameter="ui_preview" /> </menu_item_call> <menu_item_separator /> - <menu_item_call - label="Widget Test" - name="Widget Test" - shortcut="control|shift|T"> - <menu_item_call.on_click - function="ShowFloater" - parameter="test_widgets" /> - </menu_item_call> - <menu_item_call - label="Inspectors Test" - name="inspectors_test" - shortcut="control|shift|I" - > - <menu_item_call.on_click - function="ShowFloater" - parameter="test_inspectors" /> - </menu_item_call> <menu_item_call label="Show Side Tray" name="Show Side Tray"> -- GitLab From 113c7edf60b65a68510f75fdda69ba5b22dc23f0 Mon Sep 17 00:00:00 2001 From: Rick Pasetto <rick@lindenlab.com> Date: Fri, 6 Nov 2009 12:21:21 -0800 Subject: [PATCH 237/306] FIX DEV-41587: Update current URL in draw() The current URL is now re-fetched from the current selection. Also did some minor refactoring --- indra/newview/llpanelmediasettingsgeneral.cpp | 101 +++++++++++------- indra/newview/llpanelmediasettingsgeneral.h | 5 +- .../default/xui/en/floater_media_settings.xml | 2 +- 3 files changed, 69 insertions(+), 39 deletions(-) diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index 85efe0f93e6..5186a5888b1 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -55,6 +55,8 @@ #include "llfloatertools.h" #include "lltrans.h" +const char *CHECKERBOARD_DATA_URL = "data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22100%%22 height=%22100%%22 %3E%3Cdefs%3E%3Cpattern id=%22checker%22 patternUnits=%22userSpaceOnUse%22 x=%220%22 y=%220%22 width=%22128%22 height=%22128%22 viewBox=%220 0 128 128%22 %3E%3Crect x=%220%22 y=%220%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3Crect x=%2264%22 y=%2264%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3C/pattern%3E%3C/defs%3E%3Crect x=%220%22 y=%220%22 width=%22100%%22 height=%22100%%22 fill=%22url(#checker)%22 /%3E%3C/svg%3E"; + //////////////////////////////////////////////////////////////////////////////// // LLPanelMediaSettingsGeneral::LLPanelMediaSettingsGeneral() : @@ -97,7 +99,6 @@ BOOL LLPanelMediaSettingsGeneral::postBuild() childSetCommitCallback( "current_url_reset_btn",onBtnResetCurrentUrl, this); // interrogates controls and updates widgets as required updateMediaPreview(); - updateCurrentURL(); return true; } @@ -160,9 +161,9 @@ void LLPanelMediaSettingsGeneral::draw() }; }; - // current URL can change over time. -// updateCurrentURL(); - + // current URL can change over time, update it here + updateCurrentUrl(); + LLPermissions perm; bool user_can_press_reset = mMediaEditable; @@ -215,26 +216,15 @@ void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable) self->updateMediaPreview(); } -//////////////////////////////////////////////////////////////////////////////// -// static -void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_settings ,bool editable) +// static +bool LLPanelMediaSettingsGeneral::isMultiple() { - LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata; - self->mMediaEditable = editable; - - //llinfos << "---------------" << llendl; - //llinfos << ll_pretty_print_sd(media_settings) << llendl; - //llinfos << "---------------" << llendl; - // IF all the faces have media (or all dont have media) if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo ) { if(LLFloaterMediaSettings::getInstance()->mMultipleMedia) { - self->clearValues(self, self->mMediaEditable); - // only show multiple - self->mHomeURL ->setText(LLTrans::getString("Multiple Media")); - return; + return true; } } @@ -242,13 +232,32 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_ { if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) { - self->clearValues(self, self->mMediaEditable); - // only show multiple - self->mHomeURL ->setText(LLTrans::getString("Multiple Media")); - return; - } - + return true; + } } + return false; +} + +//////////////////////////////////////////////////////////////////////////////// +// static +void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_settings ,bool editable) +{ + LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata; + self->mMediaEditable = editable; + + //llinfos << "---------------" << llendl; + //llinfos << ll_pretty_print_sd(media_settings) << llendl; + //llinfos << "---------------" << llendl; + + if ( LLPanelMediaSettingsGeneral::isMultiple() ) + { + self->clearValues(self, self->mMediaEditable); + // only show multiple + self->mHomeURL->setText(LLTrans::getString("Multiple Media")); + self->mCurrentURL->setText(LLTrans::getString("Multiple Media")); + return; + } + std::string base_key( "" ); std::string tentative_key( "" ); @@ -305,7 +314,6 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_ // interrogates controls and updates widgets as required self->updateMediaPreview(); - self->updateCurrentURL(); } //////////////////////////////////////////////////////////////////////////////// @@ -320,21 +328,10 @@ void LLPanelMediaSettingsGeneral::updateMediaPreview() // new home URL will be empty if media is deleted so display a // "preview goes here" data url page { - mPreviewMedia->navigateTo( "data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22100%%22 height=%22100%%22 %3E%3Cdefs%3E%3Cpattern id=%22checker%22 patternUnits=%22userSpaceOnUse%22 x=%220%22 y=%220%22 width=%22128%22 height=%22128%22 viewBox=%220 0 128 128%22 %3E%3Crect x=%220%22 y=%220%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3Crect x=%2264%22 y=%2264%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3C/pattern%3E%3C/defs%3E%3Crect x=%220%22 y=%220%22 width=%22100%%22 height=%22100%%22 fill=%22url(#checker)%22 /%3E%3C/svg%3E" ); + mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL ); }; } -//////////////////////////////////////////////////////////////////////////////// -// Helper to set current URL -void LLPanelMediaSettingsGeneral::updateCurrentURL() -{ - if( mCurrentURL->getText().empty() ) - { - childSetText( "current_url", mHomeURL->getText() ); - } - -} - //////////////////////////////////////////////////////////////////////////////// // virtual @@ -441,6 +438,8 @@ bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace() LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection(); selected_objects->getSelectedTEValue( &functor_navigate_media, all_face_media_navigated ); + // Note: we don't update the 'current URL' field until the media data itself changes + return all_face_media_navigated; } @@ -451,3 +450,31 @@ const std::string LLPanelMediaSettingsGeneral::getHomeUrl() return mHomeURL->getValue().asString(); } +//////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsGeneral::updateCurrentUrl() +{ + // Get the current URL from the selection + + const LLMediaEntry default_media_data; + std::string value_str = default_media_data.getCurrentURL(); + struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string > + { + functor_getter_current_url(const LLMediaEntry& entry): mMediaEntry(entry) {} + + std::string get( LLViewerObject* object, S32 face ) + { + if ( object ) + if ( object->getTE(face) ) + if ( object->getTE(face)->getMediaData() ) + return object->getTE(face)->getMediaData()->getCurrentURL(); + return mMediaEntry.getCurrentURL(); + }; + + const LLMediaEntry & mMediaEntry; + + } func_current_url(default_media_data); + bool identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_current_url, value_str ); + mCurrentURL->setText(value_str); + mCurrentURL->setTentative(identical); +} diff --git a/indra/newview/llpanelmediasettingsgeneral.h b/indra/newview/llpanelmediasettingsgeneral.h index e82a31382ef..b48e081a1b5 100644 --- a/indra/newview/llpanelmediasettingsgeneral.h +++ b/indra/newview/llpanelmediasettingsgeneral.h @@ -63,7 +63,6 @@ class LLPanelMediaSettingsGeneral : public LLPanel bool navigateHomeSelectedFace(); void updateMediaPreview(); - void updateCurrentURL(); const std::string getHomeUrl(); @@ -72,8 +71,12 @@ class LLPanelMediaSettingsGeneral : public LLPanel bool mMediaEditable; private: + void updateCurrentUrl(); + static void onBtnResetCurrentUrl(LLUICtrl* ctrl, void *userdata); static void onCommitHomeURL(LLUICtrl* ctrl, void *userdata ); + + static bool isMultiple(); LLComboBox* mControls; LLCheckBoxCtrl* mAutoLoop; diff --git a/indra/newview/skins/default/xui/en/floater_media_settings.xml b/indra/newview/skins/default/xui/en/floater_media_settings.xml index 6b884d46a77..68dd2001afb 100644 --- a/indra/newview/skins/default/xui/en/floater_media_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_media_settings.xml @@ -15,7 +15,7 @@ min_height="430" min_width="620" mouse_opaque="true" - name="Medis Settings" + name="Media Settings" help_topic = "media_settings" title="MEDIA SETTINGS"> <button -- GitLab From c9b03c56afdaf9286745a8a50e0af0b9881ad2fb Mon Sep 17 00:00:00 2001 From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com> Date: Fri, 6 Nov 2009 15:44:43 -0500 Subject: [PATCH 238/306] Updated default_profile_picture to match style. Added Blank graphic to use as overlay icon (in order to produce tool-tip). Created panel_profile_user.xml which is a profile panel specifically for the current user, and modified panel_me_profile to call it accordingly. http://jira.secondlife.com/browse/EXT-2245 --- .../newview/skins/default/textures/Blank.png | Bin 0 -> 110 bytes .../textures/default_profile_picture.j2c | Bin 6128 -> 1512 bytes .../skins/default/textures/textures.xml | 2 ++ .../skins/default/xui/en/panel_profile.xml | 4 ++-- 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 indra/newview/skins/default/textures/Blank.png diff --git a/indra/newview/skins/default/textures/Blank.png b/indra/newview/skins/default/textures/Blank.png new file mode 100644 index 0000000000000000000000000000000000000000..f38e9f9100c290bd0e9a0419810c2d0149562c8e GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}bl$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G0-i38Ar-fhe*FJ$&+O2^$iVT3>EG=|zG6T*22WQ%mvv4F FO#p>79=iYl literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/default_profile_picture.j2c b/indra/newview/skins/default/textures/default_profile_picture.j2c index c53a22e8165c6e9fb1e6039644b113273a9b79b4..f21742cf09ba3fd83547aa2a2eec4136c725d62d 100644 GIT binary patch delta 1439 zcmV;Q1z`H{FX#&(|4;u>051Rl0000$0000$00000000000000$0000$ksulY0+BmL ze+6v-0soWFyc7qQz=&UffXCzw52P$Uz)%hkde%#33bFzOwGHB@dBuQ$!|5Lnq;wxJ z;1*y?uZYvEz>zAkgf<~|1DM?Ov_<wYQnelBPLu~2aJNj?t^=Y|4WyEcfPlx+rXMnR ze5U|lq;FOKF9Ln=#14Dv8RSS@OY(XCf7c@W+e|4l)#$c6bw_C=RiBB!v>xIB9Ww4h zZESNMWT>p`hwJipxV;q>`$jQ|{R}=UFEvu3b|Ev4RSG6p&_Ngm(6eIN!<UpwUrA%) z2|W95IJZ1+fPl}H#C&uJdX%i_gwj7;H|_%@$E<et^=aOE=<=&U=eL%sMZVq{e<Le} zmah%7R@oNXXqv0n;b-gI9j1~xF=iz%kJq4ZdO$>@`@}I^1*2;w>HH-Z!I)gD?taw9 z3z-2#9OetG_#C&e(!uO<2y!QLMW!Ypn61}lSt`L7PykLX)<JQcCY5}*H^Ct_`nu<T z#an=?2k|>KEF)%l7G^|%z+SQ^e}I6;!(|;n<BGxA5<XAq&ALTCnF0)8%;WGPjonng z0K;zM%xA6s4+Z}p>-J*Go%L<BKp@XLA@$*m3Zq&y!K*ce&a7!(kRgD8{J?<gvVeg6 z0Q|tdFhE+UFmW`1fc#;;Fy9zp$_A9YU~=mLB^ayaAi47gFWG>A{ARv0e}5t15g6MW zgt>79NFY;MW%yMc4?#>Cj$qg+RCUK$#Bl(xy~$Se_)@<^;|j)%@c&w!CL^DlN=C%5 zOvs1MG##1HdP5F?HXU`e2L5C&Kme}S%Fl{`fc%v|jVt6s=;_g+LgwPYe;@wSg5-hD zNy?RACZW1n4I^@hplXrie|q@G?XZ^{h}pgc0vMaL1ziVGpTgh@$YlEU-u65}4Gq-c zv*?&h8j>90SxUoKu`S{L`OVu#-XJu%M)1;xZqt+EnD?lcm$RxaUmM0@5$<G4$Of<3 zP>2|UEgfq|6(&TGa~8{J7lOS}K(~U=<}0rd5V_Jl?7<$FlB?3;e~*}-*E{-(@*2Y> z$3BRcmhcCbbXyJtEhZ;pMkCr+3J<TQyl=aX<-L{jEyV&)9LuejU|R*{?JT;lay)re z%4&ds{MGN%v*GnpAmj<HsDi)es+pLoL0(0TJuRI_F07|~7@_C%t}5rj&^N?eP<4a- z5p3Q%jlPPeG_cTge}H1eN-F^&ElKc;jWUns=T`FYgfKS*JpI|gRNvR-&0?&7Y$Z2= zWLjQT59;MVQ}K-#L#8<_An9~xWcGSK>`hLalit${YIj_Sk{%?34{tF)X6iJBtRl=r z`i|aead|}K;4D({=YA|H5S$EU1}<b-o@;r0&VXL6hi0qMe=yq+1iFQbpPDXJvj7fs zlygWB2iJ(ehszFb0W6TjM6PDTCH$*1gnkduy@4^7F==QL{*$GzN|%&tbXxuYehg_z zn%pB1THuL<K*X!oBzWm$7`C803YiHe@%*J7^g^!8o=!D9wa<`g+Fdwlf=})Dr_VX2 zAAnJ?pbHjyf47jln3;oRtY1~J>r6QDrdpA^33_4>RTW%X&&-$3IP!oSI?^j5aso?C zy|XxEM2lUQs?d_x;G1B;41#P28puFHoc{^ypS_fEMq&cmX;7Tr3<Set6qdwt<B^jV zQDsM-{wyD%D;&f^n9M(bX=B=>go800uLI{xd8a#iarQCtRs}klsw1#I!+wB8(^{ZC z_sQ|(^a}%eow1J8=n#zVkyuOA>?|#JQ?@YAiCk-6JE(YhqXMMLZpZlSpjgyhR|lQg t9o8%W;#smWWN<NZQ%|-=@6aZt{vG@c5tXOayhF1tT!Y<f7LI^`|JgM8x1|68 delta 6092 zcmV;-7c=PS3-B)>|4;u>051Rl0001h0001h00000000000001h0001hksulY1CcvM ze;0KC0soWFq<|6UF)0e<u7y*@V`_(NZ?DJ9G!xD*5Gp;(TLfs_hhN9iGz*n!eVmE7 z^Xt$qyDZ1hGCqND_{D%5##GFTdkyjT0sERAlvyLG_r08?;c*$0N6oO>26>mm6v6Qb zfx|%IfEyXZGLH-+BmnCj9%8E+HYl*We}2K?pm30U0)Q2>p$C7E7eW)u8^^PSI>*X_ zK2vb`Q6rUgn~Y=P(TZRYW8g!hpwN8!jQ=<x9;wx6lV-d{5GD*rV{!M7bCNxCd|6WG z26TN3WCKpWrHO}ZBGPzNLzPTHV3f5hhIv^G%E8j0;XoqkbDNA@RL_IlB<`&2f7rp( zAmG3wn`JodO@GusjvoLen~lfB>OLe;>Oh3C#=i}pfZJxQ+o|hxq#HSqR!SJL5M3Dq z#XfPKjgh0PseO6gsR(R7e)ogwWeZ&R7AAR_yc%g8l%WUQ@q$mgopPJ@E?8iBb@+sv zOVr}!y43tHM;h8^k~uNwMUoaTfB41nun5rX=HEejLx6zJ)y|&4TR*MlaFY$}N*B?C zhjL@)2KI$qi0h*o@m>;FNzs#%PAciXYCV{oEpTkE8Jt+=a~F;~HRcy{ihzKCfPnmA zz_70Bg>l)x{9%9sdVcFUrSL$K&HN+$BYa`N_a&1F?z7MQ!GFtujk0?2f8{YMW&C0O zAm0#RbV&ZZi*~~^!?=bP5ICfy3&+v?f_^bS7;yX8s>!w=q{dg5mLgeyFtM1SudT_o zfNs0|EBs}?L!j_lA$8K71^^aCsBt#>KTc|c!@zGY(qZ@u9^sR)ZyB`=@$>>y_L&Jd z@0qV4_u%lsHDe+ESysRjf7Npv6bm?=OJ`LPPaZ_4^!#RiGO#{Epk(_xoC&sE3!~Q{ zrGvhn)sg=?N~uwl0hYVI@HCjYYIS%-yXa0D8^K8ChgGj5etJ|xl}tfnB)d5mt^t~n z+8{V3{6{`BkUk>dmo`JuTWOKJ^~o#(L+%)5@r?GCqX?h1cokw{f1<<*+c}*;n!ZGP z_hAC72%DR*VAtKY@toeNgeVbn1isyz9C-st&7r;NO2c*hMPcv){5nU+NBF2<^uG;8 z_*72Y%8@}Nz0X7^@}j1~EV)Ilun7LAn2lDF^yqC1+}WYZ@b)>-k9n8yg^Yz9kMS`? zHYgi9<!$yckiWXefA~*Fp_>gh@PB>!94*sIknpnk;9{s1`ckmZq>K@=Ph%wvV0)M* zA5Xe2z`M{dv__1ata>wGH#?TGEwM_<ilo3pb-^aX72Wa?Wv1V+B3@5##&7iU6p7ED zAh2~|J)RbpMPg?WiuR`~V{!d&Yk?J4T%mfO`13h^NlFEae^CBoV`>G@Qr=W?7?7mH z!SOPK;a&!Cgo88hzWHKCC3D-@el*%m)ydv@l(Iue_~twO%n^L`n`oMd!}!qI@zp~e zjRUZuh>AXi63ldAp0ObwnE4H^1$hW$7$}y5pE8q2k`^!c>oX_$Be7b+@jQXmpmh+0 zvgjQWqrLNWe<Z&ssE?&JwP2d+Mwr1rv1&VHaOQfuNZ%!K)Pt;2xu@A+vFx%F@l+vC zz=1j`4E7{3IeS7~cu;jtK!vdOcI>!OObflAPXsaS7Gc63^fWQ3z6fUX2AwVZb+^ZK zkCN=Y2<3(y5JKl%tu2-oh4ng)nRiiUP4~;#uN|3qe;J(X<%t9|f#lqk<n!1M@>XH= zwUgLJSQhH!q0iSKnnK{|w--0yh&9oiz>{o)zGb{(1JzXT6W!utq*WnymdaXiAjuZN zp}zkwxOx6EhSYwZ7O8=>lFP>=((~m!<1B{S%*k-q>#w2%ESTo|bEy{wL~F_^E8dBj za)?%Ge_DD?Z3od-0G>)~ay|R=NC5j4dBKV5oew9bF_O@|SiJ`EA2IKncj09w80$6s znCj|NN>?oCcGg2)!YiA4<7(gGQ^?2kWJtgJIvKbE@A&%eFjzVbKh{2bJ=q;3c^kLw zvWynzP1o|R5le_)|8;Hf%M0aLNaXP#l<Yt`e>8EN6z-GWYL@aJ!43aQnVijBoN6A< zjA>2ib+0Jo`NWAmu~Aoy)=Z{**k6JjWOTw(hn1<i$8_;=%Bi(S#r)wYaZd`G7m#(S z=+w|@W^F~+4mDsDa~Z4@46lojTD$F!L~?u$#SRj=A<7la4JjVUhCAp$1w?fvX-150 ze^cOsi4bSQl_AD}z)k2@AF@2c950iEq*7W;J9A>PYxPRLF~c~!_n|F!U&FNEz*fbJ z>lQ`<jJ^mz=uuD#-6fd(3Gf`pK}ig)&SG%&C{p$kDQ3>cwV3n3^7c5XFu;7`cXN5; zYl_-0YliIPNK?Bzt`4t7veZng4Ifjef6>mPyRJD&{qv5oVqe=BkP9aHqdq^(bPiB4 zE>FYbZb$%7rJqZ3Kaj+@%>i3*41@G<J(k3E1~dmorhggkh`SVl%c-Vt{nzJOLYd3i zSZ$ptfPnmAfZ;Pv3*H(0VSt$pNh`<h{K7!?=pdvFL+36J{9(Q@-xzS^#L-l(f3<;4 zAm7|UqRZ0RtL+^8BYc8BK>%l6r_^*7f4d7kviOEq`EK%s6Vetf{9(Q@{|q>Fbg%nW zK!MKXy&|ct$&ys;O5CRWX8sm_7C`?~jKma+%jZ{{?oZG>t>pi4+A5joB3^P+k(`EP zjSy0chs8Y~TVHKvS^icI6m;ise<MGlg_wnMoC;`fifYg<<7P$Wz1dGe=P^i3{6_vW zzY)M6<gh7NLUGrgA-~&cEBhW7L%{INmBi{~#V9}D?#jN+Rb^%BLD8h$ujj)1_mTP& zp<?$-+yWTVxuyFR(W|64Zp50#?NMBY=uO5a#dG%22~uqQX1+6@A@Chte~?IYd!DDj zv%Q~E6H*d6`b{J+re-_z5AEN2e$x6)H_gw$KH^eJ<_eCs{~nh;dyoVKKdFZiZwX_S z(xj=e5w+B^W$eCfRu?%fjdDd?&Z>MP{APcKx$-Z7W@An3xWJTA$kd#gfZ9Da^ilt7 z{&wGJ2fyZckFuL>2Xklwf6Lqth)=ONfid*E_Q-_cvkB}z|8}bgY}5MF<$(!!i>SW= z`^po>@ziR@gEa+xjN(d1k&_w5TWImwWnjF}*t%4h+i+jcCX?~HVBWllnJiy+ISzmb z$xW5#E-c6bN;blt7ir^mSYa!KAKXLR1DRzdN}r-syUD-?nTVSDe_QvSEXY4C!c`e< z4;n6w&inI0Tm3UlIXX`hq2Ww6CR8XF%l){bXZs)nj6ezAAX>I>CtTGy**uu1F;=hT zABQ$0LPLDF4y0S&Gz2h|wILT6IeHMCFdfxZ<C%N`aui_+v?%MW3>xiff#I8D`^$8T z**;NgS3fz|<h19^fBbbHlE?DUK;IwOUi!-OKqf*LoQ8?Abl=~OZAuJ@rmgGanrD+M z$n&fHH*AzVRwH&yb1(leLYIU0Oo+(GV%iMD#nS##zA@C07w+Nl;2rUVb63TifM!zK zK0~EV-mVugdsx4*Q<BgR+}5nyRfB9H%?&;|;<*j4XEb)2f4uG5+i2O2@WS{cLb^Ue zIz2#qZP~vE!^}ZZ2S&`?cmNjs<ON!LK<Ra{*Kqr@h3x{pbw1{CW+bPu^`Pne9I$<d zX&#X!ALR}YIdGYZ5Ah8WT}DEZ84ET90w>+M7^eET1JOd&sCa@EFs$NMMj`N{6V6&n zXE$zb6t;Ezf41M2_3~B#wSY<Mpe=6Uonv*=BP#khi94uSvreC;vYK~bfeA^|#Ux~9 zb=IMXZQbAL>c?p<5&44KJoyqVT*uBDs2}WmgDCyAs;?%m`Ap@v(Y9903sEGAXL3R5 zjoc~OVo7thwDl-nudAiZscXnB=M16aR;%WpDa-sgf2d_7GR|=ieCi4Fq+?OG%rp2l z7Wa*?TIX0K>r5w;b@dC>|3gEWJvHSVP>4FSaCiS?qBDY?qVpbrX@RQV^J{?Ls>Yh< zSzTSWx@4~FzaTy35@eOUX-<=%odJco+y}Y4#fC+8?sG8SWJBVK{jSt+4aPC+{<J!* zyQJV+e~WF8yCc9uU_^_9N-B=0%pka%aX7q~8uFxE=GwiGf+IKwgx`HAr8;{rOyP1N zy>|_(d0H|0YhvRcP^owIZ37}p%l2gG;rw)a<I>NH%d@n*SqL9e=ac5@TBReOpQ{y! z*Qfz~hdv(nn}wM;`dw0|542uNW8)JJDSnHMe{vF|BU`p4$lL5f|0Sa=;zor($A0~} zdJx@33Z&FDjD9?cnlH?UHKvMt(Sjs3FLI@^K``G7i;yUxH3?<WwZwKo_WEC2a!C=U z`Rg5(s$-lcV#yWGgQV?Y+Txyh6}5+Z|0{+~&p1TaKyc8%>>Q`aO>Kl)IxkWxy!mG) zf7sUL%&XxPI~<%@->2`ZXGDcts!nd4QXi<fAg_K<=52F`AB{%@l*^2n$%#V&`p9l* zllXpe2+KUKln-Gc=AP3&&mST@=*DAFQAppWG$(17oDP=f#R2g*0*O#-${zjVwt&;l zn!1MQ%u?P}Lg#!9v<XPNKWQM0FrYi3e+`HlDm4|HjIcS$hZqY|Cqtie0gL;MiH(P+ zIbI>#dRh&H0-|6vfipFc%y-8bgS%<;eWWQpTlG}m8oxKPhYCU(O^8$Fm95u;<ZD^l zCdQZNg)3fN(M@6xNyF&Fs(4YKpkdV)bc1`5LlUJYYw!PQMfb+Iw7$6Ec?z67e`?yF zP!>;eI$-YodS%arZVPpt%#0)m@2!-5U2fz!Juqs^?=Ecx+~MZq{F%Y~@u&Tq4hb;1 z%I%dXyUC0`<3^T2%(0Y=F%YpoINkd60O;?^B1va(dxG_8NF+gmNklo@p+dL82H-ga z?P&}uu;SXHJH)w?8Q!taU?{{De*)n0j+tRm+$>xFSQ}UW9^}U;oc6_)re=i%vUkU~ zwR)|Uq>t|ewWvs@@?1(~*nazs#HL$KyU$EzletXx7ioVflWm~V7ph5QHkV%w>!@Cn zHsR6P{3ou~Kh^94;dUX_JnR(KL!S2};uvIT5^z6jR-)(9^I1f|B0Y8He^iLRf;l!F zjxa8;TCFVSQX<RAI=sXPvJh$>jCq}#ZFV10adC9eYca^XhnkhCalGHBla3d_Zs!sL zRgf9p0$tE~3>5mUOm_v*QzqF)53^PV$E}}0|94@JhxGVZdJN4EIlKv>$BFc`{FR5v ze1qV!5oy6-Uh;ru!~^Y)e}*)-(=K~BmJ@nlf4q{&r}ve4=$;VJ9X9Zjm8hu`hCGBr z-e+2TH1}DaNzMUifB#En(%2NADhlucg9iyk5V}Ztc$Fx>mqk3{Uo<<g7b<tQ7st@5 zWk8uXQp9d<5wo1a2t7fbiW*s=rhx(&SzV2lXQ`~GL8_XP7a5)pf36#!fQ-$cuOUD# z7UK%c@J>l*gKA#1g17`9u&*`aOZ!fD(aA<U((b<z7_pxX-U7e_;E!{s7FwWpB0_N> zZUrl*B{R)qPi@Xqzyn;%TfZCZt0pPb`PB;)ip`&qbS5lAe?beWC}Y5Zozdy55b%D{ zO-C>O;AVv55eHB)e@MjBMNmqrx#-~1JW+zG8mRaBx^?0VQjFUL%$b2HpSh5kjH4Ay zQHvou4bMp$kLp?lH=j-%I&I{~l!7H_o|Tf1a)4*W$}!~dH=Lj`PaMTmOZ=B4K8=M3 z#Z%JXZlXUUi69=V+5BFnlT$4A3(+i5h4U%1DYlDKQ~n&xe>=y?7L2Z(w&SXa&o?K7 zY~*Cm1rY+Pa>gfQ1H&s{C%k4A*3NV(j8ROiS<W|Y-#3Ty#0Sb2k%-nJ|6XG-0Azhz zQx(3vFJf>A!vth<1v#@D1b-|X3$w#h95yrKU1DiY5ydqtxp*@(T>vpp`m5lhH7j*o zwEor)X}Gvte_Vkz+i!z!3<i0oFPjF{C#F<K3K9S?QR#;=Df5wit%(~gG#q#5CtR@z zjFS&gJ{v6|&Auqlp~$Ui)2-uK6H3goow0$*0V~-Psj79-Eb7~U59%XblcT)nmVyRQ z9zv!KgR+lKx%^vmcP&+Ys|GJznMoA&-^nS<y*uCIe--za#B<aiYBftz>belSOtF<| z5ilH$a+3LchQa3ZK7|~b3cI}QRuxVNAD1#x)J~CBL4FsfL%#X)X?|+AdYZ&CKDxS6 zd+gZ1e`3>H$+4<X_G*cK^&ZnEZHX@e{RyIa*&s!|i{!90aUoPk#Y-jcA~KX5ZLJ}C z^KmMKe`zj!h6hIynfwGCwKGl9u5QrIScyUG_;ED)!2d|-fw_l2hkGKYHCOk|q=(?Y z@Igt+VvCUb&6%GKb#2Z7Mhy<>tC;mw-3ckEF8b}D*7opX3*DfODkFdVx8LOIWIi2C zIstq6Ceaf!_@@SA_iQVaLN#ZBoP>=qhwsLie~I!7Y1?FOrM8LQ&3#KfZ#lS>ULMN^ zzC$>!F21McC_z((51@le=jTBMTeL}n)NQc88NXUk_sJ{MtvF1H?&S&Pjx^%HdETJV zD$T7#Z+Yo%)SdUvq0(b=xox<8hDP7OGx^+}2xvNT&y;g`IWNfTMJwxV8KO|<t@=kX ze>vP3f7ssS=c3i_euBMXp>&xb%Ysr?d*2^S3shVl4mPggr2f-#Jk#p7sALOUr`TRP z=z=zDnJX|iOm?E)2rtM@nZ+l;vQ{890AqLkmPe4kr`;PZ(I*j92j(>{$;mW+_s-=8 zSvU`banLT$Bux4@xk(JsD?$W?;Oc=6f8$0daXnvo_oBZROG8T9FzRSSh_(ep8rI1V z7A*={H;UxFMGdoYm(&?8(&K^7C=qtyh<M|tLUhXH31aV9Gu?C%A<6OVM@Sq_hj{-F z!@u*lK*4-`V-(u1D-y!@N52M)uIOIU>sf<Lp-XMx{;ZY_B!`{$0)8Ek?6a^He+e6d zZYE}S9JyXsEL_rj=s#I<@_6Tq_ezT~K?BSpX#6VE!!X8^p~r{t+on~a!ikwIx^TRV ziPE;s%etdbi@+}lm9f6i#ii8+?WGI1b&UoqI+9n0?(v(?QzWGFVQS6pGWc1yr6&}` zc-QvAno_v76{xatZ7FN=ge{S;f1$YC!K&50HBTif3I3K9co3|f?KUvRCf&I922YgB z2MO|o!SCa*7K!>^84pE(?#u<WdMSCq0cLo}IFJQ5RmY<$8Zdty{9~(Nn_z|9P0$ZT zM--8hF-raq=OS$x|9=5dqg%^_D6yv^NelRfmm&xFN8ev45sL&2PXcpOfAm?DaETZO zF1B6#s06viB*re4!m@#EOFH>A=DRJGcDy_BQP<b4vGOPXSZWJb6rpn2beRjF&mzjh zfylkxx*NhB(x*WfLeTI>5l%&YHeQ(hP9pwuZ&MD*Z`x5V;~u?5>8yO+G|xCA4$OP) zEd5h2ERJ_jq#I?^1mkSpe{%hJidNNkHWPM!YXu44Zu7Ux=^`Y>5_h7h*Uj}Q68C`7 zb!TSw0~d=RI5g9=kqE&pwV-fPF-O8HA?Ucey*#rBz6<S`c2+y*aX5dU$LJI{hs|sw zF4Z(5I@*?`;ZQQ5r47+gfeJ%ss1l40_BEk-(zPAZ4mW!rW{~rSe+<FfXgZkk_T;p= z>nwxQ1Sgd&g2d13pLfcuCyyl!PkI;cqTk3)`oeAq1ts(uM%07XPoq3ZRnrS*FvNOh zL<fC2aplwDaJ!QAjm|Jf!SM7v9}Vd6ln<;tgD(z_ml6-z$@*h`+fZ5MD+?CXwQ`V9 zXFb2!64wooh?|?~e<~z{&{kUVxt3vJi(@EQm`)Arb6eAJ(Sx^UqE1>wpeMwVLyHQ| z>ttq1rmueF9|+>Q%_+pT!;{IK(|q6a0;1LlXaFpc_=wizvEVSKt_hOXdL3V=rk3Y2 zt_NH3qCZVG-BVDC#MSdB?WtVm{6#U7UUBW*fdumwY|@7U9=F~E(fB0mPcUmyk@eXE SmIE@;yi8inf{B5>YX8}3cIT)7 diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index cf7ab46dd5b..7f33330123d 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -27,6 +27,8 @@ <texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" /> <texture name="BackArrow_Press" file_name="icons/BackArrow_Press.png" preload="false" /> + <texture name="Blank" file_name="Blank.png" preload="false" /> + <texture name="BottomTray_BG" file_name="bottomtray/BottomTray_BG.png" preload="false" /> <texture name="BuyArrow_Off" file_name="navbar/BuyArrow_Off.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" /> diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 23d55b33e22..a0055383b1c 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -58,7 +58,7 @@ default_image_name="None" enabled="false" follows="top|left" - height="117" + height="102" layout="topleft" left="0" name="2nd_life_pic" @@ -102,7 +102,7 @@ default_image_name="None" enabled="false" follows="top|left" - height="117" + height="102" layout="topleft" left="0" name="real_world_pic" -- GitLab From eea1057b706cbe1a3b94eab7e6eb00b54adf2c05 Mon Sep 17 00:00:00 2001 From: Steve Bennetts <steve@lindenlab.com> Date: Fri, 6 Nov 2009 12:58:10 -0800 Subject: [PATCH 239/306] EXT-2215 - Viewer crashes while trying to decode image llwarns is not entirely thread safe. Need to fix that, but for now, use LL_DEBUGS instead. --- indra/llimagej2coj/llimagej2coj.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index ec6264dcf55..e71429b18d3 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -168,7 +168,7 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod // dereference the array. if(!image || !image->numcomps) { - llwarns << "ERROR -> decodeImpl: failed to decode image!" << llendl; + LL_DEBUGS("Texture") << "ERROR -> decodeImpl: failed to decode image!" << LL_ENDL; if (image) { opj_image_destroy(image); @@ -241,7 +241,7 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod } else // Some rare OpenJPEG versions have this bug. { - llwarns << "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)" << llendl; + LL_DEBUGS("Texture") << "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)" << LL_ENDL; opj_image_destroy(image); return TRUE; // done @@ -375,7 +375,7 @@ BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con if (!bSuccess) { opj_cio_close(cio); - llinfos << "Failed to encode image." << llendl; + LL_DEBUGS("Texture") << "Failed to encode image." << LL_ENDL; return FALSE; } codestream_length = cio_tell(cio); -- GitLab From d4f790f72866b43956ce4216bf6471c85f4afc6c Mon Sep 17 00:00:00 2001 From: Rick Pasetto <rick@lindenlab.com> Date: Fri, 6 Nov 2009 13:07:50 -0800 Subject: [PATCH 240/306] FIX: zoom/unzoom should appear to be one icon this was a fairly trivial UI change.... --- indra/newview/llpanelprimmediacontrols.cpp | 7 +++- .../xui/en/panel_prim_media_controls.xml | 40 +++++++++---------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 0b2a7e8756b..73e19b3b2a0 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -228,6 +228,7 @@ void LLPanelPrimMediaControls::updateShape() bool can_navigate = parcel->getMediaAllowNavigate(); bool enabled = false; + bool is_zoomed = (mCurrentZoom != ZOOM_NONE); // There is no such thing as "has_focus" being different from normal controls set // anymore (as of user feedback from bri 10/09). So we cheat here and force 'has_focus' // to 'true' (or, actually, we use a setting) @@ -256,7 +257,7 @@ void LLPanelPrimMediaControls::updateShape() LLUICtrl* stop_ctrl = getChild<LLUICtrl>("stop"); LLUICtrl* media_stop_ctrl = getChild<LLUICtrl>("media_stop"); LLUICtrl* home_ctrl = getChild<LLUICtrl>("home"); - LLUICtrl* close_ctrl = getChild<LLUICtrl>("close"); + LLUICtrl* unzoom_ctrl = getChild<LLUICtrl>("close"); // This is actually "unzoom" LLUICtrl* open_ctrl = getChild<LLUICtrl>("new_window"); LLUICtrl* zoom_ctrl = getChild<LLUICtrl>("zoom_frame"); LLPanel* media_loading_panel = getChild<LLPanel>("media_progress_indicator"); @@ -283,7 +284,8 @@ void LLPanelPrimMediaControls::updateShape() reload_ctrl->setVisible(has_focus); stop_ctrl->setVisible(false); home_ctrl->setVisible(has_focus); - close_ctrl->setVisible(has_focus); + zoom_ctrl->setVisible(!is_zoomed); + unzoom_ctrl->setVisible(has_focus && is_zoomed); open_ctrl->setVisible(true); media_address_ctrl->setVisible(has_focus && !mini_controls); media_play_slider_panel->setVisible(has_focus && !mini_controls); @@ -294,6 +296,7 @@ void LLPanelPrimMediaControls::updateShape() whitelist_icon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false); // Disable zoom if HUD zoom_ctrl->setEnabled(!objectp->isHUDAttachment()); + unzoom_ctrl->setEnabled(!objectp->isHUDAttachment()); secure_lock_icon->setVisible(false); mCurrentURL = media_impl->getCurrentMediaURL(); diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index fc5ccdb63e6..3bdd7114eed 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -494,13 +494,32 @@ disabled image_selected="media_btn_optimalzoom.png" image_unselected="media_btn_optimalzoom.png" layout="topleft" - tool_tip="Zoom" + tool_tip="Zoom into media" min_width="22" width="22"> <button.commit_callback function="MediaCtrl.Zoom" /> </button> </layout_panel> + <layout_panel + name="close" + auto_resize="false" + user_resize="false" + layout="topleft" + min_width="21" + width="21" > + <button + height="22" + image_selected="media_btn_done.png" + image_unselected="media_btn_done.png" + layout="topleft" + tool_tip ="Zoom Back" + top_delta="-4" + width="21" > + <button.commit_callback + function="MediaCtrl.Close" /> + </button> + </layout_panel> <!-- <panel height="22" @@ -553,25 +572,6 @@ disabled width="3" /> </panel> --> - <layout_panel - name="close" - auto_resize="false" - user_resize="false" - layout="topleft" - min_width="21" - width="21" > - <button - height="22" - image_selected="media_btn_done.png" - image_unselected="media_btn_done.png" - layout="topleft" - tool_tip ="Close media control" - top_delta="-4" - width="21" > - <button.commit_callback - function="MediaCtrl.Close" /> - </button> - </layout_panel> <layout_panel width="0" layout="topleft" -- GitLab From f7483487c45472f1471ea43b2c543102b282e91b Mon Sep 17 00:00:00 2001 From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com> Date: Fri, 6 Nov 2009 16:11:42 -0500 Subject: [PATCH 241/306] Changed "Support" tab to "Info". http://jira.secondlife.com/browse/EXT-2177 --- indra/newview/skins/default/xui/en/floater_about.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index c74b1929b47..2ff99dcf5ac 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -69,7 +69,7 @@ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number tab_position="top"> <panel border="true" - label="Support" + label="Info" help_topic="about_support_tab" name="support_panel"> <text_editor -- GitLab From 98eb085b6439091fa16fb42dfbd3d78839a31240 Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Fri, 6 Nov 2009 16:30:35 -0500 Subject: [PATCH 242/306] Changed llwarns on spurious InventoryPanel::buildNewViews debug mesage to lldebugs. --HG-- branch : avatar-pipeline --- indra/newview/llinventorypanel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 36d9455fa25..f13651f7f9b 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -457,8 +457,8 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id) if (objectp->getType() <= LLAssetType::AT_NONE || objectp->getType() >= LLAssetType::AT_COUNT) { - llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << - ((S32) objectp->getType()) << llendl; + lldebugs << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << + ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() << llendl; return; } -- GitLab From d158cc86197f2afd26f39ab2a1d207ecab7e39e7 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Fri, 6 Nov 2009 13:49:07 -0800 Subject: [PATCH 243/306] Don't hg ignore the newview/skins directory, we add files there regularly. --- .hgignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.hgignore b/.hgignore index e390f591e57..4d98acf5d97 100644 --- a/.hgignore +++ b/.hgignore @@ -29,7 +29,6 @@ indra/newview/fmod.dll indra/newview/mozilla-theme indra/newview/mozilla-universal-darwin.tgz indra/newview/res-sdl -indra/newview/skins indra/newview/vivox-runtime indra/server-linux-* indra/test/linden_file.dat -- GitLab From 0b3bbf8cfc2b3c2afcb9cc79a8c74677d8645b92 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Fri, 6 Nov 2009 13:51:16 -0800 Subject: [PATCH 244/306] EXT-1501 Menu fonts now configurable in XUI, set size to SansSerifSmall --- indra/llui/llmenugl.cpp | 23 +++++++++++++++++++ indra/llui/llmenugl.h | 21 +---------------- .../default/xui/en/widgets/menu_item.xml | 6 +++++ 3 files changed, 30 insertions(+), 20 deletions(-) create mode 100644 indra/newview/skins/default/xui/en/widgets/menu_item.xml diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 956e8439874..c6a38c7ca76 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -118,6 +118,7 @@ const F32 PIE_SHRINK_TIME = 0.2f; // time of transition between unbounded and bo const F32 ACTIVATE_HIGHLIGHT_TIME = 0.3f; +static MenuRegistry::Register<LLMenuItemGL> register_menu_item("menu_item"); static MenuRegistry::Register<LLMenuItemSeparatorGL> register_separator("menu_item_separator"); static MenuRegistry::Register<LLMenuItemCallGL> register_menu_item_call("menu_item_call"); static MenuRegistry::Register<LLMenuItemCheckGL> register_menu_item_check("menu_item_check"); @@ -132,6 +133,28 @@ static LLDefaultChildRegistry::Register<LLMenuGL> register_menu_default("menu"); ///============================================================================ /// Class LLMenuItemGL ///============================================================================ + +LLMenuItemGL::Params::Params() +: shortcut("shortcut"), + jump_key("jump_key", KEY_NONE), + use_mac_ctrl("use_mac_ctrl", false), + rect("rect"), + left("left"), + top("top"), + right("right"), + bottom("bottom"), + width("width"), + height("height"), + bottom_delta("bottom_delta"), + left_delta("left_delta"), + enabled_color("enabled_color"), + disabled_color("disabled_color"), + highlight_bg_color("highlight_bg_color"), + highlight_fg_color("highlight_fg_color") +{ + mouse_opaque = true; +} + // Default constructor LLMenuItemGL::LLMenuItemGL(const LLMenuItemGL::Params& p) : LLUICtrl(p), diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 09d9e407c7b..dc8ed3b3fd6 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -79,26 +79,7 @@ class LLMenuItemGL : public LLUICtrl highlight_fg_color; - Params() - : shortcut("shortcut"), - jump_key("jump_key", KEY_NONE), - use_mac_ctrl("use_mac_ctrl", false), - rect("rect"), - left("left"), - top("top"), - right("right"), - bottom("bottom"), - width("width"), - height("height"), - bottom_delta("bottom_delta"), - left_delta("left_delta"), - enabled_color("enabled_color"), - disabled_color("disabled_color"), - highlight_bg_color("highlight_bg_color"), - highlight_fg_color("highlight_fg_color") - { - mouse_opaque = true; - } + Params(); }; protected: diff --git a/indra/newview/skins/default/xui/en/widgets/menu_item.xml b/indra/newview/skins/default/xui/en/widgets/menu_item.xml new file mode 100644 index 00000000000..c98e9cb6b83 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/menu_item.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- Use this for the top-level menu styling --> +<menu_item + font="SansSerifSmall" + > +</menu_item> -- GitLab From 2aa981ac23bbdf2fd609e04434179be0cfec79ce Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Fri, 6 Nov 2009 17:35:05 -0500 Subject: [PATCH 245/306] EXT-2278 : "Save Texture As" for bottom panel EXT-2310 : "Save Texture As" for inventory right-click menu "Save Texture As" now works properly and brings up the texture preview while saving. Also added "Save Texture As" to the right-click inventory context menu. --HG-- branch : avatar-pipeline --- indra/newview/llinventorybridge.cpp | 45 +++++++++++++++- indra/newview/llinventorybridge.h | 2 + indra/newview/llpanellandmarks.cpp | 2 +- indra/newview/llpanellandmarks.h | 2 +- indra/newview/llpanelmaininventory.cpp | 51 +++---------------- indra/newview/llpreviewtexture.cpp | 24 +++++++-- indra/newview/llpreviewtexture.h | 12 ++--- .../skins/default/xui/en/menu_inventory.xml | 10 ++++ 8 files changed, 92 insertions(+), 56 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index f46bbbe1884..9c7be2fcf53 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3086,6 +3086,49 @@ void LLTextureBridge::openItem() } } +void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + lldebugs << "LLTextureBridge::buildContextMenu()" << llendl; + std::vector<std::string> items; + std::vector<std::string> disabled_items; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + items.push_back(std::string("Open")); + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + + items.push_back(std::string("Texture Separator")); + items.push_back(std::string("Save As")); + } + hide_context_entries(menu, items, disabled_items); +} + +// virtual +void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) +{ + if ("save_as" == action) + { + LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES); + LLPreviewTexture* preview_texture = LLFloaterReg::findTypedInstance<LLPreviewTexture>("preview_texture", mUUID); + if (preview_texture) + { + preview_texture->openToSave(); + } + } + else LLItemBridge::performAction(folder, model, action); +} + // +=================================================+ // | LLSoundBridge | // +=================================================+ @@ -3134,7 +3177,7 @@ void LLSoundBridge::openSoundPreview(void* which) void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { - lldebugs << "LLTextureBridge::buildContextMenu()" << llendl; + lldebugs << "LLSoundBridge::buildContextMenu()" << llendl; std::vector<std::string> items; std::vector<std::string> disabled_items; diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 3f3513a665e..cce06813b78 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -383,6 +383,8 @@ class LLTextureBridge : public LLItemBridge public: virtual LLUIImagePtr getIcon() const; virtual void openItem(); + virtual void buildContextMenu(LLMenuGL& menu, U32 flags); + virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action); protected: LLTextureBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type) : diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 91e1590dc3e..cb5f4718373 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -265,7 +265,7 @@ LLLandmark* LLLandmarksPanel::getCurSelectedLandmark() const return NULL; } -LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem () const +LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem() const { return mCurrentSelectedList ? mCurrentSelectedList->getRootFolder()->getCurSelectedItem() : NULL; } diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 0e7abb48650..6498f2c7787 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -69,7 +69,7 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver bool isLandmarkSelected() const; bool isReceivedFolderSelected() const; LLLandmark* getCurSelectedLandmark() const; - LLFolderViewItem* getCurSelectedItem () const; + LLFolderViewItem* getCurSelectedItem() const; void updateSortOrder(LLInventoryPanel* panel, bool byDate); //LLRemoteParcelInfoObserver interface diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index bdfff9b2ab3..f4c88b9f828 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -41,6 +41,7 @@ #include "llinventorypanel.h" #include "llfiltereditor.h" #include "llfloaterreg.h" +#include "llpreviewtexture.h" #include "llscrollcontainer.h" #include "llsdserialize.h" #include "llspinctrl.h" @@ -965,18 +966,11 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata) } const LLUUID& item_id = current_item->getListener()->getUUID(); - LLFilePicker& file_picker = LLFilePicker::instance(); - const LLInventoryItem* item = gInventory.getItem(item_id); - if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TGA, item ? LLDir::getScrubbedFileName(item->getName()) : LLStringUtil::null) ) + LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES); + if (preview_texture) { - // User canceled or we failed to acquire save file. - return; + preview_texture->openToSave(); } - // remember the user-approved/edited file name. - const LLUUID& asset_id = item->getAssetUUID(); - LLPointer<LLViewerFetchedTexture> image = LLViewerTextureManager::getFetchedTexture(asset_id, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); - image->setLoadedCallback( on_file_loaded_for_save, - 0, TRUE, FALSE, new std::string(file_picker.getFirstFile()) ); } } @@ -1002,6 +996,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) } return can_delete; } + return FALSE; } if (command_name == "save_texture") { @@ -1010,8 +1005,9 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) { return (current_item->getListener()->getInventoryType() == LLInventoryType::IT_TEXTURE); } + return FALSE; } - return FALSE; + return TRUE; } bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept) @@ -1027,36 +1023,3 @@ bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType } return true; } - -void on_file_loaded_for_save(BOOL success, - LLViewerFetchedTexture *src_vi, - LLImageRaw* src, - LLImageRaw* aux_src, - S32 discard_level, - BOOL final, - void* userdata) -{ - std::string *filename = (std::string*) userdata; - - if (final && success) - { - LLPointer<LLImageTGA> image_tga = new LLImageTGA; - if( !image_tga->encode( src ) ) - { - LLSD args; - args["FILE"] = *filename; - LLNotifications::instance().add("CannotEncodeFile", args); - } - else if( !image_tga->save( *filename ) ) - { - LLSD args; - args["FILE"] = *filename; - LLNotifications::instance().add("CannotWriteFile", args); - } - } - - if(!success ) - { - LLNotifications::instance().add("CannotDownloadFile"); - } -} diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 9c21faa3be5..6324b0adf9c 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -48,6 +48,7 @@ #include "lltextbox.h" #include "lltextureview.h" #include "llui.h" +#include "llviewerinventory.h" #include "llviewertexture.h" #include "llviewertexturelist.h" #include "lluictrlfactory.h" @@ -63,7 +64,7 @@ const F32 PREVIEW_TEXTURE_MIN_ASPECT = 0.005f; LLPreviewTexture::LLPreviewTexture(const LLSD& key) - : LLPreview( key ), + : LLPreview(key), mLoadingFullImage( FALSE ), mShowKeepDiscard(FALSE), mCopyToInv(FALSE), @@ -71,7 +72,8 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key) mUpdateDimensions(TRUE), mLastHeight(0), mLastWidth(0), - mAspectRatio(0.f) + mAspectRatio(0.f), + mPreviewToSave(FALSE) { const LLInventoryItem *item = getItem(); if(item) @@ -104,6 +106,10 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key) mIsCopyable = TRUE; } + if (key.has("save_as")) + { + mPreviewToSave = TRUE; + } //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_texture.xml", FALSE); } @@ -181,6 +187,12 @@ void LLPreviewTexture::draw() if ( mImage.notNull() ) { + // Automatically bring up SaveAs dialog if we opened this to save the texture. + if (mPreviewToSave) + { + mPreviewToSave = FALSE; + saveAs(); + } // Draw the texture glColor3f( 1.f, 1.f, 1.f ); gl_draw_scaled_image(interior.mLeft, @@ -209,7 +221,7 @@ void LLPreviewTexture::draw() if( mLoadingFullImage ) { - LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("Receiving:"), 0, + LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("Receiving"), 0, interior.mLeft + 4, interior.mBottom + 4, LLColor4::white, LLFontGL::LEFT, LLFontGL::BOTTOM, @@ -304,6 +316,11 @@ void LLPreviewTexture::onFocusReceived() LLPreview::onFocusReceived(); } +void LLPreviewTexture::openToSave() +{ + mPreviewToSave = TRUE; +} + // static void LLPreviewTexture::onFileLoadedForSave(BOOL success, LLViewerFetchedTexture *src_vi, @@ -356,6 +373,7 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success, { LLNotifications::instance().add("CannotDownloadFile"); } + } diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index 520626b49f1..9b3c91d8312 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -67,8 +67,7 @@ class LLPreviewTexture : public LLPreview S32 discard_level, BOOL final, void* userdata ); - - + void openToSave(); protected: void init(); /* virtual */ BOOL postBuild(); @@ -77,14 +76,17 @@ class LLPreviewTexture : public LLPreview private: void updateDimensions(); - LLUUID mImageID; + LLUUID mImageID; LLPointer<LLViewerFetchedTexture> mImage; BOOL mLoadingFullImage; std::string mSaveFileName; LLFrameTimer mSavedFileTimer; BOOL mShowKeepDiscard; BOOL mCopyToInv; - + + // Save the image once it's loaded. + BOOL mPreviewToSave; + // This is stored off in a member variable, because the save-as // button and drag and drop functionality need to know. BOOL mIsCopyable; @@ -94,6 +96,4 @@ class LLPreviewTexture : public LLPreview F32 mAspectRatio; BOOL mUpdateDimensions; }; - - #endif // LL_LLPREVIEWTEXTURE_H diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 62940b87dc3..8b6ab4e4d81 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -550,6 +550,16 @@ function="Inventory.DoToSelected" parameter="deactivate" /> </menu_item_call> + <menu_item_separator + layout="topleft" /> + <menu_item_call + label="Save As" + layout="topleft" + name="Save As"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="save_as" /> + </menu_item_call> <menu_item_separator layout="topleft" /> <menu_item_call -- GitLab From a24eee0dd69940f7c3ca8d7569c8ae965072376b Mon Sep 17 00:00:00 2001 From: Steve Bennetts <steve@lindenlab.com> Date: Fri, 6 Nov 2009 14:36:16 -0800 Subject: [PATCH 246/306] DEV-42272 - viewer crash on startup in LLCurlRequest::process --- indra/llcommon/llqueuedthread.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp index 395d2988874..e7ad571a905 100644 --- a/indra/llcommon/llqueuedthread.cpp +++ b/indra/llcommon/llqueuedthread.cpp @@ -113,8 +113,11 @@ S32 LLQueuedThread::update(U32 max_time_ms) { if (!mStarted) { - startThread(); - mStarted = TRUE; + if (!mThreaded) + { + startThread(); + mStarted = TRUE; + } } return updateQueue(max_time_ms); } -- GitLab From 4b9abdc83351b5d79f958cf13fa612a28c71bc04 Mon Sep 17 00:00:00 2001 From: Steve Bennetts <steve@lindenlab.com> Date: Fri, 6 Nov 2009 14:51:52 -0800 Subject: [PATCH 247/306] Reverting OSX changes to expat from texture-pipeline merge --- install.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install.xml b/install.xml index a05122418dc..6d40d6fe4e3 100644 --- a/install.xml +++ b/install.xml @@ -326,9 +326,9 @@ <key>darwin</key> <map> <key>md5sum</key> - <string>9c5603e328e9f543e0a599d6b25be973</string> + <string>c457a0a041ac4946265889a503d26c3d</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-darwin-20080812.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-darwin-20090805.tar.bz2</uri> </map> <key>linux</key> <map> -- GitLab From 3fa1e785a6964d672682b9e5c3fcbdda0fa1f8df Mon Sep 17 00:00:00 2001 From: Leyla Farazha <leyla@lindenlab.com> Date: Fri, 6 Nov 2009 15:16:40 -0800 Subject: [PATCH 248/306] EXT-1576 "Zoom In" menu option should be disabled when the person is not in range EXT-2306 Default voice input/output pref panel to closed --- indra/newview/llfloatervoicedevicesettings.cpp | 3 +++ indra/newview/llinspectavatar.cpp | 9 +++++++++ .../default/xui/en/menu_inspect_avatar_gear.xml | 2 ++ .../default/xui/en/panel_preferences_sound.xml | 13 ------------- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llfloatervoicedevicesettings.cpp index bbeb2871714..43024a4bd03 100644 --- a/indra/newview/llfloatervoicedevicesettings.cpp +++ b/indra/newview/llfloatervoicedevicesettings.cpp @@ -95,6 +95,9 @@ void LLPanelVoiceDeviceSettings::handleVisibilityChange ( BOOL new_visibility ) else { cleanup(); + // when closing this window, turn of visiblity control so that + // next time preferences is opened we don't suspend voice + gSavedSettings.setBOOL("ShowDeviceSettings", FALSE); } } void LLPanelVoiceDeviceSettings::draw() diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index bfad2b16248..0329e740af9 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -47,6 +47,7 @@ #include "llstartup.h" #include "llviewermenu.h" #include "llvoiceclient.h" +#include "llviewerobjectlist.h" // Linden libraries #include "llfloater.h" @@ -113,6 +114,7 @@ class LLInspectAvatar : public LLInspect void onClickFindOnMap(); bool onVisibleFindOnMap(); bool onVisibleFreezeEject(); + bool onVisibleZoomIn(); void onClickMuteVolume(); void onVolumeChange(const LLSD& data); @@ -203,6 +205,8 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd) mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap", boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this)); mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFreezeEject", boost::bind(&LLInspectAvatar::onVisibleFreezeEject, this)); + mVisibleCallbackRegistrar.add("InspectAvatar.VisibleZoomIn", + boost::bind(&LLInspectAvatar::onVisibleZoomIn, this)); // can't make the properties request until the widgets are constructed // as it might return immediately, so do it in postBuild. @@ -464,6 +468,11 @@ bool LLInspectAvatar::onVisibleFreezeEject() return enable_freeze_eject( LLSD(mAvatarID) ); } +bool LLInspectAvatar::onVisibleZoomIn() +{ + return gObjectList.findObject(mAvatarID); +} + void LLInspectAvatar::onClickIM() { LLAvatarActions::startIM(mAvatarID); diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml index 6049476a43f..db2c9ea0fb3 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml @@ -101,6 +101,8 @@ name="zoom_in"> <menu_item_call.on_click function="InspectAvatar.ZoomIn"/> + <menu_item_call.on_visible + function="InspectAvatar.VisibleZoomIn"/> </menu_item_call> <menu_item_call label="Pay" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 78ae9a82240..402d0b6ab41 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -502,17 +502,4 @@ top_pad="0" width="200" /> </panel> - <!-- Until new panel is hooked up to code, we need to be able to get to - the old window to change input devices. James --> - <button - follows="left|bottom" - label="Old" - name="legacy_device_window_btn" - height="16" - left="20" - top="-270" - width="40" - commit_callback.function="Floater.Show" - commit_callback.parameter="pref_voicedevicesettings" - /> </panel> -- GitLab From 99f75c9bca7a28cdb913e740922b71d5722bf503 Mon Sep 17 00:00:00 2001 From: CG Linden <cg@lindenlab.com> Date: Fri, 6 Nov 2009 15:52:51 -0800 Subject: [PATCH 249/306] Add support for externally specified revision number (codeticket) --- scripts/update_version_files.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/scripts/update_version_files.py b/scripts/update_version_files.py index ee1ce69a15b..204986c73a4 100755 --- a/scripts/update_version_files.py +++ b/scripts/update_version_files.py @@ -47,6 +47,9 @@ def usage(): Options: --version Specify the version string to replace current version. + --revision + Specify the revision to replace the last digit of the version. + By default, revision is computed from the version control system. --skip-on-branch Specify a regular expression against which the current branch is matched. If it matches, then leave version strings alone. @@ -171,12 +174,15 @@ def main(): update_server = False update_viewer = False new_version = None + new_revision = None new_viewer_channel = None new_server_channel = None skip_on_branch_re = None for o,a in opts: if o in ('--version'): new_version = a + if o in ('--revision'): + new_revision = a if o in ('--skip-on-branch'): skip_on_branch_re = re.compile(a) if o in ('--channel'): @@ -243,11 +249,20 @@ def main(): else: if llversion.using_svn(): - revision = llversion.get_svn_revision() + if new_revision: + revision = new_revision + else: + revision = llversion.get_svn_revision() branch = llversion.get_svn_branch() elif llversion.using_hg(): - revision = llversion.get_hg_changeset() + if new_revision: + revision = new_revision + else: + revision = llversion.get_hg_changeset() branch = llversion.get_hg_repo() + elif new_revision: + revision = new_revision + branch = "unknown" else: print >>sys.stderr, "ERROR: could not determine revision and branch" return -1 -- GitLab From 66cf090114379244ae8c67dc37b8c8d75b806cae Mon Sep 17 00:00:00 2001 From: CG Linden <cg@lindenlab.com> Date: Fri, 6 Nov 2009 15:54:11 -0800 Subject: [PATCH 250/306] Adding new option definition - forgot. --- indra/llcommon/llversionserver.h | 2 +- indra/llcommon/llversionviewer.h | 2 +- indra/newview/English.lproj/InfoPlist.strings | 4 ++-- indra/newview/Info-SecondLife.plist | 2 +- indra/newview/res/viewerRes.rc | 8 ++++---- scripts/update_version_files.py | 1 + 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h index 71c6fc05919..0f1e59a18cc 100644 --- a/indra/llcommon/llversionserver.h +++ b/indra/llcommon/llversionserver.h @@ -36,7 +36,7 @@ const S32 LL_VERSION_MAJOR = 1; const S32 LL_VERSION_MINOR = 31; const S32 LL_VERSION_PATCH = 0; -const S32 LL_VERSION_BUILD = 3256; +const S32 LL_VERSION_BUILD = 200030; const char * const LL_CHANNEL = "Second Life Server"; diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 082d054ba2e..540aea42522 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -36,7 +36,7 @@ const S32 LL_VERSION_MAJOR = 2; const S32 LL_VERSION_MINOR = 0; const S32 LL_VERSION_PATCH = 0; -const S32 LL_VERSION_BUILD = 3256; +const S32 LL_VERSION_BUILD = 200030; const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index dceaba9a434..879408d6e4f 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -2,6 +2,6 @@ CFBundleName = "Second Life"; -CFBundleShortVersionString = "Second Life version 2.0.0.3256"; -CFBundleGetInfoString = "Second Life version 2.0.0.3256, Copyright 2004-2009 Linden Research, Inc."; +CFBundleShortVersionString = "Second Life version 2.0.0.200030"; +CFBundleGetInfoString = "Second Life version 2.0.0.200030, Copyright 2004-2009 Linden Research, Inc."; diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist index 7aec8a343d6..38ebb22b848 100644 --- a/indra/newview/Info-SecondLife.plist +++ b/indra/newview/Info-SecondLife.plist @@ -32,7 +32,7 @@ </dict> </array> <key>CFBundleVersion</key> - <string>2.0.0.3256</string> + <string>2.0.0.200030</string> <key>CSResourcesFileMapped</key> <true/> </dict> diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index 433070ce343..38291e45c93 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -134,8 +134,8 @@ TOOLMEDIAOPEN CURSOR "toolmediaopen.cur" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,0,0,3256 - PRODUCTVERSION 2,0,0,3256 + FILEVERSION 2,0,0,200030 + PRODUCTVERSION 2,0,0,200030 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -152,12 +152,12 @@ BEGIN BEGIN VALUE "CompanyName", "Linden Lab" VALUE "FileDescription", "Second Life" - VALUE "FileVersion", "2.0.0.3256" + VALUE "FileVersion", "2.0.0.200030" VALUE "InternalName", "Second Life" VALUE "LegalCopyright", "Copyright © 2001-2008, Linden Research, Inc." VALUE "OriginalFilename", "SecondLife.exe" VALUE "ProductName", "Second Life" - VALUE "ProductVersion", "2.0.0.3256" + VALUE "ProductVersion", "2.0.0.200030" END END BLOCK "VarFileInfo" diff --git a/scripts/update_version_files.py b/scripts/update_version_files.py index 204986c73a4..da60fd105a9 100755 --- a/scripts/update_version_files.py +++ b/scripts/update_version_files.py @@ -164,6 +164,7 @@ def main(): opts, args = getopt.getopt(sys.argv[1:], "", ['version=', + 'revision=', 'channel=', 'server_channel=', 'skip-on-branch=', -- GitLab From 0a5cbfd195c5c67f105e7ea05684c4e726e689f0 Mon Sep 17 00:00:00 2001 From: Steve Bennetts <steve@lindenlab.com> Date: Fri, 6 Nov 2009 16:14:42 -0800 Subject: [PATCH 251/306] EXT-2031 Admin Menu Missing Without Advanced Menu Enabled --- indra/newview/llviewermenu.cpp | 2 +- .../skins/default/xui/en/menu_viewer.xml | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 207f0e3f429..a3b119456b3 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -5192,7 +5192,7 @@ void show_debug_menus() gMenuBarView->setItemEnabled("Develop", qamode); // Server ('Admin') menu hidden when not in godmode. - const bool show_server_menu = debug && (gAgent.getGodLevel() > GOD_NOT); + const bool show_server_menu = debug && (gAgent.getGodLevel() > GOD_NOT || gAgent.getAdminOverride()); gMenuBarView->setItemVisible("Admin", show_server_menu); gMenuBarView->setItemEnabled("Admin", show_server_menu); } diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 633c258ecc4..66c9060b06d 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -98,6 +98,24 @@ function="World.SetBusy"/> </menu_item_call> </menu> + <menu_item_call + label="Request Admin Status" + layout="topleft" + name="Request Admin Options" + shortcut="control|alt|G" + visible="false"> + <menu_item_call.on_click + function="Advanced.RequestAdminStatus" /> + </menu_item_call> + <menu_item_call + label="Leave Admin Status" + layout="topleft" + name="Leave Admin Options" + shortcut="control|alt|shift|G" + visible="false"> + <menu_item_call.on_click + function="Advanced.LeaveAdminStatus" /> + </menu_item_call> <menu_item_separator layout="topleft" /> <menu_item_call -- GitLab From 485dcd9a8f89e885ceb290e70749fcb48767fdc6 Mon Sep 17 00:00:00 2001 From: Steve Bennetts <steve@lindenlab.com> Date: Fri, 6 Nov 2009 16:16:01 -0800 Subject: [PATCH 252/306] Fixed textrue prioritization so that boosted textures are always highest priority. --- indra/newview/llpreviewtexture.cpp | 5 -- indra/newview/llviewertexture.cpp | 86 ++++++++++++------------------ indra/newview/llviewertexture.h | 4 -- 3 files changed, 35 insertions(+), 60 deletions(-) diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index d2527065db0..3eab13fc4a2 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -204,11 +204,6 @@ void LLPreviewTexture::draw() // Pump the texture priority F32 pixel_area = mLoadingFullImage ? (F32)MAX_IMAGE_AREA : (F32)(interior.getWidth() * interior.getHeight() ); mImage->addTextureStats( pixel_area ); - if(pixel_area > 0.f) - { - //boost the previewed image priority to the highest to make it to get loaded first. - mImage->setAdditionalDecodePriority(1.0f) ; - } // Don't bother decoding more than we can display, unless // we're loading the full image. diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index b2d7d71b538..9923c9ac74f 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -986,8 +986,6 @@ void LLViewerFetchedTexture::init(bool firstinit) mFetchPriority = 0; mDownloadProgress = 0.f; mFetchDeltaTime = 999999.f; - mDecodeFrame = 0; - mVisibleFrame = 0; mForSculpt = FALSE ; mIsFetched = FALSE ; @@ -1370,16 +1368,6 @@ void LLViewerFetchedTexture::processTextureStats() } } -//texture does not have any data, so we don't know the size of the image, treat it like 32 * 32. -F32 LLViewerFetchedTexture::calcDecodePriorityForUnknownTexture(F32 pixel_priority) -{ - F32 desired = (F32)(log(32.0/pixel_priority) / log_2); - S32 ddiscard = MAX_DISCARD_LEVEL - (S32)desired + 1; - ddiscard = llclamp(ddiscard, 1, 9); - - return ddiscard*100000.f; -} - F32 LLViewerFetchedTexture::calcDecodePriority() { #ifndef LL_RELEASE_FOR_DOWNLOAD @@ -1406,12 +1394,6 @@ F32 LLViewerFetchedTexture::calcDecodePriority() S32 cur_discard = getDiscardLevel(); bool have_all_data = (cur_discard >= 0 && (cur_discard <= mDesiredDiscardLevel)); F32 pixel_priority = fsqrtf(mMaxVirtualSize); - const S32 MIN_NOT_VISIBLE_FRAMES = 30; // NOTE: this function is not called every frame - mDecodeFrame++; - if (pixel_priority > 0.f) - { - mVisibleFrame = mDecodeFrame; - } F32 priority; if (mIsMissingAsset) @@ -1422,10 +1404,6 @@ F32 LLViewerFetchedTexture::calcDecodePriority() { priority = -1.0f ; } - else if (!isJustBound() && mCachedRawImageReady && !mBoostLevel) - { - priority = -1.0f; - } else if(mCachedRawDiscardLevel > -1 && mDesiredDiscardLevel >= mCachedRawDiscardLevel) { priority = -1.0f; @@ -1447,11 +1425,6 @@ F32 LLViewerFetchedTexture::calcDecodePriority() // Always want high boosted images priority = 1.f; } - else if (mVisibleFrame == 0 || (mDecodeFrame - mVisibleFrame > MIN_NOT_VISIBLE_FRAMES)) - { - // Don't decode anything that isn't visible unless it's important - priority = -2.0f; - } else { // Leave the priority as-is @@ -1460,7 +1433,13 @@ F32 LLViewerFetchedTexture::calcDecodePriority() } else if (cur_discard < 0) { - priority = calcDecodePriorityForUnknownTexture(pixel_priority) ; + //texture does not have any data, so we don't know the size of the image, treat it like 32 * 32. + // priority range = 100,000 - 500,000 + static const F64 log_2 = log(2.0); + F32 desired = (F32)(log(32.0/pixel_priority) / log_2); + S32 ddiscard = MAX_DISCARD_LEVEL - (S32)desired; + ddiscard = llclamp(ddiscard, 0, 4); + priority = (ddiscard+1)*100000.f; } else if ((mMinDiscardLevel > 0) && (cur_discard <= mMinDiscardLevel)) { @@ -1473,38 +1452,47 @@ F32 LLViewerFetchedTexture::calcDecodePriority() } else { - // priority range = 100000-400000 - S32 ddiscard = cur_discard - mDesiredDiscardLevel; + // priority range = 100,000 - 500,000 + S32 desired_discard = mDesiredDiscardLevel; if (getDontDiscard()) { - ddiscard+=2; + desired_discard -= 2; } - else if (ddiscard > 2 && mGLTexturep.notNull() && !mGLTexturep->getBoundRecently() && mBoostLevel == LLViewerTexture::BOOST_NONE) + else if (!isJustBound() && mCachedRawImageReady && !mBoostLevel) { - ddiscard-=2; + // We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is + desired_discard = cur_discard; } + else if (mGLTexturep.notNull() && !mGLTexturep->getBoundRecently() && mBoostLevel == LLViewerTexture::BOOST_NONE) + { + // We haven't rendered this in a while, de-prioritize it + desired_discard += 2; + } + S32 ddiscard = cur_discard - desired_discard; ddiscard = llclamp(ddiscard, 0, 4); - priority = ddiscard*100000.f; + priority = (ddiscard+1)*100000.f; } + + // Priority Formula: + // BOOST_HIGH + ADDITIONAL PRI + DELTA DISCARD + BOOST LEVEL + PIXELS + // [10,000,000] + [1-9,000,000] + [1-400,000] + [1-20,000] + [0-999] if (priority > 0.0f) { - // priority range = 100000-900000 - pixel_priority = llclamp(pixel_priority, 0.0f, priority-1.f); + pixel_priority = llclamp(pixel_priority, 0.0f, 999.f); + + priority = pixel_priority + 1000.f * mBoostLevel; - // priority range = [100000.f, 2000000.f] if ( mBoostLevel > BOOST_HIGH) { - priority = 1000000.f + pixel_priority + 1000.f * (mBoostLevel - LLViewerTexture::BOOST_NONE); + priority += 10000000.f; } - else - { - priority += 0.f + pixel_priority + 1000.f * (mBoostLevel - LLViewerTexture::BOOST_NONE); - } - - // priority range = [2100000.f, 5000000.f] if mAdditionalDecodePriority > 1.0 - if(mAdditionalDecodePriority > 1.0f) + + if(mAdditionalDecodePriority > 0.0f) { - priority += 2000000.f + mAdditionalDecodePriority ; + // 1-9 + S32 additional_priority = (S32)(1.0f + mAdditionalDecodePriority*8.0f + .5f); // round + // priority range += 0-9,000,000 + priority += 1000000.f * (F32)additional_priority; } } return priority; @@ -1517,13 +1505,9 @@ void LLViewerFetchedTexture::setDecodePriority(F32 priority) mDecodePriority = priority; } -F32 LLViewerFetchedTexture::maxAdditionalDecodePriority() -{ - return 2000000.f; -} void LLViewerFetchedTexture::setAdditionalDecodePriority(F32 priority) { - priority *= maxAdditionalDecodePriority(); + priority = llclamp(priority, 0.f, 1.f); if(mAdditionalDecodePriority < priority) { mAdditionalDecodePriority = priority; diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 4da6620658d..bde87d1dd57 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -383,7 +383,6 @@ class LLViewerFetchedTexture : public LLViewerTexture F32 getDecodePriority() const { return mDecodePriority; }; void setAdditionalDecodePriority(F32 priority) ; - F32 maxAdditionalDecodePriority() ; void updateVirtualSize() ; @@ -454,7 +453,6 @@ class LLViewerFetchedTexture : public LLViewerTexture void init(bool firstinit) ; void cleanup() ; - F32 calcDecodePriorityForUnknownTexture(F32 pixel_priority) ; void saveRawImage() ; BOOL forceFetch() ; void setCachedRawImage() ; @@ -488,8 +486,6 @@ class LLViewerFetchedTexture : public LLViewerTexture F32 mDownloadProgress; F32 mFetchDeltaTime; F32 mRequestDeltaTime; - S32 mDecodeFrame; - S32 mVisibleFrame; // decode frame where image was last visible F32 mDecodePriority; // The priority for decoding this image. S32 mMinDiscardLevel; S8 mDesiredDiscardLevel; // The discard level we'd LIKE to have - if we have it and there's space -- GitLab From 5e85642650d4ffa822b749c5a4a211531545d660 Mon Sep 17 00:00:00 2001 From: Steve Bennetts <steve@lindenlab.com> Date: Fri, 6 Nov 2009 18:04:29 -0800 Subject: [PATCH 253/306] Temp fix to prevent crash while missing sidepanel_task_info.xml. --- indra/newview/llsidepanelinventory.cpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 3a1b354c502..6aa5c53194f 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -95,8 +95,11 @@ BOOL LLSidepanelInventory::postBuild() // UI elements from task panel { mTaskPanel = getChild<LLSidepanelTaskInfo>("sidepanel__task_panel"); - LLButton* back_btn = mTaskPanel->getChild<LLButton>("back_btn"); - back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); + if (mTaskPanel) + { + LLButton* back_btn = mTaskPanel->getChild<LLButton>("back_btn"); + back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); + } } return TRUE; @@ -120,7 +123,8 @@ void LLSidepanelInventory::onOpen(const LLSD& key) } if (key.has("task")) { - mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection()); + if (mTaskPanel) + mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection()); showTaskInfoPanel(); } } @@ -184,7 +188,8 @@ void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> void LLSidepanelInventory::showItemInfoPanel() { mItemPanel->setVisible(TRUE); - mTaskPanel->setVisible(FALSE); + if (mTaskPanel) + mTaskPanel->setVisible(FALSE); mInventoryPanel->setVisible(FALSE); mItemPanel->dirty(); @@ -194,17 +199,21 @@ void LLSidepanelInventory::showItemInfoPanel() void LLSidepanelInventory::showTaskInfoPanel() { mItemPanel->setVisible(FALSE); - mTaskPanel->setVisible(TRUE); mInventoryPanel->setVisible(FALSE); - mTaskPanel->dirty(); - mTaskPanel->setIsEditing(FALSE); + if (mTaskPanel) + { + mTaskPanel->setVisible(TRUE); + mTaskPanel->dirty(); + mTaskPanel->setIsEditing(FALSE); + } } void LLSidepanelInventory::showInventoryPanel() { mItemPanel->setVisible(FALSE); - mTaskPanel->setVisible(FALSE); + if (mTaskPanel) + mTaskPanel->setVisible(FALSE); mInventoryPanel->setVisible(TRUE); updateVerbs(); } -- GitLab From 4a2b77aebb5d48607c1f36f127211ea25f494dbe Mon Sep 17 00:00:00 2001 From: Erica <erica@lindenlab.com> Date: Fri, 6 Nov 2009 18:08:51 -0800 Subject: [PATCH 254/306] New inventory icon --- .../skins/default/xui/en/panel_navigation_bar.xml | 4 ++-- indra/newview/skins/default/xui/en/panel_side_tray.xml | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 44fd44cde58..255b92844f0 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -7,7 +7,7 @@ height="65" layout="topleft" name="navigation_bar" - chrome="true" + chrome="true" width="600"> <icon follows="all" @@ -145,7 +145,7 @@ top_delta="0" width="200" > <combo_editor - label="Search" /> + label="Search Second Life" /> </search_combo_box> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml index 3582de1c711..a9874f45530 100644 --- a/indra/newview/skins/default/xui/en/panel_side_tray.xml +++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<!-- Side tray cannot show background because it is always +<!-- Side tray cannot show background because it is always partially on screen to hold tab buttons. --> <side_tray name="sidebar" @@ -10,7 +10,7 @@ > <!-- Individual tabs must show background to have seemless appearance up to tray panel header word like "Home". - Embedded panels are inset by a pixel and so their + Embedded panels are inset by a pixel and so their backgrounds will not block the world fully. --> <sidetray_tab name="sidebar_home" @@ -70,7 +70,7 @@ </panel_container> </sidetray_tab> - + <sidetray_tab name="sidebar_places" help_topic="sidebar_places" @@ -133,8 +133,8 @@ help_topic="sidebar_inventory" tab_title="Inventory" description="Browse your inventory." - image="TabIcon_Inventory_Off" - image_selected="TabIcon_Inventory_Selected" + image="TabIcon_Things_Off" + image_selected="TabIcon_Things_Selected" mouse_opaque="false" background_visible="true" > -- GitLab From fcbad172a68f12169f1e6ab0390f71be10b900fb Mon Sep 17 00:00:00 2001 From: Erica <erica@lindenlab.com> Date: Fri, 6 Nov 2009 18:57:35 -0800 Subject: [PATCH 255/306] Added camera preset art and attached to camera controls --- .../bottomtray/Cam_Preset_Back_Off.png | Bin 0 -> 700 bytes .../bottomtray/Cam_Preset_Back_On.png | Bin 0 -> 754 bytes .../bottomtray/Cam_Preset_Eye_Off.png | Bin 0 -> 914 bytes .../bottomtray/Cam_Preset_Front_Off.png | Bin 0 -> 959 bytes .../bottomtray/Cam_Preset_Front_On.png | Bin 0 -> 1087 bytes .../bottomtray/Cam_Preset_Side_Off.png | Bin 0 -> 945 bytes .../bottomtray/Cam_Preset_Side_On.png | Bin 0 -> 1049 bytes .../default/textures/icons/Inv_Alpha.png | Bin 253 -> 319 bytes .../default/textures/icons/Inv_Tattoo.png | Bin 253 -> 416 bytes .../skins/default/textures/textures.xml | 15 ++++-- .../skins/default/xui/en/floater_camera.xml | 46 +++++++++--------- 11 files changed, 33 insertions(+), 28 deletions(-) create mode 100644 indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png create mode 100644 indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png create mode 100644 indra/newview/skins/default/textures/bottomtray/Cam_Preset_Eye_Off.png create mode 100644 indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png create mode 100644 indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png create mode 100644 indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png create mode 100644 indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..3cfe2e850e614f131b343dec26aa23b3542720c0 GIT binary patch literal 700 zcmV;t0z>_YP)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!UP(kjRCwC#m^*LcKoEe}2Es$a5+KA8 zFa@H)PD`X*pHuz-lvGKdQ+~iD*WV?*LqnHHX=zeY<o>{=prC-`)tNT}3^&7Zr(7Pg z&yU5YWTcU8?d<y7*_qk3ndNf1MF`<Q@oFcTg7z2yd<Qoyv8OCp8^fWnc82>!_y%ZD zoMsGCDwTvzr*rW8+2L^XGMUU(I-Twt9UHTF+sFWtB%M#E)7*1ye!u@yKA*qb*b)~C zh0~YdQ2PD;S+Q6=+z22p>tr%HQnN$Ia=9F*4%lk7a$0RGmC7M?!1;W>V}<SOse@jx zm(yzNcDv(^Mnj+mSglsGJkN_-?SsJ}KO7EEr~xh(3qBf+5~ovJoeu;8*ylYpKq$c1 zcvcex^;N@3gu`LHO4I-&k;o75;4bV!$7;5TMB)x6w4X|)zHVZx`&O&f_;$NZn$6~4 z4WUqo#9}d$OeXPhAM~C!U>5X3qwROl57d?zwy*49F!-#+R#6nR7rWi=`FK2zTk1h5 z6$0!E=rvK6<<-kQ9?vQf9%nRUErEjsf&F^b=JWZ8%jN2^Ec*pw^3rs`HQdem3-AvF zLe6Hh7c&@@ee`9)Fw8Z_aUV?s#H9gm+&+Xed=O<A2_R2Ri9vw7FcS_19CHM5yk{72 zJ;)xhKp;HM3<JU-C&W4t)x5~6#hz8(dyr^3-GGp_mcp%L@jy2qbQX#A!eI&13%El8 z5Z}Y=O_C>DQ@vg{1oK>fh(l2?;FFn+Mk7Oj|JwiU=aJTWXxYD+*W$td8&I(^pMrog imLeO%A(Q-5fB^vYSp_L!SU`IK0000<MNUMnLSTY!?m=h( literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5d85e4100c3865a7c0f0afa1f49e622defa49d GIT binary patch literal 754 zcmV<O0uB9%P)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!lu1NERCwC#nBQyDP!z{cZjvr-m%6&u zE}2SokTMV-wl_i8AJF<L+aI8hg7bY9AAFkNqdp9L+3?kZuj<QuQjmeL$!O>N(Tdup zKk}n#Q}3NRR_$z-G-+fz5NMKf&;9g!?mZ`5s@-n$05E~CF!;;r`1(j;z>D|?3;r|% z`52BEi@@i04CvIDegxTAdn$d&y`BAiPcv+F>hhIrR6JL68k_9m87BdrE#FzxYI3^U zyA$y<OP8+RSRGi3Up%^d^B_24a&c#2?eYD&fdG=UD)P7aUVa4f{rXG6bHKv8Hz}*W zx!2F<JO?y1CFzFm(W!$0F34N1Wo$rDih0R1z)EgCbxKTFo-i^pChDc)HO~OerXj|J zv!ozf1B{M=*=o*s2FQ(yS)i!u`KjrizT{6tV*=2Dpsj*!tJQHQ$3N3Up|mWQNqfuu z%Xd7Hd=-qHUJAt%n}cX|Prhz%h^4|deE+c3@q&+uFgh^_@yQG1mK1c)0aLxy+h?1< zAiY_GO0Ax%)YJtlzO9xCrHU$*<?3QXZwRg`sB4;pC&}P3(x<WxMym~Bjs=#bA;8d` zU}hUM-GI7gzz~CAB*Xy6qAE?(55xTMYTp3~oUZ8)$nx4NHyEOUAvMG7Ud$N^I1Gmn z)j26bSw6zw?i(OUji#zA`{5k7FoafyBmBL-tU;_^rk`*>)i>u=MV)pGNP;;1>ORPt zhH=X=AP#cftuGa_*?OsndaXUT)Y}uF*-YC8#Ok>Ux2vLQ&e{gV3t0m9jVC3{79dV< z(gQ%!Z3Mf3e+}H)DL8`ZHXdgxX?GWke?F+Inj^r&jz2y;vbd8a*Un~+go6J)py6Y_ k-9z-ePaz3Y{)Yeq08Drm=&BNvuK)l507*qoM6N<$g1}p6IRF3v literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Eye_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Eye_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..2b509867805cdfb55be8c3a1f976ee94612bab9b GIT binary patch literal 914 zcmV;D18w|?P)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#G)Y83RCwCVSj|ovQ53$6{3r>KC`M8l z6CeV`C%_lL2WSlsQ1`XnlGY|{o4U72*VR5iyEP$pLtIHsG?D-&8a6s4iU`>A-5>!v zg*(h0!bxuC@64I+o}anjxwfaLCnsafO9RJgk_HXUMgRkJqOj?dwlc-wAj&j@<6@U# zq*AFQ8jZ$UyWLj%r>~TqPUlH57%Yry8#(x5oEL9zZ#~s&b*tHIZqlVXLcMIa+xHh2 z7x#QVU(IrW#bPn_@bIwPseU7(xm>Qdp-||TWdP64&URX@)|Q!+n3<W`TU}k<5vmd+ zhR@H>-<bsmfeqM_3b0fvB`M$D%c@S;f=y`v@9yrt$o_?h*c1YIadGilpi;*XwPV{H zKnll(RX^fUwuJ!F57;t*qiic8#bNbwHtZXUKnQ|X1041ZMIZ#K)c}WmV=Oi^J39-b ztX{7(kH<4q7tf&w{ZYDxmO7AutE;PT^gP+KM6p01z;d}9D-;Us{{Eh=tgNtfI?XOG zFFBB2-R0$Fc6fNm^7%Z!x4yp4lF1}1m&;g9`qpS-Js-m1@PV)g2f;z`L3jb+ve_&j zl;F^1s;Y8O&){(V`1shTdwhJ%z2B?b5iilTUA<z_1$cdZ9UKJL;dkBhxw$z$AjDAq zdEN^Edh_%1-D`)#q3aZiz#AdLN>oZWX%QOCK9x#!?<Eomwy?0kLky2~$N;~FE<&2g zWcYo&hi5t==0Z;K3FRPMP3z>3|4=37^?I4x?dIpChkWgV)6;z}j#{n8G)>b5$HCZa zN3mG!l~9qKo}T_0gOHjM3jN1OB=S|LNWgq2368vX;`jT%8)DQ5H6`vQ>8xQ`1q}TP z!0GiX!jzvv{@Vh|rN!g%mr@8TW+}brwcGckF>17on6XTNRNed103ts`W^BNFpO==F zDpI>TiC)w?w&b>*@S=?04{V6;Fc_v=*cCwIZKi2Ava>K2AH=Qz5d*_jjdw(M6ifkx zM5EDdBc6mV-kI3$R_|&<#P!pVm8ML@Vw;HV(L}f3^!5m8S=<<C4St&08<YyrDnSmm orWjuf0B_LwO(8g7y7?=>0Jg7&)rX?`xc~qF07*qoM6N<$f>8Fi$p8QV literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..9876aa456cf1282e74a459ba3ec0173a9c1fc75b GIT binary patch literal 959 zcmV;w13>(VP)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#VM#<mRCwC#SW8bDQ53#|3ZgP-Fj^aD zW8w?=10=XHX~NEp^%wX9NV{*F?%V!=wsz&pl%>**i5qRZaAPQ%s2d<ce1wNDK(ODr zGGrXb*9?xc;3PM5=W_1MchC9GV-PMcFYSym5reK)k`hK<0KgZR*qAk?YO^pn5}TF5 zT_J1&G$^e`AF#N%=uIY*Z_DL!NL~{JA>Y>477Yf2@5aZ+3r3z#QT$Tx=13$GNT<_t zc!sFWa9hIf_fJnuOe9TraXcP(WipvBU0q$G*Xv~i0|QqsX>H}By}g}Pt5qo$i_JX? z2iMovLj+)Wc$kADkRu}_Y-nhR-^<rZrQ(~PpMPyS2Tx8;LOne_jD{?dB(aN&3sxu; z_&NbRKR;*3$H&Ca1yd~u-no_F>L-SKmFqMo-DVzC3W8&>zrWu{fpDL6cXtyv1KZo% zZ%pGLI5smjHYPqqS9UjoWd@herdW{j+oKb%AS6w5F;d6^g5eWh8he0x9tVoL-R`jI zl_ZzTx%T$<{?-~^O|jeUVLH&WL@}&VI5;?n-jOR4$ct;HM==s_AfL~F-`w0xt*)-l z?Ck7lS(mM>tVsCn59YrSShJ;4$@QczrWc%@o&CTxK=<fa7=c?_T4ElLhgT9>J3KsO zySuxrudk0yO-)fy)%n=c(h^4f{?%}RaF-YE`l;lb%jM!P-`Ln-%gf8GSS;4{(Z#UI z$w^*WuvZ<?Uqw;;&@g~C%UufwSc1V4bseg?sZ@&3dwY9{pUS*RosBwGy~hE+H3T5> z4SFHvT1Q6*cjvWFFo1w{_)r~?;ec9o`&DOW=RZT0gaSehjsPgZp_}GGK~_Y?;I5}3 z>mb!=0t96~;xcUrAgnU0UUN7c9LVYEDF;RtqBW<}$?pkFHk;*5D*+{I6G+liNq`Ih zs;ub(NZeCfujX>jE4g!qo0O5txk;eNvPVZpY=3{BAt-K8qGkZ9(fR-)Dnqx_Ro<mg zpxjZfxm9Ir<Dj?ol>yy}8k>Du>tu<$z^R3F$=bJw1WF9*1?V@UDW&fgy`}EP$r6c# zAuw9|!9(2uCG`SDt`T|c{)T;%Y;A2>`@fmd(NQDYeNWP`Hvipf0&Eb#iiPo22w;|S hr3JwertE(K1_0Olhg?>2i@^W@002ovPDHLkV1n<MyWju- literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png new file mode 100644 index 0000000000000000000000000000000000000000..f481fed88cbcf322624217a3aa058806cb4846db GIT binary patch literal 1087 zcmV-F1i<@=P)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#;Ymb6RCwC#Sj}r2M-+d%vmeraNLDH* zw&J)}N@P@Ox7df0OA+J}NJ1b-C+CEo`w#dJsCo_cAJC9Pa<Ll<rC^t|bqjXECNx%S zB9wS-WBEhc@6~Fzvs>gymh2>wy3xT8h8^C{oBhrE&3p592-kH*0632u54|NSZW{y! zIF36s^rlqE9tP(LO+t^$DZoyJ>U4s&U!SC2J^SOXr7M}5jvz>x<;D5WuHMPU5=o_# z`MoHfY}a_@$A=Tr^QEloI$}$D5GAF*xOs1Q?DA&d6z@wfgw5Qa(_vl|lj#YF4-ETy zMA3d@LL4|%JMsMKT=u<CoLl@M;{h1HGzO7a9Qp@`ffJ+tJ5$&EzPw+A;#MK``{Vo9 zKfm?mT%Z7z-R+Fn7x%%{WZ=R_U{@-jDWyZurlI*`@$0!jDR!NzSP$-S#WdXj+Ut8` zPxD~C7<*fTvG_pB3xqd`w+)6arY8^nUcMXH9yE5P8zZBiz7=gXx*f~7jvq6Dc#x!M z>D`UU&A=#*B**3u%gqoZ%Dwq0AY{CtdG6fEbl@jRMJ)^E{OT<HSM;{7m-y(kx1jeD z#WWvLiu<McV@qOPmoz%E6!=M^Yx)FE$Wz-=A+zwyQyBj^4VRM1hA{`FGW@)_m`JAO zSx)Ga5JC?^;m|CiDCK{nxN6&irfS)m4b9L{SpN$ao;-s1nKSU=&=4>*1v|TY@J~Ju zADkV8D>rZB_&~KOWSq#SIi6eSIzZDfQl?>k>!r4uPKb#3<0P!DF2Qd<eGist9F9+Y zG69#bT=NSDO;L{oH2EF2{ibUGJ<q9%I$IA8Q3!ZJs9S&z+ZzSHAB&#_F&cY)Zp$*R zY@CKUG38la6drU1pj;|{jmKr`bzz<Znr{5xavTR|6~b@zVp$d#n%*=o8)B!}P$<_? z6ng=26dXYk4dARw6{MmJ>l^#9Rw%;up5p6j!Y~XrYM$FNt*<(cVlP^c>KK-VDyFQg znoulhU{-A47zD8}g3Xc*s%F5>feIW;Lre@qglBz_7*JzHgxT{P5az<mZ2|Q5-cj#) zvRBe!S2+L%ksz=L`Y`~KeC?vRKx4Wo&@2agQ-+OV8Tv&Q!gRA6ZQH(qAMF9eQJZO{ zM}!NBC<_!KPB?lA5JJdrcGU&Pb)gl{uH#I$y$A88PqosA@c;fv;F`RE$1>EhpGsir z2ipRO=^YKCD8)3V+6CCOvh|l+9f4_OkC_^6H_arP3jm|DJGFPT@7h1fN-p2qcQfOu zk+yB!V}h~cg7x%v>l9#@09JY!pMQy-?@^E*ru@GG3;=iXl9T09?yLX+002ovPDHLk FV1l}u0!9D; literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png new file mode 100644 index 0000000000000000000000000000000000000000..d58b4ff9904f774cad3344fecbf79b06e5350fb9 GIT binary patch literal 945 zcmV;i15W&jP)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#Q%OWYRCwCVm^n`yVGxGL#@Hb68Y7N? zVu=Q%VAD`I;Rjfu1rqlpav$IaBuWpVPb4ae5J8EQ^aQ1#B$DM0%q1=#oIdl;hrI#g zH4ENrq!nxLw;#{W@y@Jm#bVJ(L=q1EYbDFzNZA1R3@3K7rWNcKhGVl^8BUl(tBuyy z)&>s_4m^B5K0dy#)xMmAz4dIcva&LgN~OM>pP&2WO>MSRb93|8$;rt%Qvnwj7vCll ziFu{#PN#Dz5{XRJm4r{dadmZduoj%qiA*NEu&^*~3gGeaaahf|%gf7%DS&}MV03tR zm<9$0$mjDZu0sk*oTr9YF^a&4gS=j^`0RGO$>DI&_VzZNo}S)WdvbEZfa|8pOixeG z&4z$vK=$m`))rk|T~R|rgYh9&GWH}JhrPG=Mj-O}ymbKCgJsCFH8nM*3<rc5Zz^32 z27@weOG^tMzYPV1zPTG48&%~cdvk1T%s3CCr42&cmRnm}{VLXqVu8&V0?2T=Ty7bs zewWL|txR!kGMS`UEJi~^LzK;C!+U#s)4Bq3SW9qH`MdV^b_{Iyw>UaFqK%CW3WY-A zGs_MHdj`<IcpqJK5PJ6cHXIwmEOHE^mH=h1?eFgk-J6)0pziK&y1u@qv$Hd5Yir|M z{Mct6o`0|DG=rRbjwk<9QN<)l5~b5=Iy^iigiw6n)zwA){r$53#p7|}bl|S@e@wQ2 z#Djg)3=s3)C#<{E^bv01nNr&m=Y4&Ba>&_p49*Y2p03;y_XOd|v?e(SxX~&)C^U{k z#~xxsG01ScySoCm3LKk+P)D>Zl6&I{=UJr|A`J*LBJJ$#lm)uhLx*(}>S#1t{T;DT z5IO1bcx12EdT6A@Yr}gn7Y?^LRWH4T!ieF3k1>QfU@D+eD%>(_d(e=1kVpKBiwkoB zp?R~+Qteu2XQ!Hq)fW(zIS1)@1>yZr35sdCu6GViLyZ3UgF(?f-aYj#&5#_#5c(6K zZ=iP}gny}?6xOv!(8~TI{8MQ9FFQIqI8Prn+9PFV4Urj4Ch=09z9{AC=0gJ#uj7=_ z{pYt@uLqb1c?$C5e|So2ki@Z$s{gKL)Y27D%Oc5Jm@m(O2_7sg2**r`e*z2u8YWAi T{GoM700000NkvXXu0mjfGUm5^ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png new file mode 100644 index 0000000000000000000000000000000000000000..6e7389899218710977c298873d66ecfbff197989 GIT binary patch literal 1049 zcmV+!1m^pRP)<h;3K|Lk000e1NJLTq001Ze001Zm1^@s6jQ+T70000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#yGcYrRCwCVn9ENSQ51*IJUWlg3kpSA zg+S0s6i5)m!f1enF)^SE7Y5w9=wHCr2zy-{*(-752BHf$5{%IWL@_2>MIkM3=^Lh< zX=l8*V3k67NIUIGCihNzbLX3LfA^kqhA>T20)Ug~5}>?n16>OQ0&GJa8<eN%WEsO@ zvyo8dMi*)#|Hn6;(CUJS`)yZmPZw%ltig`sOfd86*@d9rH>AcR?(C!l850~eqgU<> zj+7Me{qsk?!NBZLzW+H<8SA-wZ}>QX|E<BVZ(n%!gTt1HNBSn8Jn)tTaDDzu@1YK} z;A($K02@xXbT_wOhWazDaN<-`-f^aBNLZ(q?_!p>yU_)5Wp(D>E-66MHdyx0LM;4i z$Jn(c|3%bHTk64FbGquG(&>Vejm?>R>{*7hXZj3Pf+fypc2UW+wRKGyXlz=#i~wny zEen}_h`l0aIUqq&zI^|+boOLg3TcuN6cC(sQ<egzQz?;P_yfmP*VY3myP&h{nspvb zCK8^_jm;54a(WIL8{bsH-Q145UP}NmTr!b-jKZUbWJMs@{5fto5{1t{=izK?2WWb_ zFR&8w78MXLD~3Z|>CbOWRUOviuCZ(D>+tTwN4RwLX6Ak+6o*tQ?TtmEPw_lONfu(! z*nQJ5`gR^E0+0m2r^%PV5(b2$QCM7F0h4B->-sIIKH&y6sl)6-5Znq2G)16Hhj=Y1 z@?b#$wWQ`ssOs3xT}*%^%MgmHu)G$8@X`-pK!d6p7c_XzZFxOyz_-9Uhztob|2Jq+ z6!lP$#L<F<IxU&p74TKvgoXJv9Be@mcu2WCaK6zAB)O#;?76^d6h#qY2iz8T+KZNY zjH2myK{RL>M)&SFGr?h}!Ck?E$ZhFR*YzyikHruwC`_mp_bhoNRZR>Oa+A1s0V2<E zIVFv*Y49t&0p9~bs6<|K2>I(VBc1Lo+Ce?zo6GZ1yiqp6r7&5q?)TE@JngbP7T3rO zF!bT3MPBT%9PlWHPLQ)D1<WUfe*nwdgO=ojv;Jk26eLOuNKzCoz!&%2icSacEK^!Q zQ4&Yw3gre((?hwSJjbBWRXn8}sj5TC!8mHhUCyd56!Zs<``M&uWoJ|4sR`6f;QUb2 z^#0r|=Loh~)J?*2oKKRaVUFkf8fyfs(<7z!NHQaq95W2dEN$zw2kR6qzwe;*5|7)K zOmRQI?N=V?da4^OzvrJUJciP-DURn3m1-3gu#m@$UdDWxkLYt{3W=HKehV-F{489X TTcS`l00000NkvXXu0mjf9{=a6 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/icons/Inv_Alpha.png b/indra/newview/skins/default/textures/icons/Inv_Alpha.png index e8d246c6faf0aeaa4b4ff49b8f28e79cf8c92d52..b65dc1929df4bb77e27d4cf15e82bd7d18b9c9ae 100644 GIT binary patch delta 254 zcmV<a00IB~0lxx}Nq^x<L_t(|+G6<s|33pdK6B=bJ~3h-%m^Yt;OyD6`9P`wh!w6} zxx%2Mqa$E!Z2S=_#}A}FK*b*b*%N?r6G3t;KuLX&01!Jcpn?NHxd1481CqD`NIg`p zfN{l&74Lui_#wbRCSXxfQ32WBfGh}gDqc1eG%x{)1xNxPh<CIYrfvZ^5P|-&2XZca z{P=Oh<HwI32<hhF;0OS^`~xr`55i*s8ru6ofl0^<K#hzrJxmM~0v2Qr&<hMeFTia> z4pd||&;<-wUBJ)J4|gtz#>GYkqh4TOKuHJW0Du4k07w+44R{J`s{jB107*qoM6N<$ Eg7b-EjsO4v delta 188 zcmV;t07L)30{sDyNq?V7L_t(|+G6<s|33o;e*aLPC@~;r1QB5H;ZZ)2EC6B!hya5C zgMi#es2o3tgo-}^;t4>xi69Om$Yihp1A_wtD!2f|0Z{e^AT~ggKLD~2WWal{ZRCLu zOi<g&1rtCnkcaw<0qRdeu0d9#zyu78hfx0uK>bY!T!5-|05$1lfrPi*L1<_b=Ws~u qfb}pjPzXj17z_p=awC}lAiw}<-deHF?60r@0000<MNUMnLSTZoOiCF5 diff --git a/indra/newview/skins/default/textures/icons/Inv_Tattoo.png b/indra/newview/skins/default/textures/icons/Inv_Tattoo.png index e8d246c6faf0aeaa4b4ff49b8f28e79cf8c92d52..a632197eb530c75502ff25b823b9bf0dbcee18dc 100644 GIT binary patch delta 353 zcmV-n0iOQ-0iXkrNPhuBNkl<Zc-nkYyKTcj3_U3hkj~m5+CbVM@&s`j*B-&WiztQb zC>zABD`f)P8^{wxo**s*1cCB+cm#;^DFg`WDDv^~lMKV)M1D^vr}DGg6)+9-9h%)P z7H{-VVM@G@H$~xNQx^z=9++4`SI~<A?Vxjf-)nq2lHAi(%6}XFPre0g3C%TUVv+^5 z<#SFTNjT6iY%=jn3o!<jQlym`)J$@$>|5h3yd>ce@$;E2l&tCus}Ja-6u8@L&QSmZ zQnQ5>+wcjX?_+ceb_RP^%}v#e)Jw8z73ivk@AZ1m<lK$Rg?Dg{-9b(5X%$TGp)-u! z)fTuK39j+|Vp@VL0%eAU8{Gou@fvJEr3Ltt9b!7tt5iN9I5BPHnrvk<0?_ebz6^C) z<tz-0GC-vnSv0hL*!#Z#1le-$4ec@(_b0#rEzpATy1;!O00000NkvXXu0mjfQTd`G delta 189 zcmV;u07Czu1N{MzNPhsINkl<Zc-mt4|NlP&27dogpC~aPW&{yn@ZnKDkSqXV1&9EH z0E2+sN2nY>h=hti0OAQixrrbSBgka100V;q11h)x!~szD1|T*-lRp5m5M;o6ux;dl z4@^+o$psTYE|7=%ivj9SLasqpqre0VjE7MF3qbu%2wZ@wbv6L$Wr2jZ+(Bq)6X$S9 r?11$!F;ECb4HygtAaWy_03g5sXx>_}&g`$S00000NkvXXu0mjfqwz`m diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 7f33330123d..fba8e0b06c5 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -28,7 +28,7 @@ <texture name="BackArrow_Press" file_name="icons/BackArrow_Press.png" preload="false" /> <texture name="Blank" file_name="Blank.png" preload="false" /> - + <texture name="BottomTray_BG" file_name="bottomtray/BottomTray_BG.png" preload="false" /> <texture name="BuyArrow_Off" file_name="navbar/BuyArrow_Off.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" /> @@ -51,6 +51,16 @@ <texture name="Cam_Pan_Off" file_name="bottomtray/Cam_Pan_Off.png" preload="false" /> <texture name="Cam_Pan_Over" file_name="bottomtray/CCam_Pan_Over.png" preload="false" /> <texture name="Cam_Pan_Press" file_name="bottomtray/Cam_Pan_Press.png" preload="false" /> + + <texture name="Cam_Preset_Back_Off" file_name="bottomtray/Cam_Preset_Back_Off.png" preload="false" /> + <texture name="Cam_Preset_Back_On" file_name="bottomtray/Cam_Preset_Back_On.png" preload="false" /> + <texture name="Cam_Preset_Eye_Off" file_name="bottomtray/Cam_Preset_Eye_Off.png" preload="false" /> + <texture name="Cam_Preset_Eye_On" file_name="bottomtray/Cam_Preset_Eye_On.png" preload="false" /> + <texture name="Cam_Preset_Front_Off" file_name="bottomtray/Cam_Preset_Front_Off.png" preload="false" /> + <texture name="Cam_Preset_Front_On" file_name="bottomtray/Cam_Preset_Front_On.png" preload="false" /> + <texture name="Cam_Preset_Side_Off" file_name="bottomtray/Cam_Preset_Side_Off.png" preload="false" /> + <texture name="Cam_Preset_Side_On" file_name="bottomtray/Cam_Preset_Side_On.png" preload="false" /> + <texture name="Cam_Rotate_In" file_name="bottomtray/Cam_Rotate_In.png" preload="false" /> <texture name="Cam_Rotate_Out" file_name="bottomtray/Cam_Rotate_Out.png" preload="false" /> <texture name="Cam_Tracking_In" file_name="bottomtray/Cam_Tracking_In.png" preload="false" /> @@ -499,9 +509,6 @@ <!--WARNING OLD ART *do not use*--> - <texture name="Banner_ForSale" file_name="Banner_ForSale.png" preload="false" /> - <texture name="Banner_YouAreHere" file_name="Banner_YouAreHere.png" preload="false" /> - <texture name="btn_chatbar.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0" /> <texture name="btn_chatbar_selected.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0" /> diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index a569b62e967..5c09bc3a02b 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -34,7 +34,7 @@ mouse_opaque="false" name="controls" width="148"> - <joystick_track + <joystick_track follows="top|left" height="78" image_selected="Cam_Tracking_In" @@ -50,7 +50,7 @@ visible="false" width="78" /> <!--TODO: replace with slider, + - images --> - <joystick_zoom + <joystick_zoom follows="top|left" height="78" image_unselected="ScrollThumb_Vert" @@ -80,66 +80,65 @@ tool_tip="Orbit camera around focus" top="22" width="78" /> - <panel + <panel height="78" layout="topleft" left="36" name="camera_presets" - top="30" + top="20" visible="false" width="78"> <button - height="30" - image_selected="CameraPreset_Rear" - image_unselected="CameraPreset_Rear" + height="40" + image_selected="Cam_Preset_Back_On" + image_unselected="Cam_Preset_Back_Off" layout="topleft" - left="5" + left="0" name="rear_view" tool_tip="Rear View" top="2" - width="30"> + width="40"> <click_callback function="CameraPresets.ChangeView" parameter="rear_view" /> </button> <button - height="30" - image_selected="CameraPreset_3_4" - image_unselected="CameraPreset_3_4" + height="40" + image_selected="Cam_Preset_Side_On" + image_unselected="Cam_Preset_Side_Off" layout="topleft" left_pad="5" name="group_view" tool_tip="Group View" top="2" - width="30"> + width="40"> <click_callback function="CameraPresets.ChangeView" parameter="group_view" /> </button> <button - height="30" - image_selected="CameraPreset_Front" - image_unselected="CameraPreset_Front" + height="40" + image_selected="Cam_Preset_Front_On" + image_unselected="Cam_Preset_Front_Off" layout="topleft" - left="5" + left="0" name="front_view" tool_tip="Front View" top_pad="5" - width="30"> + width="40"> <click_callback function="CameraPresets.ChangeView" parameter="front_view" /> </button> <button - height="30" - image_selected="CameraPreset_Mouselook" - image_unselected="CameraPreset_Mouselook" + height="40" + image_selected="Cam_Preset_Eye_Off" + image_unselected="Cam_Preset_Eye_Off" layout="topleft" left_pad="5" name="mouselook_view" tool_tip="Mouselook View" - top_pad="-30" - width="30"> + width="40"> <click_callback function="CameraPresets.ChangeView" parameter="mouselook_view" /> @@ -165,7 +164,6 @@ name="orbit_btn" tab_stop="false" tool_tip="Orbit camera" - value="true" width="25"> </button> <button -- GitLab From 5fba55f58e35e52485f161d069f323120ec68b6d Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Fri, 6 Nov 2009 19:30:52 -0800 Subject: [PATCH 256/306] Partial fix for DEV-42153. This code seems to work on some objects and not on others. I suspect I'm not doing something quite right in LLVOVolume::getApproximateFaceNormal(). --- indra/newview/llviewermediafocus.cpp | 10 +++++-- indra/newview/llvovolume.cpp | 39 ++++++++++++++++++++++++++++ indra/newview/llvovolume.h | 2 ++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index b2a0fa4b1c7..70a7d835a36 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -499,8 +499,14 @@ void LLViewerMediaFocus::focusZoomOnMedia(LLUUID media_id) S32 face = obj->getFaceIndexWithMediaImpl(impl, -1); // We don't have a proper pick normal here, and finding a face's real normal is... complicated. - // For now, use +z to look at the top of the object. - LLVector3 normal(0.0f, 0.0f, 1.0f); + LLVector3 normal = obj->getApproximateFaceNormal(face); + if(normal.isNull()) + { + // If that didn't work, use the inverse of the camera "look at" axis, which should keep the camera pointed in the same direction. +// llinfos << "approximate face normal invalid, using camera direction." << llendl; + normal = LLViewerCamera::getInstance()->getAtAxis(); + normal *= (F32)-1.0f; + } // Attempt to focus/zoom on that face. setFocusFace(obj, face, impl, normal); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 78f534bacd8..021fc746488 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1638,6 +1638,45 @@ bool LLVOVolume::hasMedia() const return result; } +LLVector3 LLVOVolume::getApproximateFaceNormal(U8 face_id) +{ + LLVector3 result = LLVector3::zero; + + LLFace* facep = mDrawable->getFace(face_id); + if(facep) + { + LLStrider<LLVector3> verticesp; + LLStrider<LLVector3> normalsp; + LLStrider<LLVector2> texCoordsp; + LLStrider<U16> indicesp; + S32 index_offset; + index_offset = facep->getGeometry(verticesp,normalsp,texCoordsp, indicesp); + + if(index_offset != -1 && (normalsp.get() != NULL)) + { + U16 count = facep->getGeomCount(); + U16 i; + + for(i=0; i < count; i++) + { + LLVector3 normal = *normalsp++; +// llinfos << "adding " << normal << llendl; + result += normal; + } + } + } + + if(!result.isNull()) + { +// llinfos << "before conversion: " << result << llendl; + result = volumeDirectionToAgent(result); + result.normalize(); +// llinfos << "after conversion: " << result << llendl; + } + + return result; +} + void LLVOVolume::requestMediaDataUpdate() { sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this)); diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 0574d3e3856..784ef16ba36 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -263,6 +263,8 @@ class LLVOVolume : public LLViewerObject F64 getTotalMediaInterest() const; bool hasMedia() const; + + LLVector3 getApproximateFaceNormal(U8 face_id); protected: S32 computeLODDetail(F32 distance, F32 radius); -- GitLab From 12f038b599bf1f5e0779ac23d08d57c17e07383e Mon Sep 17 00:00:00 2001 From: Nat Goodspeed <nat@lindenlab.com> Date: Sat, 7 Nov 2009 12:49:07 -0500 Subject: [PATCH 257/306] DEV-42215: Don't zap valid g(First|Last)name with empty strings. In the --autologin case, gFirstname, gLastname were validly set from gSavedSettings, but at the last minute were overwritten with empty strings from gLoginHandler. Only perform those assignments if gLoginHandler has non-empty strings to contribute. --- indra/newview/llstartup.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 4c322810d50..2c1f468f77a 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -744,6 +744,7 @@ bool idle_startup() // We have at least some login information on a SLURL gFirstname = gLoginHandler.getFirstName(); gLastname = gLoginHandler.getLastName(); + LL_DEBUGS("LLStartup") << "STATE_FIRST: setting gFirstname, gLastname from gLoginHandler: '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL; // Show the login screen if we don't have everything show_connect_box = @@ -754,6 +755,7 @@ bool idle_startup() LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo"); gFirstname = cmd_line_login[0].asString(); gLastname = cmd_line_login[1].asString(); + LL_DEBUGS("LLStartup") << "Setting gFirstname, gLastname from gSavedSettings(\"UserLoginInfo\"): '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL; LLMD5 pass((unsigned char*)cmd_line_login[2].asString().c_str()); char md5pass[33]; /* Flawfinder: ignore */ @@ -771,6 +773,7 @@ bool idle_startup() { gFirstname = gSavedSettings.getString("FirstName"); gLastname = gSavedSettings.getString("LastName"); + LL_DEBUGS("LLStartup") << "AutoLogin: setting gFirstname, gLastname from gSavedSettings(\"First|LastName\"): '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL; gPassword = LLStartUp::loadPasswordFromDisk(); gSavedSettings.setBOOL("RememberPassword", TRUE); @@ -786,6 +789,7 @@ bool idle_startup() // a valid grid is selected gFirstname = gSavedSettings.getString("FirstName"); gLastname = gSavedSettings.getString("LastName"); + LL_DEBUGS("LLStartup") << "normal login: setting gFirstname, gLastname from gSavedSettings(\"First|LastName\"): '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL; gPassword = LLStartUp::loadPasswordFromDisk(); show_connect_box = true; } @@ -896,8 +900,15 @@ bool idle_startup() gViewerWindow->moveProgressViewToFront(); //reset the values that could have come in from a slurl - gFirstname = gLoginHandler.getFirstName(); - gLastname = gLoginHandler.getLastName(); + // DEV-42215: Make sure they're not empty -- gFirstname and gLastname + // might already have been set from gSavedSettings, and it's too bad + // to overwrite valid values with empty strings. + if (! gLoginHandler.getFirstName().empty() && ! gLoginHandler.getLastName().empty()) + { + gFirstname = gLoginHandler.getFirstName(); + gLastname = gLoginHandler.getLastName(); + LL_DEBUGS("LLStartup") << "STATE_LOGIN_CLEANUP: setting gFirstname, gLastname from gLoginHandler: '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL; + } if (show_connect_box) { -- GitLab From 7cabb9de683cd3177f9ddbe2e7af873f0c9155c9 Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Sun, 8 Nov 2009 17:24:08 +0000 Subject: [PATCH 258/306] EXT-332: Added support for local currency estimates to the Buy L$ and Buy Land floaters. We now check for a new estimatedLocalCost key from the XML-RPC server, which provides the estimated cost in the user's local currency, e.g., "US$ 10.00" or "10.00 Euros". Note: the server is not currently sending this information. The previous codepath still exists and should be unaffected. That is, we will continue to check for an estimatedCost key from the server with a value specified in US cents. We give precedence to estimatedLocalCost though and may want to remove this code once the international billing server changes go live. <lynx@lindenlab.com> HG: branch 'default' HG: changed indra/newview/llcurrencyuimanager.cpp HG: changed indra/newview/llcurrencyuimanager.h HG: changed indra/newview/llfloaterbuyland.cpp HG: changed indra/newview/skins/default/xui/en/floater_buy_land.xml --- indra/newview/llcurrencyuimanager.cpp | 121 ++++++++++++++---- indra/newview/llcurrencyuimanager.h | 9 +- indra/newview/llfloaterbuyland.cpp | 16 ++- .../skins/default/xui/en/floater_buy_land.xml | 8 +- 4 files changed, 116 insertions(+), 38 deletions(-) diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index c4bfd719991..319cbf8209c 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -76,8 +76,15 @@ class LLCurrencyUIManager::Impl bool mUserEnteredCurrencyBuy; // from website - bool mSiteCurrencyEstimated; - S32 mSiteCurrencyEstimatedCost; + + // pre-viewer 2.0, the server returned estimates as an + // integer US cents value, e.g., "1000" for $10.00 + // post-viewer 2.0, the server may also return estimates + // as a string with currency embedded, e.g., "10.00 Euros" + bool mUSDCurrencyEstimated; + S32 mUSDCurrencyEstimatedCost; + bool mLocalCurrencyEstimated; + std::string mLocalCurrencyEstimatedCost; std::string mSiteConfirm; bool mBought; @@ -101,6 +108,10 @@ class LLCurrencyUIManager::Impl void startCurrencyBuy(const std::string& password); void finishCurrencyBuy(); + + void clearEstimate(); + bool hasEstimate() const; + std::string getLocalEstimate() const; void startTransaction(TransactionType type, const char* method, LLXMLRPCValue params); @@ -126,12 +137,11 @@ LLCurrencyUIManager::Impl::Impl(LLPanel& dialog) mError(false), mUserCurrencyBuy(2000), // note, this is a default, real value set in llfloaterbuycurrency.cpp mUserEnteredCurrencyBuy(false), - mSiteCurrencyEstimated(false), - mSiteCurrencyEstimatedCost(0), mBought(false), mTransactionType(TransactionNone), mTransaction(0), mCurrencyChanged(false) { + clearEstimate(); } LLCurrencyUIManager::Impl::~Impl() @@ -141,14 +151,13 @@ LLCurrencyUIManager::Impl::~Impl() void LLCurrencyUIManager::Impl::updateCurrencyInfo() { - mSiteCurrencyEstimated = false; - mSiteCurrencyEstimatedCost = 0; + clearEstimate(); mBought = false; mCurrencyChanged = false; if (mUserCurrencyBuy == 0) { - mSiteCurrencyEstimated = true; + mLocalCurrencyEstimated = true; return; } @@ -185,9 +194,21 @@ void LLCurrencyUIManager::Impl::finishCurrencyInfo() } LLXMLRPCValue currency = result["currency"]; - mSiteCurrencyEstimated = true; - mSiteCurrencyEstimatedCost = currency["estimatedCost"].asInt(); - + + // old XML-RPC server: estimatedCost = value in US cents + mUSDCurrencyEstimated = currency["estimatedCost"].isValid(); + if (mUSDCurrencyEstimated) + { + mUSDCurrencyEstimatedCost = currency["estimatedCost"].asInt(); + } + + // newer XML-RPC server: estimatedLocalCost = local currency string + mLocalCurrencyEstimated = currency["estimatedLocalCost"].isValid(); + if (mLocalCurrencyEstimated) + { + mLocalCurrencyEstimatedCost = currency["estimatedLocalCost"].asString(); + } + S32 newCurrencyBuy = currency["currencyBuy"].asInt(); if (newCurrencyBuy != mUserCurrencyBuy) { @@ -200,17 +221,20 @@ void LLCurrencyUIManager::Impl::finishCurrencyInfo() void LLCurrencyUIManager::Impl::startCurrencyBuy(const std::string& password) { - mSiteCurrencyEstimated = false; - mSiteCurrencyEstimatedCost = 0; - mCurrencyChanged = false; - LLXMLRPCValue keywordArgs = LLXMLRPCValue::createStruct(); keywordArgs.appendString("agentId", gAgent.getID().asString()); keywordArgs.appendString( "secureSessionId", gAgent.getSecureSessionID().asString()); keywordArgs.appendInt("currencyBuy", mUserCurrencyBuy); - keywordArgs.appendInt("estimatedCost", mSiteCurrencyEstimatedCost); + if (mUSDCurrencyEstimated) + { + keywordArgs.appendInt("estimatedCost", mUSDCurrencyEstimatedCost); + } + if (mLocalCurrencyEstimated) + { + keywordArgs.appendString("estimatedLocalCost", mLocalCurrencyEstimatedCost); + } keywordArgs.appendString("confirm", mSiteConfirm); if (!password.empty()) { @@ -226,6 +250,9 @@ void LLCurrencyUIManager::Impl::startCurrencyBuy(const std::string& password) params.append(keywordArgs); startTransaction(TransactionBuy, "buyCurrency", params); + + clearEstimate(); + mCurrencyChanged = false; } void LLCurrencyUIManager::Impl::finishCurrencyBuy() @@ -270,6 +297,34 @@ void LLCurrencyUIManager::Impl::startTransaction(TransactionType type, clearError(); } +void LLCurrencyUIManager::Impl::clearEstimate() +{ + mUSDCurrencyEstimated = false; + mUSDCurrencyEstimatedCost = 0; + mLocalCurrencyEstimated = false; + mLocalCurrencyEstimatedCost = "0"; +} + +bool LLCurrencyUIManager::Impl::hasEstimate() const +{ + return (mUSDCurrencyEstimated || mLocalCurrencyEstimated); +} + +std::string LLCurrencyUIManager::Impl::getLocalEstimate() const +{ + if (mLocalCurrencyEstimated) + { + // we have the new-style local currency string + return mLocalCurrencyEstimatedCost; + } + if (mUSDCurrencyEstimated) + { + // we have the old-style USD-specific value + return "US$ " + llformat("%#.2f", mUSDCurrencyEstimatedCost / 100.0); + } + return ""; +} + bool LLCurrencyUIManager::Impl::checkTransaction() { if (!mTransaction) @@ -342,8 +397,8 @@ void LLCurrencyUIManager::Impl::currencyKey(S32 value) mUserCurrencyBuy = value; - if (mSiteCurrencyEstimated) { - mSiteCurrencyEstimated = false; + if (hasEstimate()) { + clearEstimate(); //cannot just simply refresh the whole UI, as the edit field will // get reset and the cursor will change... @@ -406,8 +461,8 @@ void LLCurrencyUIManager::Impl::updateUI() } } - mPanel.childSetTextArg("currency_est", "[LOCALAMOUNT]", "US$ " + llformat("%#.2f", mSiteCurrencyEstimatedCost / 100.0)); - mPanel.childSetVisible("currency_est", mSiteCurrencyEstimated && mUserCurrencyBuy > 0); + mPanel.childSetTextArg("currency_est", "[LOCALAMOUNT]", getLocalEstimate()); + mPanel.childSetVisible("currency_est", hasEstimate() && mUserCurrencyBuy > 0); if (mPanel.childIsEnabled("buy_btn") ||mPanel.childIsVisible("currency_est") @@ -448,18 +503,32 @@ void LLCurrencyUIManager::setZeroMessage(const std::string& message) impl.mZeroMessage = message; } -void LLCurrencyUIManager::setEstimate(int amount) +void LLCurrencyUIManager::setUSDEstimate(int amount) +{ + impl.mUSDCurrencyEstimatedCost = amount; + impl.mUSDCurrencyEstimated = true; + impl.updateUI(); + + impl.mCurrencyChanged = false; +} + +int LLCurrencyUIManager::getUSDEstimate() +{ + return impl.mUSDCurrencyEstimated ? impl.mUSDCurrencyEstimatedCost : 0; +} + +void LLCurrencyUIManager::setLocalEstimate(const std::string &amount) { - impl.mSiteCurrencyEstimatedCost = amount; - impl.mSiteCurrencyEstimated = true; + impl.mLocalCurrencyEstimatedCost = amount; + impl.mLocalCurrencyEstimated = true; impl.updateUI(); impl.mCurrencyChanged = false; } -int LLCurrencyUIManager::getEstimate() +std::string LLCurrencyUIManager::getLocalEstimate() const { - return impl.mSiteCurrencyEstimated ? impl.mSiteCurrencyEstimatedCost : 0; + return impl.getLocalEstimate(); } void LLCurrencyUIManager::prepare() @@ -490,7 +559,7 @@ void LLCurrencyUIManager::buy(const std::string& buy_msg) LLUIString msg = buy_msg; msg.setArg("[LINDENS]", llformat("%d", impl.mUserCurrencyBuy)); - msg.setArg("[LOCALAMOUNT]", "US$ " + llformat("%#.2f", impl.mSiteCurrencyEstimatedCost / 100.0)); + msg.setArg("[LOCALAMOUNT]", getLocalEstimate()); LLConfirmationManager::confirm(impl.mSiteConfirm, msg, impl, @@ -511,7 +580,7 @@ bool LLCurrencyUIManager::canCancel() bool LLCurrencyUIManager::canBuy() { return impl.mTransactionType == Impl::TransactionNone - && impl.mSiteCurrencyEstimated + && impl.hasEstimate() && impl.mUserCurrencyBuy > 0; } diff --git a/indra/newview/llcurrencyuimanager.h b/indra/newview/llcurrencyuimanager.h index 93427aed7f1..dfe027098d0 100644 --- a/indra/newview/llcurrencyuimanager.h +++ b/indra/newview/llcurrencyuimanager.h @@ -57,11 +57,16 @@ class LLCurrencyUIManager void setZeroMessage(const std::string& message); // sets the gray message to show when zero - void setEstimate(int); - int getEstimate(); + void setUSDEstimate(int); // deprecated in 2.0 + int getUSDEstimate(); // deprecated in 2.0 // the amount in US$ * 100 (in otherwords, in cents) // use set when you get this information from elsewhere + void setLocalEstimate(const std::string &local_est); + std::string getLocalEstimate() const; + // the estimated cost in the user's local currency + // for example, "US$ 10.00" or "10.00 Euros" + void prepare(); // call once after dialog is built, from postBuild() void updateUI(bool show = true); diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 36f03157904..467796b4a39 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -685,7 +685,14 @@ void LLFloaterBuyLandUI::finishWebSiteInfo() mSiteLandUseAction = landUse["action"].asString(); LLXMLRPCValue currency = result["currency"]; - mCurrency.setEstimate(currency["estimatedCost"].asInt()); + if (currency["estimatedCost"].isValid()) + { + mCurrency.setUSDEstimate(currency["estimatedCost"].asInt()); + } + if (currency["estimatedLocalCost"].isValid()) + { + mCurrency.setLocalEstimate(currency["estimatedLocalCost"].asString()); + } mSiteConfirm = result["confirm"].asString(); } @@ -733,7 +740,8 @@ void LLFloaterBuyLandUI::runWebSitePrep(const std::string& password) keywordArgs.appendInt("billableArea", mIsForGroup ? 0 : mParcelBillableArea); keywordArgs.appendInt("currencyBuy", mCurrency.getAmount()); - keywordArgs.appendInt("estimatedCost", mCurrency.getEstimate()); + keywordArgs.appendInt("estimatedCost", mCurrency.getUSDEstimate()); + keywordArgs.appendString("estimatedLocalCost", mCurrency.getLocalEstimate()); keywordArgs.appendString("confirm", mSiteConfirm); if (!password.empty()) { @@ -1217,7 +1225,7 @@ void LLFloaterBuyLandUI::refreshUI() childSetText("currency_reason", getString("not_enough_lindens", string_args)); - childSetTextArg("currency_est", "[AMOUNT2]", llformat("%#.2f", mCurrency.getEstimate() / 100.0)); + childSetTextArg("currency_est", "[LOCAL_AMOUNT]", mCurrency.getLocalEstimate()); } if (willHaveEnough) @@ -1297,7 +1305,7 @@ void LLFloaterBuyLandUI::startBuyPreConfirm() { LLStringUtil::format_map_t string_args; string_args["[AMOUNT]"] = llformat("%d", mCurrency.getAmount()); - string_args["[AMOUNT2]"] = llformat("%#.2f", mCurrency.getEstimate() / 100.0); + string_args["[LOCAL_AMOUNT]"] = mCurrency.getLocalEstimate(); action += getString("buy_for_US", string_args); } diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml index 0f710a8047b..6e0c3dfe540 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml @@ -115,7 +115,7 @@ Try selecting a smaller area. </floater.string> <floater.string name="buy_for_US"> - Buy L$ [AMOUNT] for approx. US$ [AMOUNT2], + Buy L$ [AMOUNT] for approx. [LOCAL_AMOUNT], </floater.string> <floater.string name="parcel_meters"> @@ -172,10 +172,6 @@ supports [AMOUNT2] objects name="no_parcel_selected"> (no parcel selected) </floater.string> - <floater.string - name="buy_currency"> - Buy L$ [LINDENS] for approx. US$ [USD] - </floater.string> <text type="string" length="1" @@ -667,7 +663,7 @@ This parcel is 512 m² of land. name="currency_est" top="409" width="178"> - for approx. US$ [AMOUNT2] + for approx. [LOCAL_AMOUNT] </text> <text type="string" -- GitLab From 73b1e2bf471dc7261667016825e12fc81576d350 Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Sun, 8 Nov 2009 19:38:21 +0000 Subject: [PATCH 259/306] DEV-38840: Fix the Pay Resident floater. It was failing to open due to an unknown string and the L$5 button was labelled incorrectly (it said L$1). --- .../skins/default/xui/en/floater_pay.xml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_pay.xml b/indra/newview/skins/default/xui/en/floater_pay.xml index b4becfa0225..509cffe490b 100644 --- a/indra/newview/skins/default/xui/en/floater_pay.xml +++ b/indra/newview/skins/default/xui/en/floater_pay.xml @@ -2,22 +2,29 @@ <floater legacy_header_height="18" can_minimize="false" - height="185" + height="200" layout="topleft" name="Give Money" help_topic="give_money" save_rect="true" width="225"> + <string + name="payee_group"> + Pay Group + </string> + <string + name="payee_resident"> + Pay Resident + </string> <text type="string" length="1" follows="left|top" - font="SansSerifBold" height="18" layout="topleft" left="12" name="payee_label" - top="7" + top="22" width="75"> Pay: </text> @@ -45,7 +52,6 @@ </text> <button height="23" - font="SansSerifSmall" label="L$1" label_selected="L$1" layout="topleft" @@ -55,8 +61,7 @@ width="80" /> <button height="23" - label="L$1" - font="SansSerif" + label="L$5" label_selected="L$5" layout="topleft" left_pad="15" @@ -65,7 +70,6 @@ <button height="23" label="L$10" - font="SansSerifHuge" label_selected="L$10" layout="topleft" left="25" -- GitLab From 8ea12297e2e757ad6efbeaebd3ee86c0605ce385 Mon Sep 17 00:00:00 2001 From: angela <angela@lindenlab.com> Date: Mon, 9 Nov 2009 13:34:32 +0800 Subject: [PATCH 260/306] escape from infinitive loop of fetching inventory folder with NULL uuid --- indra/newview/llinventorybridge.cpp | 1 + indra/newview/llinventorymodel.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 90e48d22ec6..c5903eb5cab 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2127,6 +2127,7 @@ void LLFolderBridge::openItem() lldebugs << "LLFolderBridge::openItem()" << llendl; LLInventoryModel* model = getInventoryModel(); if(!model) return; + if(mUUID.isNull()) return; bool fetching_inventory = model->fetchDescendentsOf(mUUID); // Only change folder type if we have the folder contents. if (!fetching_inventory) diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index baf34b42ff3..c8b9841e5dd 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1267,6 +1267,8 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) { + if(folder_id.isNull()) return false; + LLViewerInventoryCategory* cat = getCategory(folder_id); if(!cat) { -- GitLab From 4f66c87c11910a715735bdb7621526f4c5b8d01c Mon Sep 17 00:00:00 2001 From: Ramzi Linden <ramzi@lindenlab.com> Date: Mon, 9 Nov 2009 17:48:02 +0800 Subject: [PATCH 261/306] EXT-2106 I18N Nav bar: a node in panel_navigation_bar.xml cant be localized because it has no name= I18N: 2 nodes in panel_preferences_privacy.xml cant be localized because it has no name= I18N: 2 EN files menu_inspect_object_gear.xml, panel_group.xml use duplicate name= parameters from a copy/paste error L10N: rephrase for localizability in panel_preferences_advanced.xml and panel_preferences_sound.xml --- .../skins/default/xui/en/menu_inspect_object_gear.xml | 2 +- .../newview/skins/default/xui/en/panel_navigation_bar.xml | 3 ++- .../skins/default/xui/en/panel_preferences_advanced.xml | 8 ++++---- .../skins/default/xui/en/panel_preferences_privacy.xml | 2 ++ .../skins/default/xui/en/panel_preferences_sound.xml | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml index 93c53981f3d..04a247fd548 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml @@ -73,7 +73,7 @@ <menu_item_call label="Edit" layout="topleft" - name="report"> + name="edit"> <menu_item_call.on_click function="Object.Edit" /> <menu_item_call.on_enable diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 255b92844f0..a90337d31a2 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -145,7 +145,8 @@ top_delta="0" width="200" > <combo_editor - label="Search Second Life" /> + label="Search [SECOND_LIFE]" + name="search_combo_editor"/> </search_combo_box> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 613decad8d3..06f07104065 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -272,7 +272,7 @@ Avatars: width="315" /> <radio_item height="16" - label="In window" + label="In a window" layout="topleft" left_delta="175" name="1" @@ -284,13 +284,13 @@ Avatars: enabled_control="EnableVoiceChat" control_name="PushToTalkToggle" height="20" - label="Use Push-to-talk in toggle mode" + label="Toggle mode for microphone when I press the Speak trigger key:" layout="topleft" left="30" name="push_to_talk_toggle_check" width="237" top_pad="-25" - tool_tip="When in toggle mode, press and release the push-to-talk trigger to switch your microphone on and off. When not in toggle mode, the microphone is active only when the trigger is held down."/> + tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."/> <line_editor follows="top|left" control_name="PushToTalkButton" @@ -300,7 +300,7 @@ Avatars: left_delta="50" max_length="254" name="modifier_combo" - label="Push-to-talk trigger" + label="Push-to-Speak trigger" top_pad="0" width="280" /> <button diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index ce7939c00f5..acf4601bfe5 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -94,6 +94,7 @@ layout="topleft" left="30" mouse_opaque="false" + name="Logs:" top_pad="10" width="350"> Logs: @@ -184,6 +185,7 @@ layout="topleft" left_delta="0" mouse_opaque="false" + name="log_path_desc" top_pad="1" width="128" text_color="LtGray_50"> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index ba2ddd8b32a..d454b9e5c8d 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -336,7 +336,7 @@ follows="left|bottom" height="19" is_toggle="true" - label="Input / Output Devices" + label="Input/Output Devices" layout="topleft" left="165" top_pad="12" -- GitLab From 5561001c926cb0f005d54cb5e9cf4f57d5e0ba15 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Mon, 9 Nov 2009 14:24:40 +0000 Subject: [PATCH 262/306] randgauss.h isn't *really* used by the viewer - remove #include and move it to llmath with ll-header naming convention. --- indra/llmath/CMakeLists.txt | 1 + indra/newview/CMakeLists.txt | 1 - indra/newview/llvowater.cpp | 2 -- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt index 7957c32be2c..8ae643099f1 100644 --- a/indra/llmath/CMakeLists.txt +++ b/indra/llmath/CMakeLists.txt @@ -55,6 +55,7 @@ set(llmath_HEADER_FILES llplane.h llquantize.h llquaternion.h + llrandgauss.h llrect.h llsphere.h lltreenode.h diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 08e43da9e4c..649d86aaa68 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1031,7 +1031,6 @@ set(viewer_HEADER_FILES macmain.h noise.h pipeline.h - randgauss.h VertexCache.h VorbisFramework.h ) diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index e5ff62746e3..a8c4625f6ed 100644 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -55,8 +55,6 @@ const BOOL gUseRoam = FALSE; /////////////////////////////////// -#include "randgauss.h" - template<class T> inline T LERP(T a, T b, F32 factor) { return a + (b - a) * factor; -- GitLab From fbf57b442b7291b354f63f46c3bdfb1b85439866 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Mon, 9 Nov 2009 14:26:10 +0000 Subject: [PATCH 263/306] ... remove unused llrandgauss.h - because on second thoughts, there's not much wisdom in carrying probably-not-tested-for-years code around 'just in case'. --- indra/llmath/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt index 8ae643099f1..7957c32be2c 100644 --- a/indra/llmath/CMakeLists.txt +++ b/indra/llmath/CMakeLists.txt @@ -55,7 +55,6 @@ set(llmath_HEADER_FILES llplane.h llquantize.h llquaternion.h - llrandgauss.h llrect.h llsphere.h lltreenode.h -- GitLab From a492b2815a66f41bde0138444d410209b6b615f8 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Mon, 9 Nov 2009 14:41:31 +0000 Subject: [PATCH 264/306] trivial comment fix while I was there. --- indra/newview/llvoiceclient.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index 9df96d9a521..2b61086680f 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -196,7 +196,7 @@ static void updatePosition(void); void setEarLocation(S32 loc); void setVoiceVolume(F32 volume); void setMicGain(F32 volume); - void setUserVolume(const LLUUID& id, F32 volume); // set's volume for specified agent, from 0-1 (where .5 is nominal) + void setUserVolume(const LLUUID& id, F32 volume); // sets volume for specified agent, from 0-1 (where .5 is nominal) void setLipSyncEnabled(BOOL enabled); BOOL lipSyncEnabled(); -- GitLab From f8a010e4dd136aba5443b68a367fe39bd1b1ba33 Mon Sep 17 00:00:00 2001 From: angela <angela@lindenlab.com> Date: Mon, 9 Nov 2009 23:46:41 +0800 Subject: [PATCH 265/306] check for NULL UUID for friendListFolderID --- indra/newview/llfriendcard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index c9566578256..1ff2566dca2 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -519,7 +519,7 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID) } LLUUID friendListFolderID = findFriendAllSubfolderUUIDImpl(); - if (shouldBeAdded && !invModel->isCategoryComplete(friendListFolderID)) + if (friendListFolderID.notNull() && shouldBeAdded && !invModel->isCategoryComplete(friendListFolderID)) { mFriendsAllFolderCompleted = false; shouldBeAdded = false; -- GitLab From b423ea58ca2fe4f9be36fa7b3e70017bc7e8368d Mon Sep 17 00:00:00 2001 From: angela <angela@lindenlab.com> Date: Tue, 10 Nov 2009 01:04:52 +0800 Subject: [PATCH 266/306] fix xml function param problem and adding missing settings in settings.xml --- indra/newview/app_settings/settings.xml | 11 ++++++++ .../skins/default/xui/en/menu_viewer.xml | 28 ++++--------------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 6f6d5fb9796..55ff255c38e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3598,6 +3598,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>HideSelectedObjects</key> + <map> + <key>Comment</key> + <string>Hide Selected Objects</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>HtmlHelpLastPage</key> <map> <key>Comment</key> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 66c9060b06d..dbc9601680c 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -1932,18 +1932,15 @@ function="Advanced.ToggleConsole" parameter="debug" /> </menu_item_check> - <menu_item_check + <menu_item_call label="Notifications Console" layout="topleft" name="Notifications" shortcut="control|shift|5"> - <menu_item_check.on_check - function="Advanced.CheckConsole" - parameter="notifications" /> - <menu_item_check.on_click - function="Floater.Show" + <menu_item_call.on_click + function="Floater.Toggle" parameter="notifications_console" /> - </menu_item_check> + </menu_item_call> <menu_item_check label="Texture Size Console" layout="topleft" @@ -1994,19 +1991,6 @@ function="Advanced.ToggleConsole" parameter="memory view" /> </menu_item_check> - <menu_item_check - label="Notifications Console" - layout="topleft" - name="Notifications" - shortcut="control|shift|5" - use_mac_ctrl="true"> - <menu_item_check.on_check - function="Advanced.CheckConsole" - parameter="notifications" /> - <menu_item_check.on_click - function="Floater.Show" - parameter="notifications_console" /> - </menu_item_check> <menu_item_separator layout="topleft" /> <menu_item_call @@ -2558,10 +2542,10 @@ name="Texture Atlas"> <menu_item_check.on_check function="CheckControl" - parameter="TextureAtlas" /> + parameter="EnableTextureAtlas" /> <menu_item_check.on_click function="ToggleControl" - parameter="TextureAtlas" /> + parameter="EnableTextureAtlas" /> </menu_item_check> <menu_item_check label="Render Attached Lights" -- GitLab From e9d09879d6aed037710f4f023ca7e01195a42bf8 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Mon, 9 Nov 2009 17:06:49 +0000 Subject: [PATCH 267/306] Don't have LLVoiceClient manually poke the nearbychatbar's 'speak' button's visual state as a special case - all speak buttons will soon know how to poll (sigh) the ptt state, with more reliability. --- indra/newview/llnearbychatbar.cpp | 5 ----- indra/newview/llnearbychatbar.h | 1 - indra/newview/llvoiceclient.cpp | 2 -- 3 files changed, 8 deletions(-) diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index bcb4edd7c18..d54545971bb 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -695,11 +695,6 @@ LLWString LLNearbyChatBar::stripChannelNumber(const LLWString &mesg, S32* channe } } -void LLNearbyChatBar::setPTTState(bool state) -{ - mSpeakBtn->setSpeakBtnToggleState(state); -} - void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel) { LLMessageSystem* msg = gMessageSystem; diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index aa25b6aa685..56ee706a974 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -96,7 +96,6 @@ class LLNearbyChatBar std::string getCurrentChat(); virtual BOOL handleKeyHere( KEY key, MASK mask ); - void setPTTState(bool state); static void startChat(const char* line); static void stopChat(); diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index df5481c874c..5e7afe19137 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -5791,7 +5791,6 @@ bool LLVoiceClient::getMuteMic() const void LLVoiceClient::setUserPTTState(bool ptt) { mUserPTTState = ptt; - if (LLNearbyChatBar::instanceExists()) LLNearbyChatBar::getInstance()->setPTTState(ptt); } bool LLVoiceClient::getUserPTTState() @@ -5802,7 +5801,6 @@ bool LLVoiceClient::getUserPTTState() void LLVoiceClient::toggleUserPTTState(void) { mUserPTTState = !mUserPTTState; - if (LLNearbyChatBar::instanceExists()) LLNearbyChatBar::getInstance()->setPTTState(mUserPTTState); } void LLVoiceClient::setVoiceEnabled(bool enabled) -- GitLab From 7804990998c1cc4cb0faa5fd7b37b3a22321c3b6 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Mon, 9 Nov 2009 17:07:36 +0000 Subject: [PATCH 268/306] remove #include no longer needed. --- indra/newview/llvoiceclient.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 5e7afe19137..f303f14843d 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -68,9 +68,6 @@ #include "llfloaterfriends.h" //VIVOX, inorder to refresh communicate panel #include "llfloaterchat.h" // for LLFloaterChat::addChat() -// for Talk Button's state updating -#include "llnearbychatbar.h" - // for base64 decoding #include "apr_base64.h" -- GitLab From e9048b17792b91e6bf8a05692d859ea9c94011d6 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Mon, 9 Nov 2009 17:13:37 +0000 Subject: [PATCH 269/306] Central-source the authoritative state of mic openness. --- indra/newview/llbottomtray.cpp | 1 - indra/newview/llspeakbutton.cpp | 9 +++++++++ indra/newview/llspeakbutton.h | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index a17ba79078b..e5cc2fce881 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -50,7 +50,6 @@ LLBottomTray::LLBottomTray(const LLSD&) mSpeakBtn(NULL), mNearbyChatBar(NULL), mToolbarStack(NULL) - { mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index cd765b0338f..312d7050b91 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -62,6 +62,15 @@ LLSpeakButton::Params::Params() // See widgets/talk_button.xml } +void LLSpeakButton::draw() +{ + // gVoiceClient is the authoritative global source of info regarding our open-mic state, we merely reflect that state. + bool openmic = gVoiceClient->getUserPTTState(); + mSpeakBtn->setToggleState(openmic); + llinfos << "mic state " << int(openmic) << llendl; + LLUICtrl::draw(); +} + LLSpeakButton::LLSpeakButton(const Params& p) : LLUICtrl(p) , mPrivateCallPanel(NULL) diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h index f59ded21333..48a4d5880b2 100644 --- a/indra/newview/llspeakbutton.h +++ b/indra/newview/llspeakbutton.h @@ -61,6 +61,7 @@ class LLSpeakButton : public LLUICtrl }; /*virtual*/ ~LLSpeakButton(); + /*virtual*/ void draw(); void setSpeakBtnToggleState(bool state); -- GitLab From c9937716aa3a1f7aac0e93fc1d58488d02d30e6e Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Mon, 9 Nov 2009 12:26:27 -0500 Subject: [PATCH 270/306] EXT-1866 : Inventory Side Panel Various trivial UI behavioral changes for disabling/enabling old/new floaters when bringing up properties of objects/items. This is to make the UI behavior compliant with the Inventory Panel MVP. Also added missing sidepanel_task_info.xml (although this is not actually enabled for viewer2.0). --- indra/newview/llinventorybridge.cpp | 4 + indra/newview/llpanelobjectinventory.cpp | 4 +- indra/newview/llviewermenu.cpp | 3 + .../default/xui/en/sidepanel_task_info.xml | 547 ++++++++++++++++++ 4 files changed, 557 insertions(+), 1 deletion(-) create mode 100644 indra/newview/skins/default/xui/en/sidepanel_task_info.xml diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 90e48d22ec6..84e0f58c4b1 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -284,7 +284,10 @@ void LLInvFVBridge::showProperties() key["id"] = mUUID; LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); + // Disable old properties floater; this is replaced by the sidepanel. + /* LLFloaterReg::showInstance("properties", mUUID); + */ } void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) @@ -3912,6 +3915,7 @@ void LLObjectBridge::openItem() key["id"] = mUUID; LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); + // Disable old properties floater; this is replaced by the sidepanel. /* LLFloaterReg::showInstance("properties", mUUID); */ diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 79b33e29f52..a5e9407a41f 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -165,7 +165,9 @@ void LLTaskInvFVBridge::showProperties() key["object"] = mPanel->getTaskUUID(); key["id"] = mUUID; LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); - + + + // Disable old properties floater; this is replaced by the sidepanel. /* LLFloaterProperties* floater = LLFloaterReg::showTypedInstance<LLFloaterProperties>("properties", mUUID); if (floater) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 07d073c3a9b..4d4ad1c0221 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2634,6 +2634,8 @@ void handle_object_edit() void handle_object_inspect() { + // Disable sidepanel inspector + /* LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); LLViewerObject* selected_objectp = selection->getFirstRootObject(); if (selected_objectp) @@ -2642,6 +2644,7 @@ void handle_object_inspect() key["task"] = "task"; LLSideTray::getInstance()->showPanel("sidepanel_inventory", key); } + */ LLFloaterReg::showInstance("inspect", LLSD()); } diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml new file mode 100644 index 00000000000..8eb22541126 --- /dev/null +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -0,0 +1,547 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + auto_tile="true" + height="570" + layout="topleft" + name="object properties" + help_topic="object_properties" + save_rect="true" + title="Object Properties" + width="333"> + <panel.string + name="text deed continued"> + Deed + </panel.string> + <panel.string + name="text deed"> + Deed + </panel.string> + <panel.string + name="text modify info 1"> + You can modify this object + </panel.string> + <panel.string + name="text modify info 2"> + You can modify these objects + </panel.string> + <panel.string + name="text modify info 3"> + You can't modify this object + </panel.string> + <panel.string + name="text modify info 4"> + You can't modify these objects + </panel.string> + <panel.string + name="text modify warning"> + This object has linked parts + </panel.string> + <panel.string + name="Cost Default"> + Price: L$ + </panel.string> + <panel.string + name="Cost Total"> + Total Price: L$ + </panel.string> + <panel.string + name="Cost Per Unit"> + Price Per: L$ + </panel.string> + <panel.string + name="Cost Mixed"> + Mixed Price + </panel.string> + <panel.string + name="Sale Mixed"> + Mixed Sale + </panel.string> + <button + follows="top|right" + height="25" + image_overlay="BackArrow_Off" + layout="topleft" + name="back_btn" + picture_style="true" + right="-5" + tab_stop="false" + top="0" + width="25" /> + <panel + follows="all" + height="500" + label="" + layout="topleft" + left="5" + help_topic="" + top="30" + border="1" + width="313"> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="Name:" + top_pad="5" + width="90"> + Name: + </text> + <line_editor + follows="left|top|right" + height="19" + layout="topleft" + left_pad="0" + max_length="63" + name="Object Name" + select_on_focus="true" + top_delta="0" + width="170" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="10" + name="Description:" + top_pad="3" + width="90"> + Description: + </text> + <line_editor + follows="left|top|right" + height="19" + layout="topleft" + left_pad="0" + max_length="127" + name="Object Description" + select_on_focus="true" + top_delta="0" + width="170" /> + <text + type="string" + left="10" + length="1" + follows="left|top" + height="19" + layout="topleft" + name="Creator:" + width="90"> + Creator: + </text> + <text + type="string" + length="1" + follows="left|top" + left_pad="0" + height="19" + layout="topleft" + name="Creator Name" + width="175"> + Esbee Linden + </text> + <text + type="string" + length="1" + left="10" + follows="left|top" + height="19" + layout="topleft" + name="Owner:" + width="90"> + Owner: + </text> + <text + type="string" + length="1" + follows="left|top" + height="19" + layout="topleft" + name="Owner Name" + left_pad="0" + width="175"> + Erica Linden + </text> + <text + type="string" + length="1" + follows="left|top" + layout="topleft" + left="10" + height="18" + name="Group:" + top_pad="4" + width="75"> + Group: + </text> + <button + follows="top|left" + height="10" + image_disabled="Activate_Checkmark" + image_selected="Activate_Checkmark" + image_unselected="Activate_Checkmark" + image_color="White_50" + layout="topleft" + left_pad="0" + top_delta="0" + name="button set group" + picture_style="true" + tab_stop="false" + tool_tip="Choose a group to share this object's permissions" + width="10" /> + <name_box + follows="left|top" + height="18" + initial_value="Loading..." + layout="topleft" + left_pad="5" + top_delta="-1" + name="Group Name Proxy" + width="150" /> + <button + follows="top|left" + font="SansSerifSmall" + height="20" + label="Deed" + label_selected="Deed" + layout="topleft" + name="button deed" + top_pad="0" + left="100" + tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer." + width="80" /> + <check_box + height="19" + follows="left|top" + label="Share" + layout="topleft" + name="checkbox share with group" + tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions." + left_pad="3" + width="100" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + top_pad="15" + left="10" + name="label click action" + width="90"> + Click to: + </text> + <combo_box + follows="left|top" + height="20" + layout="topleft" + name="clickaction" + width="168" + left_pad="0"> + <combo_box.item + label="Touch (default)" + name="Touch/grab(default)" + value="Touch/grab (default)" /> + <combo_box.item + label="Sit on object" + name="Sitonobject" + value="Sit on object" /> + <combo_box.item + label="Buy object" + name="Buyobject" + value="Buy object" /> + <combo_box.item + label="Pay object" + name="Payobject" + value="Pay object" /> + <combo_box.item + label="Open" + name="Open" + value="Open" /> + </combo_box> + <check_box + height="16" + top_pad="15" + label="For Sale:" + layout="topleft" + name="checkbox for sale" + left="10" + width="90" /> +<!-- NEW SALE TYPE COMBO BOX --> + <combo_box + left_pad="0" + layout="topleft" + follows="left|top" + allow_text_entry="false" + height="20" + intial_value="2" + max_chars="20" + mouse_opaque="true" + name="sale type" + width="158"> + <combo_box.item + name="Copy" + label="Copy" + value="2" /> + <combo_box.item + name="Contents" + label="Contents" + value="3" /> + <combo_box.item + name="Original" + label="Original" + value="1" /> + </combo_box> +<!-- NEW PRICE SPINNER --> + <spinner + follows="left|top" + decimal_digits="0" + increment="1" + top_pad="8" + left="100" + control_name="Edit Cost" + name="Edit Cost" + label="Price: L$" + label_width="65" + width="150" + min_val="1" + height="20" + max_val="999999999" /> + <check_box + height="15" + width="110" + top_pad="3" + label="Show in search" + layout="topleft" + left="100" + name="search_check" + tool_tip="Let people see this object in search results" /> + <panel + border="false" + follows="left|top" + layout="topleft" + mouse_opaque="false" + background_visible="true" + bg_alpha_color="DkGray" + name="perms_build" + left="0" + top="241" + height="120" + width="278"> + <text + type="string" + length="1" + left="10" + top_pad="9" + text_color="EmphasisColor" + height="16" + follows="left|top|right" + layout="topleft" + name="perm_modify" + width="250"> + You can modify this object + </text> + <text + type="string" + follows="left|top" + name="Anyone can:" + width="250" + left="10"> + Anyone: + </text> + <check_box + height="19" + label="Move" + layout="topleft" + name="checkbox allow everyone move" + left="15" + width="85" /> + <check_box + height="19" + label="Copy" + layout="topleft" + left_pad="0" + name="checkbox allow everyone copy" + width="90" /> + <text + type="string" + follows="left|top" + height="19" + name="Next owner can:" + width="250" + left="10"> + Next owner: + </text> + <check_box + follows="left|top|right" + label="Modify" + layout="topleft" + left="15" + name="checkbox next owner can modify" + width="85" /> + <check_box + follows="left|top|right" + height="19" + label="Copy" + layout="topleft" + left_pad="0" + name="checkbox next owner can copy" + width="90" /> + <check_box + follows="left|top|right" + height="19" + label="Transfer" + layout="topleft" + name="checkbox next owner can transfer" + left_pad="0" + top_delta="0" + tool_tip="Next owner can give away or resell this object" + width="90" /> + <text + type="string" + text_color="EmphasisColor" + length="1" + top_pad="5" + follows="left|top" + layout="topleft" + left="10" + name="B:" + height="10" + width="45"> + B: + </text> + <text + type="string" + text_color="White" + length="1" + follows="left|top" + layout="topleft" + left_pad="0" + name="O:" + height="10" + width="44"> + O: + </text> + <text + type="string" + text_color="EmphasisColor" + length="1" + follows="left|top" + layout="topleft" + left_pad="0" + name="G:" + height="10" + width="43"> + G: + </text> + <text + type="string" + text_color="White" + length="1" + follows="left|top" + left_pad="0" + layout="topleft" + name="E:" + height="10" + width="43"> + E: + </text> + <text + type="string" + text_color="EmphasisColor" + length="1" + follows="left|top" + layout="topleft" + left_pad="0" + name="N:" + height="10" + width="48"> + N: + </text> + <text + type="string" + text_color="White" + length="1" + follows="left|top" + layout="topleft" + left_pad="0" + name="F:" + height="10" + width="50"> + F: + </text> + </panel> + </panel> + <panel + height="25" + layout="bottomright" + help_topic="button_tab" + name="button_panel" + left="5" + bottom="5" + width="313"> + <button + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Edit" + layout="topleft" + left="0" + name="edit_btn" + top="0" + width="50" /> + <button + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Open" + layout="topleft" + left_pad="5" + name="open_btn" + top="0" + width="60" /> + <button + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Pay" + layout="topleft" + left_pad="5" + name="pay_btn" + top="0" + width="50" /> + <button + follows="bottom|left" + font="SansSerifSmallBold" + height="25" + label="Buy" + layout="topleft" + left_pad="5" + name="buy_btn" + top="0" + width="60" /> + <button + follows="bottom|right" + font="SansSerifSmallBold" + height="25" + label="Cancel" + layout="topleft" + name="cancel_btn" + right="-1" + top="0" + width="70" /> + <button + follows="bottom|right" + font="SansSerifSmallBold" + height="25" + label="Save" + layout="topleft" + name="save_btn" + left_pad="-135" + top="0" + width="60" /> + </panel> +</panel> \ No newline at end of file -- GitLab From 56841bb2118184aa0a0c2b2a8bc52d2b593cc0c5 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Mon, 9 Nov 2009 17:45:53 +0000 Subject: [PATCH 271/306] don't have the 'speak' button be, technically, a toggle button - we'll be managing its state rather manually, not necessarily conforming to 'toggle' semantics. --- indra/newview/skins/default/xui/en/widgets/talk_button.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml index d9f39b69372..1d8257fbc8a 100644 --- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml +++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml @@ -11,7 +11,6 @@ label_selected="Speak" font="SansSerifSmall" tab_stop="false" - is_toggle="true" /> <show_button name="right" -- GitLab From 8b9c031f596280f79d06f688c2f654d7ec07a7d0 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Mon, 9 Nov 2009 17:51:21 +0000 Subject: [PATCH 272/306] Smarter mildly-refactored voice-toggle state management. --- indra/newview/llspeakbutton.cpp | 15 ++++++----- indra/newview/llspeakbutton.h | 6 ++--- indra/newview/llvoiceclient.cpp | 45 ++++++++++++++------------------- indra/newview/llvoiceclient.h | 1 + 4 files changed, 30 insertions(+), 37 deletions(-) diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index 312d7050b91..b2c0fcdaf2a 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -93,7 +93,8 @@ LLSpeakButton::LLSpeakButton(const Params& p) addChild(mSpeakBtn); LLTransientFloaterMgr::getInstance()->addControlView(mSpeakBtn); - mSpeakBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_SpeakBtn, this)); + mSpeakBtn->setMouseDownCallback(boost::bind(&LLSpeakButton::onMouseDown_SpeakBtn, this)); + mSpeakBtn->setMouseUpCallback(boost::bind(&LLSpeakButton::onMouseUp_SpeakBtn, this)); mSpeakBtn->setToggleState(FALSE); LLButton::Params show_params = p.show_button; @@ -131,15 +132,15 @@ LLSpeakButton::~LLSpeakButton() { } -void LLSpeakButton::setSpeakBtnToggleState(bool state) +void LLSpeakButton::onMouseDown_SpeakBtn() { - mSpeakBtn->setToggleState(state); + bool down = true; + gVoiceClient->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk } - -void LLSpeakButton::onClick_SpeakBtn() +void LLSpeakButton::onMouseUp_SpeakBtn() { - bool speaking = mSpeakBtn->getToggleState(); - gVoiceClient->setUserPTTState(speaking); + bool down = false; + gVoiceClient->inputUserControlState(down); } void LLSpeakButton::onClick_ShowBtn() diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h index 48a4d5880b2..e213c562dd8 100644 --- a/indra/newview/llspeakbutton.h +++ b/indra/newview/llspeakbutton.h @@ -45,7 +45,6 @@ class LLOutputMonitorCtrl; * clicked. */ class LLSpeakButton : public LLUICtrl - { public: @@ -63,13 +62,12 @@ class LLSpeakButton : public LLUICtrl /*virtual*/ ~LLSpeakButton(); /*virtual*/ void draw(); - void setSpeakBtnToggleState(bool state); - protected: friend class LLUICtrlFactory; LLSpeakButton(const Params& p); - void onClick_SpeakBtn(); + void onMouseDown_SpeakBtn(); + void onMouseUp_SpeakBtn(); void onClick_ShowBtn(); diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index f303f14843d..39d4bb0c029 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -5925,8 +5925,6 @@ void LLVoiceClient::setMicGain(F32 volume) void LLVoiceClient::keyDown(KEY key, MASK mask) { -// LL_DEBUGS("Voice") << "key is " << LLKeyboard::stringFromKey(key) << LL_ENDL; - if (gKeyboard->getKeyRepeated(key)) { // ignore auto-repeat keys @@ -5935,44 +5933,39 @@ void LLVoiceClient::keyDown(KEY key, MASK mask) if(!mPTTIsMiddleMouse) { - if(mPTTIsToggle) - { - if(key == mPTTKey) - { - toggleUserPTTState(); - } - } - else if(mPTTKey != KEY_NONE) - { - setUserPTTState(gKeyboard->getKeyDown(mPTTKey)); - } + bool down = (mPTTKey != KEY_NONE) + && gKeyboard->getKeyDown(mPTTKey); + inputUserControlState(down); } } void LLVoiceClient::keyUp(KEY key, MASK mask) { if(!mPTTIsMiddleMouse) { - if(!mPTTIsToggle && (mPTTKey != KEY_NONE)) + bool down = (mPTTKey != KEY_NONE) + && gKeyboard->getKeyDown(mPTTKey); + inputUserControlState(down); + } +} +void LLVoiceClient::inputUserControlState(bool down) +{ + if(mPTTIsToggle) + { + if(down) // toggle open-mic state on 'down' { - setUserPTTState(gKeyboard->getKeyDown(mPTTKey)); + toggleUserPTTState(); } } + else // set open-mic state as an absolute + { + setUserPTTState(down); + } } void LLVoiceClient::middleMouseState(bool down) { if(mPTTIsMiddleMouse) { - if(mPTTIsToggle) - { - if(down) - { - toggleUserPTTState(); - } - } - else - { - setUserPTTState(down); - } + inputUserControlState(down); } } diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index 2b61086680f..347fae6156b 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -188,6 +188,7 @@ static void updatePosition(void); void setUserPTTState(bool ptt); bool getUserPTTState(); void toggleUserPTTState(void); + void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs void setVoiceEnabled(bool enabled); static bool voiceEnabled(); void setUsePTT(bool usePTT); -- GitLab From 0777c177525c8ff2889e9cd5f06877de3c5f9f31 Mon Sep 17 00:00:00 2001 From: Tofu Linden <tofu.linden@lindenlab.com> Date: Mon, 9 Nov 2009 17:54:40 +0000 Subject: [PATCH 273/306] remove debug spew. --- indra/newview/llspeakbutton.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index b2c0fcdaf2a..d441762fa6f 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -67,7 +67,6 @@ void LLSpeakButton::draw() // gVoiceClient is the authoritative global source of info regarding our open-mic state, we merely reflect that state. bool openmic = gVoiceClient->getUserPTTState(); mSpeakBtn->setToggleState(openmic); - llinfos << "mic state " << int(openmic) << llendl; LLUICtrl::draw(); } -- GitLab From 1d7abc99f007a1c37bb806a4bbda7c87153b0714 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Mon, 9 Nov 2009 10:05:06 -0800 Subject: [PATCH 274/306] Fixed crash on hovering over debug rendering menu due to texture atlas. --- indra/newview/skins/default/xui/en/menu_viewer.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 633c258ecc4..215a25ffdab 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2540,10 +2540,10 @@ name="Texture Atlas"> <menu_item_check.on_check function="CheckControl" - parameter="TextureAtlas" /> + parameter="EnableTextureAtlas" /> <menu_item_check.on_click function="ToggleControl" - parameter="TextureAtlas" /> + parameter="EnableTextureAtlas" /> </menu_item_check> <menu_item_check label="Render Attached Lights" -- GitLab From a9b16734a1690551cc6277dc419dcb8629f4ddd1 Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Mon, 9 Nov 2009 19:28:14 +0000 Subject: [PATCH 275/306] DEV-41317 DEV-41318: Enabled the Call button in the Profile panel. I've added a new LLAvatarActions::startCall() method to make it easy to start a new P2P call. The Resident Profile "Call" button is now hooked up to this. I've also put back the "Call" menu in the avatar popup menu and hooked this up too. While I was there I noticed that the "IM" popup menu code could all be removed in favor of a call to LLAvatarActions::startIM(). --- indra/newview/llavataractions.cpp | 32 +++++++++++++++++++ indra/newview/llavataractions.h | 10 ++++++ indra/newview/llviewermenu.cpp | 32 ++++++++----------- .../skins/default/xui/en/panel_profile.xml | 1 - 4 files changed, 56 insertions(+), 19 deletions(-) diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 3fc37aa3d50..dae4296a82e 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -185,6 +185,38 @@ void LLAvatarActions::startIM(const LLUUID& id) make_ui_sound("UISndStartIM"); } +// static +void LLAvatarActions::startCall(const LLUUID& id) +{ + if (id.isNull() || isCalling(id)) + { + return; + } + + std::string name; + gCacheName->getFullName(id, name); + LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); + if (session_id != LLUUID::null) + { + // always open IM window when connecting to voice + LLIMFloater::show(session_id); + gIMMgr->startCall(session_id); + } + make_ui_sound("UISndStartIM"); +} + +// static +bool LLAvatarActions::isCalling(const LLUUID &id) +{ + if (id.isNull()) + { + return false; + } + + LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, id); + return (LLIMModel::getInstance()->findIMSession(session_id) != NULL); +} + // static void LLAvatarActions::startConference(const std::vector<LLUUID>& ids) { diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 512f673b432..0ec20ae3572 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -66,6 +66,11 @@ class LLAvatarActions */ static void startIM(const LLUUID& id); + /** + * Start an avatar-to-avatar voice call with another user + */ + static void startCall(const LLUUID& id); + /** * Start conference chat with the given avatars. */ @@ -96,6 +101,11 @@ class LLAvatarActions */ static bool isBlocked(const LLUUID& id); + /** + * Return true if the avatar is in a P2P voice call with a given user + */ + static bool isCalling(const LLUUID &id); + /** * Invite avatar to a group. */ diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 07d073c3a9b..b086e6d0553 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -6249,25 +6249,20 @@ class LLAvatarSendIM : public view_listener_t LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); if(avatar) { - std::string name("IM"); - LLNameValue *first = avatar->getNVPair("FirstName"); - LLNameValue *last = avatar->getNVPair("LastName"); - if (first && last) - { - name.assign( first->getString() ); - name.append(" "); - name.append( last->getString() ); - } + LLAvatarActions::startIM(avatar->getID()); + } + return true; + } +}; - //EInstantMessage type = have_agent_callingcard(gLastHitObjectID) - // ? IM_SESSION_ADD : IM_SESSION_CARDLESS_START; - LLUUID session_id = gIMMgr->addSession(name, - IM_NOTHING_SPECIAL, - avatar->getID()); - if (session_id != LLUUID::null) - { - LLIMFloater::show(session_id); - } +class LLAvatarCall : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); + if(avatar) + { + LLAvatarActions::startCall(avatar->getID()); } return true; } @@ -7938,6 +7933,7 @@ void initialize_menus() view_listener_t::addMenu(new LLAvatarGiveCard(), "Avatar.GiveCard"); commit.add("Avatar.Eject", boost::bind(&handle_avatar_eject, LLSD())); view_listener_t::addMenu(new LLAvatarSendIM(), "Avatar.SendIM"); + view_listener_t::addMenu(new LLAvatarCall(), "Avatar.Call"); view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse"); view_listener_t::addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend"); diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index a0055383b1c..0f5e96416df 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -294,7 +294,6 @@ left_pad="5" width="45" /> <button - enabled="false" follows="bottom|left" height="19" label="Call" -- GitLab From e477a74feb21c4ddcb077c7256457b44e69fba24 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Mon, 9 Nov 2009 12:14:29 -0800 Subject: [PATCH 276/306] Better fix for DEV-42153. --- indra/newview/llvovolume.cpp | 39 +++++++++--------------------------- 1 file changed, 10 insertions(+), 29 deletions(-) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 021fc746488..09769d5e80a 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1640,38 +1640,19 @@ bool LLVOVolume::hasMedia() const LLVector3 LLVOVolume::getApproximateFaceNormal(U8 face_id) { - LLVector3 result = LLVector3::zero; - - LLFace* facep = mDrawable->getFace(face_id); - if(facep) - { - LLStrider<LLVector3> verticesp; - LLStrider<LLVector3> normalsp; - LLStrider<LLVector2> texCoordsp; - LLStrider<U16> indicesp; - S32 index_offset; - index_offset = facep->getGeometry(verticesp,normalsp,texCoordsp, indicesp); - - if(index_offset != -1 && (normalsp.get() != NULL)) + LLVolume* volume = getVolume(); + LLVector3 result; + + if (volume && face_id < volume->getNumVolumeFaces()) + { + const LLVolumeFace& face = volume->getVolumeFace(face_id); + for (S32 i = 0; i < face.mVertices.size(); ++i) { - U16 count = facep->getGeomCount(); - U16 i; - - for(i=0; i < count; i++) - { - LLVector3 normal = *normalsp++; -// llinfos << "adding " << normal << llendl; - result += normal; - } + result += face.mVertices[i].mNormal; } - } - - if(!result.isNull()) - { -// llinfos << "before conversion: " << result << llendl; + result = volumeDirectionToAgent(result); - result.normalize(); -// llinfos << "after conversion: " << result << llendl; + result.normVec(); } return result; -- GitLab From ca0d3966dfed4a4188243e3ffe12b18e410e860b Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Mon, 9 Nov 2009 20:18:46 +0000 Subject: [PATCH 277/306] DEV-41358: Renamed the title of the search floater to be "Find". As requested by the search team. --- indra/newview/skins/default/xui/en/floater_search.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index f7ba719dc26..edc1fb88385 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -10,7 +10,7 @@ help_topic="floater_search" save_rect="true" single_instance="true" - title="SEARCH [SECOND_LIFE]" + title="FIND" width="620"> <floater.string name="search_url"> -- GitLab From 75bdd2ff321032a3a9d4e814d6067088d48cafab Mon Sep 17 00:00:00 2001 From: "Nyx (Neal Orman)" <nyx@lindenlab.com> Date: Mon, 9 Nov 2009 16:41:16 -0500 Subject: [PATCH 278/306] EXT-2326 Editing appearance causes too many texture callbacks stalls the viewer problem was caused by triggering updateMeshTextures() every time visual params or textures were changed on your base avatar object. The latest structure makes the parameters and textures in the wearables authoritative, causing them to be copied to the avatar on a regular basis. This resulted in way too many callbacks to be registered while waiting for baked textures to be uploaded. Fixed by removing many calls to updateMeshTextures() and ensuring that it gets called every time an appropriate param or texture actually changes, or a wearable gets added/removed. This appears to cut the number of callbacks to a reasonable level. Code reviewed by Bigpapi. --- indra/newview/lltexlayerparams.cpp | 2 -- indra/newview/llvoavatar.cpp | 1 - indra/newview/llvoavatarself.cpp | 14 +------------- indra/newview/llwearable.cpp | 4 +--- 4 files changed, 2 insertions(+), 19 deletions(-) diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp index 74e0fa077e3..b744722f4cd 100644 --- a/indra/newview/lltexlayerparams.cpp +++ b/indra/newview/lltexlayerparams.cpp @@ -183,7 +183,6 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL set_by_user) } mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user); mTexLayer->invalidateMorphMasks(); - mAvatar->updateMeshTextures(); } } } @@ -479,7 +478,6 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL set_by_user) if (mTexLayer) { mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), set_by_user); - mAvatar->updateMeshTextures(); } } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index a6f20922d91..16bd74f7989 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -5377,7 +5377,6 @@ void LLVOAvatar::updateSexDependentLayerSets( BOOL set_by_user ) invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, set_by_user ); invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, set_by_user ); invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, set_by_user ); - updateMeshTextures(); } //----------------------------------------------------------------------------- diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 7a830707702..a2203ba2ea8 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -757,19 +757,7 @@ void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, BOOL set_b return; } - LLTexLayerSet* layer_set = getLayerSet((ETextureIndex)te); - if (layer_set) - { - invalidateComposite(layer_set, set_by_user); - } - setTEImage(te, image); - updateMeshTextures(); - - if (gAgent.cameraCustomizeAvatar()) - { - LLVisualParamHint::requestHintUpdates(); - } } //virtual @@ -1377,6 +1365,7 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_u ETextureIndex baked_te = getBakedTE( layerset ); setTEImage( baked_te, LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR) ); layerset->requestUpload(); + updateMeshTextures(); } } @@ -1386,7 +1375,6 @@ void LLVOAvatarSelf::invalidateAll() { invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE); } - updateMeshTextures(); } //----------------------------------------------------------------------------- diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 2b4861ce4fe..3185ee45bfe 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -674,8 +674,6 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater avatar->updateSexDependentLayerSets( set_by_user ); } - avatar->updateMeshTextures(); - // if( set_by_user ) // { // gAgent.sendAgentSetAppearance(); @@ -719,7 +717,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL set_by_user ) } avatar->updateVisualParams(); - avatar->updateMeshTextures(); + avatar->wearableUpdated(type); // if( set_by_user ) // { -- GitLab From a54192db4bcdb8f0241c9c1082c5228d1694887c Mon Sep 17 00:00:00 2001 From: Loren Shih <seraph@lindenlab.com> Date: Mon, 9 Nov 2009 16:57:17 -0500 Subject: [PATCH 279/306] For EXT-2335 Diagnose warning spam: "LLInventoryPanel::buildNewViews called with invalid objectp->mType" Trivial fix to just ignore reading in items that have unknown/none asset type. --- indra/newview/llinventorymodel.cpp | 16 ++++++++++++---- indra/newview/llinventorypanel.cpp | 4 ++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index baf34b42ff3..b41695fd341 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1823,17 +1823,25 @@ void LLInventoryModel::addCategory(LLViewerInventoryCategory* category) void LLInventoryModel::addItem(LLViewerInventoryItem* item) { //llinfos << "LLInventoryModel::addItem()" << llendl; + + + // This can happen if assettype enums change. This can be a backwards compatibility issue + // in some viewer prototypes prior to when the AT_LINK enum changed from 23 to 24. + if ((item->getType() == LLAssetType::AT_NONE) + || LLAssetType::lookup(item->getType()) == LLAssetType::badLookup()) + { + llwarns << "Got bad asset type for item ( name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ), ignoring." << llendl; + return; + } if(item) { // This condition means that we tried to add a link without the baseobj being in memory. // The item will show up as a broken link. if (item->getIsBrokenLink()) { - llwarns << "Add link item without baseobj present ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << llendl; -// llassert_always(FALSE); // DO NOT MERGE THIS IN. This is an AVP debugging line. If this line triggers, it means that you just loaded in a broken link. Unless that happens because you actually deleted a baseobj without deleting the link, it's indicative of a serious problem (likely with your inventory) and should be diagnosed. + llinfos << "Adding broken link ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << llendl; } mItemMap[item->getUUID()] = item; - //mInventory[item->getUUID()] = item; } } @@ -2175,7 +2183,7 @@ bool LLInventoryModel::loadSkeleton( // This can happen if the linked object's baseobj is removed from the cache but the linked object is still in the cache. if (item->getIsBrokenLink()) { - llinfos << "Attempted to cached link item without baseobj present ( itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) " << llendl; + llinfos << "Attempted to add cached link item without baseobj present ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ). Ignoring and invalidating " << cat->getName() << " . " << llendl; invalid_categories.insert(cit->second); continue; } diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 7f69ce9641e..9a71e53441e 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -371,7 +371,7 @@ void LLInventoryPanel::modelChanged(U32 mask) // this object was probably moved, check its parent if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE) { - llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << llendl; + llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << " for model (Name :" << model_item->getName() << " )" << llendl; } LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID()); @@ -472,7 +472,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id) if (objectp->getType() <= LLAssetType::AT_NONE || objectp->getType() >= LLAssetType::AT_COUNT) { - lldebugs << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << + llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() << llendl; return; } -- GitLab From 1d4a6d144111100d30eaefb96ed632f1d8a11dc5 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Mon, 9 Nov 2009 17:01:08 -0500 Subject: [PATCH 280/306] For EXT-2325: Should purge inventory cache moving from 1.23 to 2.0. Added a version field at the beginning of inventory cache files. If version field is not found or does not match expectected value, then the cache is discarded. In 1.23, the version line triggers a warning but is otherwise ignored. Reviewed by Seraph. --- indra/newview/llinventorymodel.cpp | 47 +++++++++++++++++++++++++++--- indra/newview/llinventorymodel.h | 6 +++- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index baf34b42ff3..74c2c7aa693 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -81,6 +81,10 @@ BOOL LLInventoryModel::sTimelyFetchPending = FALSE; LLFrameTimer LLInventoryModel::sFetchTimer; S16 LLInventoryModel::sBulkFetchCount = 0; +// Increment this if the inventory contents change in a non-backwards-compatible way. +// For viewer 2, the addition of link items makes a pre-viewer-2 cache incorrect. +const S32 LLInventoryModel::sCurrentInvCacheVersion = 2; + // RN: for some reason, using std::queue in the header file confuses the compiler which things it's an xmlrpc_queue static std::deque<LLUUID> sFetchQueue; @@ -2101,7 +2105,8 @@ bool LLInventoryModel::loadSkeleton( llinfos << "Unable to gunzip " << gzip_filename << llendl; } } - if(loadFromFile(inventory_filename, categories, items)) + bool is_cache_obsolete = false; + if(loadFromFile(inventory_filename, categories, items, is_cache_obsolete)) { // We were able to find a cache of files. So, use what we // found to generate a set of categories we should add. We @@ -2236,6 +2241,12 @@ bool LLInventoryModel::loadSkeleton( // clean up the gunzipped file. LLFile::remove(inventory_filename); } + if(is_cache_obsolete) + { + // If out of date, remove the gzipped file too. + llwarns << "Inv cache out of date, removing" << llendl; + LLFile::remove(gzip_filename); + } categories.clear(); // will unref and delete entries } @@ -2634,7 +2645,8 @@ bool LLUUIDAndName::operator>(const LLUUIDAndName& rhs) const // static bool LLInventoryModel::loadFromFile(const std::string& filename, LLInventoryModel::cat_array_t& categories, - LLInventoryModel::item_array_t& items) + LLInventoryModel::item_array_t& items, + bool &is_cache_obsolete) { if(filename.empty()) { @@ -2651,11 +2663,32 @@ bool LLInventoryModel::loadFromFile(const std::string& filename, // *NOTE: This buffer size is hard coded into scanf() below. char buffer[MAX_STRING]; /*Flawfinder: ignore*/ char keyword[MAX_STRING]; /*Flawfinder: ignore*/ + char value[MAX_STRING]; /*Flawfinder: ignore*/ + is_cache_obsolete = true; // Obsolete until proven current while(!feof(file) && fgets(buffer, MAX_STRING, file)) { - sscanf(buffer, " %254s", keyword); /* Flawfinder: ignore */ - if(0 == strcmp("inv_category", keyword)) + sscanf(buffer, " %126s %126s", keyword, value); /* Flawfinder: ignore */ + if(0 == strcmp("inv_cache_version", keyword)) { + S32 version; + int succ = sscanf(value,"%d",&version); + if ((1 == succ) && (version == sCurrentInvCacheVersion)) + { + // Cache is up to date + is_cache_obsolete = false; + continue; + } + else + { + // Cache is out of date + break; + } + } + else if(0 == strcmp("inv_category", keyword)) + { + if (is_cache_obsolete) + break; + LLPointer<LLViewerInventoryCategory> inv_cat = new LLViewerInventoryCategory(LLUUID::null); if(inv_cat->importFileLocal(file)) { @@ -2669,6 +2702,9 @@ bool LLInventoryModel::loadFromFile(const std::string& filename, } else if(0 == strcmp("inv_item", keyword)) { + if (is_cache_obsolete) + break; + LLPointer<LLViewerInventoryItem> inv_item = new LLViewerInventoryItem; if( inv_item->importFileLocal(file) ) { @@ -2700,6 +2736,8 @@ bool LLInventoryModel::loadFromFile(const std::string& filename, } } fclose(file); + if (is_cache_obsolete) + return false; return true; } @@ -2721,6 +2759,7 @@ bool LLInventoryModel::saveToFile(const std::string& filename, return false; } + fprintf(file, "\tinv_cache_version\t%d\n",sCurrentInvCacheVersion); S32 count = categories.count(); S32 i; for(i = 0; i < count; ++i) diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index aba0a619dba..faf026887a9 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -446,7 +446,8 @@ class LLInventoryModel // file import/export. static bool loadFromFile(const std::string& filename, cat_array_t& categories, - item_array_t& items); + item_array_t& items, + bool& is_cache_obsolete); static bool saveToFile(const std::string& filename, const cat_array_t& categories, const item_array_t& items); @@ -518,6 +519,9 @@ class LLInventoryModel static F32 sMaxTimeBetweenFetches; static S16 sBulkFetchCount; + // Expected inventory cache version + const static S32 sCurrentInvCacheVersion; + // This flag is used to handle an invalid inventory state. bool mIsAgentInvUsable; -- GitLab From b82fadeda8489134a12bb573e612f32e135d6cc5 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Mon, 9 Nov 2009 14:01:32 -0800 Subject: [PATCH 281/306] Fix signed/unsigned build breakage in llvovolume.cpp --- indra/newview/llvovolume.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 09769d5e80a..a32abf3ab94 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1646,7 +1646,7 @@ LLVector3 LLVOVolume::getApproximateFaceNormal(U8 face_id) if (volume && face_id < volume->getNumVolumeFaces()) { const LLVolumeFace& face = volume->getVolumeFace(face_id); - for (S32 i = 0; i < face.mVertices.size(); ++i) + for (S32 i = 0; i < (S32)face.mVertices.size(); ++i) { result += face.mVertices[i].mNormal; } -- GitLab From 115fb4e342f5523c3c662e1adf213a15e0468d8e Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" <vir@lindenlab.com> Date: Mon, 9 Nov 2009 17:26:37 -0500 Subject: [PATCH 282/306] Removed some log file spam. --- indra/newview/llappearancemgr.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 41cd77b45d5..d14de1c3012 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1243,14 +1243,14 @@ void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg) void LLAppearanceManager::registerAttachment(const LLUUID& item_id) { sRegisteredAttachments.insert(item_id); - dumpAttachmentSet(sRegisteredAttachments,"after register:"); + //dumpAttachmentSet(sRegisteredAttachments,"after register:"); if (sAttachmentInvLinkEnabled) { LLViewerInventoryItem *item = gInventory.getItem(item_id); if (item) { - LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:"); + //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:"); LLAppearanceManager::wearItem(item,false); // Add COF link for item. gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); gInventory.notifyObservers(); @@ -1258,7 +1258,7 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id) } else { - llinfos << "no link changes, inv link not enabled" << llendl; + //llinfos << "no link changes, inv link not enabled" << llendl; } } @@ -1266,11 +1266,11 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id) void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id) { sRegisteredAttachments.erase(item_id); - dumpAttachmentSet(sRegisteredAttachments,"after unregister:"); + //dumpAttachmentSet(sRegisteredAttachments,"after unregister:"); if (sAttachmentInvLinkEnabled) { - LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:"); + //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:"); LLAppearanceManager::removeItemLinks(item_id, false); // BAP - needs to change for label to track link. gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); @@ -1278,6 +1278,6 @@ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id) } else { - llinfos << "no link changes, inv link not enabled" << llendl; + //llinfos << "no link changes, inv link not enabled" << llendl; } } -- GitLab From dffbe3f2ee2f6141552a6aa507d8c6e7f5037c05 Mon Sep 17 00:00:00 2001 From: Lis Pardi <lis@lindenlab.com> Date: Mon, 9 Nov 2009 17:40:21 -0500 Subject: [PATCH 283/306] ext-1444 log, speak and gestures btns don't have tool-tips These changes had been made last month, but got smooshed. --- .../newview/skins/default/xui/en/panel_bottomtray.xml | 11 +++++++---- .../skins/default/xui/en/panel_nearby_chat_bar.xml | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index f833e0a1cbb..c5e129cf2fc 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -69,7 +69,9 @@ left="0" name="talk" top="3" - width="100" /> + width="100" + speak_button.tool_tip="Turns microphone on/off" + show_button.tool_tip="Shows/hides voice control panel" /> </layout_panel> <icon auto_resize="false" @@ -102,7 +104,8 @@ left="0" top="3" use_ellipses="true" - width="80" /> + width="80" + tool_tip="Shows/hides gestures"/> </layout_panel> <icon auto_resize="false" @@ -133,7 +136,7 @@ label="Move" layout="topleft" name="movement_btn" - tool_tip="Show/hide movement controls" + tool_tip="Shows/hides movement controls" top="3" width="80"> <button.init_callback @@ -171,7 +174,7 @@ label="View" layout="topleft" left="0" - tool_tip="Show/hide camera controls" + tool_tip="Shows/hides camera controls" top="3" name="camera_btn" width="80"> 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 555fedb1ffb..7128c200380 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 @@ -50,7 +50,7 @@ label="Log" height="23" name="show_nearby_chat" - tool_tip="Show/hide nearby chat log"> + tool_tip="Shows/hides nearby chat log"> <button.init_callback function="Button.SetDockableFloaterToggle" parameter="nearby_chat" /> -- GitLab From 4eb72a12a2280d3be6ac556ad80eb953d249e8eb Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Mon, 9 Nov 2009 15:29:47 -0800 Subject: [PATCH 284/306] data driven layout of top-level UI elements EXT-1219 Side tray slide-out animation cleaned up some layout of bottom tray contents reviewed by James --- .hgignore | 1 - indra/llui/llconsole.cpp | 2 + indra/llui/lllayoutstack.cpp | 43 +++- indra/llui/lllayoutstack.h | 8 +- indra/llui/lluictrlfactory.h | 2 +- indra/llui/llview.cpp | 3 + indra/llui/llview.h | 3 - indra/newview/llfasttimerview.cpp | 3 +- indra/newview/llfloatersnapshot.cpp | 8 +- indra/newview/llmoveview.cpp | 2 +- indra/newview/llnavigationbar.cpp | 16 +- indra/newview/llpanelpeople.cpp | 3 +- indra/newview/llpanelpeoplemenus.cpp | 1 - indra/newview/llpanelprimmediacontrols.cpp | 1 + indra/newview/llpanelteleporthistory.cpp | 2 - indra/newview/llsidetray.cpp | 200 ++++------------- indra/newview/llsidetray.h | 10 +- indra/newview/llviewerwindow.cpp | 79 +++---- indra/newview/llviewerwindow.h | 3 +- indra/newview/pipeline.cpp | 2 + .../skins/default/xui/en/main_view.xml | 203 ++++++++++-------- .../skins/default/xui/en/panel_bottomtray.xml | 51 +++-- .../skins/default/xui/en/panel_status_bar.xml | 2 +- .../default/xui/en/widgets/context_menu.xml | 2 + .../default/xui/en/widgets/side_tray.xml | 9 +- .../xui/en/widgets/toggleable_menu.xml | 2 + 26 files changed, 293 insertions(+), 368 deletions(-) create mode 100644 indra/newview/skins/default/xui/en/widgets/context_menu.xml create mode 100644 indra/newview/skins/default/xui/en/widgets/toggleable_menu.xml diff --git a/.hgignore b/.hgignore index e390f591e57..4d98acf5d97 100644 --- a/.hgignore +++ b/.hgignore @@ -29,7 +29,6 @@ indra/newview/fmod.dll indra/newview/mozilla-theme indra/newview/mozilla-universal-darwin.tgz indra/newview/res-sdl -indra/newview/skins indra/newview/vivox-runtime indra/server-linux-* indra/test/linden_file.dat diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp index e0053b4cc70..48c76cf105c 100644 --- a/indra/llui/llconsole.cpp +++ b/indra/llui/llconsole.cpp @@ -60,6 +60,8 @@ LLConsole* gConsole = NULL; // Created and destroyed in LLViewerWindow. const F32 FADE_DURATION = 2.f; const S32 MIN_CONSOLE_WIDTH = 200; +static LLDefaultChildRegistry::Register<LLConsole> r("console"); + LLConsole::LLConsole(const LLConsole::Params& p) : LLUICtrl(p), LLFixedBuffer(p.max_lines), diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index bac54919432..596b3a3e70a 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -137,6 +137,7 @@ LLLayoutStack::LLLayoutStack(const LLLayoutStack::Params& p) mPanelSpacing(p.border_size), mOrientation((p.orientation() == "vertical") ? VERTICAL : HORIZONTAL), mAnimate(p.animate), + mAnimatedThisFrame(false), mClip(p.clip) {} @@ -172,6 +173,7 @@ void LLLayoutStack::draw() // only force drawing invisible children if visible amount is non-zero drawChild(panelp, 0, 0, !clip_rect.isEmpty()); } + mAnimatedThisFrame = false; } void LLLayoutStack::removeChild(LLView* view) @@ -411,8 +413,10 @@ void LLLayoutStack::updatePanelAutoResize(const std::string& panel_name, BOOL au } } +static LLFastTimer::DeclareTimer FTM_UPDATE_LAYOUT("Update LayoutStacks"); void LLLayoutStack::updateLayout(BOOL force_resize) { + LLFastTimer ft(FTM_UPDATE_LAYOUT); static LLUICachedControl<S32> resize_bar_overlap ("UIResizeBarOverlap", 0); calcMinExtents(); @@ -431,10 +435,13 @@ void LLLayoutStack::updateLayout(BOOL force_resize) { if (mAnimate) { - (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 1.f, LLCriticalDamp::getInterpolant(ANIM_OPEN_TIME)); - if ((*panel_it)->mVisibleAmt > 0.99f) + if (!mAnimatedThisFrame) { - (*panel_it)->mVisibleAmt = 1.f; + (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 1.f, LLCriticalDamp::getInterpolant(ANIM_OPEN_TIME)); + if ((*panel_it)->mVisibleAmt > 0.99f) + { + (*panel_it)->mVisibleAmt = 1.f; + } } } else @@ -446,10 +453,13 @@ void LLLayoutStack::updateLayout(BOOL force_resize) { if (mAnimate) { - (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 0.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME)); - if ((*panel_it)->mVisibleAmt < 0.001f) + if (!mAnimatedThisFrame) { - (*panel_it)->mVisibleAmt = 0.f; + (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 0.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME)); + if ((*panel_it)->mVisibleAmt < 0.001f) + { + (*panel_it)->mVisibleAmt = 0.f; + } } } else @@ -631,10 +641,10 @@ void LLLayoutStack::updateLayout(BOOL force_resize) // adjust running headroom count based on new sizes shrink_headroom_total += delta_size; - panelp->reshape(new_width, new_height); - panelp->setOrigin(cur_x, cur_y - new_height); + LLRect panel_rect; + panel_rect.setLeftTopAndSize(cur_x, cur_y, new_width, new_height); + panelp->setShape(panel_rect); - LLRect panel_rect = panelp->getRect(); LLRect resize_bar_rect = panel_rect; if (mOrientation == HORIZONTAL) { @@ -705,6 +715,8 @@ void LLLayoutStack::updateLayout(BOOL force_resize) llassert_always(force_resize == FALSE); updateLayout(TRUE); } + + mAnimatedThisFrame = true; } // end LLLayoutStack::updateLayout @@ -772,3 +784,16 @@ void LLLayoutStack::calcMinExtents() } } } + +// update layout stack animations, etc. once per frame +// NOTE: we use this to size world view based on animating UI, *before* we draw the UI +// we might still need to call updateLayout during UI draw phase, in case UI elements +// are resizing themselves dynamically +//static +void LLLayoutStack::idle() +{ + for (LLInstanceTracker::instance_iter it = beginInstances(); it != endInstances(); ++it) + { + (*it)->updateLayout(); + } +} diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index 9ded48ef6a1..11d604b7ec7 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -38,7 +38,7 @@ class LLPanel; -class LLLayoutStack : public LLView +class LLLayoutStack : public LLView, LLInstanceTracker<LLLayoutStack> { public: struct Params : public LLInitParam::Block<Params, LLView::Params> @@ -81,6 +81,10 @@ class LLLayoutStack : public LLView S32 getNumPanels() { return mPanels.size(); } void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize); + + + static void idle(); + protected: LLLayoutStack(const Params&); friend class LLUICtrlFactory; @@ -105,6 +109,8 @@ class LLLayoutStack : public LLView S32 mMinHeight; // calculated by calcMinExtents S32 mPanelSpacing; + // true if we already applied animation this frame + bool mAnimatedThisFrame; bool mAnimate; bool mClip; }; // end class LLLayoutStack diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h index 17e32dc7a99..0ccd3047f6c 100644 --- a/indra/llui/lluictrlfactory.h +++ b/indra/llui/lluictrlfactory.h @@ -188,7 +188,7 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory> T* widget = new T(params); widget->initFromParams(params); if (parent) - widget->setParent(parent); + parent->addChild(widget); return widget; } diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index fe7fd59de80..da564befa9b 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -1698,8 +1698,11 @@ LLView* LLView::getChildView(const std::string& name, BOOL recurse) const return child; } +static LLFastTimer::DeclareTimer FTM_FIND_VIEWS("Find Widgets"); + LLView* LLView::findChildView(const std::string& name, BOOL recurse) const { + LLFastTimer ft(FTM_FIND_VIEWS); //richard: should we allow empty names? //if(name.empty()) // return NULL; diff --git a/indra/llui/llview.h b/indra/llui/llview.h index c3b442e0224..2607120e17c 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -267,9 +267,6 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem // remove the specified child from the view, and set it's parent to NULL. virtual void removeChild(LLView* view); - // helper function for lluictrlfactory.h create<> template - void setParent(LLView* parent) { if (parent) parent->addChild(this); } - virtual BOOL postBuild() { return TRUE; } child_tab_order_t getCtrlOrder() const { return mCtrlOrder; } diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 2ab17d62200..71265fdd2f8 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -256,7 +256,8 @@ BOOL LLFastTimerView::handleToolTip(S32 x, S32 y, MASK mask) LLToolTipMgr::instance().show(LLToolTip::Params() .message(mHoverTimer->getToolTip(LLFastTimer::NamedTimer::HISTORY_NUM - mScrollIndex - mHoverBarIndex)) - .sticky_rect(screen_rect)); + .sticky_rect(screen_rect) + .delay_time(0.f)); return TRUE; } diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 347cc3a58e4..e5700728030 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -2044,10 +2044,12 @@ BOOL LLFloaterSnapshot::postBuild() LLSnapshotLivePreview::Params p; p.rect(full_screen_rect); LLSnapshotLivePreview* previewp = new LLSnapshotLivePreview(p); - getRootView()->removeChild(gSnapshotFloaterView); + LLView* parent_view = gSnapshotFloaterView->getParent(); + + parent_view->removeChild(gSnapshotFloaterView); // make sure preview is below snapshot floater - getRootView()->addChild(previewp); - getRootView()->addChild(gSnapshotFloaterView); + parent_view->addChild(previewp); + parent_view->addChild(gSnapshotFloaterView); //move snapshot floater to special purpose snapshotfloaterview gFloaterView->removeChild(this); diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index b0520874752..e3ba1b8e4ad 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -677,7 +677,7 @@ void LLPanelStandStopFlying::updatePosition() //align centers of a button and a floater S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; - S32 y = tray->getRect().getHeight(); + S32 y = 0; LLFloater *move_floater = LLFloaterReg::findInstance("moveview"); if (move_floater) diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 4f145891ea6..d37236aadf7 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -587,6 +587,8 @@ void LLNavigationBar::showNavigationPanel(BOOL visible) // this is duplicated in 'else' section because it should be called BEFORE fb->reshape reshape(nbRect.getWidth(), nbRect.getHeight()); setRect(nbRect); + // propagate size to parent container + getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); fb->reshape(fbRect.getWidth(), fbRect.getHeight()); fb->setRect(fbRect); @@ -600,6 +602,7 @@ void LLNavigationBar::showNavigationPanel(BOOL visible) reshape(nbRect.getWidth(), nbRect.getHeight()); setRect(nbRect); + getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); } } else @@ -614,6 +617,7 @@ void LLNavigationBar::showNavigationPanel(BOOL visible) // this is duplicated in 'else' section because it should be called BEFORE fb->reshape reshape(nbRect.getWidth(), nbRect.getHeight()); setRect(nbRect); + getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); fb->reshape(fbRect.getWidth(), fbRect.getHeight()); fb->setRect(fbRect); @@ -626,16 +630,12 @@ void LLNavigationBar::showNavigationPanel(BOOL visible) reshape(nbRect.getWidth(), nbRect.getHeight()); setRect(nbRect); + getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); } } childSetVisible("bg_icon", fpVisible); childSetVisible("bg_icon_no_fav", !fpVisible); - - if(LLSideTray::instanceCreated()) - { - LLSideTray::getInstance()->resetPanelRect(); - } } void LLNavigationBar::showFavoritesPanel(BOOL visible) @@ -670,6 +670,7 @@ void LLNavigationBar::showFavoritesPanel(BOOL visible) reshape(nbRect.getWidth(), nbRect.getHeight()); setRect(nbRect); + getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); fb->reshape(fbRect.getWidth(), fbRect.getHeight()); fb->setRect(fbRect); @@ -694,14 +695,11 @@ void LLNavigationBar::showFavoritesPanel(BOOL visible) reshape(nbRect.getWidth(), nbRect.getHeight()); setRect(nbRect); + getParent()->reshape(nbRect.getWidth(), nbRect.getHeight()); } childSetVisible("bg_icon", visible); childSetVisible("bg_icon_no_fav", !visible); fb->setVisible(visible); - if(LLSideTray::instanceCreated()) - { - LLSideTray::getInstance()->resetPanelRect(); - } } diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 65a7b5322b5..e0b0b0f1e20 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -198,7 +198,8 @@ class LLFriendListUpdater : public LLAvatarListUpdater, public LLFriendObserver ~LLFriendListUpdater() { - delete mInvObserver; + // will be deleted by ~LLInventoryModel + //delete mInvObserver; LLVoiceClient::getInstance()->removeObserver(this); LLAvatarTracker::instance().removeObserver(this); } diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index aaf6849fe94..7dea5eaf675 100644 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -64,7 +64,6 @@ void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, if (parent) { parent->removeChild(mMenu); - mMenu->setParent(NULL); } delete mMenu; mMenu = NULL; diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 0b2a7e8756b..f82593822d7 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -694,6 +694,7 @@ bool LLPanelPrimMediaControls::isMouseOver() LLView* controls_view = NULL; controls_view = getChild<LLView>("media_controls"); + //FIXME: rewrite as LLViewQuery or get hover set from LLViewerWindow? if(controls_view && controls_view->getVisible()) { controls_view->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y); diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index a34f029095b..d094f22ae13 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -163,7 +163,6 @@ void LLTeleportHistoryPanel::ContextMenu::show(LLView* spawning_view, S32 index, if (parent) { parent->removeChild(mMenu); - mMenu->setParent(NULL); } delete mMenu; } @@ -645,7 +644,6 @@ void LLTeleportHistoryPanel::onAccordionTabRightClick(LLView *view, S32 x, S32 y if (parent) { parent->removeChild(mAccordionTabMenu); - mAccordionTabMenu->setParent(NULL); } delete mAccordionTabMenu; } diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index a11ee05532f..f0e782d44d8 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -100,7 +100,7 @@ LLSideTray* LLSideTray::getInstance() { if (!sInstance) { - sInstance = LLUICtrlFactory::createFromFile<LLSideTray>("panel_side_tray.xml",gViewerWindow->getRootView(), LLRootView::child_registry_t::instance()); + sInstance = LLUICtrlFactory::createFromFile<LLSideTray>("panel_side_tray.xml",NULL, LLRootView::child_registry_t::instance()); } return sInstance; @@ -148,7 +148,6 @@ class LLSideTrayTab: public LLPanel /*virtual*/ bool addChild (LLView* view, S32 tab_group); - void arrange (S32 width, S32 height); void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE); static LLSideTrayTab* createInstance (); @@ -156,8 +155,6 @@ class LLSideTrayTab: public LLPanel const std::string& getDescription () const { return mDescription;} const std::string& getTabTitle() const { return mTabTitle;} - void draw(); - void onOpen (const LLSD& key); private: @@ -209,60 +206,24 @@ BOOL LLSideTrayTab::postBuild() static const S32 splitter_margin = 1; -//virtual -void LLSideTrayTab::arrange(S32 width, S32 height ) -{ - if(!mMainPanel) - return; - - S32 offset = 0; - - LLView* title_panel = findChildView(TAB_PANEL_CAPTION_NAME, true); - - if(title_panel) - { - title_panel->setOrigin( 0, height - title_panel->getRect().getHeight() ); - offset = title_panel->getRect().getHeight(); - } - - LLRect sRect = mMainPanel->getRect(); - sRect.setLeftTopAndSize( splitter_margin, height - offset - splitter_margin, width - 2*splitter_margin, height - offset - 2*splitter_margin); - mMainPanel->reshape(sRect.getWidth(),sRect.getHeight()); - mMainPanel->setRect(sRect); - - - -} - void LLSideTrayTab::reshape (S32 width, S32 height, BOOL called_from_parent ) { - if(!mMainPanel) - return; - S32 offset = 0; - + LLPanel::reshape(width, height, called_from_parent); LLView* title_panel = findChildView(TAB_PANEL_CAPTION_NAME, true); - - if(title_panel) + if (!title_panel) { - title_panel->setOrigin( 0, height - title_panel->getRect().getHeight() ); - title_panel->reshape(width,title_panel->getRect().getHeight()); - offset = title_panel->getRect().getHeight(); + // not fully constructed yet + return; } - - - LLRect sRect = mMainPanel->getRect(); - sRect.setLeftTopAndSize( splitter_margin, height - offset - splitter_margin, width - 2*splitter_margin, height - offset - 2*splitter_margin); - //mMainPanel->setMaxWidth(sRect.getWidth()); - mMainPanel->reshape(sRect.getWidth(), sRect.getHeight()); - - mMainPanel->setRect(sRect); - -} + S32 title_height = title_panel->getRect().getHeight(); + title_panel->setOrigin( 0, height - title_height ); + title_panel->reshape(width,title_height); -void LLSideTrayTab::draw() -{ - LLPanel::draw(); + LLRect sRect; + sRect.setLeftTopAndSize( splitter_margin, height - title_height - splitter_margin, + width - 2*splitter_margin, height - title_height - 2*splitter_margin); + mMainPanel->setShape(sRect); } void LLSideTrayTab::onOpen (const LLSD& key) @@ -300,17 +261,20 @@ LLSideTray::LLSideTray(Params& params) ,mActiveTab(0) ,mCollapsed(false) ,mCollapseButton(0) - ,mMaxBarWidth(params.rect.width) { mCollapsed=params.collapsed; - LLUICtrl::CommitCallbackRegistry::Registrar& commit = LLUICtrl::CommitCallbackRegistry::currentRegistrar(); // register handler function to process data from the xml. // panel_name should be specified via "parameter" attribute. commit.add("SideTray.ShowPanel", boost::bind(&LLSideTray::showPanel, this, _2, LLUUID::null)); LLTransientFloaterMgr::getInstance()->addControlView(this); + + LLPanel::Params p; + p.name = "buttons_panel"; + p.mouse_opaque = false; + mButtonsPanel = LLUICtrlFactory::create<LLPanel>(p); } @@ -399,7 +363,7 @@ LLButton* LLSideTray::createButton (const std::string& name,const std::string& i rect.setOriginAndSize(0, 0, sidetray_params.default_button_width, sidetray_params.default_button_height); bparams.name(name); - bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_BOTTOM); + bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_TOP); bparams.rect (rect); bparams.tab_stop(false); bparams.image_unselected.name(sidetray_params.tab_btn_image_normal); @@ -416,7 +380,7 @@ LLButton* LLSideTray::createButton (const std::string& name,const std::string& i button->setImageOverlay(image); } - addChildInBack(button); + mButtonsPanel->addChildInBack(button); return button; } @@ -500,23 +464,24 @@ void LLSideTray::reflectCollapseChange() } else { - gFloaterView->setSnapOffsetRight(mMaxBarWidth); + gFloaterView->setSnapOffsetRight(getRect().getWidth()); setFocus(TRUE); } gFloaterView->refresh(); } -void LLSideTray::arrange () +void LLSideTray::arrange() { static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>()); setPanelRect(); LLRect ctrl_rect; - ctrl_rect.setLeftTopAndSize(0,getRect().getHeight()-sidetray_params.default_button_width - ,sidetray_params.default_button_width - ,sidetray_params.default_button_height); + ctrl_rect.setLeftTopAndSize(0, + mButtonsPanel->getRect().getHeight() - sidetray_params.default_button_width, + sidetray_params.default_button_width, + sidetray_params.default_button_height); mCollapseButton->setRect(ctrl_rect); @@ -528,9 +493,10 @@ void LLSideTray::arrange () { LLSideTrayTab* sidebar_tab = *child_it; - ctrl_rect.setLeftTopAndSize(0,getRect().getHeight()-offset - ,sidetray_params.default_button_width - ,sidetray_params.default_button_height); + ctrl_rect.setLeftTopAndSize(0, + mButtonsPanel->getRect().getHeight()-offset, + sidetray_params.default_button_width, + sidetray_params.default_button_height); if(mTabButtons.find(sidebar_tab->getName()) == mTabButtons.end()) continue; @@ -544,14 +510,11 @@ void LLSideTray::arrange () btn->setVisible(ctrl_rect.mBottom > 0); } - ctrl_rect.setLeftTopAndSize(sidetray_params.default_button_width,getRect().getHeight(),mMaxBarWidth,getRect().getHeight()); - //arrange tabs - for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) + for ( child_vector_t::iterator child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) { LLSideTrayTab* sidebar_tab = *child_it; - sidebar_tab->setRect(ctrl_rect); - sidebar_tab->arrange(mMaxBarWidth,getRect().getHeight()); + sidebar_tab->setShape(getLocalRect()); } } @@ -580,7 +543,7 @@ void LLSideTray::collapseSideBar() { mCollapseButton->setImageOverlay( home_tab->mImage ); } - mActiveTab->setVisible(FALSE); + //mActiveTab->setVisible(FALSE); reflectCollapseChange(); setFocus( FALSE ); @@ -596,7 +559,6 @@ void LLSideTray::expandSideBar() } LLSD key;//empty mActiveTab->onOpen(key); - mActiveTab->setVisible(TRUE); reflectCollapseChange(); } @@ -612,15 +574,6 @@ void LLSideTray::highlightFocused() */ } -BOOL LLSideTray::handleScrollWheel(S32 x, S32 y, S32 mask) -{ - BOOL ret = LLPanel::handleScrollWheel(x,y,mask); - - if(!ret && childFromPoint(x,y) != 0 ) - return TRUE;//mouse wheel over sidetray buttons, eat mouse wheel - return ret; -} - //virtual BOOL LLSideTray::handleMouseDown (S32 x, S32 y, MASK mask) { @@ -630,58 +583,13 @@ BOOL LLSideTray::handleMouseDown (S32 x, S32 y, MASK mask) return ret; } -void LLSideTray::reshape (S32 width, S32 height, BOOL called_from_parent) +void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent) { - LLPanel::reshape(width, height, called_from_parent); if(!mActiveTab) return; - static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>()); - - setPanelRect(); - - LLRect ctrl_rect; - ctrl_rect.setLeftTopAndSize(0 - ,getRect().getHeight()-sidetray_params.default_button_width - ,sidetray_params.default_button_width - ,sidetray_params.default_button_height); - - mCollapseButton->setRect(ctrl_rect); - - //arrange tab buttons - child_vector_const_iter_t child_it; - int offset = (sidetray_params.default_button_height+sidetray_params.default_button_margin)*2; - for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) - { - LLSideTrayTab* sidebar_tab = *child_it; - - ctrl_rect.setLeftTopAndSize(0,getRect().getHeight()-offset - ,sidetray_params.default_button_width - ,sidetray_params.default_button_height); - - if(mTabButtons.find(sidebar_tab->getName()) == mTabButtons.end()) - continue; - - LLButton* btn = mTabButtons[sidebar_tab->getName()]; - - btn->setRect(ctrl_rect); - offset+=sidetray_params.default_button_height; - offset+=sidetray_params.default_button_margin; - - btn->setVisible(ctrl_rect.mBottom > 0); - } - - //arrange tabs - - for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) - { - LLSideTrayTab* sidebar_tab = *child_it; - sidebar_tab->reshape(mMaxBarWidth,getRect().getHeight()); - ctrl_rect.setLeftTopAndSize(sidetray_params.default_button_width,getRect().getHeight(),mMaxBarWidth,getRect().getHeight()); - sidebar_tab->setRect(ctrl_rect); - - } + arrange(); } /** @@ -729,42 +637,12 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para static const S32 fake_offset = 132; static const S32 fake_top_offset = 18; -void LLSideTray::resetPanelRect () -{ - const LLRect& parent_rect = gViewerWindow->getRootView()->getRect(); - - static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>()); - - S32 panel_width = sidetray_params.default_button_width; - panel_width += mCollapsed ? 0 : mMaxBarWidth; - - S32 panel_height = parent_rect.getHeight()-fake_top_offset; - - reshape(panel_width,panel_height); -} - void LLSideTray::setPanelRect () { - LLNavigationBar* nav_bar = LLNavigationBar::getInstance(); - LLRect nav_rect = nav_bar->getRect(); - - static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>()); - - const LLRect& parent_rect = gViewerWindow->getRootView()->getRect(); - - S32 panel_width = sidetray_params.default_button_width; - panel_width += mCollapsed ? 0 : mMaxBarWidth; - - S32 panel_height = parent_rect.getHeight()-fake_top_offset - nav_rect.getHeight(); - S32 panel_top = parent_rect.mTop-fake_top_offset - nav_rect.getHeight(); - - LLRect panel_rect; - panel_rect.setLeftTopAndSize( parent_rect.mRight-panel_width, panel_top, panel_width, panel_height); - setRect(panel_rect); + // set visibility of parent container based on collapsed state + if (getParent()) + { + getParent()->setVisible(!mCollapsed); + } } -S32 LLSideTray::getTrayWidth() -{ - static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>()); - return getRect().getWidth() - (sidetray_params.default_button_width + sidetray_params.default_button_margin); -} diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index b49251ec79b..72a9465baa0 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -118,6 +118,8 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray> LLPanel::setVisible(visible); } + LLPanel* getButtonsPanel() { return mButtonsPanel; } + public: virtual ~LLSideTray(){}; @@ -129,10 +131,8 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray> bool addChild (LLView* view, S32 tab_group); BOOL handleMouseDown (S32 x, S32 y, MASK mask); - BOOL handleScrollWheel(S32 x, S32 y, S32 mask); void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE); - S32 getTrayWidth(); void resetPanelRect (); @@ -163,15 +163,15 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray> private: - std::map<std::string,LLButton*> mTabButtons; + LLPanel* mButtonsPanel; + typedef std::map<std::string,LLButton*> button_map_t; + button_map_t mTabButtons; child_vector_t mTabs; LLSideTrayTab* mActiveTab; LLButton* mCollapseButton; bool mCollapsed; - S32 mMaxBarWidth; - static LLSideTray* sInstance; }; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 86303699717..b15019f830f 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1405,6 +1405,9 @@ void LLViewerWindow::initBase() main_view->setShape(full_window); getRootView()->addChild(main_view); + // placeholder widget that controls where "world" is rendered + mWorldViewPlaceholder = main_view->getChildView("world_view_rect"); + // Constrain floaters to inside the menu and status bar regions. gFloaterView = getRootView()->getChild<LLFloaterView>("Floater View"); gSnapshotFloaterView = getRootView()->getChild<LLSnapshotFloaterView>("Snapshot Floater View"); @@ -1458,9 +1461,6 @@ void LLViewerWindow::initWorldUI() gIMMgr = LLIMMgr::getInstance(); - // side tray - //getRootView()->addChild(LLSideTray::getInstance()); - getRootView()->sendChildToFront(gFloaterView); getRootView()->sendChildToFront(gSnapshotFloaterView); @@ -1468,7 +1468,7 @@ void LLViewerWindow::initWorldUI() LLPanel* bottom_tray_container = getRootView()->getChild<LLPanel>("bottom_tray_container"); LLBottomTray* bottom_tray = LLBottomTray::getInstance(); bottom_tray->setShape(bottom_tray_container->getLocalRect()); - bottom_tray->setFollows(FOLLOWS_ALL); + bottom_tray->setFollowsAll(); bottom_tray_container->addChild(bottom_tray); bottom_tray_container->setVisible(TRUE); @@ -1498,7 +1498,8 @@ void LLViewerWindow::initWorldUI() // Status bar LLPanel* status_bar_container = getRootView()->getChild<LLPanel>("status_bar_container"); gStatusBar = new LLStatusBar(status_bar_container->getLocalRect()); - gStatusBar->setFollows(FOLLOWS_ALL); + gStatusBar->setFollowsAll(); + gStatusBar->setShape(status_bar_container->getLocalRect()); // sync bg color with menu bar gStatusBar->setBackgroundColor( gMenuBarView->getBackgroundColor().get() ); status_bar_container->addChild(gStatusBar); @@ -1559,10 +1560,24 @@ void LLViewerWindow::initWorldUI() LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("stand_stop_flying_container"); LLPanelStandStopFlying* panel_stand_stop_flying = LLPanelStandStopFlying::getInstance(); panel_stand_stop_flying->setShape(panel_ssf_container->getLocalRect()); - panel_stand_stop_flying->setFollows(FOLLOWS_ALL); + panel_stand_stop_flying->setFollowsAll(); panel_ssf_container->addChild(panel_stand_stop_flying); panel_ssf_container->setVisible(TRUE); + // put sidetray in container + LLPanel* side_tray_container = getRootView()->getChild<LLPanel>("side_tray_container"); + LLSideTray* sidetrayp = LLSideTray::getInstance(); + sidetrayp->setShape(side_tray_container->getLocalRect()); + sidetrayp->setFollowsAll(); + side_tray_container->addChild(sidetrayp); + side_tray_container->setVisible(FALSE); + + // put sidetray buttons in their own panel + LLPanel* buttons_panel = sidetrayp->getButtonsPanel(); + LLPanel* buttons_panel_container = getRootView()->getChild<LLPanel>("side_bar_tabs"); + buttons_panel->setShape(buttons_panel_container->getLocalRect()); + buttons_panel->setFollowsAll(); + buttons_panel_container->addChild(buttons_panel); } // Destroy the UI @@ -2272,29 +2287,6 @@ void LLViewerWindow::moveCursorToCenter() LLUI::setMousePositionScreen(x, y); } -void LLViewerWindow::updateBottomTrayRect() -{ - //if(LLBottomTray::instanceExists() && LLSideTray::instanceCreated()) - //{ - // S32 side_tray_width = 0; - // if(LLSideTray::getInstance()->getVisible()) - // { - // side_tray_width = LLSideTray::getInstance()->getTrayWidth(); - // } - - // LLBottomTray* bottom_tray = LLBottomTray::getInstance(); - // S32 right = llround((F32)mWindowRect.mRight / mDisplayScale.mV[VX]) - side_tray_width; - - // LLRect rc = bottom_tray->getRect(); - // if (right != rc.mRight) - // { - // rc.mRight = right; - // bottom_tray->reshape(rc.getWidth(), rc.getHeight(), FALSE); - // bottom_tray->setRect(rc); - // mOnBottomTrayWidthChanged(); - // } - //} -} ////////////////////////////////////////////////////////////////////// // @@ -2336,9 +2328,10 @@ void LLViewerWindow::updateUI() { static std::string last_handle_msg; - updateWorldViewRect(); + // animate layout stacks so we have up to date rect for world view + LLLayoutStack::idle(); - updateBottomTrayRect(); + updateWorldViewRect(); LLView::sMouseHandlerMessage.clear(); @@ -2838,32 +2831,20 @@ void LLViewerWindow::updateKeyboardFocus() LLSideTray::getInstance()->highlightFocused(); } +static LLFastTimer::DeclareTimer FTM_UPDATE_WORLD_VIEW("Update World View"); void LLViewerWindow::updateWorldViewRect(bool use_full_window) { - if (!LLSideTray::instanceCreated()) return; + LLFastTimer ft(FTM_UPDATE_WORLD_VIEW); // start off using whole window to render world LLRect new_world_rect = mWindowRect; if (use_full_window == false) { - // pull in right side of world view based on sidetray - LLSideTray* sidetray = LLSideTray::getInstance(); - if (sidetray->getVisible()) - { - new_world_rect.mRight -= llround((F32)sidetray->getTrayWidth() * mDisplayScale.mV[VX]); - } - - // push top of world view below nav bar - if (LLNavigationBar::getInstance()->getVisible()) - { - LLNavigationBar* barp = LLNavigationBar::getInstance(); - LLRect nav_bar_rect; - if(barp->localRectToOtherView(barp->getLocalRect(), &nav_bar_rect, mRootView)) - { - new_world_rect.mTop = llround((F32)LLNavigationBar::getInstance()->getRect().mBottom * mDisplayScale.mV[VY]); - } - } + new_world_rect = mWorldViewPlaceholder->calcScreenRect(); + // clamp to at least a 1x1 rect so we don't try to allocate zero width gl buffers + new_world_rect.mTop = llmax(new_world_rect.mTop, new_world_rect.mBottom + 1); + new_world_rect.mRight = llmax(new_world_rect.mRight, new_world_rect.mLeft + 1); } if (mWorldViewRect != new_world_rect) diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index d7c403739e4..31a458a15b5 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -294,7 +294,6 @@ class LLViewerWindow : public LLWindowCallbacks void updateKeyboardFocus(); void updateWorldViewRect(bool use_full_window=false); - void updateBottomTrayRect(); BOOL handleKey(KEY key, MASK mask); void handleScrollWheel (S32 clicks); @@ -451,6 +450,8 @@ class LLViewerWindow : public LLWindowCallbacks BOOL mIgnoreActivate; std::string mInitAlert; // Window / GL initialization requires an alert + + LLView* mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world class LLDebugText* mDebugText; // Internal class for debug text diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 0dc1a88ee89..eac83c0bdc0 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -506,8 +506,10 @@ void LLPipeline::destroyGL() } } +static LLFastTimer::DeclareTimer FTM_RESIZE_SCREEN_TEXTURE("Resize Screen Texture"); void LLPipeline::resizeScreenTexture() { + LLFastTimer ft(FTM_RESIZE_SCREEN_TEXTURE); if (gPipeline.canUseVertexShaders() && assertInitialized()) { GLuint resX = gViewerWindow->getWorldViewWidth(); diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index 2d69465b580..08f7ee456e4 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -1,119 +1,130 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel follows="left|right|top|bottom" - height="768" + height="768" layout="topleft" left="0" mouse_opaque="false" - name="screen" + name="main_view" width="1024"> <layout_stack border_size="0" follows="all" - height="768" - mouse_opaque="false" + mouse_opaque="false" + height="772" name="menu_stack" - orientation="vertical"> - <!-- filename="panel_status_bar.xml"--> + orientation="vertical" + top="0"> <layout_panel auto_resize="false" + min_height="19" mouse_opaque="false" name="status_bar_container" + height="19" width="1024" visible="false"/> - <!--filename="panel_navigation_bar.xml"--> <layout_panel auto_resize="false" - height="65" - mouse_opaque="false" + height="65" + mouse_opaque="false" name="nav_bar_container" width="1024" visible="false"/> - <layout_stack auto_resize="true" - border_size="0" - follows="all" - height="500" + <panel auto_resize="true" + follows="all" + height="500" + layout="topleft" mouse_opaque="false" - name="hud_stack" - orientation="horizontal" + name="hud" width="1024"> - <panel auto_resize="true" - follows="all" - height="500" - layout="topleft" - mouse_opaque="false" - name="main_view" - user_resize="true" - width="500"> - <layout_stack bottom="500" - follows="all" - height="500" - mouse_opaque="false" - name="hud_stack" - orientation="vertical"> - <panel auto_resize="true" - follows="all" - height="500" - layout="topleft" - mouse_opaque="false" - name="hud container" - width="500"> - <debug_view follows="all" - left="0" - top="0" - mouse_opaque="false" + <layout_stack border_size="0" + follows="all" + height="500" + left="0" + mouse_opaque="false" + name="hud_stack" + orientation="horizontal" + top="0" + width="1024"> + <panel auto_resize="true" + follows="all" + height="500" + layout="topleft" + mouse_opaque="false" + name="main_view" + user_resize="true" + width="500"> + <layout_stack border_size="0" + bottom="500" + follows="all" height="500" - name="DebugView" - width="500"/> - - <panel follows="right|top|bottom" - height="500" + left="0" + mouse_opaque="false" + name="world_stack" + orientation="vertical"> + <panel auto_resize="true" + follows="all" + height="500" + layout="topleft" + mouse_opaque="false" + name="hud container" + width="500"> + <view bottom="500" + follows="all" + height="500" + left="0" + mouse_opaque="false" + name="world_view_rect" + width="500"/> + <panel follows="right|top|bottom" + height="500" mouse_opaque="false" - name="side_bar_tabs" - right="500" - top="0" + name="side_bar_tabs" + right="500" + top="0" width="32"/> - </panel> - <!--filename="panel_stand_stop_flying.xml"--> - <layout_panel auto_resize="false" - follows="all" - min_height="25" - mouse_opaque="false" - name="stand_stop_flying_container" - visible="false"/> - <!--filename="panel_bottomtray.xml"--> - <layout_panel auto_resize="false" - follows="all" - min_height="33" - mouse_opaque="false" - name="bottom_tray_container" - visible="false"/> - </layout_stack> - <floater_view follows="all" - height="500" - mouse_opaque="false" - name="Floater View" - tab_group="-1" - tab_stop="false" - top="0"/> - <snapshot_floater_view enabled="false" - follows="all" - height="500" - left="0" - mouse_opaque="false" - name="Snapshot Floater View" - tab_stop="false" - top="0" - visible="false"/> - </panel> - <!-- side tray --> - <layout_panel auto_resize="false" - follows="all" - height="500" - min_width="333" + <panel bottom="500" + follows="left|right|bottom" + height="25" + left="0" + mouse_opaque="false" + name="stand_stop_flying_container" + visible="false" + width="500"/> + </panel> + <layout_panel auto_resize="false" + follows="all" + min_height="33" + mouse_opaque="false" + name="bottom_tray_container" + visible="false"/> + </layout_stack> + </panel> + <!-- side tray --> + <layout_panel auto_resize="false" + follows="all" + height="500" + min_width="333" + mouse_opaque="false" + name="side_tray_container" + user_resize="true" + visible="false" + width="333"/> + </layout_stack> + <floater_view follows="all" + height="500" + left="0" mouse_opaque="false" - name="side_tray_container" - user_resize="true" - visible="false" - width="333"/> - </layout_stack> + name="Floater View" + tab_group="-1" + tab_stop="false" + top="0" + width="1024"/> + <debug_view follows="all" + left="0" + top="0" + mouse_opaque="false" + height="500" + name="DebugView" + width="1024"/> + </panel> </layout_stack> <notify_box_view top="0" follows="all" @@ -128,6 +139,16 @@ mouse_opaque="false" name="Menu Holder" width="1024"/> + <snapshot_floater_view enabled="false" + follows="all" + height="768" + left="0" + mouse_opaque="false" + name="Snapshot Floater View" + tab_stop="false" + top="0" + visible="false" + width="1024"/> <tooltip_view top="0" follows="all" height="768" diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index f833e0a1cbb..faa38084f1a 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -31,6 +31,7 @@ height="10" image_name="spacer24.tga" layout="topleft" + min_width="4" left="0" top="0" width="4" /> @@ -44,7 +45,7 @@ min_height="23" width="310" top="0" - min_width="300" + min_width="310" name="chat_bar" user_resize="false" filename="panel_nearby_chat_bar.xml" /> @@ -57,30 +58,31 @@ min_height="28" width="100" top_delta="0" - min_width="96" + min_width="100" name="speak_panel" user_resize="false"> - <talk_button - follows="right" - height="23" - speak_button.tab_stop="true" - show_button.tab_stop="true" - layout="topleft" - left="0" - name="talk" - top="3" - width="100" /> + <talk_button + follows="right" + height="23" + speak_button.tab_stop="true" + show_button.tab_stop="true" + layout="topleft" + left="0" + name="talk" + top="3" + width="100" /> </layout_panel> - <icon - auto_resize="false" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" - name="DUMMY" - top="0" - width="4"/> + <icon + auto_resize="false" + follows="left|right" + height="10" + image_name="spacer24.tga" + layout="topleft" + left="0" + name="DUMMY" + min_width="4" + top="0" + width="4"/> <layout_panel mouse_opaque="false" auto_resize="false" @@ -112,6 +114,7 @@ image_name="spacer24.tga" layout="topleft" left="0" + min_width="4" name="DUMMY" top="0" width="4"/> @@ -149,6 +152,7 @@ image_name="spacer24.tga" layout="topleft" left="0" + min_width="4" name="DUMMY" top="0" width="4"/> @@ -188,6 +192,7 @@ image_name="spacer24.tga" layout="topleft" left="0" + min_width="4" name="DUMMY" top="0" width="4"/> @@ -243,6 +248,7 @@ image_name="spacer24.tga" layout="topleft" left="0" + min_width="4" top="0" width="5"/> <layout_panel @@ -288,6 +294,7 @@ height="10" image_name="spacer24.tga" layout="topleft" + min_width="4" right="-1" top="0" width="26"/> diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 7b9c9f47a2f..1171a8f0b5d 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -3,7 +3,7 @@ background_opaque="true" background_visible="true" bg_opaque_color="MouseGray" - follows="top|left|right" + follows="all" height="19" layout="topleft" left="0" diff --git a/indra/newview/skins/default/xui/en/widgets/context_menu.xml b/indra/newview/skins/default/xui/en/widgets/context_menu.xml new file mode 100644 index 00000000000..459706c689c --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/context_menu.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu visible="false"/> diff --git a/indra/newview/skins/default/xui/en/widgets/side_tray.xml b/indra/newview/skins/default/xui/en/widgets/side_tray.xml index 8b4a5afbe95..022564c12fc 100644 --- a/indra/newview/skins/default/xui/en/widgets/side_tray.xml +++ b/indra/newview/skins/default/xui/en/widgets/side_tray.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <side_tray tab_btn_image="TaskPanel_Tab_Off" - tab_btn_image_selected="TaskPanel_Tab_Selected" - tab_btn_width="32" - tab_btn_height="40" - tab_btn_margin="1" - > + tab_btn_image_selected="TaskPanel_Tab_Selected" + tab_btn_width="32" + tab_btn_height="40" + tab_btn_margin="1"> </side_tray> diff --git a/indra/newview/skins/default/xui/en/widgets/toggleable_menu.xml b/indra/newview/skins/default/xui/en/widgets/toggleable_menu.xml new file mode 100644 index 00000000000..48950a98ad5 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/toggleable_menu.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu visible="false"/> -- GitLab From b7d51146344cb2c50828cc4860cd61a90ee6e3c1 Mon Sep 17 00:00:00 2001 From: callum <none@none> Date: Mon, 9 Nov 2009 15:49:15 -0800 Subject: [PATCH 285/306] Fix for DEV-41797 - "LL_QUICKTIME_ENABLED is often unset on Windows builds" --- indra/cmake/QuickTimePlugin.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/cmake/QuickTimePlugin.cmake b/indra/cmake/QuickTimePlugin.cmake index 8afd8f304cc..02f432e3c10 100644 --- a/indra/cmake/QuickTimePlugin.cmake +++ b/indra/cmake/QuickTimePlugin.cmake @@ -12,13 +12,13 @@ elseif (WINDOWS) set(QUICKTIME_SDK_DIR "$ENV{PROGRAMFILES}/QuickTime SDK" CACHE PATH "Location of the QuickTime SDK.") - find_library(DEBUG_QUICKTIME_LIBRARY qtmlclient + find_library(DEBUG_QUICKTIME_LIBRARY qtmlclient.lib PATHS ${ARCH_PREBUILT_DIRS_DEBUG} "${QUICKTIME_SDK_DIR}\\libraries" ) - find_library(RELEASE_QUICKTIME_LIBRARY qtmlclient + find_library(RELEASE_QUICKTIME_LIBRARY qtmlclient.lib PATHS ${ARCH_PREBUILT_DIRS_RELEASE} "${QUICKTIME_SDK_DIR}\\libraries" -- GitLab From 5cbf5b63fc9db6fa693cd70c01170db97f1c1442 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Mon, 9 Nov 2009 15:55:12 -0800 Subject: [PATCH 286/306] First name field on login screen is now same size as last name. Reviewed with Ambroff --- indra/newview/skins/default/xui/en/panel_login.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 1646cba0a73..cb5ec153875 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -51,6 +51,7 @@ </text> <line_editor follows="left|bottom" + font="SansSerif" handle_edit_keys_directly="true" height="20" left_delta="0" -- GitLab From 668ba958c77d46c87f54f8d6e77b5aac921b5733 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Mon, 9 Nov 2009 15:59:53 -0800 Subject: [PATCH 287/306] Disabled saving notifications to disk because the load code hasn't worked for months, it spams the logs, and it hits the disk. Discussed with Q, the author. --- indra/llui/llnotifications.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index ef222bad608..eb8cc3e2c50 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -81,6 +81,11 @@ class LLNotificationHistoryChannel : public LLNotificationChannel void savePersistentNotifications() { + /* NOTE: As of 2009-11-09 the reload of notifications on startup does not + work, and has not worked for months. Skip saving notifications until the + read can be fixed, because this hits the disk once per notification and + causes log spam. James + llinfos << "Saving open notifications to " << mFileName << llendl; llofstream notify_file(mFileName.c_str()); @@ -107,6 +112,7 @@ class LLNotificationHistoryChannel : public LLNotificationChannel LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter(); formatter->format(output, notify_file, LLSDFormatter::OPTIONS_PRETTY); + */ } void loadPersistentNotifications() -- GitLab From 2f4174692e91768ad1302fbfadb5e12fb8670da3 Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Mon, 9 Nov 2009 16:00:46 -0800 Subject: [PATCH 288/306] DEV-42409 Email snapshot now fills in sender email address as before. Sending now works. Reviewed with Ambroff. --- indra/newview/llfloaterpostcard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp index 938370b732a..ae1a99e5fc4 100644 --- a/indra/newview/llfloaterpostcard.cpp +++ b/indra/newview/llfloaterpostcard.cpp @@ -291,7 +291,7 @@ void LLFloaterPostcard::uploadCallback(const LLUUID& asset_id, void *user_data, // static void LLFloaterPostcard::updateUserInfo(const std::string& email) { - LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel"); + LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("postcard"); for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) { -- GitLab From 2bc97bd68a774dd373c5688b5dc660abe90b37cc Mon Sep 17 00:00:00 2001 From: richard <none@none> Date: Mon, 9 Nov 2009 16:01:21 -0800 Subject: [PATCH 289/306] renamed LLLayoutStack::idle to LLLayoutStack::updateClass converted mWorldViewPlaceholder to a LLHandle<LLView> improved layout of panel_bottomtray reviewed by James --- indra/llui/lllayoutstack.cpp | 2 +- indra/llui/lllayoutstack.h | 2 +- indra/newview/llsidetray.cpp | 6 +++--- indra/newview/llsidetray.h | 5 +---- indra/newview/llviewerwindow.cpp | 8 ++++---- indra/newview/llviewerwindow.h | 2 +- indra/newview/skins/default/xui/en/panel_bottomtray.xml | 4 ++-- 7 files changed, 13 insertions(+), 16 deletions(-) diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 596b3a3e70a..5999e1a29e0 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -790,7 +790,7 @@ void LLLayoutStack::calcMinExtents() // we might still need to call updateLayout during UI draw phase, in case UI elements // are resizing themselves dynamically //static -void LLLayoutStack::idle() +void LLLayoutStack::updateClass() { for (LLInstanceTracker::instance_iter it = beginInstances(); it != endInstances(); ++it) { diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index 11d604b7ec7..8475079f5eb 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -83,7 +83,7 @@ class LLLayoutStack : public LLView, LLInstanceTracker<LLLayoutStack> void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize); - static void idle(); + static void updateClass(); protected: LLLayoutStack(const Params&); diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index f0e782d44d8..061587f11b7 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -455,7 +455,7 @@ void LLSideTray::onToggleCollapse() void LLSideTray::reflectCollapseChange() { - setPanelRect(); + updateSidetrayVisibility(); if(mCollapsed) { @@ -475,7 +475,7 @@ void LLSideTray::arrange() { static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>()); - setPanelRect(); + updateSidetrayVisibility(); LLRect ctrl_rect; ctrl_rect.setLeftTopAndSize(0, @@ -637,7 +637,7 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para static const S32 fake_offset = 132; static const S32 fake_top_offset = 18; -void LLSideTray::setPanelRect () +void LLSideTray::updateSidetrayVisibility() { // set visibility of parent container based on collapsed state if (getParent()) diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 72a9465baa0..4d6081e230c 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -134,9 +134,6 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray> void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE); - void resetPanelRect (); - - protected: LLSideTrayTab* getTab (const std::string& name); @@ -147,7 +144,7 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray> void toggleTabButton (LLSideTrayTab* tab); - void setPanelRect (); + void updateSidetrayVisibility(); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index b15019f830f..5e5aec5cb95 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1406,7 +1406,7 @@ void LLViewerWindow::initBase() getRootView()->addChild(main_view); // placeholder widget that controls where "world" is rendered - mWorldViewPlaceholder = main_view->getChildView("world_view_rect"); + mWorldViewPlaceholder = main_view->getChildView("world_view_rect")->getHandle(); // Constrain floaters to inside the menu and status bar regions. gFloaterView = getRootView()->getChild<LLFloaterView>("Floater View"); @@ -2329,7 +2329,7 @@ void LLViewerWindow::updateUI() static std::string last_handle_msg; // animate layout stacks so we have up to date rect for world view - LLLayoutStack::idle(); + LLLayoutStack::updateClass(); updateWorldViewRect(); @@ -2839,9 +2839,9 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window) // start off using whole window to render world LLRect new_world_rect = mWindowRect; - if (use_full_window == false) + if (use_full_window == false && mWorldViewPlaceholder.get()) { - new_world_rect = mWorldViewPlaceholder->calcScreenRect(); + new_world_rect = mWorldViewPlaceholder.get()->calcScreenRect(); // clamp to at least a 1x1 rect so we don't try to allocate zero width gl buffers new_world_rect.mTop = llmax(new_world_rect.mTop, new_world_rect.mBottom + 1); new_world_rect.mRight = llmax(new_world_rect.mRight, new_world_rect.mLeft + 1); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 31a458a15b5..6750c39dbbf 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -451,7 +451,7 @@ class LLViewerWindow : public LLWindowCallbacks std::string mInitAlert; // Window / GL initialization requires an alert - LLView* mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world + LLHandle<LLView> mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world class LLDebugText* mDebugText; // Internal class for debug text diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index faa38084f1a..d990ebfd4a9 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -56,9 +56,9 @@ height="28" layout="topleft" min_height="28" - width="100" + width="104" top_delta="0" - min_width="100" + min_width="104" name="speak_panel" user_resize="false"> <talk_button -- GitLab From 17ab5928c2416b4787e03c54307add77217d831e Mon Sep 17 00:00:00 2001 From: Lynx Linden <lynx@lindenlab.com> Date: Tue, 10 Nov 2009 00:10:44 +0000 Subject: [PATCH 290/306] DEV-41317 DEV-42311: Enabled the "Call" button in more side panels. The various People panels now have Call buttons that work. Currently we only support single selection of users in lists for P2P voice chat. Multiple selection for ad-hoc chat is next... --- indra/newview/llpanelavatar.cpp | 4 +- indra/newview/llpanelpeople.cpp | 32 ++- .../skins/default/xui/en/panel_notes.xml | 1 - .../skins/default/xui/en/panel_people.xml | 210 ++++++------------ 4 files changed, 93 insertions(+), 154 deletions(-) diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 6413d939f0e..3b54f1546e8 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -255,7 +255,7 @@ void LLPanelAvatarNotes::onTeleportButtonClick() void LLPanelAvatarNotes::onCallButtonClick() { - //*TODO not implemented. + LLAvatarActions::startCall(getAvatarId()); } void LLPanelAvatarNotes::onShareButtonClick() @@ -544,7 +544,7 @@ void LLPanelAvatarProfile::onTeleportButtonClick() void LLPanelAvatarProfile::onCallButtonClick() { - //*TODO not implemented + LLAvatarActions::startCall(getAvatarId()); } void LLPanelAvatarProfile::onShareButtonClick() diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index bb6cdd2f78e..0c66e7155c5 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -588,14 +588,9 @@ void LLPanelPeople::updateRecentList() void LLPanelPeople::buttonSetVisible(std::string btn_name, BOOL visible) { - // Currently all bottom buttons are wrapped with layout panels. - // Hiding a button has no effect: the panel still occupies its space. - // So we have to hide the whole panel (along with its button) - // to free some space up. - LLButton* btn = getChild<LLView>("button_bar")->getChild<LLButton>(btn_name); - LLPanel* btn_parent = dynamic_cast<LLPanel*>(btn->getParent()); - if (btn_parent) - btn_parent->setVisible(visible); + // To make sure we're referencing the right widget (a child of the button bar). + LLButton* button = getChild<LLView>("button_bar")->getChild<LLButton>(btn_name); + button->setVisible(visible); } void LLPanelPeople::buttonSetEnabled(const std::string& btn_name, bool enabled) @@ -624,14 +619,16 @@ void LLPanelPeople::updateButtons() std::vector<LLUUID> selected_uuids; getCurrentItemIDs(selected_uuids); bool item_selected = (selected_uuids.size() == 1); + bool multiple_selected = (selected_uuids.size() >= 1); buttonSetVisible("group_info_btn", group_tab_active); buttonSetVisible("chat_btn", group_tab_active); buttonSetVisible("add_friend_btn", nearby_tab_active || recent_tab_active); buttonSetVisible("view_profile_btn", !group_tab_active); buttonSetVisible("im_btn", !group_tab_active); + buttonSetVisible("call_btn", !group_tab_active); buttonSetVisible("teleport_btn", friends_tab_active); - buttonSetVisible("share_btn", !recent_tab_active && false); // not implemented yet + buttonSetVisible("share_btn", nearby_tab_active || friends_tab_active); if (group_tab_active) { @@ -664,8 +661,8 @@ void LLPanelPeople::updateButtons() buttonSetEnabled("teleport_btn", friends_tab_active && item_selected); buttonSetEnabled("view_profile_btn", item_selected); - buttonSetEnabled("im_btn", (selected_uuids.size() >= 1)); // allow starting the friends conference for multiple selection - buttonSetEnabled("call_btn", item_selected && false); // not implemented yet + buttonSetEnabled("im_btn", multiple_selected); // allow starting the friends conference for multiple selection + buttonSetEnabled("call_btn", item_selected); buttonSetEnabled("share_btn", item_selected && false); // not implemented yet bool none_group_selected = item_selected && selected_id.isNull(); @@ -1071,7 +1068,18 @@ bool LLPanelPeople::onRecentViewSortMenuItemCheck(const LLSD& userdata) void LLPanelPeople::onCallButtonClicked() { - // *TODO: not implemented yet + std::vector<LLUUID> selected_uuids; + getCurrentItemIDs(selected_uuids); + + if (selected_uuids.size() == 1) + { + // initiate a P2P voice chat with the selected user + LLAvatarActions::startCall(getCurrentItemID()); + } + else if (selected_uuids.size() > 1) + { + // *NOTE: ad-hoc voice chat not implemented yet + } } void LLPanelPeople::onTeleportButtonClicked() diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml index b9c9100ebcd..c02dabed2c1 100644 --- a/indra/newview/skins/default/xui/en/panel_notes.xml +++ b/indra/newview/skins/default/xui/en/panel_notes.xml @@ -132,7 +132,6 @@ left_pad="5" width="40" /> <button - enabled="false" follows="bottom|left" height="19" label="Call" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index d6e2aa64fa5..15fdd73bdc1 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -329,156 +329,88 @@ background_visible="true" </panel> </panel> </tab_container> - <layout_stack - animate="false" - border_size="0" - follows="left|right|bottom" + <panel + follows="bottom|left" height="25" layout="topleft" left="10" name="button_bar" - orientation="horizontal" width="313"> - <layout_panel - default_tab_group="1" - follows="left|top" - height="25" - layout="topleft" + <button + follows="bottom|left" + font="SansSerifSmall" + top="4" left="0" - name="view_profile_btn_panel" - top="-25" - width="100"> - <button - follows="top|left" - font="SansSerifSmall" - height="19" - label="Profile" - layout="topleft" - name="view_profile_btn" - tool_tip="Show picture, groups, and other residents information" - width="100" /> - </layout_panel> - <layout_panel - default_tab_group="1" - follows="left|top" height="19" + label="Profile" layout="topleft" - left="0" - min_width="80" - name="group_info_btn_panel" - width="100"> - <button - follows="top|left" - font="SansSerifSmall" - height="19" - label="Group Profile" - layout="topleft" - name="group_info_btn" - tool_tip="Show group information" - width="100" /> - </layout_panel> - <layout_panel - default_tab_group="1" - follows="left|top" - height="25" - layout="topleft" - left_pad="5" - min_width="45" - name="chat_btn_panel" - top_delta="0" - width="100"> - <button - follows="top|left" - font="SansSerifSmall" - height="19" - label="Group Chat" - layout="topleft" - name="chat_btn" - tool_tip="Open chat session" - width="100" /> - </layout_panel> - <layout_panel - default_tab_group="1" - follows="left|top|" - height="25" + name="view_profile_btn" + tool_tip="Show picture, groups, and other residents information" + width="70" /> + <button + follows="bottom|left" + font="SansSerifSmall" + top="4" + left_pad="2" + height="19" + label="IM" layout="topleft" - left_pad="5" - min_width="35" - name="im_btn_panel" - top_delta="0" - width="50"> - <button - follows="top|left" - font="SansSerifSmall" - height="19" - label="IM" - layout="topleft" - name="im_btn" - tool_tip="Open instant message session" - width="50" /> - </layout_panel> - <layout_panel - default_tab_group="1" - follows="left|top|right" - height="25" + name="im_btn" + tool_tip="Open instant message session" + width="45" /> + <button + follows="bottom|left" + font="SansSerifSmall" + top="4" + left_pad="2" + height="19" + label="Call" layout="topleft" - left_pad="5" - min_width="40" - name="call_btn_panel" - top_delta="0" - visible="false" - width="40"> - <button - enabled="false" - follows="top|left" - font="SansSerifSmall" - height="19" - label="Call" - layout="topleft" - name="call_btn" - width="50" /> - </layout_panel> - <layout_panel - default_tab_group="1" + name="call_btn" + tool_tip="Call this resident" + width="50" /> + <button follows="left|top" - height="25" + font="SansSerifSmall" + top="4" + left_pad="2" + height="19" + label="Share" layout="topleft" - left_pad="5" - min_width="65" - name="teleport_btn_panel" - top_delta="0" - width="100"> - <button - follows="left|top" - font="SansSerifSmall" - height="19" - label="Teleport" - layout="topleft" - name="teleport_btn" - tool_tip="Offer teleport" - width="100" /> - </layout_panel> - <layout_panel - default_tab_group="1" - enabled="false" - follows="left|top" - height="25" + name="share_btn" + width="60" /> + <button + follows="bottom|left" + font="SansSerifSmall" + top="4" + left_pad="2" + height="19" + label="Teleport" layout="topleft" - left_pad="5" - min_width="50" - name="share_btn_panel" - top_delta="0" - visible="false" - width="80"> - <button - enabled="false" - follows="top|left" - font="SansSerifSmall" - height="19" - label="Share" - layout="topleft" - name="share_btn" - width="80" /> - </layout_panel> - </layout_stack> + name="teleport_btn" + tool_tip="Offer teleport" + width="75" /> + <button + follows="bottom|left" + font="SansSerifSmall" + top="4" + left="0" + height="19" + label="Group Profile" + layout="topleft" + name="group_info_btn" + tool_tip="Show group information" + width="110" /> + <button + follows="bottom|left" + font="SansSerifSmall" + top="4" + left_pad="2" + height="19" + label="Group Chat" + layout="topleft" + name="chat_btn" + tool_tip="Open chat session" + width="110" /> + </panel> </panel> -- GitLab From caadf0be39b844e6bf91c5a302a837d107a1e415 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Mon, 9 Nov 2009 16:19:33 -0800 Subject: [PATCH 291/306] Fix for DEV-42029 (changing media on multiple faces can make a zombie SLPlugin). Made LLViewerMedia::updateMediaImpl() unload the impl's media plugin when the current URL goes empty. Made LLVOVolume::syncMediaData() call removeMediaImpl() if the media data gets deleted. --- indra/newview/llviewermedia.cpp | 14 ++++++++++++-- indra/newview/llvovolume.cpp | 4 ++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 40bf9fb1fe2..91f4ff9b845 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -261,9 +261,19 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s media_impl->mMediaSource->setSize(media_entry->getWidthPixels(), media_entry->getHeightPixels()); } - if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))) && !update_from_self) + if(media_entry->getCurrentURL().empty()) { - if(!media_entry->getCurrentURL().empty()) + // The current media URL is now empty. Unload the media source. + if(was_loaded) + media_impl->destroyMediaSource(); + } + else + { + // The current media URL is not empty. + // If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent, + // do a navigate. + + if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))) && !update_from_self) { needs_navigate = (media_entry->getCurrentURL() != previous_url); } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index a32abf3ab94..c987dd17647 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1733,6 +1733,10 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m addMediaImpl(media_impl, texture_index) ; } + else + { + removeMediaImpl(texture_index); + } //llinfos << "AFTER: texture_index = " << texture_index // << " hasMedia = " << te->hasMedia() << " : " -- GitLab From ed43195ee059e0a1cebf24066a4c39c52bd1e827 Mon Sep 17 00:00:00 2001 From: Palmer <palmer@lindenlab.com> Date: Mon, 9 Nov 2009 16:24:58 -0800 Subject: [PATCH 292/306] Dev-42424 Turning on impostors for intel cards above 965 --- indra/newview/featuretable.txt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index d557df3d927..d20c23df808 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -245,7 +245,6 @@ RenderVBOEnable 1 0 list Intel RenderAnisotropic 1 0 RenderLightingDetail 1 0 -RenderUseImpostors 0 0 list GeForce2 RenderAnisotropic 1 0 @@ -261,51 +260,63 @@ UseOcclusion 0 0 list Intel_830M RenderTerrainDetail 1 0 RenderVBOEnable 1 0 +RenderUseImpostors 0 0 list Intel_845G RenderTerrainDetail 1 0 RenderVBOEnable 1 0 +RenderUseImpostors 0 0 list Intel_855GM RenderTerrainDetail 1 0 RenderVBOEnable 1 0 +RenderUseImpostors 0 0 list Intel_865G RenderTerrainDetail 1 0 RenderVBOEnable 1 0 +RenderUseImpostors 0 0 list Intel_900 RenderTerrainDetail 1 0 RenderVBOEnable 1 0 +RenderUseImpostors 0 0 list Intel_915GM RenderTerrainDetail 1 0 RenderVBOEnable 1 0 +RenderUseImpostors 0 0 list Intel_915G RenderTerrainDetail 1 0 RenderVBOEnable 1 0 +RenderUseImpostors 0 0 list Intel_945GM RenderTerrainDetail 1 0 RenderVBOEnable 1 0 +RenderUseImpostors 0 0 list Intel_945G RenderTerrainDetail 1 0 RenderVBOEnable 1 0 +RenderUseImpostors 0 0 list Intel_950 RenderTerrainDetail 1 0 RenderVBOEnable 1 0 +RenderUseImpostors 0 0 list Intel_965 RenderTerrainDetail 1 0 RenderVBOEnable 1 0 UseOcclusion 0 0 +RenderUseImpostors 0 0 list Intel_G33 RenderTerrainDetail 1 0 RenderVBOEnable 1 0 +RenderUseImpostors 0 0 list Intel_G45 WindLightUseAtmosShaders 0 0 -- GitLab From ebbb468a795d503a8869467d642d5f4962a3d7bf Mon Sep 17 00:00:00 2001 From: Rick Pasetto <rick@lindenlab.com> Date: Mon, 9 Nov 2009 16:56:33 -0800 Subject: [PATCH 293/306] FIX DEV-42093 - Make sure to navigate home if current URL is empty on "Apply" This change gets rid of the crufty (and confusing) "apply()" functions from llpanelmediasettings*. Those functions were never being called, yet changes were being made in them. Instead, I added "preApply()" and "postApply()" to each of these panels, which the floater (who really does the "apply()"ing) now calls before and after it applies the changes to the media data. --- indra/newview/llfloatermediasettings.cpp | 9 ++- indra/newview/llpanelmediasettingsgeneral.cpp | 69 +++++++++++-------- indra/newview/llpanelmediasettingsgeneral.h | 23 +++++-- .../llpanelmediasettingspermissions.cpp | 21 +++--- .../newview/llpanelmediasettingspermissions.h | 46 +++++++------ .../newview/llpanelmediasettingssecurity.cpp | 52 +++++++------- indra/newview/llpanelmediasettingssecurity.h | 56 ++++++++------- 7 files changed, 157 insertions(+), 119 deletions(-) diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp index d941f24f49e..44e68d77455 100644 --- a/indra/newview/llfloatermediasettings.cpp +++ b/indra/newview/llfloatermediasettings.cpp @@ -145,13 +145,18 @@ LLFloaterMediaSettings* LLFloaterMediaSettings::getInstance() //static void LLFloaterMediaSettings::apply() { - LLSD settings; + sInstance->mPanelMediaSettingsGeneral->preApply(); sInstance->mPanelMediaSettingsGeneral->getValues( settings ); - sInstance->mPanelMediaSettingsSecurity->getValues( settings ); + sInstance->mPanelMediaSettingsSecurity->preApply(); + sInstance->mPanelMediaSettingsSecurity->getValues( settings ); + sInstance->mPanelMediaSettingsPermissions->preApply(); sInstance->mPanelMediaSettingsPermissions->getValues( settings ); LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA ); LLSelectMgr::getInstance()->selectionSetMediaData(settings); + sInstance->mPanelMediaSettingsGeneral->postApply(); + sInstance->mPanelMediaSettingsSecurity->postApply(); + sInstance->mPanelMediaSettingsPermissions->postApply(); } //////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index 5186a5888b1..2cf56d55711 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -366,21 +366,15 @@ void LLPanelMediaSettingsGeneral::onCommitHomeURL( LLUICtrl* ctrl, void *userdat void LLPanelMediaSettingsGeneral::onBtnResetCurrentUrl(LLUICtrl* ctrl, void *userdata) { LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata; - self->navigateHomeSelectedFace(); + self->navigateHomeSelectedFace(false); } //////////////////////////////////////////////////////////////////////////////// -// static -void LLPanelMediaSettingsGeneral::apply( void* userdata ) +// +void LLPanelMediaSettingsGeneral::preApply() { - LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata; - self->mHomeURL->onCommit(); - // build LLSD Fragment - LLSD media_data_general; - self->getValues(media_data_general); - - // this merges contents of LLSD passed in with what's there so this is ok - LLSelectMgr::getInstance()->selectionSetMediaData( media_data_general ); + // Make sure the home URL entry is committed + mHomeURL->onCommit(); } //////////////////////////////////////////////////////////////////////////////// @@ -392,13 +386,24 @@ void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in ) fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = mAutoScale->getValue(); fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = mAutoZoom->getValue(); fill_me_in[LLMediaEntry::CONTROLS_KEY] = mControls->getCurrentIndex(); - fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue(); + //Don't fill in current URL: this is only supposed to get changed via navigate + // fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue(); fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = mHeightPixels->getValue(); fill_me_in[LLMediaEntry::HOME_URL_KEY] = mHomeURL->getValue(); fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = mFirstClick->getValue(); fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = mWidthPixels->getValue(); } +//////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsGeneral::postApply() +{ + // Make sure to navigate to the home URL if the current URL is empty and + // autoplay is on + navigateHomeSelectedFace(true); +} + + //////////////////////////////////////////////////////////////////////////////// // void LLPanelMediaSettingsGeneral::setParent( LLFloaterMediaSettings* parent ) @@ -406,33 +411,37 @@ void LLPanelMediaSettingsGeneral::setParent( LLFloaterMediaSettings* parent ) mParent = parent; }; -bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace() +//////////////////////////////////////////////////////////////////////////////// +// +bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace(bool only_if_current_is_empty) { - // HACK: This is directly referencing an impl name. BAD! - // This can be removed when we have a truly generic media browser that only - // builds an impl based on the type of url it is passed. struct functor_navigate_media : public LLSelectedTEGetFunctor< bool> { + functor_navigate_media(bool flag) : only_if_current_is_empty(flag) {} bool get( LLViewerObject* object, S32 face ) { - if ( object ) - if ( object->getTE(face) ) - if ( object->getTE(face)->getMediaData() ) + if ( object && object->getTE(face) && object->permModify() ) + { + const LLMediaEntry *media_data = object->getTE(face)->getMediaData(); + if ( media_data ) + { + if (!only_if_current_is_empty || (media_data->getCurrentURL().empty() && media_data->getAutoPlay())) { - if(object->permModify()) + viewer_media_t media_impl = + LLViewerMedia::getMediaImplFromTextureID(object->getTE(face)->getMediaData()->getMediaID()); + if(media_impl) { - viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(object->getTE(face)->getMediaData()->getMediaID()); - if(media_impl) - { - media_impl->navigateHome(); - return true; - } - } + media_impl->navigateHome(); + return true; + } } - return false; - }; + } + } + return false; + }; + bool only_if_current_is_empty; - } functor_navigate_media; + } functor_navigate_media(only_if_current_is_empty); bool all_face_media_navigated = false; LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection(); diff --git a/indra/newview/llpanelmediasettingsgeneral.h b/indra/newview/llpanelmediasettingsgeneral.h index b48e081a1b5..f8b8f0d224a 100644 --- a/indra/newview/llpanelmediasettingsgeneral.h +++ b/indra/newview/llpanelmediasettingsgeneral.h @@ -47,21 +47,30 @@ class LLFloaterMediaSettings; class LLPanelMediaSettingsGeneral : public LLPanel { public: + LLPanelMediaSettingsGeneral(); + ~LLPanelMediaSettingsGeneral(); + + // XXX TODO: put these into a common parent class? + // Hook that the floater calls before applying changes from the panel + void preApply(); + // Function that asks the panel to fill in values associated with the panel + void getValues(LLSD &fill_me_in); + // Hook that the floater calls after applying changes to the panel + void postApply(); + BOOL postBuild(); /*virtual*/ void draw(); /*virtual*/ void onClose(bool app_quitting); - static void apply(void*); - void getValues(LLSD &fill_me_in); - - LLPanelMediaSettingsGeneral(); - ~LLPanelMediaSettingsGeneral(); - void setParent( LLFloaterMediaSettings* parent ); static void initValues( void* userdata, const LLSD& media_settings ,bool editable); static void clearValues( void* userdata, bool editable); - bool navigateHomeSelectedFace(); + // Navigates the current selected face to the Home URL. + // If 'only_if_current_is_empty' is "true", it only performs + // the operation if: 1) the current URL is empty, and 2) auto play is true. + bool navigateHomeSelectedFace(bool only_if_current_is_empty); + void updateMediaPreview(); const std::string getHomeUrl(); diff --git a/indra/newview/llpanelmediasettingspermissions.cpp b/indra/newview/llpanelmediasettingspermissions.cpp index 4d84874e7a8..2f3f550e35b 100644 --- a/indra/newview/llpanelmediasettingspermissions.cpp +++ b/indra/newview/llpanelmediasettingspermissions.cpp @@ -218,17 +218,10 @@ void LLPanelMediaSettingsPermissions::initValues( void* userdata, const LLSD& me } //////////////////////////////////////////////////////////////////////////////// -// static -void LLPanelMediaSettingsPermissions::apply( void* userdata ) +// +void LLPanelMediaSettingsPermissions::preApply() { - LLPanelMediaSettingsPermissions *self =(LLPanelMediaSettingsPermissions *)userdata; - - // build LLSD Fragment - LLSD media_data_permissions; - self->getValues(media_data_permissions); - - // this merges contents of LLSD passed in with what's there so this is ok - LLSelectMgr::getInstance()->selectionSetMediaData( media_data_permissions ); + // no-op } //////////////////////////////////////////////////////////////////////////////// @@ -254,3 +247,11 @@ void LLPanelMediaSettingsPermissions::getValues( LLSD &fill_me_in ) fill_me_in[LLMediaEntry::PERMS_CONTROL_KEY] = control; fill_me_in[LLMediaEntry::PERMS_INTERACT_KEY] = interact; } + + +//////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsPermissions::postApply() +{ + // no-op +} diff --git a/indra/newview/llpanelmediasettingspermissions.h b/indra/newview/llpanelmediasettingspermissions.h index ecc50e35826..45a596c615e 100644 --- a/indra/newview/llpanelmediasettingspermissions.h +++ b/indra/newview/llpanelmediasettingspermissions.h @@ -46,26 +46,32 @@ class LLNameBox; class LLPanelMediaSettingsPermissions : public LLPanel { - public: - BOOL postBuild(); - virtual void draw(); - static void apply(void*); - void getValues(LLSD &fill_me_in); - - LLPanelMediaSettingsPermissions(); - ~LLPanelMediaSettingsPermissions(); - - static void initValues( void* userdata, const LLSD& media_settings, bool editable ); - static void clearValues( void* userdata, bool editable); - - private: - LLCheckBoxCtrl* mPermsOwnerInteract; - LLCheckBoxCtrl* mPermsOwnerControl; - LLNameBox* mPermsGroupName; - LLCheckBoxCtrl* mPermsGroupInteract; - LLCheckBoxCtrl* mPermsGroupControl; - LLCheckBoxCtrl* mPermsWorldInteract; - LLCheckBoxCtrl* mPermsWorldControl; +public: + LLPanelMediaSettingsPermissions(); + ~LLPanelMediaSettingsPermissions(); + + BOOL postBuild(); + virtual void draw(); + + // XXX TODO: put these into a common parent class? + // Hook that the floater calls before applying changes from the panel + void preApply(); + // Function that asks the panel to fill in values associated with the panel + void getValues(LLSD &fill_me_in); + // Hook that the floater calls after applying changes to the panel + void postApply(); + + static void initValues( void* userdata, const LLSD& media_settings, bool editable ); + static void clearValues( void* userdata, bool editable); + +private: + LLCheckBoxCtrl* mPermsOwnerInteract; + LLCheckBoxCtrl* mPermsOwnerControl; + LLNameBox* mPermsGroupName; + LLCheckBoxCtrl* mPermsGroupInteract; + LLCheckBoxCtrl* mPermsGroupControl; + LLCheckBoxCtrl* mPermsWorldInteract; + LLCheckBoxCtrl* mPermsWorldControl; }; #endif // LL_LLPANELMEDIAMEDIASETTINGSPERMISSIONS_H diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp index 3577f63340f..611293f3e20 100644 --- a/indra/newview/llpanelmediasettingssecurity.cpp +++ b/indra/newview/llpanelmediasettingssecurity.cpp @@ -198,17 +198,12 @@ void LLPanelMediaSettingsSecurity::clearValues( void* userdata , bool editable) self->mEnableWhiteList->setEnabled(editable); self->mWhiteListList->setEnabled(editable); } + //////////////////////////////////////////////////////////////////////////////// -// static -void LLPanelMediaSettingsSecurity::apply( void* userdata ) +// +void LLPanelMediaSettingsSecurity::preApply() { - LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata; - - // build LLSD Fragment - LLSD media_data_security; - self->getValues(media_data_security); - // this merges contents of LLSD passed in with what's there so this is ok - LLSelectMgr::getInstance()->selectionSetMediaData( media_data_security ); + // no-op } //////////////////////////////////////////////////////////////////////////////// @@ -220,7 +215,7 @@ void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in ) // iterate over white list and extract items std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData(); std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin(); - fill_me_in[LLMediaEntry::WHITELIST_KEY].clear(); + fill_me_in.erase(LLMediaEntry::WHITELIST_KEY); while( iter != white_list_items.end() ) { std::string white_list_url = (*iter)->getValue().asString(); @@ -229,23 +224,30 @@ void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in ) }; } +//////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsSecurity::postApply() +{ + // no-op +} + /////////////////////////////////////////////////////////////////////////////// // Try to make a valid URL if a fragment ( // white list list box widget and build a list to test against. Can also const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& src_url ) { // use LLURI to determine if we have a valid scheme - LLURI candidate_url( src_url ); - if ( candidate_url.scheme().empty() ) - { + LLURI candidate_url( src_url ); + if ( candidate_url.scheme().empty() ) + { // build a URL comprised of default scheme and the original fragment const std::string default_scheme( "http://" ); return default_scheme + src_url; - }; - - // we *could* test the "default scheme" + "original fragment" URL again - // using LLURI to see if it's valid but I think the outcome is the same - // in either case - our only option is to return the original URL + }; + + // we *could* test the "default scheme" + "original fragment" URL again + // using LLURI to see if it's valid but I think the outcome is the same + // in either case - our only option is to return the original URL // we *think* the original url passed in was valid return src_url; @@ -332,10 +334,10 @@ void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata ) self->mWhiteListList->deleteSelectedItems(); } -//////////////////////////////////////////////////////////////////////////////// -// -void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent ) -{ - mParent = parent; -}; - +//////////////////////////////////////////////////////////////////////////////// +// +void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent ) +{ + mParent = parent; +}; + diff --git a/indra/newview/llpanelmediasettingssecurity.h b/indra/newview/llpanelmediasettingssecurity.h index 2555bb8dc85..638664e59d7 100644 --- a/indra/newview/llpanelmediasettingssecurity.h +++ b/indra/newview/llpanelmediasettingssecurity.h @@ -41,31 +41,37 @@ class LLFloaterMediaSettings; class LLPanelMediaSettingsSecurity : public LLPanel { - public: - BOOL postBuild(); - virtual void draw(); - static void apply(void*); - void getValues(LLSD &fill_me_in); - - LLPanelMediaSettingsSecurity(); - ~LLPanelMediaSettingsSecurity(); - - static void initValues( void* userdata, const LLSD& media_settings,bool editable ); - static void clearValues( void* userdata, bool editable); - void addWhiteListItem(const std::string& url); - void setParent( LLFloaterMediaSettings* parent ); - const std::string makeValidUrl( const std::string& src_url ); - bool passesWhiteList( const std::string& added_url, const std::string& test_url ); - - protected: - LLFloaterMediaSettings* mParent; - - private: - LLCheckBoxCtrl* mEnableWhiteList; - LLScrollListCtrl* mWhiteListList; - - static void onBtnAdd(void*); - static void onBtnDel(void*); +public: + LLPanelMediaSettingsSecurity(); + ~LLPanelMediaSettingsSecurity(); + + BOOL postBuild(); + virtual void draw(); + + // XXX TODO: put these into a common parent class? + // Hook that the floater calls before applying changes from the panel + void preApply(); + // Function that asks the panel to fill in values associated with the panel + void getValues(LLSD &fill_me_in); + // Hook that the floater calls after applying changes to the panel + void postApply(); + + static void initValues( void* userdata, const LLSD& media_settings,bool editable ); + static void clearValues( void* userdata, bool editable); + void addWhiteListItem(const std::string& url); + void setParent( LLFloaterMediaSettings* parent ); + const std::string makeValidUrl( const std::string& src_url ); + bool passesWhiteList( const std::string& added_url, const std::string& test_url ); + +protected: + LLFloaterMediaSettings* mParent; + +private: + LLCheckBoxCtrl* mEnableWhiteList; + LLScrollListCtrl* mWhiteListList; + + static void onBtnAdd(void*); + static void onBtnDel(void*); }; #endif // LL_LLPANELMEDIAMEDIASETTINGSSECURITY_H -- GitLab From 312e7d21a4d4996460e84aca478691ac0a4828ea Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Mon, 9 Nov 2009 17:11:13 -0800 Subject: [PATCH 294/306] Refinement to my previous commit: Created LLViewerMediaImpl::unload(), which unloads the media and clears internal state (such as the last-navigated URL) to keep it from getting reloaded. LLViewerMedia::updateMediaImpl() now calls unload() on the impl instead of just using destroyMediaSource(). --- indra/newview/llviewermedia.cpp | 14 ++++++++++++-- indra/newview/llviewermedia.h | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 91f4ff9b845..11c1fcb1ea5 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -264,8 +264,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s if(media_entry->getCurrentURL().empty()) { // The current media URL is now empty. Unload the media source. - if(was_loaded) - media_impl->destroyMediaSource(); + media_impl->unload(); } else { @@ -1270,6 +1269,17 @@ void LLViewerMediaImpl::navigateHome() navigateTo(mHomeURL, "", true, false); } +////////////////////////////////////////////////////////////////////////////////////////// +void LLViewerMediaImpl::unload() +{ + // Unload the media impl and clear its state. + destroyMediaSource(); + resetPreviousMediaState(); + mMediaURL.clear(); + mMimeType.clear(); + mCurrentMediaURL.clear(); +} + ////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mime_type, bool rediscover_type, bool server_request) { diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 4cb08177353..7cbfb56ffcc 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -165,6 +165,7 @@ class LLViewerMediaImpl void navigateForward(); void navigateReload(); void navigateHome(); + void unload(); void navigateTo(const std::string& url, const std::string& mime_type = "", bool rediscover_type = false, bool server_request = false); void navigateInternal(); void navigateStop(); -- GitLab From f4186b6d3d45259c83fa1b13db25abcd34f227a9 Mon Sep 17 00:00:00 2001 From: Rick Pasetto <rick@lindenlab.com> Date: Mon, 9 Nov 2009 18:17:42 -0800 Subject: [PATCH 295/306] PARTIAL FIX (workaround) DEV-41949: LLMediaEntry::setWhitelist() and LLMediaEntry::asLLSD() have a contract conflict Review #31 So, here's what was happening, briefly: - LLMediaEntry::setWhitelist() would be a no-op if given an LLSD that did not have a WHITELIST_KEY - LLMediaEntry::asLLSD() would render the LLMediaEntry *without* a WHITELIST_KEY if the whitelist was empty Therefore, when the viewer marshalled an LLMediaEntry for the server, it would send it without a WHITELIST_KEY. When the server got it, it would not erase the last value. This is actually a workaround: it patches asLLSD() with an LLSD::emptyArray() if the key is not there. However, this should be fixed on the server: in either or both of the following ways: 1) LLMediaEntry::setWhitelist() should not be a no-op if the LLSD has no WHITELIST_KEY: it should erase the whitelist 2) LLMediaEntry::asLLSD() should render an empty whitelist in WHITELIST_KEY as an empty array Note that both could be done and still work. A unit test should and will be written next. --- indra/newview/llpanelmediasettingssecurity.cpp | 4 +++- indra/newview/llvovolume.cpp | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp index 611293f3e20..bec2494eac9 100644 --- a/indra/newview/llpanelmediasettingssecurity.cpp +++ b/indra/newview/llpanelmediasettingssecurity.cpp @@ -215,7 +215,9 @@ void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in ) // iterate over white list and extract items std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData(); std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin(); - fill_me_in.erase(LLMediaEntry::WHITELIST_KEY); + // *NOTE: need actually set the key to be an emptyArray(), or the merge + // we do with this LLSD will think there's nothing to change. + fill_me_in[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray(); while( iter != white_list_items.end() ) { std::string white_list_url = (*iter)->getValue().asString(); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 021fc746488..3803c65e749 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -108,6 +108,11 @@ class LLMediaDataClientObjectImpl : public LLMediaDataClientObject if (te->getMediaData() != NULL) { result = te->getMediaData()->asLLSD(); + // XXX HACK: workaround bug in asLLSD() where whitelist is not set properly + if (!result.has(LLMediaEntry::WHITELIST_KEY)) + { + result[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray(); + } } } return result; -- GitLab From ca1356d4655223781b5e317b430c67fcb081249c Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Mon, 9 Nov 2009 18:41:55 -0800 Subject: [PATCH 296/306] LLViewerMediaImpl now keeps track of which instance is the current parcel media instance. The active parcel media instance always gets priority over other inworld media. --- indra/newview/llviewermedia.cpp | 15 +++++++++++++-- indra/newview/llviewermedia.h | 8 ++++++-- indra/newview/llviewerparcelmedia.cpp | 2 ++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 11c1fcb1ea5..69650425cb4 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -459,12 +459,12 @@ LLViewerMedia::impl_list &LLViewerMedia::getPriorityList() // This is the predicate function used to sort sViewerMediaImplList by priority. bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2) { - if(i1->isForcedUnloaded()) + if(i1->isForcedUnloaded() && !i2->isForcedUnloaded()) { // Muted or failed items always go to the end of the list, period. return false; } - else if(i2->isForcedUnloaded()) + else if(i2->isForcedUnloaded() && !i1->isForcedUnloaded()) { // Muted or failed items always go to the end of the list, period. return true; @@ -489,6 +489,16 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView // i2 is a UI element, i1 is not. This makes i2 "less than" i1, so it sorts earlier in our list. return false; } + else if(i1->isParcelMedia()) + { + // The parcel media impl sorts above all other inworld media, unless one has focus. + return true; + } + else if(i2->isParcelMedia()) + { + // The parcel media impl sorts above all other inworld media, unless one has focus. + return false; + } else { // The object with the larger interest value should be earlier in the list, so we reverse the sense of the comparison here. @@ -686,6 +696,7 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id, mPreviousMediaState(MEDIA_NONE), mPreviousMediaTime(0.0f), mIsDisabled(false), + mIsParcelMedia(false), mProximity(-1), mIsUpdated(false) { diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 7cbfb56ffcc..3f5f3ca746c 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -191,14 +191,17 @@ class LLViewerMediaImpl bool isMediaPlaying(); bool isMediaPaused(); bool hasMedia(); - bool isMediaFailed() { return mMediaSourceFailed; }; + bool isMediaFailed() const { return mMediaSourceFailed; }; void resetPreviousMediaState(); void setDisabled(bool disabled) { mIsDisabled = disabled; }; - bool isMediaDisabled() { return mIsDisabled; }; + bool isMediaDisabled() const { return mIsDisabled; }; // returns true if this instance should not be loaded (disabled, muted object, crashed, etc.) bool isForcedUnloaded() const; + + void setIsParcelMedia(bool is_parcel_media) { mIsParcelMedia = is_parcel_media; }; + bool isParcelMedia() const { return mIsParcelMedia; }; ECursorType getLastSetCursor() { return mLastSetCursor; }; @@ -326,6 +329,7 @@ class LLViewerMediaImpl int mPreviousMediaState; F64 mPreviousMediaTime; bool mIsDisabled; + bool mIsParcelMedia; S32 mProximity; private: diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 6233a337a66..336d7f684e6 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -226,6 +226,7 @@ void LLViewerParcelMedia::play(LLParcel* parcel) media_height, media_auto_scale, media_loop); + sMediaImpl->setIsParcelMedia(true); sMediaImpl->navigateTo(media_url, mime_type, true); } } @@ -240,6 +241,7 @@ void LLViewerParcelMedia::play(LLParcel* parcel) media_height, media_auto_scale, media_loop); + sMediaImpl->setIsParcelMedia(true); sMediaImpl->navigateTo(media_url, mime_type, true); } -- GitLab From c84624b2e9656241bd08ea613e37c9d87087096b Mon Sep 17 00:00:00 2001 From: angela <angela@lindenlab.com> Date: Tue, 10 Nov 2009 10:47:53 +0800 Subject: [PATCH 297/306] clean up include llfontgl --- indra/llui/llui.cpp | 1 - indra/llui/llview.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index a82e6eb372a..4cf503b413c 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -43,7 +43,6 @@ #include "llrender.h" #include "llrect.h" #include "lldir.h" -#include "llfontgl.h" #include "llgl.h" // Project includes diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index fe7fd59de80..f9b4a6b73d5 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -40,7 +40,6 @@ #include "llrender.h" #include "llevent.h" -#include "llfontgl.h" #include "llfocusmgr.h" #include "llrect.h" #include "llstl.h" -- GitLab From cf7fdf86bf58051cb4d0aa6c0c598fff6475c019 Mon Sep 17 00:00:00 2001 From: Ramzi Linden <ramzi@lindenlab.com> Date: Tue, 10 Nov 2009 11:50:01 +0800 Subject: [PATCH 298/306] Develop>XUI>Send Test IMs: Lets not poke fun of a resident tradition in the public beta. Also it should test a sentence that wraps. Ideally it would also test a string with double-byte characters but I dont know how to do that. --- indra/newview/llimview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index fdf119fbeeb..8fb7027e82c 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -315,7 +315,7 @@ void LLIMModel::testMessages() bot2_id.generate(from); LLUUID bot2_session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, bot2_id); newSession(bot2_session_id, from, IM_NOTHING_SPECIAL, bot2_id); - addMessage(bot2_session_id, from, bot2_id, "Test Message: Can I haz bear? "); + addMessage(bot2_session_id, from, bot2_id, "Test Message: Hello there, I have a question. Can I bother you for a second? "); addMessage(bot2_session_id, from, bot2_id, "Test Message: OMGWTFBBQ."); } -- GitLab From 5662a8d126b3dab1100aab014aeaeb1752dba26a Mon Sep 17 00:00:00 2001 From: Ramzi Linden <ramzi@lindenlab.com> Date: Tue, 10 Nov 2009 12:07:42 +0800 Subject: [PATCH 299/306] DEV-35097 final check in XUI for instances of the nonapproved terms "2nd Life", "1st Life", "SLURL" --- .../newview/skins/default/xui/en/floater_preview_texture.xml | 4 ++-- .../skins/default/xui/en/menu_places_gear_landmark.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml index e7abfb075af..52a19ac6b3d 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml @@ -109,10 +109,10 @@ <combo_item name="Unconstrained" value="Unconstrained"> Unconstrained </combo_item> - <combo_item name="1:1" value="1:1" tool_tip="Group insignia or 1st Life profile"> + <combo_item name="1:1" value="1:1" tool_tip="Group insignia or Real World profile"> 1:1 </combo_item> - <combo_item name="4:3" value="4:3" tool_tip="2nd Life profile"> + <combo_item name="4:3" value="4:3" tool_tip="[SECOND_LIFE] profile"> 4:3 </combo_item> <combo_item name="10:7" value="10:7" tool_tip="Classifieds and search listings, landmarks"> diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml index 63d1a67d0f1..4b8bc8132fc 100644 --- a/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml @@ -82,7 +82,7 @@ parameter="copy" /> </menu_item_call> <menu_item_call - label="Copy SLURL" + label="Copy SLurl" layout="topleft" name="copy_slurl"> <on_click -- GitLab From 729e0b125287586f19f862ec5221bf11d9e5fe49 Mon Sep 17 00:00:00 2001 From: Ramzi Linden <ramzi@lindenlab.com> Date: Tue, 10 Nov 2009 13:10:15 +0800 Subject: [PATCH 300/306] I18N: several nodes in XUI have no name= or a duplicate name=, thus cant be localized. Notifications console was listed twice in the Develop>Console menu --- indra/newview/skins/default/xui/en/menu_viewer.xml | 2 ++ .../newview/skins/default/xui/en/panel_group_roles.xml | 4 ++-- .../default/xui/en/panel_media_settings_general.xml | 10 +++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index df2c2465c59..6ee50f16477 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -1994,6 +1994,7 @@ function="Advanced.ToggleConsole" parameter="memory view" /> </menu_item_check> +<!-- Delete this duplicate menu entry <menu_item_check label="Notifications Console" layout="topleft" @@ -2007,6 +2008,7 @@ function="Floater.Show" parameter="notifications_console" /> </menu_item_check> +--> <menu_item_separator layout="topleft" /> <menu_item_call diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 5ed464bcec8..4129d7b4488 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -440,7 +440,7 @@ things in this group. There's a broad variety of Abilities. layout="topleft" follows="left|top" left="0" - name="static" + name="static4" top_pad="5" width="295"> Assigned Roles @@ -467,7 +467,7 @@ things in this group. There's a broad variety of Abilities. layout="topleft" follows="left|top" left="0" - name="static2" + name="static5" top_pad="5" width="295"> Allowed Abilities diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml index cc47e99c2cb..686f4ac1d5e 100644 --- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml @@ -16,7 +16,7 @@ follows="top|left" height="15" left="10" - name=""> + name="home_label"> Home URL: </text> <line_editor @@ -49,7 +49,7 @@ follows="top|left" height="15" left="164" - name=""> + name="preview_label"> Preview </text> @@ -88,7 +88,7 @@ follows="top|left" height="15" left="10" - name=""> + name="controls_label"> Controls: </text> <combo_box @@ -207,7 +207,7 @@ follows="top|left" height="15" left="30" - name=""> + name="size_label"> Size: </text> @@ -228,7 +228,7 @@ name="width_pixels" width="50" /> - <text bottom_delta="0" follows="top|left" height="15" left_delta="60" name=""> + <text bottom_delta="0" follows="top|left" height="15" left_delta="60" name="X_label"> X </text> <spinner bottom_delta="0" -- GitLab From 54b39c3786a4e77b86f70538a29df98c7ff4ff77 Mon Sep 17 00:00:00 2001 From: Ramzi Linden <ramzi@lindenlab.com> Date: Tue, 10 Nov 2009 17:36:28 +0800 Subject: [PATCH 301/306] L10N: Add some translations to FR, DE, JA from Localization Cycle1. --- .../skins/default/xui/de/floater_about.xml | 83 +- .../default/xui/de/floater_about_land.xml | 969 ++- .../xui/de/floater_animation_preview.xml | 275 +- .../default/xui/de/floater_avatar_picker.xml | 88 +- .../skins/default/xui/de/floater_beacons.xml | 36 +- .../default/xui/de/floater_build_options.xml | 19 +- .../default/xui/de/floater_bulk_perms.xml | 97 +- .../default/xui/de/floater_buy_object.xml | 52 +- .../skins/default/xui/de/floater_camera.xml | 39 +- .../default/xui/de/floater_color_picker.xml | 64 +- .../default/xui/de/floater_god_tools.xml | 238 +- .../xui/de/floater_hardware_settings.xml | 58 +- .../default/xui/de/floater_image_preview.xml | 64 +- .../de/floater_inventory_item_properties.xml | 148 +- .../default/xui/de/floater_land_holdings.xml | 80 +- .../default/xui/de/floater_live_lsleditor.xml | 27 +- .../skins/default/xui/de/floater_map.xml | 105 +- .../default/xui/de/floater_media_browser.xml | 49 +- .../default/xui/de/floater_mem_leaking.xml | 36 +- .../skins/default/xui/de/floater_moveview.xml | 51 +- .../skins/default/xui/de/floater_pay.xml | 40 +- .../default/xui/de/floater_pay_object.xml | 59 +- .../xui/de/floater_preview_animation.xml | 23 +- .../xui/de/floater_preview_classified.xml | 8 +- .../default/xui/de/floater_preview_event.xml | 8 +- .../xui/de/floater_preview_gesture_info.xml | 2 + .../xui/de/floater_preview_gesture_steps.xml | 2 + .../xui/de/floater_preview_notecard.xml | 38 +- .../default/xui/de/floater_preview_sound.xml | 23 +- .../xui/de/floater_preview_texture.xml | 26 +- .../default/xui/de/floater_report_abuse.xml | 210 +- .../xui/de/floater_script_debug_panel.xml | 2 + .../default/xui/de/floater_script_preview.xml | 15 +- .../default/xui/de/floater_script_queue.xml | 23 +- .../default/xui/de/floater_sell_land.xml | 134 +- .../default/xui/de/floater_settings_debug.xml | 26 +- .../skins/default/xui/de/floater_stats.xml | 71 + .../skins/default/xui/de/floater_tools.xml | 1053 ++- .../skins/default/xui/de/inspect_avatar.xml | 16 + .../skins/default/xui/de/menu_avatar_icon.xml | 7 + .../skins/default/xui/de/menu_favorites.xml | 10 + .../skins/default/xui/de/menu_group_plus.xml | 5 + .../skins/default/xui/de/menu_inventory.xml | 142 +- .../skins/default/xui/de/menu_landmark.xml | 6 + .../skins/default/xui/de/menu_mini_map.xml | 16 +- .../skins/default/xui/de/menu_navbar.xml | 10 + .../skins/default/xui/de/menu_picks.xml | 8 + .../skins/default/xui/de/menu_place.xml | 7 + .../skins/default/xui/de/menu_slurl.xml | 12 +- .../skins/default/xui/de/menu_url_agent.xml | 6 + .../skins/default/xui/de/menu_url_group.xml | 6 + .../skins/default/xui/de/menu_url_http.xml | 7 + .../default/xui/de/menu_url_objectim.xml | 7 + .../skins/default/xui/de/menu_url_parcel.xml | 5 + .../skins/default/xui/de/menu_url_slurl.xml | 6 + .../default/xui/de/menu_url_teleport.xml | 5 + .../skins/default/xui/de/notifications.xml | 5545 +++++++-------- .../default/xui/de/panel_edit_profile.xml | 83 +- .../default/xui/de/panel_group_invite.xml | 58 +- .../default/xui/de/panel_group_land_money.xml | 341 +- .../default/xui/de/panel_group_notices.xml | 303 +- .../default/xui/de/panel_group_roles.xml | 434 +- .../default/xui/de/panel_im_control_panel.xml | 9 + .../skins/default/xui/de/panel_login.xml | 62 +- .../default/xui/de/panel_nearby_chat_bar.xml | 4 + .../skins/default/xui/de/panel_pick_info.xml | 16 + .../skins/default/xui/de/panel_picks.xml | 9 + .../default/xui/de/panel_preferences_chat.xml | 100 +- .../xui/de/panel_preferences_graphics1.xml | 287 +- .../xui/de/panel_preferences_privacy.xml | 52 +- .../xui/de/panel_preferences_setup.xml | 76 +- .../skins/default/xui/de/panel_profile.xml | 41 + .../default/xui/de/panel_profile_view.xml | 15 + .../skins/default/xui/de/panel_script_ed.xml | 43 + .../xui/de/panel_stand_stop_flying.xml | 6 + .../skins/default/xui/de/panel_status_bar.xml | 64 +- .../skins/default/xui/de/panel_world_map.xml | 108 +- .../newview/skins/default/xui/de/strings.xml | 3803 +++++++++-- .../skins/default/xui/de/teleport_strings.xml | 156 +- .../skins/default/xui/fr/floater_about.xml | 83 +- .../default/xui/fr/floater_about_land.xml | 981 ++- .../xui/fr/floater_animation_preview.xml | 277 +- .../default/xui/fr/floater_avatar_picker.xml | 83 +- .../skins/default/xui/fr/floater_beacons.xml | 36 +- .../default/xui/fr/floater_build_options.xml | 19 +- .../default/xui/fr/floater_bulk_perms.xml | 97 +- .../default/xui/fr/floater_buy_object.xml | 52 +- .../skins/default/xui/fr/floater_camera.xml | 39 +- .../default/xui/fr/floater_color_picker.xml | 64 +- .../default/xui/fr/floater_god_tools.xml | 205 +- .../xui/fr/floater_hardware_settings.xml | 56 +- .../default/xui/fr/floater_image_preview.xml | 64 +- .../fr/floater_inventory_item_properties.xml | 148 +- .../default/xui/fr/floater_land_holdings.xml | 80 +- .../default/xui/fr/floater_live_lsleditor.xml | 27 +- .../skins/default/xui/fr/floater_map.xml | 105 +- .../default/xui/fr/floater_media_browser.xml | 51 +- .../default/xui/fr/floater_mem_leaking.xml | 36 +- .../skins/default/xui/fr/floater_moveview.xml | 49 +- .../skins/default/xui/fr/floater_pay.xml | 42 +- .../default/xui/fr/floater_pay_object.xml | 61 +- .../xui/fr/floater_preview_animation.xml | 21 +- .../xui/fr/floater_preview_classified.xml | 8 +- .../default/xui/fr/floater_preview_event.xml | 8 +- .../xui/fr/floater_preview_gesture_info.xml | 2 + .../xui/fr/floater_preview_gesture_steps.xml | 2 + .../xui/fr/floater_preview_notecard.xml | 38 +- .../default/xui/fr/floater_preview_sound.xml | 23 +- .../xui/fr/floater_preview_texture.xml | 26 +- .../default/xui/fr/floater_report_abuse.xml | 248 +- .../xui/fr/floater_script_debug_panel.xml | 2 + .../default/xui/fr/floater_script_preview.xml | 15 +- .../default/xui/fr/floater_script_queue.xml | 23 +- .../default/xui/fr/floater_sell_land.xml | 132 +- .../default/xui/fr/floater_settings_debug.xml | 26 +- .../skins/default/xui/fr/floater_stats.xml | 71 + .../skins/default/xui/fr/floater_tools.xml | 992 ++- .../skins/default/xui/fr/inspect_avatar.xml | 16 + .../skins/default/xui/fr/menu_avatar_icon.xml | 7 + .../skins/default/xui/fr/menu_favorites.xml | 10 + .../skins/default/xui/fr/menu_group_plus.xml | 5 + .../skins/default/xui/fr/menu_inventory.xml | 142 +- .../skins/default/xui/fr/menu_landmark.xml | 6 + .../skins/default/xui/fr/menu_mini_map.xml | 16 +- .../skins/default/xui/fr/menu_navbar.xml | 10 + .../skins/default/xui/fr/menu_picks.xml | 8 + .../skins/default/xui/fr/menu_place.xml | 7 + .../skins/default/xui/fr/menu_slurl.xml | 12 +- .../skins/default/xui/fr/menu_url_agent.xml | 6 + .../skins/default/xui/fr/menu_url_group.xml | 6 + .../skins/default/xui/fr/menu_url_http.xml | 7 + .../default/xui/fr/menu_url_objectim.xml | 7 + .../skins/default/xui/fr/menu_url_parcel.xml | 5 + .../skins/default/xui/fr/menu_url_slurl.xml | 6 + .../default/xui/fr/menu_url_teleport.xml | 5 + .../skins/default/xui/fr/notifications.xml | 5521 +++++++-------- .../default/xui/fr/panel_edit_profile.xml | 83 +- .../default/xui/fr/panel_group_invite.xml | 55 +- .../default/xui/fr/panel_group_land_money.xml | 172 +- .../default/xui/fr/panel_group_list_item.xml | 4 + .../default/xui/fr/panel_group_notices.xml | 134 +- .../default/xui/fr/panel_group_roles.xml | 273 +- .../default/xui/fr/panel_im_control_panel.xml | 9 + .../skins/default/xui/fr/panel_login.xml | 62 +- .../default/xui/fr/panel_nearby_chat_bar.xml | 4 + .../skins/default/xui/fr/panel_picks.xml | 9 + .../default/xui/fr/panel_preferences_chat.xml | 101 +- .../xui/fr/panel_preferences_graphics1.xml | 279 +- .../xui/fr/panel_preferences_privacy.xml | 53 +- .../xui/fr/panel_preferences_setup.xml | 76 +- .../xui/fr/panel_preferences_sound.xml | 80 +- .../skins/default/xui/fr/panel_profile.xml | 41 + .../default/xui/fr/panel_profile_view.xml | 15 + .../skins/default/xui/fr/panel_script_ed.xml | 43 + .../xui/fr/panel_stand_stop_flying.xml | 6 + .../skins/default/xui/fr/panel_status_bar.xml | 63 +- .../skins/default/xui/fr/panel_world_map.xml | 108 +- .../newview/skins/default/xui/fr/strings.xml | 3804 +++++++++-- .../skins/default/xui/fr/teleport_strings.xml | 154 +- .../skins/default/xui/ja/floater_about.xml | 83 +- .../default/xui/ja/floater_about_land.xml | 970 ++- .../xui/ja/floater_animation_preview.xml | 284 +- .../default/xui/ja/floater_avatar_picker.xml | 80 +- .../skins/default/xui/ja/floater_beacons.xml | 36 +- .../default/xui/ja/floater_build_options.xml | 19 +- .../default/xui/ja/floater_bulk_perms.xml | 97 +- .../default/xui/ja/floater_buy_object.xml | 52 +- .../skins/default/xui/ja/floater_camera.xml | 39 +- .../default/xui/ja/floater_color_picker.xml | 62 +- .../default/xui/ja/floater_god_tools.xml | 241 +- .../xui/ja/floater_hardware_settings.xml | 60 +- .../default/xui/ja/floater_image_preview.xml | 64 +- .../ja/floater_inventory_item_properties.xml | 148 +- .../default/xui/ja/floater_land_holdings.xml | 80 +- .../default/xui/ja/floater_live_lsleditor.xml | 27 +- .../skins/default/xui/ja/floater_map.xml | 105 +- .../default/xui/ja/floater_media_browser.xml | 49 +- .../default/xui/ja/floater_mem_leaking.xml | 37 +- .../skins/default/xui/ja/floater_moveview.xml | 52 +- .../skins/default/xui/ja/floater_pay.xml | 40 +- .../default/xui/ja/floater_pay_object.xml | 59 +- .../xui/ja/floater_preview_animation.xml | 21 +- .../xui/ja/floater_preview_classified.xml | 8 +- .../default/xui/ja/floater_preview_event.xml | 8 +- .../xui/ja/floater_preview_gesture_info.xml | 2 + .../xui/ja/floater_preview_gesture_steps.xml | 2 + .../xui/ja/floater_preview_notecard.xml | 38 +- .../default/xui/ja/floater_preview_sound.xml | 22 +- .../xui/ja/floater_preview_texture.xml | 26 +- .../default/xui/ja/floater_report_abuse.xml | 246 +- .../xui/ja/floater_script_debug_panel.xml | 2 + .../default/xui/ja/floater_script_preview.xml | 15 +- .../default/xui/ja/floater_script_queue.xml | 23 +- .../default/xui/ja/floater_sell_land.xml | 140 +- .../default/xui/ja/floater_settings_debug.xml | 26 +- .../skins/default/xui/ja/floater_stats.xml | 71 + .../skins/default/xui/ja/floater_tools.xml | 988 ++- .../skins/default/xui/ja/inspect_avatar.xml | 16 + .../skins/default/xui/ja/menu_avatar_icon.xml | 7 + .../skins/default/xui/ja/menu_favorites.xml | 10 + .../skins/default/xui/ja/menu_group_plus.xml | 5 + .../skins/default/xui/ja/menu_inventory.xml | 142 +- .../skins/default/xui/ja/menu_landmark.xml | 6 + .../skins/default/xui/ja/menu_mini_map.xml | 16 +- .../skins/default/xui/ja/menu_navbar.xml | 10 + .../skins/default/xui/ja/menu_picks.xml | 8 + .../skins/default/xui/ja/menu_place.xml | 7 + .../skins/default/xui/ja/menu_slurl.xml | 12 +- .../skins/default/xui/ja/menu_url_agent.xml | 6 + .../skins/default/xui/ja/menu_url_group.xml | 6 + .../skins/default/xui/ja/menu_url_http.xml | 7 + .../default/xui/ja/menu_url_objectim.xml | 7 + .../skins/default/xui/ja/menu_url_parcel.xml | 5 + .../skins/default/xui/ja/menu_url_slurl.xml | 6 + .../default/xui/ja/menu_url_teleport.xml | 5 + .../skins/default/xui/ja/notifications.xml | 5949 ++++++++--------- .../default/xui/ja/panel_edit_profile.xml | 83 +- .../default/xui/ja/panel_group_invite.xml | 60 +- .../default/xui/ja/panel_group_land_money.xml | 170 +- .../default/xui/ja/panel_group_list_item.xml | 4 + .../default/xui/ja/panel_group_notices.xml | 132 +- .../default/xui/ja/panel_group_roles.xml | 275 +- .../default/xui/ja/panel_im_control_panel.xml | 9 + .../skins/default/xui/ja/panel_login.xml | 64 +- .../default/xui/ja/panel_nearby_chat_bar.xml | 4 + .../skins/default/xui/ja/panel_pick_info.xml | 16 + .../skins/default/xui/ja/panel_picks.xml | 9 + .../default/xui/ja/panel_preferences_chat.xml | 99 +- .../xui/ja/panel_preferences_graphics1.xml | 287 +- .../xui/ja/panel_preferences_privacy.xml | 52 +- .../xui/ja/panel_preferences_setup.xml | 77 +- .../xui/ja/panel_preferences_sound.xml | 149 +- .../skins/default/xui/ja/panel_profile.xml | 41 + .../default/xui/ja/panel_profile_view.xml | 15 + .../skins/default/xui/ja/panel_script_ed.xml | 43 + .../xui/ja/panel_stand_stop_flying.xml | 6 + .../skins/default/xui/ja/panel_status_bar.xml | 64 +- .../skins/default/xui/ja/panel_world_map.xml | 108 +- .../newview/skins/default/xui/ja/strings.xml | 3803 +++++++++-- .../skins/default/xui/ja/teleport_strings.xml | 158 +- 240 files changed, 27408 insertions(+), 20831 deletions(-) create mode 100644 indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml create mode 100644 indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml create mode 100644 indra/newview/skins/default/xui/de/floater_script_debug_panel.xml create mode 100644 indra/newview/skins/default/xui/de/floater_stats.xml create mode 100644 indra/newview/skins/default/xui/de/inspect_avatar.xml create mode 100644 indra/newview/skins/default/xui/de/menu_avatar_icon.xml create mode 100644 indra/newview/skins/default/xui/de/menu_favorites.xml create mode 100644 indra/newview/skins/default/xui/de/menu_group_plus.xml create mode 100644 indra/newview/skins/default/xui/de/menu_landmark.xml create mode 100644 indra/newview/skins/default/xui/de/menu_navbar.xml create mode 100644 indra/newview/skins/default/xui/de/menu_picks.xml create mode 100644 indra/newview/skins/default/xui/de/menu_place.xml create mode 100644 indra/newview/skins/default/xui/de/menu_url_agent.xml create mode 100644 indra/newview/skins/default/xui/de/menu_url_group.xml create mode 100644 indra/newview/skins/default/xui/de/menu_url_http.xml create mode 100644 indra/newview/skins/default/xui/de/menu_url_objectim.xml create mode 100644 indra/newview/skins/default/xui/de/menu_url_parcel.xml create mode 100644 indra/newview/skins/default/xui/de/menu_url_slurl.xml create mode 100644 indra/newview/skins/default/xui/de/menu_url_teleport.xml create mode 100644 indra/newview/skins/default/xui/de/panel_im_control_panel.xml create mode 100644 indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml create mode 100644 indra/newview/skins/default/xui/de/panel_pick_info.xml create mode 100644 indra/newview/skins/default/xui/de/panel_picks.xml create mode 100644 indra/newview/skins/default/xui/de/panel_profile.xml create mode 100644 indra/newview/skins/default/xui/de/panel_profile_view.xml create mode 100644 indra/newview/skins/default/xui/de/panel_script_ed.xml create mode 100644 indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml create mode 100644 indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml create mode 100644 indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml create mode 100644 indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml create mode 100644 indra/newview/skins/default/xui/fr/floater_stats.xml create mode 100644 indra/newview/skins/default/xui/fr/inspect_avatar.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_avatar_icon.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_favorites.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_group_plus.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_landmark.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_navbar.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_picks.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_place.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_url_agent.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_url_group.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_url_http.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_url_objectim.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_url_parcel.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_url_slurl.xml create mode 100644 indra/newview/skins/default/xui/fr/menu_url_teleport.xml create mode 100644 indra/newview/skins/default/xui/fr/panel_group_list_item.xml create mode 100644 indra/newview/skins/default/xui/fr/panel_im_control_panel.xml create mode 100644 indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml create mode 100644 indra/newview/skins/default/xui/fr/panel_picks.xml create mode 100644 indra/newview/skins/default/xui/fr/panel_profile.xml create mode 100644 indra/newview/skins/default/xui/fr/panel_profile_view.xml create mode 100644 indra/newview/skins/default/xui/fr/panel_script_ed.xml create mode 100644 indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml create mode 100644 indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml create mode 100644 indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml create mode 100644 indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml create mode 100644 indra/newview/skins/default/xui/ja/floater_stats.xml create mode 100644 indra/newview/skins/default/xui/ja/inspect_avatar.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_avatar_icon.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_favorites.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_group_plus.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_landmark.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_navbar.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_picks.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_place.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_url_agent.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_url_group.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_url_http.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_url_objectim.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_url_parcel.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_url_slurl.xml create mode 100644 indra/newview/skins/default/xui/ja/menu_url_teleport.xml create mode 100644 indra/newview/skins/default/xui/ja/panel_group_list_item.xml create mode 100644 indra/newview/skins/default/xui/ja/panel_im_control_panel.xml create mode 100644 indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml create mode 100644 indra/newview/skins/default/xui/ja/panel_pick_info.xml create mode 100644 indra/newview/skins/default/xui/ja/panel_picks.xml create mode 100644 indra/newview/skins/default/xui/ja/panel_profile.xml create mode 100644 indra/newview/skins/default/xui/ja/panel_profile_view.xml create mode 100644 indra/newview/skins/default/xui/ja/panel_script_ed.xml create mode 100644 indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml index 6e51fe3e2dd..8522a89ec1c 100644 --- a/indra/newview/skins/default/xui/de/floater_about.xml +++ b/indra/newview/skins/default/xui/de/floater_about.xml @@ -1,43 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_about" title="ÃœBER [APP_NAME]"> -<tab_container name="about_tab"> - <panel name="credits_panel"> - <text_editor name="credits_editor"> - Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl und vielen anderen. - -Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar - - - -Um im Geschäftsleben erfolreich zu sein, sei kühn, sei schnell, sei anders. --Henry Marchant - </text_editor> - </panel> - <panel name="licenses_panel"> - <text_editor name="credits_editor"> -3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion -APR Copyright (C) 2000-2004 The Apache Software Foundation -cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) -expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. -FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). -GL Copyright (C) 1999-2004 Brian Paul. -Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. -jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) -jpeglib Copyright (C) 1991-1998, Thomas G. Lane. -ogg/vorbis Copyright (C) 2001, Xiphophorus -OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. -SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga -SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) -xmlrpc-epi Copyright (C) 2000 Epinions, Inc. -zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler. -google-perftools Copyright (c) 2005, Google Inc. - -Alle Rechte vorbehalten. Details siehe licenses.txt. - -Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf.G.722.1 Anhang C) - </text_editor> - </panel> -</tab_container> - <text name="you_are_at"> - Sie befinden sich in [POSITION] - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="ÃœBER [APP_NAME]"> + <tab_container name="about_tab"> + <panel label="Danksagung" name="credits_panel"> + <text_editor name="credits_editor"> + Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl und vielen anderen. + +Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar + + + +Um im Geschäftsleben erfolreich zu sein, sei kühn, sei schnell, sei anders. --Henry Marchant + </text_editor> + </panel> + <panel label="Lizenzen" name="licenses_panel"> + <text_editor name="credits_editor"> + 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion +APR Copyright (C) 2000-2004 The Apache Software Foundation +cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) +expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. +FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). +GL Copyright (C) 1999-2004 Brian Paul. +Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. +jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) +jpeglib Copyright (C) 1991-1998, Thomas G. Lane. +ogg/vorbis Copyright (C) 2001, Xiphophorus +OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. +SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga +SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) +xmlrpc-epi Copyright (C) 2000 Epinions, Inc. +zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler. +google-perftools Copyright (c) 2005, Google Inc. + +Alle Rechte vorbehalten. Details siehe licenses.txt. + +Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf.G.722.1 Anhang C) + </text_editor> + </panel> + </tab_container> +</floater> 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 ceb831c12de..ae0ad2af65d 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -1,494 +1,475 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="LAND-INFO"> - <tab_container name="landtab"> - <panel label="Allgemein" name="land_general_panel"> - <text name="Name:"> - Name: - </text> - <text name="Description:"> - Beschreibung: - </text> - <text name="LandType"> - Typ: - </text> - <text name="LandTypeText"> - Mainland / Homestead - </text> - <text name="ContentRating"> - Einstufung: - </text> - <text name="ContentRatingText"> - Adult - </text> - <text name="Owner:"> - Eigentümer: - </text> - <text name="OwnerText"> - Leyla Linden - </text> - <button label="Profil..." label_selected="Profil..." name="Profile..."/> - <text name="Group:"> - Gruppe: - </text> - <button label="Einstellen..." label_selected="Einstellen..." name="Set..."/> - <check_box label="Ãœbertragung an Gruppe zulassen" name="check deed" tool_tip="Ein Gruppen-Officer kann dieses Land der Gruppe übertragen. Das Land wird dann über die Landzuteilung der Gruppe verwaltet."/> - <button label="Ãœbertragen..." label_selected="Ãœbertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/> - <check_box label="Eigentümer leistet Beitrag durch Ãœbertragung" name="check contrib" tool_tip="Wenn das Land an die Gruppe übertragen wird, trägt der frühere Eigentümer ausreichend Landnutzungsrechte bei, um es zu halten."/> - <text name="For Sale:"> - Zum Verkauf: - </text> - <text name="Not for sale."> - Nicht zu verkaufen. - </text> - <text name="For Sale: Price L$[PRICE]."> - Preis: [PRICE] L$ ([PRICE_PER_SQM] L$/qm.). - </text> - <text name="SalePending"/> - <button bottom="-222" label="Land verkaufen..." label_selected="Land verkaufen..." name="Sell Land..."/> - <text name="For sale to"> - Zum Verkauf an: [BUYER] - </text> - <text name="Sell with landowners objects in parcel." width="210"> - Objekte sind im Verkauf eingeschlossen. - </text> - <text name="Selling with no objects in parcel." width="237"> - Objekte sind im Verkauf nicht eingeschlossen. - </text> - <button bottom="-222" label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/> - <text name="Claimed:"> - Gekauft am: - </text> - <text name="DateClaimText"> - Dienstag, 15. Aug. 2006, 13:47:25 - </text> - <text name="PriceLabel"> - Gebiet: - </text> - <text name="PriceText"> - 4048 qm. - </text> - <text name="Traffic:"> - Traffic: - </text> - <text name="DwellText"> - 0 - </text> - <button label="Land kaufen..." label_selected="Land kaufen..." name="Buy Land..."/> - <button label="Für Gruppe kaufen..." label_selected="Für Gruppe kaufen..." name="Buy For Group..."/> - <button label="Pass kaufen..." label_selected="Pass kaufen..." name="Buy Pass..." tool_tip="Ein Pass gibt Ihnen zeitbegrenzten Zugang zu diesem Land."/> - <button label="Land aufgeben..." label_selected="Land aufgeben..." name="Abandon Land..."/> - <button label="Land in Besitz nehmen..." label_selected="Land in Besitz nehmen..." name="Reclaim Land..."/> - <button label="Linden-Verkauf..." label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/> - <panel.string name="new users only"> - Nur neue Benutzer - </panel.string> - <panel.string name="anyone"> - Jeder - </panel.string> - <panel.string name="area_text"> - Gebiet: - </panel.string> - <panel.string name="area_size_text"> - [AREA] qm. - </panel.string> - <panel.string name="auction_id_text"> - Auktions-ID: [ID] - </panel.string> - <panel.string name="need_tier_to_modify"> - Bestätigen Sie den Kauf, um dieses Land zu bearbeiten. - </panel.string> - <panel.string name="group_owned_text"> - (In Gruppenbesitz) - </panel.string> - <panel.string name="profile_text"> - Profil... - </panel.string> - <panel.string name="info_text"> - Info... - </panel.string> - <panel.string name="public_text"> - (öffentlich) - </panel.string> - <panel.string name="none_text"> - (keiner) - </panel.string> - <panel.string name="sale_pending_text"> - (Wird verkauft) - </panel.string> - <panel.string name="no_selection_text"> - Keine Parzelle ausgewählt. -Öffnen Sie „Welt“ > „Land-Info“ oder wählen Sie eine andere Parzelle aus, um Informationen darüber anzuzeigen. - </panel.string> - </panel> - <panel label="Vertrag" name="land_covenant_panel"> - <text name="estate_section_lbl"> - Grundstück: - </text> - <text name="estate_name_lbl"> - Name: - </text> - <text name="estate_name_text"> - Mainland - </text> - <text name="estate_owner_lbl"> - Eigentümer: - </text> - <text name="estate_owner_text"> - (keiner) - </text> - <text_editor name="covenant_editor"> - Für dieses Grundstück fehlt der Vertrag. - </text_editor> - <text name="covenant_timestamp_text"> - Letzte Änderung am Mittwoch, den 31. Dez. 1969, 16:00:00 - </text> - <text name="region_section_lbl"> - Region: - </text> - <text name="region_name_lbl"> - Name: - </text> - <text name="region_name_text"> - leyla - </text> - <text name="region_landtype_lbl"> - Typ: - </text> - <text name="region_landtype_text"> - Mainland / Homestead - </text> - <text name="region_maturity_lbl"> - Einstufung: - </text> - <text name="region_maturity_text"> - Adult - </text> - <text name="resellable_lbl"> - Wiederverkauf: - </text> - <text name="resellable_clause"> - Land in dieser Region kann nicht wiederverkauft werden. - </text> - <text name="changeable_lbl"> - Unterteilen: - </text> - <text name="changeable_clause"> - Land in dieser Region kann nicht zusammengelegt/geteilt -werden. - </text> - <panel.string name="can_resell"> - Gekauftes Land in dieser Region kann wiederverkauft werden. - </panel.string> - <panel.string name="can_not_resell"> - Gekauftes Land in dieser Region kann nicht wiederverkauft werden. - </panel.string> - <panel.string name="can_change"> - Gekauftes Land in dieser Region kann zusammengelegt und -geteilt werden. - </panel.string> - <panel.string name="can_not_change"> - Gekauftes Land in dieser Region kann nicht zusammengelegt -und geteilt werden. - </panel.string> - </panel> - <panel label="Objekte" name="land_objects_panel"> - <text name="parcel_object_bonus"> - Objektbonusfaktor in Region: [BONUS] - </text> - <text name="Simulator primitive usage:"> - Primitive in Simulator: - </text> - <text name="objects_available"> - [COUNT] von [MAX] ([AVAILABLE] verfügbar) - </text> - <panel.string name="objects_available_text"> - [COUNT] von [MAX] ([AVAILABLE] verfügbar) - </panel.string> - <panel.string name="objects_deleted_text"> - [COUNT] von [MAX] ([DELETED] werden gelöscht) - </panel.string> - <text name="Primitives parcel supports:" width="200"> - Von Parzelle unterstützte Primitiva: - </text> - <text left="204" name="object_contrib_text" width="152"> - [COUNT] - </text> - <text name="Primitives on parcel:"> - Primitiva auf Parzelle: - </text> - <text left="204" name="total_objects_text" width="48"> - [COUNT] - </text> - <text left="14" name="Owned by parcel owner:" width="200"> - Im Eigentum des Parzellenbesitzers: - </text> - <text left="204" name="owner_objects_text" width="48"> - [COUNT] - </text> - <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/> - <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOwner..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> - <text left="14" name="Set to group:"> - Der Gruppe zugeordnet: - </text> - <text left="204" name="group_objects_text" width="48"> - [COUNT] - </text> - <button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup" right="-135" width="60"/> - <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnGroup..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> - <text left="14" name="Owned by others:" width="128"> - Im Eigentum anderer: - </text> - <text left="204" name="other_objects_text" width="48"> - [COUNT] - </text> - <button label="Anzeigen" label_selected="Anzeigen" name="ShowOther" right="-135" width="60"/> - <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOther..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> - <text left="14" name="Selected / sat upon:" width="140"> - Ausgewählt/gesessen auf: - </text> - <text left="204" name="selected_objects_text" width="48"> - [COUNT] - </text> - <text left="4" name="Autoreturn" width="380"> - Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus): - </text> - <line_editor name="clean other time" right="-10" width="56"/> - <text name="Object Owners:"> - Objekteigentümer: - </text> - <button label="Liste aktualisieren" label_selected="Liste aktualisieren" name="Refresh List"/> - <button label="Objekte zurückgeben..." label_selected="Objekte zurückgeben..." name="Return objects..."/> - <name_list name="owner list"> - <column label="Typ" name="type"/> - <column label="Name" name="name"/> - <column label="Zählen" name="count"/> - <column label="Aktuellster" name="mostrecent"/> - </name_list> - </panel> - <panel label="Optionen" name="land_options_panel"> - <text name="allow_label"> - Anderen Einwohnern gestatten: - </text> - <check_box label="Terrain bearbeiten" name="edit land check" tool_tip="Falls aktiviert, kann jeder Ihr Land terraformen. Am besten ist es, wenn Sie diese Option deaktiviert lassen. Sie können Ihr eigenes Land jederzeit bearbeiten."/> - <check_box label="Landmarken erstellen" name="check landmark"/> - <check_box label="Fliegen" name="check fly" tool_tip="Falls aktiviert, können Einwohner auf Ihrem Land fliegen. Falls nicht aktiviert, können Einwohner lediglich auf Ihr Land fliegen und dort landen (dann jedoch nicht wieder weiterfliegen) oder über Ihr Land hinweg fliegen."/> - <text name="allow_label2"> - Objekte erstellen: - </text> - <check_box label="Alle Einwohner" name="edit objects check"/> - <check_box label="Gruppe" name="edit group objects check"/> - <text name="allow_label3"> - Objekteintritt: - </text> - <check_box label="Alle Einwohner" name="all object entry check"/> - <check_box label="Gruppe" name="group object entry check"/> - <text name="allow_label4"> - Skripts ausführen: - </text> - <check_box label="Alle Einwohner" name="check other scripts"/> - <check_box label="Gruppe" name="check group scripts"/> - <text name="land_options_label"> - Landoptionen: - </text> - <check_box label="Sicher (kein Schaden)" name="check safe" tool_tip="Falls aktiviert, wird Land auf Option „Sicher“ eingestellt, Kampfschäden sind deaktiviert. Falls nicht aktiviert, sind Kampfschäden aktiviert."/> - <check_box label="Kein Stoßen" name="PushRestrictCheck" tool_tip="Verhindert Skripte am Stoßen. Durch Aktivieren dieser Option verhindern Sie störendes Verhalten auf Ihrem Land."/> - <check_box label="Ort in Suche anzeigen (30 L$/Woche) unter" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/> - <panel.string name="search_enabled_tooltip"> - Diese Parzelle in Suchergebnissen anzeigen. - </panel.string> - <panel.string name="search_disabled_small_tooltip"> - Diese Option ist nicht aktiviert, da diese Parzelle nicht größer als 128 qm ist. -Nur große Parzellen können in der Suche aufgeführt werden. - </panel.string> - <panel.string name="search_disabled_permissions_tooltip"> - Diese Option ist nicht aktiviert, da Sie die Parzellenoptionen nicht verändern können. - </panel.string> - <combo_box name="land category with adult"> - <combo_box.item name="item0" label="Alle Kategorien" - /> - <combo_box.item name="item1" label="Lindenort" - /> - <combo_box.item name="item2" label="Adult" - /> - <combo_box.item name="item3" label="Kunst & Kultur" - /> - <combo_box.item name="item4" label="Business" - /> - <combo_box.item name="item5" label="Bildung" - /> - <combo_box.item name="item6" label="Spielen" - /> - <combo_box.item name="item7" label="Treffpunkt" - /> - <combo_box.item name="item8" label="Anfängergerecht" - /> - <combo_box.item name="item9" label="Parks und Natur" - /> - <combo_box.item name="item10" label="Wohngebiet" - /> - <combo_box.item name="item11" label="Shopping" - /> - <combo_box.item name="item12" label="Sonstige" - /> - </combo_box> - <combo_box left="266" name="land category" width="130"> - <combo_box.item name="item0" label="Alle Kategorien" - /> - <combo_box.item name="item1" label="Lindenort" - /> - <combo_box.item name="item3" label="Kunst und Kultur" - /> - <combo_box.item name="item4" label="Business" - /> - <combo_box.item name="item5" label="Bildung" - /> - <combo_box.item name="item6" label="Spielen" - /> - <combo_box.item name="item7" label="Treffpunkt" - /> - <combo_box.item name="item8" label="Anfängergerecht" - /> - <combo_box.item name="item9" label="Parks und Natur" - /> - <combo_box.item name="item10" label="Wohngebiet" - /> - <combo_box.item name="item11" label="Shopping" - /> - <combo_box.item name="item12" label="Sonstige" - /> - </combo_box> - <button label="?" label_selected="?" name="?"/> - <check_box label="Mature-Inhalt" name="MatureCheck" tool_tip=""/> - <panel.string name="mature_check_mature"> - Mature-Inhalt - </panel.string> - <panel.string name="mature_check_adult"> - Adult-Inhalt - </panel.string> - <panel.string name="mature_check_mature_tooltip"> - Die Informationen oder Inhalte Ihrer Parzelle sind „Mature“. - </panel.string> - <panel.string name="mature_check_adult_tooltip"> - Die Informationen oder Inhalte Ihrer Parzelle sind „Adult“. - </panel.string> - <text name="Snapshot:"> - Foto: - </text> - <texture_picker label="" name="snapshot_ctrl" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> - <text name="landing_point"> - Landepunkt: [LANDING] - </text> - <panel.string name="landing_point_none"> - (keiner) - </panel.string> - <button label="Festlegen" label_selected="Festlegen" left="234" name="Set" tool_tip="Legt den Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/> - <button label="Löschen" label_selected="Löschen" left="312" name="Clear" tool_tip="Landepunkt löschen." width="70"/> - <text name="Teleport Routing: "> - Teleport-Route: - </text> - <combo_box name="landing type" tool_tip="Teleport-Route -- festlegen, wie Teleports auf Ihrem Land gehandhabt werden sollen."> - <combo_box.item name="Blocked" label="Blockiert" - /> - <combo_box.item name="LandingPoint" label="Landepunkt" - /> - <combo_box.item name="Anywhere" label="Ãœberall" - /> - </combo_box> - <panel.string name="push_restrict_text"> - Kein Stoßen - </panel.string> - <panel.string name="push_restrict_region_text"> - Kein Stoßen (regional) - </panel.string> - </panel> - <panel label="Medien" name="land_media_panel"> - <text name="with media:"> - Medientyp: - </text> - <combo_box name="media type" tool_tip="Geben Sie einen URL für den Film, die Webseite oder ein anderes Medium ein"/> - <text name="at URL:"> - Medien-URL: - </text> - <button label="Einstellen..." label_selected="Einstellen..." name="set_media_url"/> - <text name="Description:"> - Inhalt: - </text> - <line_editor name="url_description" tool_tip="Text, der neben der Abspielen/Laden-Schaltfläche angezeigt wird"/> - <text name="Media texture:"> - Textur -ersetzen: - </text> - <texture_picker label="" name="media texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> - <text name="replace_texture_help"> - (Objekte mit dieser Textur zeigen nach Anklicken -des Abspielen-Pfeils den Film oder die Webseite an.) - </text> - <text name="Options:"> - Medien- -Optionen: - </text> - <check_box label="Automatisch skalieren" name="media_auto_scale" tool_tip="Aktivieren Sie diese Option, um den Inhalt für diese Parzelle automatisch zu skalieren. Dies ist eventuell langsamer und die Qualität ist schlechter, aber Sie müssen keine weitere Texturskalierung oder -anpassung vornehmen."/> - <check_box label="Als Schleife wiedergeben" name="media_loop" tool_tip="Spielt das Medium in einer Schleife ab. Der Abspielvorgang wird immer wieder von vorne fortgesetzt."/> - <check_box label="Medien-URL verstecken" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/> - <check_box label="Musik-URL verstecken" name="hide_music_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Musik-URL sehen können."/> - <text name="media_size" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."> - Größe: - </text> - <spinner name="media_size_width" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."/> - <spinner name="media_size_height" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."/> - <text name="pixels"> - Pixel - </text> - <text name="MusicURL:"> - Musik-URL: - </text> - <text name="Sound:"> - Sound: - </text> - <check_box label="Gesten- und Objektgeräusche auf diese Parzelle beschränken" name="check sound local"/> - <button label="?" label_selected="?" left="418" name="?"/> - <text name="Voice settings:"> - Voice: - </text> - <check_box label="Voice-Chat aktivieren" name="parcel_enable_voice_channel"/> - <check_box label="Voice-Chat aktivieren (vom Grundstück festgelegt)" name="parcel_enable_voice_channel_is_estate_disabled"/> - <check_box label="Voice-Chat auf diese Parzelle beschränken" name="parcel_enable_voice_channel_parcel"/> - </panel> - <panel label="Zugang" name="land_access_panel"> - <text name="Limit access to this parcel to:"> - Zugang zu dieser Parzelle - </text> - <check_box label="Freien Zugang erlauben" name="public_access"/> - <text name="Only Allow"> - Zugang verweigern für: - </text> - <check_box label="Einwohner, die keine Zahlungsinformationen bei Linden Lab hinterlegt haben" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen."/> - <check_box label="Einwohner, die keine altersgeprüften Erwachsenen sind" name="limit_age_verified" tool_tip="Einwohner ohne Altersprüfung verbannen. Weitere Informationen finden Sie auf support.secondlife.com."/> - <panel.string name="estate_override"> - Eine oder mehrere dieser Optionen gelten auf Grundstücksebene - </panel.string> - <check_box label="Gruppenzugang erlauben: [GROUP]" name="GroupCheck" tool_tip="Gruppe im Register „Allgemein“ festlegen."/> - <check_box label="Pässe verkaufen an:" name="PassCheck" tool_tip="Ermöglicht befristeten Zugang zu dieser Parzelle"/> - <combo_box name="pass_combo"> - <combo_box.item name="Anyone" label="Jeden" - /> - <combo_box.item name="Group" label="Gruppe" - /> - </combo_box> - <spinner label="Preis in L$:" name="PriceSpin"/> - <spinner label="Online-Zeit:" name="HoursSpin"/> - <text label="Immer erlauben" name="AllowedText"> - Zulässige Einwohner - </text> - <name_list name="AccessList" tool_tip="([LISTED] angezeigt, max. [MAX])"/> - <button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_allowed"/> - <button label="Entfernen" label_selected="Entfernen" name="remove_allowed"/> - <text label="Verbannen" name="BanCheck"> - Verbannte Einwohner - </text> - <name_list name="BannedList" tool_tip="([LISTED] angezeigt, max. [MAX])"/> - <button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_banned"/> - <button label="Entfernen" label_selected="Entfernen" name="remove_banned"/> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floaterland" title="LAND-INFO"> + <floater.string name="Minutes"> + [MINUTES] Minuten + </floater.string> + <floater.string name="Minute"> + Minute + </floater.string> + <floater.string name="Seconds"> + [SECONDS] Sekunden + </floater.string> + <tab_container name="landtab"> + <panel label="Allgemein" name="land_general_panel"> + <panel.string name="new users only"> + Nur neue Benutzer + </panel.string> + <panel.string name="anyone"> + Jeder + </panel.string> + <panel.string name="area_text"> + Gebiet: + </panel.string> + <panel.string name="area_size_text"> + [AREA] qm. + </panel.string> + <panel.string name="auction_id_text"> + Auktions-ID: [ID] + </panel.string> + <panel.string name="need_tier_to_modify"> + Bestätigen Sie den Kauf, um dieses Land zu bearbeiten. + </panel.string> + <panel.string name="group_owned_text"> + (In Gruppenbesitz) + </panel.string> + <panel.string name="profile_text"> + Profil... + </panel.string> + <panel.string name="info_text"> + Info... + </panel.string> + <panel.string name="public_text"> + (öffentlich) + </panel.string> + <panel.string name="none_text"> + (keiner) + </panel.string> + <panel.string name="sale_pending_text"> + (Wird verkauft) + </panel.string> + <panel.string name="no_selection_text"> + Keine Parzelle ausgewählt. +Öffnen Sie „Welt“ > „Land-Info“ oder wählen Sie eine andere Parzelle aus, um Informationen darüber anzuzeigen. + </panel.string> + <text name="Name:"> + Name: + </text> + <text name="Description:"> + Beschreibung: + </text> + <text name="LandType"> + Typ: + </text> + <text name="LandTypeText"> + Mainland / Homestead + </text> + <text name="ContentRating"> + Einstufung: + </text> + <text name="ContentRatingText"> + Adult + </text> + <text name="Owner:"> + Eigentümer: + </text> + <text name="OwnerText"> + Leyla Linden + </text> + <button label="Profil..." label_selected="Profil..." name="Profile..."/> + <text name="Group:"> + Gruppe: + </text> + <button label="Einstellen..." label_selected="Einstellen..." name="Set..."/> + <check_box label="Ãœbertragung an Gruppe zulassen" name="check deed" tool_tip="Ein Gruppen-Officer kann dieses Land der Gruppe übertragen. Das Land wird dann über die Landzuteilung der Gruppe verwaltet."/> + <button label="Ãœbertragen..." label_selected="Ãœbertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/> + <check_box label="Eigentümer leistet Beitrag durch Ãœbertragung" name="check contrib" tool_tip="Wenn das Land an die Gruppe übertragen wird, trägt der frühere Eigentümer ausreichend Landnutzungsrechte bei, um es zu halten."/> + <text name="For Sale:"> + Zum Verkauf: + </text> + <text name="Not for sale."> + Nicht zu verkaufen. + </text> + <text name="For Sale: Price L$[PRICE]."> + Preis: [PRICE] L$ ([PRICE_PER_SQM] L$/qm.). + </text> + <text name="SalePending"/> + <button bottom="-222" label="Land verkaufen..." label_selected="Land verkaufen..." name="Sell Land..."/> + <text name="For sale to"> + Zum Verkauf an: [BUYER] + </text> + <text name="Sell with landowners objects in parcel." width="210"> + Objekte sind im Verkauf eingeschlossen. + </text> + <text name="Selling with no objects in parcel." width="237"> + Objekte sind im Verkauf nicht eingeschlossen. + </text> + <button bottom="-222" label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/> + <text name="Claimed:"> + Gekauft am: + </text> + <text name="DateClaimText"> + Dienstag, 15. Aug. 2006, 13:47:25 + </text> + <text name="PriceLabel"> + Gebiet: + </text> + <text name="PriceText"> + 4048 qm. + </text> + <text name="Traffic:"> + Traffic: + </text> + <text name="DwellText"> + 0 + </text> + <button label="Land kaufen..." label_selected="Land kaufen..." name="Buy Land..."/> + <button label="Für Gruppe kaufen..." label_selected="Für Gruppe kaufen..." name="Buy For Group..."/> + <button label="Pass kaufen..." label_selected="Pass kaufen..." name="Buy Pass..." tool_tip="Ein Pass gibt Ihnen zeitbegrenzten Zugang zu diesem Land."/> + <button label="Land aufgeben..." label_selected="Land aufgeben..." name="Abandon Land..."/> + <button label="Land in Besitz nehmen..." label_selected="Land in Besitz nehmen..." name="Reclaim Land..."/> + <button label="Linden-Verkauf..." label_selected="Linden-Verkauf..." name="Linden Sale..." tool_tip="Land muss Eigentum und auf Inhalt gesetzt sein und nicht zur Auktion stehen."/> + </panel> + <panel label="Vertrag" name="land_covenant_panel"> + <panel.string name="can_resell"> + Gekauftes Land in dieser Region kann wiederverkauft werden. + </panel.string> + <panel.string name="can_not_resell"> + Gekauftes Land in dieser Region kann nicht wiederverkauft werden. + </panel.string> + <panel.string name="can_change"> + Gekauftes Land in dieser Region kann zusammengelegt und +geteilt werden. + </panel.string> + <panel.string name="can_not_change"> + Gekauftes Land in dieser Region kann nicht zusammengelegt +und geteilt werden. + </panel.string> + <text name="estate_section_lbl"> + Grundstück: + </text> + <text name="estate_name_lbl"> + Name: + </text> + <text name="estate_name_text"> + Mainland + </text> + <text name="estate_owner_lbl"> + Eigentümer: + </text> + <text name="estate_owner_text"> + (keiner) + </text> + <text_editor name="covenant_editor"> + Für dieses Grundstück fehlt der Vertrag. + </text_editor> + <text name="covenant_timestamp_text"> + Letzte Änderung am Mittwoch, den 31. Dez. 1969, 16:00:00 + </text> + <text name="region_section_lbl"> + Region: + </text> + <text name="region_name_lbl"> + Name: + </text> + <text name="region_name_text"> + leyla + </text> + <text name="region_landtype_lbl"> + Typ: + </text> + <text name="region_landtype_text"> + Mainland / Homestead + </text> + <text name="region_maturity_lbl"> + Einstufung: + </text> + <text name="region_maturity_text"> + Adult + </text> + <text name="resellable_lbl"> + Wiederverkauf: + </text> + <text name="resellable_clause"> + Land in dieser Region kann nicht wiederverkauft werden. + </text> + <text name="changeable_lbl"> + Unterteilen: + </text> + <text name="changeable_clause"> + Land in dieser Region kann nicht zusammengelegt/geteilt +werden. + </text> + </panel> + <panel label="Objekte" name="land_objects_panel"> + <panel.string name="objects_available_text"> + [COUNT] von [MAX] ([AVAILABLE] verfügbar) + </panel.string> + <panel.string name="objects_deleted_text"> + [COUNT] von [MAX] ([DELETED] werden gelöscht) + </panel.string> + <text name="parcel_object_bonus"> + Objektbonusfaktor in Region: [BONUS] + </text> + <text name="Simulator primitive usage:"> + Primitive in Simulator: + </text> + <text name="objects_available"> + [COUNT] von [MAX] ([AVAILABLE] verfügbar) + </text> + <text name="Primitives parcel supports:" width="200"> + Von Parzelle unterstützte Primitiva: + </text> + <text left="204" name="object_contrib_text" width="152"> + [COUNT] + </text> + <text name="Primitives on parcel:"> + Primitiva auf Parzelle: + </text> + <text left="204" name="total_objects_text" width="48"> + [COUNT] + </text> + <text left="14" name="Owned by parcel owner:" width="200"> + Im Eigentum des Parzellenbesitzers: + </text> + <text left="204" name="owner_objects_text" width="48"> + [COUNT] + </text> + <button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/> + <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOwner..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> + <text left="14" name="Set to group:"> + Der Gruppe zugeordnet: + </text> + <text left="204" name="group_objects_text" width="48"> + [COUNT] + </text> + <button label="Anzeigen" label_selected="Anzeigen" name="ShowGroup" right="-135" width="60"/> + <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnGroup..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> + <text left="14" name="Owned by others:" width="128"> + Im Eigentum anderer: + </text> + <text left="204" name="other_objects_text" width="48"> + [COUNT] + </text> + <button label="Anzeigen" label_selected="Anzeigen" name="ShowOther" right="-135" width="60"/> + <button label="Zurückgeben..." label_selected="Zurückgeben..." name="ReturnOther..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> + <text left="14" name="Selected / sat upon:" width="140"> + Ausgewählt/gesessen auf: + </text> + <text left="204" name="selected_objects_text" width="48"> + [COUNT] + </text> + <text left="4" name="Autoreturn" width="380"> + Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus): + </text> + <line_editor name="clean other time" right="-10" width="56"/> + <text name="Object Owners:"> + Objekteigentümer: + </text> + <button label="Liste aktualisieren" label_selected="Liste aktualisieren" name="Refresh List"/> + <button label="Objekte zurückgeben..." label_selected="Objekte zurückgeben..." name="Return objects..."/> + <name_list name="owner list"> + <name_list.columns label="Typ" name="type"/> + <name_list.columns label="Name" name="name"/> + <name_list.columns label="Zählen" name="count"/> + <name_list.columns label="Aktuellster" name="mostrecent"/> + </name_list> + </panel> + <panel label="Optionen" name="land_options_panel"> + <panel.string name="search_enabled_tooltip"> + Diese Parzelle in Suchergebnissen anzeigen. + </panel.string> + <panel.string name="search_disabled_small_tooltip"> + Diese Option ist nicht aktiviert, da diese Parzelle nicht größer als 128 qm ist. +Nur große Parzellen können in der Suche aufgeführt werden. + </panel.string> + <panel.string name="search_disabled_permissions_tooltip"> + Diese Option ist nicht aktiviert, da Sie die Parzellenoptionen nicht verändern können. + </panel.string> + <panel.string name="mature_check_mature"> + Mature-Inhalt + </panel.string> + <panel.string name="mature_check_adult"> + Adult-Inhalt + </panel.string> + <panel.string name="mature_check_mature_tooltip"> + Die Informationen oder Inhalte Ihrer Parzelle sind „Mature“. + </panel.string> + <panel.string name="mature_check_adult_tooltip"> + Die Informationen oder Inhalte Ihrer Parzelle sind „Adult“. + </panel.string> + <panel.string name="landing_point_none"> + (keiner) + </panel.string> + <panel.string name="push_restrict_text"> + Kein Stoßen + </panel.string> + <panel.string name="push_restrict_region_text"> + Kein Stoßen (regional) + </panel.string> + <text name="allow_label"> + Anderen Einwohnern gestatten: + </text> + <check_box label="Terrain bearbeiten" name="edit land check" tool_tip="Falls aktiviert, kann jeder Ihr Land terraformen. Am besten ist es, wenn Sie diese Option deaktiviert lassen. Sie können Ihr eigenes Land jederzeit bearbeiten."/> + <check_box label="Fliegen" name="check fly" tool_tip="Falls aktiviert, können Einwohner auf Ihrem Land fliegen. Falls nicht aktiviert, können Einwohner lediglich auf Ihr Land fliegen und dort landen (dann jedoch nicht wieder weiterfliegen) oder über Ihr Land hinweg fliegen."/> + <text name="allow_label2"> + Objekte erstellen: + </text> + <check_box label="Alle Einwohner" name="edit objects check"/> + <check_box label="Gruppe" name="edit group objects check"/> + <text name="allow_label3"> + Objekteintritt: + </text> + <check_box label="Alle Einwohner" name="all object entry check"/> + <check_box label="Gruppe" name="group object entry check"/> + <text name="allow_label4"> + Skripts ausführen: + </text> + <check_box label="Alle Einwohner" name="check other scripts"/> + <check_box label="Gruppe" name="check group scripts"/> + <text name="land_options_label"> + Landoptionen: + </text> + <check_box label="Sicher (kein Schaden)" name="check safe" tool_tip="Falls aktiviert, wird Land auf Option „Sicher“ eingestellt, Kampfschäden sind deaktiviert. Falls nicht aktiviert, sind Kampfschäden aktiviert."/> + <check_box label="Kein Stoßen" name="PushRestrictCheck" tool_tip="Verhindert Skripte am Stoßen. Durch Aktivieren dieser Option verhindern Sie störendes Verhalten auf Ihrem Land."/> + <check_box label="Ort in Suche anzeigen (30 L$/Woche) unter" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/> + <combo_box name="land category with adult"> + <combo_box.item label="Alle Kategorien" name="item0"/> + <combo_box.item label="Lindenort" name="item1"/> + <combo_box.item label="Adult" name="item2"/> + <combo_box.item label="Kunst & Kultur" name="item3"/> + <combo_box.item label="Business" name="item4"/> + <combo_box.item label="Bildung" name="item5"/> + <combo_box.item label="Spielen" name="item6"/> + <combo_box.item label="Treffpunkt" name="item7"/> + <combo_box.item label="Anfängergerecht" name="item8"/> + <combo_box.item label="Parks und Natur" name="item9"/> + <combo_box.item label="Wohngebiet" name="item10"/> + <combo_box.item label="Shopping" name="item11"/> + <combo_box.item label="Sonstige" name="item12"/> + </combo_box> + <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"/> + <combo_box.item label="Business" name="item4"/> + <combo_box.item label="Bildung" name="item5"/> + <combo_box.item label="Spielen" name="item6"/> + <combo_box.item label="Treffpunkt" name="item7"/> + <combo_box.item label="Anfängergerecht" name="item8"/> + <combo_box.item label="Parks und Natur" name="item9"/> + <combo_box.item label="Wohngebiet" name="item10"/> + <combo_box.item label="Shopping" name="item11"/> + <combo_box.item label="Sonstige" name="item12"/> + </combo_box> + <check_box label="Mature-Inhalt" name="MatureCheck" tool_tip=""/> + <text name="Snapshot:"> + Foto: + </text> + <texture_picker label="" name="snapshot_ctrl" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> + <text name="landing_point"> + Landepunkt: [LANDING] + </text> + <button label="Festlegen" label_selected="Festlegen" left="234" name="Set" tool_tip="Legt den Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/> + <button label="Löschen" label_selected="Löschen" left="312" name="Clear" tool_tip="Landepunkt löschen." width="70"/> + <text name="Teleport Routing: "> + Teleport-Route: + </text> + <combo_box name="landing type" tool_tip="Teleport-Route -- festlegen, wie Teleports auf Ihrem Land gehandhabt werden sollen."> + <combo_box.item label="Blockiert" name="Blocked"/> + <combo_box.item label="Landepunkt" name="LandingPoint"/> + <combo_box.item label="Ãœberall" name="Anywhere"/> + </combo_box> + </panel> + <panel label="Medien" name="land_media_panel"> + <text name="with media:"> + Typ: + </text> + <combo_box name="media type" tool_tip="Geben Sie einen URL für den Film, die Webseite oder ein anderes Medium ein"/> + <text name="at URL:"> + Start URL: + </text> + <button label="Einstellen..." label_selected="Einstellen..." name="set_media_url"/> + <text name="CurrentURL:"> + Aktuelle URL: + </text> + <button label="Zurücksetzen..." label_selected="Zurücksetzen..." name="reset_media_url"/> + <check_box label="URL ausblenden" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/> + <text name="Description:"> + Inhalt: + </text> + <line_editor name="url_description" tool_tip="Text, der neben der Abspielen/Laden-Schaltfläche angezeigt wird"/> + <text name="Media texture:"> + Textur +ersetzen: + </text> + <texture_picker label="" name="media texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> + <text name="replace_texture_help"> + Objekte, die diese Textur verwenden, werden den Film oder die Webseite anzeigen, nachdem Sie auf den Pfeil (Wiedergabe) klicken. + +Wählen Sie das kleine Bild aus, um eine andere Textur auszuwählen. + </text> + <check_box label="Automatisch skalieren" name="media_auto_scale" tool_tip="Aktivieren Sie diese Option, um den Inhalt für diese Parzelle automatisch zu skalieren. Dies ist eventuell langsamer und die Qualität ist schlechter, aber Sie müssen keine weitere Texturskalierung oder -anpassung vornehmen."/> + <text name="media_size" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."> + Größe: + </text> + <spinner name="media_size_width" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."/> + <spinner name="media_size_height" tool_tip="Darstellungsgröße von Webmedien, für Standard bei 0 belassen."/> + <text name="pixels"> + Pixel + </text> + <text name="Options:"> + Optionen: + </text> + <check_box label="Schleife" name="media_loop" tool_tip="Spielt das Medium in einer Schleife ab. Der Abspielvorgang wird immer wieder von vorne fortgesetzt."/> + </panel> + <panel label="Audio" name="land_audio_panel"> + <text name="MusicURL:"> + Musik-URL: + </text> + <text name="Sound:"> + Sound: + </text> + <check_box label="Gesten- und Objektgeräusche auf diese Parzelle beschränken" name="check sound local"/> + <text name="Voice settings:"> + Voice: + </text> + <check_box label="Voice aktivieren" name="parcel_enable_voice_channel"/> + <check_box label="Voice aktivieren (vom Grundstück eingerichtet)" name="parcel_enable_voice_channel_is_estate_disabled"/> + <check_box label="Voice auf diese Parzelle beschränken" name="parcel_enable_voice_channel_parcel"/> + </panel> + <panel label="Zugang" name="land_access_panel"> + <panel.string name="estate_override"> + Eine oder mehrere dieser Optionen gelten auf Grundstücksebene + </panel.string> + <text name="Limit access to this parcel to:"> + Zugang zu dieser Parzelle + </text> + <check_box label="Freien Zugang erlauben" name="public_access"/> + <text name="Only Allow"> + Zugang verweigern für: + </text> + <check_box label="Einwohner, die keine Zahlungsinformationen bei Linden Lab hinterlegt haben" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen."/> + <check_box label="Einwohner, die keine altersgeprüften Erwachsenen sind" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung verbannen. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/> + <check_box label="Gruppenzugang erlauben: [GROUP]" name="GroupCheck" tool_tip="Gruppe im Register „Allgemein“ festlegen."/> + <check_box label="Pässe verkaufen an:" name="PassCheck" tool_tip="Ermöglicht befristeten Zugang zu dieser Parzelle"/> + <combo_box name="pass_combo"> + <combo_box.item label="Jeden" name="Anyone"/> + <combo_box.item label="Gruppe" name="Group"/> + </combo_box> + <spinner label="Preis in L$:" name="PriceSpin"/> + <spinner label="Online-Zeit:" name="HoursSpin"/> + <text label="Immer erlauben" name="AllowedText"> + Zulässige Einwohner + </text> + <name_list name="AccessList" tool_tip="([LISTED] angezeigt, max. [MAX])"/> + <button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_allowed"/> + <button label="Entfernen" label_selected="Entfernen" name="remove_allowed"/> + <text label="Verbannen" name="BanCheck"> + Verbannte Einwohner + </text> + <name_list name="BannedList" tool_tip="([LISTED] angezeigt, max. [MAX])"/> + <button label="Hinzufügen..." label_selected="Hinzufügen..." name="add_banned"/> + <button label="Entfernen" label_selected="Entfernen" name="remove_banned"/> + </panel> + </tab_container> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_animation_preview.xml b/indra/newview/skins/default/xui/de/floater_animation_preview.xml index fbd03ab3d73..0d56f1ef9f5 100644 --- a/indra/newview/skins/default/xui/de/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_animation_preview.xml @@ -1,91 +1,184 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Animation Preview" title=""> - <text name="name_label"> - Name: - </text> - <line_editor name="name_form"/> - <text name="description_label"> - Beschreibung: - </text> - <spinner label="Priorität" name="priority" tool_tip="Steuert, welche Animationen von dieser Animation überschrieben werden können."/> - <check_box bottom_delta="-18" label="Schleife" name="loop_check" tool_tip="Erzeugt eine Animationsschleife."/> - <spinner label="In (%)" name="loop_in_point" tool_tip="Anfang einer Animationsschleife festlegen."/> - <spinner label="Aus (%)" name="loop_out_point" tool_tip="Ende einer Animationsschleife festlegen."/> - <text name="hand_label"> - Handhaltung - </text> - <combo_box label="" name="hand_pose_combo" tool_tip="Steuert während der Animation die Bewegung der Hände."> - <combo_box.item name="Spread" label="Dehnen" /> - <combo_box.item name="Relaxed" label="Entspannt" /> - <combo_box.item name="PointBoth" label="Beide zeigen" /> - <combo_box.item name="Fist" label="Faust" /> - <combo_box.item name="RelaxedLeft" label="Links entspannt" /> - <combo_box.item name="PointLeft" label="Nach links zeigen" /> - <combo_box.item name="FistLeft" label="Linke Faust" /> - <combo_box.item name="RelaxedRight" label="Rechts entspannt" /> - <combo_box.item name="PointRight" label="Nach rechts zeigen" /> - <combo_box.item name="FistRight" label="Rechte Faust" /> - <combo_box.item name="SaluteRight" label="Rechts salutieren" /> - <combo_box.item name="Typing" label="Tippt" /> - <combo_box.item name="PeaceRight" label="Friedensrecht" /> - </combo_box> - <text name="emote_label"> - Ausdruck - </text> - <combo_box label="" name="emote_combo" tool_tip="Steuert Gesichtsregungen während der Animation."> - <combo_box.item name="[None]" label="Keine]" /> - <combo_box.item name="Aaaaah" label="Aaaaah" /> - <combo_box.item name="Afraid" label="Ängstlich" /> - <combo_box.item name="Angry" label="Verärgert" /> - <combo_box.item name="BigSmile" label="Grinst" /> - <combo_box.item name="Bored" label="Gelangweilt" /> - <combo_box.item name="Cry" label="Weinen" /> - <combo_box.item name="Disdain" label="Verachten" /> - <combo_box.item name="Embarrassed" label="Verlegen" /> - <combo_box.item name="Frown" label="Stirnrunzeln" /> - <combo_box.item name="Kiss" label="Küssen" /> - <combo_box.item name="Laugh" label="Lachen" /> - <combo_box.item name="Plllppt" label="Bäääh" /> - <combo_box.item name="Repulsed" label="Zurückgestoßen" /> - <combo_box.item name="Sad" label="Traurig" /> - <combo_box.item name="Shrug" label="Schulterzucken" /> - <combo_box.item name="Smile" label="Lächeln" /> - <combo_box.item name="Surprise" label="Ãœberraschung" /> - <combo_box.item name="Wink" label="Zwinkern" /> - <combo_box.item name="Worry" label="Sorgenvoll" /> - </combo_box> - <text name="preview_label" width="97"> - Vorschau während: - </text> - <combo_box label="" left_delta="107" name="preview_base_anim" tool_tip="Hiermit können Sie das Verhalten Ihres Avatars testen, während Ihr Avatar normale Bewegungen ausführt."> - <combo_box.item name="Standing" label="Stehend" /> - <combo_box.item name="Walking" label="Geht" /> - <combo_box.item name="Sitting" label="Sitzt" /> - <combo_box.item name="Flying" label="Fliegend" /> - </combo_box> - <spinner label="Eingang glätten (s)" label_width="105" name="ease_in_time" tool_tip="Einblendungsgeschwindigkeit von Animationen (in Sekunden)." width="175"/> - <spinner bottom_delta="-20" label="Ausgang glätten (s)" label_width="105" left="10" name="ease_out_time" tool_tip="Ausblendungsgeschwindigkeit von Animationen (in Sekunden)." width="175"/> - <button bottom_delta="-32" label="" name="play_btn" tool_tip="Animation stoppen/wiedergeben."/> - <button label="" name="stop_btn" tool_tip="Animation anhalten"/> - <slider label="" name="playback_slider"/> - <text name="bad_animation_text"> - Animationsdatei konnte nicht gelesen werden. - -Wir empfehlen exportierte BVH-Dateien aus Poser 4. - </text> - <button label="Abbrechen" name="cancel_btn"/> - <button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/> - <string name="failed_to_initialize"> - Bewegung konnte nicht initialisiert werden - </string> - <string name="anim_too_long"> - Animationsdatei ist [LENGTH] Sekunden lang. - -Maximal erlaubt sind [MAX_LENGTH] Sekunden. - </string> - <string name="failed_file_read"> - Animationsdatei konnte nicht gelesen werden. - -[STATUS] - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Animation Preview" title=""> + <floater.string name="failed_to_initialize"> + Bewegung konnte nicht initialisiert werden + </floater.string> + <floater.string name="anim_too_long"> + Animationsdatei ist [LENGTH] Sekunden lang. + +Maximal erlaubt sind [MAX_LENGTH] Sekunden. + </floater.string> + <floater.string name="failed_file_read"> + Animationsdatei konnte nicht gelesen werden. + +[STATUS] + </floater.string> + <floater.string name="E_ST_OK"> + OK + </floater.string> + <floater.string name="E_ST_EOF"> + Unvollständige Datei + </floater.string> + <floater.string name="E_ST_NO_CONSTRAINT"> + Constraint-Definition kann nicht gelesen werden. + </floater.string> + <floater.string name="E_ST_NO_FILE"> + BVH-Datei kann nicht geöffnet werden + </floater.string> + <floater.string name="E_ST_NO_HIER"> + Ungültiger HIERARCHY-Titel. + </floater.string> + <floater.string name="E_ST_NO_JOINT"> + ROOT oder JOINT nicht gefunden. + </floater.string> + <floater.string name="E_ST_NO_NAME"> + JOINT-Name nicht erfasst. + </floater.string> + <floater.string name="E_ST_NO_OFFSET"> + VERSATZ nicht gefunden. + </floater.string> + <floater.string name="E_ST_NO_CHANNELS"> + CHANNELS nicht gefunden. + </floater.string> + <floater.string name="E_ST_NO_ROTATION"> + Kann Rotations-Reihenfolge nicht erfassen. + </floater.string> + <floater.string name="E_ST_NO_AXIS"> + Kann Rotations-Achse nicht erfassen. + </floater.string> + <floater.string name="E_ST_NO_MOTION"> + MOTION nicht gefunden. + </floater.string> + <floater.string name="E_ST_NO_FRAMES"> + Anzahl der Bilder kann nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_FRAME_TIME"> + Bildzeit kann nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_POS"> + Positions-Werte können nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_ROT"> + Kann Rotations-Werte nicht erfassen. + </floater.string> + <floater.string name="E_ST_NO_XLT_FILE"> + Datei kann nicht geöffnet werden + </floater.string> + <floater.string name="E_ST_NO_XLT_HEADER"> + Ãœbersetzungstitel kann nicht gelesen werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_NAME"> + Ãœbersetzungsnamen können nicht geladen werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_IGNORE"> + Ignorier-Wert kann nicht gelesen werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_RELATIVE"> + Ãœbersetzungs-Wert kann nicht gelesen werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_OUTNAME"> + Outname-Wert kann nicht gelesen werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_MATRIX"> + Ãœbersetzungsmatrix kann nicht geladen werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGECHILD"> + Mergechild-Name nicht erfasst. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGEPARENT"> + Mergeparent-Name nicht erfasst. + </floater.string> + <floater.string name="E_ST_NO_XLT_PRIORITY"> + Prioritätswert kann nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_LOOP"> + Loop-Wert kann nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEIN"> + Easeln-Wert kann nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEOUT"> + easeOut-Wert kann nicht erfasst werden. + </floater.string> + <floater.string name="E_ST_NO_XLT_HAND"> + Hand-Morph-Wert nicht erfasst. + </floater.string> + <floater.string name="E_ST_NO_XLT_EMOTE"> + Emote-Name kann nicht gelesen werden. + </floater.string> + <text name="name_label"> + Name: + </text> + <line_editor name="name_form"/> + <text name="description_label"> + Beschreibung: + </text> + <spinner label="Priorität" name="priority" tool_tip="Steuert, welche Animationen von dieser Animation überschrieben werden können."/> + <check_box bottom_delta="-18" label="Schleife" name="loop_check" tool_tip="Erzeugt eine Animationsschleife."/> + <spinner label="In (%)" name="loop_in_point" tool_tip="Anfang einer Animationsschleife festlegen."/> + <spinner label="Aus (%)" name="loop_out_point" tool_tip="Ende einer Animationsschleife festlegen."/> + <text name="hand_label"> + Handhaltung + </text> + <combo_box label="" name="hand_pose_combo" tool_tip="Steuert während der Animation die Bewegung der Hände."> + <combo_box.item label="Dehnen" name="Spread"/> + <combo_box.item label="Entspannt" name="Relaxed"/> + <combo_box.item label="Beide zeigen" name="PointBoth"/> + <combo_box.item label="Faust" name="Fist"/> + <combo_box.item label="Links entspannt" name="RelaxedLeft"/> + <combo_box.item label="Nach links zeigen" name="PointLeft"/> + <combo_box.item label="Linke Faust" name="FistLeft"/> + <combo_box.item label="Rechts entspannt" name="RelaxedRight"/> + <combo_box.item label="Nach rechts zeigen" name="PointRight"/> + <combo_box.item label="Rechte Faust" name="FistRight"/> + <combo_box.item label="Rechts salutieren" name="SaluteRight"/> + <combo_box.item label="Tippt" name="Typing"/> + <combo_box.item label="Friedensrecht" name="PeaceRight"/> + </combo_box> + <text name="emote_label"> + Ausdruck + </text> + <combo_box label="" name="emote_combo" tool_tip="Steuert Gesichtsregungen während der Animation."> + <combo_box.item label="Keine]" name="[None]"/> + <combo_box.item label="Aaaaah" name="Aaaaah"/> + <combo_box.item label="Ängstlich" name="Afraid"/> + <combo_box.item label="Verärgert" name="Angry"/> + <combo_box.item label="Grinst" name="BigSmile"/> + <combo_box.item label="Gelangweilt" name="Bored"/> + <combo_box.item label="Weinen" name="Cry"/> + <combo_box.item label="Verachten" name="Disdain"/> + <combo_box.item label="Verlegen" name="Embarrassed"/> + <combo_box.item label="Stirnrunzeln" name="Frown"/> + <combo_box.item label="Küssen" name="Kiss"/> + <combo_box.item label="Lachen" name="Laugh"/> + <combo_box.item label="Bäääh" name="Plllppt"/> + <combo_box.item label="Zurückgestoßen" name="Repulsed"/> + <combo_box.item label="Traurig" name="Sad"/> + <combo_box.item label="Schulterzucken" name="Shrug"/> + <combo_box.item label="Lächeln" name="Smile"/> + <combo_box.item label="Ãœberraschung" name="Surprise"/> + <combo_box.item label="Zwinkern" name="Wink"/> + <combo_box.item label="Sorgenvoll" name="Worry"/> + </combo_box> + <text name="preview_label" width="97"> + Vorschau während: + </text> + <combo_box label="" left_delta="107" name="preview_base_anim" tool_tip="Hiermit können Sie das Verhalten Ihres Avatars testen, während Ihr Avatar normale Bewegungen ausführt."> + <combo_box.item label="Stehend" name="Standing"/> + <combo_box.item label="Geht" name="Walking"/> + <combo_box.item label="Sitzt" name="Sitting"/> + <combo_box.item label="Fliegend" name="Flying"/> + </combo_box> + <spinner label="Eingang glätten (s)" label_width="105" name="ease_in_time" tool_tip="Einblendungsgeschwindigkeit von Animationen (in Sekunden)." width="175"/> + <spinner bottom_delta="-20" label="Ausgang glätten (s)" label_width="105" left="10" name="ease_out_time" tool_tip="Ausblendungsgeschwindigkeit von Animationen (in Sekunden)." width="175"/> + <button bottom_delta="-32" label="" name="play_btn" tool_tip="Animation stoppen/wiedergeben."/> + <button label="" name="stop_btn" tool_tip="Animation anhalten"/> + <slider label="" name="playback_slider"/> + <text name="bad_animation_text"> + Animationsdatei konnte nicht gelesen werden. + +Wir empfehlen exportierte BVH-Dateien aus Poser 4. + </text> + <button label="Abbrechen" name="cancel_btn"/> + <button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml index e1ea7926944..b95b6febd98 100644 --- a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml @@ -1,45 +1,43 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="EINWOHNER AUSWÄHLEN"> - <tab_container name="ResidentChooserTabs"> - <panel label="Suchen" name="SearchPanel"> - <text name="InstructSearchResidentName"> - Geben Sie einen Teil des Namens des -Einwohners ein: - </text> - <line_editor bottom_delta="-36" name="Edit" /> - <button label="Suchen" label_selected="Suchen" name="Find"/> - <scroll_list height="74" name="SearchResults" bottom_delta="-79"/> - </panel> - <panel label="Visitenkarten" name="CallingCardsPanel"> - <text name="InstructSelectCallingCard"> - Wählen Sie eine Visitenkarte: - </text> - </panel> - <panel label="In meiner Nähe" name="NearMePanel"> - <text name="InstructSelectResident"> - Einwohner in der Nähe -auswählen: - </text> - <button font="SansSerifSmall" label="Liste aktualisieren" label_selected="Liste aktualisieren" name="Refresh" left_delta="10" width="105"/> - <slider label="Bereich" name="near_me_range" bottom_delta="-36"/> - <text name="meters"> - Meter - </text> - <scroll_list bottom_delta="-169" height="159" name="NearMe" /> - </panel> - </tab_container> - <button label="Auswählen" label_selected="Auswählen" name="Select"/> - <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/> - <string name="not_found"> - „[TEXT]“ nicht gefunden - </string> - <string name="no_one_near"> - Niemand in der Nähe - </string> - <string name="no_results"> - Keine Ergebnisse - </string> - <string name="searching"> - Suchen... - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="avatarpicker" title="EINWOHNER AUSWÄHLEN"> + <tab_container name="ResidentChooserTabs"> + <panel label="Suchen" name="SearchPanel"> + <text name="InstructSearchResidentName"> + Geben Sie einen Teil des Namens einer Person ein: + </text> + <line_editor bottom_delta="-36" name="Edit"/> + <button label="Los" label_selected="Los" name="Find"/> + <scroll_list bottom_delta="-79" height="74" name="SearchResults"/> + </panel> + <panel label="Visitenkarten" name="CallingCardsPanel"> + <text name="InstructSelectCallingCard"> + Wählen Sie eine Visitenkarte: + </text> + </panel> + <panel label="In meiner Nähe" name="NearMePanel"> + <text name="InstructSelectResident"> + Wählen Sie eine Person aus, die sich in der Nähe befindet: + </text> + <button font="SansSerifSmall" label="Liste aktualisieren" label_selected="Liste aktualisieren" left_delta="10" name="Refresh" width="105"/> + <slider bottom_delta="-36" label="Bereich" name="near_me_range"/> + <text name="meters"> + Meter + </text> + <scroll_list bottom_delta="-169" height="159" name="NearMe"/> + </panel> + </tab_container> + <button label="OK" label_selected="OK" name="Select"/> + <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/> + <string name="not_found"> + „[TEXT]“ nicht gefunden + </string> + <string name="no_one_near"> + Niemand in der Nähe + </string> + <string name="no_results"> + Keine Ergebnisse + </string> + <string name="searching"> + Suchen... + </string> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_beacons.xml b/indra/newview/skins/default/xui/de/floater_beacons.xml index 58e2e2681f4..bfa3f6e4c93 100644 --- a/indra/newview/skins/default/xui/de/floater_beacons.xml +++ b/indra/newview/skins/default/xui/de/floater_beacons.xml @@ -1,15 +1,21 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="BEACONS"> - <panel name="beacons_panel"> - <check_box label="Auf Berührung beschränkte Skriptobjekte" name="touch_only"/> - <check_box label="Skripting-Objekte" name="scripted"/> - <check_box label="Physische Objekte" name="physical"/> - <check_box label="Soundquellen" name="sounds"/> - <check_box label="Partikelquellen" name="particles"/> - <check_box label="Glanzlichter anzeigen" name="highlights"/> - <check_box label="Beacons anzeigen" name="beacons"/> - <text name="beacon_width_label"> - Beacon-Breite: - </text> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="beacons" title="BEACONS"> + <panel name="beacons_panel"> + <text name="label_show"> + Anzeigen: + </text> + <check_box label="Beacons" name="beacons"/> + <check_box label="Glanzlichter" name="highlights"/> + <text name="beacon_width_label" tool_tip="Beacon-Breite"> + Breite: + </text> + <text name="label_objects"> + Für diese Objekte: + </text> + <check_box label="Physisch" name="physical"/> + <check_box label="Skriptobjekte" name="scripted"/> + <check_box label="Nur berühren" name="touch_only"/> + <check_box label="Soundquellen" name="sounds"/> + <check_box label="Partikelquellen" name="particles"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_build_options.xml b/indra/newview/skins/default/xui/de/floater_build_options.xml index 58f117f6b16..2f510cd75af 100644 --- a/indra/newview/skins/default/xui/de/floater_build_options.xml +++ b/indra/newview/skins/default/xui/de/floater_build_options.xml @@ -1,8 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="build options floater" title="RASTEROPTIONEN"> - <spinner label="Rastereinheit (Meter)" name="GridResolution" /> - <spinner label="Rastergröße (Meter)" name="GridDrawSize" /> - <check_box label="Einrasten von Untereinheiten aktivieren" name="GridSubUnit" /> - <check_box label="Querschnitte anzeigen" name="GridCrossSection" /> - <slider label="Rasterdeckkraft" name="GridOpacity" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="build options floater" title="RASTEROPTIONEN"> + <spinner label="Rastereinheit (Meter)" name="GridResolution"/> + <spinner label="Rastergröße (Meter)" name="GridDrawSize"/> + <check_box label="An Untereinheiten ausrichten" name="GridSubUnit"/> + <check_box label="Querschnitte anzeigen" name="GridCrossSection"/> + <text name="grid_opacity_label" tool_tip="Rasterdeckkraft"> + Deckkraft: + </text> + <slider label="Rasterdeckkraft" name="GridOpacity"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml index fff6aa4b73e..1dceb1ad674 100644 --- a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml @@ -1,44 +1,53 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="MEHRERE INHALTSBERECHTIGUNGEN ÄNDERN"> - <text name="applyto"> - Inhaltsarten - </text> - <check_box label="Animation" name="check_animation"/> - <check_box label="Körperteile" name="check_bodypart"/> - <check_box label="Kleidung" name="check_clothing"/> - <check_box label="Gesten" name="check_gesture"/> - <check_box label="Landmarken" name="check_landmark"/> - <check_box label="Notizkarten" name="check_notecard"/> - <check_box label="Objekte" name="check_object"/> - <check_box label="Skripts" name="check_script"/> - <check_box label="Sounds" name="check_sound"/> - <check_box label="Texturen" name="check_texture"/> - <button label="Alle auswählen" label_selected="Alle" name="check_all"/> - <button label="Keine" label_selected="Keine" name="check_none"/> - <text name="newperms"> - Neue Berechtigungen - </text> - <check_box label="Mit Gruppe teilen" name="share_with_group"/> - <check_box label="Kopieren allen erlauben" name="everyone_copy"/> - <text name="NextOwnerLabel"> - Nächster Eigentümer kann: - </text> - <check_box label="Bearbeiten" name="next_owner_modify"/> - <check_box label="Kopieren" name="next_owner_copy"/> - <check_box label="Verkaufen/Weggeben" name="next_owner_transfer"/> - <button label="Hilfe" name="help"/> - <button label="Ãœbernehmen" name="apply"/> - <button label="Schließen" name="close"/> - <string name="nothing_to_modify_text"> - Auswahl enthält keinen Inhalt, der bearbeitet werden kann. - </string> - <string name="status_text"> - Berechtigungen werden eingestellt auf [NAME] - </string> - <string name="start_text"> - Start: Anforderung auf Änderung der Berechtigung... - </string> - <string name="done_text"> - Ende: Anforderung auf Änderung der Berechtigung. - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floaterbulkperms" title="Inhalt-Berechtigungen bearbeiten"> + <floater.string name="nothing_to_modify_text"> + Auswahl enthält keinen Inhalt, der bearbeitet werden kann. + </floater.string> + <floater.string name="status_text"> + Berechtigungen werden eingestellt auf [NAME] + </floater.string> + <floater.string name="start_text"> + Start: Anforderung auf Änderung der Berechtigung... + </floater.string> + <floater.string name="done_text"> + Ende: Anforderung auf Änderung der Berechtigung. + </floater.string> + <check_box label="Animation" name="check_animation"/> + <icon name="icon_animation" tool_tip="Animation"/> + <check_box label="Körperteile" name="check_bodypart"/> + <icon name="icon_bodypart" tool_tip="Körperteile"/> + <check_box label="Kleidung" name="check_clothing"/> + <icon name="icon_clothing" tool_tip="Kleidung"/> + <check_box label="Gesten" name="check_gesture"/> + <icon name="icon_gesture" tool_tip="Gesten"/> + <check_box label="Notizkarten" name="check_notecard"/> + <icon name="icon_notecard" tool_tip="Notizkarten"/> + <check_box label="Objekte" name="check_object"/> + <icon name="icon_object" tool_tip="Objekte"/> + <check_box label="Skripts" name="check_script"/> + <icon name="icon_script" tool_tip="Skripts"/> + <check_box label="Sounds" name="check_sound"/> + <icon name="icon_sound" tool_tip="Sounds"/> + <check_box label="Texturen" name="check_texture"/> + <button label="√ Alle" label_selected="Alle" name="check_all"/> + <button label="Löschen" label_selected="Keine" name="check_none"/> + <text name="newperms"> + Neue Inhalts-Berechtigungen + </text> + <text name="GroupLabel"> + Gruppe: + </text> + <check_box label="Freigeben" name="share_with_group"/> + <text name="AnyoneLabel"> + Jeder: + </text> + <check_box label="Kopieren" name="everyone_copy"/> + <text name="NextOwnerLabel"> + Nächster Eigentümer: + </text> + <check_box label="Bearbeiten" name="next_owner_modify"/> + <check_box label="Kopieren" name="next_owner_copy"/> + <check_box initial_value="true" label="Transferieren" name="next_owner_transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> + <button label="OK" name="apply"/> + <button label="Abbrechen" name="close"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_buy_object.xml b/indra/newview/skins/default/xui/de/floater_buy_object.xml index df6bf76240d..b1e4476207f 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_object.xml @@ -1,26 +1,26 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="contents" title="OBJEKTKOPIE KAUFEN"> - <text name="contents_text"> - samt Inhalt: - </text> - <text name="buy_text"> - [AMOUNT] L$ von [NAME] kaufen? - </text> - <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73" /> - <button label="Kaufen" label_selected="Kaufen" name="buy_btn" /> - <text name="title_buy_text"> - Kaufen - </text> - <string name="title_buy_copy_text"> - Kopie kaufen von - </string> - <text name="no_copy_text"> - (kein Kopieren) - </text> - <text name="no_modify_text"> - (kein Bearbeiten) - </text> - <text name="no_transfer_text"> - (kein Transferieren) - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="contents" title="OBJEKTKOPIE KAUFEN"> + <text name="contents_text"> + Inhalt: + </text> + <text name="buy_text"> + [AMOUNT] L$ von [NAME] kaufen? + </text> + <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73"/> + <button label="Kaufen" label_selected="Kaufen" name="buy_btn"/> + <text name="title_buy_text"> + Kaufen + </text> + <string name="title_buy_copy_text"> + Kopie kaufen von + </string> + <text name="no_copy_text"> + (kein Kopieren) + </text> + <text name="no_modify_text"> + (kein Bearbeiten) + </text> + <text name="no_transfer_text"> + (kein Transferieren) + </text> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_camera.xml b/indra/newview/skins/default/xui/de/floater_camera.xml index f44db713d8b..a0cf6cbecf3 100644 --- a/indra/newview/skins/default/xui/de/floater_camera.xml +++ b/indra/newview/skins/default/xui/de/floater_camera.xml @@ -1,16 +1,23 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="camera_floater"> - <floater.string name="rotate_tooltip"> - Kamera um Fokus drehen - </floater.string> - <floater.string name="zoom_tooltip"> - Kamera auf Fokus zoomen - </floater.string> - <floater.string name="move_tooltip"> - Kamera nach oben, unten, links und rechts bewegen - </floater.string> - <panel name="controls"> - <joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/> - <joystick_zoom name="zoom" tool_tip="Kamera auf Fokus zoomen"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater"> + <floater.string name="rotate_tooltip"> + Kamera um Fokus drehen + </floater.string> + <floater.string name="zoom_tooltip"> + Kamera auf Fokus zoomen + </floater.string> + <floater.string name="move_tooltip"> + Kamera nach oben, unten, links und rechts bewegen + </floater.string> + <panel name="controls"> + <joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/> + <joystick_zoom name="zoom" tool_tip="Kamera auf Fokus zoomen"/> + <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus herum kreisen"/> + </panel> + <panel name="buttons"> + <button label="" name="orbit_btn" tool_tip="Kamera kreisen"/> + <button label="" name="pan_btn" tool_tip="Kamera schwenken"/> + <button label="" name="avatarview_btn" tool_tip="Avatarsicht"/> + <button label="" name="freecamera_btn" tool_tip="Objekt ansehen"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_color_picker.xml b/indra/newview/skins/default/xui/de/floater_color_picker.xml index 47f256918a0..4143f634aff 100644 --- a/indra/newview/skins/default/xui/de/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/de/floater_color_picker.xml @@ -1,32 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="ColorPicker" title="FARBAUSWAHL"> - <text name="r_val_text"> - Rot: - </text> - <text name="g_val_text"> - Grün: - </text> - <text name="b_val_text"> - Blau: - </text> - <text name="h_val_text"> - Farbton: - </text> - <text name="s_val_text"> - Sätt.: - </text> - <text name="l_val_text"> - Hell.: - </text> - <check_box label="Sofort übernehmen" name="apply_immediate" /> - <button label="" label_selected="" name="color_pipette" /> - <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" /> - <button label="Auswählen" label_selected="Auswählen" name="select_btn" /> - <text name="Current color:"> - Aktuelle Farbe: - </text> - <text name="(Drag below to save.)"> -(Nach unten ziehen, - um zu speichern) - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="ColorPicker" title="FARBAUSWAHL"> + <text name="r_val_text"> + Rot: + </text> + <text name="g_val_text"> + Grün: + </text> + <text name="b_val_text"> + Blau: + </text> + <text name="h_val_text"> + Farbton: + </text> + <text name="s_val_text"> + Sätt.: + </text> + <text name="l_val_text"> + Hell.: + </text> + <check_box label="Jetzt übernehmen" name="apply_immediate"/> + <button label="" label_selected="" name="color_pipette"/> + <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/> + <button label="OK" label_selected="Auswählen" name="select_btn"/> + <text name="Current color:"> + Aktuelle Farbe: + </text> + <text name="(Drag below to save.)"> + (Nach unten ziehen, + um zu speichern) + </text> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_god_tools.xml b/indra/newview/skins/default/xui/de/floater_god_tools.xml index f93a9b94761..34ea18457e4 100644 --- a/indra/newview/skins/default/xui/de/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_god_tools.xml @@ -1,136 +1,102 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="godtools floater" title="GOTT-WERKZEUGE"> - <tab_container name="GodTools Tabs"> - <panel label="Raster" name="grid"> - <button label="Alle Benutzer hinauswerfen" label_selected="Alle Benutzer hinauswerfen" - name="Kick all users" width="175" /> - <button label="Sichtbarkeits-Cache dieser Regionskarte leeren" - label_selected="Sichtbarkeits-Cache dieser Regionskarte leeren" - name="Flush This Region's Map Visibility Caches" width="285" /> - </panel> - <panel label="Region" name="region"> - <text name="Sim Name:" width="55"> - Sim-Name: - </text> - <check_box label="Startbereich Einleitung" name="check prelude" - tool_tip="Diese Region zu einem Startbereich machen." /> - <check_box label="Sonne fest" name="check fixed sun" - tool_tip="Fixiert den Sonnenstand (wie in „Region/Grundstück“ > „Terrain“." /> - <check_box label="Zuhause auf Teleport zurücksetzen" name="check reset home" - tool_tip="Wenn Einwohner wegteleportieren, ihr Zuhause auf Zielposition setzen." height="32" /> - <check_box label="Sichtbar" name="check visible" - tool_tip="Diese Region für Nicht-Götter sichtbar machen." bottom_delta="-32" /> - <check_box label="Schaden" name="check damage" - tool_tip="Schaden in dieser Region aktivieren." /> - <check_box label="Trafficüberwachung blockieren" name="block dwell" - tool_tip="In dieser Region die Traffic-Berechnung abschalten." /> - <check_box label="Terraformen blockieren" name="block terraform" - tool_tip="Das Terraformen von Land verbieten (Benutzen Sie dies um Leuten das Terraformen ihres Landes zu verbieten)" /> - <check_box label="Sandkasten" name="is sandbox" - tool_tip="Sandkastenregion ein-/ausschalten." /> - <button label="Terrain formen" label_selected="Terrain formen" name="Bake Terrain" - tool_tip="Das aktuelle Terrain als Standard speichern." width="118" /> - <button label="Terrain zurücksetzen" label_selected="Terrain zurücksetzen" - name="Revert Terrain" - tool_tip="Das aktuelle Terrain mit dem Standard ersetzen." width="118" /> - <button label="Terrain tauschen" label_selected="Terrain tauschen" name="Swap Terrain" - tool_tip="Aktuelles Terrain gegen Standard austauschen." width="118" /> - <text name="estate id"> - Grundstücks-ID: - </text> - <text name="parent id"> - Parent ID: - </text> - <line_editor name="parentestate" tool_tip="Das übergeordnete Grundstück dieser Region" /> - <text name="Grid Pos: "> - Raster-Pos.: - </text> - <line_editor name="gridposx" tool_tip="Die X-Rasterposition dieser Region" left_delta="110" width="35" /> - <line_editor name="gridposy" tool_tip="Die Y-Rasterposition dieser Region" left_delta="45" width="35" /> - <text name="Redirect to Grid: " > - Auf Raster umleiten: - </text> - <line_editor left_delta="110" name="redirectx" width="35" /> - <line_editor left_delta="45" name="redirecty" width="35" /> - <text name="billable factor text" font="SansSerifSmall" > - Abrechnungsfaktor: - </text> - <text name="land cost text"> - L$ pro qm: - </text> - <button label="Aktualisieren" label_selected="Aktualisieren" name="Refresh" - tool_tip="Klicken Sie hier, um die obigen Informationen zu aktualisieren." /> - <button label="Ãœbernehmen" label_selected="Ãœbernehmen" name="Apply" - tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen." /> - <button label="Region auswählen" label_selected="Region auswählen" - name="Select Region" - tool_tip="Die gesamte Region mit dem Landwerkzeug auswählen." width="130" left="136"/> - <button label="Automatisch speichern" label_selected="Automatisch speichern" - name="Autosave now" - tool_tip="gzipped-Status im Autosave-Verzeichnis speichern." width="130" left="136"/> - </panel> - <panel label="Objekte" name="objects"> - <text name="Sim Name:" width="55"> - Sim-Name: - </text> - <text name="region name"> - Welsh - </text> - <check_box label="Skripts deaktivieren" name="disable scripts" - tool_tip="Skripts in dieser Region komplett abschalten" /> - <check_box label="Kollisionen deaktivieren" name="disable collisions" - tool_tip="Nicht-Avatar-Kollisionen in dieser Region komplett abschalten" /> - <check_box label="Physik deaktivieren" name="disable physics" - tool_tip="Die Physik in dieser Region komplett abschalten" /> - <button label="Ãœbernehmen" label_selected="Ãœbernehmen" name="Apply" - tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen." /> - <button label="Ziel festlegen" label_selected="Ziel festlegen" name="Set Target" - tool_tip="Den Ziel-Avatar für das Löschen von Objekten auswählen." /> - <text name="target_avatar_name"> - (kein Ziel) - </text> - <button label="Geskriptete Objekte des Ziels auf anderen Ländern löschen" - label_selected="Geskriptete Objekte des Ziels auf anderen Ländern löschen" - name="Delete Target's Scripted Objects On Others Land" - tool_tip="Alle dem Ziel gehörenden geskripteten Objekte auf Land, das dem Ziel nicht gehört, löschen. Objekte (nicht kopierfähig) werden zurückgegeben." /> - <button label="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" - label_selected="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" - name="Delete Target's Scripted Objects On *Any* Land" - tool_tip="Alle dem Ziel gehörenden geskripteten Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben." /> - <button label="*ALLE* Objekte des Ziels löschen" - label_selected="*ALLE* Objekte des Ziels löschen" - name="Delete *ALL* Of Target's Objects" - tool_tip="Alle dem Ziel gehörenden Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben." /> - <button label="Top-Kollisionsobjekte" label_selected="Top-Kollisionsobjekte" - name="Get Top Colliders" - tool_tip="Zeigt eine Liste der Objekte mit den meisten Callbacks in der nahen Phase an." width="130" /> - <button label="Top-Skripts" label_selected="Top-Skripts" name="Get Top Scripts" - tool_tip="Zeigt eine Liste der Objekte an, die die meiste Zeit über Skripts ausführen." width="130" /> - <button label="Scripting-Ãœbersicht" label_selected="Scripting-Ãœbersicht" - name="Scripts digest" - tool_tip="Zeigt eine Liste aller Skripts mit Häufigkeit an." width="130" /> - </panel> - <panel label="Anfrage" name="request"> - <text name="Destination:"> - Ziel: - </text> - <combo_box name="destination"> - <combo_box.item name="item1" label="Auswahl" /> - <combo_box.item name="item2" label="Avatar-Region" /> - </combo_box> - <text name="Request:"> - Anfrage: - </text> - <combo_box name="request"> - <combo_box.item name="item1" label="Kollisionsobjekte <Schritte>" /> - <combo_box.item name="item2" label="Skripts <Zähler>,<Optionales Muster>" /> - <combo_box.item name="item3" label="Objekte <Muster>" /> - <combo_box.item name="item4" label="lt;asset_id> erstellen" /> - </combo_box> - <text name="Parameter:"> - Parameter: - </text> - <button label="Anfrage" label_selected="Anfrage" name="Make Request" /> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="godtools floater" title="GOTT-WERKZEUGE"> + <tab_container name="GodTools Tabs"> + <panel label="Raster" name="grid"> + <button label="Alle Benutzer hinauswerfen" label_selected="Alle Benutzer hinauswerfen" name="Kick all users" width="175"/> + <button label="Sichtbarkeits-Cache dieser Regionskarte leeren" label_selected="Sichtbarkeits-Cache dieser Regionskarte leeren" name="Flush This Region's Map Visibility Caches" width="285"/> + </panel> + <panel label="Region" name="region"> + <text name="Sim Name:" width="55"> + Sim-Name: + </text> + <check_box label="Startbereich Einleitung" name="check prelude" tool_tip="Diese Region zu einem Startbereich machen."/> + <check_box label="Sonne fest" name="check fixed sun" tool_tip="Fixiert den Sonnenstand (wie in „Region/Grundstück“ > „Terrain“."/> + <check_box height="32" label="Zuhause auf Teleport +zurücksetzen" name="check reset home" tool_tip="Wenn Einwohner wegteleportieren, ihr Zuhause auf Zielposition setzen."/> + <check_box bottom_delta="-32" label="Sichtbar" name="check visible" tool_tip="Diese Region für Nicht-Götter sichtbar machen."/> + <check_box label="Schaden" name="check damage" tool_tip="Schaden in dieser Region aktivieren."/> + <check_box label="Trafficüberwachung blockieren" name="block dwell" tool_tip="In dieser Region die Traffic-Berechnung abschalten."/> + <check_box label="Terraformen blockieren" name="block terraform" tool_tip="Das Terraformen von Land verbieten (Benutzen Sie dies um Leuten das Terraformen ihres Landes zu verbieten)"/> + <check_box label="Sandkasten" name="is sandbox" tool_tip="Sandkastenregion ein-/ausschalten."/> + <button label="Terrain formen" label_selected="Terrain formen" name="Bake Terrain" tool_tip="Das aktuelle Terrain als Standard speichern." width="118"/> + <button label="Terrain zurücksetzen" label_selected="Terrain zurücksetzen" name="Revert Terrain" tool_tip="Das aktuelle Terrain mit dem Standard ersetzen." width="118"/> + <button label="Terrain tauschen" label_selected="Terrain tauschen" name="Swap Terrain" tool_tip="Aktuelles Terrain gegen Standard austauschen." width="118"/> + <text name="estate id"> + Grundstücks-ID: + </text> + <text name="parent id"> + Parent ID: + </text> + <line_editor name="parentestate" tool_tip="Das übergeordnete Grundstück dieser Region"/> + <text name="Grid Pos: "> + Raster-Pos.: + </text> + <line_editor left_delta="110" name="gridposx" tool_tip="Die X-Rasterposition dieser Region" width="35"/> + <line_editor left_delta="45" name="gridposy" tool_tip="Die Y-Rasterposition dieser Region" width="35"/> + <text name="Redirect to Grid: "> + Auf Raster umleiten: + </text> + <line_editor left_delta="110" name="redirectx" width="35"/> + <line_editor left_delta="45" name="redirecty" width="35"/> + <text font="SansSerifSmall" name="billable factor text"> + Abrechnungsfaktor: + </text> + <text name="land cost text"> + L$ pro qm: + </text> + <button label="Aktualisieren" label_selected="Aktualisieren" name="Refresh" tool_tip="Klicken Sie hier, um die obigen Informationen zu aktualisieren."/> + <button label="Ãœbernehmen" label_selected="Ãœbernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/> + <button label="Region auswählen" label_selected="Region auswählen" left="136" name="Select Region" tool_tip="Die gesamte Region mit dem Landwerkzeug auswählen." width="130"/> + <button label="Automatisch speichern" label_selected="Automatisch speichern" left="136" name="Autosave now" tool_tip="gzipped-Status im Autosave-Verzeichnis speichern." width="130"/> + </panel> + <panel label="Objekte" name="objects"> + <panel.string name="no_target"> + (kein Ziel) + </panel.string> + <text name="Sim Name:" width="55"> + Sim-Name: + </text> + <text name="region name"> + Welsh + </text> + <check_box label="Skripts +deaktivieren" name="disable scripts" tool_tip="Skripts in dieser Region komplett abschalten"/> + <check_box label="Kollisionen +deaktivieren" name="disable collisions" tool_tip="Nicht-Avatar-Kollisionen in dieser Region komplett abschalten"/> + <check_box label="Physik deaktivieren" name="disable physics" tool_tip="Die Physik in dieser Region komplett abschalten"/> + <button label="Ãœbernehmen" label_selected="Ãœbernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/> + <button label="Ziel festlegen" label_selected="Ziel festlegen" name="Set Target" tool_tip="Den Ziel-Avatar für das Löschen von Objekten auswählen."/> + <text name="target_avatar_name"> + (kein Ziel) + </text> + <button label="Geskriptete Objekte des Ziels auf anderen Ländern löschen" label_selected="Geskriptete Objekte des Ziels auf anderen Ländern löschen" name="Delete Target's Scripted Objects On Others Land" tool_tip="Alle dem Ziel gehörenden geskripteten Objekte auf Land, das dem Ziel nicht gehört, löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/> + <button label="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" label_selected="Geskriptete Objekte des Ziels auf *allen* Ländern löschen" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Alle dem Ziel gehörenden geskripteten Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/> + <button label="*ALLE* Objekte des Ziels löschen" label_selected="*ALLE* Objekte des Ziels löschen" name="Delete *ALL* Of Target's Objects" tool_tip="Alle dem Ziel gehörenden Objekte in dieser Region löschen. Objekte (nicht kopierfähig) werden zurückgegeben."/> + <button label="Top-Kollisionsobjekte" label_selected="Top-Kollisionsobjekte" name="Get Top Colliders" tool_tip="Zeigt eine Liste der Objekte mit den meisten Callbacks in der nahen Phase an." width="130"/> + <button label="Top-Skripts" label_selected="Top-Skripts" name="Get Top Scripts" tool_tip="Zeigt eine Liste der Objekte an, die die meiste Zeit über Skripts ausführen." width="130"/> + <button label="Scripting-Ãœbersicht" label_selected="Scripting-Ãœbersicht" name="Scripts digest" tool_tip="Zeigt eine Liste aller Skripts mit Häufigkeit an." width="130"/> + </panel> + <panel label="Anfrage" name="request"> + <text name="Destination:"> + Ziel: + </text> + <combo_box name="destination"> + <combo_box.item label="Auswahl" name="item1"/> + <combo_box.item label="Avatar-Region" name="item2"/> + </combo_box> + <text name="Request:"> + Anfrage: + </text> + <combo_box name="request"> + <combo_box.item label="Kollisionsobjekte <Schritte>" name="item1"/> + <combo_box.item label="Skripts <Zähler>,<Optionales Muster>" name="item2"/> + <combo_box.item label="Objekte <Muster>" name="item3"/> + <combo_box.item label="lt;asset_id> erstellen" name="item4"/> + </combo_box> + <text name="Parameter:"> + Parameter: + </text> + <button label="Anfrage" label_selected="Anfrage" name="Make Request"/> + </panel> + </tab_container> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml index 68f7d6872e8..ba2269012fe 100644 --- a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml @@ -1,30 +1,28 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Hardware Settings Floater" title="HARDWARE-EINSTELLUNGEN"> - <text name="Filtering:"> - Filtern: - </text> - <check_box label="Anisotropische Filterung (langsamer, wenn aktiviert)" name="ani" /> - <text name="Antialiasing:"> - Antialiasing: - </text> - <combo_box label="Antialiasing" name="fsaa"> - <combo_box.item name="FSAADisabled" label="Deaktiviert" /> - <combo_box.item name="2x" label="2x" /> - <combo_box.item name="4x" label="4x" /> - <combo_box.item name="8x" label="8x" /> - <combo_box.item name="16x" label="16x" /> - </combo_box> - <spinner label="Gamma:" name="gamma" /> - <text name="(brightness, lower is brighter)"> - (Helligkeit, niedriger ist heller, 0=Standard) - </text> - <text name="Enable VBO:"> - VBO aktivieren: - </text> - <check_box label="OpenGL Vertex-Buffer-Objekte aktivieren" name="vbo" - tool_tip="Wenn Sie über moderne Grafikhardware verfügen, können Sie durch Aktivieren dieser Option die Geschwindigkeit verbessern. Bei alter Hardware sind die VBO oft schlecht implementiert, was zu Abstürzen führen kann, wenn diese Option aktiviert ist." /> - <slider label="Texturspeicher (MB):" name="GrapicsCardTextureMemory" - tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen." /> - <spinner label="Nebeldistanzverhältnis:" name="fog" /> - <button label="OK" label_selected="OK" name="OK" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Hardware Settings Floater" title="HARDWARE-EINSTELLUNGEN"> + <text name="Filtering:"> + Filtern: + </text> + <check_box label="Anisotropische Filterung (langsamer, wenn aktiviert)" name="ani"/> + <text name="Antialiasing:"> + Antialiasing: + </text> + <combo_box label="Antialiasing" name="fsaa"> + <combo_box.item label="Deaktiviert" name="FSAADisabled"/> + <combo_box.item label="2x" name="2x"/> + <combo_box.item label="4x" name="4x"/> + <combo_box.item label="8x" name="8x"/> + <combo_box.item label="16x" name="16x"/> + </combo_box> + <spinner label="Gamma:" name="gamma"/> + <text name="(brightness, lower is brighter)"> + (0 = Standard-Helligkeit, weniger = heller) + </text> + <text name="Enable VBO:"> + VBO aktivieren: + </text> + <check_box label="OpenGL Vertex-Buffer-Objekte aktivieren" name="vbo" tool_tip="Wenn Sie über moderne Grafikhardware verfügen, können Sie durch Aktivieren dieser Option die Geschwindigkeit verbessern. Bei alter Hardware sind die VBO oft schlecht implementiert, was zu Abstürzen führen kann, wenn diese Option aktiviert ist."/> + <slider label="Texturspeicher (MB):" name="GrapicsCardTextureMemory" tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen."/> + <spinner label="Nebeldistanzverhältnis:" name="fog"/> + <button label="OK" label_selected="OK" name="OK"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_image_preview.xml b/indra/newview/skins/default/xui/de/floater_image_preview.xml index 724da834954..80c71d41f77 100644 --- a/indra/newview/skins/default/xui/de/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_image_preview.xml @@ -1,32 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Image Preview" title=""> - <text name="name_label"> - Name: - </text> - <text name="description_label"> - Beschreibung: - </text> - <text name="preview_label"> - Bildvorschau als: - </text> - <combo_box label="Kleidungstyp" name="clothing_type_combo"> - <combo_box.item name="Image" label="Bild" /> - <combo_box.item name="Hair" label="Haar" /> - <combo_box.item name="FemaleHead" label="Kopf (Frau)" /> - <combo_box.item name="FemaleUpperBody" label="Oberkörper (Frau)" /> - <combo_box.item name="FemaleLowerBody" label="Unterkörper (Frau)" /> - <combo_box.item name="MaleHead" label="Kopf (Mann)" /> - <combo_box.item name="MaleUpperBody" label="Oberkörper (Mann)" /> - <combo_box.item name="MaleLowerBody" label="Unterkörper (Mann)" /> - <combo_box.item name="Skirt" label="Rock" /> - <combo_box.item name="SculptedPrim" label="Geformtes Primitiv" /> - </combo_box> - <text name="bad_image_text"> - Bild kann nicht gelesen werden. - -Speichern Sie das Bild als 24 Bit Targa (.tga). - </text> - <check_box label="Verlustfreie Komprimierung verwenden" name="lossless_check" /> - <button label="Abbrechen" name="cancel_btn" /> - <button label="Hochladen ([AMOUNT] L$)" name="ok_btn" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Image Preview" title=""> + <text name="name_label"> + Name: + </text> + <text name="description_label"> + Beschreibung: + </text> + <text name="preview_label"> + Bildvorschau als: + </text> + <combo_box label="Kleidungstyp" name="clothing_type_combo"> + <combo_box.item label="Bild" name="Image"/> + <combo_box.item label="Haare" name="Hair"/> + <combo_box.item label="Kopf (Frau)" name="FemaleHead"/> + <combo_box.item label="Oberkörper (Frau)" name="FemaleUpperBody"/> + <combo_box.item label="Unterkörper (Frau)" name="FemaleLowerBody"/> + <combo_box.item label="Kopf (Mann)" name="MaleHead"/> + <combo_box.item label="Oberkörper (Mann)" name="MaleUpperBody"/> + <combo_box.item label="Unterkörper (Mann)" name="MaleLowerBody"/> + <combo_box.item label="Rock" name="Skirt"/> + <combo_box.item label="Geformtes Primitiv" name="SculptedPrim"/> + </combo_box> + <text name="bad_image_text"> + Bild kann nicht gelesen werden. + +Speichern Sie das Bild als 24 Bit Targa (.tga). + </text> + <check_box label="Verlustfreie Komprimierung verwenden" name="lossless_check"/> + <button label="Abbrechen" name="cancel_btn"/> + <button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml index ef85efdae0d..b5e8ed0b6fe 100644 --- a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml @@ -1,81 +1,67 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="item properties" title="INVENTAROBJEKT-EIGENSCHAFTEN"> - <text name="LabelItemNameTitle"> - Name: - </text> - <text name="LabelItemDescTitle"> - Beschreibung: - </text> - <text name="LabelCreatorTitle"> - Ersteller: - </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> - <button label="Profil..." label_selected="" name="BtnCreator" /> - <text name="LabelOwnerTitle"> - Eigentümer: - </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> - <button label="Profil..." label_selected="" name="BtnOwner" /> - <text name="LabelAcquiredTitle"> - Erworben: - </text> - <text name="LabelAcquiredDate"> - Mittwoch, 24. Mai 2006, 12:50:46 - </text> - <text name="OwnerLabel"> - Sie können: - </text> - <check_box label="Bearbeiten" name="CheckOwnerModify" /> - <check_box label="Kopieren" name="CheckOwnerCopy" left_delta="85" /> - <check_box label="Verkaufen/Weggeben" name="CheckOwnerTransfer" /> - <text name="BaseMaskDebug"> - B: - </text> - <text name="OwnerMaskDebug"> - O: - </text> - <text name="GroupMaskDebug"> - G: - </text> - <text name="EveryoneMaskDebug"> - E: - </text> - <text name="NextMaskDebug"> - N: - </text> - <check_box label="Mit Gruppe teilen" name="CheckShareWithGroup" /> - <check_box label="Kopieren allen erlauben" name="CheckEveryoneCopy" /> - <text name="NextOwnerLabel" width="150"> - Nächster Eigentümer kann: - </text> - <check_box label="Bearbeiten" name="CheckNextOwnerModify" /> - <check_box label="Kopieren" name="CheckNextOwnerCopy" left_delta="85" /> - <check_box label="Verkaufen/Weggeben" name="CheckNextOwnerTransfer" /> - <text name="SaleLabel"> - Objekt markieren: - </text> - <check_box label="Zum Verkauf" name="CheckPurchase" /> - <radio_group name="RadioSaleType" left_delta="85" width="245" > - <radio_item name="radio" label="Original" /> - <radio_item name="radio2" label="Kopieren" /> - </radio_group> - <text name="TextPrice"> - Preis: L$ - </text> - <text name="unknown"> - (unbekannt) - </text> - <text name="public"> - (öffentlich) - </text> - <text name="you_can"> - Sie können: - </text> - <text name="owner_can"> - Eigentümer kann: - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="item properties" title="INVENTAROBJEKT-EIGENSCHAFTEN"> + <floater.string name="unknown"> + (unbekannt) + </floater.string> + <floater.string name="public"> + (öffentlich) + </floater.string> + <floater.string name="you_can"> + Sie können: + </floater.string> + <floater.string name="owner_can"> + Eigentümer kann: + </floater.string> + <text name="LabelItemNameTitle"> + Name: + </text> + <text name="LabelItemDescTitle"> + Beschreibung: + </text> + <text name="LabelCreatorTitle"> + Ersteller: + </text> + <text name="LabelCreatorName"> + Nicole Linden + </text> + <button label="Profil..." label_selected="" name="BtnCreator"/> + <text name="LabelOwnerTitle"> + Eigentümer: + </text> + <text name="LabelOwnerName"> + Thrax Linden + </text> + <button label="Profil..." label_selected="" name="BtnOwner"/> + <text name="LabelAcquiredTitle"> + Erworben: + </text> + <text name="LabelAcquiredDate"> + Mittwoch, 24. Mai 2006, 12:50:46 + </text> + <text name="OwnerLabel"> + Sie: + </text> + <check_box label="Bearbeiten" name="CheckOwnerModify"/> + <check_box label="Kopieren" left_delta="85" name="CheckOwnerCopy"/> + <check_box label="Wiederverkaufen" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + Jeder: + </text> + <check_box label="Kopieren" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Gruppe: + </text> + <check_box label="Teilen" name="CheckShareWithGroup"/> + <text name="NextOwnerLabel" width="150"> + Nächster Eigentümer: + </text> + <check_box label="Bearbeiten" name="CheckNextOwnerModify"/> + <check_box label="Kopieren" left_delta="85" name="CheckNextOwnerCopy"/> + <check_box label="Wiederverkaufen" name="CheckNextOwnerTransfer"/> + <check_box label="Zum Verkauf" name="CheckPurchase"/> + <combo_box name="combobox sale copy"> + <combo_box.item label="Kopieren" name="Copy"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Preis: L$" name="Edit Cost"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_land_holdings.xml b/indra/newview/skins/default/xui/de/floater_land_holdings.xml index 39752111177..f258dc2f5d6 100644 --- a/indra/newview/skins/default/xui/de/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/de/floater_land_holdings.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="MEIN LAND"> - <scroll_list name="parcel list"> - <column label="Parzellenname" name="name"/> - <column label="Region" name="location"/> - <column label="Typ" name="type"/> - <column label="Gebiet" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="Teleportieren" label_selected="Teleportieren" name="Teleport" tool_tip="Zum Mittelpunkt dieses Landes teleportieren."/> - <button label="Auf Karte" label_selected="Auf Karte" name="Show on Map" tool_tip="Dieses Land auf der Weltkarte anzeigen."/> - <text name="contrib_label"> - Beiträge zu Ihren Gruppen: - </text> - <scroll_list name="grant list"> - <column label="Gruppe" name="group"/> - <column label="Gebiet" name="area"/> - </scroll_list> - <text name="allowed_label"> - Zulässiger Landbesitz bei aktuellem Zahlungsplan: - </text> - <text name="allowed_text"> - [AREA] qm - </text> - <text name="current_label"> - Aktueller Landbesitz: - </text> - <text name="current_text"> - [AREA] qm - </text> - <text name="available_label"> - Für Landkäufe verfügbar: - </text> - <text name="available_text"> - [AREA] qm - </text> - <string name="area_string"> - [AREA] qm - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="land holdings floater" title="MEIN LAND"> + <scroll_list name="parcel list"> + <column label="Parzelle" name="name"/> + <column label="Region" name="location"/> + <column label="Typ" name="type"/> + <column label="Gebiet" name="area"/> + <column label="" name="hidden"/> + </scroll_list> + <button label="Teleportieren" label_selected="Teleportieren" name="Teleport" tool_tip="Zum Mittelpunkt dieses Landes teleportieren."/> + <button label="Karte" label_selected="Karte" name="Show on Map" tool_tip="Dieses Land auf der Weltkarte anzeigen."/> + <text name="contrib_label"> + Beiträge zu Ihren Gruppen: + </text> + <scroll_list name="grant list"> + <column label="Gruppe" name="group"/> + <column label="Gebiet" name="area"/> + </scroll_list> + <text name="allowed_label"> + Zulässiger Landbesitz bei aktuellem Zahlungsplan: + </text> + <text name="allowed_text"> + [AREA] qm + </text> + <text name="current_label"> + Aktueller Landbesitz: + </text> + <text name="current_text"> + [AREA] qm + </text> + <text name="available_label"> + Für Landkäufe verfügbar: + </text> + <text name="available_text"> + [AREA] qm + </text> + <string name="area_string"> + [AREA] qm + </string> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml index 5afeb033951..947a435f8ad 100644 --- a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml @@ -1,12 +1,15 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="SKRIPT: NEUES SKRIPT"> - <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Reset" /> - <check_box label="Läuft" name="running" /> - <check_box label="Mono" name="mono" /> - <text name="not_allowed"> - Sie können dieses Skript nicht anzeigen. - </text> - <string name="script_running"> - Läuft - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script ed float" title="SKRIPT: NEUES SKRIPT"> + <floater.string name="not_allowed"> + Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung "kein kopieren" festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung. + </floater.string> + <floater.string name="script_running"> + Läuft + </floater.string> + <floater.string name="Title"> + Skript: [NAME] + </floater.string> + <button label="Zurücksetzen" label_selected="Zurücksetzen" name="Reset"/> + <check_box initial_value="true" label="Läuft" name="running"/> + <check_box initial_value="true" label="Mono" name="mono"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_map.xml b/indra/newview/skins/default/xui/de/floater_map.xml index 97b3d76a463..73737846734 100644 --- a/indra/newview/skins/default/xui/de/floater_map.xml +++ b/indra/newview/skins/default/xui/de/floater_map.xml @@ -1,51 +1,54 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> - <floater.string name="mini_map_north"> - N - </floater.string> - <floater.string name="mini_map_east"> - O - </floater.string> - <floater.string name="mini_map_west"> - W - </floater.string> - <floater.string name="mini_map_south"> - S - </floater.string> - <floater.string name="mini_map_southeast"> - SO - </floater.string> - <floater.string name="mini_map_northeast"> - NO - </floater.string> - <floater.string name="mini_map_southwest"> - SW - </floater.string> - <floater.string name="mini_map_northwest"> - NW - </floater.string> - <text label="N" name="floater_map_north" text="N"> - N - </text> - <text label="O" name="floater_map_east" text="O"> - O - </text> - <text label="W" name="floater_map_west" text="W"> - W - </text> - <text label="S" name="floater_map_south" text="S"> - S - </text> - <text label="SO" name="floater_map_southeast" text="SO"> - SO - </text> - <text label="NO" name="floater_map_northeast" text="NO"> - NO - </text> - <text label="SW" name="floater_map_southwest" text="SW"> - SW - </text> - <text label="NW" name="floater_map_northwest" text="NW"> - NW - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Map"> + <floater.string name="mini_map_north"> + N + </floater.string> + <floater.string name="mini_map_east"> + O + </floater.string> + <floater.string name="mini_map_west"> + W + </floater.string> + <floater.string name="mini_map_south"> + S + </floater.string> + <floater.string name="mini_map_southeast"> + SO + </floater.string> + <floater.string name="mini_map_northeast"> + NO + </floater.string> + <floater.string name="mini_map_southwest"> + SW + </floater.string> + <floater.string name="mini_map_northwest"> + NW + </floater.string> + <floater.string name="ToolTipMsg"> + [AGENT][REGION](Karte mit Doppelklick öffnen) + </floater.string> + <text label="N" name="floater_map_north" text="N"> + N + </text> + <text label="O" name="floater_map_east" text="O"> + O + </text> + <text label="W" name="floater_map_west" text="W"> + W + </text> + <text label="S" name="floater_map_south" text="S"> + S + </text> + <text label="SO" name="floater_map_southeast" text="SO"> + SO + </text> + <text label="NO" name="floater_map_northeast" text="NO"> + NO + </text> + <text label="SW" name="floater_map_southwest" text="SW"> + SW + </text> + <text label="NW" name="floater_map_northwest" text="NW"> + NW + </text> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_media_browser.xml b/indra/newview/skins/default/xui/de/floater_media_browser.xml index a16c2408fec..21bf7aa5630 100644 --- a/indra/newview/skins/default/xui/de/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/de/floater_media_browser.xml @@ -1,19 +1,30 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_about" title="MEDIENBROWSER"> - <layout_stack name="stack1"> - <layout_panel name="nav_controls"> - <button label="Zurück" name="back" /> - <button label="Weiter" name="forward" /> - <button label="Neu laden" name="reload" /> - <button label="Los" name="go" /> - </layout_panel> - <layout_panel name="parcel_owner_controls"> - <button label="Aktuelle URL an Parzelle senden" name="assign" /> - </layout_panel> - <layout_panel name="external_controls"> - <button label="In meinem Browser öffnen" name="open_browser" /> - <check_box label="Immer in meinem Browser öffnen" name="open_always" /> - <button label="Schließen" name="close" /> - </layout_panel> - </layout_stack> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="MEDIENBROWSER"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Zurück" name="back"/> + <button label="Weiter" name="forward"/> + <button label="Neu laden" name="reload"/> + <button label="Los" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="zurückspulen" name="rewind"/> + <button label="anhalten" name="stop"/> + <button label="vorwärts" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Aktuelle URL an Parzelle senden" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="In meinem Browser öffnen" name="open_browser"/> + <check_box label="Immer in meinem Browser öffnen" name="open_always"/> + <button label="Schließen" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml index 44249a6075e..72210aa750b 100644 --- a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml @@ -1,18 +1,18 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="MemLeak" title="SPEICHERVERLUST-SIMULATION"> - <spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed" /> - <spinner label="Max. Speicherverlust (MB):" name="max_leak" /> - <text name="total_leaked_label"> - Aktueller Speicherverlust:[SIZE] KB - </text> - <text name="note_label_1"> - [NOTE1] - </text> - <text name="note_label_2"> - [NOTE2] - </text> - <button label="Start" name="start_btn" /> - <button label="Stopp" name="stop_btn" /> - <button label="Freigeben" name="release_btn" /> - <button label="Schließen" name="close_btn" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="MemLeak" title="Speicherverlust simulieren"> + <spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed"/> + <spinner label="Max. Speicherverlust (MB):" name="max_leak"/> + <text name="total_leaked_label"> + Aktueller Speicherverlust:[SIZE] KB + </text> + <text name="note_label_1"> + [NOTE1] + </text> + <text name="note_label_2"> + [NOTE2] + </text> + <button label="Start" name="start_btn"/> + <button label="Stopp" name="stop_btn"/> + <button label="Freigeben" name="release_btn"/> + <button label="Schließen" name="close_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_moveview.xml b/indra/newview/skins/default/xui/de/floater_moveview.xml index 4ea2048e623..af133b6bd79 100644 --- a/indra/newview/skins/default/xui/de/floater_moveview.xml +++ b/indra/newview/skins/default/xui/de/floater_moveview.xml @@ -1,16 +1,35 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="move_floater"> -<panel name="panel_actions"> - <button label="" label_selected="" name="turn left btn" tool_tip="Nach links" /> - <button label="" label_selected="" name="turn right btn" tool_tip="Nach rechts" /> - <button label="" label_selected="" name="move up btn" - tool_tip="Springen oder Steigflug" /> - <button label="" label_selected="" name="move down btn" tool_tip="Ducken oder Sinkflug" /> - <button label="Fliegen" label_selected="Fliegen" name="fly btn" - tool_tip="Fliegen/Landen" /> - <joystick_slide name="slide left btn" tool_tip="Nach links" /> - <joystick_slide name="slide right btn" tool_tip="Nach rechts" /> - <joystick_turn name="forward btn" tool_tip="Nach vorn" /> - <joystick_turn name="backward btn" tool_tip="Nach hinten" /> -</panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="move_floater"> + <string name="walk_forward_tooltip"> + Vorwärts gehen (Nach-oben-Pfeil oder W drücken) + </string> + <string name="walk_back_tooltip"> + Rückwärts gehen (Nach-Unten-Pfeil oder S drücken) + </string> + <string name="run_forward_tooltip"> + Vorwärts rennen (Nach-oben-Pfeil oder W drücken) + </string> + <string name="run_back_tooltip"> + Rückwärts rennen (Nach-Unten-Pfeil oder S drücken) + </string> + <string name="fly_forward_tooltip"> + Vorwärts fliegen (Nach-oben-Pfeil oder W drücken) + </string> + <string name="fly_back_tooltip"> + Rückwärts fliegen (Nach-Unten-Pfeil oder S drücken) + </string> + <panel name="panel_actions"> + <button label="" label_selected="" name="turn left btn" tool_tip="Nach links (Links-Pfeil oder A drücken)"/> + <button label="" label_selected="" name="turn right btn" tool_tip="Nach rechts (Rechts-Pfeil oder D drücken)"/> + <button label="" label_selected="" name="move up btn" tool_tip="Nach oben fliegen, „E" drücken"/> + <button label="" label_selected="" name="move down btn" tool_tip="Nach unten fliegen, „C" drücken"/> + <joystick_turn name="forward btn" tool_tip="Vorwärts gehen (Nach-oben-Pfeil oder W drücken)"/> + <joystick_turn name="backward btn" tool_tip="Rückwärts gehen (Nach-Unten-Pfeil oder S drücken)"/> + </panel> + <panel name="panel_modes"> + <button label="" name="mode_walk_btn" tool_tip="Gehen"/> + <button label="" name="mode_run_btn" tool_tip="Rennen"/> + <button label="" name="mode_fly_btn" tool_tip="Fliegen"/> + <button label="Landen" name="stop_fly_btn" tool_tip="Landen"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_pay.xml b/indra/newview/skins/default/xui/de/floater_pay.xml index a2e40fa0782..c224d85ac19 100644 --- a/indra/newview/skins/default/xui/de/floater_pay.xml +++ b/indra/newview/skins/default/xui/de/floater_pay.xml @@ -1,21 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Give Money" title=""> - <button label="1 L$" label_selected="1 L$" name="fastpay 1" /> - <button label="5 L$" label_selected="5 L$" name="fastpay 5" /> - <button label="10 L$" label_selected="10 L$" name="fastpay 10" /> - <button label="20 L$" label_selected="20 L$" name="fastpay 20" /> - <button label="Zahlen" label_selected="Zahlen" name="pay btn" /> - <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn" /> - <text name="payee_label" width="130"> - Einwohner bezahlen: - </text> - <text name="payee_name" left="130"> - [FIRST] [LAST] - </text> - <text name="fastpay text"> - Schnellzahlung: - </text> - <text name="amount text"> - Betrag: - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Give Money" title=""> + <text name="payee_label" width="130"> + Zahlen: + </text> + <icon name="icon_person" tool_tip="Person"/> + <text left="130" name="payee_name"> + [FIRST] [LAST] + </text> + <button label="1 L$" label_selected="1 L$" name="fastpay 1"/> + <button label="5 L$" label_selected="5 L$" name="fastpay 5"/> + <button label="10 L$" label_selected="10 L$" name="fastpay 10"/> + <button label="20 L$" label_selected="20 L$" name="fastpay 20"/> + <text name="amount text"> + Oder Betrag auswählen: + </text> + <button label="Zahlen" label_selected="Zahlen" name="pay btn"/> + <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_pay_object.xml b/indra/newview/skins/default/xui/de/floater_pay_object.xml index 49bf0c8957f..32a026f7e89 100644 --- a/indra/newview/skins/default/xui/de/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/de/floater_pay_object.xml @@ -1,30 +1,29 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Give Money" title=""> - <text name="payee_group" width="105"> - Gruppe bezahlen: - </text> - <text name="payee_resident" width="118"> - Einwohner bezahlen: - </text> - <text name="payee_name" left="128" width="168"> - [FIRST] [LAST] - </text> - <text name="object_name_label" halign="left"> - Ãœber Objekt: - </text> - <text name="object_name_text" left="105"> - ... - </text> - <text name="fastpay text" width="95" halign="left"> - Schnellzahlung: - </text> - <text name="amount text"> - Betrag: - </text> - <button label="1 L$" label_selected="1 L$" name="fastpay 1" left="105" /> - <button label="5 L$" label_selected="5 L$" name="fastpay 5" left="190" /> - <button label="10 L$" label_selected="10 L$" name="fastpay 10" left="105" /> - <button label="20 L$" label_selected="20 L$" name="fastpay 20" left="190" /> - <button label="Zahlen" label_selected="Zahlen" name="pay btn" /> - <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn" width="76" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Give Money" title=""> + <string name="payee_group" width="105"> + Gruppe bezahlen: + </string> + <string name="payee_resident" width="118"> + Einwohner bezahlen: + </string> + <icon name="icon_person" tool_tip="Person"/> + <text left="128" name="payee_name" width="168"> + [FIRST] [LAST] + </text> + <text halign="left" name="object_name_label"> + Ãœber Objekt: + </text> + <icon name="icon_object" tool_tip="Objekte"/> + <text left="105" name="object_name_text"> + ... + </text> + <button label="1 L$" label_selected="1 L$" left="105" name="fastpay 1"/> + <button label="5 L$" label_selected="5 L$" left="190" name="fastpay 5"/> + <button label="10 L$" label_selected="10 L$" left="105" name="fastpay 10"/> + <button label="20 L$" label_selected="20 L$" left="190" name="fastpay 20"/> + <text name="amount text"> + Oder Betrag auswählen: + </text> + <button label="Zahlen" label_selected="Zahlen" name="pay btn"/> + <button label="Abbrechen" label_selected="Abbrechen" name="cancel btn" width="76"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_animation.xml b/indra/newview/skins/default/xui/de/floater_preview_animation.xml index 630127f310e..c167427da91 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_animation.xml @@ -1,11 +1,12 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview_anim"> - <text name="desc txt"> - Beschreibung: - </text> -<line_editor left="98" name="desc" width="189" /> - <button label="In Welt abspielen" label_selected="Stopp" name="Anim play btn" - tool_tip="Gibt diese Animation so wieder, dass andere sie sehen können." width="116" /> - <button label="Lokal wiedergeben" label_selected="Stopp" name="Anim audition btn" - tool_tip="Gibt diese Animation so wieder, dass nur Sie sie sehen." left="171" width="116" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_anim"> + <floater.string name="Title"> + Animation: [NAME] + </floater.string> + <text name="desc txt"> + Beschreibung: + </text> + <line_editor left="98" name="desc" width="189"/> + <button label="In Welt abspielen" label_selected="Stopp" name="Anim play btn" tool_tip="Gibt diese Animation so wieder, dass andere sie sehen können." width="116"/> + <button label="Lokal wiedergeben" label_selected="Stopp" left="171" name="Anim audition btn" tool_tip="Gibt diese Animation so wieder, dass nur Sie sie sehen." width="116"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_classified.xml b/indra/newview/skins/default/xui/de/floater_preview_classified.xml index be702145c37..e946f08b141 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_classified.xml @@ -1,2 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="classified_preview" title="VERTRAULICHE INFORMATIONEN" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="classified_preview" title="VERTRAULICHE INFORMATIONEN"> + <floater.string name="Title"> + Anzeige: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_event.xml b/indra/newview/skins/default/xui/de/floater_preview_event.xml index 21e8c67787d..fffcf7c1cf5 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_event.xml @@ -1,2 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="event_preview" title="EVENT-INFORMATIONEN" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="event_preview" title="EVENT-INFORMATIONEN"> + <floater.string name="Title"> + Veranstaltung: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml new file mode 100644 index 00000000000..9fbe8d869e6 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="Gesten-Tastaturbefehl"/> diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml new file mode 100644 index 00000000000..9fbe8d869e6 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="Gesten-Tastaturbefehl"/> diff --git a/indra/newview/skins/default/xui/de/floater_preview_notecard.xml b/indra/newview/skins/default/xui/de/floater_preview_notecard.xml index 2c3258440f2..1887433b617 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_notecard.xml @@ -1,16 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview notecard" title="HINWEIS:"> - <button label="Speichern" label_selected="Speichern" name="Save" /> - <text name="desc txt"> - Beschreibung: - </text> - <text_editor name="Notecard Editor"> - Wird geladen... - </text_editor> - <text name="no_object"> - Es wurde kein Objekt gefunden, das diese Notiz enthält. - </text> - <text name="not_allowed"> - Sie können diese Notiz nicht anzeigen. - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview notecard" title="HINWEIS:"> + <floater.string name="no_object"> + Es wurde kein Objekt gefunden, das diese Notiz enthält. + </floater.string> + <floater.string name="not_allowed"> + Ihnen fehlt die Berechtigung zur Anzeige dieser Notizkarte. + </floater.string> + <floater.string name="Title"> + Notizkarte: [NAME] + </floater.string> + <floater.string label="Speichern" label_selected="Speichern" name="Save"> + Speichern + </floater.string> + <text name="desc txt"> + Beschreibung: + </text> + <text_editor name="Notecard Editor"> + Wird geladen... + </text_editor> + <button label="Speichern" label_selected="Speichern" name="Save"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_sound.xml b/indra/newview/skins/default/xui/de/floater_preview_sound.xml index 3f2e39c0d6a..397b417d44e 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_sound.xml @@ -1,12 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview_sound"> - <text name="desc txt"> - Beschreibung: - </text> - <button label="In Welt abspielen" label_selected="In Welt abspielen" - name="Sound play btn" - tool_tip="Gibt diesen Sound so wieder, dass andere ihn hören können." /> - <button label="Lokal wiedergeben" label_selected="Lokal wiedergeben" - name="Sound audition btn" - tool_tip="Gibt diesen Sound so wieder, dass nur Sie ihn hören." /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_sound"> + <floater.string name="Title"> + Sound: [NAME] + </floater.string> + <text name="desc txt"> + Beschreibung: + </text> + <button label="In Welt abspielen" label_selected="In Welt abspielen" name="Sound play btn" tool_tip="Gibt diesen Sound so wieder, dass andere ihn hören können."/> + <button label="Lokal wiedergeben" label_selected="Lokal wiedergeben" name="Sound audition btn" tool_tip="Gibt diesen Sound so wieder, dass nur Sie ihn hören."/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_texture.xml b/indra/newview/skins/default/xui/de/floater_preview_texture.xml index 0c53eb7ca3d..c33e52dac8d 100644 --- a/indra/newview/skins/default/xui/de/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/de/floater_preview_texture.xml @@ -1,9 +1,17 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview_texture"> - <text name="desc txt"> - Beschreibung: - </text> - <text name="dimensions"> - Maße: [WIDTH] x [HEIGHT] - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_texture"> + <floater.string name="Title"> + Textur: [NAME] + </floater.string> + <floater.string name="Copy"> + In Inventar kopieren + </floater.string> + <text name="desc txt"> + Beschreibung: + </text> + <button label="Speichern" name="Keep"/> + <button label="Löschen" name="Discard"/> + <text name="dimensions"> + [WIDTH]px x [HEIGHT]px + </text> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_report_abuse.xml b/indra/newview/skins/default/xui/de/floater_report_abuse.xml index a5dd9fa4b19..1e287268613 100644 --- a/indra/newview/skins/default/xui/de/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/de/floater_report_abuse.xml @@ -1,106 +1,104 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="MISSBRAUCH MELDEN"> - <texture_picker label="" name="screenshot"/> - <check_box bottom_delta="-20" label="Screenshot einschließen" name="screen_check"/> - <text name="reporter_title"> - Melder: - </text> - <text name="reporter_field"> - Loremipsum Dolorsitamut - </text> - <text name="sim_title"> - Region: - </text> - <text name="sim_field"> - Name der Region - </text> - <text name="pos_title"> - Position: - </text> - <text name="pos_field"> - {128.1, 128.1, 15.4} - </text> - <text bottom_delta="-38" height="32" name="select_object_label"> - Klicken Sie auf die Schaltfläche, -dann auf das Objekt: - </text> - <button label="" label_selected="" name="pick_btn" tool_tip="Objektauswahl – Wählen Sie ein Objekt als Thema dieses Berichts aus"/> - <text name="object_name_label"> - Name: - </text> - <text name="object_name"> - Consetetur Sadipscing - </text> - <text name="owner_name_label"> - Eigentümer: - </text> - <text name="owner_name"> - Hendrerit Vulputate - </text> - <combo_box name="category_combo" tool_tip="Kategorie -- wählen Sie die Kategorie aus, die am besten auf diesen Bericht zutrifft"> - <combo_box.item name="Select_category" label="Kategorie auswählen"/> - <combo_box.item name="Age__Age_play" label="Alter> Age-Play"/> - <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Alter> Erwachsener Einwohner in Teen Second Life"/> - <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Alter > Minderjähriger Einwohner außerhalb Teen Second Life"/> - <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Angriff> Kampf-Sandbox / unsichere Region"/> - <combo_box.item name="Assault__Safe_area" label="Angriff> Sichere Region"/> - <combo_box.item name="Assault__Weapons_testing_sandbox" label="Angriff > Sandbox für Waffentest"/> - <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Handel > Produkt nicht geliefert oder Dienstleistung nicht erbracht"/> - <combo_box.item name="Disclosure__Real_world_information" label="Offenlegung > Informationen aus realer Welt"/> - <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Offenlegung > Abhören eines Chats aus der Ferne"/> - <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Offenlegung > Second Life-Informationen/Chat/IMs"/> - <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Ruhestörung > Unfaire Nutzung von Regionsressourcen"/> - <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Ruhestörung > Exzessive Nutzung geskripteter Objekte"/> - <combo_box.item name="Disturbing_the_peace__Object_littering" label="Ruhestörung > Wildes Erzeugen von Objekten"/> - <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Ruhestörung > Ständige Spam-Wiederholung"/> - <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Ruhestörung > Unerwünschte Spam-Werbung"/> - <combo_box.item name="Fraud__L$" label="Betrug > L$"/> - <combo_box.item name="Fraud__Land" label="Betrug> Land"/> - <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Betrug > Schneeballsystem oder Kettenbrief"/> - <combo_box.item name="Fraud__US$" label="Betrug > US$"/> - <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Belästigung > Werbefarmen / visueller Spam"/> - <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Belästigung > Diffamieren von Einzelpersonen/Gruppen"/> - <combo_box.item name="Harassment__Impeding_movement" label="Belästigung > Bewegungseinschränkung"/> - <combo_box.item name="Harassment__Sexual_harassment" label="Belästigung > Sexuelle Belästigung"/> - <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Belästigung > Anstiften Dritter zur Missachtung der Nutzungsbedingungen"/> - <combo_box.item name="Harassment__Verbal_abuse" label="Belästigung > Beschimpfung"/> - <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Unanständigkeit > Anstößige Inhalte oder Handlungen in der Öffentlichkeit"/> - <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Unanständigkeit > Anstößiger Avatarname"/> - <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Unanständigkeit > Unangemessener Inhalt oder unangemessenes Verhalten in PG-Region"/> - <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Unanständigkeit > Unangemessener Inhalt oder unangemessenes Verhalten in Mature-Region"/> - <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Urheberrechtsverletzung > Entfernen von Inhalten"/> - <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Urheberrechtsverletzung > CopyBot oder Berechtigungs-Exploit"/> - <combo_box.item name="Intolerance" label="Intoleranz"/> - <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Land > Missbrauch der Sandbox-Ressourcen"/> - <combo_box.item name="Land__Encroachment__Objects_textures" label="Land > Unbefugte Nutzung > Objekte/Texturen"/> - <combo_box.item name="Land__Encroachment__Particles" label="Land > Unbefugte Nutzung > Partikel"/> - <combo_box.item name="Land__Encroachment__Trees_plants" label="Land > Unbefugte Nutzung > Bäume/Pflanzen"/> - <combo_box.item name="Wagering_gambling" label="Wetten/Glücksspiel"/> - <combo_box.item name="Other" label="Sonstige"/> - </combo_box> - <text name="abuser_name_title"> - Name des Beschuldigten: - </text> - <button label="Einwohner auswählen" label_selected="" name="select_abuser" tool_tip="Den Namen des Beschuldigten aus einer Liste wählen"/> - <check_box label="Name des Täters ist nicht bekannt" name="omit_abuser_name" tool_tip="Wählen Sie diese Option, wenn Ihnen der Name des Täters unbekannt ist"/> - <text name="abuser_name_title2"> - Ort des Missbrauchs: - </text> - <text name="sum_title"> - Zusammenfassung: - </text> - <text name="dscr_title"> - Details: - </text> - <text name="bug_aviso"> - Machen Sie genaue Angaben zu Datum, Ort und Art des -Missbrauchs, relevantem Chat/IM und wählen Sie das -Objekt, wenn möglich. - </text> - <text_editor bottom_delta="-136" height="130" name="details_edit"/> - <text bottom_delta="-20" name="incomplete_title"> - Hinweis: Unvollständige Meldungen werden nicht bearbeitet. - </text> - <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/> - <button label="Missbrauch melden" label_selected="Missbrauch melden" name="send_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_report_abuse" title="MISSBRAUCH MELDEN"> + <floater.string name="Screenshot"> + Foto + </floater.string> + <check_box bottom_delta="-20" label="Dieses Foto verwenden" name="screen_check"/> + <text name="reporter_title"> + Melder: + </text> + <text name="reporter_field"> + Loremipsum Dolorsitamut + </text> + <text name="sim_title"> + Region: + </text> + <text name="sim_field"> + Name der Region + </text> + <text name="pos_title"> + Position: + </text> + <text name="pos_field"> + {128.1, 128.1, 15.4} + </text> + <text bottom_delta="-38" height="32" name="select_object_label"> + Klicken Sie auf die Schaltfläche, dann auf das entsprechende Objekt: + </text> + <button label="" label_selected="" name="pick_btn" tool_tip="Objektauswahl – Wählen Sie ein Objekt als Thema dieses Berichts aus"/> + <text name="object_name_label"> + Objekt: + </text> + <text name="object_name"> + Consetetur Sadipscing + </text> + <text name="owner_name_label"> + Eigentümer: + </text> + <text name="owner_name"> + Hendrerit Vulputate + </text> + <combo_box name="category_combo" tool_tip="Kategorie -- wählen Sie die Kategorie aus, die am besten auf diesen Bericht zutrifft"> + <combo_box.item label="Kategorie auswählen" name="Select_category"/> + <combo_box.item label="Alter> Age-Play" name="Age__Age_play"/> + <combo_box.item label="Alter> Erwachsener Einwohner in Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/> + <combo_box.item label="Alter > Minderjähriger Einwohner außerhalb Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> + <combo_box.item label="Angriff> Kampf-Sandbox / unsichere Region" name="Assault__Combat_sandbox___unsafe_area"/> + <combo_box.item label="Angriff> Sichere Region" name="Assault__Safe_area"/> + <combo_box.item label="Angriff > Sandbox für Waffentest" name="Assault__Weapons_testing_sandbox"/> + <combo_box.item label="Handel > Produkt nicht geliefert oder Dienstleistung nicht erbracht" name="Commerce__Failure_to_deliver_product_or_service"/> + <combo_box.item label="Offenlegung > Informationen aus realer Welt" name="Disclosure__Real_world_information"/> + <combo_box.item label="Offenlegung > Abhören eines Chats aus der Ferne" name="Disclosure__Remotely_monitoring chat"/> + <combo_box.item label="Offenlegung > Second Life-Informationen/Chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/> + <combo_box.item label="Ruhestörung > Unfaire Nutzung von Regionsressourcen" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> + <combo_box.item label="Ruhestörung > Exzessive Nutzung geskripteter Objekte" name="Disturbing_the_peace__Excessive_scripted_objects"/> + <combo_box.item label="Ruhestörung > Wildes Erzeugen von Objekten" name="Disturbing_the_peace__Object_littering"/> + <combo_box.item label="Ruhestörung > Ständige Spam-Wiederholung" name="Disturbing_the_peace__Repetitive_spam"/> + <combo_box.item label="Ruhestörung > Unerwünschte Spam-Werbung" name="Disturbing_the_peace__Unwanted_advert_spam"/> + <combo_box.item label="Betrug > L$" name="Fraud__L$"/> + <combo_box.item label="Betrug> Land" name="Fraud__Land"/> + <combo_box.item label="Betrug > Schneeballsystem oder Kettenbrief" name="Fraud__Pyramid_scheme_or_chain_letter"/> + <combo_box.item label="Betrug > US$" name="Fraud__US$"/> + <combo_box.item label="Belästigung > Werbefarmen / visueller Spam" name="Harassment__Advert_farms___visual_spam"/> + <combo_box.item label="Belästigung > Diffamieren von Einzelpersonen/Gruppen" name="Harassment__Defaming_individuals_or_groups"/> + <combo_box.item label="Belästigung > Bewegungseinschränkung" name="Harassment__Impeding_movement"/> + <combo_box.item label="Belästigung > Sexuelle Belästigung" name="Harassment__Sexual_harassment"/> + <combo_box.item label="Belästigung > Anstiften Dritter zur Missachtung der Nutzungsbedingungen" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> + <combo_box.item label="Belästigung > Beschimpfung" name="Harassment__Verbal_abuse"/> + <combo_box.item label="Unanständigkeit > Anstößige Inhalte oder Handlungen in der Öffentlichkeit" name="Indecency__Broadly_offensive_content_or_conduct"/> + <combo_box.item label="Unanständigkeit > Anstößiger Avatarname" name="Indecency__Inappropriate_avatar_name"/> + <combo_box.item label="Unanständigkeit > Unangemessener Inhalt oder unangemessenes Verhalten in PG-Region" name="Indecency__Mature_content_in_PG_region"/> + <combo_box.item label="Unanständigkeit > Unangemessener Inhalt oder unangemessenes Verhalten in Mature-Region" name="Indecency__Inappropriate_content_in_Mature_region"/> + <combo_box.item label="Urheberrechtsverletzung > Entfernen von Inhalten" name="Intellectual_property_infringement_Content_Removal"/> + <combo_box.item label="Urheberrechtsverletzung > CopyBot oder Berechtigungs-Exploit" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> + <combo_box.item label="Intoleranz" name="Intolerance"/> + <combo_box.item label="Land > Missbrauch der Sandbox-Ressourcen" name="Land__Abuse_of_sandbox_resources"/> + <combo_box.item label="Land > Unbefugte Nutzung > Objekte/Texturen" name="Land__Encroachment__Objects_textures"/> + <combo_box.item label="Land > Unbefugte Nutzung > Partikel" name="Land__Encroachment__Particles"/> + <combo_box.item label="Land > Unbefugte Nutzung > Bäume/Pflanzen" name="Land__Encroachment__Trees_plants"/> + <combo_box.item label="Wetten/Glücksspiel" name="Wagering_gambling"/> + <combo_box.item label="Sonstige" name="Other"/> + </combo_box> + <text name="abuser_name_title"> + Name des Beschuldigten: + </text> + <button label="Auswählen" label_selected="" name="select_abuser" tool_tip="Den Namen des Beschuldigten aus einer Liste wählen"/> + <text name="abuser_name_title2"> + Ort des Missbrauchs: + </text> + <text name="sum_title"> + Zusammenfassung: + </text> + <text name="dscr_title"> + Details: + </text> + <text name="bug_aviso"> + Bitte beschreiben Sie so genau wie möglich. + </text> + <text_editor bottom_delta="-136" height="130" name="details_edit"/> + <text bottom_delta="-20" name="incomplete_title"> + Hinweis: Unvollständige Meldungen werden nicht bearbeitet. + </text> + <button label="Missbrauch melden" label_selected="Missbrauch melden" name="send_btn"/> + <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml new file mode 100644 index 00000000000..fc805e879b8 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_script_debug_panel.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script" short_title="[All scripts]" title="[All scripts]"/> diff --git a/indra/newview/skins/default/xui/de/floater_script_preview.xml b/indra/newview/skins/default/xui/de/floater_script_preview.xml index be6017cff51..1d6def4602d 100644 --- a/indra/newview/skins/default/xui/de/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_script_preview.xml @@ -1,6 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview lsl text" title="SKRIPT: ROTATIONSSKRIPT"> - <text name="desc txt"> - Beschreibung: - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview lsl text" title="SKRIPT: ROTATIONSSKRIPT"> + <floater.string name="Title"> + Skript: [NAME] + </floater.string> + <text name="desc txt"> + Beschreibung: + </text> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_script_queue.xml b/indra/newview/skins/default/xui/de/floater_script_queue.xml index b2011a4dfb4..d5dc7a0fd72 100644 --- a/indra/newview/skins/default/xui/de/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/de/floater_script_queue.xml @@ -1,4 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="queue" title="RÃœCKGÄNGIG"> - <button label="Schließen" label_selected="Schließen" name="close" left="215" width="72"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="queue" title="RÃœCKGÄNGIG"> + <floater.string name="Starting"> + [START] von [COUNT] Artikeln. + </floater.string> + <floater.string name="Done"> + Fertig. + </floater.string> + <floater.string name="Resetting"> + Wird zurückgesetzt + </floater.string> + <floater.string name="Running"> + Läuft + </floater.string> + <floater.string name="NotRunning"> + Läuft nicht + </floater.string> + <button label="Schließen" label_selected="Schließen" left="215" name="close" width="72"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_sell_land.xml b/indra/newview/skins/default/xui/de/floater_sell_land.xml index 47ab51d5027..82da881a54b 100644 --- a/indra/newview/skins/default/xui/de/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/de/floater_sell_land.xml @@ -1,67 +1,67 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="sell land" title="LAND VERKAUFEN"> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <text name="info_parcel_label"> - Parzelle: - </text> - <text bottom_delta="-5" height="16" name="info_parcel"> - PARZELLENNAME - </text> - <text name="info_size_label"> - Größe: - </text> - <text bottom_delta="-21" height="32" name="info_size"> - [AREA] qm - </text> - <text height="28" name="info_action" bottom_delta="-57"> - Zum Verkauf -dieser Parzelle: - </text> - <icon bottom_delta="-80" name="step_price" /> - <text name="price_label"> - Preis festlegen: - </text> - <text name="price_text"> - Geben Sie einen angemessenen Preis für dieses Land ein. - </text> - <text name="price_ld"> - L$ - </text> - <text name="price_per_m"> - ([PER_METER] L$ pro Quadratmeter) - </text> - <icon height="64" left="0" name="step_sell_to" width="64" /> - <text bottom_delta="38" left="72" name="sell_to_label" right="-20"> - Land verkaufen an: - </text> - <text height="16" left="72" name="sell_to_text" bottom_delta="-16" right="-10"> - Wählen Sie, ob der Verkauf offen oder auf eine bestimmte Person -beschränkt ist. - </text> - <combo_box height="16" left="72" name="sell_to" bottom_delta="-32" width="140"> - <combo_box.item name="--selectone--" label="select one --" /> - <combo_box.item name="Anyone" label="Jeder" /> - <combo_box.item name="Specificuser:" label="Bestimmter Benutzer:" /> - </combo_box> - <button label="Auswählen..." name="sell_to_select_agent" /> - <text name="sell_objects_label"> - Die Objekte mit dem Land verkaufen? - </text> - <text name="sell_objects_text"> - Die transferierbaren Landeigentümer-Objekte auf der Parzelle -wechseln den Eigentümer. - </text> - <radio_group bottom_delta="-58" name="sell_objects"> - <radio_item name="no" label="Nein, Objekte behalten" /> - <radio_item name="yes" label="Ja, Objekte mit Land verkaufen" /> - </radio_group> - <button label="Objekte anzeigen" name="show_objects" width="116"/> - <text name="nag_message_label"> - ACHTUNG: Verkäufe sind endgültig. - </text> - <button label="Land zum Verkauf freigeben" width="180" name="sell_btn" /> - <button label="Abbrechen" name="cancel_btn" /> - </panel> - </scroll_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="sell land" title="LAND VERKAUFEN"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="info_parcel_label"> + Parzelle: + </text> + <text bottom_delta="-5" height="16" name="info_parcel"> + PARZELLENNAME + </text> + <text name="info_size_label"> + Größe: + </text> + <text bottom_delta="-21" height="32" name="info_size"> + [AREA] qm + </text> + <text bottom_delta="-57" height="28" name="info_action"> + Zum Verkauf +dieser Parzelle: + </text> + <icon bottom_delta="-80" name="step_price"/> + <text name="price_label"> + Preis festlegen: + </text> + <text name="price_text"> + Einen angemessenen Preis auswählen. + </text> + <text name="price_ld"> + L$ + </text> + <text name="price_per_m"> + ([PER_METER] L$ pro Quadratmeter) + </text> + <icon height="64" left="0" name="step_sell_to" width="64"/> + <text bottom_delta="38" left="72" name="sell_to_label" right="-20"> + Land verkaufen an: + </text> + <text bottom_delta="-16" height="16" left="72" name="sell_to_text" right="-10"> + Wählen Sie, ob der Verkauf offen oder auf eine bestimmte Person +beschränkt ist. + </text> + <combo_box bottom_delta="-32" height="16" left="72" name="sell_to" width="140"> + <combo_box.item label="select one --" name="--selectone--"/> + <combo_box.item label="Jeder" name="Anyone"/> + <combo_box.item label="Bestimmte Person:" name="Specificuser:"/> + </combo_box> + <button label="Auswählen..." name="sell_to_select_agent"/> + <text name="sell_objects_label"> + Die Objekte mit dem Land verkaufen? + </text> + <text name="sell_objects_text"> + Die transferierbaren Landeigentümer-Objekte auf der Parzelle +wechseln den Eigentümer. + </text> + <radio_group bottom_delta="-58" name="sell_objects"> + <radio_item label="Nein, Objekte behalten" name="no"/> + <radio_item label="Ja, Objekte mit Land verkaufen" name="yes"/> + </radio_group> + <button label="Objekte anzeigen" name="show_objects" width="116"/> + <text name="nag_message_label"> + ACHTUNG: Verkäufe sind endgültig. + </text> + <button label="Land zum Verkauf freigeben" name="sell_btn" width="180"/> + <button label="Abbrechen" name="cancel_btn"/> + </panel> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_settings_debug.xml b/indra/newview/skins/default/xui/de/floater_settings_debug.xml index ea3295797d3..f9a944165fc 100644 --- a/indra/newview/skins/default/xui/de/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/de/floater_settings_debug.xml @@ -1,13 +1,13 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="settings_debug" title="DEBUG-EINSTELLUNGEN"> - <combo_box name="boolean_combo"> - <combo_box.item name="TRUE" label="WAHR" /> - <combo_box.item name="FALSE" label="FALSCH" /> - </combo_box> - <color_swatch label="Farbe" name="color_swatch" /> - <spinner label="x" name="val_spinner_1" /> - <spinner label="x" name="val_spinner_2" /> - <spinner label="x" name="val_spinner_3" /> - <spinner label="x" name="val_spinner_4" /> - <button label="Standard wiederherstellen" name="default_btn" width="170" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="settings_debug" title="DEBUG-EINSTELLUNGEN"> + <combo_box name="boolean_combo"> + <combo_box.item label="WAHR" name="TRUE"/> + <combo_box.item label="FALSCH" name="FALSE"/> + </combo_box> + <color_swatch label="Farbe" name="val_color_swatch"/> + <spinner label="x" name="val_spinner_1"/> + <spinner label="x" name="val_spinner_2"/> + <spinner label="x" name="val_spinner_3"/> + <spinner label="x" name="val_spinner_4"/> + <button label="Standard wiederherstellen" name="default_btn" width="170"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_stats.xml b/indra/newview/skins/default/xui/de/floater_stats.xml new file mode 100644 index 00000000000..38494faf16b --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_stats.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Statistics" title="Statistik"> + <scroll_container name="statistics_scroll"> + <container_view name="statistics_view"> + <stat_view label="Basic" name="basic"> + <stat_bar label="FPS" name="fps"/> + <stat_bar label="Bandbreite" name="bandwidth"/> + <stat_bar label="Paketverlust" name="packet_loss"/> + <stat_bar label="Ping Sim" name="ping"/> + </stat_view> + <stat_view label="Erweitert" name="advanced"> + <stat_view label="Darstellung" name="render"> + <stat_bar label="Gezeichnete KTris" name="ktrisframe"/> + <stat_bar label="Gezeichnete KTris" name="ktrissec"/> + <stat_bar label="Objektanzahl" name="objs"/> + <stat_bar label="Neue Objekte" name="newobjs"/> + </stat_view> + <stat_view label="Textur" name="texture"> + <stat_bar label="Zählen" name="numimagesstat"/> + <stat_bar label="Rohanzahl" name="numrawimagesstat"/> + <stat_bar label="GL Sp" name="gltexmemstat"/> + <stat_bar label="Formattierter Sp:" name="formattedmemstat"/> + <stat_bar label="Rohsp" name="rawmemstat"/> + <stat_bar label="Zugeteilter Sp" name="glboundmemstat"/> + </stat_view> + <stat_view label="Netzwerk" name="network"> + <stat_bar label="Paketeingang" name="packetsinstat"/> + <stat_bar label="Paketausgang" name="packetsoutstat"/> + <stat_bar label="Objekte" name="objectkbitstat"/> + <stat_bar label="Textur" name="texturekbitstat"/> + <stat_bar label="Bestand" name="assetkbitstat"/> + <stat_bar label="Ebenen" name="layerskbitstat"/> + <stat_bar label="Tatsächlicher Eingang" name="actualinkbitstat"/> + <stat_bar label="Tatsächlicher Ausgang" name="actualoutkbitstat"/> + <stat_bar label="VFS Ausstehende Ops" name="vfspendingoperations"/> + </stat_view> + </stat_view> + <stat_view label="Simulator" name="sim"> + <stat_bar label="Zeitdilation" name="simtimedilation"/> + <stat_bar label="Sim FPS" name="simfps"/> + <stat_bar label="Physik FPS" name="simphysicsfps"/> + <stat_view label="Physikdetails" name="physicsdetail"> + <stat_bar label="Eingerastete Objekte" name="physicspinnedtasks"/> + <stat_bar label="Niedrig LOD-Objekte" name="physicslodtasks"/> + <stat_bar label="Zugeordneter Speicher" name="physicsmemoryallocated"/> + <stat_bar label="Agent Updates/Sek" name="simagentups"/> + <stat_bar label="Haupt-Agenten" name="simmainagents"/> + <stat_bar label="Child-Agenten" name="simchildagents"/> + <stat_bar label="Objekte" name="simobjects"/> + <stat_bar label="Aktive Objekte" name="simactiveobjects"/> + <stat_bar label="Aktive Skripts" name="simactivescripts"/> + <stat_bar label="Skript-Events" name="simscripteps"/> + <stat_bar label="Paketeingang" name="siminpps"/> + <stat_bar label="Paketausgang" name="simoutpps"/> + <stat_bar label="Ausstehende Downloads" name="simpendingdownloads"/> + <stat_bar label="Ausstehende Uploads" name="simpendinguploads"/> + <stat_bar label="Gesamtanzahl „Unacked" Bytes" name="simtotalunackedbytes"/> + </stat_view> + <stat_view label="Zeit (ms)" name="simperf"> + <stat_bar label="Gesamtzeit Frame" name="simframemsec"/> + <stat_bar label="Netto-Zeit" name="simnetmsec"/> + <stat_bar label="Physik-Zeit" name="simsimphysicsmsec"/> + <stat_bar label="Simulationszeit" name="simsimothermsec"/> + <stat_bar label="Agent-Zeit" name="simagentmsec"/> + <stat_bar label="Bilder-Zeit" name="simimagesmsec"/> + <stat_bar label="Skript-Zeit" name="simscriptmsec"/> + </stat_view> + </stat_view> + </container_view> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index 6bad64324b9..b458d922ba5 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -1,573 +1,480 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="BAUEN"> - <button label="" label_selected="" name="button focus" tool_tip="Fokus"/> - <button label="" label_selected="" name="button move" tool_tip="Verschieben"/> - <button label="" label_selected="" name="button edit" tool_tip="Bearbeiten"/> - <button label="" label_selected="" name="button create" tool_tip="Erstellen"/> - <button label="" label_selected="" name="button land" tool_tip="Land"/> - <radio_group name="focus_radio_group"> - <radio_item label="Zoom" name="radio zoom"/> - <radio_item label="Orbit (Strg)" name="radio orbit"/> - <radio_item label="Schwenken (Strg-Umschalt)" name="radio pan"/> - </radio_group> - <radio_group name="move_radio_group"> - <radio_item label="Verschieben" name="radio move"/> - <radio_item label="Heben (Strg)" name="radio lift"/> - <radio_item label="Rotieren (Strg-Umschalt)" name="radio spin"/> - </radio_group> - <radio_group name="edit_radio_group"> - <radio_item label="Position" name="radio position"/> - <radio_item label="Drehen (Strg)" name="radio rotate"/> - <radio_item label="Dehnen (Strg-Umschalt)" name="radio stretch"/> - <radio_item label="Textur auswählen" name="radio select face"/> - </radio_group> - <check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/> - <text name="text ruler mode"> - Lineal: - </text> - <combo_box name="combobox grid mode"> - <combo_box.item name="World" label="Welt" - /> - <combo_box.item name="Local" label="Lokal" - /> - <combo_box.item name="Reference" label="Referenz" - /> - </combo_box> - <check_box label="Beide Seiten dehnen" name="checkbox uniform"/> - <check_box label="Texturen dehnen" name="checkbox stretch textures"/> - <check_box label="Raster verwenden" name="checkbox snap to grid"/> - <button label="Optionen..." label_selected="Optionen..." name="Options..."/> - <text name="text status"> - Zum Verschieben ziehen, zum Kopieren Umschalttaste-Ziehen - </text> - <button label="" label_selected="" name="ToolCube" tool_tip="Würfel"/> - <button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/> - <button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/> - <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tetraeder"/> - <button label="" label_selected="" name="ToolCylinder" tool_tip="Zylinder"/> - <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Halbzylinder"/> - <button label="" label_selected="" name="ToolCone" tool_tip="Kegel"/> - <button label="" label_selected="" name="ToolHemiCone" tool_tip="Halbkegel"/> - <button label="" label_selected="" name="ToolSphere" tool_tip="Kugel"/> - <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Halbkugel"/> - <button label="" label_selected="" name="ToolTorus" tool_tip="Torus"/> - <button label="" label_selected="" name="ToolTube" tool_tip="Rohr"/> - <button label="" label_selected="" name="ToolRing" tool_tip="Ring"/> - <button label="" label_selected="" name="ToolTree" tool_tip="Baum"/> - <button label="" label_selected="" name="ToolGrass" tool_tip="Gras"/> - <check_box label="Auswahl behalten" name="checkbox sticky"/> - <check_box label="Auswahl kopieren" name="checkbox copy selection"/> - <check_box label="Zentrieren" name="checkbox copy centers"/> - <check_box label="Drehen" name="checkbox copy rotates"/> - <radio_group name="land_radio_group"> - <radio_item label="Land auswählen" name="radio select land"/> - <radio_item label="Einebnen" name="radio flatten"/> - <radio_item label="Anheben" name="radio raise"/> - <radio_item label="Absenken" name="radio lower"/> - <radio_item label="Glätten" name="radio smooth"/> - <radio_item label="Aufrauen" name="radio noise"/> - <radio_item label="Zurücksetzen" name="radio revert"/> - </radio_group> - <button label="Ãœbernehmen" label_selected="Ãœbernehmen" name="button apply to selection" tool_tip="Ausgewähltes Land ändern"/> - <text name="Bulldozer:"> - Planierraupe: - </text> - <text name="Dozer Size:"> - Größe - </text> - <text name="Strength:"> - Stärke - </text> - <text name="obj_count"> - Ausgewählte Objekte: [COUNT] - </text> - <text name="prim_count"> - Primitive: [COUNT] - </text> - <tab_container name="Object Info Tabs"> - <panel label="Allgemein" name="General"> - <text name="Name:"> - Name: - </text> - <text name="Description:"> - Beschreibung: - </text> - <text name="Creator:"> - Ersteller: - </text> - <text name="Creator Name"> - Thrax Linden - </text> - <button label="Profil..." label_selected="Profil..." name="button creator profile"/> - <text name="Owner:"> - Eigentümer: - </text> - <text name="Owner Name"> - Thrax Linden - </text> - <button label="Profil..." label_selected="Profil..." name="button owner profile"/> - <text name="Group:"> - Gruppe: - </text> - <text name="Group Name Proxy"> - Die Lindens - </text> - <button label="Festlegen..." label_selected="Festlegen..." name="button set group"/> - <text name="Permissions:"> - Berechtigungen: - </text> - - <check_box label="Mit Gruppe teilen" name="checkbox share with group" tool_tip="Allen Mitgliedern der zugeordneten Gruppe die Erlaubnis erteilen, Ihre Berechtigungen für dieses Objekt zu teilen und zu verwenden. Sie müssen Ãœbereignen, um Rollenbeschränkungen zu aktivieren."/> - <string name="text deed continued"> - Ãœbertragung... - </string> - <string name="text deed"> - Ãœbertragung - </string> - <button label="Ãœbertragung..." label_selected="Ãœbertragung..." name="button deed" tool_tip="In der Gruppe gemeinsam verwendete Objekte können von einem Gruppenfunktionär übertragen werden."/> - <check_box label="Verschieben durch beliebige Personen zulassen" name="checkbox allow everyone move"/> - <check_box label="Kopieren durch beliebige Personen zulassen" name="checkbox allow everyone copy"/> - <check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/> - <check_box label="Zu verkaufen" name="checkbox for sale"/> - <text name="Cost"> - Preis:L$ - </text> - <combo_box name="sale type"> - <combo_box.item label="Kopieren" name="Copy"/> - <combo_box.item label="Inhalt" name="Contents"/> - <combo_box.item label="Original" name="Original"/> - </combo_box> - - <text name="label click action"> - Bei Linksklicken: - </text> - <combo_box name="clickaction"> - <combo_box.item name="Touch/grab(default)" label="Berühren/Greifen (Standard)" - /> - <combo_box.item name="Sitonobject" label="Auf Objekt sitzen" - /> - <combo_box.item name="Buyobject" label="Objekt kaufen" - /> - <combo_box.item name="Payobject" label="Objekt bezahlen" - /> - <combo_box.item name="Open" label="Öffnen" - /> - <combo_box.item name="Play" label="Parzellenmedien wiedergeben" - /> - <combo_box.item name="Opemmedia" label="Parzellenmedien öffnen" - /> - </combo_box> - <panel name="perms_build"> - <text name="perm_modify"> - Sie können dieses Objekt ändern - </text> - <text name="B:"> - B: - </text> - <text name="O:"> - O: - </text> - <text name="G:"> - G: - </text> - <text name="E:"> - E: - </text> - <text name="N:"> - N: - </text> - <text name="F:"> - F: - </text> - <text name="Next owner can:"> - Nächster Eigentümer kann: - </text> - <check_box label="Ändern" name="checkbox next owner can modify"/> - <check_box label="Kopieren" name="checkbox next owner can copy"/> - <check_box name="checkbox next owner can transfer"/> - </panel> - <string name="text modify info 1"> - Sie können dieses Objekt ändern - </string> - <string name="text modify info 2"> - Sie können diese Objekte ändern - </string> - <string name="text modify info 3"> - Sie können dieses Objekt nicht ändern - </string> - <string name="text modify info 4"> - Sie können diese Objekte nicht ändern - </string> - <string name="text modify warning"> - Gesamtes Objekt muss gewählt werden, um Berechtigungen festzulegen - </string> - <string name="Cost Default"> - Preis: L$ - </string> - <string name="Cost Total"> - Summe: L$ - </string> - <string name="Cost Per Unit"> - Stückpreis: L$ - </string> - <string name="Cost Mixed"> - Mischpreis - </string> - <string name="Sale Mixed"> - Mischverkauf - </string> - </panel> - <panel label="Objekt" name="Object"> - <text name="select_single"> - Wählen Sie nur ein Primitivum aus, um Parameter zu bearbeiten. - </text> - <text name="edit_object"> - Objektparameter bearbeiten: - </text> - <check_box label="Gesperrt" name="checkbox locked" tool_tip="Verhindert, dass Objekt verschoben oder gelöscht wird. Oft beim Bauen nützlich, um unbeabsichtigte Bearbeitungen zu vermeiden."/> - <check_box label="Physisch" name="Physical Checkbox Ctrl" tool_tip="Gestattet, das Objekt geschoben und von Schwerkraft beeinflusst wird"/> - <check_box label="Temporär" name="Temporary Checkbox Ctrl" tool_tip="Verursacht, dass Objekt 1 Minute nach Erstellung gelöscht wird."/> - <check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Verursacht, dass Objekt nicht mit anderen Objekten oder Avataren kollidiert"/> - <text name="label position"> - Position (Meter) - </text> - <spinner label="X" name="Pos X"/> - <spinner label="Y" name="Pos Y"/> - <spinner label="Z" name="Pos Z"/> - <text name="label size"> - Größe (Meter) - </text> - <spinner label="X" name="Scale X"/> - <spinner label="Y" name="Scale Y"/> - <spinner label="Z" name="Scale Z"/> - <text name="label rotation"> - Rotation (Grad) - </text> - <spinner label="X" name="Rot X"/> - <spinner label="Y" name="Rot Y"/> - <spinner label="Z" name="Rot Z"/> - <text name="label material"> - Material - </text> - <combo_box name="material"> - <combo_box.item name="Stone" label="Stein" - /> - <combo_box.item name="Metal" label="Metall" - /> - <combo_box.item name="Glass" label="Glas" - /> - <combo_box.item name="Wood" label="Holz" - /> - <combo_box.item name="Flesh" label="Fleisch" - /> - <combo_box.item name="Plastic" label="Kunststoff" - /> - <combo_box.item name="Rubber" label="Gummi" - /> - </combo_box> - <text name="label basetype"> - Bausteintyp - </text> - <combo_box name="comboBaseType"> - <combo_box.item name="Box" label="Quader" - /> - <combo_box.item name="Cylinder" label="Zylinder" - /> - <combo_box.item name="Prism" label="Prisma" - /> - <combo_box.item name="Sphere" label="Kugel" - /> - <combo_box.item name="Torus" label="Torus" - /> - <combo_box.item name="Tube" label="Rohr" - /> - <combo_box.item name="Ring" label="Ring" - /> - <combo_box.item name="Sculpted" label="Geformt" - /> - </combo_box> - <text name="text cut"> - Pfadschnitt Beginn und Ende - </text> - <spinner label="B" name="cut begin"/> - <spinner label="E" name="cut end"/> - <text name="text hollow"> - Hohl - </text> - <text name="text skew"> - Versatz - </text> - <spinner name="Scale 1"/> - <spinner name="Skew"/> - <text name="Hollow Shape"> - Hohlform - </text> - <combo_box name="hole"> - <combo_box.item name="Default" label="Standard" - /> - <combo_box.item name="Circle" label="Kreis" - /> - <combo_box.item name="Square" label="Quadrat" - /> - <combo_box.item name="Triangle" label="Dreieck" - /> - </combo_box> - <text name="text twist"> - Torsion - </text> - <spinner label="B" name="Twist Begin"/> - <spinner label="E" name="Twist End"/> - <text name="scale_taper"> - Verjüngung - </text> - <text name="scale_hole"> - Lochgröße - </text> - <spinner label="X" name="Taper Scale X"/> - <spinner label="Y" name="Taper Scale Y"/> - <text name="text topshear"> - Verscherung - </text> - <spinner label="X" name="Shear X"/> - <spinner label="Y" name="Shear Y"/> - <text name="advanced_cut"> - Profilschnitt-Beginn und Ende - </text> - <text name="advanced_dimple"> - Vertiefung-Beginn und Ende - </text> - <text name="advanced_slice"> - Anfang/Ende abschneiden - </text> - <spinner label="B" name="Path Limit Begin"/> - <spinner label="E" name="Path Limit End"/> - <text name="text taper2"> - Verjüngung - </text> - <spinner label="X" name="Taper X"/> - <spinner label="Y" name="Taper Y"/> - <text name="text radius delta"> - Radius - </text> - <text name="text revolutions"> - Umdrehungen - </text> - <spinner name="Radius Offset"/> - <texture_picker label="Textur für gestaltetes -Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> - <check_box label="Spiegeln" name="sculpt mirror control" tool_tip="Geformtes Primitiv entlang der X-Achse spiegeln."/> - <check_box label="Wenden" name="sculpt invert control" tool_tip="Dreht die Normalen des geformten Primitivs von innen nach außen."/> - <text name="label sculpt type"> - Naht - </text> - <combo_box name="sculpt type control"> - <combo_box.item name="None" label="(keiner)" - /> - <combo_box.item name="Sphere" label="Kugel" - /> - <combo_box.item name="Torus" label="Torus" - /> - <combo_box.item name="Plane" label="Fläche" - /> - <combo_box.item name="Cylinder" label="Zylinder" - /> - </combo_box> - </panel> - <panel label="Eigenschaften" name="Features"> - <text name="select_single"> - Wählen Sie nur einen einzelnen Baustein aus, um Eigenschaften zu bearbeiten. - </text> - <text name="edit_object"> - Objekteigenschaften bearbeiten: - </text> - <check_box label="Flexibler Weg" name="Flexible1D Checkbox Ctrl" tool_tip="Gestattet, dass Objekt um die Z-Achse gebogen wird. (nur Client-Seite)"/> - <spinner label="Weichheit" name="FlexNumSections"/> - <spinner label="Schwerkraft" name="FlexGravity"/> - <spinner label="Ziehen" name="FlexFriction"/> - <spinner label="Wind" name="FlexWind"/> - <spinner label="Spannung" name="FlexTension"/> - <spinner label="Erzwingen X" name="FlexForceX"/> - <spinner label="Erzwingen Y" name="FlexForceY"/> - <spinner label="Erzwingen Z" name="FlexForceZ"/> - <check_box label="Licht" name="Light Checkbox Ctrl" tool_tip="Verursacht, dass Objekt Licht emittiert"/> - <text name="label color"> - Farbe - </text> - <color_swatch label="" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/> - <spinner label="Intensität" name="Light Intensity"/> - <spinner label="Radius" name="Light Radius"/> - <spinner label="Abnehmend" name="Light Falloff"/> - </panel> - <panel label="Textur" name="Texture"> - <texture_picker label="Textur" name="texture control" tool_tip="Klicken, um ein Bild zu wählen"/> - <color_swatch label="Farbe" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/> - <text name="color trans"> - Transparenz % - </text> - <text name="glow label"> - Leuchten - </text> - <check_box label="Ganz hell" name="checkbox fullbright"/> - <text name="tex gen"> - Zuordnung - </text> - <combo_box name="combobox texgen"> - <combo_box.item name="Default" label="Standard" - /> - <combo_box.item name="Planar" label="Eben" - /> - </combo_box> - <text name="label shininess"> - Glanz - </text> - <combo_box name="combobox shininess"> - <combo_box.item name="None" label="Kein" - /> - <combo_box.item name="Low" label="Niedrig" - /> - <combo_box.item name="Medium" label="Mittel" - /> - <combo_box.item name="High" label="Hoch" - /> - </combo_box> - <text name="label bumpiness"> - Holprigkeit - </text> - <combo_box name="combobox bumpiness"> - <combo_box.item name="None" label="Keine" - /> - <combo_box.item name="Brightness" label="Helligkeit" - /> - <combo_box.item name="Darkness" label="Dunkelheit" - /> - <combo_box.item name="woodgrain" label="Holzmaserung" - /> - <combo_box.item name="bark" label="Rinde" - /> - <combo_box.item name="bricks" label="Ziegel" - /> - <combo_box.item name="checker" label="Karo" - /> - <combo_box.item name="concrete" label="Beton" - /> - <combo_box.item name="crustytile" label="verkrustete Fliesen" - /> - <combo_box.item name="cutstone" label="Steinplatten" - /> - <combo_box.item name="discs" label="Scheiben" - /> - <combo_box.item name="gravel" label="Kies" - /> - <combo_box.item name="petridish" label="Petrischale" - /> - <combo_box.item name="siding" label="Verkleidung" - /> - <combo_box.item name="stonetile" label="Steinfliesen" - /> - <combo_box.item name="stucco" label="Stuck" - /> - <combo_box.item name="suction" label="Saugen" - /> - <combo_box.item name="weave" label="gewoben" - /> - </combo_box> - <text name="tex scale"> - Wiederholungen - </text> - <spinner label="Horizontal (U)" name="TexScaleU"/> - <check_box label="Umkehren" name="checkbox flip s"/> - <spinner label="Vertikal (V)" name="TexScaleV"/> - <check_box label="Umkehren" name="checkbox flip t"/> - <text name="tex rotate"> - Rotation (Grad) - </text> - <string name="string repeats per meter"> - Kacheln pro Meter - </string> - <string name="string repeats per face"> - Wiederholungen pro Fläche - </string> - <text name="rpt"> - Kacheln pro Meter - </text> - <button label="Ãœbernehmen" label_selected="Ãœbernehmen" name="button apply"/> - <text name="tex offset"> - Versatz - </text> - <spinner label="Horizontal (U)" name="TexOffsetU"/> - <spinner label="Vertikal (V)" name="TexOffsetV"/> - <text name="textbox autofix"> - Medientextur ausrichten -(zuerst laden) - </text> - <button label="Ausrichten" label_selected="Ausrichten" name="button align"/> - </panel> - <panel label="Inhalt" name="Contents"> - <button label="Neues Skript" label_selected="Neues Skript" name="button new script"/> - <button label="Berechtigungen" name="button permissions"/> - </panel> - </tab_container> - <panel name="land info panel"> - <text name="label_parcel_info"> - Parzelleninformation - </text> - <text name="label_area_price"> - Preis: L$ [PRICE] für [AREA] m² - </text> - <text name="label_area"> - Fläche: [AREA] m² - </text> - <button label="Info zu Land..." label_selected="Info zu Land..." name="button about land"/> - <check_box label="Eigentümer anzeigen" name="checkbox show owners" tool_tip="Parzellen nach Eigentümer farbig kennzeichnen: Grün = Ihr Land Blau = Das Land Ihrer Gruppe Rot = Im Eigentum anderer Geld = Zum Verkauf Lila = Zur Auktion Grau = Öffentlich"/> - <button label="?" label_selected="?" name="button show owners help"/> - <text name="label_parcel_modify"> - Parzelle ändern - </text> - <button label="Unterteilen" label_selected="Unterteilen" name="button subdivide land"/> - <button label="Zusammenlegen" label_selected="Zusammenlegen" name="button join land"/> - <text name="label_parcel_trans"> - Land-Transaktionen - </text> - <button label="Land kaufen" label_selected="Land kaufen" name="button buy land"/> - <button label="Land aufgeben" label_selected="Land aufgeben" name="button abandon land"/> - </panel> - <floater.string name="status_rotate"> - An den farbigen Bändern ziehen, um das Objekt zu drehen - </floater.string> - <floater.string name="status_scale"> - Klicken und ziehen, um die ausgewählte Seite zu dehnen - </floater.string> - <floater.string name="status_move"> - Maus verschiebt, Umschalt-Taste und Maus kopiert - </floater.string> - <floater.string name="status_modifyland"> - Klicken und halten, um das Land zu bearbeiten - </floater.string> - <floater.string name="status_camera"> - Klicken und ziehen, um die Ansicht zu ändern - </floater.string> - <floater.string name="status_grab"> - Ziehen, um Objekte zu verschieben, Strg zum Heben, Strg-Umschalt zum Drehen - </floater.string> - <floater.string name="status_place"> - Inworld klicken, um zu bauen. - </floater.string> - <floater.string name="status_selectland"> - Klicken und ziehen, um Land auszuwählen - </floater.string> - <floater.string name="grid_screen_text"> - Bildschirm - </floater.string> - <floater.string name="grid_local_text"> - Lokal - </floater.string> - <floater.string name="grid_world_text"> - Welt - </floater.string> - <floater.string name="grid_reference_text"> - Referenz - </floater.string> - <floater.string name="grid_attachment_text"> - Anhang - </floater.string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="toolbox floater" short_title="Bau-Werkzeuge" title=""> + <floater.string name="status_rotate"> + An den farbigen Bändern ziehen, um das Objekt zu drehen + </floater.string> + <floater.string name="status_scale"> + Klicken und ziehen, um die ausgewählte Seite zu dehnen + </floater.string> + <floater.string name="status_move"> + Maus verschiebt, Umschalt-Taste und Maus kopiert + </floater.string> + <floater.string name="status_modifyland"> + Klicken und halten, um das Land zu bearbeiten + </floater.string> + <floater.string name="status_camera"> + Klicken und ziehen, um Kamera zu bewegen + </floater.string> + <floater.string name="status_grab"> + Ziehen, um Objekte zu verschieben, Strg zum Heben, Strg-Umschalt zum Drehen + </floater.string> + <floater.string name="status_place"> + Inworld klicken, um zu bauen. + </floater.string> + <floater.string name="status_selectland"> + Klicken und ziehen, um Land auszuwählen + </floater.string> + <floater.string name="grid_screen_text"> + Bildschirm + </floater.string> + <floater.string name="grid_local_text"> + Lokal + </floater.string> + <floater.string name="grid_world_text"> + Welt + </floater.string> + <floater.string name="grid_reference_text"> + Referenz + </floater.string> + <floater.string name="grid_attachment_text"> + Anhang + </floater.string> + <button label="" label_selected="" name="button focus" tool_tip="Fokus"/> + <button label="" label_selected="" name="button move" tool_tip="Verschieben"/> + <button label="" label_selected="" name="button edit" tool_tip="Bearbeiten"/> + <button label="" label_selected="" name="button create" tool_tip="Erstellen"/> + <button label="" label_selected="" name="button land" tool_tip="Land"/> + <text name="text status"> + Zum Verschieben ziehen, zum Kopieren Umschalttaste-Ziehen + </text> + <radio_group name="focus_radio_group"> + <radio_item label="Zoom" name="radio zoom"/> + <radio_item label="Orbit (Strg)" name="radio orbit"/> + <radio_item label="Schwenken (Strg-Umschalt)" name="radio pan"/> + </radio_group> + <radio_group name="move_radio_group"> + <radio_item label="Verschieben" name="radio move"/> + <radio_item label="Heben (Strg)" name="radio lift"/> + <radio_item label="Rotieren (Strg-Umschalt)" name="radio spin"/> + </radio_group> + <radio_group name="edit_radio_group"> + <radio_item label="Bewegen" name="radio position"/> + <radio_item label="Drehen (Strg)" name="radio rotate"/> + <radio_item label="Dehnen (Strg-Umschalt)" name="radio stretch"/> + <radio_item label="Textur auswählen" name="radio select face"/> + </radio_group> + <check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/> + <check_box label="Beide Seiten dehnen" name="checkbox uniform"/> + <check_box initial_value="true" label="Texturen dehnen" name="checkbox stretch textures"/> + <check_box initial_value="true" label="An Raster ausrichten" name="checkbox snap to grid"/> + <combo_box name="combobox grid mode"> + <combo_box.item label="Welt-Lineal" name="World"/> + <combo_box.item label="Lokal-Lineal" name="Local"/> + <combo_box.item label="Referenz-Lineal" name="Reference"/> + </combo_box> + <button label="Optionen..." label_selected="Optionen..." name="Options..." tool_tip="Grid-Optionen einstellen"/> + <button label="" label_selected="" name="ToolCube" tool_tip="Würfel"/> + <button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/> + <button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/> + <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tetraeder"/> + <button label="" label_selected="" name="ToolCylinder" tool_tip="Zylinder"/> + <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Halbzylinder"/> + <button label="" label_selected="" name="ToolCone" tool_tip="Kegel"/> + <button label="" label_selected="" name="ToolHemiCone" tool_tip="Halbkegel"/> + <button label="" label_selected="" name="ToolSphere" tool_tip="Kugel"/> + <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Halbkugel"/> + <button label="" label_selected="" name="ToolTorus" tool_tip="Torus"/> + <button label="" label_selected="" name="ToolTube" tool_tip="Rohr"/> + <button label="" label_selected="" name="ToolRing" tool_tip="Ring"/> + <button label="" label_selected="" name="ToolTree" tool_tip="Baum"/> + <button label="" label_selected="" name="ToolGrass" tool_tip="Gras"/> + <check_box label="Ausgewähltes Werkzeug beibehalten" name="checkbox sticky"/> + <check_box label="Auswahl kopieren" name="checkbox copy selection"/> + <check_box initial_value="true" label="Kopie zentrieren" name="checkbox copy centers"/> + <check_box label="Kopie drehen" name="checkbox copy rotates"/> + <radio_group name="land_radio_group"> + <radio_item label="Land auswählen" name="radio select land"/> + <radio_item label="Einebnen" name="radio flatten"/> + <radio_item label="Anheben" name="radio raise"/> + <radio_item label="Absenken" name="radio lower"/> + <radio_item label="Glätten" name="radio smooth"/> + <radio_item label="Aufrauen" name="radio noise"/> + <radio_item label="Zurücksetzen" name="radio revert"/> + </radio_group> + <text name="Bulldozer:"> + Planierraupe: + </text> + <text name="Dozer Size:"> + Größe + </text> + <text name="Strength:"> + Stärke + </text> + <button label="Ãœbernehmen" label_selected="Ãœbernehmen" name="button apply to selection" tool_tip="Ausgewähltes Land ändern"/> + <text name="obj_count"> + Objekte: [COUNT] + </text> + <text name="prim_count"> + Primitive: [COUNT] + </text> + <tab_container name="Object Info Tabs"> + <panel label="Allgemein" name="General"> + <panel.string name="text deed continued"> + Ãœbertragung + </panel.string> + <panel.string name="text deed"> + Ãœbertragung + </panel.string> + <panel.string name="text modify info 1"> + Sie können dieses Objekt ändern + </panel.string> + <panel.string name="text modify info 2"> + Sie können diese Objekte ändern + </panel.string> + <panel.string name="text modify info 3"> + Sie können dieses Objekt nicht ändern + </panel.string> + <panel.string name="text modify info 4"> + Sie können diese Objekte nicht ändern + </panel.string> + <panel.string name="text modify warning"> + Gesamtes Objekt wählen, um Berechtigungen festzulegen. + </panel.string> + <panel.string name="Cost Default"> + Preis: L$ + </panel.string> + <panel.string name="Cost Total"> + Summe: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Stückpreis: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Mischpreis + </panel.string> + <panel.string name="Sale Mixed"> + Mischverkauf + </panel.string> + <text name="Name:"> + Name: + </text> + <text name="Description:"> + Beschreibung: + </text> + <text name="Creator:"> + Ersteller: + </text> + <text name="Creator Name"> + Thrax Linden + </text> + <text name="Owner:"> + Eigentümer: + </text> + <text name="Owner Name"> + Thrax Linden + </text> + <text name="Group:"> + Gruppe: + </text> + <button label="Festlegen..." label_selected="Festlegen..." name="button set group" tool_tip="Eine Gruppe auswählen, um die Berechtigungen des Objekts zu teilen."/> + <name_box initial_value="Wird geladen..." name="Group Name Proxy"/> + <button label="Ãœbertragung" label_selected="Ãœbertragung" name="button deed" tool_tip="Eine Ãœbertragung bedeutet, dass das Objekt mit den Berechtigungen „Nächster Eigentümer“ weitergegeben wird. Mit der Gruppe geteilte Objekte können von einem Gruppen-Officer übertragen werden."/> + <check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern teilen. Sie müssen Ãœbereignen, um Rollenbeschränkungen zu aktivieren."/> + <text name="label click action"> + Bei Linksklick: + </text> + <combo_box name="clickaction"> + <combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/> + <combo_box.item label="Auf Objekt sitzen" name="Sitonobject"/> + <combo_box.item label="Objekt kaufen" name="Buyobject"/> + <combo_box.item label="Objekt bezahlen" name="Payobject"/> + <combo_box.item label="Öffnen" name="Open"/> + </combo_box> + <check_box label="Zum Verkauf:" name="checkbox for sale"/> + <combo_box name="sale type"> + <combo_box.item label="Kopieren" name="Copy"/> + <combo_box.item label="Inhalt" name="Contents"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Preis: L$" name="Edit Cost"/> + <check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/> + <panel name="perms_build"> + <text name="perm_modify"> + Sie können dieses Objekt bearbeiten. + </text> + <text name="Anyone can:"> + Jeder: + </text> + <check_box label="Kopieren" name="checkbox allow everyone copy"/> + <text name="Next owner can:"> + Nächster Eigentümer: + </text> + <check_box label="Ändern" name="checkbox next owner can modify"/> + <check_box label="Kopieren" name="checkbox next owner can copy"/> + <check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> + </panel> + </panel> + <panel label="Objekt" name="Object"> + <check_box label="Gesperrt" name="checkbox locked" tool_tip="Verhindert, dass Objekt verschoben oder gelöscht wird. Oft beim Bauen nützlich, um unbeabsichtigte Bearbeitungen zu vermeiden."/> + <check_box label="Physisch" name="Physical Checkbox Ctrl" tool_tip="Gestattet, das Objekt geschoben und von Schwerkraft beeinflusst wird"/> + <check_box label="Temporär" name="Temporary Checkbox Ctrl" tool_tip="Verursacht, dass Objekt 1 Minute nach Erstellung gelöscht wird."/> + <check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Verursacht, dass Objekt nicht mit anderen Objekten oder Avataren kollidiert"/> + <text name="label position"> + Position (Meter) + </text> + <spinner label="X" name="Pos X"/> + <spinner label="Y" name="Pos Y"/> + <spinner label="Z" name="Pos Z"/> + <text name="label size"> + Größe (Meter) + </text> + <spinner label="X" name="Scale X"/> + <spinner label="Y" name="Scale Y"/> + <spinner label="Z" name="Scale Z"/> + <text name="label rotation"> + Rotation (Grad) + </text> + <spinner label="X" name="Rot X"/> + <spinner label="Y" name="Rot Y"/> + <spinner label="Z" name="Rot Z"/> + <combo_box name="comboBaseType"> + <combo_box.item label="Quader" name="Box"/> + <combo_box.item label="Zylinder" name="Cylinder"/> + <combo_box.item label="Prisma" name="Prism"/> + <combo_box.item label="Kugel" name="Sphere"/> + <combo_box.item label="Torus" name="Torus"/> + <combo_box.item label="Rohr" name="Tube"/> + <combo_box.item label="Ring" name="Ring"/> + <combo_box.item label="Geformt" name="Sculpted"/> + </combo_box> + <combo_box name="material"> + <combo_box.item label="Stein" name="Stone"/> + <combo_box.item label="Metall" name="Metal"/> + <combo_box.item label="Glas" name="Glass"/> + <combo_box.item label="Holz" name="Wood"/> + <combo_box.item label="Fleisch" name="Flesh"/> + <combo_box.item label="Kunststoff" name="Plastic"/> + <combo_box.item label="Gummi" name="Rubber"/> + </combo_box> + <text name="text cut"> + Pfadschnitt (Anfang/Ende) + </text> + <spinner label="B" name="cut begin"/> + <spinner label="E" name="cut end"/> + <text name="text hollow"> + Hohl + </text> + <text name="text skew"> + Versatz + </text> + <spinner name="Scale 1"/> + <spinner name="Skew"/> + <text name="Hollow Shape"> + Hohlform + </text> + <combo_box name="hole"> + <combo_box.item label="Standard" name="Default"/> + <combo_box.item label="Kreis" name="Circle"/> + <combo_box.item label="Quadrat" name="Square"/> + <combo_box.item label="Dreieck" name="Triangle"/> + </combo_box> + <text name="text twist"> + Torsion (Anfang/Ende) + </text> + <spinner label="B" name="Twist Begin"/> + <spinner label="E" name="Twist End"/> + <text name="scale_taper"> + Verjüngung + </text> + <text name="scale_hole"> + Lochgröße + </text> + <spinner label="X" name="Taper Scale X"/> + <spinner label="Y" name="Taper Scale Y"/> + <text name="text topshear"> + Verscherung + </text> + <spinner label="X" name="Shear X"/> + <spinner label="Y" name="Shear Y"/> + <text name="advanced_cut"> + Profilschnitt (Anfang/Ende) + </text> + <text name="advanced_dimple"> + Vertiefung (Anfang/Ende) + </text> + <text name="advanced_slice"> + Abschneiden (Anfang/Ende) + </text> + <spinner label="B" name="Path Limit Begin"/> + <spinner label="E" name="Path Limit End"/> + <text name="text taper2"> + Verjüngung + </text> + <spinner label="X" name="Taper X"/> + <spinner label="Y" name="Taper Y"/> + <text name="text radius delta"> + Radius + </text> + <text name="text revolutions"> + Umdrehungen + </text> + <spinner name="Radius Offset"/> + <texture_picker label="Textur für gestaltetes Primitiv" name="sculpt texture control" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> + <check_box label="Spiegeln" name="sculpt mirror control" tool_tip="Geformtes Primitiv entlang der X-Achse spiegeln."/> + <check_box label="Wenden" name="sculpt invert control" tool_tip="Dreht die Normalen des geformten Primitivs von innen nach außen."/> + <text name="label sculpt type"> + Naht + </text> + <combo_box name="sculpt type control"> + <combo_box.item label="(keiner)" name="None"/> + <combo_box.item label="Kugel" name="Sphere"/> + <combo_box.item label="Torus" name="Torus"/> + <combo_box.item label="Fläche" name="Plane"/> + <combo_box.item label="Zylinder" name="Cylinder"/> + </combo_box> + </panel> + <panel label="Eigenschaften" name="Features"> + <text name="select_single"> + Wählen Sie nur einen einzelnen Baustein aus, um Eigenschaften zu bearbeiten. + </text> + <text name="edit_object"> + Objekteigenschaften bearbeiten: + </text> + <check_box label="Flexibler Weg" name="Flexible1D Checkbox Ctrl" tool_tip="Gestattet, dass Objekt um die Z-Achse gebogen wird. (nur Client-Seite)"/> + <spinner label="Weichheit" name="FlexNumSections"/> + <spinner label="Schwerkraft" name="FlexGravity"/> + <spinner label="Ziehen" name="FlexFriction"/> + <spinner label="Wind" name="FlexWind"/> + <spinner label="Spannung" name="FlexTension"/> + <spinner label="Erzwingen X" name="FlexForceX"/> + <spinner label="Erzwingen Y" name="FlexForceY"/> + <spinner label="Erzwingen Z" name="FlexForceZ"/> + <check_box label="Licht" name="Light Checkbox Ctrl" tool_tip="Verursacht, dass Objekt Licht emittiert"/> + <color_swatch label="" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/> + <spinner label="Intensität" name="Light Intensity"/> + <spinner label="Radius" name="Light Radius"/> + <spinner label="Abnehmend" name="Light Falloff"/> + </panel> + <panel label="Textur" name="Texture"> + <panel.string name="string repeats per meter"> + Kacheln pro Meter + </panel.string> + <panel.string name="string repeats per face"> + Wiederholungen pro Fläche + </panel.string> + <texture_picker label="Textur" name="texture control" tool_tip="Klicken, um ein Bild zu wählen"/> + <color_swatch label="Farbe" name="colorswatch" tool_tip="Klicken, um Farbauswahl zu öffnen"/> + <text name="color trans"> + Transparenz % + </text> + <text name="glow label"> + Leuchten + </text> + <check_box label="Ganz hell" name="checkbox fullbright"/> + <text name="tex gen"> + Zuordnung + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="Standard" name="Default"/> + <combo_box.item label="Eben" name="Planar"/> + </combo_box> + <text name="label shininess"> + Glanz + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="Kein" name="None"/> + <combo_box.item label="Niedrig" name="Low"/> + <combo_box.item label="Mittel" name="Medium"/> + <combo_box.item label="Hoch" name="High"/> + </combo_box> + <text name="label bumpiness"> + Holprigkeit + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="Keine" name="None"/> + <combo_box.item label="Helligkeit" name="Brightness"/> + <combo_box.item label="Dunkelheit" name="Darkness"/> + <combo_box.item label="Holzmaserung" name="woodgrain"/> + <combo_box.item label="Rinde" name="bark"/> + <combo_box.item label="Ziegel" name="bricks"/> + <combo_box.item label="Karo" name="checker"/> + <combo_box.item label="Beton" name="concrete"/> + <combo_box.item label="verkrustete Fliesen" name="crustytile"/> + <combo_box.item label="Steinplatten" name="cutstone"/> + <combo_box.item label="Scheiben" name="discs"/> + <combo_box.item label="Kies" name="gravel"/> + <combo_box.item label="Petrischale" name="petridish"/> + <combo_box.item label="Verkleidung" name="siding"/> + <combo_box.item label="Steinfliesen" name="stonetile"/> + <combo_box.item label="Stuck" name="stucco"/> + <combo_box.item label="Saugen" name="suction"/> + <combo_box.item label="gewoben" name="weave"/> + </combo_box> + <text name="tex scale"> + Wiederholungen + </text> + <spinner label="Horizontal (U)" name="TexScaleU"/> + <check_box label="Umkehren" name="checkbox flip s"/> + <spinner label="Vertikal (V)" name="TexScaleV"/> + <check_box label="Umkehren" name="checkbox flip t"/> + <button label="Ãœbernehmen" label_selected="Ãœbernehmen" name="button apply"/> + <text name="tex offset"> + Texture-Versatz + </text> + <spinner label="Horizontal (U)" name="TexOffsetU"/> + <spinner label="Vertikal (V)" name="TexOffsetV"/> + </panel> + <panel label="Inhalt" name="Contents"> + <button label="Neues Skript" label_selected="Neues Skript" name="button new script"/> + <button label="Berechtigungen" name="button permissions"/> + </panel> + </tab_container> + <panel name="land info panel"> + <text name="label_parcel_info"> + Parzelleninformation + </text> + <text name="label_area_price"> + Preis: L$ [PRICE] für [AREA] m² + </text> + <text name="label_area"> + Fläche: [AREA] m² + </text> + <button label="Info zu Land..." label_selected="Info zu Land..." name="button about land"/> + <check_box label="Eigentümer anzeigen" name="checkbox show owners" tool_tip="Parzellen nach Eigentümer farbig kennzeichnen: + +Grün = Ihr Land +Blau = Das Land Ihrer Gruppe +Rot = Im Eigentum anderer +Geld = Zum Verkauf +Lila = Zur Auktion +Grau = Öffentlich"/> + <text name="label_parcel_modify"> + Parzelle ändern + </text> + <button label="Unterteilen" label_selected="Unterteilen" name="button subdivide land"/> + <button label="Zusammenlegen" label_selected="Zusammenlegen" name="button join land"/> + <text name="label_parcel_trans"> + Land-Transaktionen + </text> + <button label="Land kaufen" label_selected="Land kaufen" name="button buy land"/> + <button label="Land aufgeben" label_selected="Land aufgeben" name="button abandon land"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/de/inspect_avatar.xml b/indra/newview/skins/default/xui/de/inspect_avatar.xml new file mode 100644 index 00000000000..d2d6d202706 --- /dev/null +++ b/indra/newview/skins/default/xui/de/inspect_avatar.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [AGE] + </string> + <string name="Details"> + [ACCTTYPE], [PAYMENTINFO] +Profil: [SL_PROFILE] + </string> + <slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/> + <button label="Freund hinzufügen" name="add_friend_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/menu_avatar_icon.xml b/indra/newview/skins/default/xui/de/menu_avatar_icon.xml new file mode 100644 index 00000000000..ae9a70024ae --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_avatar_icon.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Profil anzeigen..." name="Show Profile"/> + <menu_item_call label="IM senden..." name="Send IM"/> + <menu_item_call label="Freund hinzufügen..." name="Add Friend"/> + <menu_item_call label="Freund entfernen..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_favorites.xml b/indra/newview/skins/default/xui/de/menu_favorites.xml new file mode 100644 index 00000000000..b73010e7b5a --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_favorites.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Teleportieren" name="Teleport To Landmark"/> + <menu_item_call label="Landmarken anzeigen/bearbeiten" name="Landmark Open"/> + <menu_item_call label="SLurl kopieren" name="Copy slurl"/> + <menu_item_call label="Auf Karte zeigen" name="Show On Map"/> + <menu_item_call label="Kopieren" name="Landmark Copy"/> + <menu_item_call label="Einfügen" name="Landmark Paste"/> + <menu_item_call label="Löschen" name="Delete"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_group_plus.xml b/indra/newview/skins/default/xui/de/menu_group_plus.xml new file mode 100644 index 00000000000..f90fcb04519 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_group_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Werden Sie Mitglied..." name="item_join"/> + <menu_item_call label="Neue Gruppe..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml index e05b2e9f1a3..67250fc7328 100644 --- a/indra/newview/skins/default/xui/de/menu_inventory.xml +++ b/indra/newview/skins/default/xui/de/menu_inventory.xml @@ -1,66 +1,76 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Popup"> - <menu_item_call label="Kaufen" name="Task Buy"/> - <menu_item_call label="Öffnen" name="Task Open"/> - <menu_item_call label="Wiedergeben/Abspielen" name="Task Play"/> - <menu_item_call label="Eigenschaften" name="Task Properties"/> - <menu_item_call label="Umbenennen" name="Task Rename"/> - <menu_item_call label="Löschen" name="Task Remove"/> - <menu_item_call label="Papierkorb ausleeren" name="Empty Trash"/> - <menu_item_call label="Fundstücke ausleeren" name="Empty Lost And Found"/> - <menu_item_call label="Neuer Ordner" name="New Folder"/> - <menu_item_call label="Neues Skript" name="New Script"/> - <menu_item_call label="Neue Notiz" name="New Note"/> - <menu_item_call label="Neue Geste" name="New Gesture"/> - <menu name="New Clothes"> - <menu_item_call label="Neues Hemd" name="New Shirt"/> - <menu_item_call label="Neue Hose" name="New Pants"/> - <menu_item_call label="Neue Schuhe" name="New Shoes"/> - <menu_item_call label="Neue Socken" name="New Socks"/> - <menu_item_call label="Neue Jacke" name="New Jacket"/> - <menu_item_call label="Neuer Rock" name="New Skirt"/> - <menu_item_call label="Neue Handschuhe" name="New Gloves"/> - <menu_item_call label="Neues Unterhemd" name="New Undershirt"/> - <menu_item_call label="Neue Unterhose" name="New Underpants"/> - </menu> - <menu name="New Body Parts"> - <menu_item_call label="Neue Form/Gestalt" name="New Shape"/> - <menu_item_call label="Neue Haut" name="New Skin"/> - <menu_item_call label="Neues Haar" name="New Hair"/> - <menu_item_call label="Neue Augen" name="New Eyes"/> - </menu> - <menu_item_call label="Teleportieren" name="Landmark Open"/> - <menu_item_call label="Öffnen" name="Animation Open"/> - <menu_item_call label="Öffnen" name="Sound Open"/> - <menu_item_call label="Objekt löschen" name="Purge Item"/> - <menu_item_call label="Objekt wiederherstellen" name="Restore Item"/> - <menu_item_call label="Öffnen" name="Open"/> - <menu_item_call label="Eigenschaften" name="Properties"/> - <menu_item_call label="Umbenennen" name="Rename"/> - <menu_item_call label="Asset-UUID kopieren" name="Copy Asset UUID"/> - <menu_item_call label="Kopieren" name="Copy"/> - <menu_item_call label="Einfügen" name="Paste"/> - <menu_item_call label="Löschen" name="Delete"/> - <menu_item_call label="Objekte abnehmen" name="Take Off Items"/> - <menu_item_call label="Zum Outfit hinzufügen" name="Add To Outfit"/> - <menu_item_call label="Outfit ersetzen" name="Replace Outfit"/> - <menu_item_call label="Konferenz-Chat starten" name="Conference Chat Folder"/> - <menu_item_call label="Wiedergeben/Abspielen" name="Sound Play"/> - <menu_item_call label="Landmarken-Info" name="Teleport To Landmark"/> - <menu_item_call label="In Welt abspielen" name="Animation Play"/> - <menu_item_call label="Lokal wiedergeben" name="Animation Audition"/> - <menu_item_call label="Instant Message senden" name="Send Instant Message"/> - <menu_item_call label="Teleport anbieten..." name="Offer Teleport..."/> - <menu_item_call label="Konferenz-Chat starten" name="Conference Chat"/> - <menu_item_call label="Aktivieren" name="Activate"/> - <menu_item_call label="Deaktivieren" name="Deactivate"/> - <menu_item_call label="Von Körper abnehmen" name="Detach From Yourself"/> - <menu_item_call label="Zu letzter Position zurücksetzen" name="Restore to Last Position"/> - <menu_item_call label="Anziehen" name="Object Wear"/> - <menu label="Anhängen an" name="Attach To"/> - <menu label="An HUD hängen" name="Attach To HUD"/> - <menu_item_call label="Bearbeiten" name="Wearable Edit"/> - <menu_item_call label="Anziehen" name="Wearable Wear"/> - <menu_item_call label="Ausziehen" name="Take Off"/> - <menu_item_call label="--keine Optionen--" name="--no options--"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Kaufen" name="Task Buy"/> + <menu_item_call label="Öffnen" name="Task Open"/> + <menu_item_call label="Wiedergeben/Abspielen" name="Task Play"/> + <menu_item_call label="Eigenschaften" name="Task Properties"/> + <menu_item_call label="Umbenennen" name="Task Rename"/> + <menu_item_call label="Löschen" name="Task Remove"/> + <menu_item_call label="Papierkorb ausleeren" name="Empty Trash"/> + <menu_item_call label="Fundstücke ausleeren" name="Empty Lost And Found"/> + <menu_item_call label="Neuer Ordner" name="New Folder"/> + <menu_item_call label="Neues Skript" name="New Script"/> + <menu_item_call label="Neue Notiz" name="New Note"/> + <menu_item_call label="Neue Geste" name="New Gesture"/> + <menu label="Neue Kleider" name="New Clothes"> + <menu_item_call label="Neues Hemd" name="New Shirt"/> + <menu_item_call label="Neue Hose" name="New Pants"/> + <menu_item_call label="Neue Schuhe" name="New Shoes"/> + <menu_item_call label="Neue Socken" name="New Socks"/> + <menu_item_call label="Neue Jacke" name="New Jacket"/> + <menu_item_call label="Neuer Rock" name="New Skirt"/> + <menu_item_call label="Neue Handschuhe" name="New Gloves"/> + <menu_item_call label="Neues Unterhemd" name="New Undershirt"/> + <menu_item_call label="Neue Unterhose" name="New Underpants"/> + </menu> + <menu label="Neue Körperteile" name="New Body Parts"> + <menu_item_call label="Neue Form/Gestalt" name="New Shape"/> + <menu_item_call label="Neue Haut" name="New Skin"/> + <menu_item_call label="Neues Haar" name="New Hair"/> + <menu_item_call label="Neue Augen" name="New Eyes"/> + </menu> + <menu label="Typ ändern" name="Change Type"> + <menu_item_call label="Standard" name="Default"/> + <menu_item_call label="Handschuhe" name="Gloves"/> + <menu_item_call label="Jacke" name="Jacket"/> + <menu_item_call label="Hose" name="Pants"/> + <menu_item_call label="Form" name="Shape"/> + <menu_item_call label="Schuhe" name="Shoes"/> + <menu_item_call label="Hemd" name="Shirt"/> + <menu_item_call label="Rock" name="Skirt"/> + <menu_item_call label="Unterhose" name="Underpants"/> + <menu_item_call label="Unterhemd" name="Undershirt"/> + </menu> + <menu_item_call label="Teleportieren" name="Landmark Open"/> + <menu_item_call label="Öffnen" name="Animation Open"/> + <menu_item_call label="Öffnen" name="Sound Open"/> + <menu_item_call label="Objekt löschen" name="Purge Item"/> + <menu_item_call label="Objekt wiederherstellen" name="Restore Item"/> + <menu_item_call label="Öffnen" name="Open"/> + <menu_item_call label="Eigenschaften" name="Properties"/> + <menu_item_call label="Umbenennen" name="Rename"/> + <menu_item_call label="Asset-UUID kopieren" name="Copy Asset UUID"/> + <menu_item_call label="Kopieren" name="Copy"/> + <menu_item_call label="Einfügen" name="Paste"/> + <menu_item_call label="Löschen" name="Delete"/> + <menu_item_call label="Objekte abnehmen" name="Take Off Items"/> + <menu_item_call label="Zum Outfit hinzufügen" name="Add To Outfit"/> + <menu_item_call label="Outfit ersetzen" name="Replace Outfit"/> + <menu_item_call label="Konferenz-Chat starten" name="Conference Chat Folder"/> + <menu_item_call label="Wiedergeben/Abspielen" name="Sound Play"/> + <menu_item_call label="In Welt abspielen" name="Animation Play"/> + <menu_item_call label="Lokal wiedergeben" name="Animation Audition"/> + <menu_item_call label="Instant Message senden" name="Send Instant Message"/> + <menu_item_call label="Teleport anbieten..." name="Offer Teleport..."/> + <menu_item_call label="Konferenz-Chat starten" name="Conference Chat"/> + <menu_item_call label="Aktivieren" name="Activate"/> + <menu_item_call label="Deaktivieren" name="Deactivate"/> + <menu_item_call label="Von Körper abnehmen" name="Detach From Yourself"/> + <menu_item_call label="Anziehen" name="Object Wear"/> + <menu label="Anhängen an" name="Attach To"/> + <menu label="An HUD hängen" name="Attach To HUD"/> + <menu_item_call label="Bearbeiten" name="Wearable Edit"/> + <menu_item_call label="Anziehen" name="Wearable Wear"/> + <menu_item_call label="Ausziehen" name="Take Off"/> + <menu_item_call label="--keine Optionen--" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_landmark.xml b/indra/newview/skins/default/xui/de/menu_landmark.xml new file mode 100644 index 00000000000..40b5b67079b --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_landmark.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="SLurl kopieren" name="copy"/> + <menu_item_call label="Löschen" name="delete"/> + <menu_item_call label="Auswahl erstellen" name="pick"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_mini_map.xml b/indra/newview/skins/default/xui/de/menu_mini_map.xml index 9b7117cf42c..840e7c41b24 100644 --- a/indra/newview/skins/default/xui/de/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/de/menu_mini_map.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> - <menu_item_call label="Zoom Nah" name="Zoom Close"/> - <menu_item_call label="Zoom Mittel" name="Zoom Medium"/> - <menu_item_call label="Zoom Weit" name="Zoom Far"/> - <menu_item_call label="Verfolgung abschalten" name="Stop Tracking"/> - <menu_item_call label="Profil..." name="Profile"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="popup"> + <menu_item_call label="Zoom Nah" name="Zoom Close"/> + <menu_item_call label="Zoom Mittel" name="Zoom Medium"/> + <menu_item_call label="Zoom Weit" name="Zoom Far"/> + <menu_item_call label="Verfolgung abschalten" name="Stop Tracking"/> + <menu_item_call label="Weltkarte" name="World Map"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_navbar.xml b/indra/newview/skins/default/xui/de/menu_navbar.xml new file mode 100644 index 00000000000..677de7c116d --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_navbar.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Koordinaten anzeigen" name="Show Coordinates"/> + <menu_item_call label="Landmarke" name="Landmark"/> + <menu_item_call label="Ausschneiden" name="Cut"/> + <menu_item_call label="Kopieren" name="Copy"/> + <menu_item_call label="Einfügen" name="Paste"/> + <menu_item_call label="Löschen" name="Delete"/> + <menu_item_call label="Alle auswählen" name="Select All"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_picks.xml b/indra/newview/skins/default/xui/de/menu_picks.xml new file mode 100644 index 00000000000..102dd4cc5d6 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Info" name="pick_info"/> + <menu_item_call label="Bearbeiten" name="pick_edit"/> + <menu_item_call label="Teleportieren" name="pick_teleport"/> + <menu_item_call label="Karte" name="pick_map"/> + <menu_item_call label="Löschen" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_place.xml b/indra/newview/skins/default/xui/de/menu_place.xml new file mode 100644 index 00000000000..36cb3377c14 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_place.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Eine Landmarke setzen" name="landmark"/> + <menu_item_call label="Auswahl erstellen" name="pick"/> + <menu_item_call label="Pass kaufen" name="pass"/> + <menu_item_call label="Bearbeiten" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_slurl.xml b/indra/newview/skins/default/xui/de/menu_slurl.xml index d9793e5906e..b379c1ca6a9 100644 --- a/indra/newview/skins/default/xui/de/menu_slurl.xml +++ b/indra/newview/skins/default/xui/de/menu_slurl.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu name="Popup"> - <menu_item_call label="URL-Info" name="about_url" /> - <menu_item_call label="Zu URL teleportieren" name="teleport_to_url" /> - <menu_item_call label="Auf Karte" name="show_on_map" /> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="URL-Info" name="about_url"/> + <menu_item_call label="Zu URL teleportieren" name="teleport_to_url"/> + <menu_item_call label="Karte" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_agent.xml b/indra/newview/skins/default/xui/de/menu_url_agent.xml new file mode 100644 index 00000000000..e9effe0bf26 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_url_agent.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Einwohnerprofil anzeigen" name="show_agent"/> + <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_group.xml b/indra/newview/skins/default/xui/de/menu_url_group.xml new file mode 100644 index 00000000000..78051fe726e --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_url_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Gruppeninformation anzeigen" name="show_group"/> + <menu_item_call label="Gruppe in Zwischenablage kopieren" name="url_copy_label"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_http.xml b/indra/newview/skins/default/xui/de/menu_url_http.xml new file mode 100644 index 00000000000..ae4aaad4803 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_url_http.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Webseite öffnen" name="url_open"/> + <menu_item_call label="Im internen Browser öffnen" name="url_open_internal"/> + <menu_item_call label="Im externen Browser öffnen" name="url_open_external"/> + <menu_item_call label="URL in Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_objectim.xml b/indra/newview/skins/default/xui/de/menu_url_objectim.xml new file mode 100644 index 00000000000..8bb1822405c --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_url_objectim.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Objektinformationen anzeigen" name="show_object"/> + <menu_item_call label="Zu Objekt-Position teleportieren" name="teleport_to_object"/> + <menu_item_call label="Objektname in Zwischenablage kopieren" name="url_copy_label"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_parcel.xml b/indra/newview/skins/default/xui/de/menu_url_parcel.xml new file mode 100644 index 00000000000..b3117c8fbe8 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_url_parcel.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Parzelleninformationen anzeigen" name="show_parcel"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_slurl.xml b/indra/newview/skins/default/xui/de/menu_url_slurl.xml new file mode 100644 index 00000000000..b4d15b2c3db --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_url_slurl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Ortsinformationen anzeigen" name="show_place"/> + <menu_item_call label="Zu Position teleportieren" name="teleport_to_location"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_teleport.xml b/indra/newview/skins/default/xui/de/menu_url_teleport.xml new file mode 100644 index 00000000000..254807295f4 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_url_teleport.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="An diesen Standort teleportieren" name="teleport"/> + <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index ebe2d9b260f..94bb7582c37 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -1,2982 +1,2563 @@ -<?xml version="1.0" encoding="utf-8"?> -<notifications> - <global name="skipnexttime"> - Nicht mehr anzeigen - </global> - <global name="alwayschoose"> - Diese Option immer auswählen - </global> - <global name="implicitclosebutton"> - Schließen - </global> - <template name="okbutton"> - <form> - <button - name="OK" - text="$yestext"/> - </form> - </template> - - <template name="okignore"> - <form> - <button - name="OK" - text="$yestext"/> - <ignore text="$ignoretext"/> - </form> - </template> - - <template name="okcancelbuttons"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Cancel" - text="$notext"/> - </form> - </template> - - <template name="okcancelignore"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Cancel" - text="$notext"/> - <ignore text="$ignoretext"/> - </form> - </template> - - <template name="okhelpbuttons"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Help" - text="$helptext"/> - </form> - </template> - - <template name="yesnocancelbuttons"> - <form> - <button - name="Yes" - text="$yestext"/> - <button - name="No" - text="$notext"/> - <button - name="Cancel" - text="$canceltext"/> - </form> - </template> - <notification functor="GenericAcknowledge" label="Unbekannter Warnhinweis" name="MissingAlert"> - Ihre Version von [APP_NAME] kann den gerade empfangenen Warnhinweis nicht anzeigen. - -Fehlerdetails: Der Warnhinweis „[_NAME]“ wurde in notifications.xml nicht gefunden. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="FloaterNotFound"> - Floater-Fehler: Folgende Steuerelemente wurden nicht gefunden: - -[CONTROLS] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="TutorialNotFound"> - Derzeit ist kein Tutorial verfügbar. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="GenericAlert"> - [MESSAGE] - </notification> - <notification name="GenericAlertYesCancel"> - [MESSAGE] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> - </notification> - <notification name="BadInstallation"> - Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von secondlife.com herunter. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LoginFailedNoNetwork"> - Netzwerk Fehler: Eine Verbindung konnte nicht hergestellt werden. -„[DIAGNOSTIC]“ -Bitte überprüfen Sie Ihre Netzwerkverbindung. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MessageTemplateNotFound"> - Meldungsvorlage [PATH] nicht gefunden. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="WearableSave"> - Änderung an aktueller Kleidung/Körperteil speichern? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> - </notification> - <notification name="CompileQueueSaveText"> - Der Text für ein Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut. - </notification> - <notification name="CompileQueueSaveBytecode"> - Eine kompiliertes Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut. - </notification> - <notification name="WriteAnimationFail"> - Fehler beim Schreiben von Animationsdaten. Bitte versuchen Sie es erneut. - </notification> - <notification name="UploadAuctionSnapshotFail"> - Eine Auktions-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON] - </notification> - <notification name="UnableToViewContentsMoreThanOne"> - Es kann nur jeweils der Inhalt von einem Objekt angezeigt werden. -Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. - </notification> - <notification name="SaveClothingBodyChanges"> - Änderung an Kleidung/Körperteilen speichern? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Alles speichern"/> - </notification> - <notification name="GrantModifyRights"> - Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern oder an sich zu nehmen, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis. -Möchten Sie [FIRST_NAME] [LAST_NAME] Änderungsrechte gewähren? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="GrantModifyRightsMultiple"> - Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis. -Möchten Sie den ausgewählten Einwohnern Änderungsrechte gewähren? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="RevokeModifyRights"> - Möchten Sie [FIRST_NAME] [LAST_NAME] die Änderungsrechte entziehen? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="RevokeModifyRightsMultiple"> - Möchten Sie den ausgewählten Einwohnern die Änderungsrechte entziehen? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="UnableToCreateGroup"> - Gruppe konnte nicht erstellt werden. -[MESSAGE] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PanelGroupApply"> - [NEEDS_APPLY_MESSAGE] -[WANT_APPLY_MESSAGE] - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Änderungen verwerfen" yestext="Änderungen übernehmen"/> - </notification> - <notification name="MustSpecifyGroupNoticeSubject"> - Geben Sie einen Betreff für die Gruppenmitteilung ein. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AddGroupOwnerWarning"> - Sie sind im Begriff, Gruppenmitgliedern die Rolle [ROLE_NAME] zuzuweisen. -Diese Rolle kann Mitgliedern nicht mehr entzogen werden. -Sie müssen die Rolle selbst niederlegen. -Möchten Sie fortfahren? - <usetemplate ignoretext="Beim Hinzufügen von Gruppenmitgliedern zur Eigentümerrolle" name="okcancelignore" notext="Nein" yestext="Ja"/> - </notification> - <notification name="AssignDangerousActionWarning"> - Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen. - - *ACHTUNG* - Mitglieder in einer Rolle mit dieser Fähigkeit können sich selbst - - und allen anderen Mitgliedern – Rollen zuweisen, die mehr Rechte - beinhalten als sie derzeit haben, und damit nahezu - Eigentümerrechte erreichen. Ãœberlegen Sie sich, wem Sie diese Fähigkeit - verleihen. - -Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="AssignDangerousAbilityWarning"> - Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen. - - *ACHTUNG* - Mitglieder in einer Rolle mit dieser Fähigkeit können sich selbst - - und allen anderen Mitgliedern – alle Fähigkeiten zuweisen und - damit fast Eigentümerrechte erreichen. - -Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="ClickPublishHelpLand"> - Auswahl von „In Suche veröffentlichen“ -Dieses Kontrollkästchen zeigt Folgendes an: -- diese Parzelle in den Suchergebnissen -- die öffentlichen Objekte dieser Parzelle -- diese Parzelle in der Websuche - </notification> - <notification name="ClickSoundHelpLand"> - Medien und Musik können nur innerhalb der Parzelle abgespielt werden. Sound- und Voice-Chat-Optionen können auf die Parzelle beschränkt werden oder von Einwohnern außerhalb der Parzelle, entsprechend ihrer Alterseinstufung, gehört werden. Möchten Sie unsere Knowledgebase besuchen, um mehr darüber zu erfahren, wie diese Optionen eingestellt werden können? - <url name="url"> - http://wiki.secondlife.com/wiki/Medien_auf_Parzellen_(KB) - </url> - <usetemplate name="okcancelbuttons" notext="Schließen" yestext="Zur Knowledgbase"/> - </notification> - <notification name="ClickSearchHelpAll"> - Die Suchergebnisse wurde aufgrund der entsprechenden Registerkarte, Ihrer Alterseinstufung, der gewählten Kategorie und anderen Faktoren geordnet. Bitte besuchen Sie unsere Knowledgebase, um weitere Informationen zu erhalten. - <url name="url"> - http://wiki.secondlife.com/wiki/FAQ_zur_Suchfunktion_(KB) - </url> - <usetemplate name="okcancelbuttons" notext="Schließen" yestext="Zur Knowledgbase"/> - </notification> - <notification name="ClickPublishHelpLandDisabled"> - Diese Parzelle kann nicht in der Suche angezeigt werden, da sie sich in einer Region befindet, die das verbietet. - </notification> - <notification name="ClickPublishHelpAvatar"> - Auswahl von „In Suche anzeigen“ zeigt Folgendes an: -- Ihr Profil in den Suchergebnissen -- einen Link auf Ihr Profil in den öffentlichen Gruppenseiten - </notification> - <notification name="ClickPartnerHelpAvatar"> - Auf der [SECOND_LIFE] Website können Sie anderen Einwohnern eine Partnerschaft vorschlagen und bestehende Partnerschaften lösen. - -Die [SECOND_LIFE] Website für weitere Informationen über Partnerschaften öffnen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Gehe zu Seite"/> - </notification> - <notification name="ClickUploadHelpPermissions"> - Ihre Standardberechtigung funktionieren in älteren Regionen möglicherweise nicht. - </notification> - <notification name="ClickWebProfileHelpAvatar"> - Wenn dieser Einwohner einen Webprofil-URL angegeben hat, können Sie: - * Auf „Laden“ klicken und die Seite in dieser Web-Registerkarte anzeigen. - * Auf Laden > „In externem Browser“ klicken und die Seite im Standard-Browser anzeigen. - * Auf Laden > „Start-URL“ klicken und zum Webprofil des Bewohners zurückkehren. - -In Ihrem eigenen Profil können Sie jeden beliebigen URL als Ihr Webprofil eingeben und mit OK übernehmen. -Wenn sich andere Einwohner Ihr Profil ansehen, können sie diesen URL besuchen. - </notification> - <notification name="JoinGroupCanAfford"> - Der Beitritt zu dieser Gruppe kostet [COST] L$. -Fortfahren? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Beitreten"/> - </notification> - <notification name="JoinGroupCannotAfford"> - Der Beitritt zu dieser Gruppe kostet [COST] L$. -Sie haben nicht genug L$, um dieser Gruppe beizutreten. - </notification> - <notification name="LandBuyPass"> - Sie können dieses Land („[PARCEL_NAME]“) für [COST] L$ -[TIME] Stunden lang betreten. Pass kaufen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="SalePriceRestriction"> - Der Verkaufspreis muss beim allgemeinen Verkauf über 0 L$ liegen. -Wählen Sie eine bestimmte Person aus, wenn Sie für 0 L$ verkaufen. - </notification> - <notification name="ConfirmLandSaleChange"> - Die ausgewählten [LAND_SIZE] qm Land werden zum Verkauf freigegeben. -Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmLandSaleToAnyoneChange"> - ACHTUNG: Wenn Sie auf „An jeden verkaufen“ klicken, kann jeder in [SECOND_LIFE] Ihr Land kaufen, auch Einwohner in anderen Regionen. - -Die ausgewählten [LAND_SIZE] qm Land werden zum Verkauf freigegeben. -Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnObjectsDeededToGroup"> - Möchten Sie alle Ihre Objekte auf dieser Parzelle, die der Gruppe „[NAME]“ gehören, zurück in das jeweilige Inventar ihrer vorherigen Eigentümer transferieren? - -*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht! - -Objekte: [N] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedByUser"> - Möchten Sie alle Objekte auf dieser Parzelle, die dem Einwohner „[NAME]“ gehören, in das jeweilige Inventar ihrer Eigentümer transferieren? - -Objekte: [N] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedBySelf"> - Möchten Sie alle Objekte auf dieser Parzelle, die Ihnen gehören, zurück in Ihr Inventar transferieren? - -Objekte: [N] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedBySelf"> - Möchten Sie alle Objekte auf dieser Parzelle, die NICHT Ihnen gehören, in das Inventar ihrer Eigentümer transferieren? -Transferierbare Objekte, die an eine Gruppe übertragen wurden, werden ihren vorherigen Eigentümern zurückgegeben. - -*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht! - -Objekte: [N] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByUser"> - Möchten Sie alle Objekte auf dieser Parzelle, die NICHT [NAME] gehören, in das Inventar ihrer Eigentümer transferieren? -Transferierbare Objekte, die an eine Gruppe übertragen wurden, werden ihren vorherigen Eigentümern zurückgegeben. - -*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht! - -Objekte: [N] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnAllTopObjects"> - Möchten Sie alle aufgeführten Objekte ihren Eigentümern zurückgeben? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="DisableAllTopObjects"> - Möchten Sie alle Objekte in dieser Region deaktivieren? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByGroup"> - Objekte auf dieser Parzelle, die von der Gruppe [NAME] nicht gemeinsam genutzt werden, an ihre Eigentümer zurückgeben? - -Objekte: [N] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="UnableToDisableOutsideScripts"> - Skriptdeaktivierung nicht möglich. -Für die gesamte Region ist Schaden aktiviert. -Damit Waffen funktionieren, müssen Skripts erlaubt sein. - </notification> - <notification name="MustBeInParcel"> - Sie müssen auf einer Landparzelle stehen, um ihren Landepunkt festzulegen. - </notification> - <notification name="PromptRecipientEmail"> - Bitte geben Sie für den/die Empfänger eine gültige Email-Adresse ein. - </notification> - <notification name="PromptSelfEmail"> - Geben Sie Ihre E-Mail-Adresse ein. - </notification> - <notification name="PromptMissingSubjMsg"> - Foto mit Standardbetreff bzw. -nachricht als E-Mail versenden? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ErrorProcessingSnapshot"> - Fehler beim Verarbeiten der Fotodaten - </notification> - <notification name="ErrorEncodingSnapshot"> - Fehler beim Erstellen des Fotos! - </notification> - <notification name="ErrorUploadingPostcard"> - Ein Foto konnte aus folgendem Grund nicht gesendet werden: [REASON] - </notification> - <notification name="ErrorUploadingReportScreenshot"> - Ein Report-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON] - </notification> - <notification name="MustAgreeToLogIn"> - Bevor Sie sich in [SECOND_LIFE] anmelden können, müssen Sie den Nutzungsbedingungen zustimmen. - </notification> - <notification name="CouldNotPutOnOutfit"> - Outfit konnte nicht angezogen werden. -Der Outfit-Ordner enthält keine Kleidung, Körperteile oder Anhänge. - </notification> - <notification name="CannotWearTrash"> - Kleider oder Körperteile im Papierkorb können nicht getragen werden - </notification> - <notification name="CannotWearInfoNotComplete"> - Sie können das Objekt nicht anziehen, weil es noch nicht geladen wurde. Warten Sie kurz und versuchen Sie es dann noch einmal. - </notification> - <notification name="MustHaveAccountToLogIn"> - Hoppla! Da fehlt noch etwas. -Geben Sie bitte den Vor- und den Nachnamen Ihres Avatars ein. - -Sie benötigen ein Benutzerkonto, um [SECOND_LIFE] betreten zu können. Möchten Sie jetzt ein Benutzerkonto anlegen? - <usetemplate name="okcancelbuttons" notext="Erneut versuchen" yestext="Neues Benutzerkonto anlegen"/> - </notification> - <notification name="AddClassified"> - Anzeigen erscheinen für eine Woche unter „Anzeigen“ im Suchverzeichnis. Füllen Sie Ihre Anzeige aus und klicken Sie auf „Veröffentlichen...“, um sie zum Verzeichnis hinzuzufügen. Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf „Veröffentlichen“ klicken. Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht, erscheint Ihre Anzeige weiter oben in der Liste. - <usetemplate ignoretext="Beim Hinzufügen einer neuen Anzeige" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="DeleteClassified"> - Anzeige „[NAME]“ löschen? -Gebühren werden nicht rückerstattet. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ClassifiedSave"> - Änderung an Anzeige [NAME] speichern? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> - </notification> - <notification name="DeleteAvatarPick"> - Auswahl [PICK] löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="PromptGoToEventsPage"> - Zur [SECOND_LIFE] Events-Webseite? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="SelectProposalToView"> - Wählen Sie ein Angebot zur Ansicht. - </notification> - <notification name="SelectHistoryItemToView"> - Wählen Sie ein Element zur Ansicht. - </notification> - <notification name="ResetShowNextTimeDialogs"> - Möchten Sie alle Popups wieder aktivieren, die Sie zuvor auf „Nicht mehr anzeigen“ gesetzt haben? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="SkipShowNextTimeDialogs"> - Möchten Sie alle Popups, die übersprungen werden können, deaktivieren? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="CacheWillClear"> - Der Cache wird nach einem Neustart von [APP_NAME] geleert. - </notification> - <notification name="CacheWillBeMoved"> - Der Cache wird nach einem Neustart von [APP_NAME] verschoben. -Hinweis: Der Cache wird dabei gelöscht/geleert. - </notification> - <notification name="ChangeConnectionPort"> - Die Port-Einstellungen werden nach einem Neustart von [APP_NAME] wirksam. - </notification> - <notification name="ChangeSkin"> - Die neue Benutzeroberfläche wird nach einem Neustart von [APP_NAME] angewendet. - </notification> - <notification name="GoToAuctionPage"> - Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder ein Gebot abzugeben? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="SaveChanges"> - Änderungen speichern? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> - </notification> - <notification name="GestureSaveFailedTooManySteps"> - Speichern der Geste fehlgeschlagen. -Die Geste besteht aus zu vielen Schritten. -Löschen Sie einige Schritte und versuchen Sie es erneut. - </notification> - <notification name="GestureSaveFailedTryAgain"> - Speichern der Geste fehlgeschlagen. Warten Sie kurz und versuchen Sie es dann noch einmal. - </notification> - <notification name="GestureSaveFailedObjectNotFound"> - Geste konnte nicht gespeichert werden, da das Objekt oder das zugehörige Objektinventar nicht gefunden wurden. -Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. - </notification> - <notification name="GestureSaveFailedReason"> - Eine Geste konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie die Geste bitte später. - </notification> - <notification name="SaveNotecardFailObjectNotFound"> - Notizkarte konnte nicht gespeichert werden, da das Objekt oder das zugehörige Objektinventar nicht gefunden wurden. -Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. - </notification> - <notification name="SaveNotecardFailReason"> - Eine Notizkarte konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie die Notizkarte bitte später. - </notification> - <notification name="ScriptCannotUndo"> - Es konnten nicht alle Änderungen in Ihrer Skriptversion rückgängig gemacht werden. -Möchten Sie die letzte gespeicherte Version vom Server laden? -(**Warnung** Dieser Vorgang kann nicht rückgängig gemacht werden.) - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="SaveScriptFailReason"> - Ein Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie das Skript bitte später. - </notification> - <notification name="SaveScriptFailObjectNotFound"> - Skript konnte nicht gespeichert werden, weil das zugehörige Objekt nicht gefunden wurde. -Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. - </notification> - <notification name="SaveBytecodeFailReason"> - Ein kompiliertes Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie das Skript bitte später. - </notification> - <notification name="CouldNotStartStopScript"> - Skript konnte nicht gestartet oder beendet werden, weil das zugehörige Objekt nicht gefunden wurde. -Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. - </notification> - <notification name="CannotDownloadFile"> - Dateidownload nicht möglich - </notification> - <notification name="CannotWriteFile"> - Datei [[FILE]] kann nicht geschrieben werden - </notification> - <notification name="UnsupportedHardware"> - Achtung: Ihr System erfüllt nicht die Mindestanforderungen von [APP_NAME]. Dies kann eine schlechte Darstellungsleistung in [APP_NAME] zur Folge haben. Für nicht unterstützte Systemkonfigurationen bieten wir keinen technischen Support. - -MINSPECS -Die Seite [_URL] für weitere Informationen öffnen? - <url name="url" option="0"> - http://secondlife.com/support/sysreqs.php?lang=de - </url> - <usetemplate ignoretext="Bei Entdeckung nicht unterstützter Hardware" name="okcancelignore" notext="Nein" yestext="Ja"/> - </notification> - <notification name="UnknownGPU"> - Ihr System verwendet eine uns zurzeit unbekannte Grafikkarte. -Dies ist häufig der Fall bei neuer Hardware, die wir noch nicht testen konnten. -[APP_NAME] funktioniert aller Voraussicht nach normal, möglicherweise müssen Sie aber die Grafikeinstellungen anpassen. -(Bearbeiten > Einstellungen > Grafik). - <form name="form"> - <ignore name="ignore" text="Bei Entdeckung einer unbekannten Grafikkarte"/> - </form> - </notification> - <notification name="DisplaySettingsNoShaders"> - [APP_NAME] ist bei der Initialisierung der Grafiktreiber abgestürzt. -Die Grafikqualität wird auf eine niedrige Stufe zurückgesetzt, um einige typische Treiberfehler zu vermeiden. -Einige Grafikfunktionen werden ausgeschaltet. -Wir empfehlen die Aktualisierung Ihrer Grafikkartentreiber. -Sie können die Grafikqualität unter „Einstellungen“ > „Grafik“ wieder erhöhen. - </notification> - <notification name="RegionNoTerraforming"> - Die Region [REGION] erlaubt kein Terraforming. - </notification> - <notification name="CannotCopyWarning"> - Sie sind nicht berechtigt, dieses Objekt zu kopieren und verlieren es aus Ihrem Inventar, wenn Sie es weggeben. Möchten Sie dieses Objekt anbieten? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="CannotGiveItem"> - Inventarobjekt kann nicht übergeben werden. - </notification> - <notification name="TransactionCancelled"> - Transaktion abgebrochen. - </notification> - <notification name="TooManyItems"> - Es können maximal 42 Objekte auf einmal in das Inventar transferiert werden. - </notification> - <notification name="NoItems"> - Sie sind nicht berechtigt, die ausgewählten Objekte zu kopieren. - </notification> - <notification name="CannotCopyCountItems"> - Sie sind nicht berechtigt, [COUNT] der ausgewählten Objekte zu kopieren. Diese Objekte werden aus Ihrem Inventar gelöscht. -Möchten Sie diese Objekte weggeben? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="CannotGiveCategory"> - Sie sind nicht berechtigt, den ausgewählten Ordner zu kopieren. - </notification> - <notification name="FreezeAvatar"> - Diesen Avatar einfrieren? -Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten oder mit der Welt interagieren. - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Auftauen" yestext="Einfrieren"/> - </notification> - <notification name="FreezeAvatarFullname"> - [AVATAR_NAME] einfrieren? -Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten oder mit der Welt interagieren. - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Auftauen" yestext="Einfrieren"/> - </notification> - <notification name="EjectAvatarFullname"> - [AVATAR_NAME] von Ihrem Land werfen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Ausschließen und Verbannen" yestext="Ausschließen"/> - </notification> - <notification name="EjectAvatarNoBan"> - Diesen Avatar aus Ihrem Land werfen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/> - </notification> - <notification name="EjectAvatarFullnameNoBan"> - [AVATAR_NAME] aus Ihrem Land werfen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/> - </notification> - <notification name="AcquireErrorTooManyObjects"> - FEHLER: Zu viele Objekte ausgewählt. - </notification> - <notification name="AcquireErrorObjectSpan"> - FEHLER: Die Objekte überspannen mehrere Regionen. -Verschieben Sie alle betreffenden Objekte in dieselbe Region. - </notification> - <notification name="PromptGoToCurrencyPage"> - [EXTRA] - -[_URL] für Informationen zum Deviseneinkauf öffnen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="UnableToLinkObjects"> - Verknüpfung dieser [COUNT] Objekte nicht möglich. -Sie können maximal [MAX] Objekte verknüpfen. - </notification> - <notification name="CannotLinkIncompleteSet"> - Sie können nur vollständige Objektsätze verknüpfen und Sie müssen mehr als ein Objekt auswählen. - </notification> - <notification name="CannotLinkModify"> - Verknüpfung nicht möglich, da Sie nicht alle Objekte bearbeiten dürfen. - -Stellen Sie sicher, dass kein Objekt gesperrt ist und alle Objekte Ihnen gehören. - </notification> - <notification name="CannotLinkDifferentOwners"> - Verknüpfung nicht möglich, da nicht alle Objekte denselben Eigentümer haben. - -Stellen Sie sicher, dass alle ausgewählten Objekte Ihnen gehören. - </notification> - <notification name="NoFileExtension"> - Kein Dateityp für Datei: „[FILE]“ - -Vergewissern Sie sich, dass die Datei den richtigen Dateityp hat. - </notification> - <notification name="InvalidFileExtension"> - Ungültige Datei-Endung [EXTENSION] -Erwartet wurde [VALIDS] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotUploadSoundFile"> - Sounddatei konnte nicht hochgeladen werden: -[FILE] - </notification> - <notification name="SoundFileNotRIFF"> - Die Datei ist anscheinend keine RIFF WAVE-Datei: -[FILE] - </notification> - <notification name="SoundFileNotPCM"> - Die Datei ist anscheinend keine PCM WAVE-Audiodatei: -[FILE] - </notification> - <notification name="SoundFileInvalidChannelCount"> - Die Datei hat eine ungültige Anzahl Tonkanäle (muss Mono oder Stereo sein): -[FILE] - </notification> - <notification name="SoundFileInvalidSampleRate"> - Die Sample-Rate dieser Datei wird nicht unterstützt (muss 44,1 K sein): -[FILE] - </notification> - <notification name="SoundFileInvalidWordSize"> - Die Word-Größe dieser Datei wird nicht unterstützt (muss 8 oder 16 Bit sein): -[FILE] - </notification> - <notification name="SoundFileInvalidHeader"> - „Daten“-Chunk in WAV-Header nicht gefunden: -[FILE] - </notification> - <notification name="SoundFileInvalidTooLong"> - Audiodatei ist zu lang (max. 10 Sekunden): -[FILE] - </notification> - <notification name="ProblemWithFile"> - Problem mit Datei [FILE]: - -[ERROR] - </notification> - <notification name="CannotOpenTemporarySoundFile"> - Temporäre komprimierte Sounddatei konnte nicht geöffnet werden: [FILE] - </notification> - <notification name="UnknownVorbisEncodeFailure"> - Unbekannter Vorbis-Kodierungsfehler in: [FILE] - </notification> - <notification name="CannotEncodeFile"> - Datei konnte nicht kodiert werden: [FILE] - </notification> - <notification name="CorruptResourceFile"> - Ressourcendatei beschädigt: [FILE] - </notification> - <notification name="UnknownResourceFileVersion"> - Unbekannte Linden-Ressourcenversion in Datei: [FILE] - </notification> - <notification name="UnableToCreateOutputFile"> - Ausgabedatei konnte nicht erstellt werden: [FILE] - </notification> - <notification name="DoNotSupportBulkAnimationUpload"> - Der Mehrfach-Upload von Animationsdateien wird zurzeit nicht unterstützt. - </notification> - <notification name="CannotUploadReason"> - Datei [FILE] kann aus folgendem Grund nicht hochgeladen werden: [REASON] -Bitte versuchen Sie es erneut. - </notification> - <notification name="CannotCreateLandmarkNotOwner"> - Sie können hier keine Landmarke erstellen, da der Landeigentümer dies verboten hat. - </notification> - <notification name="CannotRecompileSelectObjectsNoScripts"> - „Rekompilieren“ nicht möglich. -Objekt mit Skript wählen. - </notification> - <notification name="CannotRecompileSelectObjectsNoPermission"> - „Rekompilieren“ nicht möglich. - -Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen. - </notification> - <notification name="CannotResetSelectObjectsNoScripts"> - „Zurücksetzen“ nicht möglich. - -Wählen Sie Objekte mit Skripts. - </notification> - <notification name="CannotResetSelectObjectsNoPermission"> - „Zurücksetzen“ nicht möglich. - -Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen. - </notification> - <notification name="CannotSetRunningSelectObjectsNoScripts"> - „Ausführen“ von Skripts nicht möglich. - -Wählen Sie Objekte mit Skripts. - </notification> - <notification name="CannotSetRunningNotSelectObjectsNoScripts"> - „Deaktivieren“ von Skripts nicht möglich. - -Wählen Sie Objekte mit Skripts. - </notification> - <notification name="NoFrontmostFloater"> - Kein vorderster Floater zum Speichern. - </notification> - <notification name="SeachFilteredOnShortWords"> - Ihre Suchanfrage wurde geändert. -Zu kurze Begriffe wurden entfernt. - -Ihre Suchanfrage: [FINALQUERY] - </notification> - <notification name="SeachFilteredOnShortWordsEmpty"> - Ihre Suchbegriffe sind zu kurz. -Es wurde keine Suche durchgeführt. - </notification> - <notification name="CouldNotTeleportReason"> - Teleport fehlgeschlagen. -[REASON] - </notification> - <notification name="invalid_tport"> - Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. Wenn Sie diese Nachricht weiterhin erhalten, konsultieren Sie bitte die Tech-Support-FAQ unter: -www.secondlife.com/support - </notification> - <notification name="invalid_region_handoff"> - Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen sich zum Wechsel der Region eventuell neu anmelden. Wenn Sie diese Nachricht weiterhin erhalten, konsultieren Sie bitte die Tech-Support-FAQ unter: -www.secondlife.com/support - </notification> - <notification name="blocked_tport"> - Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal. -Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an. - </notification> - <notification name="nolandmark_tport"> - Das System konnte das Landmarken-Ziel nicht finden. - </notification> - <notification name="timeout_tport"> - Das System konnte keine Teleport-Verbindung herstellen. -Versuchen Sie es später noch einmal. - </notification> - <notification name="noaccess_tport"> - Sie haben leider keinen Zugang zu diesem Teleport-Ziel. - </notification> - <notification name="missing_attach_tport"> - Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen. - </notification> - <notification name="too_many_uploads_tport"> - Die Asset-Warteschlange in dieser Region ist zurzeit überlastet. -Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region. - </notification> - <notification name="expired_tport"> - Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. - </notification> - <notification name="expired_region_handoff"> - Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. - </notification> - <notification name="no_host"> - Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut. - </notification> - <notification name="no_inventory_host"> - Das Inventarsystem ist zurzeit nicht verfügbar. - </notification> - <notification name="CannotSetLandOwnerNothingSelected"> - Landeigentümer kann nicht festgelegt werden: -Keine Parzelle ausgewählt. - </notification> - <notification name="CannotSetLandOwnerMultipleRegions"> - Eine erzwungene Landübertragung ist nicht möglich, da die Auswahl mehrere Regionen umfasst. Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut. - </notification> - <notification name="ForceOwnerAuctionWarning"> - Diese Parzelle steht zur Auktion. Eine zwangsweise Eigentumsübertragung beendet die Auktion und verärgert womöglich Einwohner, die bereits ein Gebot abgegeben haben. Eigentumsübertragung erzwingen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="CannotContentifyNothingSelected"> - Inhaltsidentifizierung nicht möglich: -Keine Parzelle ausgewählt. - </notification> - <notification name="CannotContentifyNoRegion"> - Inhaltsidentifizierung nicht möglich: -Keine Region ausgewählt. - </notification> - <notification name="CannotReleaseLandNothingSelected"> - Land kann nicht aufgegeben werden: -Keine Parzelle ausgewählt. - </notification> - <notification name="CannotReleaseLandNoRegion"> - Land kann nicht aufgegeben werden: -Region nicht gefunden. - </notification> - <notification name="CannotBuyLandNothingSelected"> - Land kann nicht gekauft werden: -Keine Parzelle ausgewählt. - </notification> - <notification name="CannotBuyLandNoRegion"> - Land kann nicht gekauft werden: -Kann die Region nicht finden, in der sich dieses Land befindet. - </notification> - <notification name="CannotCloseFloaterBuyLand"> - Das Fenster „Land kaufen“ kann erst geschlossen werden, nachdem [APP_NAME] den Transaktionspreis geschätzt hat. - </notification> - <notification name="CannotDeedLandNothingSelected"> - Land kann nicht übertragen werden: -Keine Parzelle ausgewählt. - </notification> - <notification name="CannotDeedLandNoGroup"> - Land kann nicht übertragen werden: -Keine Gruppe ausgewählt. - </notification> - <notification name="CannotDeedLandNoRegion"> - Land kann nicht übertragen werden: -Kann die Region nicht finden, in der sich dieses Land befindet. - </notification> - <notification name="CannotDeedLandMultipleSelected"> - Land kann nicht übertragen werden: -Mehrere Parzellen ausgewählt. - -Wählen Sie eine einzelne Parzelle. - </notification> - <notification name="ParcelCanPlayMedia"> - Dieser Ort kann Streaming-Medien abspielen. -Streaming-Medien erfordern eine schnelle Internet-Verbindung. - -Streaming-Medien abspielen, wenn verfügbar? -(Sie können diese Option später unter „Einstellungen“ > „Audio & Video“ ändern.) - <usetemplate name="okcancelbuttons" notext="Deaktivieren" yestext="Medien wiedergeben"/> - </notification> - <notification name="CannotDeedLandWaitingForServer"> - Land kann nicht übertragen werden: -Warte auf Server für Eigentümerinformationen. - -Bitte versuchen Sie es erneut. - </notification> - <notification name="CannotDeedLandNoTransfer"> - Land kann nicht übertragen werden: -Die Region [REGION] erlaubt keine Landübertragung. - </notification> - <notification name="CannotReleaseLandWatingForServer"> - Land kann nicht aufgegeben werden: -Server muss Parzelleninformation aktualisieren. - -Versuchen Sie es in einigen Sekunden erneut. - </notification> - <notification name="CannotReleaseLandSelected"> - Land kann nicht aufgegeben werden: -Die ausgewählten Parzellen gehören Ihnen nicht. - -Wählen Sie eine einzelne Parzelle. - </notification> - <notification name="CannotReleaseLandDontOwn"> - Land kann nicht aufgegeben werden: -Ihnen fehlt die Berechtigung zur Freigabe dieser Parzelle. -Parzellen, die Ihnen gehören, werden grün dargestellt. - </notification> - <notification name="CannotReleaseLandRegionNotFound"> - Land kann nicht aufgegeben werden: -Kann die Region nicht finden, in der sich dieses Land befindet. - </notification> - <notification name="CannotReleaseLandNoTransfer"> - Land kann nicht aufgegeben werden: -Die Region [REGION] erlaubt keine Landübertragung. - </notification> - <notification name="CannotReleaseLandPartialSelection"> - Land kann nicht aufgegeben werden: -Zum Freigeben müssen Sie eine ganze Parzelle auswählen. - -Wählen Sie eine ganze Parzelle oder teilen Sie Ihre Parzelle. - </notification> - <notification name="ReleaseLandWarning"> - Sie sind im Begriff, [AREA] qm Land aufzugeben. -Wenn Sie diese Parzelle aufgeben, wird sie ohne L$-Erstattung von Ihrem Landbesitz entfernt. - -Dieses Land aufgeben? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNothingSelected"> - Land kann nicht aufgeteilt werden: - -Keine Parzellen ausgewählt. - </notification> - <notification name="CannotDivideLandPartialSelection"> - Land kann nicht aufgeteilt werden: - -Sie haben eine ganze Parzelle ausgewählt. -Wählen Sie einen Parzellenabschnitt aus. - </notification> - <notification name="LandDivideWarning"> - Wenn Sie dieses Land teilen, wird diese Parzelle in zwei geteilt, jede mit ihren eigenen Einstellungen. Einige dieser Einstellungen werden aufgrund dieses Vorgangs zurückgesetzt. - -Land teilen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNoRegion"> - Land kann nicht aufgeteilt werden: -Kann die Region nicht finden, in der sich dieses Land befindet. - </notification> - <notification name="CannotJoinLandNoRegion"> - Land kann nicht zusammengelegt werden: -Kann die Region nicht finden, in der sich dieses Land befindet. - </notification> - <notification name="CannotJoinLandNothingSelected"> - Land kann nicht zusammengelegt werden: -Keine Parzellen ausgewählt. - </notification> - <notification name="CannotJoinLandEntireParcelSelected"> - Land kann nicht zusammengelegt werden: -Sie haben nur eine Parzelle ausgewählt. - -Wählen Sie Land auf beiden Parzellen aus. - </notification> - <notification name="CannotJoinLandSelection"> - Land kann nicht zusammengelegt werden: -Sie müssen mehrere Parzellen auswählen. - -Wählen Sie Land auf beiden Parzellen aus. - </notification> - <notification name="JoinLandWarning"> - Beim Zusammenlegen entsteht aus den vom Auswahlrechteck -erfassten Parzellen eine große Parzelle. -Sie müssen der neuen Parzelle einen Namen geben und ihre Optionen festlegen. - -Land zusammenlegen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ShowOwnersHelp"> - Eigentümer anzeigen: -Parzellen farblich kennzeichnen, um Eigentumsart anzuzeigen. - -Grün = Ihr Land -Blau = Das Land Ihrer Gruppe -Rot = Im Eigentum anderer -Geld = Zum Verkauf -Lila = Zur Auktion -Grau = Öffentlich - </notification> - <notification name="ConfirmNotecardSave"> - Um das Objekt kopieren oder anzeigen zu können, müssen Sie zuerst diese Notizkarte speichern. Notizkarte speichern? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmItemCopy"> - Dieses Objekt in Ihr Inventar kopieren? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Kopieren"/> - </notification> - <notification name="ResolutionSwitchFail"> - Auflösung konnte nicht auf [RESX] x [RESY] gesetzt werden - </notification> - <notification name="ErrorUndefinedGrasses"> - Fehler: Nicht definierte Gräser: [SPECIES] - </notification> - <notification name="ErrorUndefinedTrees"> - Fehler: Nicht definierte Bäume: [SPECIES] - </notification> - <notification name="CannotSaveWearableOutOfSpace"> - „[NAME]“ konnte nicht in Kleidungsdatei gespeichert werden. Geben Sie Speicherplatz auf dem Computer frei und speichern Sie das Kleidungsstück erneut. - </notification> - <notification name="CannotSaveToAssetStore"> - [NAME] kann nicht in Zentral-Asset-Speicher geladen werden. -Dies ist ein temporärer Fehler. Bitte passen Sie das Kleidungsstück in einigen Minuten noch einmal an und speichern Sie es erneut. - </notification> - <notification name="YouHaveBeenLoggedOut"> - Sie wurden von [SECOND_LIFE] abgemeldet: - [MESSAGE] -Klicken Sie auf „IM & Chat anzeigen“, um vorhandene Nachrichten und Chat weiterhin anzuzeigen. Klicken Sie andernfalls auf „Beenden“, um [APP_NAME] sofort zu beenden. - <usetemplate name="okcancelbuttons" notext="Beenden" yestext="IM & Chat anzeigen"/> - </notification> - <notification name="OnlyOfficerCanBuyLand"> - Landkauf für Gruppe nicht möglich: -Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen. - </notification> - <notification label="Freund hinzufügen" name="AddFriend"> - Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu verfolgen und Online-Status Benachrichtigungen zu empfangen. - -[NAME] Freundschaft anbieten? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification label="Freund hinzufügen" name="AddFriendWithMessage"> - Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu verfolgen und Online-Status Benachrichtigungen zu empfangen. - -[NAME] Freundschaft anbieten? - <form name="form"> - <input name="message"> - Wollen wir Freunde sein? - </input> - <button name="Offer" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="RemoveFromFriends"> - Möchten Sie [FIRST_NAME] [LAST_NAME] aus Ihrer Freundesliste entfernen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="RemoveMultipleFromFriends"> - Möchten Sie mehrere Freunde aus Ihrer Freundesliste entfernen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="GodDeleteAllScriptedPublicObjectsByUser"> - Möchten Sie alle geskripteten Objekte von -** [AVATAR_NAME] ** -auf allen anderen Ländern in diesem Sim löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="GodDeleteAllScriptedObjectsByUser"> - Möchten Sie ALLE geskripteten Objekte von -** [AVATAR_NAME] ** -auf ALLEN LÄNDERN in diesem Sim LÖSCHEN? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="GodDeleteAllObjectsByUser"> - Möchten Sie ALLE Objekte (einschließlich geskriptete) von -** [AVATAR_NAME] ** -auf ALLEN LÄNDERN in diesem Sim LÖSCHEN? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BlankClassifiedName"> - Geben Sie einen Namen für die Anzeige ein. - </notification> - <notification name="MinClassifiedPrice"> - Der Mindestbetrag für die Listung ist [MIN_PRICE] L$. - -Geben sie einen höheren Betrag ein. - </notification> - <notification name="ConfirmObjectDeleteLock"> - Mindestens ein ausgewähltes Objekt ist gesperrt. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopy"> - Mindestens ein ausgewähltes Objekt kann nicht kopiert werden. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoOwn"> - Mindestens eines der ausgewählten Objekt gehört nicht Ihnen. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopy"> - Mindestens ein Objekt ist gesperrt. -Mindestens ein Objekt kann nicht kopiert werden. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoOwn"> - Mindestens ein Objekt ist gesperrt. -Mindestens ein Objekt gehört nicht Ihnen. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - Mindestens ein Objekt kann nicht kopiert werden. -Mindestens ein Objekt gehört nicht Ihnen. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> - Mindestens ein Objekt ist gesperrt. -Mindestens ein Objekt kann nicht kopiert werden. -Mindestens ein Objekt gehört nicht Ihnen. - -Möchten Sie diese Objekte löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLock"> - Mindestens ein Objekt ist gesperrt. - -Möchten Sie diese Objekte nehmen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeNoOwn"> - Nicht alle Objekte, die Sie aufgenommen haben, gehören Ihnen. -Wenn Sie fortfahren, werden die Rechte für den nächsten Eigentümer angewandt und Sie können die Objekte möglicherweise nicht bearbeiten oder kopieren. - -Möchten Sie diese Objekte nehmen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLockNoOwn"> - Mindestens ein Objekt ist gesperrt. -Nicht alle Objekte, die Sie aufgenommen haben, gehören Ihnen. -Wenn Sie fortfahren, werden die Rechte für den nächsten Eigentümer abgefragt und Sie können die Objekte möglicherweise nicht bearbeiten oder kopieren. -Die aktuelle Auswahl können Sie jedoch aufnehmen. - -Möchten Sie diese Objekte nehmen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="CantBuyLandAcrossMultipleRegions"> - Landkauf nicht möglich, da die Auswahl mehrere Regionen umfasst. - -Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut. - </notification> - <notification name="DeedLandToGroup"> - Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt. -Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt. - -Der Gruppe „[GROUP_NAME]“ - [AREA] m² Land schenken? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="DeedLandToGroupWithContribution"> - Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt. -Die Schenkung beinhaltet eine Landübertragung an die Gruppe von „[FIRST_NAME] [LAST_NAME]“. -Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt. - -Der Gruppe „[GROUP_NAME]“ - [AREA] m² Land schenken? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="DisplaySetToSafe"> - Es wurden sichere Anzeige-Einstellungen gewählt, da die Option -safe verwendet wurde. - </notification> - <notification name="DisplaySetToRecommended"> - Es wurden die für Ihre Systemkonfiguration empfohlenen Anzeige-Einstellungen gewählt. - </notification> - <notification name="ErrorMessage"> - [ERROR_MESSAGE] - </notification> - <notification name="AvatarMoved"> - Ihr [TYPE]-Ort ist zurzeit nicht verfügbar. [HELP] -Sie wurden zur nächstgelegenen Region teleportiert. - </notification> - <notification name="ClothingLoading"> - Ihre Kleidung wird noch heruntergeladen. -Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt dargestellt sehen. - <form name="form"> - <ignore name="ignore" text="Wenn das Herunterladen von Kleidung lange dauert"/> - </form> - </notification> - <notification name="FirstRun"> - Die Installation von [APP_NAME] ist abgeschlossen. - -Wenn Sie [SECOND_LIFE] das erste Mal verwenden, müssen Sie ein Konto anlegen, bevor Sie sich anmelden können. -Möchten Sie auf www.secondlife.com ein Konto erstellen? - <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Neues Konto..."/> - </notification> - <notification name="LoginPacketNeverReceived"> - Die Verbindung kann nicht hergestellt werden. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder den [SECOND_LIFE]-Servern. - -Ãœberprüfen Sie Ihre Internetverbindung und versuchen Sie es dann erneut, oder klicken Sie auf „Hilfe“, um zu unserer Supportseite zu gelangen, oder klicken Sie auf „Teleportieren“, um nach Hause zu teleportieren. - <form name="form"> - <button name="OK" text="OK"/> - <button name="Help" text="Hilfe"/> - <button name="Teleport" text="Teleportieren"/> - </form> - </notification> - <notification name="WelcomeChooseSex"> - Ihr Avatar erscheint jeden Moment. - -Benutzen Sie die Pfeiltasten, um sich fortzubewegen. -Drücken Sie F1 für Hilfe oder für weitere Informationen über [SECOND_LIFE]. -Bitte wählen Sie einen männlichen oder weiblichen Avatar. -Sie können sich später noch umentscheiden. - <usetemplate name="okcancelbuttons" notext="Weiblich" yestext="Männlich"/> - </notification> - <notification name="NotEnoughCurrency"> - [NAME] [PRICE] L$ Sie haben nicht genügend L$, um diese Aktion auszuführen. - </notification> - <notification name="GrantedModifyRights"> - Sie verfügen über Änderungsrechte für die Objekte von [FIRST_NAME] [LAST_NAME]. - </notification> - <notification name="RevokedModifyRights"> - Ihnen wurden die Änderungsrechte für die Objekte von [FIRST_NAME] [LAST_NAME] entzogen. - </notification> - <notification name="FlushMapVisibilityCaches"> - Der Kartencache dieser Region wird geleert. -Diese Aktion ist nur beim Debugging sinnvoll. -(Auf dem Produktionssystem warten Sie einfach 5 Minuten. Die Karten werden nach erneuter Anmeldung automatisch aktualisiert.) - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BuyOneObjectOnly"> - Sie können jeweils nur ein Objekt kaufen. Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. - </notification> - <notification name="OnlyCopyContentsOfSingleItem"> - Es kann nur jeweils der Inhalt von einem Objekt kopiert werden. -Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="KickUsersFromRegion"> - Alle Einwohner in dieser Region nach Hause teleportieren? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="EstateObjectReturn"> - Möchten Sie wirklich alle Objekte zurückgeben, die [USER_NAME] gehören? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="InvalidTerrainBitDepth"> - Die Regionstexturen konnten nicht festgelegt werden: -Die Terraintextur [TEXTURE_NUM] hat eine ungültige Bit-Tiefe [TEXTURE_BIT_DEPTH]. - -Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 und 24 Bit und klicken Sie dann erneut auf „Übernehmen“. - </notification> - <notification name="InvalidTerrainSize"> - Die Regionstexturen konnten nicht festgelegt werden: -Die Terraintextur [TEXTURE_NUM] ist mit [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y] zu groß. - -Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 und 24 Bit und klicken Sie dann erneut auf „Übernehmen“. - </notification> - <notification name="RawUploadStarted"> - Hochladen gestartet. Je nach Verbindungsgeschwindigkeit kann der Vorgang bis zu 2 Minuten dauern. - </notification> - <notification name="ConfirmBakeTerrain"> - Möchten Sie das aktuelle Terrain formen, es zum Mittelpunkt der oberen und unteren Terraingrenzen und zum Standard des „Zurücksetzen“-Tools machen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="MaxAllowedAgentOnRegion"> - Es sind maximal [MAX_AGENTS] zulässige Einwohner erlaubt. - </notification> - <notification name="MaxBannedAgentsOnRegion"> - Es sind maximal [MAX_BANNED] verbannte Einwohner erlaubt. - </notification> - <notification name="MaxAgentOnRegionBatch"> - Fehler beim Versuch, [NUM_ADDED] Agenten hinzuzufügen: -Ãœberschreitet den Grenzwert [MAX_AGENTS] [LIST_TYPE] um [NUM_EXCESS]. - </notification> - <notification name="MaxAllowedGroupsOnRegion"> - Es sind maximal [MAX_GROUPS] zulässige Gruppen erlaubt. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Formen"/> - </notification> - <notification name="MaxManagersOnRegion"> - Es sind maximal [MAX_MANAGER] verbannte Einwohner erlaub. - </notification> - <notification name="OwnerCanNotBeDenied"> - Der Eigentümer des Grundstücks kann nicht zur Liste der „Verbannten Einwohner“ hinzugefügt werden. - </notification> - <notification name="CanNotChangeAppearanceUntilLoaded"> - Das Aussehen lässt sich erst ändern, wenn Kleider und Form/Gestalt geladen sind. - </notification> - <notification name="ClassifiedMustBeAlphanumeric"> - Der Name der Anzeige muss mit einem Buchstaben von A bis Z oder einer Ziffer beginnen. Satzzeichen sind nicht erlaubt. - </notification> - <notification name="CantSetBuyObject"> - „Objekt kaufen“ nicht möglich, da das Objekt nicht zum Verkauf freigegeben ist. -Geben Sie das Objekt zum Verkauf frei und versuchen Sie es erneut. - </notification> - <notification name="FinishedRawDownload"> - Raw-Terrain-Datei wurde heruntergeladen nach: -[DOWNLOAD_PATH]. - </notification> - <notification name="DownloadWindowsMandatory"> - Eine neue Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können. - <usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/> - </notification> - <notification name="DownloadWindows"> - Eine aktualisierte Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. - <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> - </notification> - <notification name="DownloadWindowsReleaseForDownload"> - Eine aktualisierte Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. - <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> - </notification> - <notification name="DownloadMacMandatory"> - Eine neue Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können. - -In Ihren Anwendungsordner herunterladen? - <usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/> - </notification> - <notification name="DownloadMac"> - Eine aktualisierte Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. - -In Ihren Anwendungsordner herunterladen? - <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> - </notification> - <notification name="DownloadMacReleaseForDownload"> - Eine aktualisierte Version von [APP_NAME] ist verfügbar. -[MESSAGE] -Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. - -In Ihren Anwendungsordner herunterladen? - <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> - </notification> - <notification name="DeedObjectToGroup"> - Bei Ãœbertragung dieses Objekts erhält die Gruppe: -* An das Objekt bezahlte L$ - <usetemplate ignoretext="Beim Ãœbertragen von Objekten an Gruppen" name="okcancelignore" notext="Abbrechen" yestext="Ãœbertragung"/> - </notification> - <notification name="WebLaunchExternalTarget"> - Den System-Webbrowser öffnen, um diesen Inhalt anzuzeigen? - <usetemplate ignoretext="Wenn der System-Webbrowser zur Anzeige einer Webseite geöffnet wird" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="WebLaunchJoinNow"> - Zu www.secondlife.com, um Ihr Konto zu verwalten? - <usetemplate ignoretext="Beim Starten eines Browsers, um Ihr Konto zu verwalten" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="WebLaunchSecurityIssues"> - Informieren Sie sich im [SECOND_LIFE] Wiki, wie man Sicherheitsprobleme richtig meldet. - <usetemplate ignoretext="Beim Starten eines Browsers, um das Sicherheitsfragen-Wiki anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="WebLaunchQAWiki"> - Besuchen Sie das [SECOND_LIFE] QA-Wiki. - <usetemplate ignoretext="Beim Starten eines Browsers, um das QA-Wiki anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="WebLaunchPublicIssue"> - Im [SECOND_LIFE] Allgemeine-Fragen-Tracker können Sie Fehler und andere Probleme melden. - <usetemplate ignoretext="Beim Starten eines Browsers, um den Allgemeine Probleme Tracker anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> - </notification> - <notification name="WebLaunchPublicIssueHelp"> - Informieren Sie sich im [SECOND_LIFE] Wiki über den Allgemeine Fragen-Tracker. - <usetemplate ignoretext="Beim Starten eines Browsers, um das Allgemeine Fragen-Wiki anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> - </notification> - <notification name="WebLaunchSupportWiki"> - Im offiziellen Linden-Blog finden Sie die neuesten Nachrichten und Informationen. - <usetemplate ignoretext="Beim Starten eines Browsers, um das Blog anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="WebLaunchLSLGuide"> - Zur Scripting-Anleitung, um Scripting-Hilfe zu erhalten? - <usetemplate ignoretext="Beim Starten eines Browsers, um die Scripting-Anleitung anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="WebLaunchLSLWiki"> - Zum LSL-Portal, um Scripting-Hilfe zu erhalten? - <usetemplate ignoretext="Beim Starten eines Browsers, um das LSL-Portal anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> - </notification> - <notification name="ReturnToOwner"> - Möchten Sie die ausgewählten Objekte an ihre Eigentümer zurückgeben? Transferierbare übertragene Objekte werden ihren früheren Eigentümern zurückgegeben. - -*WARNUNG* Nicht transferierbare übertragene Objekte werden dabei gelöscht! - <usetemplate ignoretext="Beim Zurückgeben von Objekten an ihre Eigentümer" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="GroupLeaveConfirmMember"> - Sie sind Mitglied der Gruppe [GROUP]. -Diese Gruppe verlassen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmKick"> - Möchten Sie WIRKLICH alle Benutzer aus dem Grid werfen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Alle Benutzer hinauswerfen"/> - </notification> - <notification name="MuteLinden"> - Lindens können nicht stummgeschaltet werden. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotStartAuctionAlreadyForSale"> - Eine Parzelle, die bereits zum Verkauf freigegeben ist, kann nicht versteigert werden. Deaktivieren Sie den Landverkauf, wenn Sie das Land zur Versteigerung freigeben möchten. - </notification> - <notification label="Objekt nach Name stummschalten fehlgeschlagen" name="MuteByNameFailed"> - Dieser Name ist bereits stummgeschaltet. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RemoveItemWarn"> - Diese Aktion ist zwar erlaubt, aber beim Löschen von Inhalten wird das Objekt beschädigt. Möchten Sie dieses Element löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="CantOfferCallingCard"> - Sie können gerade keine Visitenkarte übergeben. Warten Sie kurz und versuchen Sie es dann noch einmal. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CantOfferFriendship"> - Sie können gerade keine Freundschaft anbieten. Warten Sie kurz und versuchen Sie es dann noch einmal. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="BusyModeSet"> - Beschäftigt-Modus aktiviert. -Chat und Instant Messages werden ausgeblendet. Instant Messages erhalten Ihre Beschäftigt-Antwort. Alle Teleport-Angebote werden ausgeschlagen. Alle Inventar-Angebote werden in den Papierkorb verschoben. - <usetemplate ignoretext="Beim Aktivieren des Beschäftigt-Modus" name="okignore" yestext="OK"/> - </notification> - <notification name="JoinedTooManyGroupsMember"> - Sie sind bereits in zu vielen Gruppen Mitglied und können keiner weiteren beitreten. Bitte verlassen Sie eine Gruppe, bevor Sie dieser beitreten oder lehnen Sie das Angebot ab. -Die Option zum Austritt aus einer Gruppe finden Sie unter „Bearbeiten“ > „Gruppen...“. -[NAME] hat Sie eingeladen, einer Gruppe beizutreten. -[INVITE] - <usetemplate name="okcancelbuttons" notext="Ablehnen" yestext="Beitreten"/> - </notification> - <notification name="KickUser"> - Beim Hinauswerfen dieses Benutzers welche Meldung anzeigen? - <form name="form"> - <input name="message"> - Sie wurden von einem Administrator abgemeldet. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="KickAllUsers"> - Beim Hinauswerfen aller Personen vom Grid welche Meldung anzeigen? - <form name="form"> - <input name="message"> - Sie wurden von einem Administrator abgemeldet. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="FreezeUser"> - Beim Einfrieren dieses Benutzers welche Meldung anzeigen? - <form name="form"> - <input name="message"> - Sie wurden eingefroren. Bewegen oder Chatten ist nicht mehr möglich. Ein Administrator wird sich über IM an Sie wenden - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="UnFreezeUser"> - Beim Auftauen dieses Benutzers welche Meldung anzeigen? - <form name="form"> - <input name="message"> - Sie sind nicht mehr eingefroren. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="OfferTeleport"> - Teleport an Ihre Position mit der folgenden Meldung anbieten? - <form name="form"> - <input name="message"> - Triff mich in [REGION] - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="OfferTeleportFromGod"> - Benutzer an Ihrem Standort herbeirufen? - <form name="form"> - <input name="message"> - Triff mich in [REGION] - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="TeleportFromLandmark"> - Möchten Sie sich wirklich teleportieren? - <usetemplate ignoretext="Beim Teleportieren von einer Landmarke im Inventar" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/> - </notification> - <notification label="Nachricht an alle auf diesem Grundstück" name="MessageEstate"> - Geben Sie eine kurze Nachricht ein, die an jede Person auf Ihrem Grundstück gesendet wird. - <form name="form"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification label="Linden-Grundstück ändern" name="ChangeLindenEstate"> - Sie sind im Begriff, ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern. - -Dies ist ÄUSSERST GEFÄHRLICH, da es grundlegende Auswirkungen auf das Benutzererlebnis hat. Auf dem Mainland werden tausende Regionen geändert, was den Spaceserver stark belastet. - -Fortfahren? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification label="Zugang zu Linden-Grundstück ändern" name="ChangeLindenAccess"> - Sie sind im Begriff, die Zugangsliste für ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern. - -Dies ist GEFÄHRLICH und sollte nur erfolgen, um Objekte/L$ per Hack in und aus dem Raster zu entfernen. -Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belastet. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification label="Grundstück wählen" name="EstateAllowedAgentAdd"> - Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Erlaubnisliste hinzufügen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> - </notification> - <notification label="Grundstück wählen" name="EstateAllowedAgentRemove"> - Nur für dieses Grundstück oder für alle [ALL_ESTATES] von Erlaubnisliste entfernen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> - </notification> - <notification label="Grundstück wählen" name="EstateAllowedGroupAdd"> - Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Gruppen-Erlaubnisliste hinzufügen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> - </notification> - <notification label="Grundstück wählen" name="EstateAllowedGroupRemove"> - Nur für dieses Grundstück oder für alle [ALL_ESTATES] von Gruppen-Erlaubnisliste entfernen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> - </notification> - <notification label="Grundstück wählen" name="EstateBannedAgentAdd"> - Zugang nur für dieses Grundstück oder für [ALL_ESTATES] verweigern? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> - </notification> - <notification label="Grundstück wählen" name="EstateBannedAgentRemove"> - Einwohner nur für dieses Grundstück oder für alle [ALL_ESTATES] von der Bannliste entfernen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> - </notification> - <notification label="Grundstück wählen" name="EstateManagerAdd"> - Verwalter nur für dieses Grundstück oder für [ALL_ESTATES] festlegen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> - </notification> - <notification label="Grundstück wählen" name="EstateManagerRemove"> - Verwalter nur für dieses Grundstück oder für [ALL_ESTATES] entfernen? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> - </notification> - <notification label="Rauswurf bestätigen" name="EstateKickUser"> - Benutzer [EVIL_USER] von diesem Grundstück werfen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="EstateChangeCovenant"> - Möchten Sie den Grundstücksvertrag wirklich ändern? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="RegionEntryAccessBlocked"> - Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind. - -Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RegionEntryAccessBlocked_KB"> - Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. - -Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten? - <url name="url"> - http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB) - </url> - <usetemplate ignoretext="Wenn Regionzugang aufgrund von Alterseinstufung gesperrt ist" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/> - </notification> - <notification name="RegionEntryAccessBlocked_Notify"> - Aufgrund Ihrer Alterseinstufung dürfen Sie diese Region nicht betreten. - </notification> - <notification name="RegionEntryAccessBlocked_Change"> - Sie dürfen diese Region aufgrund der Einstellung Ihrer Alterseinstufung nicht betreten. - -Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten > Einstellungen... > Allgemein. - <form name="form"> - <button - name="OK" - text="Einstellung ändern"/> - <button - name="Cancel" - text="Schließen"/> - <ignore name="ignore" text="Wenn Regionzugang aufgrund von Einstellung für Alterseinstufung gesperrt ist"/> - </form> - </notification> - <notification name="LandClaimAccessBlocked"> - Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind. - -Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandClaimAccessBlocked_KB"> - Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. - -Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten? - <url name="url"> - http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB) - </url> - <usetemplate ignoretext="Wenn Landanspruch aufgrund von Alterseinstufung gesperrt ist" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/> - </notification> - <notification name="LandClaimAccessBlocked_Notify"> - Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. - </notification> - <notification name="LandClaimAccessBlocked_Change"> - Sie haben aufgrund der Einstellung Ihrer Alterseinstufung keinen Anspruch auf dieses Land. - -Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten > Einstellungen... > Allgemein. - <usetemplate ignoretext="Wenn Landanspruch aufgrund von Einstellung der Alterseinstufung gesperrt ist" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/> - </notification> - <notification name="LandBuyAccessBlocked"> - Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind. - -Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandBuyAccessBlocked_KB"> - Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. - -Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten? - <url name="url"> - http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB) - </url> - <usetemplate ignoretext="Wenn Landkauf aufgrund von Alterseinstufung gesperrt ist" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/> - </notification> - <notification name="LandBuyAccessBlocked_Notify"> - Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. - </notification> - <notification name="LandBuyAccessBlocked_Change"> - Sie können aufgrund Ihrer Einstellung für Alterseinstufung dieses Land nicht kaufen. - -Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten > Einstellungen... > Allgemein. - <usetemplate ignoretext="Wenn Landkauf aufgrund von Einstellung für Alterseinstufung gesperrt ist" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/> - </notification> - <notification name="TooManyPrimsSelected"> - "Zu viele Prims wurden ausgewählt. Bitte wählen Sie höchstens [MAX_PRIM_COUNT] Prims aus und versuchen Sie es erneut." - </notification> - <notification name="ProblemImportingEstateCovenant"> - Problem beim Import des Grundstückvertrags. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ProblemAddingEstateManager"> - Es gibt Probleme beim Hinzufügen eines neuen Grundstücksverwalters. Bei mindestens einem Grundstück ist die Verwalterliste voll. - </notification> - <notification name="ProblemAddingEstateGeneric"> - Problem beim Hinzufügen zu dieser Grundstücksliste. Bei mindestens einem Grundstück ist die Liste voll. - </notification> - <notification name="UnableToLoadNotecardAsset"> - Notizkarten-Asset konnte nicht geladen werden. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="NotAllowedToViewNotecard"> - Unzureichende Rechte, um die mit der angeforderten Asset-ID verbundene Notizkarte anzuzeigen. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MissingNotecardAssetID"> - Asset-ID für Notizkarte fehlt in Datenbank. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PublishClassified"> - Hinweis: Anzeigengebühren werden nicht zurückerstattet. - -Anzeige für [AMOUNT] L$ veröffentlichen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="SetClassifiedMature"> - Enthält diese Anzeige Mature-Inhalte? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="SetGroupMature"> - Beschäftigt sich diese Gruppe mit Mature-Inhalten? - <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification label="Neustart bestätigen" name="ConfirmRestart"> - Möchten Sie diese Region in 2 Minuten neu starten? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification label="Nachricht an alle in dieser Region" name="MessageRegion"> - Geben Sie eine kurze Nachricht ein, die an jede Person in dieser Region gesendet wird. - <form name="form"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification label="Terraformen blockieren" name="HelpRegionBlockTerraform"> - Wenn diese Option aktiviert ist, können Landeigentümer Ihr Land nicht terraformen. Ausgenommen davon ist die parzelleneigene Einstellung „Terrain bearbeiten“. - -Standard: deaktiviert - </notification> - <notification label="Fliegen blockieren" name="HelpRegionBlockFly"> - Wenn diese Option aktiviert ist, ist Fliegen in dieser Region nicht möglich, auch wenn für die Parzelle eine andere Einstellung aktiv ist. - -Standard: deaktiviert - </notification> - <notification label="Mehrere Inhaltsberechtigungen ändern" name="HelpBulkPermission"> - Mit dem Werkzeug „Mehrere Berechtigungen“ können Sie Berechtigungen für mehrere Objekte in den Inhalten des ausgewählten Objekts schnell ändern. Bitte beachten Sie, dass Sie nur Berechtigungen an den Objekten im Inhalt der ausgewählten Objekte einstellen, nicht Berechtigungen an dem/den Container-Objekt(en=) selbst. - -Bitte beachten Sie auch, dass die Berechtigungen nicht auf eingebettete Inhalte der enthaltenen Objekte angewandt werden. Ihre Auftrag wird nur an Objekten ausgeführt, die sie sich in diesem Level befinden. - -Sie können auswählen, welche Objektarten Sie ändern möchten, indem Sie diese in der Liste unter „Inhaltsarten“ auswählen. Wenn Sie Texturen auswählen, sind Fotos mit eingeschlossen. - -* Mit diesem Werkzeug können Sie nur an Objekten, die Sie ändern dürfen, Änderungen vornehmen. -* Sie können dem nächsten Eigentümer keine Berechtigungen geben, die Sie nicht besitzen. -* Die Berechtigungen für den nächsten Eigentümer sind nur Anfragen. Wenn ein Objekt nicht alle Berechtigungen annehmen kann, dann werden keine seiner Berechtigungen geändert. - -Wenn Sie bereit sind, die Berechtigungen mehrfach zu ändern, klicken Sie auf Ãœbernehmen und warten Sie, bis die Ergebnisse angezeigt werden. - -Wenn Sie das Fenster „Mehrfach-Berechtigungen“ schließen, während die Berechtigungen geändert werden, wird der Vorgang gestoppt. - </notification> - <notification label="Schaden zulassen" name="HelpRegionAllowDamage"> - Wenn diese Option aktiviert ist, ist das Gesundheitssystem auf allen Parzellen aktiviert, unabhängig von den Parzelleneinstellungen. Ist die Option links deaktiviert, können die Parzelleneigentümer das Gesundheitssystem individuell einschalten. - -Standard: deaktiviert - </notification> - <notification label="Avatar-Limit" name="HelpRegionAgentLimit"> - Legt die maximale Anzahl an Avataren für diese Region fest. -Die Leistung hängt von der Anzahl der Avatare in der Region ab. - -Standard: 40 - </notification> - <notification label="Objektbonus" name="HelpRegionObjectBonus"> - Der Objektbonus ist ein Multiplikator für die Anzahl an zulässigen Primitiven auf einer Parzelle. Gültig sind Werte zwischen 1 und 10. „1“ erlaubt auf einer 512 qm großen Parzelle 117 Objekte. „2“ erlaubt auf einer 512 qm großen Parzelle 234 Objekte, also die doppelte Menge. Die maximale Objektanzahl in einer Region beträgt unabhängig vom Objektbonus 15.000. -Eine nachträglich Senkung des Objektbonus führt dazu, dass Objekte zurückgegeben oder gelöscht werden. - -Standard: 1.0 - </notification> - <notification label="Alterseinstufung" name="HelpRegionMaturity"> - Legt die Alterseinstufung für die Region fest. Dies wird in der Menüleiste oben im Viewer angezeigt und auch in den Kurzinfos auf der Weltkarte, wenn der Cursor über diese Region schwebt. Diese Einstellung wirkt sich auch auf den Zugang zu dieser Region und die Suchergebnisse aus. Andere Einwohner können Regionen nur dann betreten oder Suchergebnisse anzeigen, wenn Ihre Alterseinstufung in Ihren Einstellungen der Alterseinstellung der Region bzw. Suchergebnisse entsprechen. - -Es kann eine Weile dauern, bis diese Änderung auf der Karte angezeigt wird. - </notification> - <notification label="Stoßen beschränken" name="HelpRegionRestrictPushObject"> - Aktivieren sie diese Option, um in der gesamten Region das Stoßen zu beschränken. Wenn aktiviert, können Einwohner nur von sich selbst oder vom Parzelleneigentümer gestoßen werden. -(Stoßen meint die LSL-Funktion llPushObject().) - -Standard: deaktiviert - </notification> - <notification label="Parzelle zusammenlegen/teilen" name="HelpParcelChanges"> - Dieses Kontrollkästchen steuert, ob Parzellen des Grundstückseigentümers zusammengelegt bzw. unterteilt werden können. Wenn deaktiviert: - * Nur Grundstückseigentümer bzw. –verwalter können Parzellen zusammenlegen/teilen. * Sie können nur Parzellen zusammenlegen/teilen, die dem Eigentümer oder einer Gruppe gehören, bei der sie entsprechende Gruppenrechte innehaben. -Wenn aktiviert: - * Die Parzelleneigentümer können ihre Parzellen selbst zusammenlegen/teilen. - * Parzellen in Gruppeneigentum können von Mitgliedern mit den entsprechenden Rechten zusammengelegt bzw. unterteilt werden. - -Standard: aktiviert - </notification> - <notification label="Nicht in Suche anzeigen" name="HelpRegionSearch"> - Wenn Sie diese Option auswählen, können Parzelleneigentümer ihre Parzellen nicht in der Suche anzeigen lassen - -Standard: deaktiviert - </notification> - <notification label="Alterseinstufung der Region ändern" name="RegionMaturityChange"> - Die Alterseinstufung dieser Region wurde aktualisiert. -Es kann eine Weile dauern, bis sich die Änderung auf die Karte auswirkt. - </notification> - <notification label="Landwiederverkauf" name="HelpRegionLandResell"> - Grundstückseigentümer und -verwalter können jedes Land im Besitz des Grundstückseigentümers verkaufen. -Ist diese Option deaktiviert, können Käufer ihr Land in dieser Region nicht weiterverkaufen. -Ist die Option aktiviert, können Käufer ihr Land in dieser Region weiterverkaufen. - -Standard: deaktiviert - </notification> - <notification label="Skripts deaktivieren" name="HelpRegionDisableScripts"> - Schlechte Sim-Performance ist oftmals auf ein Skript zurückzuführen. Öffnen Sie die Statistikleiste (Strg+Umschalt+1). Sehen Sie sich den Wert für „Simulator Physics FPS“ (Simulator Physik-FPS) an. -Wenn der Wert unter 45 liegt, öffnen Sie den Bereich „Time“ (Zeit) ganz unten in der Statistikleiste. Wenn der Wert für „Script Time“ (Skriptzeit) 25 ms oder höher ist, klicken Sie auf „Top-Skripts“. Der Name und die Position der Skripts, die für die schlechte Performance verantwortlich sind, werden angezeigt. -Wenn Sie das Kontrollkästchen „Skripts deaktivieren“ aktivieren und auf „Übernehmen“ klicken, werden alle Skripts in der Region zeitweilig deaktiviert. Dieser Schritt ist eventuell notwendig, damit Sie an die Position des gemeldeten „Top-Skripts“ reisen können. Sobald Sie dort angekommen sind, sollten Sie das Skript auf die Ursache des Problems hin untersuchen. Möglicherweise müssen Sie sich an den Skript-Eigentümer wenden oder das Objekt löschen bzw. zurückgeben. Um die Skripte in der Region wieder zu aktivieren, deaktivieren Sie „Skript deaktivieren“ und klicken Sie auf „Übernehmen“. - -Standard: deaktiviert - </notification> - <notification label="Kollisionen deaktivieren" name="HelpRegionDisableCollisions"> - Schlechte Sim-Performance ist oftmals auf physische Objekte zurückzuführen. -Öffnen Sie die Statistikleiste (Strg+Umschalt+1). Sehen Sie sich den Wert „Simulator Physics FPS“ an. Liegt dieser unter 45, öffnen Sie unten in der Statistikleiste den „Time“-Bereich. Liegt die „Sim Time (Physics)“ bei 20 ms oder darüber, klicken Sie auf „Top-Kollisionsobjekte“. -Der Name und der Standort der physischen Objekte, die das Problem verursachen, werden angezeigt. - -Wenn Sie das Kontrollkästchen „Kollisionen deaktivieren“ aktivieren und auf „Übernehmen“ klicken, werden alle Objekt-Objekt-Kollisionen in der Region zeitweilig deaktiviert. Dieser Schritt ist eventuell notwendig, damit Sie an die Position des gemeldeten „Top-Kollisionsobjekts“ reisen können. Ãœberprüfen Sie das Objekt an der angegebenen Position. -Kollidiert es ständig mit anderen Objekten? Wenden Sie sich eventuell an den Eigentümer des Objekts, löschen Sie es oder geben Sie es zurück. -Deaktivieren Sie die Option „Kollisionen deaktivieren“ und klicken Sie auf „Übernehmen“, um Kollisionen in dieser Region wieder zu aktivieren. - -Standard: deaktiviert - </notification> - <notification label="Physik deaktivieren" name="HelpRegionDisablePhysics"> - Das Deaktivieren der Physik ähnelt dem Deaktivieren von Kollisionen, außer dass die gesamte Physiksimulation ausgeschaltet wird. Das hat nicht nur zur Folge, dass Objekte nicht mehr kollidieren, sondern dass Avatare sich nicht mehr bewegen können. - -Diese Option sollte nur verwendet werden, wenn das Deaktivieren von Kollisionen keine ausreichende Leistungssteigerung bringt, um Physikprobleme in der Region oder die Top-Kollisionsobjekte zu erkennen. - -Schalten Sie die Physiksimulation hinterher wieder ein. Andernfalls können sich Avatare nicht mehr bewegen. - -Standard: deaktiviert - </notification> - <notification label="Top-Kollisionsobjekte" name="HelpRegionTopColliders"> - Zeigt eine Liste der Objekte mit den potenziell meisten Objekt-Objekt-Kollisionen an. Diese Objekte können die Leistung beeinträchtigen. Wählen Sie „Ansicht“ > „Statistikleiste“ aus und sehen Sie unter „Simulator“ > „Time“ > „Sim Time (Physics)“ nach, ob die Physikberechnung länger als 20 ms dauert. - </notification> - <notification label="Top-Skripts" name="HelpRegionTopScripts"> - Zeigt eine Liste der Objekte an, die die meiste Zeit benötigen, um LSL-Skripts auszuführen. Diese Objekte können die Leistung beeinträchtigen. -Wählen Sie „Ansicht“ > „Statistikleiste“ und sehen Sie unter „Simulator“ > „Time“ > „Script Time“ nach, ob mehr als 25 ms für Skripts benötigt werden. - </notification> - <notification label="Region neu starten" name="HelpRegionRestart"> - Starten Sie den Serverprozess für diese Region nach der 2-Minuten-Warnung neu. Die Verbindung aller Einwohner in dieser Region wird getrennt. Die Region wird gespeichert und sollte nach 90 Sekunden wieder verfügbar sein. - -Der Neustart der Region behebt die meisten Leistungs-probleme, sollte aber nur nach Anweisung erfolgen. - </notification> - <notification label="Wasserhöhe" name="HelpRegionWaterHeight"> - Die Höhe der Wasserlinie in Metern. Liegt dieser Wert unter 20 und haben Sie Wasser nahe am Rand der Welt oder „offenes“ Wasser definiert, wird eine deutliche Lücke sichtbar. - -Standard: 20 - </notification> - <notification label="Obere Terraingrenze" name="HelpRegionTerrainRaise"> - Der maximale Betrag in Metern, um den Parzelleneigentümer ihr Terrain über die Standardhöhe des „geformten“ Terrains erhöhen können. - -Standard: 4 - </notification> - <notification label="Untere Terraingrenze" name="HelpRegionTerrainLower"> - Der maximale Betrag in Metern, um den Parzelleneigentümer ihr Terrain unter die Standardhöhe des „geformten“ Terrains absenken können. - -Standard: -4 - </notification> - <notification label="RAW-Terrain hochladen" name="HelpRegionUploadRaw"> - Mit dieser Schaltfläche laden Sie eine RAW-Datei in die Region hoch, in der Sie sich befinden. -Die Datei muss die korrekten Maße (RGB, 256x256) und 13 Kanäle haben. Um eine neue Terraindatei zu erstellen, laden Sie am besten die vorhandene RAW-Datei herunter. Beginnen Sie damit, den Rot-Kanal (Höhe des Landes) zu bearbeiten und laden Sie die Datei wieder hoch. - -Der Ladevorgang kann bis zu 45 Sekunden dauern. Beachten Sie, dass beim Hochladen einer Terraindatei die Objekte auf dem Land *nicht* verschoben werden, sondern nur das Land und die mit den Parzellen verbundenen Berechtigungen. Dies kann dazu führen, dass Objekte unter dem Terrain verschwinden. - -Weitere Informationen zur Bearbeitung der Höhendaten der Region enthält die F1-Hilfe. - </notification> - <notification label="RAW-Terrain herunterladen" name="HelpRegionDownloadRaw"> - Mit dieser Schaltfläche laden Sie eine Datei herunter, welche die Höhendaten, Maße, den Verkaufsstatus der Parzelle und einige Parzellenrechte für diese Region enthält. Wenn Sie diese Datei in einem Programm wie Photoshop öffnen, müssen Sie die Bilddaten eingeben. Diese sind: RGB, 256x256 mit 13 Kanälen. Anders lässt sich diese Terraindatei nicht öffnen. - -Weitere Informationen zur Bearbeitung der Höhendaten der Region enthält die F1-Hilfe. - </notification> - <notification label="Grundstücksonne verwenden" name="HelpRegionUseEstateSun"> - Aktivieren Sie diese Option, um in dieser Region denselben Sonnenstand wie auf dem restlichen Grundstück einzustellen. - -Standard: aktiviert - </notification> - <notification label="Sonne fest" name="HelpRegionFixedSun"> - Aktivieren Sie diese Option, um den Sonnenstand auf die im Regler definierte Position festzulegen und die Animation auszuschalten. - -Standard: deaktiviert - </notification> - <notification label="Terrain formen" name="HelpRegionBakeTerrain"> - Mit dieser Schaltfläche speichern Sie die aktuelle Terrain-Form als neuen Standard für die Region. Nach der Formung können Sie und andere das Land mit der Option „Terrain bearbeiten“ > „Zurücksetzen“ in den ursprünglichen Zustand zurückversetzen. Das geformte Terrain ist auch das Zentrum für die oberen und unteren Terraingrenzen. - </notification> - <notification label="Grundstücksverwalter" name="HelpEstateEstateManager"> - Ein Grundstücksverwalter ist ein Einwohner, dem Sie die Kontrolle über die Regions- und Grundstückseinstellungen übertragen haben. Ein Grundstücksverwalter kann alle Einstellungen ändern, außer das Hochladen, Herunterladen und Formen von Terrain. Vor allem kann er Einwohner auf dem Grundstück erlauben und davon verbannen. - -Nur der Eigentümer kann den Grundstücksverwalter bestimmen und entlassen. Der Verwalter hat dieses Recht nicht. Wählen Sie nur vertrauenswürdige Einwohner als Grundstücksverwalter, da Sie letztlich für deren Handlungen verantwortlich sind. - </notification> - <notification label="Globale Zeit verwenden" name="HelpEstateUseGlobalTime"> - Aktivieren Sie diese Option, um auf Ihrem Grundstück denselben Sonnenstand wie auf dem Linden-„Mainland“ einzustellen. - -Standard: aktiviert - </notification> - <notification label="Sonne fest" name="HelpEstateFixedSun"> - Aktivieren Sie diese Option, um den Sonnenstand auf die im Regler definierte Position festzulegen und die Animation auszuschalten. - </notification> - <notification label="Öffentlich" name="HelpEstateExternallyVisible"> - Aktivieren Sie diese Option, um Einwohnern den Zugang zu diesem Grundstück zu erlauben, ohne auf der Zugangsliste zu stehen. - -Standard: aktiviert - </notification> - <notification label="Direktteleport zulassen" name="HelpEstateAllowDirectTeleport"> - Wenn aktiviert, können sich Einwohner an jede Stelle auf Ihrem Grundstück teleportieren. Wenn deaktiviert, werden Einwohner zum nächstgelegenen Telehub teleportiert. - -Standard: deaktiviert - </notification> - <notification label="Zugang erlauben" name="HelpEstateAllowResident"> - Der Zugang zu diesem Grundstück wird auf die hier aufgeführten Einwohner und Gruppen beschränkt. Diese Einstellung ist nur verfügbar, wenn „Öffentlich“ deaktiviert ist. - </notification> - <notification label="Gruppenzugang erlauben" name="HelpEstateAllowGroup"> - Der Zugang zu diesem Grundstück wird auf die hier aufgeführten Einwohner und Gruppen beschränkt. Diese Einstellung ist nur verfügbar, wenn „Öffentlich“ deaktiviert ist. - </notification> - <notification label="E-Mail-Adresse für Missbrauchsmeldungen" name="HelpEstateAbuseEmailAddress"> - Geben Sie hier eine E-Mail-Adresse ein, an die Missbrauchsmeldungen von diesem Grundstück gesendet werden. -Wenn dieses Feld leer ist, werden Missbrauchsmeldungen nur an Linden Lab gesendet. - </notification> - <notification label="Zugang verweigern" name="HelpEstateBanResident"> - Einwohnern auf dieser Liste wird der Zugang zum Grundstück verwehrt, unabhängig von etwaigen anderen Einstellungen. - </notification> - <notification label="Voice-Chat erlauben" name="HelpEstateVoiceChat"> - Die Parzellen auf diesem Grundstück können über eigene Voice-Channel verfügen, die es Einwohnern ermöglichen, sich mit anderen Personen in der Nähe zu unterhalten. - -Standard: deaktiviert - </notification> - <notification label="Falsche Voice-Version" name="VoiceVersionMismatch"> - Diese Version von [APP_NAME] mit dem Voice-Chat-Feature in dieser Region nicht kompatibel. Damit Voice-Chat funktioniert, müssen Sie [APP_NAME] aktualisieren. - </notification> - <notification label="Grunstücksvertrag" name="HelpEstateCovenant"> - Ein Grundstücksvertrag ermöglicht es Ihnen, Grundstücksparzellen zu verkaufen. Ohne Vertrag können Sie kein Land verkaufen. Wenn Sie keine Regeln festlegen oder Käufern vor dem Kauf keine anderen Informationen über das Land bereitstellen möchten, können Sie die Vertrags-Notizkarte auch leer lassen. - -Ein Vertrag kann Regeln und Richtlinien, kulturelle Informationen oder einfach nur Ihre eigenen Erwartungen bezüglich der Landnutzung durch den Käufer enthalten. Das kann Zoning, Baubeschränkungen, Zahloptionen und alle möglichen anderen Informationen betreffen, die der neue Eigentümer Ihrer Meinung nach kennen und akzeptieren sollte. - -Der Käufer muss dem Vertrag durch Auswahl dieses Kontrollkästchens zustimmen, bevor der Kauf abgeschlossen werden kann. Grundstücksverträge sind jederzeit unter „Land-Info“ für jede Parzelle einsehbar, für die ein Vertrag definiert wurde. - </notification> - <notification label="Objekte können nicht gekauft werden" name="BuyObjectOneOwner"> - Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden. -Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. - </notification> - <notification label="Inhalte können nicht gekauft werden" name="BuyContentsOneOnly"> - Inhalte können jeweils nur für ein Objekt gekauft werden. -Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. - </notification> - <notification label="Inhalte können nicht gekauft werden" name="BuyContentsOneOwner"> - Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden. -Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. - </notification> - <notification name="BuyOriginal"> - Von [OWNER] Originalobjekt für [PRICE] L$ kaufen? -Sie werden der Eigentümer dieses Objekts. -Sie können das Objekt: - Bearbeiten: [MODIFYPERM] - Kopieren: [COPYPERM] - Verkaufen oder weggeben: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BuyOriginalNoOwner"> - Originalobjekt für [PRICE] L$ kaufen? -Sie werden der Eigentümer dieses Objekts. -Sie können das Objekt: - Bearbeiten: [MODIFYPERM] - Kopieren: [COPYPERM] - Verkaufen oder weggeben: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BuyCopy"> - Von [OWNER] Kopie für [PRICE] L$ kaufen? -Das Objekt wird in Ihr Inventar kopiert. -Sie können das Objekt: - Bearbeiten: [MODIFYPERM] - Kopieren: [COPYPERM] - Verkaufen oder weggeben: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BuyCopyNoOwner"> - Kopie für [PRICE] L$ kaufen? -Das Objekt wird in Ihr Inventar kopiert. -Sie können das Objekt: - Bearbeiten: [MODIFYPERM] - Kopieren: [COPYPERM] - Verkaufen oder weggeben: [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BuyContents"> - Von [OWNER] Inhalte für [PRICE] L$ kaufen? -Die Inhalte werden in Ihr Inventar kopiert. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="BuyContentsNoOwner"> - Inhalte für [PRICE] L$ kaufen? -Die Inhalte werden in Ihr Inventar kopiert. - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmPurchase"> - Transaktion: -[ACTION] - -Möchten Sie diesen Kauf fortsetzen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmPurchasePassword"> - Transaktion: -[ACTION] - -Möchten Sie diesen Kauf fortsetzen? -Geben Sie Ihr Kennwort erneut ein und klicken Sie auf OK. - <form name="form"> - <input name="message"/> - <button name="ConfirmPurchase" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="SetPickLocation"> - Hinweis: -Sie haben die Position dieser Auswahl aktualisiert, aber die anderen Daten behalten ihre ursprünglichen Werte. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromObject"> - Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt. -Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben. - -Inventarobjekt(e) verschieben? - <usetemplate ignoretext="Beim Verschieben von nicht-kopierfähigem Inventar von Objekten" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromScriptedObject"> - Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt. Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben. -Da es sich um ein geskriptetes Objekt handelt, geht die Skriptfunktion beim Verschieben in das Inventar möglicherweise verloren. - -Inventarobjekt(e) verschieben? - <usetemplate ignoretext="Beim Verschieben von nicht-kopierfähigem Inventar von geskripteten Objekten" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ClickActionNotPayable"> - Achtung: Die Klick-Aktion „Objekt bezahlen“ wurde definiert, sie funktioniert aber nur, wenn ein Skript mit einem money() Ereignis hinzugefügt wird. - <form name="form"> - <ignore name="ignore" text="Beim Einrichten von Events mit „Objektbezahlung“ ohne Geld"/> - </form> - </notification> - <notification name="OpenObjectCannotCopy"> - Sie haben keine Berechtigung zum Kopieren von Elementen in diesem Objekt. - </notification> - <notification name="WebLaunchAccountHistory"> - Zur [SECOND_LIFE]-Website, um Ihre Kontostatistik anzuzeigen? - <usetemplate ignoretext="Beim Laden der Kontostatistik-Website" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> - </notification> - <notification name="ClickOpenF1Help"> - Die Support-Website von [SECOND_LIFE] öffnen? - <usetemplate ignoretext="Bei Besuch der [SECOND_LIFE] Support-Website." name="okcancelignore" notext="Abbrechen" yestext="Los"/> - </notification> - <notification name="ConfirmQuit"> - Wirklich beenden? - <usetemplate ignoretext="Beim Beenden von [APP_NAME]." name="okcancelignore" notext="Weiter" yestext="Beenden"/> - </notification> - <notification name="HelpReportAbuseEmailLL"> - Verwenden Sie dieses Tool, um Verletzungen der Servicebedingungen und Community-Standards zu melden. Siehe: - -http://secondlife.com/corporate/tos.php -http://secondlife.com/corporate/cs.php - -Alle gemeldeten Verletzungen der Servicebedingungen und Community-Standards werden geprüft und geklärt Sie können den Prozess im Incident Report (Vorfallsbericht) verfolgen: - -http://secondlife.com/support/incidentreport.php - </notification> - <notification name="HelpReportAbuseEmailEO"> - WICHTIG: Diese Meldung wird an den Eigentümer der Region gesendet, in der Sie sich gerade befinden, nicht an Linden Lab. -- -Als besonderen Service für Einwohner und Besucher übernimmt der Eigentümer dieser Region die Bearbeitung aller anfallenden Meldungen. Von diesem Standort aus eingereichte Meldungen werden nicht von Linden Lab bearbeitet. Der Eigentümer der Region bearbeitet Meldungen auf Grundlage der Richtlinien, die im für diese Region geltenden Grundstücksvertrag festgelegt sind. -(Den Vertrag können Sie unter „Welt“ > „Land-Info“ einsehen.) -- -Das Resultat, das sich aus dieser Meldung ergibt, betrifft nur diese Region; der Einwohnerzugang zu anderen Bereichen von [SECOND_LIFE] ist davon nicht betroffen. Nur Linden Lab kann den Zugang zu [SECOND_LIFE] beschränken. - </notification> - <notification name="HelpReportAbuseSelectCategory"> - Wählen Sie eine Missbrauchskategorie aus. -Die Angabe einer Kategorie hilft uns bei der Bearbeitung des Berichts. - </notification> - <notification name="HelpReportAbuseAbuserNameEmpty"> - Geben Sie den Namen des Täters ein. -Eine genaue Angabe hilft uns, Fälle von Missbrauch zu ahnden. - </notification> - <notification name="HelpReportAbuseAbuserLocationEmpty"> - Bitte geben Sie den Ort an, an dem der Missbrauch stattgefunden hat. -Eine genaue Angabe hilft uns, Fälle von Missbrauch zu ahnden. - </notification> - <notification name="HelpReportAbuseSummaryEmpty"> - Bitte geben Sie eine Zusammenfassung des Vorfalls ein. -Eine genaue Zusammenfassung hilft uns, Fälle von Missbrauch zu ahnden. - </notification> - <notification name="HelpReportAbuseDetailsEmpty"> - Bitte geben Sie eine ausführliche Beschreibung des Vorfalls ein. -Eine möglichst genaue Beschreibung mit Namen und Einzelheiten hilft uns, Fälle von Missbrauch zu ahnden. - </notification> - <notification name="HelpReportAbuseContainsCopyright"> - Sehr geehrte(r) Einwohner(in), - -Sie melden eine Urheberrechtsverletzung. Sind Sie wirklich sicher, dass Sie eine Verletzung des Urheberrechts melden möchten? - -1. Missbrauch melden. Wenn Sie der Meinung sind, ein Einwohner nutzt das Berechtigungssystem von [SECOND_LIFE] auf unerlaubte Weise zu seinem Vorteil aus, indem er zum Beispiel einen CopyBot oder ähnliche Kopiertools verwendet und damit eine Urheberrechtsverletzung begeht, können Sie diesen Missbrauch melden. Das Missbrauchsteam untersucht etwaige Verstöße gegen die [SECOND_LIFE] Community Standards oder die Nutzungsbedingungen und verhängt entsprechende Strafen. Das Missbrauchsteam ist jedoch nicht dafür zuständig, Inhalte aus der [SECOND_LIFE]-Welt zu entfernen und reagiert auch nicht auf entsprechende Anfragen. - -2. Der DMCA oder das Entfernen von Inhalten. Sie können das Entfernen von Inhalten aus [SECOND_LIFE] beantragen. Dazu MÃœSSEN Sie eine Urheberrechtsverletzung gemäß den in unserer DMCA-Richtlinie unter http://secondlife.com/corporate/dmca.php dargelegten Anweisungen einreichen. - -Wenn Sie mit der Missbrauchmeldung jetzt fortfahren möchten, schließen Sie bitte dieses Fenster und senden Sie Ihren Bericht ein. Möglicherweise müssen Sie Kategorie „CopyBot oder Berechtigungs-Exploit“ auswählen. - -Vielen Dank, - -Linden Lab - </notification> - <notification name="FailedRequirementsCheck"> - Die folgenden erforderlichen Komponenten fehlen in [FLOATER]: -[COMPONENTS] - </notification> - <notification label="Vorhandenen Anhang ersetzen" name="ReplaceAttachment"> - An dieser Körperstelle ist bereits ein Objekt angebracht. -Möchten Sie es mit dem ausgewählten Objekt ersetzen? - <form name="form"> - <ignore name="ignore" save_option="true" text="Beim Wechseln von Anhängen"/> - <button ignore="Automatisch ersetzen" name="Yes" text="OK"/> - <button ignore="Nie ersetzen" name="No" text="Abbrechen"/> - </form> - </notification> - <notification label="Beschäftigt-Modus-Warnung" name="BusyModePay"> - Sie sind im Beschäftigt-Modus, sodass Sie im Austausch für diese Zahlung keine Objekte erhalten können. - -Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschließen? - <form name="form"> - <ignore name="ignore" save_option="true" text="Beim Bezahlen einer Person oder eines Objekts im Beschäftigt-Modus"/> - <button ignore="Beschäftigt-Modus immer deaktivieren" name="Yes" text="OK"/> - <button ignore="Beschäftigt-Modus aktiviert lassen" name="No" text="Abbrechen"/> - </form> - </notification> - <notification name="ConfirmEmptyTrash"> - Möchten Sie den Inhalt Ihres Papierkorbs wirklich löschen? - <usetemplate ignoretext="Beim Leeren des Inventar-Papierkorbs" name="okcancelignore" notext="Abbrechen" yestext="OK"/> - </notification> - <notification name="ConfirmClearBrowserCache"> - Möchten Sie Ihren Browser-Cache wirklich leeren? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> - </notification> - <notification name="ConfirmClearCookies"> - Sind Sie sicher, dass Sie Ihre Cookies löschen möchten? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> - </notification> - <notification name="ConfirmClearMediaUrlList"> - Die Liste mit gespeicherten URLs wirklich löschen? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> - </notification> - <notification name="ConfirmEmptyLostAndFound"> - Möchten Sie den Inhalt Ihres Fundstücke-Ordners wirklich permanent löschen? - <usetemplate ignoretext="Beim Leeren von Inventar und Fundstückeordner-" name="okcancelignore" notext="Nein" yestext="Ja"/> - </notification> - <notification name="CopySLURL"> - Die folgende SLurl wurde in die Zwischenablage kopiert: - [SLURL] - -Veröffentlichen Sie sie auf einer Website, um anderen den Zugang zu diesem Ort zu erleichtern, oder testen Sie sie, indem Sie sie in die Adressleiste Ihres Browsers kopieren. - <form name="form"> - <ignore name="ignore" text="Beim Kopieren einer SLurl in die Zwischenablage"/> - </form> - </notification> - <notification name="GraphicsPreferencesHelp"> - Die Optionen in diesem Dialog steuern Fenstergröße und Auflösung sowie die Qualität der Grafikdarstellung im Client. Im Fenster „Einstellungen“ > „Grafik“ stehen vier Grafikeinstellungen zur Wahl: Niedrig, Mittel, Hoch und Ultra. Die Grafikeinstellungen lassen sich auch individuell anpassen; aktivieren Sie das Kontrollkästchen „Benutzerdefiniert“, um die folgenden Einstellungen zu bearbeiten: - -Shader: Aktivieren oder deaktivieren Sie die verschiedenen Pixel-Shader. - -Spiegelung: Legen Sie hier fest, welche Objekte sich in Wasser spiegeln. - -Avatar-Darstellung: Einige Optionen, die über die Darstellung Ihres Avatars bestimmen. - -Sichtweite: Legt fest, bis zu welcher Entfernung von Ihrem Avatar die Objekte in der Szene berechnet und dargestellt werden. - -Max. Partikelzahl: Legt fest, wie viele Partikel gleichzeitig berechnet und angezeigt werden. - -Post-Processing-Qualität: Legt fest, mit welcher Auflösung der Glüheffekt berechnet wird. - -Gitterdetails: Legt den Detailgrad bzw. die Anzahl an Dreiecken bei der Berechnung bestimmter Objekte fest. Höhere Werte führen zu einer genaueren Darstellung, dauern aber länger in der Berechnung. - -Beleuchtungsdetails: Legt fest, welche Lichtquellen berechnet werden. - -Terraindetails: Legt den Detailgrad bei der Berechnung der Terraintextur fest. - </notification> - <notification name="WLSavePresetAlert"> - Die gespeicherte Voreinstellung überschreiben? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="WLDeletePresetAlert"> - [SKY] löschen? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="WLNoEditDefault"> - Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden. - </notification> - <notification name="WLMissingSky"> - Diese Tageszyklusdatei verweist auf eine fehlende Himmel-Datei: [SKY]. - </notification> - <notification name="PPSaveEffectAlert"> - Post-Processing-Effekt bereits vorhanden. Möchten Sie ihn überschreiben? - <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> - </notification> - <notification name="HelpEditSky"> - Verschieben Sie die WindLight-Regler, um verschiedene Himmelsansichten zu erstellen und zu speichern. - </notification> - <notification name="HelpEditDayCycle"> - Wählen Sie für jede Tageszeit eine Himmelsansicht aus. - </notification> - <notification name="EnvSettingsHelpButton"> - Diese Einstellungen haben Auswirkung auf die lokale Darstellung der Umwelt auf Ihrem Computer. Zugriff auf alle Einstellungen haben Sie nur, wenn Ihre Grafikkarte Atmosphären-Shader unterstützt. - -Mit dem Regler „Tageszeit“ stellen Sie die lokal in Ihrem Viewer dargestellte Tageszeit ein. - -Mit dem Regler „Wolkendecke“ steuern Sie die Wolkendichte am Himmel. - -Unter „Wasserfarbe“ können Sie eine Farbe für die Wasserdarstellung auswählen. - -Mit dem Regler „Wassertrübung“ steuern Sie die Sichtweite unter Wasser. - -Klicken Sie auf „Grundstückszeit verw.“, um die aktuelle Zeit in der Region fest als Tageszeit einzustellen. - -Klicken Sie auf „Himmel (erweitert)“, um einen Editor mit erweiterten Einstellungen für die Himmeldarstellung anzuzeigen. - -Klicken Sie auf „Wasser (erweitert)“, um einen Editor mit erweiterten Einstellungen für die Wasserdarstellung anzuzeigen. - </notification> - <notification name="HelpDayCycle"> - Im Tageszyklus-Editor steuern Sie den Tag-/Nachtzyklus am [SECOND_LIFE] Himmel. Dabei handelt es sich um den Zyklus, der mit dem Tageszeit-Regler im Umwelt-Basiseditor gesteuert wird. - -Der Tageszyklus-Editor verwendet sogenannte Keyframes zur Steuerung des Tag-/Nachtablaufs. Dabei handelt es sich um „Schlüsselbilder“ (die grauen Kreise auf der Zeitskala), für die bestimmte Himmelseinstellungen definiert wurden. Bei voranschreitender Tageszeit interpoliert WindLight den Ãœbergang zwischen diesen Keyframes und erzeugt eine entsprechende Himmelsanimation. - -Der gelbe Pfeil über der Zeitskala repräsentiert die aktuelle Tageszeit-Darstellung. Ziehen Sie den Pfeil, um die Tagesanimation anzuzeigen. Mit „Key hinzu“ und „Key löschen“ rechts neben der Zeitskala können Sie neue Keys einfügen und vorhandene löschen. - -Keyframes lassen sich einfach entlang der Zeitskala verschieben, oder Sie geben die Werte manuell unter „Keyframe-Einstellungen“ ein. Hier wählen Sie auch eine WindLight-Voreinstellung für den Keyframe aus. - -„Zykluslänge“ bestimmt die Gesamtlänge eines „Tages“. Ein niedriger Wert (z.B. 2 Minuten) führt dazu, dass ein ganzer 24-Stunden-Tag innerhalb von zwei Minuten Echtzeit abgespult wird! Wenn Sie alle Einstellungen auf der Zeitskala und für die einzelnen Keyframes vorgenommen haben, können Sie mit „Start“ und „Stopp“ die Animation anzeigen. Das funktioniert natürlich genauso interaktiv, indem Sie den gelben Pfeil über der Zeitskala verschieben. Mit der Schaltfläche „Grundstückszeit verw.“ synchronisieren Sie die Tageszeit und -länge mit den auf dem Grundstück geltenden Einstellungen. - -Ihre Tageszyklus-Einstellungen lassen sich mit den Schaltflächen „Testtag speichern“ und „Testtag laden“ speichern bzw. laden. Bis dato kann nur ein Tageszyklus gleichzeitig in Verwendung sein. - </notification> - <notification name="HelpBlueHorizon"> - Mit den Reglern für Rot/Grün/Blau (RGB) steuern Sie die Farbe des Himmels. Verwenden Sie den Intensitätsregler (I), um alle drei RGB-Regler gleichzeitig zu verschieben. - </notification> - <notification name="HelpHazeHorizon"> - Horizonttrübung ist einer der wichtigsten Parameter, um die Gesamtlichtsituation in der Szene zu steuern. Damit lassen sich viele Belichtungseinstellungen simulieren, z.B. ein Ãœberstrahlen durch die Sonne oder starker Dunst. - </notification> - <notification name="HelpBlueDensity"> - Farbintensität steuert die Gesamtfarbsättigung von Himmel und Nebel. Je weiter Sie den Intensitätsregler (I) nach rechts verschieben, desto heller und lebendiger werden die Farben. Wenn Sie ihn ganz nach links verschieben, verlieren die Farben an Intensität und gehen in Schwarz oder Weiß über. Volle Kontrolle über die Farbsättigung des Himmels bieten ihnen die Regler für Rot/Grün/Blau (RGB). - </notification> - <notification name="HelpHazeDensity"> - Trübungsintensität steuert die Stärke des grauen Dunsts in der Atmosphäre. Damit lassen sich zum Beispiel starker Rauch oder Luftverschmutzung simulieren. Auch für Nebel und Sprühregen geeignet. - </notification> - <notification name="HelpDensityMult"> - Der Dichtemultiplikator beeinflusst die Gesamtdichte der Atmosphäre. Niedrige Einstellungen erzeugen den Eindruck dünner, sauberer Luft, hohe Einstellungen erzeugen den Eindruck schweren Smogs. - </notification> - <notification name="HelpDistanceMult"> - Steuert die Entfernungswirkung von WindLight. Ein Wert von Null schaltet den Einfluss von WindLight auf Terrain und Objekte praktisch aus. Werte über 1 simulieren größere Entfernungen und verstärken den Atmosphäreneffekt. - </notification> - <notification name="HelpMaxAltitude"> - Max. Höhe steuert die Höhenberechnungen von WindLight bei der Berechnung der atmosphärischen Beleuchtung. Zu späteren Tageszeiten lässt sich damit zum Beispiel die „Intensität“ des Sonnenuntergangs beeinflussen. - </notification> - <notification name="HelpSunlightColor"> - Steuert Farbe und Intensität von direktem Licht in der Szene. - </notification> - <notification name="HelpSunAmbient"> - Steuert Farbe und Intensität von atmosphärischem Umgebungslicht in der Szene. - </notification> - <notification name="HelpSunGlow"> - Der Regler „Größe“ steuert die Größe der Sonne. -Der Regler „Fokus“ steuert, wie unscharf die Sonne am Himmel erscheint. - </notification> - <notification name="HelpSceneGamma"> - Regelt den Hell/Dunkel-Wert des Bildschirms. - </notification> - <notification name="HelpStarBrightness"> - Regelt die Helligkeit der Sterne am Himmel. - </notification> - <notification name="HelpTimeOfDay"> - Steuert die Sonnenstellung am Himmel. -Entspricht der Elevation. - </notification> - <notification name="HelpEastAngle"> - Steuert die Sonnenstellung am Himmel. -Entspricht dem Azimut. - </notification> - <notification name="HelpCloudColor"> - Steuert die Wolkenfarbe. Generell empfiehlt sich hier ein Weißton, aber hey, warum nicht ein bisschen Spaß haben? - </notification> - <notification name="HelpCloudDetail"> - Steuert das Detailbild, welches über das Wolken-Hauptbild gelegt wird. X und Y bestimmen seine Position. D (Dichte) regelt, wie ausgebeult oder zerrissen die Wolken wirken. - </notification> - <notification name="HelpCloudDensity"> - Mit den X- und Y-Reglern steuern Sie die Position der Wolken, mit dem Regler D die Wolkendichte. - </notification> - <notification name="HelpCloudCoverage"> - Steuert, wie stark die Wolken den Himmel bedecken. - </notification> - <notification name="HelpCloudScale"> - Steuert die Skalierung des Wolkenbilds auf der Himmelskuppel. - </notification> - <notification name="HelpCloudScrollX"> - Steuert die Bewegungsgeschwindigkeit der Wolken in X-Richtung. - </notification> - <notification name="HelpCloudScrollY"> - Steuert die Bewegungsgeschwindigkeit der Wolken in Y-Richtung. - </notification> - <notification name="HelpClassicClouds"> - Aktivieren Sie dieses Kontrollkästchen, um die Darstellung der klassischen [SECOND_LIFE] Wolken zusätzlich zu den WindLight-Wolken zu erzwingen. - </notification> - <notification name="HelpWaterFogColor"> - Steuert die Farbe der Wassertrübung - </notification> - <notification name="HelpWaterFogDensity"> - Steuert die Dichte der Wassertrübung und wie weit Sie unter Wasser sehen können. - </notification> - <notification name="HelpUnderWaterFogMod"> - Beeinflusst die Auswirkung des Wassertrübungs-Exponenten und regelt die Sichtweite Ihres Avatars unter Wasser. - </notification> - <notification name="HelpWaterGlow"> - Steuert, wie groß der Anteil der leuchtenden Wasseroberfläche ist. - </notification> - <notification name="HelpWaterNormalScale"> - Steuert die Skalierung der drei Elementarwellen, die das Wasser ausmachen. - </notification> - <notification name="HelpWaterFresnelScale"> - Steuert die winkelabhängige Lichtreflexion. - </notification> - <notification name="HelpWaterFresnelOffset"> - Steuert die Intensität des reflektierten Lichts. - </notification> - <notification name="HelpWaterScaleAbove"> - Steuert die Stärke der Lichtbrechung von oberhalb der Wasseroberfläche aus gesehen. - </notification> - <notification name="HelpWaterScaleBelow"> - Steuert die Stärke der Lichtbrechung von unterhalb der Wasseroberfläche aus gesehen. - </notification> - <notification name="HelpWaterBlurMultiplier"> - Steuert die Mischung von Wellen und Reflexionen. - </notification> - <notification name="HelpWaterNormalMap"> - Ermöglicht die Auswahl einer Normal-Map zur Berechnung von Reflexionen/Brechungen auf dem Wasser. - </notification> - <notification name="HelpWaterWave1"> - Steuert die Bewegungsgeschwindigkeit und -richtung der großen Normal-Map-Version in X- und Y-Richtung. - </notification> - <notification name="HelpWaterWave2"> - Steuert die Bewegungsgeschwindigkeit und -richtung der kleinen Normal-Map-Version in X- und Y-Richtung. - </notification> - <notification name="NewSkyPreset"> - Wählen Sie einen Namen für den neuen Himmel. - <form name="form"> - <input name="message"> - Neue Voreinstellung - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="ExistsSkyPresetAlert"> - Voreinstellung bereits vorhanden! - </notification> - <notification name="NewWaterPreset"> - Wählen Sie einen Namen für die neue Wasservoreinstellung. - <form name="form"> - <input name="message"> - Neue Voreinstellung - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="ExistsWaterPresetAlert"> - Voreinstellung bereits vorhanden! - </notification> - <notification name="WaterNoEditDefault"> - Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden. - </notification> - <notification name="ChatterBoxSessionStartError"> - Neue Chat-Sitzung mit [RECIPIENT] konnte nicht gestartet werden. -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ChatterBoxSessionEventError"> - [EVENT] -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ForceCloseChatterBoxSession"> - Ihre Chat-Sitzung mit [NAME] muss beendet werden. -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="Cannot_Purchase_an_Attachment"> - Objekte können nicht gekauft werden, solange sie Teil eines Anhangs sind. - </notification> - <notification label="Info zur Abfrage der Abbucherlaubnis" name="DebitPermissionDetails"> - Wenn Sie dieser Anfrage zustimmen, erhält das Skript die Erlaubnis, regelmäßig Linden-Dollar (L$) von Ihrem Konto abzubuchen. Diese Erlaubnis kann nur zurückgezogen werden, wenn der Eigentümer das Objekt löscht oder die Skripts in dem Objekt zurücksetzt. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AutoWearNewClothing"> - Möchten Sie das neu erstellte Kleidungsstück automatisch anziehen? - <usetemplate ignoretext="Neue Kleidung automatisch tragen" name="okcancelignore" notext="Nein" yestext="Ja"/> - </notification> - <notification name="NotAgeVerified"> - Um Zugang zu dieser Parzelle zu erhalten, müssen Sie sich einer Altersprüfung unterziehen. -Möchten Sie auf der [SECOND_LIFE] Website eine Altersüberprüfung durchführen? - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/verification.php?lang=de - </url> - <usetemplate ignoretext="Auf fehlende Altersprüfung aufmerksam machen" name="okcancelignore" notext="Nein" yestext="Ja"/> - </notification> - <notification name="Cannot enter parcel: no payment info on file"> - Um Zugang zu dieser Parzelle zu erhalten, müssen Sie Zahlungsinformationen hinterlegt haben. -Möchten Sie die [SECOND_LIFE] Website öffnen, um diese Angaben zu hinterlegen? - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/index.php?lang=de - </url> - <usetemplate ignoretext="Auf fehlende Zahlungsinformationen aufmerksam machen" name="okcancelignore" notext="Nein" yestext="Ja"/> - </notification> - <notification name="MissingString"> - Der String „[STRING_NAME]“ fehlt in strings.xml - </notification> - <notification name="SystemMessageTip"> - [MESSAGE] - </notification> - <notification name="Cancelled"> - Abgebrochen - </notification> - <notification name="CancelledSit"> - Sitzen beendet - </notification> - <notification name="CancelledAttach"> - Anhängen abgebrochen - </notification> - <notification name="ReplacedMissingWearable"> - Fehlende(s) Kleidung/Körperteil mit Standard ersetzt. - </notification> - <notification name="GroupNotice"> - Betreff: [SUBJECT], Nachricht: [MESSAGE] - </notification> - <notification name="FriendOnline"> - [FIRST] [LAST] ist online - </notification> - <notification name="FriendOffline"> - [FIRST] [LAST] ist offline - </notification> - <notification name="AddSelfFriend"> - Sie können sich nicht selbst als Freund hinzufügen. - </notification> - <notification name="UploadingAuctionSnapshot"> - In-Welt- und Website-Fotos werden hochgeladen... -(Dauert ca. 5 Minuten.) - </notification> - <notification name="UploadPayment"> - Sie haben für das Hochladen [AMOUNT] L$ bezahlt. - </notification> - <notification name="UploadWebSnapshotDone"> - Das Website-Foto wurde hochgeladen. - </notification> - <notification name="UploadSnapshotDone"> - In-Welt-Foto hochgeladen - </notification> - <notification name="TerrainDownloaded"> - Terrain.raw heruntergeladen - </notification> - <notification name="GestureMissing"> - Geste [NAME] fehlt in Datenbank. - </notification> - <notification name="UnableToLoadGesture"> - Geste [NAME] konnte nicht geladen werden. -Bitte versuchen Sie es erneut. - </notification> - <notification name="LandmarkMissing"> - Landmarke fehlt in Datenbank. - </notification> - <notification name="UnableToLoadLandmark"> - Landmarke konnte nicht geladen werden. Bitte versuchen Sie es erneut. - </notification> - <notification name="CapsKeyOn"> - Die Feststelltaste ist aktiv. -Da dies Auswirkung auf die Kennworteingabe hat, sollten Sie die Taste besser ausschalten. - </notification> - <notification name="NotecardMissing"> - Notizkarte fehlt in Datenbank. - </notification> - <notification name="NotecardNoPermissions"> - Unzureichende Rechte zur Anzeige der Notizkarte. - </notification> - <notification name="RezItemNoPermissions"> - Keine Berechtigung zum Rezzen von Objekten. - </notification> - <notification name="UnableToLoadNotecard"> - Notizkarten-Asset konnte nicht geladen werden. - </notification> - <notification name="ScriptMissing"> - Skript fehlt in Datenbank. - </notification> - <notification name="ScriptNoPermissions"> - Unzureichende Rechte zur Anzeige des Skripts. - </notification> - <notification name="UnableToLoadScript"> - Skript konnte nicht geladen werden. Bitte versuchen Sie es erneut. - </notification> - <notification name="IncompleteInventory"> - Die von Ihnen angebotenen Inhalte sind noch nicht vollständig lokal verfügbar. Warten Sie kurz und wiederholen Sie dann das Angebot. - </notification> - <notification name="CannotModifyProtectedCategories"> - Geschützte Kategorien können nicht geändert werden. - </notification> - <notification name="CannotRemoveProtectedCategories"> - Geschützte Kategorien können nicht entfernt werden. - </notification> - <notification name="OfferedCard"> - Sie haben [FIRST] [LAST] eine Visitenkarte angeboten. - </notification> - <notification name="UnableToBuyWhileDownloading"> - Kauf nicht möglich. Objektdaten werden noch geladen. -Bitte versuchen Sie es erneut. - </notification> - <notification name="UnableToLinkWhileDownloading"> - Verknüpfung nicht möglich. Objektdaten werden noch geladen. -Bitte versuchen Sie es erneut. - </notification> - <notification name="CannotBuyObjectsFromDifferentOwners"> - Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden. -Wählen Sie ein einzelnes Objekt aus. - </notification> - <notification name="ObjectNotForSale"> - Objekt ist nicht zu verkaufen. - </notification> - <notification name="EnteringGodMode"> - Gott-Modus aktiviert, Level [LEVEL] - </notification> - <notification name="LeavingGodMode"> - Gott-Modus deaktiviert, Level [LEVEL] - </notification> - <notification name="CopyFailed"> - Kopieren aufgrund fehlender Kopierrechte fehlgeschlagen - </notification> - <notification name="InventoryAccepted"> - [NAME] hat Ihr Inventarangebot akzeptiert. - </notification> - <notification name="InventoryDeclined"> - [NAME] hat Ihr Inventarangebot abgelehnt. - </notification> - <notification name="ObjectMessage"> - [NAME]: [MESSAGE] - </notification> - <notification name="CallingCardAccepted"> - Ihre Visitenkarte wurde akzeptiert. - </notification> - <notification name="CallingCardDeclined"> - Ihre Visitenkarte wurde abgelehnt. - </notification> - <notification name="TeleportToLandmark"> - Jetzt, nachdem Sie das Mainland erreicht haben, können Sie sich an Positionen wie „[NAME]“ teleportieren, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Landmarken“ auswählen. -Klicken Sie eine Landmarke doppelt an und wählen Sie „Teleportieren“, um an diesen Ort zu gelangen. - </notification> - <notification name="TeleportToPerson"> - Jetzt, nachdem Sie das Mainland erreicht haben, können Sie mit Einwohnern wie „[NAME]“ Kontakt aufnehmen, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Visitenkarten“ auswählen. -Klicken Sie die Karte doppelt an, wählen Sie „Instant Message“ und geben Sie eine Nachricht ein. - </notification> - <notification name="CantSelectLandFromMultipleRegions"> - Land kann nicht über Servergrenzen hinweg ausgewählt werden. -Wählen Sie eine kleinere Landfläche. - </notification> - <notification name="SearchWordBanned"> - Einige Begriffe in Ihrer Suchanfrage wurden ausgeschlossen, aufgrund von in den Community Standards definierten Inhaltsbeschränkungen. - </notification> - <notification name="NoContentToSearch"> - Bitte wählen Sie mindestens eine Inhaltsart für die Suche aus (PG, Mature oder Adult). - </notification> - <notification name="GroupVote"> - [NAME] hat eine Abstimmung vorgeschlagen über: -[MESSAGE] - <form name="form"> - <button name="VoteNow" text="Abstimmen"/> - <button name="Later" text="Später"/> - </form> - </notification> - <notification name="SystemMessage"> - [MESSAGE] - </notification> - <notification name="EventNotification"> - Event-Benachrichtigung: - -[NAME] -[DATE] - <form name="form"> - <button name="Teleport" text="Teleportieren"/> - <button name="Description" text="Beschreibung"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="TransferObjectsHighlighted"> - Alle Objekte auf dieser Parzelle, die an den Käufer der Parzelle übertragen werden, sind jetzt markiert. - -* Ãœbertragene Bäume und Gräser sind nicht markiert. - <form name="form"> - <button name="Done" text="Fertig"/> - </form> - </notification> - <notification name="DeactivatedGesturesTrigger"> - Gesten mit demselben Trigger wurden deaktiviert: -[NAMES] - </notification> - <notification name="NoQuickTime"> - Apple QuickTime ist auf Ihrem System anscheinend nicht installiert. -Laden Sie QuickTime von der QuickTime-Webseite (http://www.apple.com/de/quicktime) herunter, um auf Parzellen, die diese Funktion unterstützen, Streaming-Inhalte wiederzugeben. - </notification> - <notification name="OwnedObjectsReturned"> - Ihre Objekte auf der ausgewählten Parzelle wurden in Ihr Inventar transferiert. - </notification> - <notification name="OtherObjectsReturned"> - Die Objekte von [FIRST] [LAST] auf dieser Parzelle wurden in das Inventar dieser Person transferiert. - </notification> - <notification name="OtherObjectsReturned2"> - Die Objekte von [FIRST] [LAST] auf dieser -Parzelle von „[NAME]“ wurden an ihren Eigentümer zurückgegeben. - </notification> - <notification name="GroupObjectsReturned"> - Die mit der Gruppe [GROUPNAME] gemeinsam genutzten Objekte auf dieser Parzelle wurden in das Inventar ihrer Eigentümer transferiert. -Transferierbare übertragene Objekte wurden an ihre früheren Eigentümer zurückgegeben. -Nicht transferierbare an die Gruppe übertragene Objekte wurden gelöscht. - </notification> - <notification name="UnOwnedObjectsReturned"> - Alle Objekte auf der ausgewählten Parzelle, die NICHT Ihnen gehören, wurden ihren Eigentümern zurückgegeben. - </notification> - <notification name="NotSafe"> - Auf diesem Land ist Schaden aktiviert („Unsicher“). -Verletzungen sind möglich. Wenn Sie sterben, werden Sie zu Ihrem Heimatstandort teleportiert. - </notification> - <notification name="NoFly"> - Auf diesem Land ist Fliegen deaktiviert („Fliegen aus“). -Fliegen ist hier nicht möglich. - </notification> - <notification name="PushRestricted"> - Auf diesem Land gilt „Kein Stoßen“. -Sie können keine anderen Personen stoßen, außer Ihnen gehört das Land. - </notification> - <notification name="NoVoice"> - Auf diesem Land ist Voice deaktiviert. - </notification> - <notification name="NoBuild"> - Auf diesem Land ist Bauen deaktiviert („Bauen aus“). -Sie können hier keine Objekte erstellen. - </notification> - <notification name="ScriptsStopped"> - Ein Administrator hat die Skriptausführung in dieser Region vorübergehend deaktiviert. - </notification> - <notification name="ScriptsNotRunning"> - In dieser Region werden keine Skipts ausgeführt. - </notification> - <notification name="NoOutsideScripts"> - Auf diesem Land sind externe Skripts deaktiviert -(„Externe Skripts aus“). -Nur Skripts, die dem Landeigentümer gehören, funktionieren. - </notification> - <notification name="ClaimPublicLand"> - Öffentliches Land kann nur in der Region in Besitz genommen werden, in der Sie sich befinden. - </notification> - <notification name="RegionTPAccessBlocked"> - Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. Sie müssen eventuell eine Altersüberprüfung vornehmen und/oder den aktuellsten Viewer installieren. - -Bitte besuchen Sie unsere Knowledgebase, um mehr Details über Zugang zu Regionen mit dieser Alterseinstufung zu erhalten. - </notification> - <notification name="URBannedFromRegion"> - Sie dürfen diese Region nicht betreten. - </notification> - <notification name="NoTeenGridAccess"> - Ihr Konto kann keine Verbindung zu dieser Teen Grid-Region herstellen. - </notification> - <notification name="NoHelpIslandTP"> - Sie können nicht zurück nach Help Island teleportieren. -Gehen Sie zu „Help Island Public“ und wiederholen sie das Tutorial. - </notification> - <notification name="ImproperPaymentStatus"> - Die für den Zutritt zu dieser Region erforderlichen Zahlungsinformationen liegen nicht vor. - </notification> - <notification name="MustGetAgeRegion"> - Sie müssen alterüberprüft sein, um diese Region betreten zu können. - </notification> - <notification name="MustGetAgeParcel"> - Sie müssen alterüberprüft sein, um diese Parzelle betreten zu können. - </notification> - <notification name="NoDestRegion"> - Keine Zielregion gefunden. - </notification> - <notification name="NotAllowedInDest"> - Der Zutritt wurde Ihnen verweigert. - </notification> - <notification name="RegionParcelBan"> - Diese Parzelle ist abgesperrt und kann nicht überquert werden. Versuchen Sie einen anderen Weg. - </notification> - <notification name="TelehubRedirect"> - Sie wurden zu einem Telehub umgeleitet. - </notification> - <notification name="CouldntTPCloser"> - Ein Teleport näher am Ziel ist leider nicht möglich. - </notification> - <notification name="TPCancelled"> - Teleport abgebrochen. - </notification> - <notification name="FullRegionTryAgain"> - Die Region, die Sie betreten möchten, ist im Moment voll. -Versuchen Sie es in einigen Minuten erneut. - </notification> - <notification name="GeneralFailure"> - Allgemeiner Fehler. - </notification> - <notification name="RoutedWrongRegion"> - In falsche Region umgeleitet. Bitte versuchen Sie es erneut. - </notification> - <notification name="NoValidAgentID"> - Keine gültige Agent ID. - </notification> - <notification name="NoValidSession"> - Keine gültige Sitzungs-ID. - </notification> - <notification name="NoValidCircuit"> - Kein gültiger Verbindungscode. - </notification> - <notification name="NoValidTimestamp"> - Kein gültiger Zeitstempel. - </notification> - <notification name="NoPendingConnection"> - Verbindung kann nicht hergestellt werden. - </notification> - <notification name="InternalUsherError"> - Interner Fehler beim Versuch, Verbindung mit Agent Usher herzustellen. - </notification> - <notification name="NoGoodTPDestination"> - In dieser Region konnte kein gültiges Teleportziel gefunden werden. - </notification> - <notification name="InternalErrorRegionResolver"> - Interner Fehler bei Teleport. - </notification> - <notification name="NoValidLanding"> - Ein gültiger Landpunkt konnte nicht gefunden werden. - </notification> - <notification name="NoValidParcel"> - Es konnte keine gültige Parzelle gefunden werden. - </notification> - <notification name="ObjectGiveItem"> - Das Objekt [OBJECTFROMNAME] von [FIRST] [LAST] hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]). - <form name="form"> - <button name="Keep" text="Behalten"/> - <button name="Discard" text="Verwerfen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="ObjectGiveItemUnknownUser"> - Das Objekt [OBJECTFROMNAME] von (unbekannt) hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]). - <form name="form"> - <button name="Keep" text="Behalten"/> - <button name="Discard" text="Verwerfen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="UserGiveItem"> - [NAME] hat Ihnen ein [OBJECTTYPE] namens „[OBJECTNAME]“ gegeben. - <form name="form"> - <button name="Keep" text="Behalten"/> - <button name="Discard" text="Verwerfen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="GodMessage"> - [NAME] -[MESSAGE] - </notification> - <notification name="JoinGroup"> - [MESSAGE] - <form name="form"> - <button name="Join" text="Beitreten"/> - <button name="Decline" text="Ablehnen"/> - <button name="Info" text="Info"/> - </form> - </notification> - <notification name="TeleportOffered"> - [NAME] hat angeboten, Sie zu ihrem/seinem Standort zu teleportieren: - -[MESSAGE] - <form name="form"> - <button name="Teleport" text="Teleportieren"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="GotoURL"> - [MESSAGE] -[URL] - <form name="form"> - <button name="Later" text="Später"/> - <button name="GoNow..." text="Jetzt gehen..."/> - </form> - </notification> - <notification name="OfferFriendship"> - [NAME] bietet Ihnen die Freundschaft an. - -[MESSAGE] - -(Standardmäßig werden Sie gegenseitig ihren Online-Status sehen können.) - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - </form> - </notification> - <notification name="OfferFriendshipNoMessage"> - [NAME] bietet Ihnen die Freundschaft an. - -(Sie werden dadurch den gegenseitigen Online-Status sehen können.) - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - </form> - </notification> - <notification name="FriendshipAccepted"> - [NAME] hat Ihr Freundschaftsangebot akzeptiert. - </notification> - <notification name="FriendshipDeclined"> - [NAME] hat Ihr Freundschaftsangebot abgelehnt. - </notification> - <notification name="OfferCallingCard"> - [FIRST] [LAST] bietet Ihnen eine Visitenkarte an. -Dies erstellt ein Lesezeichen in Ihrem Inventar, damit Sie diesen Einwohner jederzeit über IM erreichen. - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - </form> - </notification> - <notification name="RegionRestartMinutes"> - Region wird in [MINUTES] Minuten neu gestartet. -Wenn Sie in dieser Region bleiben, werden Sie abgemeldet. - </notification> - <notification name="RegionRestartSeconds"> - Region wird in [SECONDS] Sekunden neu gestartet. -Wenn Sie in dieser Region bleiben, werden Sie abgemeldet. - </notification> - <notification name="LoadWebPage"> - Webseite [URL] laden? - -[MESSAGE] - -Von Objekt: [OBJECTNAME], Eigentümer: [NAME]? - <form name="form"> - <button name="Gotopage" text="Zur Seite"/> - <button name="Cancel" text="Abbrechen"/> - </form> - </notification> - <notification name="FailedToFindWearableUnnamed"> - [TYPE] nicht in Datenbank. - </notification> - <notification name="FailedToFindWearable"> - [TYPE] namens [DESC] nicht in Datenbank. - </notification> - <notification name="InvalidWearable"> - Dieser Artikel verwendet eine Funktion, die Ihr Viewer nicht unterstützt. Bitte aktualisieren Sie Ihre Version von [APP_NAME], um diesen Artikel anziehen zu können. - </notification> - <notification name="ScriptQuestion"> - Das Objekt „[OBJECTNAME]“, Eigentum von „[NAME]“, möchte: - -[QUESTIONS] -Ist das OK? - <form name="form"> - <button name="Yes" text="Ja"/> - <button name="No" text="Nein"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="ScriptQuestionCaution"> - Das Objekt „[OBJECTNAME]“, Eigentum von „[NAME]“, möchte: - -[QUESTIONS] -Wenn Sie diesem Objekt und seinem Ersteller nicht vertrauen, sollten Sie diese Anfrage ablehnen. Klicken Sie für weitere Informationen auf „Info...“. - -Anfrage gestatten? - <form name="form"> - <button name="Grant" text="Gewähren"/> - <button name="Deny" text="Verweigern"/> - <button name="Details" text="Info..."/> - </form> - </notification> - <notification name="ScriptDialog"> - [FIRST] [LAST]s „[TITLE]“ -[MESSAGE] - <form name="form"> - <button name="Ignore" text="Ignorieren"/> - </form> - </notification> - <notification name="ScriptDialogGroup"> - [GROUPNAME]s „[TITLE]“ -[MESSAGE] - <form name="form"> - <button name="Ignore" text="Ignorieren"/> - </form> - </notification> - <notification name="FirstBalanceIncrease"> - Sie haben gerade [AMOUNT] L$ erhalten. -Objekte und andere Benutzer können Ihnen L$ geben. -Ihren Kontostand sehen Sie in der oberen rechten Ecke des Bildschirms. - </notification> - <notification name="FirstBalanceDecrease"> - Sie haben gerade [AMOUNT] L$ bezahlt. -Ihren Kontostand sehen Sie in der oberen rechten Ecke des Bildschirms. - </notification> - <notification name="FirstSit"> - Sie sitzen. -Benutzen Sie die Pfeil- oder WASD-Tasten, um die Ansicht zu ändern. -Klicken Sie auf „Aufstehen“, um aufzustehen. - </notification> - <notification name="FirstMap"> - Zum Verschieben der Karte klicken und ziehen. -Zum Teleportieren doppelklicken. -Nutzen Sie die Optionen links, um Dinge zu finden und um verschiedene Hintergründe anzuzeigen. - </notification> - <notification name="FirstBuild"> - In einigen Bereichen von [SECOND_LIFE] können Sie neue Objekte erstellen. -Verwenden Sie zum Bauen die Werkzeuge oben links. -Mit den Strg- und Alt-Tasten können Sie schnell zwischen den Werkzeugen umschalten. -Drücken Sie Esc, um das Bauen abzubrechen. - </notification> - <notification name="FirstLeftClickNoHit"> - Die linke Maustaste ermöglicht Objektinteraktionen. -Der Mauszeiger zeigt eine Hand, wenn Sie -mit dem Objekt interagieren können. -Die rechte Maustaste zeigt immer ein Aktionsmenü an. - </notification> - <notification name="FirstTeleport"> - Diese Region unterstützt keine direkten Teleports. Sie wurden zum nächstgelegenen Telehub transportiert. -Ihr Ziel ist mit einem großen roten Strahl markiert. Folgen Sie dem roten Pfeil zum Strahl oder klicken Sie auf den Pfeil, um den Strahl zu entfernen. - </notification> - <notification name="FirstOverrideKeys"> - Ihre Bewegungstasten werden jetzt von einem Objekt gesteuert. -Probieren Sie die Pfeil- oder WASD-Tasten aus. -Manche Objekte (wie Waffen) müssen per Mouselook gesteuert werden. -Drücken Sie dazu „M“. - </notification> - <notification name="FirstAppearance"> - Sie bearbeiten gerade Ihr Aussehen. -Benutzen Sie die Pfeiltasten zum Drehen und Zoomen. -Klicken Sie auf „Alles speichern“, wenn Sie fertig sind, um Ihr Aussehen zu speichern. -Sie können Ihr Aussehen jederzeit verändern. - </notification> - <notification name="FirstInventory"> - Ihr Inventar. Es enthält Objekte, Notizkarten, Kleidung und andere Dinge in Ihrem Besitz. -* Zum Anziehen eines Objekts oder Outfit-Ordners ziehen Sie es/ihn auf sich. -* Um ein Objekt in der Welt abzulegen, ziehen Sie es auf den Boden. -* Zum Lesen einer Notizkarte klicken Sie sie doppelt an. - </notification> - <notification name="FirstSandbox"> - Dies ist eine Sandkastenregion. -Objekte, die Sie hier bauen, können gelöscht werden, wenn Sie das Gebiet verlassen. Sandkästen werden regelmäßig gereinigt. Weitere Informationen hierzu finden Sie oben im Bild neben dem Regionsnamen. - -Sandkastenregionen kommen selten vor und sind entsprechend gekennzeichnet. - </notification> - <notification name="FirstFlexible"> - Dieses Objekt ist flexibel. -Ein flexibles Objekt ist ein Phantom und nicht physisch, bis die Option „Flexibel“ deaktiviert wurde. - </notification> - <notification name="FirstDebugMenus"> - Sie haben das Advanced-Menü aktiviert. -Dieses Menü enthält nützliche Funktionen zum Debuggen von [SECOND_LIFE]. -Drücken Sie in Windows Strg+Alt+D (Mac: ⌥⌘D) zum Ein- und Ausschalten dieses Menüs. - </notification> - <notification name="FirstSculptedPrim"> - Sie bearbeiten ein geformtes Primitiv. -Geformte Primitive benötigen eine spezielle Textur, die ihre Form definiert. -Beispiele für Formtexturen finden Sie in der Inventarbibliothek. - </notification> - <notification name="FirstMedia"> - Sie haben die Medienwiedergabe gestartet. Unter „Audio und Video“ im Fenster „Einstellungen“ können Sie festlegen, dass Medien automatisch wiedergegeben werden. Beachten Sie, dass dies bei nicht vertrauenswürdigen Medienseiten ein Sicherheitsrisiko darstellen kann. - </notification> - <notification name="MaxListSelectMessage"> - Sie können maximal [MAX_SELECT] Objekte -von der Liste auswählen. - </notification> - <notification name="VoiceInviteP2P"> - [NAME] lädt Sie zu einem Voice-Chat ein. -Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten. - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="AutoUnmuteByIM"> - [FIRST] [LAST] hat eine Instant Message erhalten; die Stummschaltung wurde aufgehoben. - </notification> - <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] hat Geld erhalten; die Stummschaltung wurde aufgehoben. - </notification> - <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST] wurde ein Inventarobjekt angeboten; die Stummschaltung wurde aufgehoben. - </notification> - <notification name="VoiceInviteGroup"> - [NAME] ist einem Voice-Chat mit der Gruppe [GROUP] beigetreten. -Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten. - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="VoiceInviteAdHoc"> - [NAME] ist einem Voice-Konferenz-Chat beigetreten. -Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten. - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="InviteAdHoc"> - [NAME] lädt Sie zu einem Konferenz-Chat ein. -Klicken Sie auf „Akzeptieren“, um dem Chat beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten. - <form name="form"> - <button name="Accept" text="Akzeptieren"/> - <button name="Decline" text="Ablehnen"/> - <button name="Mute" text="Stummschalten"/> - </form> - </notification> - <notification name="VoiceChannelFull"> - Der Voice-Chat, dem Sie beitreten möchten, [VOICE_CHANNEL_NAME], hat seine maximale Teilnehmerzahl erreicht. Bitte versuchen Sie es erneut. - </notification> - <notification name="ProximalVoiceChannelFull"> - Es tut uns Leid. Dieses Gebiet hat seine maximale Kapazität für Voice-Gespräche erreicht. Bitte versuchen Sie es in einem anderen Gebiet. - </notification> - <notification name="VoiceChannelDisconnected"> - Sie haben [VOICE_CHANNEL_NAME] verlassen. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. - </notification> - <notification name="VoiceChannelDisconnectedP2P"> - [VOICE_CHANNEL_NAME] hat das Gespräch beendet. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. - </notification> - <notification name="P2PCallDeclined"> - [VOICE_CHANNEL_NAME] hat Ihren Anruf abgelehnt. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. - </notification> - <notification name="P2PCallNoAnswer"> - [VOICE_CHANNEL_NAME] ist zurzeit nicht erreichbar. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. - </notification> - <notification name="VoiceChannelJoinFailed"> - Verbindung zu [VOICE_CHANNEL_NAME] nicht möglich. Bitte versuchen Sie es später. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. - </notification> - <notification name="VoiceLoginRetry"> - Wir erstellen einen Voice-Kanal für Sie. Bitte warten Sie einen Moment. - </notification> - <notification name="Cannot enter parcel: not a group member"> - Zugang zur Parzelle verweigert, Sie gehören keiner berechtigten Gruppe an. - </notification> - <notification name="Cannot enter parcel: banned"> - Zugang zur Parzelle verweigert. Sie wurden verbannt. - </notification> - <notification name="Cannot enter parcel: not on access list"> - Zugang zur Parzelle verweigert. Sie stehen nicht auf der Zugangsliste. - </notification> - <notification name="VoiceNotAllowed"> - Sie sind nicht berechtigt, einem Voice-Chat in [VOICE_CHANNEL_NAME] beizutreten. - </notification> - <notification name="VoiceCallGenericError"> - Fehler beim Versuch, eine Voice-Chat-Verbindung zu [VOICE_CHANNEL_NAME] herzustellen. Bitte versuchen Sie es erneut. - </notification> - <notification name="ServerVersionChanged"> - Die Region, die Sie betreten haben, verwendet eine andere Simulatorversion. Klicken Sie auf diese Nachricht, um weitere Informationen zu erhalten. - </notification> - <notification name="UnableToOpenCommandURL"> - Die URL, die Sie angeklickt haben, kann in diesem Web Browser nicht geöffnet werden. - </notification> - <global name="UnsupportedCPU"> - - Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen. - </global> - <global name="UnsupportedGLRequirements"> - Ihr Computer entspricht nicht den Hardwareanforderungen von [APP_NAME]. [APP_NAME] setzt eine OpenGL-Grafikkarte mit Multitextur-Unterstützung voraus. Falls Ihre Grafikkarte diese Funktion unterstützt, installieren Sie die neuesten Treiber sowie die aktuellen Service Packs und Patches für Ihr Betriebssystem. - -Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter: http://www.secondlife.com/support - </global> - <global name="UnsupportedCPUAmount"> - 796 - </global> - <global name="UnsupportedRAMAmount"> - 510 - </global> - <global name="UnsupportedGPU"> - - Ihre Grafikkarte entspricht nicht den Mindestanforderungen. - </global> - <global name="UnsupportedRAM"> - - Ihr Arbeitsspeicher entspricht nicht den Mindestanforderungen. - </global> - <global name="PermYes"> - Ja - </global> - <global name="PermNo"> - Nein - </global> -</notifications> +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <global name="skipnexttime"> + Nicht mehr anzeigen + </global> + <global name="alwayschoose"> + Diese Option immer auswählen + </global> + <global name="implicitclosebutton"> + Schließen + </global> + <template name="okbutton"> + <form> + <button name="OK" text="$yestext"/> + </form> + </template> + <template name="okignore"/> + <template name="okcancelbuttons"> + <form> + <button name="Cancel" text="$notext"/> + </form> + </template> + <template name="okcancelignore"/> + <template name="okhelpbuttons"> + <form> + <button name="Help" text="$helptext"/> + </form> + </template> + <template name="yesnocancelbuttons"> + <form> + <button name="Yes" text="$yestext"/> + <button name="No" text="$notext"/> + </form> + </template> + <notification functor="GenericAcknowledge" label="Unbekannter Warnhinweis" name="MissingAlert"> + Ihre Version von [APP_NAME] kann den gerade empfangenen Warnhinweis nicht anzeigen. Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben. + +Fehlerdetails: Der Warnhinweis '[_NAME]' wurde in notifications.xml nicht gefunden. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FloaterNotFound"> + Floater-Fehler: Folgende Steuerelemente wurden nicht gefunden: + +[CONTROLS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TutorialNotFound"> + Derzeit ist kein Tutorial verfügbar. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GenericAlert"> + [MESSAGE] + </notification> + <notification name="GenericAlertYesCancel"> + [MESSAGE] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> + </notification> + <notification name="BadInstallation"> + Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version des Viewers herunter. http://get.secondlife.com + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LoginFailedNoNetwork"> + Eine Verbindung zum [SECOND_LIFE_GRID] konnte nicht hergestellt werden. + '[DIAGNOSTIC]' +Bitte vergewissern Sie sich, dass Ihre Internetverbindung funktioniert. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MessageTemplateNotFound"> + Meldungsvorlage [PATH] nicht gefunden. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="WearableSave"> + Änderung an aktueller Kleidung/Körperteil speichern? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> + </notification> + <notification name="CompileQueueSaveText"> + Der Text für ein Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut. + </notification> + <notification name="CompileQueueSaveBytecode"> + Eine kompiliertes Skript konnte aus folgendem Grund nicht hochgeladen werden: [REASON]. Bitte versuchen Sie es erneut. + </notification> + <notification name="WriteAnimationFail"> + Fehler beim Schreiben von Animationsdaten. Bitte versuchen Sie es erneut. + </notification> + <notification name="UploadAuctionSnapshotFail"> + Eine Auktions-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON] + </notification> + <notification name="UnableToViewContentsMoreThanOne"> + Es kann nur jeweils der Inhalt von einem Objekt angezeigt werden. +Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. + </notification> + <notification name="SaveClothingBodyChanges"> + Änderung an Kleidung/Körperteilen speichern? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Alles speichern"/> + </notification> + <notification name="GrantModifyRights"> + Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern oder an sich zu nehmen, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis. +Möchten Sie [FIRST_NAME] [LAST_NAME] Änderungsrechte gewähren? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="GrantModifyRightsMultiple"> + Die Gewährung von Änderungsrechten an andere Einwohner ermöglicht es diesen, JEDES BELIEBIGE Objekt zu ändern, das Sie in der [SECOND_LIFE]-Welt besitzen. Seien Sie SEHR vorsichtig beim Erteilen dieser Erlaubnis. +Möchten Sie den ausgewählten Einwohnern Änderungsrechte gewähren? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="RevokeModifyRights"> + Möchten Sie [FIRST_NAME] [LAST_NAME] die Änderungsrechte entziehen? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="RevokeModifyRightsMultiple"> + Möchten Sie den ausgewählten Einwohnern die Änderungsrechte entziehen? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="UnableToCreateGroup"> + Gruppe konnte nicht erstellt werden. +[MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PanelGroupApply"> + [NEEDS_APPLY_MESSAGE] +[WANT_APPLY_MESSAGE] + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Änderungen verwerfen" yestext="Änderungen übernehmen"/> + </notification> + <notification name="MustSpecifyGroupNoticeSubject"> + Geben Sie einen Betreff für die Gruppenmitteilung ein. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AddGroupOwnerWarning"> + Sie sind im Begriff, Gruppenmitgliedern die Rolle [ROLE_NAME] zuzuweisen. +Diese Rolle kann Mitgliedern nicht mehr entzogen werden. +Sie müssen die Rolle selbst niederlegen. +Möchten Sie fortfahren? + <usetemplate ignoretext="Bestätigen, bevor ich einen neuen Gruppeneigentümer hinzufüge" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="AssignDangerousActionWarning"> + Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen. + + *ACHTUNG* + Mitglieder in einer Rolle mit dieser Fähigkeit können sich selbst - + und allen anderen Mitgliedern – Rollen zuweisen, die mehr Rechte + beinhalten als sie derzeit haben, und damit nahezu + Eigentümerrechte erreichen. Ãœberlegen Sie sich, wem Sie diese Fähigkeit + verleihen. + +Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="AssignDangerousAbilityWarning"> + Sie sind im Begriff, der Rolle „[ROLE_NAME]“ die Fähigkeit „[ACTION_NAME]“ zuzuweisen. + + *ACHTUNG* + Mitglieder in einer Rolle mit dieser Fähigkeit können sich selbst - + und allen anderen Mitgliedern – alle Fähigkeiten zuweisen und + damit fast Eigentümerrechte erreichen. + +Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="JoinGroupCanAfford"> + Der Beitritt zu dieser Gruppe kostet [COST] L$. +Fortfahren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Beitreten"/> + </notification> + <notification name="JoinGroupCannotAfford"> + Der Beitritt zu dieser Gruppe kostet [COST] L$. +Sie haben nicht genug L$, um dieser Gruppe beizutreten. + </notification> + <notification name="CreateGroupCost"> + Die Gründung dieser Gruppe kostet 100 L$. +Gruppen müssen mehr als ein Mitglied haben oder sie werden gelöscht. +Bitte laden Sie innerhalb von 48 Stunden Mitglieder in Ihre Gruppe ein. + <usetemplate canceltext="Abbrechen" name="okcancelbuttons" notext="Abbrechen" yestext="Gruppe für 100 L$ erstellen"/> + </notification> + <notification name="LandBuyPass"> + Sie können dieses Land („[PARCEL_NAME]“) für [COST] L$ +[TIME] Stunden lang betreten. Pass kaufen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="SalePriceRestriction"> + Der Verkaufspreis muss beim allgemeinen Verkauf über 0 L$ liegen. +Wählen Sie eine bestimmte Person aus, wenn Sie für 0 L$ verkaufen. + </notification> + <notification name="ConfirmLandSaleChange"> + Die ausgewählten [LAND_SIZE] qm Land werden zum Verkauf freigegeben. +Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmLandSaleToAnyoneChange"> + ACHTUNG: Wenn Sie auf „An jeden verkaufen“ klicken, kann jeder in [SECOND_LIFE] Ihr Land kaufen, auch Einwohner in anderen Regionen. + +Die ausgewählten [LAND_SIZE] qm Land werden zum Verkauf freigegeben. +Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnObjectsDeededToGroup"> + Möchten Sie alle Ihre Objekte auf dieser Parzelle, die der Gruppe „[NAME]“ gehören, zurück in das jeweilige Inventar ihrer vorherigen Eigentümer transferieren? + +*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht! + +Objekte: [N] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedByUser"> + Möchten Sie alle Objekte auf dieser Parzelle, die dem Einwohner „[NAME]“ gehören, in das jeweilige Inventar ihrer Eigentümer transferieren? + +Objekte: [N] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedBySelf"> + Möchten Sie alle Objekte auf dieser Parzelle, die Ihnen gehören, zurück in Ihr Inventar transferieren? + +Objekte: [N] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedBySelf"> + Möchten Sie alle Objekte auf dieser Parzelle, die NICHT Ihnen gehören, in das Inventar ihrer Eigentümer transferieren? +Transferierbare Objekte, die an eine Gruppe übertragen wurden, werden ihren vorherigen Eigentümern zurückgegeben. + +*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht! + +Objekte: [N] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByUser"> + Möchten Sie alle Objekte auf dieser Parzelle, die NICHT [NAME] gehören, in das Inventar ihrer Eigentümer transferieren? +Transferierbare Objekte, die an eine Gruppe übertragen wurden, werden ihren vorherigen Eigentümern zurückgegeben. + +*WARNUNG* Alle nicht transferierbaren Objekte, die der Gruppe übertragen wurden, werden dabei gelöscht! + +Objekte: [N] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnAllTopObjects"> + Möchten Sie alle aufgeführten Objekte ihren Eigentümern zurückgeben? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="DisableAllTopObjects"> + Möchten Sie alle Objekte in dieser Region deaktivieren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByGroup"> + Objekte auf dieser Parzelle, die von der Gruppe [NAME] nicht gemeinsam genutzt werden, an ihre Eigentümer zurückgeben? + +Objekte: [N] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="UnableToDisableOutsideScripts"> + Skriptdeaktivierung nicht möglich. +Für die gesamte Region ist Schaden aktiviert. +Damit Waffen funktionieren, müssen Skripts erlaubt sein. + </notification> + <notification name="MustBeInParcel"> + Sie müssen auf einer Landparzelle stehen, um ihren Landepunkt festzulegen. + </notification> + <notification name="PromptRecipientEmail"> + Bitte geben Sie für den/die Empfänger eine gültige Email-Adresse ein. + </notification> + <notification name="PromptSelfEmail"> + Geben Sie Ihre E-Mail-Adresse ein. + </notification> + <notification name="PromptMissingSubjMsg"> + Foto mit Standardbetreff bzw. -nachricht als E-Mail versenden? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ErrorProcessingSnapshot"> + Fehler beim Verarbeiten der Fotodaten + </notification> + <notification name="ErrorEncodingSnapshot"> + Fehler beim Erstellen des Fotos! + </notification> + <notification name="ErrorUploadingPostcard"> + Ein Foto konnte aus folgendem Grund nicht gesendet werden: [REASON] + </notification> + <notification name="ErrorUploadingReportScreenshot"> + Ein Report-Screenshot konnte aus folgendem Grund nicht hochgeladen werden: [REASON] + </notification> + <notification name="MustAgreeToLogIn"> + Bevor Sie sich in [SECOND_LIFE] anmelden können, müssen Sie den Nutzungsbedingungen zustimmen. + </notification> + <notification name="CouldNotPutOnOutfit"> + Outfit konnte nicht angezogen werden. +Der Outfit-Ordner enthält keine Kleidung, Körperteile oder Anhänge. + </notification> + <notification name="CannotWearTrash"> + Kleider oder Körperteile im Papierkorb können nicht getragen werden + </notification> + <notification name="CannotWearInfoNotComplete"> + Sie können das Objekt nicht anziehen, weil es noch nicht geladen wurde. Warten Sie kurz und versuchen Sie es dann noch einmal. + </notification> + <notification name="MustHaveAccountToLogIn"> + Hoppla! Da fehlt noch etwas. +Geben Sie bitte den Vor- und den Nachnamen Ihres Avatars ein. + +Sie benötigen ein Benutzerkonto, um [SECOND_LIFE] betreten zu können. Möchten Sie jetzt ein Benutzerkonto anlegen? + <url name="url"> + https://join.secondlife.com/index.php?lang=de-DE + </url> + <usetemplate name="okcancelbuttons" notext="Erneut versuchen" yestext="Neues Benutzerkonto anlegen"/> + </notification> + <notification name="AddClassified"> + Anzeigen erscheinen für eine Woche unter „Anzeigen“ im Suchverzeichnis. Füllen Sie Ihre Anzeige aus und klicken Sie auf „Veröffentlichen...“, um sie zum Verzeichnis hinzuzufügen. Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf „Veröffentlichen“ klicken. Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht, erscheint Ihre Anzeige weiter oben in der Liste. + <usetemplate ignoretext="So wird eine neue Anzeige erstellt" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="DeleteClassified"> + Anzeige „[NAME]“ löschen? +Gebühren werden nicht rückerstattet. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ClassifiedSave"> + Änderung an Anzeige [NAME] speichern? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> + </notification> + <notification name="DeleteAvatarPick"> + Auswahl [PICK] löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="PromptGoToEventsPage"> + Zur [SECOND_LIFE] Events-Webseite? + <url name="url"> + http://de.secondlife.com/events/ + </url> + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="SelectProposalToView"> + Wählen Sie ein Angebot zur Ansicht. + </notification> + <notification name="SelectHistoryItemToView"> + Wählen Sie ein Element zur Ansicht. + </notification> + <notification name="ResetShowNextTimeDialogs"> + Möchten Sie alle Popups wieder aktivieren, die Sie zuvor auf „Nicht mehr anzeigen“ gesetzt haben? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="SkipShowNextTimeDialogs"> + Möchten Sie alle Popups, die übersprungen werden können, deaktivieren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="CacheWillClear"> + Der Cache wird nach einem Neustart von [APP_NAME] geleert. + </notification> + <notification name="CacheWillBeMoved"> + Der Cache wird nach einem Neustart von [APP_NAME] verschoben. +Hinweis: Der Cache wird dabei gelöscht/geleert. + </notification> + <notification name="ChangeConnectionPort"> + Die Port-Einstellungen werden nach einem Neustart von [APP_NAME] wirksam. + </notification> + <notification name="ChangeSkin"> + Die neue Benutzeroberfläche wird nach einem Neustart von [APP_NAME] angewendet. + </notification> + <notification name="GoToAuctionPage"> + Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder ein Gebot abzugeben? + <url name="url"> + http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] + </url> + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="SaveChanges"> + Änderungen speichern? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/> + </notification> + <notification name="GestureSaveFailedTooManySteps"> + Speichern der Geste fehlgeschlagen. +Die Geste besteht aus zu vielen Schritten. +Löschen Sie einige Schritte und versuchen Sie es erneut. + </notification> + <notification name="GestureSaveFailedTryAgain"> + Speichern der Geste fehlgeschlagen. Warten Sie kurz und versuchen Sie es dann noch einmal. + </notification> + <notification name="GestureSaveFailedObjectNotFound"> + Geste konnte nicht gespeichert werden, da das Objekt oder das zugehörige Objektinventar nicht gefunden wurden. +Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. + </notification> + <notification name="GestureSaveFailedReason"> + Eine Geste konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie die Geste bitte später. + </notification> + <notification name="SaveNotecardFailObjectNotFound"> + Notizkarte konnte nicht gespeichert werden, da das Objekt oder das zugehörige Objektinventar nicht gefunden wurden. +Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. + </notification> + <notification name="SaveNotecardFailReason"> + Eine Notizkarte konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie die Notizkarte bitte später. + </notification> + <notification name="ScriptCannotUndo"> + Es konnten nicht alle Änderungen in Ihrer Skriptversion rückgängig gemacht werden. +Möchten Sie die letzte gespeicherte Version vom Server laden? +(**Warnung** Dieser Vorgang kann nicht rückgängig gemacht werden.) + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="SaveScriptFailReason"> + Ein Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie das Skript bitte später. + </notification> + <notification name="SaveScriptFailObjectNotFound"> + Skript konnte nicht gespeichert werden, weil das zugehörige Objekt nicht gefunden wurde. +Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. + </notification> + <notification name="SaveBytecodeFailReason"> + Ein kompiliertes Skript konnte aus folgendem Grund nicht gespeichert werden: [REASON]. Speichern Sie das Skript bitte später. + </notification> + <notification name="StartRegionEmpty"> + Sie haben keine Start-Region festgelegt. +Bitte geben Sie den Namen der Region im Feld „Startposition“ ein oder wählen Sie „Mein letzter Standort“ oder „Mein Heimatort“ als Startposition aus. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CouldNotStartStopScript"> + Skript konnte nicht gestartet oder beendet werden, weil das zugehörige Objekt nicht gefunden wurde. +Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht. + </notification> + <notification name="CannotDownloadFile"> + Dateidownload nicht möglich + </notification> + <notification name="CannotWriteFile"> + Datei [[FILE]] kann nicht geschrieben werden + </notification> + <notification name="UnsupportedHardware"> + Achtung: Ihr System erfüllt nicht die Mindestanforderungen von [APP_NAME]. Dies kann eine schlechte Darstellungsleistung in [APP_NAME] zur Folge haben. Bei nicht unterstützten Systemkonfigurationen kann Ihnen unsere [SUPPORT_SITE] leider nicht helfen. + +MINDESTANF. +Die Seite [_URL] für weitere Informationen öffnen? + <url name="url" option="0"> + http://secondlife.com/support/sysreqs.php?lang=de + </url> + <usetemplate ignoretext="Meine Hardware wird nicht unterstützt" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="UnknownGPU"> + Ihr System verwendet eine uns zurzeit unbekannte Grafikkarte. +Dies passiert dann, wenn die neue Hardware noch nicht mit [APP_NAME] getestet wurde. [APP_NAME] wird wahrscheinlich korrekt ausgeführt werden, jedoch sollten Sie Ihre Grafikeinstellungen anpassen, um eine bessere Darstellung zu erzielen. +(Einstellungen > Grafik). + <form name="form"> + <ignore name="ignore" text="Meine Grafikkarte konnte nicht identifiziert werden."/> + </form> + </notification> + <notification name="DisplaySettingsNoShaders"> + [APP_NAME] ist bei der Initialisierung der Grafiktreiber abgestürzt. +Die Grafikqualität wird auf eine niedrige Stufe zurückgesetzt, um einige typische Treiberfehler zu vermeiden. +Einige Grafikfunktionen werden ausgeschaltet. +Wir empfehlen die Aktualisierung Ihrer Grafikkartentreiber. +Sie können die Grafikqualität unter „Einstellungen“ > „Grafik“ wieder erhöhen. + </notification> + <notification name="RegionNoTerraforming"> + Die Region [REGION] erlaubt kein Terraforming. + </notification> + <notification name="CannotCopyWarning"> + Sie sind nicht berechtigt, dieses Objekt zu kopieren und verlieren es aus Ihrem Inventar, wenn Sie es weggeben. Möchten Sie dieses Objekt anbieten? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="CannotGiveItem"> + Inventarobjekt kann nicht übergeben werden. + </notification> + <notification name="TransactionCancelled"> + Transaktion abgebrochen. + </notification> + <notification name="TooManyItems"> + Es können maximal 42 Objekte auf einmal in das Inventar transferiert werden. + </notification> + <notification name="NoItems"> + Sie sind nicht berechtigt, die ausgewählten Objekte zu kopieren. + </notification> + <notification name="CannotCopyCountItems"> + Sie sind nicht berechtigt, [COUNT] der ausgewählten Objekte zu kopieren. Diese Objekte werden aus Ihrem Inventar gelöscht. +Möchten Sie diese Objekte weggeben? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="CannotGiveCategory"> + Sie sind nicht berechtigt, den ausgewählten Ordner zu kopieren. + </notification> + <notification name="FreezeAvatar"> + Diesen Avatar einfrieren? +Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten oder mit der Welt interagieren. + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Auftauen" yestext="Einfrieren"/> + </notification> + <notification name="FreezeAvatarFullname"> + [AVATAR_NAME] einfrieren? +Der Avatar wird außer Gefecht gesetzt und kann sich nicht mehr bewegen, chatten oder mit der Welt interagieren. + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Auftauen" yestext="Einfrieren"/> + </notification> + <notification name="EjectAvatarFullname"> + [AVATAR_NAME] von Ihrem Land werfen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Ausschließen und Verbannen" yestext="Ausschließen"/> + </notification> + <notification name="EjectAvatarNoBan"> + Diesen Avatar aus Ihrem Land werfen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/> + </notification> + <notification name="EjectAvatarFullnameNoBan"> + [AVATAR_NAME] aus Ihrem Land werfen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hinauswerfen"/> + </notification> + <notification name="AcquireErrorTooManyObjects"> + FEHLER: Zu viele Objekte ausgewählt. + </notification> + <notification name="AcquireErrorObjectSpan"> + FEHLER: Die Objekte überspannen mehrere Regionen. +Verschieben Sie alle betreffenden Objekte in dieselbe Region. + </notification> + <notification name="PromptGoToCurrencyPage"> + [EXTRA] + +[_URL] für Informationen zum Kauf von L$ öffnen? + <url name="url"> + http://de.secondlife.com/app/currency/ + </url> + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="UnableToLinkObjects"> + Verknüpfung dieser [COUNT] Objekte nicht möglich. +Sie können maximal [MAX] Objekte verknüpfen. + </notification> + <notification name="CannotLinkIncompleteSet"> + Sie können nur vollständige Objektsätze verknüpfen und Sie müssen mehr als ein Objekt auswählen. + </notification> + <notification name="CannotLinkModify"> + Verknüpfung nicht möglich, da Sie nicht alle Objekte bearbeiten dürfen. + +Stellen Sie sicher, dass kein Objekt gesperrt ist und alle Objekte Ihnen gehören. + </notification> + <notification name="CannotLinkDifferentOwners"> + Verknüpfung nicht möglich, da nicht alle Objekte denselben Eigentümer haben. + +Stellen Sie sicher, dass alle ausgewählten Objekte Ihnen gehören. + </notification> + <notification name="NoFileExtension"> + Kein Dateityp für Datei: „[FILE]“ + +Vergewissern Sie sich, dass die Datei den richtigen Dateityp hat. + </notification> + <notification name="InvalidFileExtension"> + Ungültige Datei-Endung [EXTENSION] +Erwartet wurde [VALIDS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotUploadSoundFile"> + Sounddatei konnte nicht hochgeladen werden: +[FILE] + </notification> + <notification name="SoundFileNotRIFF"> + Die Datei ist anscheinend keine RIFF WAVE-Datei: +[FILE] + </notification> + <notification name="SoundFileNotPCM"> + Die Datei ist anscheinend keine PCM WAVE-Audiodatei: +[FILE] + </notification> + <notification name="SoundFileInvalidChannelCount"> + Die Datei hat eine ungültige Anzahl Tonkanäle (muss Mono oder Stereo sein): +[FILE] + </notification> + <notification name="SoundFileInvalidSampleRate"> + Die Sample-Rate dieser Datei wird nicht unterstützt (muss 44,1 K sein): +[FILE] + </notification> + <notification name="SoundFileInvalidWordSize"> + Die Word-Größe dieser Datei wird nicht unterstützt (muss 8 oder 16 Bit sein): +[FILE] + </notification> + <notification name="SoundFileInvalidHeader"> + „Daten“-Chunk in WAV-Header nicht gefunden: +[FILE] + </notification> + <notification name="SoundFileInvalidTooLong"> + Audiodatei ist zu lang (max. 10 Sekunden): +[FILE] + </notification> + <notification name="ProblemWithFile"> + Problem mit Datei [FILE]: + +[ERROR] + </notification> + <notification name="CannotOpenTemporarySoundFile"> + Temporäre komprimierte Sounddatei konnte nicht geöffnet werden: [FILE] + </notification> + <notification name="UnknownVorbisEncodeFailure"> + Unbekannter Vorbis-Kodierungsfehler in: [FILE] + </notification> + <notification name="CannotEncodeFile"> + Datei konnte nicht kodiert werden: [FILE] + </notification> + <notification name="CorruptResourceFile"> + Ressourcendatei beschädigt: [FILE] + </notification> + <notification name="UnknownResourceFileVersion"> + Unbekannte Linden-Ressourcenversion in Datei: [FILE] + </notification> + <notification name="UnableToCreateOutputFile"> + Ausgabedatei konnte nicht erstellt werden: [FILE] + </notification> + <notification name="DoNotSupportBulkAnimationUpload"> + Der Mehrfach-Upload von Animationsdateien wird zurzeit von [APP_NAME] nicht unterstützt. + </notification> + <notification name="CannotUploadReason"> + Datei [FILE] kann aus folgendem Grund nicht hochgeladen werden: [REASON] +Bitte versuchen Sie es erneut. + </notification> + <notification name="LandmarkCreated"> + „[LANDMARK_NAME]“ wurde zum Ordner „[FOLDER_NAME]“ hinzugefügt. + </notification> + <notification name="CannotCreateLandmarkNotOwner"> + Sie können hier keine Landmarke erstellen, da der Landeigentümer dies verboten hat. + </notification> + <notification name="CannotRecompileSelectObjectsNoScripts"> + „Rekompilieren“ nicht möglich. +Objekt mit Skript wählen. + </notification> + <notification name="CannotRecompileSelectObjectsNoPermission"> + „Rekompilieren“ nicht möglich. + +Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen. + </notification> + <notification name="CannotResetSelectObjectsNoScripts"> + „Zurücksetzen“ nicht möglich. + +Wählen Sie Objekte mit Skripts. + </notification> + <notification name="CannotResetSelectObjectsNoPermission"> + „Zurücksetzen“ nicht möglich. + +Wählen Sie Objekte mit Skripts, die Sie bearbeiten dürfen. + </notification> + <notification name="CannotSetRunningSelectObjectsNoScripts"> + „Ausführen“ von Skripts nicht möglich. + +Wählen Sie Objekte mit Skripts. + </notification> + <notification name="CannotSetRunningNotSelectObjectsNoScripts"> + „Deaktivieren“ von Skripts nicht möglich. + +Wählen Sie Objekte mit Skripts. + </notification> + <notification name="NoFrontmostFloater"> + Kein vorderster Floater zum Speichern. + </notification> + <notification name="SeachFilteredOnShortWords"> + Ihre Suchanfrage wurde geändert. +Zu kurze Begriffe wurden entfernt. + +Ihre Suchanfrage: [FINALQUERY] + </notification> + <notification name="SeachFilteredOnShortWordsEmpty"> + Ihre Suchbegriffe sind zu kurz. +Es wurde keine Suche durchgeführt. + </notification> + <notification name="CouldNotTeleportReason"> + Teleport fehlgeschlagen. +[REASON] + </notification> + <notification name="invalid_tport"> + Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </notification> + <notification name="invalid_region_handoff"> + Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen sich zum Wechsel der Region eventuell neu anmelden. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </notification> + <notification name="blocked_tport"> + Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal. +Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an. + </notification> + <notification name="nolandmark_tport"> + Das System konnte das Landmarken-Ziel nicht finden. + </notification> + <notification name="timeout_tport"> + Das System konnte keine Teleport-Verbindung herstellen. +Versuchen Sie es später noch einmal. + </notification> + <notification name="noaccess_tport"> + Sie haben leider keinen Zugang zu diesem Teleport-Ziel. + </notification> + <notification name="missing_attach_tport"> + Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen. + </notification> + <notification name="too_many_uploads_tport"> + Die Asset-Warteschlange in dieser Region ist zurzeit überlastet. +Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region. + </notification> + <notification name="expired_tport"> + Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. + </notification> + <notification name="expired_region_handoff"> + Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. + </notification> + <notification name="no_host"> + Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut. + </notification> + <notification name="no_inventory_host"> + Das Inventarsystem ist zurzeit nicht verfügbar. + </notification> + <notification name="CannotSetLandOwnerNothingSelected"> + Landeigentümer kann nicht festgelegt werden: +Keine Parzelle ausgewählt. + </notification> + <notification name="CannotSetLandOwnerMultipleRegions"> + Eine erzwungene Landübertragung ist nicht möglich, da die Auswahl mehrere Regionen umfasst. Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut. + </notification> + <notification name="ForceOwnerAuctionWarning"> + Diese Parzelle steht zur Auktion. Eine zwangsweise Eigentumsübertragung beendet die Auktion und verärgert womöglich Einwohner, die bereits ein Gebot abgegeben haben. Eigentumsübertragung erzwingen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="CannotContentifyNothingSelected"> + Inhaltsidentifizierung nicht möglich: +Keine Parzelle ausgewählt. + </notification> + <notification name="CannotContentifyNoRegion"> + Inhaltsidentifizierung nicht möglich: +Keine Region ausgewählt. + </notification> + <notification name="CannotReleaseLandNothingSelected"> + Land kann nicht aufgegeben werden: +Keine Parzelle ausgewählt. + </notification> + <notification name="CannotReleaseLandNoRegion"> + Land kann nicht aufgegeben werden: +Region nicht gefunden. + </notification> + <notification name="CannotBuyLandNothingSelected"> + Land kann nicht gekauft werden: +Keine Parzelle ausgewählt. + </notification> + <notification name="CannotBuyLandNoRegion"> + Land kann nicht gekauft werden: +Kann die Region nicht finden, in der sich dieses Land befindet. + </notification> + <notification name="CannotCloseFloaterBuyLand"> + Das Fenster „Land kaufen“ kann erst geschlossen werden, nachdem [APP_NAME] den Transaktionspreis geschätzt hat. + </notification> + <notification name="CannotDeedLandNothingSelected"> + Land kann nicht übertragen werden: +Keine Parzelle ausgewählt. + </notification> + <notification name="CannotDeedLandNoGroup"> + Land kann nicht übertragen werden: +Keine Gruppe ausgewählt. + </notification> + <notification name="CannotDeedLandNoRegion"> + Land kann nicht übertragen werden: +Kann die Region nicht finden, in der sich dieses Land befindet. + </notification> + <notification name="CannotDeedLandMultipleSelected"> + Land kann nicht übertragen werden: +Mehrere Parzellen ausgewählt. + +Wählen Sie eine einzelne Parzelle. + </notification> + <notification name="ParcelCanPlayMedia"> + Dieser Ort kann Streaming-Medien abspielen. +Streaming-Medien erfordern eine schnelle Internet-Verbindung. + +Streaming-Medien abspielen, wenn verfügbar? +(Sie können diese Option später unter „Einstellungen“ > „Audio & Video“ ändern.) + <usetemplate name="okcancelbuttons" notext="Deaktivieren" yestext="Medien wiedergeben"/> + </notification> + <notification name="CannotDeedLandWaitingForServer"> + Land kann nicht übertragen werden: +Warte auf Server für Eigentümerinformationen. + +Bitte versuchen Sie es erneut. + </notification> + <notification name="CannotDeedLandNoTransfer"> + Land kann nicht übertragen werden: +Die Region [REGION] erlaubt keine Landübertragung. + </notification> + <notification name="CannotReleaseLandWatingForServer"> + Land kann nicht aufgegeben werden: +Server muss Parzelleninformation aktualisieren. + +Versuchen Sie es in einigen Sekunden erneut. + </notification> + <notification name="CannotReleaseLandSelected"> + Land kann nicht aufgegeben werden: +Die ausgewählten Parzellen gehören Ihnen nicht. + +Wählen Sie eine einzelne Parzelle. + </notification> + <notification name="CannotReleaseLandDontOwn"> + Land kann nicht aufgegeben werden: +Ihnen fehlt die Berechtigung zur Freigabe dieser Parzelle. +Parzellen, die Ihnen gehören, werden grün dargestellt. + </notification> + <notification name="CannotReleaseLandRegionNotFound"> + Land kann nicht aufgegeben werden: +Kann die Region nicht finden, in der sich dieses Land befindet. + </notification> + <notification name="CannotReleaseLandNoTransfer"> + Land kann nicht aufgegeben werden: +Die Region [REGION] erlaubt keine Landübertragung. + </notification> + <notification name="CannotReleaseLandPartialSelection"> + Land kann nicht aufgegeben werden: +Zum Freigeben müssen Sie eine ganze Parzelle auswählen. + +Wählen Sie eine ganze Parzelle oder teilen Sie Ihre Parzelle. + </notification> + <notification name="ReleaseLandWarning"> + Sie sind im Begriff, [AREA] qm Land aufzugeben. +Wenn Sie diese Parzelle aufgeben, wird sie ohne L$-Erstattung von Ihrem Landbesitz entfernt. + +Dieses Land aufgeben? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNothingSelected"> + Land kann nicht aufgeteilt werden: + +Keine Parzellen ausgewählt. + </notification> + <notification name="CannotDivideLandPartialSelection"> + Land kann nicht aufgeteilt werden: + +Sie haben eine ganze Parzelle ausgewählt. +Wählen Sie einen Parzellenabschnitt aus. + </notification> + <notification name="LandDivideWarning"> + Wenn Sie dieses Land teilen, wird diese Parzelle in zwei geteilt, jede mit ihren eigenen Einstellungen. Einige dieser Einstellungen werden aufgrund dieses Vorgangs zurückgesetzt. + +Land teilen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNoRegion"> + Land kann nicht aufgeteilt werden: +Kann die Region nicht finden, in der sich dieses Land befindet. + </notification> + <notification name="CannotJoinLandNoRegion"> + Land kann nicht zusammengelegt werden: +Kann die Region nicht finden, in der sich dieses Land befindet. + </notification> + <notification name="CannotJoinLandNothingSelected"> + Land kann nicht zusammengelegt werden: +Keine Parzellen ausgewählt. + </notification> + <notification name="CannotJoinLandEntireParcelSelected"> + Land kann nicht zusammengelegt werden: +Sie haben nur eine Parzelle ausgewählt. + +Wählen Sie Land auf beiden Parzellen aus. + </notification> + <notification name="CannotJoinLandSelection"> + Land kann nicht zusammengelegt werden: +Sie müssen mehrere Parzellen auswählen. + +Wählen Sie Land auf beiden Parzellen aus. + </notification> + <notification name="JoinLandWarning"> + Beim Zusammenlegen entsteht aus den vom Auswahlrechteck +erfassten Parzellen eine große Parzelle. +Sie müssen der neuen Parzelle einen Namen geben und ihre Optionen festlegen. + +Land zusammenlegen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmNotecardSave"> + Um das Objekt kopieren oder anzeigen zu können, müssen Sie zuerst diese Notizkarte speichern. Notizkarte speichern? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmItemCopy"> + Dieses Objekt in Ihr Inventar kopieren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Kopieren"/> + </notification> + <notification name="ResolutionSwitchFail"> + Auflösung konnte nicht auf [RESX] x [RESY] gesetzt werden + </notification> + <notification name="ErrorUndefinedGrasses"> + Fehler: Nicht definierte Gräser: [SPECIES] + </notification> + <notification name="ErrorUndefinedTrees"> + Fehler: Nicht definierte Bäume: [SPECIES] + </notification> + <notification name="CannotSaveWearableOutOfSpace"> + „[NAME]“ konnte nicht in Kleidungsdatei gespeichert werden. Geben Sie Speicherplatz auf dem Computer frei und speichern Sie das Kleidungsstück erneut. + </notification> + <notification name="CannotSaveToAssetStore"> + [NAME] kann nicht in Zentral-Asset-Speicher geladen werden. +Dies ist ein temporärer Fehler. Bitte passen Sie das Kleidungsstück in einigen Minuten noch einmal an und speichern Sie es erneut. + </notification> + <notification name="YouHaveBeenLoggedOut"> + Sie wurden von [SECOND_LIFE] abgemeldet: + [MESSAGE] +Klicken Sie auf „IM & Chat anzeigen“, um vorhandene Nachrichten und Chat weiterhin anzuzeigen. Klicken Sie andernfalls auf „Beenden“, um [APP_NAME] sofort zu beenden. + <usetemplate name="okcancelbuttons" notext="Beenden" yestext="IM & Chat anzeigen"/> + </notification> + <notification name="OnlyOfficerCanBuyLand"> + Landkauf für Gruppe nicht möglich: +Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen. + </notification> + <notification label="Freund hinzufügen" name="AddFriend"> + Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu verfolgen und Online-Status Benachrichtigungen zu empfangen. + +[NAME] Freundschaft anbieten? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification label="Freund hinzufügen" name="AddFriendWithMessage"> + Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu verfolgen und Online-Status Benachrichtigungen zu empfangen. + +[NAME] Freundschaft anbieten? + <form name="form"> + <input name="message"> + Wollen wir Freunde sein? + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="RemoveFromFriends"> + Möchten Sie [FIRST_NAME] [LAST_NAME] aus Ihrer Freundesliste entfernen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="RemoveMultipleFromFriends"> + Möchten Sie mehrere Freunde aus Ihrer Freundesliste entfernen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedPublicObjectsByUser"> + Möchten Sie alle geskripteten Objekte von +** [AVATAR_NAME] ** +auf allen anderen Ländern in diesem Sim löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedObjectsByUser"> + Möchten Sie ALLE geskripteten Objekte von +** [AVATAR_NAME] ** +auf ALLEN LÄNDERN in diesem Sim LÖSCHEN? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="GodDeleteAllObjectsByUser"> + Möchten Sie ALLE Objekte (einschließlich geskriptete) von +** [AVATAR_NAME] ** +auf ALLEN LÄNDERN in diesem Sim LÖSCHEN? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BlankClassifiedName"> + Geben Sie einen Namen für die Anzeige ein. + </notification> + <notification name="MinClassifiedPrice"> + Der Mindestbetrag für die Listung ist [MIN_PRICE] L$. + +Geben sie einen höheren Betrag ein. + </notification> + <notification name="ConfirmObjectDeleteLock"> + Mindestens ein ausgewähltes Objekt ist gesperrt. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopy"> + Mindestens ein ausgewähltes Objekt kann nicht kopiert werden. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoOwn"> + Mindestens eines der ausgewählten Objekt gehört nicht Ihnen. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopy"> + Mindestens ein Objekt ist gesperrt. +Mindestens ein Objekt kann nicht kopiert werden. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoOwn"> + Mindestens ein Objekt ist gesperrt. +Mindestens ein Objekt gehört nicht Ihnen. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopyNoOwn"> + Mindestens ein Objekt kann nicht kopiert werden. +Mindestens ein Objekt gehört nicht Ihnen. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> + Mindestens ein Objekt ist gesperrt. +Mindestens ein Objekt kann nicht kopiert werden. +Mindestens ein Objekt gehört nicht Ihnen. + +Möchten Sie diese Objekte löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLock"> + Mindestens ein Objekt ist gesperrt. + +Möchten Sie diese Objekte nehmen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeNoOwn"> + Nicht alle Objekte, die Sie aufgenommen haben, gehören Ihnen. +Wenn Sie fortfahren, werden die Rechte für den nächsten Eigentümer angewandt und Sie können die Objekte möglicherweise nicht bearbeiten oder kopieren. + +Möchten Sie diese Objekte nehmen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLockNoOwn"> + Mindestens ein Objekt ist gesperrt. +Nicht alle Objekte, die Sie aufgenommen haben, gehören Ihnen. +Wenn Sie fortfahren, werden die Rechte für den nächsten Eigentümer abgefragt und Sie können die Objekte möglicherweise nicht bearbeiten oder kopieren. +Die aktuelle Auswahl können Sie jedoch aufnehmen. + +Möchten Sie diese Objekte nehmen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="CantBuyLandAcrossMultipleRegions"> + Landkauf nicht möglich, da die Auswahl mehrere Regionen umfasst. + +Wählen Sie ein kleineres Gebiet und versuchen Sie es erneut. + </notification> + <notification name="DeedLandToGroup"> + Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt. +Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt. + +Der Gruppe „[GROUP_NAME]“ + [AREA] m² Land schenken? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="DeedLandToGroupWithContribution"> + Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt. +Die Schenkung beinhaltet eine Landübertragung an die Gruppe von „[FIRST_NAME] [LAST_NAME]“. +Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt. + +Der Gruppe „[GROUP_NAME]“ + [AREA] m² Land schenken? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="DisplaySetToSafe"> + Es wurden sichere Anzeige-Einstellungen gewählt, da die Option -safe verwendet wurde. + </notification> + <notification name="DisplaySetToRecommended"> + Es wurden die für Ihre Systemkonfiguration empfohlenen Anzeige-Einstellungen gewählt. + </notification> + <notification name="ErrorMessage"> + [ERROR_MESSAGE] + </notification> + <notification name="AvatarMovedDesired"> + Ihr gewünschter Zielort ist zurzeit nicht verfügbar. +Sie wurden zur nächstgelegenen Region teleportiert. + </notification> + <notification name="AvatarMovedLast"> + Ihr letzter Standort ist zurzeit nicht verfügbar. +Sie wurden zur nächstgelegenen Region teleportiert. + </notification> + <notification name="AvatarMovedHome"> + Ihr Heimatort ist zurzeit nicht verfügbar. +Sie wurden zur nächstgelegenen Region teleportiert. +Sie müssen eventuell einen neuen Heimatort festlegen. + </notification> + <notification name="ClothingLoading"> + Ihre Kleidung wird noch heruntergeladen. +Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt dargestellt sehen. + <form name="form"> + <ignore name="ignore" text="Das Herunterladen der Kleidung dauert lange"/> + </form> + </notification> + <notification name="FirstRun"> + Die Installation von [APP_NAME] ist abgeschlossen. + +Wenn Sie [SECOND_LIFE] das erste Mal verwenden, müssen Sie ein Konto anlegen, bevor Sie sich anmelden können. +Möchten Sie auf www.secondlife.com ein Konto erstellen? + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Neues Konto..."/> + </notification> + <notification name="LoginPacketNeverReceived"> + Es gibt Probleme mit der Verbindung. Möglicherweise besteht ein Problem mit Ihrer Internetverbindung oder dem [SECOND_LIFE_GRID]. + +Ãœberprüfen Sie Ihre Internetverbindung und versuchen Sie es dann erneut, oder klicken Sie auf Hilfe, um zu [SUPPORT_SITE] zu gelangen, oder klicken Sie auf Teleportieren, um nach Hause zu teleportieren. + <url name="url"> + http://de.secondlife.com/support/ + </url> + <form name="form"> + <button name="OK" text="OK"/> + <button name="Help" text="Hilfe"/> + <button name="Teleport" text="Teleportieren"/> + </form> + </notification> + <notification name="WelcomeChooseSex"> + Ihr Avatar erscheint jeden Moment. + +Benutzen Sie die Pfeiltasten, um sich fortzubewegen. +Drücken Sie F1 für Hilfe oder für weitere Informationen über [SECOND_LIFE]. +Bitte wählen Sie einen männlichen oder weiblichen Avatar. +Sie können sich später noch umentscheiden. + <usetemplate name="okcancelbuttons" notext="Weiblich" yestext="Männlich"/> + </notification> + <notification name="NotEnoughCurrency"> + [NAME] [PRICE] L$ Sie haben nicht genügend L$, um diese Aktion auszuführen. + </notification> + <notification name="GrantedModifyRights"> + [FIRST_NAME] [LAST_NAME] hat Ihnen die Erlaubnis erteilt, ihre/seine Objekte zu bearbeiten. + </notification> + <notification name="RevokedModifyRights"> + Ihnen wurden die Änderungsrechte für die Objekte von [FIRST_NAME] [LAST_NAME] entzogen. + </notification> + <notification name="FlushMapVisibilityCaches"> + Der Kartencache dieser Region wird geleert. +Diese Aktion ist nur beim Debugging sinnvoll. +(Auf dem Produktionssystem warten Sie einfach 5 Minuten. Die Karten werden nach erneuter Anmeldung automatisch aktualisiert.) + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BuyOneObjectOnly"> + Sie können jeweils nur ein Objekt kaufen. Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. + </notification> + <notification name="OnlyCopyContentsOfSingleItem"> + Es kann nur jeweils der Inhalt von einem Objekt kopiert werden. +Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="KickUsersFromRegion"> + Alle Einwohner in dieser Region nach Hause teleportieren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="EstateObjectReturn"> + Möchten Sie wirklich alle Objekte zurückgeben, die [USER_NAME] gehören? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="InvalidTerrainBitDepth"> + Die Regionstexturen konnten nicht festgelegt werden: +Die Terraintextur [TEXTURE_NUM] hat eine ungültige Bit-Tiefe [TEXTURE_BIT_DEPTH]. + +Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 und 24 Bit und klicken Sie dann erneut auf „Übernehmen“. + </notification> + <notification name="InvalidTerrainSize"> + Die Regionstexturen konnten nicht festgelegt werden: +Die Terraintextur [TEXTURE_NUM] ist mit [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y] zu groß. + +Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 und 24 Bit und klicken Sie dann erneut auf „Übernehmen“. + </notification> + <notification name="RawUploadStarted"> + Hochladen gestartet. Je nach Verbindungsgeschwindigkeit kann der Vorgang bis zu 2 Minuten dauern. + </notification> + <notification name="ConfirmBakeTerrain"> + Möchten Sie das aktuelle Terrain formen, es zum Mittelpunkt der oberen und unteren Terraingrenzen und zum Standard des „Zurücksetzen“-Tools machen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="MaxAllowedAgentOnRegion"> + Es sind maximal [MAX_AGENTS] zulässige Einwohner erlaubt. + </notification> + <notification name="MaxBannedAgentsOnRegion"> + Es sind maximal [MAX_BANNED] verbannte Einwohner erlaubt. + </notification> + <notification name="MaxAgentOnRegionBatch"> + Fehler beim Versuch, [NUM_ADDED] Agenten hinzuzufügen: +Ãœberschreitet den Grenzwert [MAX_AGENTS] [LIST_TYPE] um [NUM_EXCESS]. + </notification> + <notification name="MaxAllowedGroupsOnRegion"> + Es sind maximal [MAX_GROUPS] zulässige Gruppen erlaubt. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Formen"/> + </notification> + <notification name="MaxManagersOnRegion"> + Es sind maximal [MAX_MANAGER] verbannte Einwohner erlaub. + </notification> + <notification name="OwnerCanNotBeDenied"> + Der Eigentümer des Grundstücks kann nicht zur Liste der „Verbannten Einwohner“ hinzugefügt werden. + </notification> + <notification name="CanNotChangeAppearanceUntilLoaded"> + Das Aussehen lässt sich erst ändern, wenn Kleider und Form/Gestalt geladen sind. + </notification> + <notification name="ClassifiedMustBeAlphanumeric"> + Der Name der Anzeige muss mit einem Buchstaben von A bis Z oder einer Ziffer beginnen. Satzzeichen sind nicht erlaubt. + </notification> + <notification name="CantSetBuyObject"> + „Objekt kaufen“ nicht möglich, da das Objekt nicht zum Verkauf freigegeben ist. +Geben Sie das Objekt zum Verkauf frei und versuchen Sie es erneut. + </notification> + <notification name="FinishedRawDownload"> + Raw-Terrain-Datei wurde heruntergeladen nach: +[DOWNLOAD_PATH]. + </notification> + <notification name="DownloadWindowsMandatory"> + Eine neue Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können. + <usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/> + </notification> + <notification name="DownloadWindows"> + Eine aktualisierte Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> + </notification> + <notification name="DownloadWindowsReleaseForDownload"> + Eine aktualisierte Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> + </notification> + <notification name="DownloadLinuxMandatory"> + Eine neue Version von [SUPPORT_SITE] ist verfügbar. +[MESSAGE] +Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können. + <usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/> + </notification> + <notification name="DownloadLinux"> + Eine neue Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> + </notification> + <notification name="DownloadLinuxReleaseForDownload"> + Eine neue Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> + </notification> + <notification name="DownloadMacMandatory"> + Eine neue Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Sie müssen das Update herunterladen, um [APP_NAME] weiter verwenden zu können. + +In Ihren Anwendungsordner herunterladen? + <usetemplate name="okcancelbuttons" notext="Beenden" yestext="Herunterladen"/> + </notification> + <notification name="DownloadMac"> + Eine aktualisierte Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. + +In Ihren Anwendungsordner herunterladen? + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> + </notification> + <notification name="DownloadMacReleaseForDownload"> + Eine aktualisierte Version von [APP_NAME] ist verfügbar. +[MESSAGE] +Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität sollte es jedoch installiert werden. + +In Ihren Anwendungsordner herunterladen? + <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> + </notification> + <notification name="DeedObjectToGroup"> + Bei Ãœbertragung dieses Objekts erhält die Gruppe: +* An das Objekt bezahlte L$ + <usetemplate ignoretext="Bestätigen, bevor ich ein Objekt an eine Gruppe übertrage" name="okcancelignore" notext="Abbrechen" yestext="Ãœbertragung"/> + </notification> + <notification name="WebLaunchExternalTarget"> + Möchten Sie Ihren Internetbrowser öffnen, um diesen Inhalt anzuzeigen? + <usetemplate ignoretext="Meinen Browser starten, um eine Webseite anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="WebLaunchJoinNow"> + de.secondlife.com öffnen, um Ihr Konto zu verwalten? + <usetemplate ignoretext="Meinen Browser starten, um mein Konto zu verwalten" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="WebLaunchSecurityIssues"> + Informieren Sie sich im [SECOND_LIFE] Wiki, wie man Sicherheitsprobleme richtig meldet. + <usetemplate ignoretext="Meinen Browser starten, um anzuzeigen, wie ein Sicherheitsproblem gemeldet werden soll" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="WebLaunchQAWiki"> + Besuchen Sie das [SECOND_LIFE] QA-Wiki. + <usetemplate ignoretext="Meinen Browser starten, um das QA-Wiki anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="WebLaunchPublicIssue"> + Im [SECOND_LIFE] Allgemeine-Fragen-Tracker können Sie Fehler und andere Probleme melden. + <usetemplate ignoretext="Meinen Browser starten, um die Datenbank für Fehler und Verbesserungsvorschläge anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> + </notification> + <notification name="WebLaunchSupportWiki"> + Im offiziellen Linden-Blog finden Sie die neuesten Nachrichten und Informationen. + <usetemplate ignoretext="Meinen Browser starten, um das Blog anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLGuide"> + Möchten Sie den Scripting Guide öffnen? + <usetemplate ignoretext="Meinen Browser starten, um den Scripting Guide anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLWiki"> + Möchten Sie das LSL-Portal besuchen? + <usetemplate ignoretext="Meinen Browser starten, um das LSL-Portal anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> + </notification> + <notification name="ReturnToOwner"> + Möchten Sie die ausgewählten Objekte an ihre Eigentümer zurückgeben? Transferierbare übertragene Objekte werden ihren früheren Eigentümern zurückgegeben. + +*WARNUNG* Nicht transferierbare übertragene Objekte werden dabei gelöscht! + <usetemplate ignoretext="Bestätigen, bevor Objekte an Ihre Eigentümer zurückgegeben werden" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="GroupLeaveConfirmMember"> + Sie sind Mitglied der Gruppe [GROUP]. +Diese Gruppe verlassen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmKick"> + Möchten Sie WIRKLICH alle Benutzer aus dem Grid werfen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Alle Benutzer hinauswerfen"/> + </notification> + <notification name="MuteLinden"> + Lindens können nicht stummgeschaltet werden. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotStartAuctionAlreadyForSale"> + Eine Parzelle, die bereits zum Verkauf freigegeben ist, kann nicht versteigert werden. Deaktivieren Sie den Landverkauf, wenn Sie das Land zur Versteigerung freigeben möchten. + </notification> + <notification label="Objekt nach Name stummschalten fehlgeschlagen" name="MuteByNameFailed"> + Dieser Name ist bereits stummgeschaltet. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RemoveItemWarn"> + Diese Aktion ist zwar erlaubt, aber beim Löschen von Inhalten wird das Objekt beschädigt. Möchten Sie dieses Element löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="CantOfferCallingCard"> + Sie können gerade keine Visitenkarte übergeben. Warten Sie kurz und versuchen Sie es dann noch einmal. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CantOfferFriendship"> + Sie können gerade keine Freundschaft anbieten. Warten Sie kurz und versuchen Sie es dann noch einmal. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="BusyModeSet"> + Beschäftigt-Modus ist aktiviert. +Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachrichten) erhalten Ihre Beschäftigt-Antwort. Alle Teleport-Angebote werden abgelehnt. Alle Inventar-Angebote werden in Ihren Papierkorb geschoben. + <usetemplate ignoretext="Ich ändere meinen Status zu Beschäftigt" name="okignore" yestext="OK"/> + </notification> + <notification name="JoinedTooManyGroupsMember"> + Sie haben die maximale Anzahl an Gruppen erreicht. Bitte verlassen Sie eine andere Gruppe, um dieser beitreten zu können oder lehnen Sie das Angebot ab. +[NAME] hat Sie eingeladen, einer Gruppe beizutreten. +[INVITE] + <usetemplate name="okcancelbuttons" notext="Ablehnen" yestext="Beitreten"/> + </notification> + <notification name="KickUser"> + Beim Hinauswerfen dieses Benutzers welche Meldung anzeigen? + <form name="form"> + <input name="message"> + Sie wurden von einem Administrator abgemeldet. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="KickAllUsers"> + Beim Hinauswerfen aller Personen vom Grid welche Meldung anzeigen? + <form name="form"> + <input name="message"> + Sie wurden von einem Administrator abgemeldet. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="FreezeUser"> + Beim Einfrieren dieses Benutzers welche Meldung anzeigen? + <form name="form"> + <input name="message"> + Sie wurden eingefroren. Bewegen oder Chatten ist nicht mehr möglich. Ein Administrator wird sich über IM an Sie wenden + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="UnFreezeUser"> + Beim Auftauen dieses Benutzers welche Meldung anzeigen? + <form name="form"> + <input name="message"> + Sie sind nicht mehr eingefroren. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="OfferTeleport"> + Teleport an Ihre Position mit der folgenden Meldung anbieten? + <form name="form"> + <input name="message"> + Triff mich in [REGION] + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="OfferTeleportFromGod"> + Benutzer an Ihrem Standort herbeirufen? + <form name="form"> + <input name="message"> + Triff mich in [REGION] + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="TeleportFromLandmark"> + Möchten Sie sich wirklich teleportieren? + <usetemplate ignoretext="Bestätigen, dass ich zu einer Landmarke teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/> + </notification> + <notification name="TeleportToPick"> + Nach [PICK] teleportieren? + <usetemplate ignoretext="Bestätigen, dass ich zu einer Position in Auswahl teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/> + </notification> + <notification label="Nachricht an alle auf diesem Grundstück" name="MessageEstate"> + Geben Sie eine kurze Nachricht ein, die an jede Person auf Ihrem Grundstück gesendet wird. + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification label="Linden-Grundstück ändern" name="ChangeLindenEstate"> + Sie sind im Begriff, ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern. + +Dies ist ÄUSSERST GEFÄHRLICH, da es grundlegende Auswirkungen auf das Benutzererlebnis hat. Auf dem Mainland werden tausende Regionen geändert, was den Spaceserver stark belastet. + +Fortfahren? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification label="Zugang zu Linden-Grundstück ändern" name="ChangeLindenAccess"> + Sie sind im Begriff, die Zugangsliste für ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern. + +Dies ist GEFÄHRLICH und sollte nur erfolgen, um Objekte/L$ per Hack in und aus dem Raster zu entfernen. +Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belastet. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification label="Grundstück wählen" name="EstateAllowedAgentAdd"> + Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Erlaubnisliste hinzufügen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + </notification> + <notification label="Grundstück wählen" name="EstateAllowedAgentRemove"> + Nur für dieses Grundstück oder für alle [ALL_ESTATES] von Erlaubnisliste entfernen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + </notification> + <notification label="Grundstück wählen" name="EstateAllowedGroupAdd"> + Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Gruppen-Erlaubnisliste hinzufügen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + </notification> + <notification label="Grundstück wählen" name="EstateAllowedGroupRemove"> + Nur für dieses Grundstück oder für alle [ALL_ESTATES] von Gruppen-Erlaubnisliste entfernen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + </notification> + <notification label="Grundstück wählen" name="EstateBannedAgentAdd"> + Zugang nur für dieses Grundstück oder für [ALL_ESTATES] verweigern? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + </notification> + <notification label="Grundstück wählen" name="EstateBannedAgentRemove"> + Einwohner nur für dieses Grundstück oder für alle [ALL_ESTATES] von der Bannliste entfernen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + </notification> + <notification label="Grundstück wählen" name="EstateManagerAdd"> + Verwalter nur für dieses Grundstück oder für [ALL_ESTATES] festlegen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + </notification> + <notification label="Grundstück wählen" name="EstateManagerRemove"> + Verwalter nur für dieses Grundstück oder für [ALL_ESTATES] entfernen? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/> + </notification> + <notification label="Rauswurf bestätigen" name="EstateKickUser"> + Benutzer [EVIL_USER] von diesem Grundstück werfen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="EstateChangeCovenant"> + Möchten Sie den Grundstücksvertrag wirklich ändern? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked"> + Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind. + +Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked_KB"> + Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. + +Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten? + <url name="url"> + http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB) + </url> + <usetemplate ignoretext="Ich kann diese Region aufgrund der Alterseinstufung nicht betreten" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/> + </notification> + <notification name="RegionEntryAccessBlocked_Notify"> + Aufgrund Ihrer Alterseinstufung dürfen Sie diese Region nicht betreten. + </notification> + <notification name="RegionEntryAccessBlocked_Change"> + Sie dürfen diese Region aufgrund der Einstellung Ihrer Alterseinstufung nicht betreten. + +Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten > Einstellungen... > Allgemein. + <form name="form"> + <button name="OK" text="Einstellung ändern"/> + <button name="Cancel" text="Schließen"/> + <ignore name="ignore" text="Meine Alterseinstufung lässt nicht zu, dass ich eine Region betrete."/> + </form> + </notification> + <notification name="LandClaimAccessBlocked"> + Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind. + +Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandClaimAccessBlocked_KB"> + Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. + +Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten? + <url name="url"> + http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB) + </url> + <usetemplate ignoretext="Ich habe aufgrund der Alterseinstufung keinen Anspruch auf dieses Land" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/> + </notification> + <notification name="LandClaimAccessBlocked_Notify"> + Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. + </notification> + <notification name="LandClaimAccessBlocked_Change"> + Sie haben aufgrund der Einstellung Ihrer Alterseinstufung keinen Anspruch auf dieses Land. + +Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten > Einstellungen... > Allgemein. + <usetemplate ignoretext="Meine Alterseinstufung lässt nicht zu, dass ich auf Land Anspruch erhebe" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/> + </notification> + <notification name="LandBuyAccessBlocked"> + Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind. + +Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben und besuchen Sie unsere Knowledgebase, um mehr über Regionen mit dieser Altereinstufung zu erfahren. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandBuyAccessBlocked_KB"> + Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. + +Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten? + <url name="url"> + http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB) + </url> + <usetemplate ignoretext="Ich kann aufgrund der Alterseinstufung dieses Land nicht kaufen" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/> + </notification> + <notification name="LandBuyAccessBlocked_Notify"> + Sie können aufgrund Ihrer Alterseinstufung dieses Land nicht kaufen. + </notification> + <notification name="LandBuyAccessBlocked_Change"> + Sie können aufgrund Ihrer Einstellung für Alterseinstufung dieses Land nicht kaufen. + +Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten > Einstellungen... > Allgemein. + <usetemplate ignoretext="Meine Alterseinstufung lässt nicht zu, dass ich Land kaufe" name="okcancelignore" notext="Schließen" yestext="Einstellung ändern"/> + </notification> + <notification name="TooManyPrimsSelected"> + "Zu viele Prims wurden ausgewählt. Bitte wählen Sie höchstens [MAX_PRIM_COUNT] Prims aus und versuchen Sie es erneut." + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ProblemImportingEstateCovenant"> + Problem beim Import des Grundstückvertrags. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ProblemAddingEstateManager"> + Es gibt Probleme beim Hinzufügen eines neuen Grundstücksverwalters. Bei mindestens einem Grundstück ist die Verwalterliste voll. + </notification> + <notification name="ProblemAddingEstateGeneric"> + Problem beim Hinzufügen zu dieser Grundstücksliste. Bei mindestens einem Grundstück ist die Liste voll. + </notification> + <notification name="UnableToLoadNotecardAsset"> + Notizkarten-Asset konnte nicht geladen werden. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="NotAllowedToViewNotecard"> + Unzureichende Rechte, um die mit der angeforderten Asset-ID verbundene Notizkarte anzuzeigen. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MissingNotecardAssetID"> + Asset-ID für Notizkarte fehlt in Datenbank. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PublishClassified"> + Hinweis: Anzeigengebühren werden nicht zurückerstattet. + +Anzeige für [AMOUNT] L$ veröffentlichen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="SetClassifiedMature"> + Enthält diese Anzeige Mature-Inhalte? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="SetGroupMature"> + Beschäftigt sich diese Gruppe mit Mature-Inhalten? + <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification label="Neustart bestätigen" name="ConfirmRestart"> + Möchten Sie diese Region in 2 Minuten neu starten? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification label="Nachricht an alle in dieser Region" name="MessageRegion"> + Geben Sie eine kurze Nachricht ein, die an jede Person in dieser Region gesendet wird. + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification label="Alterseinstufung der Region ändern" name="RegionMaturityChange"> + Die Alterseinstufung dieser Region wurde aktualisiert. +Es kann eine Weile dauern, bis sich die Änderung auf die Karte auswirkt. + </notification> + <notification label="Falsche Voice-Version" name="VoiceVersionMismatch"> + Diese Version von [APP_NAME] mit dem Voice-Chat-Feature in dieser Region nicht kompatibel. Damit Voice-Chat funktioniert, müssen Sie [APP_NAME] aktualisieren. + </notification> + <notification label="Objekte können nicht gekauft werden" name="BuyObjectOneOwner"> + Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden. +Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. + </notification> + <notification label="Inhalte können nicht gekauft werden" name="BuyContentsOneOnly"> + Inhalte können jeweils nur für ein Objekt gekauft werden. +Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. + </notification> + <notification label="Inhalte können nicht gekauft werden" name="BuyContentsOneOwner"> + Objekte können nicht von mehreren Eigentümern gleichzeitig gekauft werden. +Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. + </notification> + <notification name="BuyOriginal"> + Von [OWNER] Originalobjekt für [PRICE] L$ kaufen? +Sie werden der Eigentümer dieses Objekts. +Sie können das Objekt: + Bearbeiten: [MODIFYPERM] + Kopieren: [COPYPERM] + Verkaufen oder weggeben: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BuyOriginalNoOwner"> + Originalobjekt für [PRICE] L$ kaufen? +Sie werden der Eigentümer dieses Objekts. +Sie können das Objekt: + Bearbeiten: [MODIFYPERM] + Kopieren: [COPYPERM] + Verkaufen oder weggeben: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BuyCopy"> + Von [OWNER] Kopie für [PRICE] L$ kaufen? +Das Objekt wird in Ihr Inventar kopiert. +Sie können das Objekt: + Bearbeiten: [MODIFYPERM] + Kopieren: [COPYPERM] + Verkaufen oder weggeben: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BuyCopyNoOwner"> + Kopie für [PRICE] L$ kaufen? +Das Objekt wird in Ihr Inventar kopiert. +Sie können das Objekt: + Bearbeiten: [MODIFYPERM] + Kopieren: [COPYPERM] + Verkaufen oder weggeben: [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BuyContents"> + Von [OWNER] Inhalte für [PRICE] L$ kaufen? +Die Inhalte werden in Ihr Inventar kopiert. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="BuyContentsNoOwner"> + Inhalte für [PRICE] L$ kaufen? +Die Inhalte werden in Ihr Inventar kopiert. + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmPurchase"> + Transaktion: +[ACTION] + +Möchten Sie diesen Kauf fortsetzen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmPurchasePassword"> + Transaktion: +[ACTION] + +Möchten Sie diesen Kauf fortsetzen? +Geben Sie Ihr Kennwort erneut ein und klicken Sie auf OK. + <form name="form"> + <input name="message"/> + <button name="ConfirmPurchase" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="SetPickLocation"> + Hinweis: +Sie haben die Position dieser Auswahl aktualisiert, aber die anderen Daten behalten ihre ursprünglichen Werte. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromObject"> + Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt. +Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben. + +Inventarobjekt(e) verschieben? + <usetemplate ignoretext="Warnhinweis anzeigen, bevor ich nicht kopierbare Artikel aus einem Objekt verschiebe" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromScriptedObject"> + Sie haben „nicht kopierfähige“ Inventarobjekte ausgewählt. Diese Objekte werden nicht kopiert, sondern in Ihr Inventar verschoben. +Da es sich um ein geskriptetes Objekt handelt, geht die Skriptfunktion beim Verschieben in das Inventar möglicherweise verloren. + +Inventarobjekt(e) verschieben? + <usetemplate ignoretext="Warnhinweis anzeigen, bevor ich nicht-kopierbare Artikel verschiebe, die ein geskriptetes Objekt beschädigen können" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ClickActionNotPayable"> + Achtung: Die Klickaktion „Objekt bezahlen" wurde eingestellt. Diese funktioniert jedoch nicht, wenn ein Skript mit einer Geldtransaktion () hinzugefügt wird. + <form name="form"> + <ignore name="ignore" text="I habe die Aktion „Objekt bezahlen" eingestellt, während ich ein Objekt gebaut habe, dass kein Geld()-Skript enthält."/> + </form> + </notification> + <notification name="OpenObjectCannotCopy"> + Sie haben keine Berechtigung zum Kopieren von Elementen in diesem Objekt. + </notification> + <notification name="WebLaunchAccountHistory"> + de.secondlife.com öffnen, um Ihre Konto-Statistik anzuzeigen? + <usetemplate ignoretext="Meinen Browser starten, um meine Konto-Statistik anzuzeigen" name="okcancelignore" notext="Abbrechen" yestext="Gehe zu Seite"/> + </notification> + <notification name="ConfirmQuit"> + Wirklich beenden? + <usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/> + </notification> + <notification name="HelpReportAbuseEmailLL"> + Verwenden Sie dieses Tool, um Verletzungen der Servicebedingungen und Community-Standards zu melden. Siehe: + +http://secondlife.com/corporate/tos.php +http://secondlife.com/corporate/cs.php + +Alle gemeldeten Verletzungen der Servicebedingungen und Community-Standards werden geprüft und geklärt Sie können den Prozess im Incident Report (Vorfallsbericht) verfolgen: + +http://secondlife.com/support/incidentreport.php + </notification> + <notification name="HelpReportAbuseEmailEO"> + WICHTIG: Diese Meldung wird an den Eigentümer der Region gesendet, in der Sie sich gerade befinden, nicht an Linden Lab. +- +Als besonderen Service für Einwohner und Besucher übernimmt der Eigentümer dieser Region die Bearbeitung aller anfallenden Meldungen. Von diesem Standort aus eingereichte Meldungen werden nicht von Linden Lab bearbeitet. Der Eigentümer der Region bearbeitet Meldungen auf Grundlage der Richtlinien, die im für diese Region geltenden Grundstücksvertrag festgelegt sind. +(Den Vertrag können Sie unter „Welt“ > „Land-Info“ einsehen.) +- +Das Resultat, das sich aus dieser Meldung ergibt, betrifft nur diese Region; der Einwohnerzugang zu anderen Bereichen von [SECOND_LIFE] ist davon nicht betroffen. Nur Linden Lab kann den Zugang zu [SECOND_LIFE] beschränken. + </notification> + <notification name="HelpReportAbuseSelectCategory"> + Wählen Sie eine Missbrauchskategorie aus. +Die Angabe einer Kategorie hilft uns bei der Bearbeitung des Berichts. + </notification> + <notification name="HelpReportAbuseAbuserNameEmpty"> + Geben Sie den Namen des Täters ein. +Eine genaue Angabe hilft uns, Fälle von Missbrauch zu ahnden. + </notification> + <notification name="HelpReportAbuseAbuserLocationEmpty"> + Bitte geben Sie den Ort an, an dem der Missbrauch stattgefunden hat. +Eine genaue Angabe hilft uns, Fälle von Missbrauch zu ahnden. + </notification> + <notification name="HelpReportAbuseSummaryEmpty"> + Bitte geben Sie eine Zusammenfassung des Vorfalls ein. +Eine genaue Zusammenfassung hilft uns, Fälle von Missbrauch zu ahnden. + </notification> + <notification name="HelpReportAbuseDetailsEmpty"> + Bitte geben Sie eine ausführliche Beschreibung des Vorfalls ein. +Eine möglichst genaue Beschreibung mit Namen und Einzelheiten hilft uns, Fälle von Missbrauch zu ahnden. + </notification> + <notification name="HelpReportAbuseContainsCopyright"> + Sehr geehrte(r) Einwohner(in), + +Sie melden eine Urheberrechtsverletzung. Sind Sie wirklich sicher, dass Sie eine Verletzung des Urheberrechts melden möchten? + +1. Missbrauch melden. Wenn Sie der Meinung sind, ein Einwohner nutzt das Berechtigungssystem von [SECOND_LIFE] auf unerlaubte Weise zu seinem Vorteil aus, indem er zum Beispiel einen CopyBot oder ähnliche Kopiertools verwendet und damit eine Urheberrechtsverletzung begeht, können Sie diesen Missbrauch melden. Das Missbrauchsteam untersucht etwaige Verstöße gegen die [SECOND_LIFE] Community Standards oder die Nutzungsbedingungen und verhängt entsprechende Strafen. Das Missbrauchsteam ist jedoch nicht dafür zuständig, Inhalte aus der [SECOND_LIFE]-Welt zu entfernen und reagiert auch nicht auf entsprechende Anfragen. + +2. Der DMCA oder das Entfernen von Inhalten. Sie können das Entfernen von Inhalten aus [SECOND_LIFE] beantragen. Dazu MÃœSSEN Sie eine Urheberrechtsverletzung gemäß den in unserer DMCA-Richtlinie unter http://secondlife.com/corporate/dmca.php dargelegten Anweisungen einreichen. + +Wenn Sie mit der Missbrauchmeldung jetzt fortfahren möchten, schließen Sie bitte dieses Fenster und senden Sie Ihren Bericht ein. Möglicherweise müssen Sie Kategorie „CopyBot oder Berechtigungs-Exploit“ auswählen. + +Vielen Dank, + +Linden Lab + </notification> + <notification name="FailedRequirementsCheck"> + Die folgenden erforderlichen Komponenten fehlen in [FLOATER]: +[COMPONENTS] + </notification> + <notification label="Vorhandenen Anhang ersetzen" name="ReplaceAttachment"> + An dieser Körperstelle ist bereits ein Objekt angebracht. +Möchten Sie es mit dem ausgewählten Objekt ersetzen? + <form name="form"> + <ignore name="ignore" save_option="true" text="Einen bestehenden Anhang mit dem ausgewählten Artikel ersetzen"/> + <button ignore="Automatisch ersetzen" name="Yes" text="OK"/> + <button ignore="Nie ersetzen" name="No" text="Abbrechen"/> + </form> + </notification> + <notification label="Beschäftigt-Modus-Warnung" name="BusyModePay"> + Sie sind im Beschäftigt-Modus, sodass Sie im Austausch für diese Zahlung keine Objekte erhalten können. + +Möchten Sie den Bechäftigt-Modus verlassen, bevor Sie diese Transaktion abschließen? + <form name="form"> + <ignore name="ignore" save_option="true" text="Ich bin im Begriff eine Person oder ein Objekt zu bezahlen, während ich im Modus Beschäftigt bin."/> + <button ignore="Beschäftigt-Modus immer deaktivieren" name="Yes" text="OK"/> + <button ignore="Beschäftigt-Modus aktiviert lassen" name="No" text="Abbrechen"/> + </form> + </notification> + <notification name="ConfirmEmptyTrash"> + Sind Sie sicher, dass Sie den Inhalt Ihres Papierkorbs löschen möchten? + <usetemplate ignoretext="Bestätigen, bevor der Ordner Papierkorb im Inventar geleert wird" name="okcancelignore" notext="Abbrechen" yestext="OK"/> + </notification> + <notification name="ConfirmClearBrowserCache"> + Sind Sie sicher, dass Sie Ihren Reise-, Internet- und Suchverlauf löschen möchten? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> + </notification> + <notification name="ConfirmClearCookies"> + Sind Sie sicher, dass Sie Ihre Cookies löschen möchten? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> + </notification> + <notification name="ConfirmClearMediaUrlList"> + Die Liste mit gespeicherten URLs wirklich löschen? + <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Ja"/> + </notification> + <notification name="ConfirmEmptyLostAndFound"> + Sind Sie sicher, dass Sie den Inhalt Ihres Ordners Fundbüro löschen möchten? + <usetemplate ignoretext="Bestätigen, bevor der Ordner Fundbüro im Inventar geleert wird" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="CopySLURL"> + Die folgende SLurl wurde in die Zwischenablage kopiert: + [SLURL] + +Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dieser Position zu ermöglichen. Oder versuchen Sie es selbst: kopieren Sie die SLurl in die Adressleiste eines Webbrowsers. + <form name="form"> + <ignore name="ignore" text="Slurl wurde in meine Zwischenablage kopiert"/> + </form> + </notification> + <notification name="WLSavePresetAlert"> + Die gespeicherte Voreinstellung überschreiben? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="WLDeletePresetAlert"> + [SKY] löschen? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="WLNoEditDefault"> + Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden. + </notification> + <notification name="WLMissingSky"> + Diese Tageszyklusdatei verweist auf eine fehlende Himmel-Datei: [SKY]. + </notification> + <notification name="PPSaveEffectAlert"> + Post-Processing-Effekt bereits vorhanden. Möchten Sie ihn überschreiben? + <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> + </notification> + <notification name="NewSkyPreset"> + Wählen Sie einen Namen für den neuen Himmel. + <form name="form"> + <input name="message"> + Neue Voreinstellung + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="ExistsSkyPresetAlert"> + Voreinstellung bereits vorhanden! + </notification> + <notification name="NewWaterPreset"> + Wählen Sie einen Namen für die neue Wasservoreinstellung. + <form name="form"> + <input name="message"> + Neue Voreinstellung + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="ExistsWaterPresetAlert"> + Voreinstellung bereits vorhanden! + </notification> + <notification name="WaterNoEditDefault"> + Standardvoreinstellungen können nicht bearbeitet oder gelöscht werden. + </notification> + <notification name="ChatterBoxSessionStartError"> + Neue Chat-Sitzung mit [RECIPIENT] konnte nicht gestartet werden. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ChatterBoxSessionEventError"> + [EVENT] +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ForceCloseChatterBoxSession"> + Ihre Chat-Sitzung mit [NAME] muss beendet werden. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="Cannot_Purchase_an_Attachment"> + Sie können kein Objekt kaufen, während es angehängt ist. + </notification> + <notification label="Info zur Abfrage der Abbucherlaubnis" name="DebitPermissionDetails"> + Wenn Sie dieser Anfrage zustimmen, erhält das Skript die Erlaubnis, regelmäßig Linden-Dollar (L$) von Ihrem Konto abzubuchen. Diese Erlaubnis kann nur zurückgezogen werden, wenn der Eigentümer das Objekt löscht oder die Skripts in dem Objekt zurücksetzt. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AutoWearNewClothing"> + Möchten Sie das neu erstellte Kleidungsstück automatisch anziehen? + <usetemplate ignoretext="Die Kleidung, die während dem Bearbeiten meines Aussehens erstellt wird, sofort anziehen" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="NotAgeVerified"> + Sie müssen altersüberprüft sein, um diesen Bereich betreten zu können. Möchten Sie auf der [SECOND_LIFE]-Webseite Ihr Alter verifizieren lassen? + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/verification.php?lang=de + </url> + <usetemplate ignoretext="Ich habe mein Alter nicht verifizieren lassen" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="Cannot enter parcel: no payment info on file"> + Um diesen Bereich besuchen zu können, müssen Ihre Zahlungsinformationen gespeichert sein. Möchten Sie diese Einstellung auf der [SECOND_LIFE]-Webseite einrichten? + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/index.php?lang=de + </url> + <usetemplate ignoretext="Meine Zahlungsinformation ist nicht gespeichert" name="okcancelignore" notext="Nein" yestext="Ja"/> + </notification> + <notification name="MissingString"> + Der String „[STRING_NAME]“ fehlt in strings.xml + </notification> + <notification name="SystemMessageTip"> + [MESSAGE] + </notification> + <notification name="Cancelled"> + Abgebrochen + </notification> + <notification name="CancelledSit"> + Sitzen beendet + </notification> + <notification name="CancelledAttach"> + Anhängen abgebrochen + </notification> + <notification name="ReplacedMissingWearable"> + Fehlende(s) Kleidung/Körperteil mit Standard ersetzt. + </notification> + <notification name="GroupNotice"> + Betreff: [SUBJECT], Nachricht: [MESSAGE] + </notification> + <notification name="FriendOnline"> + [FIRST] [LAST] ist online + </notification> + <notification name="FriendOffline"> + [FIRST] [LAST] ist offline + </notification> + <notification name="AddSelfFriend"> + Obwohl Sie ein sehr netter Mensch sind, können Sie sich nicht selbst als Freund hinzufügen. + </notification> + <notification name="UploadingAuctionSnapshot"> + In-Welt- und Website-Fotos werden hochgeladen... +(Dauert ca. 5 Minuten.) + </notification> + <notification name="UploadPayment"> + Sie haben für das Hochladen [AMOUNT] L$ bezahlt. + </notification> + <notification name="UploadWebSnapshotDone"> + Das Website-Foto wurde hochgeladen. + </notification> + <notification name="UploadSnapshotDone"> + In-Welt-Foto hochgeladen + </notification> + <notification name="TerrainDownloaded"> + Terrain.raw heruntergeladen + </notification> + <notification name="GestureMissing"> + Geste [NAME] fehlt in Datenbank. + </notification> + <notification name="UnableToLoadGesture"> + Geste [NAME] konnte nicht geladen werden. +Bitte versuchen Sie es erneut. + </notification> + <notification name="LandmarkMissing"> + Landmarke fehlt in Datenbank. + </notification> + <notification name="UnableToLoadLandmark"> + Landmarke konnte nicht geladen werden. Bitte versuchen Sie es erneut. + </notification> + <notification name="CapsKeyOn"> + Die Umschalttaste ist aktiv. +Dies kann die Eingabe Ihres Passworts beeinflussen. + </notification> + <notification name="NotecardMissing"> + Notizkarte fehlt in Datenbank. + </notification> + <notification name="NotecardNoPermissions"> + Ihnen fehlt die Berechtigung zur Anzeige dieser Notizkarte. + </notification> + <notification name="RezItemNoPermissions"> + Keine Berechtigung zum Rezzen von Objekten. + </notification> + <notification name="UnableToLoadNotecard"> + Notizkarten-Asset konnte nicht geladen werden. + </notification> + <notification name="ScriptMissing"> + Skript fehlt in Datenbank. + </notification> + <notification name="ScriptNoPermissions"> + Unzureichende Rechte zur Anzeige des Skripts. + </notification> + <notification name="UnableToLoadScript"> + Skript konnte nicht geladen werden. Bitte versuchen Sie es erneut. + </notification> + <notification name="IncompleteInventory"> + Die von Ihnen angebotenen Inhalte sind noch nicht vollständig lokal verfügbar. Warten Sie kurz und wiederholen Sie dann das Angebot. + </notification> + <notification name="CannotModifyProtectedCategories"> + Geschützte Kategorien können nicht geändert werden. + </notification> + <notification name="CannotRemoveProtectedCategories"> + Geschützte Kategorien können nicht entfernt werden. + </notification> + <notification name="OfferedCard"> + Sie haben [FIRST] [LAST] eine Visitenkarte angeboten. + </notification> + <notification name="UnableToBuyWhileDownloading"> + Kauf nicht möglich. Objektdaten werden noch geladen. +Bitte versuchen Sie es erneut. + </notification> + <notification name="UnableToLinkWhileDownloading"> + Verknüpfung nicht möglich. Objektdaten werden noch geladen. +Bitte versuchen Sie es erneut. + </notification> + <notification name="CannotBuyObjectsFromDifferentOwners"> + Sie können nur von einem Eigentümer auf einmal Objekte kaufen. +Wählen Sie ein einzelnes Objekt aus. + </notification> + <notification name="ObjectNotForSale"> + Dieses Objekt wird nicht verkauft. + </notification> + <notification name="EnteringGodMode"> + Gott-Modus aktiviert, Level [LEVEL] + </notification> + <notification name="LeavingGodMode"> + Gott-Modus wird nun de-aktiviert, Level [LEVEL] + </notification> + <notification name="CopyFailed"> + Ihnen fehlt die Berechtigung zum Kopieren. + </notification> + <notification name="InventoryAccepted"> + [NAME] hat Ihr Inventarangebot akzeptiert. + </notification> + <notification name="InventoryDeclined"> + [NAME] hat Ihr Inventarangebot abgelehnt. + </notification> + <notification name="ObjectMessage"> + [NAME]: [MESSAGE] + </notification> + <notification name="CallingCardAccepted"> + Ihre Visitenkarte wurde akzeptiert. + </notification> + <notification name="CallingCardDeclined"> + Ihre Visitenkarte wurde abgelehnt. + </notification> + <notification name="TeleportToLandmark"> + Jetzt, nachdem Sie das Mainland erreicht haben, können Sie sich an Positionen wie „[NAME]“ teleportieren, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Landmarken“ auswählen. +Klicken Sie eine Landmarke doppelt an und wählen Sie „Teleportieren“, um an diesen Ort zu gelangen. + </notification> + <notification name="TeleportToPerson"> + Jetzt, nachdem Sie das Mainland erreicht haben, können Sie mit Einwohnern wie „[NAME]“ Kontakt aufnehmen, indem Sie unten rechts im Fenster auf „Inventar“ klicken und den Ordner „Visitenkarten“ auswählen. +Klicken Sie die Karte doppelt an, wählen Sie „Instant Message“ und geben Sie eine Nachricht ein. + </notification> + <notification name="CantSelectLandFromMultipleRegions"> + Land kann nicht über Servergrenzen hinweg ausgewählt werden. +Wählen Sie eine kleinere Landfläche. + </notification> + <notification name="SearchWordBanned"> + Einige Begriffe in Ihrer Suchanfrage wurden ausgeschlossen, aufgrund von in den Community Standards definierten Inhaltsbeschränkungen. + </notification> + <notification name="NoContentToSearch"> + Bitte wählen Sie mindestens eine Inhaltsart für die Suche aus (PG, Mature oder Adult). + </notification> + <notification name="GroupVote"> + [NAME] hat eine Abstimmung vorgeschlagen über: +[MESSAGE] + <form name="form"> + <button name="VoteNow" text="Abstimmen"/> + <button name="Later" text="Später"/> + </form> + </notification> + <notification name="SystemMessage"> + [MESSAGE] + </notification> + <notification name="EventNotification"> + Event-Benachrichtigung: + +[NAME] +[DATE] + <form name="form"> + <button name="Teleport" text="Teleportieren"/> + <button name="Description" text="Beschreibung"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="TransferObjectsHighlighted"> + Alle Objekte auf dieser Parzelle, die an den Käufer der Parzelle übertragen werden, sind jetzt markiert. + +* Ãœbertragene Bäume und Gräser sind nicht markiert. + <form name="form"> + <button name="Done" text="Fertig"/> + </form> + </notification> + <notification name="DeactivatedGesturesTrigger"> + Gesten mit demselben Trigger wurden deaktiviert: +[NAMES] + </notification> + <notification name="NoQuickTime"> + Apple QuickTime ist auf Ihrem System anscheinend nicht installiert. +Laden Sie QuickTime von der QuickTime-Webseite (http://www.apple.com/de/quicktime) herunter, um auf Parzellen, die diese Funktion unterstützen, Streaming-Inhalte wiederzugeben. + </notification> + <notification name="NoPlugin"> + Es wurde kein Medien-Plugin gefunden, das "[MIME_TYPE]" ausführen kann. Medien dieses Dateityps sind nicht verfügbar. + </notification> + <notification name="MediaPluginFailed"> + Bei folgendem Plugin ist ein Fehler aufgetreten: + [PLUGIN] + +Bitte installieren Sie das Plugin erneut. Falls weiterhin Problem auftreten, kontaktieren Sie bitte den Hersteller. + <form name="form"> + <ignore name="ignore" text="Ein Plugin kann nicht ausgeführt werden"/> + </form> + </notification> + <notification name="OwnedObjectsReturned"> + Ihre Objekte auf der ausgewählten Parzelle wurden in Ihr Inventar transferiert. + </notification> + <notification name="OtherObjectsReturned"> + Die Objekte von [FIRST] [LAST] auf dieser Parzelle wurden in das Inventar dieser Person transferiert. + </notification> + <notification name="OtherObjectsReturned2"> + Die Objekte von [FIRST] [LAST] auf dieser +Parzelle von „[NAME]“ wurden an ihren Eigentümer zurückgegeben. + </notification> + <notification name="GroupObjectsReturned"> + Die mit der Gruppe [GROUPNAME] gemeinsam genutzten Objekte auf dieser Parzelle wurden in das Inventar ihrer Eigentümer transferiert. +Transferierbare übertragene Objekte wurden an ihre früheren Eigentümer zurückgegeben. +Nicht transferierbare an die Gruppe übertragene Objekte wurden gelöscht. + </notification> + <notification name="UnOwnedObjectsReturned"> + Alle Objekte auf der ausgewählten Parzelle, die NICHT Ihnen gehören, wurden ihren Eigentümern zurückgegeben. + </notification> + <notification name="NotSafe"> + Auf diesem Land ist Schaden aktiviert. +Verletzungen sind möglich. Wenn Sie sterben, werden Sie zu Ihrem Heimatstandort teleportiert. + </notification> + <notification name="NoFly"> + In diesem Bereich ist das Fliegen deaktiviert. +Fliegen ist hier nicht möglich. + </notification> + <notification name="PushRestricted"> + In diesem Bereich ist Stoßen nicht erlaubt. +Sie können keine anderen Personen stoßen, außer Ihnen gehört das Land. + </notification> + <notification name="NoVoice"> + In diesem Bereich ist Voice deaktiviert. Sie werden niemanden sprechen hören. + </notification> + <notification name="NoBuild"> + In diesem Bereich ist das Bauen deaktiviert. Sie können keine Objekte bauen oder rezzen. + </notification> + <notification name="ScriptsStopped"> + Ein Administrator hat die Skriptausführung in dieser Region vorübergehend deaktiviert. + </notification> + <notification name="ScriptsNotRunning"> + In dieser Region werden keine Skipts ausgeführt. + </notification> + <notification name="NoOutsideScripts"> + Auf diesem Land sind externe Skripts deaktiviert + +Hier funktionieren nur Skripts, die dem Landeigentümer gehören. + </notification> + <notification name="ClaimPublicLand"> + Öffentliches Land kann nur in der Region in Besitz genommen werden, in der Sie sich befinden. + </notification> + <notification name="RegionTPAccessBlocked"> + Sie dürfen diese Region aufgrund Ihrer Alterseinstufung nicht betreten. Sie müssen eventuell eine Altersüberprüfung vornehmen und/oder den aktuellsten Viewer installieren. + +Bitte besuchen Sie unsere Knowledgebase, um mehr Details über Zugang zu Regionen mit dieser Alterseinstufung zu erhalten. + </notification> + <notification name="URBannedFromRegion"> + Sie dürfen diese Region nicht betreten. + </notification> + <notification name="NoTeenGridAccess"> + Ihr Konto kann keine Verbindung zu dieser Teen Grid-Region herstellen. + </notification> + <notification name="ImproperPaymentStatus"> + Die für den Zutritt zu dieser Region erforderlichen Zahlungsinformationen liegen nicht vor. + </notification> + <notification name="MustGetAgeParcel"> + Sie müssen alterüberprüft sein, um diese Parzelle betreten zu können. + </notification> + <notification name="NoDestRegion"> + Keine Zielregion gefunden. + </notification> + <notification name="NotAllowedInDest"> + Der Zutritt wurde Ihnen verweigert. + </notification> + <notification name="RegionParcelBan"> + Diese Parzelle ist abgesperrt und kann nicht überquert werden. Versuchen Sie einen anderen Weg. + </notification> + <notification name="TelehubRedirect"> + Sie wurden zu einem Telehub umgeleitet. + </notification> + <notification name="CouldntTPCloser"> + Ein Teleport näher am Ziel ist leider nicht möglich. + </notification> + <notification name="TPCancelled"> + Teleport abgebrochen. + </notification> + <notification name="FullRegionTryAgain"> + Die Region, die Sie betreten möchten, ist im Moment voll. +Versuchen Sie es in einigen Minuten erneut. + </notification> + <notification name="GeneralFailure"> + Allgemeiner Fehler. + </notification> + <notification name="RoutedWrongRegion"> + In falsche Region umgeleitet. Bitte versuchen Sie es erneut. + </notification> + <notification name="NoValidAgentID"> + Keine gültige Agent ID. + </notification> + <notification name="NoValidSession"> + Keine gültige Sitzungs-ID. + </notification> + <notification name="NoValidCircuit"> + Kein gültiger Verbindungscode. + </notification> + <notification name="NoValidTimestamp"> + Kein gültiger Zeitstempel. + </notification> + <notification name="NoPendingConnection"> + Verbindung kann nicht hergestellt werden. + </notification> + <notification name="InternalUsherError"> + Interner Fehler beim Versuch, Verbindung mit Agent Usher herzustellen. + </notification> + <notification name="NoGoodTPDestination"> + In dieser Region konnte kein gültiges Teleportziel gefunden werden. + </notification> + <notification name="InternalErrorRegionResolver"> + Interner Fehler bei Teleport. + </notification> + <notification name="NoValidLanding"> + Ein gültiger Landpunkt konnte nicht gefunden werden. + </notification> + <notification name="NoValidParcel"> + Es konnte keine gültige Parzelle gefunden werden. + </notification> + <notification name="ObjectGiveItem"> + Das Objekt [OBJECTFROMNAME] von [FIRST] [LAST] hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]). + <form name="form"> + <button name="Keep" text="Behalten"/> + <button name="Discard" text="Verwerfen"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="ObjectGiveItemUnknownUser"> + Das Objekt [OBJECTFROMNAME] von (unbekannt) hat Ihnen Folgendes übergeben: [OBJECTTYPE] ([OBJECTNAME]). + <form name="form"> + <button name="Keep" text="Behalten"/> + <button name="Discard" text="Verwerfen"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="UserGiveItem"> + [NAME] hat Ihnen ein [OBJECTTYPE] namens „[OBJECTNAME]“ gegeben. + <form name="form"> + <button name="Keep" text="Behalten"/> + <button name="Discard" text="Verwerfen"/> + </form> + </notification> + <notification name="GodMessage"> + [NAME] +[MESSAGE] + </notification> + <notification name="JoinGroup"> + [MESSAGE] + <form name="form"> + <button name="Join" text="Beitreten"/> + <button name="Decline" text="Ablehnen"/> + <button name="Info" text="Info"/> + </form> + </notification> + <notification name="TeleportOffered"> + [NAME] hat angeboten, Sie zu ihrem/seinem Standort zu teleportieren: + +[MESSAGE] + <form name="form"> + <button name="Teleport" text="Teleportieren"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="GotoURL"> + [MESSAGE] +[URL] + <form name="form"> + <button name="Later" text="Später"/> + <button name="GoNow..." text="Jetzt gehen..."/> + </form> + </notification> + <notification name="OfferFriendship"> + [NAME] bietet Ihnen die Freundschaft an. + +[MESSAGE] + +(Standardmäßig werden Sie gegenseitig ihren Online-Status sehen können.) + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + </form> + </notification> + <notification name="OfferFriendshipNoMessage"> + [NAME] bietet Ihnen die Freundschaft an. + +(Sie werden dadurch den gegenseitigen Online-Status sehen können.) + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + </form> + </notification> + <notification name="FriendshipAccepted"> + [NAME] hat Ihr Freundschaftsangebot akzeptiert. + </notification> + <notification name="FriendshipDeclined"> + [NAME] hat Ihr Freundschaftsangebot abgelehnt. + </notification> + <notification name="OfferCallingCard"> + [FIRST] [LAST] bietet Ihnen eine Visitenkarte an. +Dies erstellt ein Lesezeichen in Ihrem Inventar, damit Sie diesen Einwohner jederzeit über IM erreichen. + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + </form> + </notification> + <notification name="RegionRestartMinutes"> + Region wird in [MINUTES] Minuten neu gestartet. +Wenn Sie in dieser Region bleiben, werden Sie abgemeldet. + </notification> + <notification name="RegionRestartSeconds"> + Diese Region wird in [SECONDS] neu gestartet. +Wenn Sie in dieser Region bleiben, werden Sie abgemeldet. + </notification> + <notification name="LoadWebPage"> + Webseite [URL] laden? + +[MESSAGE] + +Von Objekt: [OBJECTNAME], Eigentümer: [NAME]? + <form name="form"> + <button name="Gotopage" text="Zur Seite"/> + <button name="Cancel" text="Abbrechen"/> + </form> + </notification> + <notification name="FailedToFindWearableUnnamed"> + [TYPE] nicht in Datenbank. + </notification> + <notification name="FailedToFindWearable"> + [TYPE] namens [DESC] nicht in Datenbank. + </notification> + <notification name="InvalidWearable"> + Dieser Artikel verwendet eine Funktion, die Ihr Viewer nicht unterstützt. Bitte aktualisieren Sie Ihre Version von [APP_NAME], um diesen Artikel anziehen zu können. + </notification> + <notification name="ScriptQuestion"> + Das Objekt „[OBJECTNAME]“, Eigentum von „[NAME]“, möchte: + +[QUESTIONS] +Ist das OK? + <form name="form"> + <button name="Yes" text="Ja"/> + <button name="No" text="Nein"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="ScriptQuestionCaution"> + Ein Objekt namens „[OBJECTNAME]“ des Eigentümers „[NAME]“ möchte: + +[QUESTIONS] +Wenn Sie diesem Objekt und seinem Ersteller nicht vertrauen, sollten Sie diese Anfrage ablehnen. + +Anfrage gestatten? + <form name="form"> + <button name="Grant" text="Gewähren"/> + <button name="Deny" text="Verweigern"/> + <button name="Details" text="Info..."/> + </form> + </notification> + <notification name="ScriptDialog"> + [FIRST] [LAST]s „[TITLE]“ +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Ignorieren"/> + </form> + </notification> + <notification name="ScriptDialogGroup"> + [GROUPNAME]s „[TITLE]“ +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Ignorieren"/> + </form> + </notification> + <notification name="FirstBalanceIncrease"> + Sie haben gerade [AMOUNT] L$ erhalten. +Ihr Kontostand wird oben rechts angezeigt. + </notification> + <notification name="FirstBalanceDecrease"> + Sie haben gerade [AMOUNT] L$ bezahlt. +Ihr Kontostand wird oben rechts angezeigt. + </notification> + <notification name="FirstSit"> + Sie sitzen. +Verwenden Sie die Pfeiltasten (oder AWSD-Tasten), um sich umzusehen. +Um aufzustehen, klicken Sie auf die Schaltfläche „Aufstehen“. + </notification> + <notification name="FirstMap"> + Klicken Sie auf die Karte und bewegen Sie die Maus, um sich auf der Karte umzusehen. +Mit Doppelklick können Sie teleportieren. +Nutzen Sie die Optionen rechts, um Objekte, Einwohner oder Events anzuzeigen und einen anderen Hintergrund auszuwählen. + </notification> + <notification name="FirstBuild"> + Sie haben die Bauwerkzeuge geöffnet. Jedes Objekt, dass Sie sehen wurde mit diesen Werkzeugen gebaut. + </notification> + <notification name="FirstTeleport"> + Sie können nur zu bestimmten Bereichen in dieser Region teleportieren. Der Pfeil deutet zu Ihrem Ziel hin. Klicken Sie auf den Pfeil, um diesen auszublenden. + </notification> + <notification name="FirstOverrideKeys"> + Ihre Bewegungstasten werden jetzt von einem Objekt gesteuert. +Probieren Sie die Pfeil- oder WASD-Tasten aus. +Manche Objekte (wie Waffen) müssen per Mouselook gesteuert werden. +Drücken Sie dazu „M“. + </notification> + <notification name="FirstAppearance"> + Sie bearbeiten gerade Ihr Aussehen. +Verwenden Sie die Pfeiltasten, um sich umzusehen. +Klicken Sie auf „Alles speichern“, wenn Sie fertig sind. + </notification> + <notification name="FirstInventory"> + Dies ist Ihr Inventar. Es enthält Objekte, die Ihnen gehören. + +* Um etwas anzuziehen, ziehen Sie es mit der Maus auf Ihren Avatar. +* Um etwas inworld zu rezzen, ziehen Sie das Objekt auf den Boden. +* Zum Lesen einer Notizkarte klicken Sie sie doppelt an. + </notification> + <notification name="FirstSandbox"> + Dies ist ein Sandkasten. Hier können Einwohner lernen, wie Objekte gebaut werden. + +Objekte, die Sie hier bauen, werden gelöscht, nachdem Sie den Sandkasten verlassen. Vergessen Sie nicht, Ihr Werk mit einem Rechtsklick und der Auswahl „Nehmen“ in Ihrem Inventar zu speichern. + </notification> + <notification name="FirstFlexible"> + Dieses Objekt ist flexibel. Flexible Objekte müssen die Eigenschaft „Phantom“ haben und dürfen nicht „physisch“ sein. + </notification> + <notification name="FirstDebugMenus"> + Sie haben das Menü „Erweitert“ geöffnet. + +Um dieses Menü zu aktivieren bzw. deaktivieren: + Windows Strg-Alt-D + Mac ⌘-Opt-D + </notification> + <notification name="FirstSculptedPrim"> + Sie bearbeiten ein geformtes Primitiv. Geformte Primitive benötigen eine spezielle Textur, die ihre Form definiert. + </notification> + <notification name="MaxListSelectMessage"> + Sie können maximal [MAX_SELECT] Objekte +von der Liste auswählen. + </notification> + <notification name="VoiceInviteP2P"> + [NAME] lädt Sie zu einem Voice-Chat ein. +Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten. + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="AutoUnmuteByIM"> + [FIRST] [LAST] hat eine Instant Message erhalten; die Stummschaltung wurde aufgehoben. + </notification> + <notification name="AutoUnmuteByMoney"> + [FIRST] [LAST] hat Geld erhalten; die Stummschaltung wurde aufgehoben. + </notification> + <notification name="AutoUnmuteByInventory"> + [FIRST] [LAST] wurde ein Inventarobjekt angeboten; die Stummschaltung wurde aufgehoben. + </notification> + <notification name="VoiceInviteGroup"> + [NAME] ist einem Voice-Chat mit der Gruppe [GROUP] beigetreten. +Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Anrufer stumm zu schalten. + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="VoiceInviteAdHoc"> + [NAME] ist einem Voice-Konferenz-Chat beigetreten. +Klicken Sie auf „Akzeptieren“, um dem Gespräch beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten. + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="InviteAdHoc"> + [NAME] lädt Sie zu einem Konferenz-Chat ein. +Klicken Sie auf „Akzeptieren“, um dem Chat beizutreten, oder auf „Ablehnen“, um die Einladung auszuschlagen. Klicken Sie auf „Stummschalten“, um diesen Benutzer stumm zu schalten. + <form name="form"> + <button name="Accept" text="Akzeptieren"/> + <button name="Decline" text="Ablehnen"/> + <button name="Mute" text="Stummschalten"/> + </form> + </notification> + <notification name="VoiceChannelFull"> + Der Voice-Chat, dem Sie beitreten möchten, [VOICE_CHANNEL_NAME], hat seine maximale Teilnehmerzahl erreicht. Bitte versuchen Sie es erneut. + </notification> + <notification name="ProximalVoiceChannelFull"> + Es tut uns Leid. Dieses Gebiet hat seine maximale Kapazität für Voice-Gespräche erreicht. Bitte versuchen Sie es in einem anderen Gebiet. + </notification> + <notification name="VoiceChannelDisconnected"> + Sie haben [VOICE_CHANNEL_NAME] verlassen. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. + </notification> + <notification name="VoiceChannelDisconnectedP2P"> + [VOICE_CHANNEL_NAME] hat das Gespräch beendet. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. + </notification> + <notification name="P2PCallDeclined"> + [VOICE_CHANNEL_NAME] hat Ihren Anruf abgelehnt. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. + </notification> + <notification name="P2PCallNoAnswer"> + [VOICE_CHANNEL_NAME] ist zurzeit nicht erreichbar. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. + </notification> + <notification name="VoiceChannelJoinFailed"> + Verbindung zu [VOICE_CHANNEL_NAME] nicht möglich. Bitte versuchen Sie es später. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden. + </notification> + <notification name="VoiceLoginRetry"> + Wir erstellen einen Voice-Kanal für Sie. Bitte warten Sie einen Moment. + </notification> + <notification name="Cannot enter parcel: not a group member"> + Nur Mitglieder einer bestimmten Gruppe dürfen diesen Bereich betreten. + </notification> + <notification name="Cannot enter parcel: banned"> + Zugang zur Parzelle verweigert. Sie wurden verbannt. + </notification> + <notification name="Cannot enter parcel: not on access list"> + Zugang zur Parzelle verweigert. Sie stehen nicht auf der Zugangsliste. + </notification> + <notification name="VoiceNotAllowed"> + Sie sind nicht berechtigt, einem Voice-Chat in [VOICE_CHANNEL_NAME] beizutreten. + </notification> + <notification name="VoiceCallGenericError"> + Fehler beim Versuch, eine Voice-Chat-Verbindung zu [VOICE_CHANNEL_NAME] herzustellen. Bitte versuchen Sie es erneut. + </notification> + <notification name="ServerVersionChanged"> + Sie haben eine Region betreten, die eine andere Server-Version verwendet. Dies kann sich auf die Leistung auswirken. Klicken Sie hier, um die Versionshinweise anzuzeigen. + </notification> + <notification name="UnsupportedCommandSLURL"> + Die SLurl, auf die Sie geklickt haben, wird nicht unterstützt. + </notification> + <notification name="IMToast"> + <form name="form"> + <button name="respondbutton" text="Antworten"/> + </form> + </notification> + <notification name="AttachmentSaved"> + Der Anhang wurde gespeichert. + </notification> + <notification name="UnableToFindHelpTopic"> + Hilfethema für dieses Element wurde nicht gefunden. + </notification> + <global name="UnsupportedCPU"> + - Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen. + </global> + <global name="UnsupportedGLRequirements"> + Ihr Computer entspricht nicht den Hardwareanforderungen von [APP_NAME]. [APP_NAME] setzt eine OpenGL-Grafikkarte mit Multitextur-Unterstützung voraus. Falls Ihre Grafikkarte diese Funktion unterstützt, installieren Sie die neuesten Treiber sowie die aktuellen Service Packs und Patches für Ihr Betriebssystem. + +Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter [SUPPORT_SITE]. + </global> + <global name="UnsupportedCPUAmount"> + 796 + </global> + <global name="UnsupportedRAMAmount"> + 510 + </global> + <global name="UnsupportedGPU"> + - Ihre Grafikkarte entspricht nicht den Mindestanforderungen. + </global> + <global name="UnsupportedRAM"> + - Ihr Arbeitsspeicher entspricht nicht den Mindestanforderungen. + </global> + <global name="PermYes"> + Ja + </global> + <global name="PermNo"> + Nein + </global> + <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> + Wenn Sie ein Stück Land besitzen, können Sie dies als Ihren Heimatort festlegen. +Ansonsten können Sie auf der Karte nachsehen und dort Ort suchen, die als „Infohub“ gekennzeichnet sind. + </global> +</notifications> diff --git a/indra/newview/skins/default/xui/de/panel_edit_profile.xml b/indra/newview/skins/default/xui/de/panel_edit_profile.xml index 3203eacdb55..4a163c317e2 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_profile.xml @@ -1,45 +1,38 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="edit_profile_panel"> - <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] - </string> - <string name="AcctTypeResident" - value="Einwohner" /> - <string name="AcctTypeTrial" - value="Test" /> - <string name="AcctTypeCharterMember" - value="Charta-Mitglied" /> - <string name="AcctTypeEmployee" - value="Linden Lab-Mitarbeiter" /> - <string name="PaymentInfoUsed" - value="Zahlungsinfo verwendet" /> - <string name="PaymentInfoOnFile" - value="Zahlungsinfo archiviert" /> - <string name="NoPaymentInfoOnFile" - value="Keine Zahlungsinfo archiviert" /> - <string name="AgeVerified" - value="Altersgeprüft" /> - <string name="NotAgeVerified" - value="Nicht altersgeprüft" /> - <string name="partner_edit_link_url"> - http://www.secondlife.com/account/partners.php?lang=de - </string> - <panel name="scroll_content_panel"> - <panel name="data_panel" > - <panel name="lifes_images_panel"> - <panel name="second_life_image_panel"> - <text name="second_life_photo_title_text"> - [SECOND_LIFE]: - </text> - </panel> - </panel> - <text name="title_partner_text" value="Partner:"/> - <panel name="partner_data_panel"> - <text name="partner_text" value="[FIRST] [LAST]"/> - </panel> - <text name="text_box3"> - Antwort für Beschäftigt-Modus: - </text> - </panel> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profile Edit" name="edit_profile_panel"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="AcctTypeResident" value="Einwohner"/> + <string name="AcctTypeTrial" value="Test"/> + <string name="AcctTypeCharterMember" value="Charta-Mitglied"/> + <string name="AcctTypeEmployee" value="Linden Lab-Mitarbeiter"/> + <string name="PaymentInfoUsed" value="Zahlungsinfo verwendet"/> + <string name="PaymentInfoOnFile" value="Zahlungsinfo archiviert"/> + <string name="NoPaymentInfoOnFile" value="Keine Zahlungsinfo archiviert"/> + <string name="AgeVerified" value="Altersgeprüft"/> + <string name="NotAgeVerified" value="Nicht altersgeprüft"/> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=de + </string> + <string name="no_partner_text" value="Keiner"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="data_panel"> + <panel name="lifes_images_panel"> + <icon label="" name="2nd_life_edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/> + </panel> + <icon label="" name="real_world_edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/> + <text name="title_homepage_text"> + Webseite: + </text> + <check_box label="In Suchergebnissen anzeigen" name="show_in_search_checkbox"/> + <text name="title_acc_status_text" value="Kontostatus:"/> + </panel> + </panel> + </scroll_container> + <panel name="profile_me_buttons_panel"> + <button label="Änderungen speichern" name="save_btn"/> + <button label="Abbrechen" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_group_invite.xml b/indra/newview/skins/default/xui/de/panel_group_invite.xml index 84ba91a63f9..81a255a14f3 100644 --- a/indra/newview/skins/default/xui/de/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/de/panel_group_invite.xml @@ -1,29 +1,29 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="Mitglied einladen" name="invite_panel"> - <text name="help_text"> - Sie können mehrere Einwohner in Ihre -Gruppe einladen. Klicken Sie hierzu -auf „Einwohnerliste öffnen“. - </text> - <button label="Einwohnerliste öffnen" name="add_button" tool_tip=""/> - <name_list name="invitee_list" - tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Einwohnernamen." /> - <button label="Auswahl aus Liste löschen" name="remove_button" - tool_tip="Die oben ausgewählten Einwohner von der Einladungsliste entfernen." /> - <text> - Wählen Sie eine Rolle aus: - </text> - <text name="role_text"> - Wählen Sie eine Rolle aus: - </text> - <combo_box name="role_name" - tool_tip="Wählen Sie aus der Liste der Rollen, die Sie an Mitglieder vergeben dürfen." /> - <button label="Einladungen versenden" name="ok_button" /> - <button label="Abbrechen" name="cancel_button" /> - <string name="confirm_invite_owner_str"> - Möchten Sie wirklich (einen) neue(n) Eigentümer einladen? Dies kann nicht rückgängig gemacht werden! - </string> - <text name="loading"> - (wird geladen...) - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Mitglied einladen" name="invite_panel"> + <panel.string name="confirm_invite_owner_str"> + Möchten Sie wirklich (einen) neue(n) Eigentümer einladen? Dies kann nicht rückgängig gemacht werden! + </panel.string> + <panel.string name="loading"> + (wird geladen...) + </panel.string> + <panel.string name="already_in_group"> + Einige Avatare sind bereits Mitglied und wurden nicht eingeladen. + </panel.string> + <text name="help_text"> + Sie können mehrere Einwohner in Ihre +Gruppe einladen. Klicken Sie hierzu +auf „Einwohnerliste öffnen“. + </text> + <button label="Einwohnerliste öffnen" name="add_button" tool_tip=""/> + <name_list name="invitee_list" tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Einwohnernamen."/> + <button label="Auswahl aus Liste löschen" name="remove_button" tool_tip="Die oben ausgewählten Einwohner von der Einladungsliste entfernen."/> + <text name="role_text"> + Wählen Sie eine Rolle aus: + </text> + <combo_box name="role_name" tool_tip="Wählen Sie aus der Liste der Rollen, die Sie an Mitglieder vergeben dürfen."/> + <button label="Einladungen versenden" name="ok_button"/> + <button label="Abbrechen" name="cancel_button"/> + <string name="GroupInvitation"> + Gruppeneinladung + </string> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_group_land_money.xml b/indra/newview/skins/default/xui/de/panel_group_land_money.xml index bc39a3a1bbf..fcd8cd358fb 100644 --- a/indra/newview/skins/default/xui/de/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/de/panel_group_land_money.xml @@ -1,171 +1,170 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Land und L$" name="land_money_tab"> - <string name="help_text"> - Parzellen in Gruppenbesitz werden zusammen mit Beitragsdetails angezeigt. Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. Die Registerkarten „Planung“, „Details“ und „Verkäufe“ enthalten Informationen über die Gruppenfinanzen. - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> - Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen. - </string> - <string name="cant_view_group_accounting_text"> - Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen. - </string> - <string name="loading_txt"> - Wird geladen... - </string> - <text name="group_land_heading"> - Land in Gruppenbesitz - </text> - <scroll_list name="group_parcel_list"> - <column label="Parzellenname" name="name"/> - <column label="Region" name="location"/> - <column label="Typ" name="type"/> - <column label="Gebiet" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="Auf Karte" label_selected="Auf Karte" name="map_button"/> - <text name="total_contributed_land_label"> - Gesamtbeitrag: - </text> - <text name="total_contributed_land_value"> - [AREA] qm - </text> - <text name="total_land_in_use_label"> - Insgesamt verwendetes Land: - </text> - <text name="total_land_in_use_value"> - [AREA] qm - </text> - <text name="land_available_label"> - Land verfügbar: - </text> - <text name="land_available_value"> - [AREA] qm - </text> - <text name="your_contribution_label"> - Ihr Beitrag: - </text> - <string name="land_contrib_error"> - Ihr Landbeitrag kann nicht festgelegt werden. - </string> - <text name="your_contribution_units"> - ( qm ) - </text> - <text name="your_contribution_max_value"> - (max. [AMOUNT]) - </text> - <text name="group_over_limit_text"> - Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit das verwendete Land gehalten werden kann. - </text> - <text name="group_money_heading"> - Gruppen-L$ - </text> - <tab_container name="group_money_tab_container"> - <panel label="Planung" name="group_money_planning_tab"> - <text_editor name="group_money_planning_text"> - Wird berechnet... - </text_editor> - </panel> - <panel label="Details" name="group_money_details_tab"> - <text_editor name="group_money_details_text"> - Wird berechnet... - </text_editor> - <button label="< Früher" label_selected="< Früher" name="earlier_details_button" tool_tip="Zurück in der Zeit"/> - <button label="Später >" label_selected="Später >" name="later_details_button" tool_tip="Weiter in der Zeit"/> - </panel> - <panel label="Verkäufe" name="group_money_sales_tab"> - <text_editor name="group_money_sales_text"> - Wird berechnet... - </text_editor> - <button label="< Früher" label_selected="< Früher" name="earlier_sales_button" tool_tip="Zurück in der Zeit"/> - <button label="Später >" label_selected="Später >" name="later_sales_button" tool_tip="Weiter in der Zeit"/> - </panel> - </tab_container> -</panel> - -<!-- - -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Land und L$" name="land_money_tab"> - <string name="help_text"> - Parzellen in Gruppenbesitz werden zusammen mit Beitragsdetails angezeigt. Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. Die Registerkarten „Planung“, „Details“ und „Verkäufe“ enthalten Informationen über die Gruppenfinanzen. - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> - Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen. - </string> - <string name="cant_view_group_accounting_text"> - Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen. - </string> - <string name="loading_txt"> - Wird geladen... - </string> - <text name="group_land_heading"> - Land in Gruppenbesitz - </text> - <scroll_list name="group_parcel_list"> - <column label="Parzellenname" name="name"/> - <column label="Region" name="location"/> - <column label="Typ" name="type"/> - <column label="Gebiet" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="Auf Karte" label_selected="Auf Karte" name="map_button"/> - <text name="total_contributed_land_label"> - Gesamtbeitrag: - </text> - <text name="total_contributed_land_value"> - [AREA] qm - </text> - <text name="total_land_in_use_label"> - Insgesamt verwendetes Land: - </text> - <text name="total_land_in_use_value"> - [AREA] qm - </text> - <text name="land_available_label"> - Land verfügbar: - </text> - <text name="land_available_value"> - [AREA] qm - </text> - <text name="your_contribution_label"> - Ihr Beitrag: - </text> - <string name="land_contrib_error"> - Ihr Landbeitrag kann nicht festgelegt werden. - </string> - <text name="your_contribution_max_value"> - qm (max. [AMOUNT]) - </text> - <text name="group_over_limit_text"> - Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit -das verwendete Land gehalten werden kann. - </text> - <text name="group_money_heading"> - Gruppen-L$ - </text> - <tab_container name="group_money_tab_container"> - <panel label="Planung" name="group_money_planning_tab"> - <text_editor name="group_money_planning_text"> - Wird berechnet... - </text_editor> - </panel> - <panel label="Details" name="group_money_details_tab"> - <text_editor name="group_money_details_text"> - Wird berechnet... - </text_editor> - <button label="< Früher" label_selected="< Früher" name="earlier_details_button" tool_tip="Zurück in der Zeit"/> - <button label="Später >" label_selected="Später >" name="later_details_button" tool_tip="Weiter in der Zeit"/> - </panel> - <panel label="Verkäufe" name="group_money_sales_tab"> - <text_editor name="group_money_sales_text"> - Wird berechnet... - </text_editor> - <button label="< Früher" label_selected="< Früher" name="earlier_sales_button" tool_tip="Zurück in der Zeit"/> - <button label="Später >" label_selected="Später >" name="later_sales_button" tool_tip="Weiter in der Zeit"/> - </panel> - </tab_container> -</panel> - ---> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Land und L$" name="land_money_tab"> + <string name="help_text"> + Parzellen in Gruppenbesitz werden zusammen mit Beitragsdetails angezeigt. Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. Die Registerkarten „Planung“, „Details“ und „Verkäufe“ enthalten Informationen über die Gruppenfinanzen. + </string> + <button label="?" name="help_button"/> + <string name="cant_view_group_land_text"> + Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen. + </string> + <string name="cant_view_group_accounting_text"> + Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen. + </string> + <string name="loading_txt"> + Wird geladen... + </string> + <text name="group_land_heading"> + Land in Gruppenbesitz + </text> + <scroll_list name="group_parcel_list"> + <column label="Parzelle" name="name"/> + <column label="Region" name="location"/> + <column label="Typ" name="type"/> + <column label="Gebiet" name="area"/> + <column label="" name="hidden"/> + </scroll_list> + <button label="Karte" label_selected="Karte" name="map_button"/> + <text name="total_contributed_land_label"> + Gesamtbeitrag: + </text> + <text name="total_contributed_land_value"> + [AREA] qm + </text> + <text name="total_land_in_use_label"> + Insgesamt verwendetes Land: + </text> + <text name="total_land_in_use_value"> + [AREA] qm + </text> + <text name="land_available_label"> + Land verfügbar: + </text> + <text name="land_available_value"> + [AREA] qm + </text> + <text name="your_contribution_label"> + Ihr Beitrag: + </text> + <string name="land_contrib_error"> + Ihr Landbeitrag kann nicht festgelegt werden. + </string> + <text name="your_contribution_units"> + ( qm ) + </text> + <text name="your_contribution_max_value"> + (max. [AMOUNT]) + </text> + <text name="group_over_limit_text"> + Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit das verwendete Land gehalten werden kann. + </text> + <text name="group_money_heading"> + Gruppen-L$ + </text> + <tab_container name="group_money_tab_container"> + <panel label="Planung" name="group_money_planning_tab"> + <text_editor name="group_money_planning_text"> + Wird berechnet... + </text_editor> + </panel> + <panel label="Details" name="group_money_details_tab"> + <text_editor name="group_money_details_text"> + Wird berechnet... + </text_editor> + <button label="< Früher" label_selected="< Früher" name="earlier_details_button" tool_tip="Zurück in der Zeit"/> + <button label="Später >" label_selected="Später >" name="later_details_button" tool_tip="Weiter in der Zeit"/> + </panel> + <panel label="Verkäufe" name="group_money_sales_tab"> + <text_editor name="group_money_sales_text"> + Wird berechnet... + </text_editor> + <button label="< Früher" label_selected="< Früher" name="earlier_sales_button" tool_tip="Zurück in der Zeit"/> + <button label="Später >" label_selected="Später >" name="later_sales_button" tool_tip="Weiter in der Zeit"/> + </panel> + </tab_container> +</panel> +<!-- + +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Land und L$" name="land_money_tab"> + <string name="help_text"> + Parzellen in Gruppenbesitz werden zusammen mit Beitragsdetails angezeigt. Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. Die Registerkarten „Planung“, „Details“ und „Verkäufe“ enthalten Informationen über die Gruppenfinanzen. + </string> + <button label="?" name="help_button"/> + <string name="cant_view_group_land_text"> + Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen. + </string> + <string name="cant_view_group_accounting_text"> + Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen. + </string> + <string name="loading_txt"> + Wird geladen... + </string> + <text name="group_land_heading"> + Land in Gruppenbesitz + </text> + <scroll_list name="group_parcel_list"> + <column label="Parzellenname" name="name"/> + <column label="Region" name="location"/> + <column label="Typ" name="type"/> + <column label="Gebiet" name="area"/> + <column label="" name="hidden"/> + </scroll_list> + <button label="Auf Karte" label_selected="Auf Karte" name="map_button"/> + <text name="total_contributed_land_label"> + Gesamtbeitrag: + </text> + <text name="total_contributed_land_value"> + [AREA] qm + </text> + <text name="total_land_in_use_label"> + Insgesamt verwendetes Land: + </text> + <text name="total_land_in_use_value"> + [AREA] qm + </text> + <text name="land_available_label"> + Land verfügbar: + </text> + <text name="land_available_value"> + [AREA] qm + </text> + <text name="your_contribution_label"> + Ihr Beitrag: + </text> + <string name="land_contrib_error"> + Ihr Landbeitrag kann nicht festgelegt werden. + </string> + <text name="your_contribution_max_value"> + qm (max. [AMOUNT]) + </text> + <text name="group_over_limit_text"> + Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit +das verwendete Land gehalten werden kann. + </text> + <text name="group_money_heading"> + Gruppen-L$ + </text> + <tab_container name="group_money_tab_container"> + <panel label="Planung" name="group_money_planning_tab"> + <text_editor name="group_money_planning_text"> + Wird berechnet... + </text_editor> + </panel> + <panel label="Details" name="group_money_details_tab"> + <text_editor name="group_money_details_text"> + Wird berechnet... + </text_editor> + <button label="< Früher" label_selected="< Früher" name="earlier_details_button" tool_tip="Zurück in der Zeit"/> + <button label="Später >" label_selected="Später >" name="later_details_button" tool_tip="Weiter in der Zeit"/> + </panel> + <panel label="Verkäufe" name="group_money_sales_tab"> + <text_editor name="group_money_sales_text"> + Wird berechnet... + </text_editor> + <button label="< Früher" label_selected="< Früher" name="earlier_sales_button" tool_tip="Zurück in der Zeit"/> + <button label="Später >" label_selected="Später >" name="later_sales_button" tool_tip="Weiter in der Zeit"/> + </panel> + </tab_container> +</panel> + +--> diff --git a/indra/newview/skins/default/xui/de/panel_group_notices.xml b/indra/newview/skins/default/xui/de/panel_group_notices.xml index ff6f957a73f..137713b7712 100644 --- a/indra/newview/skins/default/xui/de/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/de/panel_group_notices.xml @@ -1,156 +1,147 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="Mitteilungen" name="notices_tab"> - <text name="help_text"> - Mitteilungen sind eine schnelle Möglichkeit, -Mitglieder auf dem Laufenden zu halten und -Objekte im Anhang zu versenden. Mitteilungen werden -nur an Mitglieder mit einer entsprechenden Rolle -gesendet. Mitteilungen können unter -„Allgemein“ ausgeschaltet werden. - </text> - <text name="no_notices_text"> - Keine älteren Mitteilungen. - </text> - <button label="?" label_selected="?" name="help_button" /> - <text name="lbl"> - Gruppenmitteilungsarchiv - </text> - <text name="lbl2"> - Mitteilungen werden 14 Tage lang aufbewahrt. Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich. - </text> - <scroll_list name="notice_list"> - <column label="" name="icon" /> - <column label="Thema" name="subject" /> - <column label="Von" name="from" /> - <column label="Datum" name="date" /> - </scroll_list> - <text name="notice_list_none_found"> - Nicht gefunden. - </text> - <button label="Neue Mitteilung" label_selected="Neue Mitteilung" - name="create_new_notice" /> - <button label="Aktualisieren" label_selected="Liste aktualisieren" - name="refresh_notices" /> - <panel label="Neue Mitteilung" name="panel_create_new_notice"> - <text name="lbl"> - Mitteilung schreiben - </text> - <text name="lbl2"> - Sie können der Mitteilung ein Objekt anfügen, indem Sie es aus dem Inventar in dieses Feld ziehen. Angehängte Objekte müssen kopier-und transferierbar sein. Ordner können nicht gesendet werden. - </text> - <text name="lbl3"> - Betreff: - </text> - <text name="lbl4"> - Nachricht: - </text> - <text name="lbl5"> - Anhängen: - </text> - <button label="Anhang entfernen" label_selected="Anhang entfernen" - name="remove_attachment" /> - <button label="Senden" label_selected="Senden" name="send_notice" /> - <panel name="drop_target" - tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." /> - </panel> - <panel label="Ältere Notiz anzeigen" name="panel_view_past_notice"> - <text name="lbl"> - Archivierte Mitteilung - </text> - <text name="lbl2"> - Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“. - </text> - <text name="lbl3"> - Betreff: - </text> - <text name="lbl4"> - Nachricht: - </text> - <button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment" /> - </panel> -</panel> - - -<!-- original file - -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="Mitteilungen" name="notices_tab"> - <text name="help_text"> - Mitteilungen sind eine schnelle Möglichkeit, -Mitglieder auf dem Laufenden zu halten und -Objekte im Anhang zu versenden. Mitteilungen werden -nur an Mitglieder mit einer entsprechenden Rolle -gesendet. Mitteilungen können unter -„Allgemein“ ausgeschaltet werden. - </text> - <text name="no_notices_text"> - Keine älteren Mitteilungen. - </text> - <button label="?" label_selected="?" name="help_button" /> - <text name="lbl"> - Gruppenmitteilungsarchiv - </text> - <text name="lbl2"> - Mitteilungen werden 14 Tage lang aufbewahrt. Klicken Sie auf eine Mitteilung, -um sie anzuzeigen. Klicken Sie „Aktualisieren“, um neue Mitteilungen zu suchen. -Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich. - </text> - <scroll_list name="notice_list"> - <column label="" name="icon" /> - <column label="Thema" name="subject" /> - <column label="Von" name="from" /> - <column label="Datum" name="date" /> - </scroll_list> - <text name="notice_list_none_found"> - Nicht gefunden. - </text> - <button label="Neue Mitteilung" label_selected="Neue Mitteilung" - name="create_new_notice" /> - <button label="Aktualisieren" label_selected="Liste aktualisieren" - name="refresh_notices" /> - <panel label="Neue Mitteilung" name="panel_create_new_notice"> - <text name="lbl"> - Mitteilung schreiben - </text> - <text name="lbl2"> - Geben Sie einen Betreff für die Mitteilung ein. Sie können der -Mitteilung ein Objekt anfügen, indem Sie es aus dem Inventar -in dieses Feld ziehen. Angehängte Objekte müssen kopier- -und transferierbar sein. Ordner können nicht gesendet werden. - </text> - <text name="lbl3"> - Betreff: - </text> - <text name="lbl4"> - Nachricht: - </text> - <text name="lbl5"> - Anhängen: - </text> - <button label="Anhang entfernen" label_selected="Anhang entfernen" - name="remove_attachment" /> - <button label="Mitteilung senden" label_selected="Mitteilung senden" name="send_notice" /> - <panel name="drop_target" - tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." /> - </panel> - <panel label="Ältere Notiz anzeigen" name="panel_view_past_notice"> - <text name="lbl"> - Archivierte Mitteilung - </text> - <text name="lbl2"> - Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“. - </text> - <text name="lbl3"> - Betreff: - </text> - <text name="lbl4"> - Nachricht: - </text> - <button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment" /> - </panel> -</panel> - ---> - - - +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Mitteilungen" name="notices_tab"> + <text name="help_text"> + Mitteilungen sind eine schnelle Möglichkeit, +Mitglieder auf dem Laufenden zu halten und +Objekte im Anhang zu versenden. Mitteilungen werden +nur an Mitglieder mit einer entsprechenden Rolle +gesendet. Mitteilungen können unter +„Allgemein“ ausgeschaltet werden. + </text> + <text name="no_notices_text"> + Keine älteren Mitteilungen. + </text> + <button label="?" label_selected="?" name="help_button"/> + <text name="lbl"> + Gruppenmitteilungsarchiv + </text> + <text name="lbl2"> + Mitteilungen werden 14 Tage lang aufbewahrt. Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich. + </text> + <scroll_list name="notice_list"> + <column label="" name="icon"/> + <column label="Thema" name="subject"/> + <column label="Von" name="from"/> + <column label="Datum" name="date"/> + </scroll_list> + <text name="notice_list_none_found"> + Nicht gefunden. + </text> + <button label="Neue Mitteilung" label_selected="Neue Mitteilung" name="create_new_notice"/> + <button label="Aktualisieren" label_selected="Liste aktualisieren" name="refresh_notices"/> + <panel label="Neue Mitteilung" name="panel_create_new_notice"> + <text name="lbl"> + Mitteilung schreiben + </text> + <text name="lbl2"> + Sie können ein Objekt zu einer Mitteilung hinzufügen, wenn Sie es aus Ihrem Inventar auf dieses Feld ziehen. Die angehängten Objekte müssen kopier- und übertragbar sein. Ordner können nicht verschickt werden. + </text> + <text name="lbl3"> + Betreff: + </text> + <text name="lbl4"> + Nachricht: + </text> + <text name="lbl5"> + Anhängen: + </text> + <button label="Anhang entfernen" label_selected="Anhang entfernen" name="remove_attachment"/> + <button label="Senden" label_selected="Senden" name="send_notice"/> + <panel name="drop_target" tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice."/> + </panel> + <panel label="Ältere Notiz anzeigen" name="panel_view_past_notice"> + <text name="lbl"> + Archivierte Mitteilung + </text> + <text name="lbl2"> + Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“. + </text> + <text name="lbl3"> + Betreff: + </text> + <text name="lbl4"> + Nachricht: + </text> + <button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment"/> + </panel> +</panel> +<!-- original file + +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel label="Mitteilungen" name="notices_tab"> + <text name="help_text"> + Mitteilungen sind eine schnelle Möglichkeit, +Mitglieder auf dem Laufenden zu halten und +Objekte im Anhang zu versenden. Mitteilungen werden +nur an Mitglieder mit einer entsprechenden Rolle +gesendet. Mitteilungen können unter +„Allgemein“ ausgeschaltet werden. + </text> + <text name="no_notices_text"> + Keine älteren Mitteilungen. + </text> + <button label="?" label_selected="?" name="help_button" /> + <text name="lbl"> + Gruppenmitteilungsarchiv + </text> + <text name="lbl2"> + Mitteilungen werden 14 Tage lang aufbewahrt. Klicken Sie auf eine Mitteilung, +um sie anzuzeigen. Klicken Sie „Aktualisieren“, um neue Mitteilungen zu suchen. +Eine Mitteilungsliste speichert maximal 200 Mitteilungen pro Gruppe täglich. + </text> + <scroll_list name="notice_list"> + <column label="" name="icon" /> + <column label="Thema" name="subject" /> + <column label="Von" name="from" /> + <column label="Datum" name="date" /> + </scroll_list> + <text name="notice_list_none_found"> + Nicht gefunden. + </text> + <button label="Neue Mitteilung" label_selected="Neue Mitteilung" + name="create_new_notice" /> + <button label="Aktualisieren" label_selected="Liste aktualisieren" + name="refresh_notices" /> + <panel label="Neue Mitteilung" name="panel_create_new_notice"> + <text name="lbl"> + Mitteilung schreiben + </text> + <text name="lbl2"> + Geben Sie einen Betreff für die Mitteilung ein. Sie können der +Mitteilung ein Objekt anfügen, indem Sie es aus dem Inventar +in dieses Feld ziehen. Angehängte Objekte müssen kopier- +und transferierbar sein. Ordner können nicht gesendet werden. + </text> + <text name="lbl3"> + Betreff: + </text> + <text name="lbl4"> + Nachricht: + </text> + <text name="lbl5"> + Anhängen: + </text> + <button label="Anhang entfernen" label_selected="Anhang entfernen" + name="remove_attachment" /> + <button label="Mitteilung senden" label_selected="Mitteilung senden" name="send_notice" /> + <panel name="drop_target" + tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." /> + </panel> + <panel label="Ältere Notiz anzeigen" name="panel_view_past_notice"> + <text name="lbl"> + Archivierte Mitteilung + </text> + <text name="lbl2"> + Klicken Sie zum Senden einer Mitteilung auf „Neue Mitteilung“. + </text> + <text name="lbl3"> + Betreff: + </text> + <text name="lbl4"> + Nachricht: + </text> + <button label="Anlage öffnen" label_selected="Anlage öffnen" name="open_attachment" /> + </panel> +</panel> + +--> diff --git a/indra/newview/skins/default/xui/de/panel_group_roles.xml b/indra/newview/skins/default/xui/de/panel_group_roles.xml index d7f47de46fa..a8080afeb3c 100644 --- a/indra/newview/skins/default/xui/de/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/de/panel_group_roles.xml @@ -1,316 +1,118 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Mitglieder und Rollen" name="roles_tab"> - <string name="default_needs_apply_text"> - Das Unterregister enthält nicht übernommene Änderungen. - </string> - <string name="want_apply_text"> - Diese Änderungen übernehmen? - </string> - <button label="?" name="help_button"/> - <panel name="members_header"> - <text name="static"> - Mitglieder und Rollen - </text> - <text name="static2"> - Gruppenmitgliedern werden Rollen mit Fähigkeiten zugewiesen. Diese Einstellungen können zur flexibleren Organisation angepasst werden. - </text> - </panel> - <panel name="roles_header"> - <text name="static"> - Rollen - </text> - <text name="role_properties_modifiable"> - Wählen Sie eine Rolle. Sie können ihren Namen, ihre Beschreibung und den Mitgliedstitel ändern. - </text> - <text name="role_properties_not_modifiable"> - Rolle anklicken um Mitglieder und Fähigkeiten anzuzeigen. - </text> - <text name="role_actions_modifiable"> - Sie können der Rolle auch Fähigkeiten zuweisen. - </text> - <text name="role_actions_not_modifiable"> - Sie können zugewiesene Fähigkeiten anzeigen, aber nicht bearbeiten. - </text> - </panel> - <panel name="actions_header"> - <text name="static"> - Fähigkeiten - </text> - <text name="static2"> - Sie können Fähigkeiten-Beschreibungen anzeigen und welche Rollen bzw. Mitglieder diese Fähigkeit haben. - </text> - </panel> - <tab_container name="roles_tab_container"> - <panel label="Mitglieder" name="members_sub_tab" tool_tip="Mitglieder"> - <button label="Suchen" name="search_button"/> - <button label="Alle anzeigen" name="show_all_button"/> - <name_list name="member_list"> - <column label="Mitgliedsname" name="name"/> - <column label="Ãœbertragene Landanteile" name="donated"/> - <column label="Letzte Anmeldung" name="online"/> - </name_list> - <button label="Neues Mitglied einladen..." name="member_invite"/> - <button label="Aus Gruppe werfen" name="member_eject"/> - <string name="help_text"> - Sie können Mitgliedern Rollen zuweisen und entziehen. -Drücken Sie die Strg-Taste und klicken Sie auf Namen, -um mehrere Mitglieder auszuwählen. - </string> - </panel> - <panel label="Rollen" name="roles_sub_tab"> - <button label="Suchen" name="search_button"/> - <button label="Alle anzeigen" name="show_all_button"/> - <scroll_list name="role_list"> - <column label="Rolle" name="name"/> - <column label="Titel" name="title"/> - <column label="Mitglieder" name="members"/> - </scroll_list> - <button label="Neue Rolle erstellen..." name="role_create"/> - <button label="Rolle löschen" name="role_delete"/> - <string name="help_text"> - Rollen haben einen Titel und umfassen bestimmte -Fähigkeiten. Mitglieder können mehrere -Rollen innehaben. Eine Gruppe kann bis zu 10 Rollen -definieren, darunter „Jeder“ und „Eigentümer“. - </string> - <string name="cant_delete_role"> - Die Rollen „Jeder“ und „Eigentümer“ können nicht gelöscht werden. - </string> - </panel> - <panel label="Fähigkeiten" name="actions_sub_tab"> - <button label="Suchen" name="search_button"/> - <button label="Alle anzeigen" name="show_all_button"/> - <scroll_list name="action_list" tool_tip="Select an Ability to view more details."> - <column label="" name="icon"/> - <column label="" name="action"/> - </scroll_list> - <string name="help_text"> - Fähigkeiten verleihen Mitgliedern in Rollen bestimmte -Rechte in einer Gruppe. Es gibt viele verschiedene Fähigkeiten. - </string> - </panel> - </tab_container> - <panel name="members_footer"> - <text name="static"> - Rollen - </text> - <text name="static2"> - Zulässige Fähigkeiten - </text> - <scroll_list name="member_assigned_roles"> - <column label="" name="checkbox"/> - <column label="" name="role"/> - </scroll_list> - <scroll_list name="member_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten."> - <column label="" name="icon"/> - <column label="" name="action"/> - </scroll_list> - </panel> - <panel name="roles_footer"> - <text name="static"> - Name - </text> - <text name="static2"> - Beschreibung - </text> - <line_editor name="role_name"> - Angestellte - </line_editor> - <text name="static3"> - Titel - </text> - <line_editor name="role_title"> - (wartet) - </line_editor> - <text_editor name="role_description"> - (wartet) - </text_editor> - <text name="static4"> - Mitglieder in Rolle - </text> - <text name="static5" tool_tip="Eine Liste der Fähigkeiten der aktuell ausgewählten Rolle."> - Zulässige Fähigkeiten - </text> - <check_box label="Mitglieder sind sichtbar" name="role_visible_in_list" tool_tip="Festlegen, ob Mitglieder in dieser Rolle auf der Registerkarte „Allgemein“ für Personen außerhalb der Gruppe sichtbar sind."/> - <scroll_list name="role_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten."> - <column label="" name="icon"/> - <column label="" name="checkbox"/> - <column label="" name="action"/> - </scroll_list> - </panel> - <panel name="actions_footer"> - <text name="static"> - Beschreibung - </text> - <text_editor name="action_description"> - Diese Fähigkeit heißt „Mitglieder aus dieser Gruppe werfen“. Eigentümer können nur von anderen Eigentümern hinausgeworfen werden. - </text_editor> - <text name="static2"> - Rollen mit Fähigkeit - </text> - <text name="static3"> - Mitglieder mit Fähigkeit - </text> - </panel> -</panel> - -<!-- original file - -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Mitglieder und Rollen" name="roles_tab"> - <string name="default_needs_apply_text"> - Das Unterregister enthält nicht übernommene Änderungen. - </string> - <string name="want_apply_text"> - Diese Änderungen übernehmen? - </string> - <button label="?" name="help_button"/> - <panel name="members_header"> - <text name="static"> - Mitglieder und Rollen - </text> - <text name="static2"> - Gruppenmitgliedern werden Rollen mit Fähigkeiten zugewiesen. Diese Einstellungen können zur flexibleren Organisation angepasst werden. - </text> - </panel> - <panel name="roles_header"> - <text name="static"> - Rollen - </text> - <text name="role_properties_modifiable"> - Wählen Sie eine Rolle. Sie können ihren Namen, ihre Beschreibung und den Mitgliedstitel ändern. - </text> - <text name="role_properties_not_modifiable"> - Rolle anklicken um Mitglieder und Fähigkeiten anzuzeigen. - </text> - <text name="role_actions_modifiable"> - Sie können der Rolle auch Fähigkeiten zuweisen. - </text> - <text name="role_actions_not_modifiable"> - Sie können zugewiesene Fähigkeiten anzeigen, aber nicht bearbeiten. - </text> - </panel> - <panel name="actions_header"> - <text name="static"> - Fähigkeiten - </text> - <text name="static2"> - Sie können Fähigkeiten-Beschreibungen anzeigen und welche Rollen bzw. -Mitglieder diese Fähigkeit haben. - </text> - </panel> - <tab_container name="roles_tab_container"> - <panel label="Mitglieder" name="members_sub_tab" tool_tip="Mitglieder"> - <button label="Suchen" name="search_button"/> - <button label="Alle anzeigen" name="show_all_button"/> - <name_list name="member_list"> - <column label="Mitgliedsname" name="name" width="116"/> - <column label="Ãœbertragene Landanteile" name="donated" width="156"/> - <column label="Letzte Anmeldung" name="online"/> - </name_list> - <button label="Neues Mitglied einladen..." name="member_invite"/> - <button label="Aus Gruppe werfen" name="member_eject"/> - <string name="help_text"> - Sie können Mitgliedern Rollen zuweisen und entziehen. -Drücken Sie die Strg-Taste und klicken Sie auf Namen, -um mehrere Mitglieder auszuwählen. - </string> - </panel> - <panel label="Rollen" name="roles_sub_tab"> - <button label="Suchen" name="search_button"/> - <button label="Alle anzeigen" name="show_all_button"/> - <scroll_list name="role_list"> - <column label="Rolle" name="name" width="126"/> - <column label="Titel" name="title" width="180"/> - <column label="Mitglieder" name="members" width="82"/> - </scroll_list> - <button label="Neue Rolle erstellen..." name="role_create"/> - <button label="Rolle löschen" name="role_delete"/> - <string name="help_text"> - Rollen haben einen Titel und umfassen bestimmte -Fähigkeiten. Mitglieder können mehrere -Rollen innehaben. Eine Gruppe kann bis zu 10 Rollen -definieren, darunter „Jeder“ und „Eigentümer“. - </string> - <string name="cant_delete_role"> - Die Rollen „Jeder“ und „Eigentümer“ können nicht gelöscht werden. - </string> - </panel> - <panel label="Fähigkeiten" name="actions_sub_tab"> - <button label="Suchen" name="search_button"/> - <button label="Alle anzeigen" name="show_all_button"/> - <scroll_list name="action_list" tool_tip="Select an Ability to view more details."> - <column label="" name="icon"/> - <column label="" name="action"/> - </scroll_list> - <string name="help_text"> - Fähigkeiten verleihen Mitgliedern in Rollen bestimmte -Rechte in einer Gruppe. Es gibt viele verschiedene Fähigkeiten. - </string> - </panel> - </tab_container> - <panel name="members_footer"> - <text name="static"> - Rollen - </text> - <text name="static2"> - Zulässige Fähigkeiten - </text> - <scroll_list name="member_assigned_roles"> - <column label="" name="checkbox"/> - <column label="" name="role"/> - </scroll_list> - <scroll_list name="member_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten."> - <column label="" name="icon"/> - <column label="" name="action"/> - </scroll_list> - </panel> - <panel name="roles_footer"> - <text name="static"> - Name - </text> - <text name="static2"> - Beschreibung - </text> - <line_editor name="role_name"> - Angestellte - </line_editor> - <text name="static3"> - Titel - </text> - <line_editor name="role_title"> - (wartet) - </line_editor> - <text_editor name="role_description"> - (wartet) - </text_editor> - <text name="static4"> - Mitglieder in Rolle - </text> - <text name="static5" tool_tip="Eine Liste der Fähigkeiten der aktuell ausgewählten Rolle."> - Zulässige Fähigkeiten - </text> - <check_box label="Mitglieder sind sichtbar" name="role_visible_in_list" tool_tip="Festlegen, ob Mitglieder in dieser Rolle auf der Registerkarte „Allgemein“ für Personen außerhalb der Gruppe sichtbar sind."/> - <scroll_list name="role_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten."> - <column label="" name="icon"/> - <column label="" name="checkbox"/> - <column label="" name="action"/> - </scroll_list> - </panel> - <panel name="actions_footer"> - <text name="static"> - Beschreibung - </text> - <text_editor name="action_description"> - Diese Fähigkeit heißt „Mitglieder aus dieser Gruppe werfen“. Eigentümer können nur von anderen Eigentümern hinausgeworfen werden. - </text_editor> - <text name="static2"> - Rollen mit Fähigkeit - </text> - <text name="static3"> - Mitglieder mit Fähigkeit - </text> - </panel> -</panel> - ---> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Mitglieder und Rollen" name="roles_tab"> + <panel.string name="default_needs_apply_text"> + Das Unterregister enthält nicht übernommene Änderungen. + </panel.string> + <panel.string name="want_apply_text"> + Diese Änderungen übernehmen? + </panel.string> + <tab_container name="roles_tab_container"> + <panel label="Mitglieder" name="members_sub_tab" tool_tip="Mitglieder"> + <panel.string name="help_text"> + Sie können Mitgliedern Rollen zuweisen und entziehen. +Drücken Sie die Strg-Taste und klicken Sie auf Namen, +um mehrere Mitglieder auszuwählen. + </panel.string> + <filter_editor label="Mitglieder filtern" name="filter_input"/> + <name_list name="member_list"> + <name_list.columns label="Mitglied" name="name"/> + <name_list.columns label="Ãœbereignungen" name="donated"/> + <name_list.columns label="Online" name="online"/> + </name_list> + <button label="Einladen" name="member_invite"/> + <button label="Hinauswerfen" name="member_eject"/> + </panel> + <panel label="Rollen" name="roles_sub_tab"> + <panel.string name="help_text"> + Rollen haben einen Titel und umfassen bestimmte +Fähigkeiten. Mitglieder können mehrere +Rollen innehaben. Eine Gruppe kann bis zu 10 Rollen +definieren, darunter „Jeder“ und „Eigentümer“. + </panel.string> + <panel.string name="cant_delete_role"> + Die Rollen „Jeder“ und „Eigentümer“ können nicht gelöscht werden. + </panel.string> + <filter_editor label="Rollen filtern" name="filter_input"/> + <scroll_list name="role_list"> + <scroll_list.columns label="Rolle" name="name"/> + <scroll_list.columns label="Titel" name="title"/> + <scroll_list.columns label="Mitglieder" name="members"/> + </scroll_list> + <button label="Rolle hinzufügen" name="role_create"/> + <button label="Rolle löschen" name="role_delete"/> + </panel> + <panel label="Fähigkeiten" name="actions_sub_tab" tool_tip="Sie können Fähigkeiten-Beschreibungen anzeigen und welche Rollen bzw. Mitglieder über diese Fähigkeit verfügen."> + <panel.string name="help_text"> + Fähigkeiten verleihen Mitgliedern in Rollen bestimmte +Rechte in einer Gruppe. Es gibt viele verschiedene Fähigkeiten. + </panel.string> + <filter_editor label="Fähigkeiten filtern" name="filter_input"/> + <scroll_list name="action_list" tool_tip="Select an Ability to view more details."> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + </tab_container> + <panel name="members_footer"> + <text name="static"> + Rollen + </text> + <scroll_list name="member_assigned_roles"> + <scroll_list.columns label="" name="checkbox"/> + <scroll_list.columns label="" name="role"/> + </scroll_list> + <text name="static2"> + Zulässige Fähigkeiten + </text> + <scroll_list name="member_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten."> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + <panel name="roles_footer"> + <text name="static"> + Name + </text> + <line_editor name="role_name"> + Angestellte + </line_editor> + <text name="static3"> + Titel + </text> + <line_editor name="role_title"> + (wartet) + </line_editor> + <text name="static2"> + Beschreibung + </text> + <text_editor name="role_description"> + (wartet) + </text_editor> + <text name="static4"> + Mitglieder in Rolle + </text> + <check_box label="Mitglieder sind sichtbar" name="role_visible_in_list" tool_tip="Festlegen, ob Mitglieder in dieser Rolle auf der Registerkarte „Allgemein“ für Personen außerhalb der Gruppe sichtbar sind."/> + <text name="static5" tool_tip="Eine Liste der Fähigkeiten der aktuell ausgewählten Rolle."> + Zulässige Fähigkeiten + </text> + <scroll_list name="role_allowed_actions" tool_tip="Um detaillierte Informationen zu erlaubten Fähigkeiten anzuzeigen, siehe Reiter Fähigkeiten."> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="checkbox"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + <panel name="actions_footer"> + <text name="static"> + Beschreibung + </text> + <text_editor name="action_description"> + Diese Fähigkeit heißt „Mitglieder aus dieser Gruppe werfen“. Eigentümer können nur von anderen Eigentümern hinausgeworfen werden. + </text_editor> + <text name="static2"> + Rollen mit Fähigkeit + </text> + <text name="static3"> + Mitglieder mit Fähigkeit + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_im_control_panel.xml b/indra/newview/skins/default/xui/de/panel_im_control_panel.xml new file mode 100644 index 00000000000..487eb07b9e4 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_im_control_panel.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <button label="Profil anzeigen" name="view_profile_btn"/> + <button label="Freund hinzufügen" name="add_friend_btn"/> + <button label="Freigeben" name="share_btn"/> + <panel name="panel_call_buttons"> + <button label="Anrufen" name="call_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml index 93f2d6c2576..dc170ce245f 100644 --- a/indra/newview/skins/default/xui/de/panel_login.xml +++ b/indra/newview/skins/default/xui/de/panel_login.xml @@ -1,43 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="panel_login"> - <text name="first_name_text"> - Vorname: - </text> - <text name="last_name_text"> - Nachname: - </text> - <text name="password_text"> - Kennwort: - </text> - <text name="start_location_text"> - Startposition: - </text> - <combo_box name="start_location_combo"> - <combo_box.item name="MyHome" label="Mein Heimatort" /> - <combo_box.item name="MyLastLocation" label="Mein letzter Standort" /> - <combo_box.item name="Typeregionname" label="<Region eingeben>" /> - </combo_box> - <check_box label="Kennwort merken" name="remember_check"/> - <text name="full_screen_text"> - Die Anzeige schaltet bei Anmeldung auf Vollbild um. - </text> - <button label="Neues Konto..." label_selected="Neues Konto..." name="new_account_btn"/> - <button label="Einstellungen..." label_selected="Einstellungen..." name="preferences_btn"/> - <button label="Anmelden" label_selected="Anmelden" name="connect_btn"/> - <button label="Beenden" label_selected="Beenden" name="quit_btn"/> - <text name="version_text"> - 1.23.4 (5) - </text> - <text name="create_new_account_text"> - Konto erstellen - </text> - <text name="channel_text"> - [VERSION] - </text> - <text name="forgot_password_text"> - Namen oder Kennwort vergessen? - </text> - <text name="forgot_password_url"> - http://secondlife.com/account/request.php - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="create_account_url"> + http://de.secondlife.com/registration/ + </panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php + </panel.string> + <panel name="login_widgets"> + <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Vorname"/> + <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Nachname"/> + <text name="start_location_text"> + Startposition: + </text> + <text name="create_new_account_text"> + Neues Konto erstellen + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml new file mode 100644 index 00000000000..fb4f3e0f53d --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chat_bar"> + <line_editor label="Zum Chatten hier klicken." name="chat_box" tool_tip="Eingabe drücken, um zu sprechen, Strg-Eingabe drücken, um zu Rufen."/> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_pick_info.xml b/indra/newview/skins/default/xui/de/panel_pick_info.xml new file mode 100644 index 00000000000..8c1de575e92 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_pick_info.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_pick_info"> + <text name="title" value="Auswahl-Info"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="pick_name" value="[name]"/> + <text name="pick_location" value="[wird geladen...]"/> + <text name="pick_desc" value="[description]"/> + </panel> + </scroll_container> + <panel name="buttons"> + <button label="Teleportieren" name="teleport_btn"/> + <button label="Karte" name="show_on_map_btn"/> + <button label="Bearbeiten" name="edit_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_picks.xml b/indra/newview/skins/default/xui/de/panel_picks.xml new file mode 100644 index 00000000000..fb25fe89fdd --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_picks.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Auswahl" name="panel_picks"> + <panel label="bottom_panel" name="edit_panel"> + <button name="new_btn" tool_tip="Aktuellen Standort zur Auswahl hinzufügen"/> + </panel> + <panel name="buttons_cucks"> + <button label="Karte" name="show_on_map_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index c99ba9a118d..a9526c90149 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -1,58 +1,42 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="Text-Chat" name="chat"> - <text name="text_box"> - Chat-Schriftgröße: - </text> - <radio_group name="chat_font_size"> - <radio_item name="radio" label="Klein" /> - <radio_item name="radio2" label="Mittel" /> - <radio_item name="radio3" label="Groß" /> - </radio_group> - <color_swatch label="Sie" name="user"/> - <text name="text_box1"> - Sie - </text> - <color_swatch label="Andere" name="agent"/> - <text name="text_box2"> - Andere - </text> - <color_swatch label="IM" name="im"/> - <text name="text_box3"> - IM - </text> - <color_swatch label="System" name="system"/> - <text name="text_box4"> - System - </text> - <color_swatch label="Skriptfehler" name="script_error"/> - <text name="text_box5"> - Skriptfehler - </text> - <color_swatch label="Objekte" name="objects"/> - <text name="text_box6"> - Objekte - </text> - <color_swatch label="Eigentümer" name="owner"/> - <text name="text_box7"> - Eigentümer - </text> - <color_swatch label="Blase" name="background"/> - <text name="text_box8"> - Blase - </text> - <color_swatch label="URLs" name="links"/> - <text name="text_box9"> - URLs - </text> - <spinner label="Chat ausblenden nach" label_width="115" left="148" name="fade_chat_time" width="160"/> - <spinne left="370" name="max_chat_count"/> - <slider label="Deckkraft" name="console_opacity"/> - <check_box label="Chat verwendet volle Bildbreite (Neustart erforderlich)" name="chat_full_width_check"/> - <check_box label="Chatleiste nach Drücken der Eingabetaste schließen" name="close_chat_on_return_check"/> - <check_box label="Pfeiltasten bewegen immer den Avatar beim Chatten" name="arrow_keys_move_avatar_check"/> - <check_box label="Zeitstempel im lokalen Chat anzeigen" name="show_timestamps_check"/> - <check_box label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/> - <check_box label="Chat-Blasen anzeigen" name="bubble_text_chat"/> - <slider label="Deckkraft" name="bubble_chat_opacity"/> - <check_box label="Skriptfehler und Warnungen als normalen Chat anzeigen" name="script_errors_as_chat"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Text-Chat" name="chat"> + <radio_group name="chat_font_size"> + <radio_item label="Klein" name="radio"/> + <radio_item label="Mittel" name="radio2"/> + <radio_item label="Groß" name="radio3"/> + </radio_group> + <color_swatch label="Sie" name="user"/> + <text name="text_box1"> + Ich + </text> + <color_swatch label="Andere" name="agent"/> + <text name="text_box2"> + Andere + </text> + <color_swatch label="IM" name="im"/> + <text name="text_box3"> + IM + </text> + <color_swatch label="System" name="system"/> + <text name="text_box4"> + System + </text> + <color_swatch label="Skriptfehler" name="script_error"/> + <text name="text_box5"> + Skriptfehler + </text> + <color_swatch label="Objekte" name="objects"/> + <text name="text_box6"> + Objekte + </text> + <color_swatch label="Eigentümer" name="owner"/> + <text name="text_box7"> + Eigentümer + </text> + <color_swatch label="URLs" name="links"/> + <text name="text_box9"> + URLs + </text> + <check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/> + <check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml index fe074069087..7008389dd7f 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml @@ -1,171 +1,116 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="Grafik" name="Display panel"> - <text name="text"> - Anzeigeauflösung: - </text> - <button label=" ?" name="GraphicsPreferencesHelpButton" /> - <check_box label="Second Life in einem Fenster ausführen" name="windowed mode" /> - <text_editor name="voice_chat_description"> - Wenn deaktiviert Anzeige bei Anmeldung in Vollbild. - </text_editor> - <text name="Fullscreen Aspect Ratio:"> - Vollbild-Aspektverhältnis: - </text> - <text name="(width / height)"> - (Breite/Höhe) - </text> - <text_editor name="FullScreenInfo" width="480"> - Wenn deaktiviert, schaltet die Anzeige bei Anmeldung auf Vollbild um. - </text_editor> - <text name="WindowSizeLabel"> - Fenstergröße: - </text> - <combo_box left="115" name="windowsize combo"> - <combo_box.item name="640x480" label="640x480" /> - <combo_box.item name="800x600" label="800x600" /> - <combo_box.item name="720x480" label="720x480 (NTSC)" /> - <combo_box.item name="768x576" label="768x576 (PAL)" /> - <combo_box.item name="1024x768" label="1024x768" /> - </combo_box> - <text name="DisplayResLabel" width="100"> - Anzeigeauflösung: - </text> - <combo_box left="115" name="fullscreen combo" /> - <text name="AspectRatioLabel1" tool_tip="Breite/Höhe" width="100"> - Aspektverhältnis: - </text> - <combo_box left="115" name="aspect_ratio" tool_tip="Breite/Höhe"> - <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standard-CRT)" /> - <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)" /> - <combo_box.item name="8:5(Widescreen)" label="8:5 (Widescreen)" /> - <combo_box.item name="16:9(Widescreen)" label="16:9 (Widescreen)" /> - </combo_box> - <check_box label="Verhältnis automatisch erkennen" left="275" name="aspect_auto_detect" /> - <text name="UI Size:"> - UI-Größe: - </text> - <text name="(meters, lower is faster)"> - (Meter, niedriger ist schneller) - </text> - <text name="text2"> - Anzeigeoptionen: - </text> - <check_box label="Auflösungsunabhängigen Maßstab verwenden" name="ui_auto_scale" /> - <spinner label="Sichtweite:" name="draw_distance" /> - <check_box label="Avatar in Mouselook anzeigen" name="avfp" /> - <text name="HigherText"> - Qualität und - </text> - <text name="QualityText"> - Performance: - </text> - <text name="FasterText"> - Schneller - </text> - <text name="ShadersPrefText"> - Niedrig - </text> - <text name="ShadersPrefText2"> - Mittel - </text> - <text name="ShadersPrefText3"> - Hoch - </text> - <text name="ShadersPrefText4"> - Ultra - </text> - <text name="HigherText2"> - Höhere - </text> - <text name="QualityText2"> - Qualität - </text> - <check_box label="Benutzerdefiniert" name="CustomSettings" /> - <panel name="CustomGraphics Panel"> - <text name="ShadersText"> - Shader: - </text> - <check_box label="Bumpmapping und Glanz" name="BumpShiny" /> - <check_box label="Einfache Shader" name="BasicShaders" - tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht." /> - <check_box label="Atmosphären-Shader" name="WindLightUseAtmosShaders" /> - <check_box label="Wasserreflexionen" name="Reflections" /> - <text name="ReflectionDetailText"> - Spiegelung: - </text> - <radio_group name="ReflectionDetailRadio"> - <radio_item name="0" label="Terrain und Bäume" /> - <radio_item name="1" label="Alle statischen Objekte" /> - <radio_item name="2" label="Alle Avatare und Objekte" /> - <radio_item name="3" label="Alles" /> - </radio_group> - <text name="AvatarRenderingText"> - Avatar-Darstellung: - </text> - <check_box label="Ersatzavatare" name="AvatarImpostors" /> - <check_box label="Hardware-Hautberechnung" name="AvatarVertexProgram" /> - <check_box label="Avatar-Kleidung" name="AvatarCloth" /> - <text name="DrawDistanceMeterText1"> - m - </text> - <text name="DrawDistanceMeterText2"> - m - </text> - <slider label="Sichtweite:" name="DrawDistance" /> - <slider label="Max. Partikelzahl:" name="MaxParticleCount" /> - <slider label="Post-Processing-Qualität:" name="RenderPostProcess" /> - <text name="MeshDetailText"> - Gitterdetails: - </text> - <slider label=" Objekte:" name="ObjectMeshDetail" /> - <slider label=" Flexiprimitiva:" name="FlexibleMeshDetail" /> - <slider label=" Bäume:" name="TreeMeshDetail" /> - <slider label=" Avatare:" name="AvatarMeshDetail" /> - <slider label=" Terrain:" name="TerrainMeshDetail" /> - <slider label=" Himmel:" name="SkyMeshDetail" /> - <text name="PostProcessText"> - Niedrig - </text> - <text name="ObjectMeshDetailText"> - Niedrig - </text> - <text name="FlexibleMeshDetailText"> - Niedrig - </text> - <text name="TreeMeshDetailText"> - Niedrig - </text> - <text name="AvatarMeshDetailText"> - Niedrig - </text> - <text name="TerrainMeshDetailText"> - Niedrig - </text> - <text name="SkyMeshDetailText"> - Niedrig - </text> - <text name="LightingDetailText"> - Beleuchtungsdetails: - </text> - <radio_group name="LightingDetailRadio"> - <radio_item name="SunMoon" label="Nur Sonne und Mond" /> - <radio_item name="LocalLights" label="Lokale Lichtquellen" /> - </radio_group> - <text name="TerrainDetailText"> - Terraindetails: - </text> - <radio_group name="TerrainDetailRadio"> - <radio_item name="0" label="Niedrig" /> - <radio_item name="2" label="Hoch" /> - </radio_group> - </panel> - <button label="Empfohlene Einstellungen" name="Defaults" /> - <button label="Hardware-Optionen" label_selected="Hardware-Optionen" - name="GraphicsHardwareButton" /> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> - <panel.string name="aspect_ratio_text"> - [NUM]:[DEN] - </panel.string> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Grafik" name="Display panel"> + <text name="WindowSizeLabel"> + Fenstergröße: + </text> + <check_box label="Vollbildmodus verwenden" name="windowed mode"/> + <combo_box left="115" name="windowsize combo"> + <combo_box.item label="640x480" name="640x480"/> + <combo_box.item label="800x600" name="800x600"/> + <combo_box.item label="720x480 (NTSC)" name="720x480"/> + <combo_box.item label="768x576 (PAL)" name="768x576"/> + <combo_box.item label="1024x768" name="1024x768"/> + </combo_box> + <text name="UI Size:"> + UI-Größe: + </text> + <text name="QualitySpeed"> + Qualität und Geschwindigkeit: + </text> + <text name="FasterText"> + Schneller + </text> + <text name="BetterText"> + Besser + </text> + <text name="ShadersPrefText"> + Niedrig + </text> + <text name="ShadersPrefText2"> + Mittel + </text> + <text name="ShadersPrefText3"> + Hoch + </text> + <text name="ShadersPrefText4"> + Ultra + </text> + <panel label="CustomGraphics" name="CustomGraphics Panel"> + <text name="ShadersText"> + Shader: + </text> + <check_box initial_value="true" label="Bumpmapping und Glanz" name="BumpShiny"/> + <check_box initial_value="true" label="Einfache Shader" name="BasicShaders" tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht."/> + <check_box initial_value="true" label="Atmosphären-Shader" name="WindLightUseAtmosShaders"/> + <check_box initial_value="true" label="Wasserreflexionen" name="Reflections"/> + <text name="ReflectionDetailText"> + Spiegelung: + </text> + <radio_group name="ReflectionDetailRadio"> + <radio_item label="Terrain und Bäume" name="0"/> + <radio_item label="Alle statischen Objekte" name="1"/> + <radio_item label="Alle Avatare und Objekte" name="2"/> + <radio_item label="Alles" name="3"/> + </radio_group> + <text name="AvatarRenderingText"> + Avatar-Darstellung: + </text> + <check_box initial_value="true" label="Ersatzavatare" name="AvatarImpostors"/> + <check_box initial_value="true" label="Hardware-Hautberechnung" name="AvatarVertexProgram"/> + <check_box initial_value="true" label="Avatar-Kleidung" name="AvatarCloth"/> + <slider label="Sichtweite:" name="DrawDistance"/> + <text name="DrawDistanceMeterText2"> + m + </text> + <slider label="Max. Partikelzahl:" name="MaxParticleCount"/> + <slider label="Post-Processing-Qualität:" name="RenderPostProcess"/> + <text name="MeshDetailText"> + Gitterdetails: + </text> + <slider label=" Objekte:" name="ObjectMeshDetail"/> + <slider label=" Flexiprimitiva:" name="FlexibleMeshDetail"/> + <slider label=" Bäume:" name="TreeMeshDetail"/> + <slider label=" Avatare:" name="AvatarMeshDetail"/> + <slider label=" Terrain:" name="TerrainMeshDetail"/> + <slider label=" Himmel:" name="SkyMeshDetail"/> + <text name="PostProcessText"> + Niedrig + </text> + <text name="ObjectMeshDetailText"> + Niedrig + </text> + <text name="FlexibleMeshDetailText"> + Niedrig + </text> + <text name="TreeMeshDetailText"> + Niedrig + </text> + <text name="AvatarMeshDetailText"> + Niedrig + </text> + <text name="TerrainMeshDetailText"> + Niedrig + </text> + <text name="SkyMeshDetailText"> + Niedrig + </text> + <text name="LightingDetailText"> + Beleuchtungsdetails: + </text> + <radio_group name="LightingDetailRadio"> + <radio_item label="Nur Sonne und Mond" name="SunMoon"/> + <radio_item label="Lokale Lichtquellen" name="LocalLights"/> + </radio_group> + <text name="TerrainDetailText"> + Terraindetails: + </text> + <radio_group name="TerrainDetailRadio"> + <radio_item label="Niedrig" name="0"/> + <radio_item label="Hoch" name="2"/> + </radio_group> + </panel> + <button label="Ãœbernehmen" label_selected="Ãœbernehmen" name="Apply"/> + <button label="Zurücksetzen" name="Defaults"/> + <button label="Erweitert" name="Advanced"/> + <button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml index b52e5351149..d5305d3cbe3 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml @@ -1,32 +1,20 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="Kommunikation" name="im"> - <text name="text_box"> - Mein Onlinestatus: - </text> - <check_box label="Nur Freunden und Gruppen meinen Online-Status mitteilen" name="online_visibility"/> - <text name="text_box2"> - IM-Optionen: - </text> - <text name="log_in_to_change"> - Zum Ändern anmelden - </text> - <check_box label="IM an E-Mail senden ([EMAIL])" name="send_im_to_email"/> - <check_box label="IM in Chat-Konsole anzeigen" name="include_im_in_chat_console"/> - <check_box label="Zeitstempel in IM anzeigen" name="show_timestamps_check"/> - <check_box label="Online-Freundbenachrichtigungen anzeigen" name="friends_online_notify_checkbox"/> - <text name="text_box3"> - Antwort für -Beschäftigt-Modus: - </text> - <text name="text_box4"> - Protokolloptionen: - </text> - <check_box label="IM-Verlauf auf meinem Computer speichern" name="log_instant_messages"/> - <check_box label="Zeitstempel in IM-Verlauf anzeigen" name="log_instant_messages_timestamp"/> - <check_box label="Ende des letzten IM-Gesprächs anzeigen" name="log_show_history"/> - <check_box label="Verlauf des lokalen Chats auf meinem Computer speichern" name="log_chat"/> - <check_box label="Zeitstempel im Verlauf des lokalen Chats anzeigen" name="log_chat_timestamp"/> - <check_box label="Eingehende IM in Chat-Verlauf anzeigen" name="log_chat_IM"/> - <check_box label="Datum mit Zeitstempeln hinzufügen" name="log_date_timestamp"/> - <button label="Pfad ändern" label_selected="Pfad ändern" name="log_path_button"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Kommunikation" name="im"> + <panel.string name="log_in_to_change"> + Zum Ändern anmelden + </panel.string> + <button label="Cache löschen" name="clear_cache"/> + <text name="cache_size_label_l"> + (Positionen, Bilder, Internet, Suchverlauf) + </text> + <check_box label="Nur Freunden und Gruppen meinen Online-Status mitteilen" name="online_visibility"/> + <check_box label="Nur IMs und Anrufe von Freunden oder Gruppen durchstellen" name="voice_call_friends_only_check"/> + <check_box label="Nach Beendigung von Anrufen Mikrofon abschalten." name="auto_disengage_mic_check"/> + <check_box label="Cookies annehmen" name="cookies_enabled"/> + <check_box label="Protokoll auf meinem Computer speichern" name="log_instant_messages"/> + <radio_group name="ChatIMLogs"> + <radio_item label="Chat" name="radio1"/> + <radio_item label="IM" name="radio2"/> + </radio_group> + <button label="Durchsuchen" label_selected="Durchsuchen" name="log_path_button"/> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml index 97ec745d4dc..a2c317acbb1 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml @@ -1,30 +1,46 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Kamera" name="Input panel"> - <text name=" Mouselook Options:"> - Mouselook-Optionen: - </text> - <text name=" Mouse Sensitivity:"> - Mausempfindlichkeit: - </text> - <check_box label="Maus umkehren" name="invert_mouse"/> - <text name=" Auto Fly Options:"> - Auto-Flug-Optionen: - </text> - <check_box label="Zum Fliegen/Landen nach oben/unten halten" name="automatic_fly"/> - <text name=" Camera Options:"> - Kameraoptionen: - </text> - <text name="camera_fov_label"> - Kamera-Sichtwinkel: - </text> - <text name="Camera Follow Distance:"> - Kameraabstand: - </text> - <check_box label="Automatischer Kameraschwenk im Bearbeiten-Modus" name="edit_camera_movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/> - <check_box label="Automatischer Kameraschwenk im Aussehen-Modus" name="appearance_camera_movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/> - <text name="text2"> - Avatar-Anzeigeoptionen: - </text> - <check_box label="Avatar in Mouselook anzeigen" name="first_person_avatar_visible"/> - <button label="Joystick-Einrichtung" name="joystick_setup_button"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Kamera" name="Input panel"> + <button label="Andere Geräte" name="joystick_setup_button"/> + <text name="Mouselook:"> + Mouselook: + </text> + <text name=" Mouse Sensitivity"> + Mausempfindlichkeit: + </text> + <check_box label="Umkehren" name="invert_mouse"/> + <text name="Network:"> + Netzwerk: + </text> + <text name="Maximum bandwidth"> + Maximale Bandbreite + </text> + <text name="text_box2"> + kbps + </text> + <check_box label="Benutzerdefinierter Port" name="connection_port_enabled"/> + <spinner label="Port-Nummer:" name="web_proxy_port"/> + <text name="cache_size_label_l"> + Cache + </text> + <text name="text_box5"> + MB + </text> + <button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/> + <button label="Zurücksetzen" label_selected="Festlegen" name="reset_cache"/> + <text name="Cache location"> + Cache-Ordner + </text> + <text name="Web:"> + Internet: + </text> + <radio_group name="use_external_browser"> + <radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Den integrierten Browser für Hilfe, Internetlinks, usw. verwenden. Der Browser wird als eigenständiges Fenster in [APP_NAME] geöffnet."/> + <radio_item label="Meinen Browser verwenden (IE, Firefox)" name="external" tool_tip="Standard-Browser für Hilfe, Weblinks usw. verwenden. Im Vollbildmodus nicht empfohlen."/> + </radio_group> + <check_box initial_value="false" label="Web-Proxy:" name="web_proxy_enabled"/> + <line_editor name="web_proxy_editor" tool_tip="Name oder IP-Adresse des Proxys"/> + <button label="Durchsuchen" label_selected="Durchsuchen" name="set_proxy"/> + <text name="Proxy location"> + Proxy-Standort + </text> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml new file mode 100644 index 00000000000..907803b32f0 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_profile.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profil" name="panel_profile"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="payment_update_link_url"> + http://www.secondlife.com/account/billing.php?lang=de-DE + </string> + <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/> + <string name="no_partner_text" value="Keiner"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="second_life_image_panel"> + <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> + </panel> + <panel name="first_life_image_panel"> + <text name="title_rw_descr_text" value="Echtes Leben:"/> + </panel> + <text name="me_homepage_text"> + Webseite: + </text> + <text name="title_member_text" value="Mitglied seit:"/> + <text name="title_acc_status_text" value="Kontostatus:"/> + <text name="title_partner_text" value="Partner:"/> + <panel name="partner_data_panel"> + <text name="partner_text" value="[FIRST] [LAST]"/> + </panel> + <text name="title_groups_text" value="Gruppen:"/> + </panel> + </scroll_container> + <panel name="profile_buttons_panel"> + <button label="Freund hinzufügen" name="add_friend"/> + <button label="IM" name="im"/> + <button label="Anrufen" name="call"/> + <button label="Teleportieren" name="teleport"/> + </panel> + <panel name="profile_me_buttons_panel"> + <button label="Profil bearbeiten" name="edit_profile_btn"/> + <button label="Aussehen bearbeiten" name="edit_appearance_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_profile_view.xml b/indra/newview/skins/default/xui/de/panel_profile_view.xml new file mode 100644 index 00000000000..4ae27907aa0 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_profile_view.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_target_profile"> + <string name="status_online"> + Online + </string> + <string name="status_offline"> + Offline + </string> + <text name="user_name" value="(wird geladen...)"/> + <text name="status" value="Online"/> + <tab_container name="tabs"> + <panel label="Profil" name="panel_profile"/> + <panel label="Auswahl" name="panel_picks"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_script_ed.xml b/indra/newview/skins/default/xui/de/panel_script_ed.xml new file mode 100644 index 00000000000..c1208f19cf5 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_script_ed.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="script panel"> + <panel.string name="loading"> + Wird geladen... + </panel.string> + <panel.string name="can_not_view"> + Dieses Skript kann nicht angezeigt oder bearbeitet werden, da als Berechtigung „kein kopieren" festgelegt wurde. Um ein Skript innerhalb eines Objektes anzuzeigen oder zu bearbeiten, benötigen Sie die vollständige Berechtigung. + </panel.string> + <panel.string name="public_objects_can_not_run"> + Öffentliche Objekte können keine Skripts ausführen + </panel.string> + <panel.string name="script_running"> + Läuft + </panel.string> + <panel.string name="Title"> + Skript: [NAME] + </panel.string> + <text_editor name="Script Editor"> + Wird geladen... + </text_editor> + <button label="Speichern" label_selected="Speichern" name="Save_btn"/> + <combo_box label="Einfügen..." name="Insert..."/> + <menu_bar name="script_menu"> + <menu label="Datei" name="File"> + <menu_item_call label="Speichern" name="Save"/> + <menu_item_call label="Alle Änderungen zurücksetzen" name="Revert All Changes"/> + </menu> + <menu label="Bearbeiten" name="Edit"> + <menu_item_call label="Rückgängig" name="Undo"/> + <menu_item_call label="Wiederherstellen" name="Redo"/> + <menu_item_call label="Ausschneiden" name="Cut"/> + <menu_item_call label="Kopieren" name="Copy"/> + <menu_item_call label="Einfügen" name="Paste"/> + <menu_item_call label="Alle auswählen" name="Select All"/> + <menu_item_call label="Auswahl aufheben" name="Deselect"/> + <menu_item_call label="Suchen / Ersetzen..." name="Search / Replace..."/> + </menu> + <menu label="Hilfe" name="Help"> + <menu_item_call label="Hilfe..." name="Help..."/> + <menu_item_call label="Schlüsselwort-Hilfe" name="Keyword Help..."/> + </menu> + </menu_bar> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml new file mode 100644 index 00000000000..59fee002b8b --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml--> +<panel name="panel_stand_stop_flying"> + <button label="Stehen" name="stand_btn" tool_tip="Klicken Sie hier, um aufzustehen."/> + <button label="Landen" name="stop_fly_btn" tool_tip="Landen"/> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml index 01091e38fbd..0ca050c81f2 100644 --- a/indra/newview/skins/default/xui/de/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml @@ -1,42 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="status"> - <text name="ParcelNameText" tool_tip="Der Name der Parzelle, auf der Sie sich befinden. Klicken Sie für Land-Informationen."> - Parzellenname hier - </text> - <text name="BalanceText" tool_tip="Kontostand"> - Wird geladen... - </text> - <button label="" label_selected="" name="buycurrency" tool_tip="Geld kaufen"/> - <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)"> - 12:00 - </text> - <text name="StatBarDaysOfWeek"> - Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag - </text> - <text name="StatBarMonthsOfYear"> - Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember - </text> - <button label="" label_selected="" name="scriptout" tool_tip="Skriptwarnungen und -fehler"/> - <button label="" label_selected="" name="health" tool_tip="Gesundheit"/> - <text name="HealthText" tool_tip="Gesundheit"> - 100% - </text> - <button label="" label_selected="" name="fly" tool_tip="Fliegen aus"/> - <button label="" label_selected="" name="build" tool_tip="Bauen aus"/> - <button label="" label_selected="" name="scripts" tool_tip="Skripts aus"/> - <button name="no_fly" tool_tip="Fliegen ist unzulässig"/> - <button name="no_build" tool_tip="Bauen/Rezzen ist unzulässig"/> - <button name="no_scripts" tool_tip="Skripte sind unzulässig"/> - <button label="" label_selected="" name="restrictpush" tool_tip="Kein Stoßen"/> - <button name="status_voice" tool_tip="Voice aktiviert"/> - <button name="status_no_voice" tool_tip="Voice hier nicht möglich"/> - <button label="" label_selected="" name="buyland" tool_tip="Diese Parzelle kaufen"/> - <text name="packet_loss_tooltip"> - Paketverlust - </text> - <text name="bandwidth_tooltip"> - Bandbreite - </text> - <line_editor label="Suchen" name="search_editor" tool_tip="[SECOND_LIFE] durchsuchen"/> - <button name="search_btn" tool_tip="[SECOND_LIFE] durchsuchen"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember + </panel.string> + <panel.string name="packet_loss_tooltip"> + Paketverlust + </panel.string> + <panel.string name="bandwidth_tooltip"> + Bandbreite + </panel.string> + <panel.string name="buycurrencylabel"> + [AMT] L$ + </panel.string> + <button label="" label_selected="" name="buycurrency" tool_tip="Mein Kontostand: Hier klicken, um mehr L$ zu kaufen"/> + <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)"> + 12:00 + </text> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_world_map.xml b/indra/newview/skins/default/xui/de/panel_world_map.xml index 7b18c5e822e..d83d32a9525 100644 --- a/indra/newview/skins/default/xui/de/panel_world_map.xml +++ b/indra/newview/skins/default/xui/de/panel_world_map.xml @@ -1,51 +1,57 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="world_map"> - <panel.string name="world_map_north"> - N - </panel.string> - <panel.string name="world_map_east"> - O - </panel.string> - <panel.string name="world_map_west"> - W - </panel.string> - <panel.string name="world_map_south"> - S - </panel.string> - <panel.string name="world_map_southeast"> - SO - </panel.string> - <panel.string name="world_map_northeast"> - NO - </panel.string> - <panel.string name="world_map_southwest"> - SW - </panel.string> - <panel.string name="world_map_northwest"> - NW - </panel.string> - <text label="N" name="floater_map_north" text="N"> - N - </text> - <text label="O" name="floater_map_east" text="O"> - O - </text> - <text label="W" name="floater_map_west" text="W"> - W - </text> - <text label="S" name="floater_map_south" text="S"> - S - </text> - <text label="SO" name="floater_map_southeast" text="SO"> - SO - </text> - <text label="NO" name="floater_map_northeast" text="NO"> - NO - </text> - <text label="SW" name="floater_map_southwest" text="SW"> - SW - </text> - <text label="NW" name="floater_map_northwest" text="NW"> - NW - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="world_map"> + <panel.string name="Loading"> + Wird geladen... + </panel.string> + <panel.string name="InvalidLocation"> + Ungültige Position + </panel.string> + <panel.string name="world_map_north"> + N + </panel.string> + <panel.string name="world_map_east"> + O + </panel.string> + <panel.string name="world_map_west"> + W + </panel.string> + <panel.string name="world_map_south"> + S + </panel.string> + <panel.string name="world_map_southeast"> + SO + </panel.string> + <panel.string name="world_map_northeast"> + NO + </panel.string> + <panel.string name="world_map_southwest"> + SW + </panel.string> + <panel.string name="world_map_northwest"> + NW + </panel.string> + <text label="N" name="floater_map_north" text="N"> + N + </text> + <text label="O" name="floater_map_east" text="O"> + O + </text> + <text label="W" name="floater_map_west" text="W"> + W + </text> + <text label="S" name="floater_map_south" text="S"> + S + </text> + <text label="SO" name="floater_map_southeast" text="SO"> + SO + </text> + <text label="NO" name="floater_map_northeast" text="NO"> + NO + </text> + <text label="SW" name="floater_map_southwest" text="SW"> + SW + </text> + <text label="NW" name="floater_map_northwest" text="NW"> + NW + </text> +</panel> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index af9185e0b7d..e1ba2025cdd 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -1,654 +1,3149 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- This file contains strings that used to be hardcoded in the source. - It is only for those strings which do not belong in a floater. - For example, the strings used in avatar chat bubbles, and strings - that are returned from one component and may appear in many places--> -<strings> - <string name="LoginInProgress"> - Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht. Bitte warten. - </string> - <string name="LoginAuthenticating"> - Authentifizierung - </string> - <string name="LoginMaintenance"> - Account wird aktualisiert... - </string> - <string name="LoginAttempt"> - Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER] - </string> - <string name="LoginPrecaching"> - Welt wird geladen... - </string> - <string name="LoginInitializingBrowser"> - Integrierter Webbrowser wird initialisiert... - </string> - <string name="LoginInitializingMultimedia"> - Multimedia wird initialisiert... - </string> - <string name="LoginVerifyingCache"> - Cache-Dateien werden überprüft (dauert 60-90 Sekunden)... - </string> - <string name="LoginProcessingResponse"> - Antwort wird verarbeitet... - </string> - <string name="LoginInitializingWorld"> - Welt wird initialisiert... - </string> - <string name="LoginDecodingImages"> - Bilder werden entpackt... - </string> - <string name="LoginInitializingQuicktime"> - QuickTime wird initialisiert... - </string> - <string name="LoginQuicktimeNotFound"> - QuickTime nicht gefunden - Initialisierung nicht möglich. - </string> - <string name="LoginQuicktimeOK"> - QuickTime wurde initialisiert. - </string> - <string name="LoginWaitingForRegionHandshake"> - Region-Handshake... - </string> - <string name="LoginConnectingToRegion"> - Region-Verbindung... - </string> - <string name="LoginDownloadingClothing"> - Kleidung wird geladen... - </string> - <string name="AgentLostConnection"> - In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung. - </string> - <string name="TooltipPerson"> - Person - </string> - <string name="TooltipNoName"> - (namenlos) - </string> - <string name="TooltipOwner"> - Eigentümer: - </string> - <string name="TooltipPublic"> - Öffentlich - </string> - <string name="TooltipIsGroup"> - (Gruppe) - </string> - <string name="TooltipFlagScript"> - Skript - </string> - <string name="TooltipFlagPhysics"> - Physik - </string> - <string name="TooltipFlagTouch"> - Berühren - </string> - <string name="TooltipFlagL$"> - L$ - </string> - <string name="TooltipFlagDropInventory"> - Inventar fallen lassen - </string> - <string name="TooltipFlagPhantom"> - Phantom - </string> - <string name="TooltipFlagTemporary"> - Temporär - </string> - <string name="TooltipFlagRightClickMenu"> - (Rechtsklick für Menü) - </string> - <string name="TooltipFreeToCopy"> - Kopieren möglich - </string> - <string name="TooltipForSaleL$"> - Zum Verkauf: [AMOUNT] L$ - </string> - <string name="TooltipForSaleMsg"> - Zum Verkauf: [MESSAGE] - </string> - <string name="TooltipFlagGroupBuild"> - Gruppenbau - </string> - <string name="TooltipFlagNoBuild"> - Bauen aus - </string> - <string name="TooltipFlagNoEdit"> - Gruppenbau - </string> - <string name="TooltipFlagNotSafe"> - Unsicher - </string> - <string name="TooltipFlagNoFly"> - Fliegen aus - </string> - <string name="TooltipFlagGroupScripts"> - Gruppenskripte - </string> - <string name="TooltipFlagNoScripts"> - Skripte aus - </string> - <string name="TooltipLand"> - Land: - </string> - <string name="TooltipMustSingleDrop"> - Sie können nur ein einzelnes Objekt hierher ziehen - </string> - <string name="RetrievingData"> - Laden... - </string> - <string name="ReleaseNotes"> - Versionshinweise - </string> - <string name="LoadingData"> - Wird geladen... - </string> - <string name="AvatarNameNobody"> - (niemand) - </string> - <string name="AvatarNameWaiting"> - (wartet) - </string> - <string name="AvatarNameHippos"> - (hippos) - </string> - <string name="GroupNameNone"> - (keiner) - </string> - <string name="AssetErrorNone"> - Kein Fehler - </string> - <string name="AssetErrorRequestFailed"> - Asset-Anforderung: fehlgeschlagen - </string> - <string name="AssetErrorNonexistentFile"> - Asset-Anforderung: Datei existiert nicht - </string> - <string name="AssetErrorNotInDatabase"> - Asset-Anforderung: Asset in Datenbank nicht gefunden - </string> - <string name="AssetErrorEOF"> - Ende der Datei - </string> - <string name="AssetErrorCannotOpenFile"> - Datei kann nicht geöffnet werden - </string> - <string name="AssetErrorFileNotFound"> - Datei nicht gefunden - </string> - <string name="AssetErrorTCPTimeout"> - Zeitüberschreitung bei Dateiübertragung - </string> - <string name="AssetErrorCircuitGone"> - Verbindung verloren - </string> - <string name="AssetErrorPriceMismatch"> - Viewer und Server sind sich nicht über Preis einig - </string> - <string name="AssetErrorUnknownStatus"> - Status unbekannt - </string> - <string name="AvatarEditingApparance"> - (Aussehen wird bearbeitet) - </string> - <string name="AvatarAway"> - Abwesend - </string> - <string name="AvatarBusy"> - Beschäftigt - </string> - <string name="AvatarMuted"> - Stummgeschaltet - </string> - <string name="anim_express_afraid"> - Ängstlich - </string> - <string name="anim_express_anger"> - Verärgert - </string> - <string name="anim_away"> - Abwesend - </string> - <string name="anim_backflip"> - Rückwärtssalto - </string> - <string name="anim_express_laugh"> - Lachkrampf - </string> - <string name="anim_express_toothsmile"> - Grinsen - </string> - <string name="anim_blowkiss"> - Kusshand - </string> - <string name="anim_express_bored"> - Gelangweilt - </string> - <string name="anim_bow"> - Verbeugen - </string> - <string name="anim_clap"> - Klatschen - </string> - <string name="anim_courtbow"> - Diener - </string> - <string name="anim_express_cry"> - Weinen - </string> - <string name="anim_dance1"> - Tanz 1 - </string> - <string name="anim_dance2"> - Tanz 2 - </string> - <string name="anim_dance3"> - Tanz 3 - </string> - <string name="anim_dance4"> - Tanz 4 - </string> - <string name="anim_dance5"> - Tanz 5 - </string> - <string name="anim_dance6"> - Tanz 6 - </string> - <string name="anim_dance7"> - Tanz 7 - </string> - <string name="anim_dance8"> - Tanz 8 - </string> - <string name="anim_express_disdain"> - Verachten - </string> - <string name="anim_drink"> - Trinken - </string> - <string name="anim_express_embarrased"> - Verlegen - </string> - <string name="anim_angry_fingerwag"> - Drohen - </string> - <string name="anim_fist_pump"> - Faust pumpen - </string> - <string name="anim_yoga_float"> - Yogaflieger - </string> - <string name="anim_express_frown"> - Stirnrunzeln - </string> - <string name="anim_impatient"> - Ungeduldig - </string> - <string name="anim_jumpforjoy"> - Freudensprung - </string> - <string name="anim_kissmybutt"> - LMA - </string> - <string name="anim_express_kiss"> - Küssen - </string> - <string name="anim_laugh_short"> - Lachen - </string> - <string name="anim_musclebeach"> - Posen - </string> - <string name="anim_no_unhappy"> - Nein (Bedauernd) - </string> - <string name="anim_no_head"> - Nein - </string> - <string name="anim_nyanya"> - Ällabätsch - </string> - <string name="anim_punch_onetwo"> - Eins-Zwei-Punch - </string> - <string name="anim_express_open_mouth"> - Mund offen - </string> - <string name="anim_peace"> - Friede - </string> - <string name="anim_point_you"> - Auf anderen zeigen - </string> - <string name="anim_point_me"> - Auf mich zeigen - </string> - <string name="anim_punch_l"> - Linker Haken - </string> - <string name="anim_punch_r"> - Rechter Haken - </string> - <string name="anim_rps_countdown"> - SSP zählen - </string> - <string name="anim_rps_paper"> - SSP Papier - </string> - <string name="anim_rps_rock"> - SSP Stein - </string> - <string name="anim_rps_scissors"> - SSP Schere - </string> - <string name="anim_express_repulsed"> - Angewidert - </string> - <string name="anim_kick_roundhouse_r"> - Rundkick - </string> - <string name="anim_express_sad"> - Traurig - </string> - <string name="anim_salute"> - Salutieren - </string> - <string name="anim_shout"> - Rufen - </string> - <string name="anim_express_shrug"> - Schulterzucken - </string> - <string name="anim_express_smile"> - Lächeln - </string> - <string name="anim_smoke_idle"> - Zigarette halten - </string> - <string name="anim_smoke_inhale"> - Rauchen - </string> - <string name="anim_smoke_throw_down"> - Zigarette wegwerfen - </string> - <string name="anim_express_surprise"> - Ãœberraschung - </string> - <string name="anim_sword_strike_r"> - Schwerthieb - </string> - <string name="anim_angry_tantrum"> - Wutanfall - </string> - <string name="anim_express_tongue_out"> - Zunge rausstrecken - </string> - <string name="anim_hello"> - Winken - </string> - <string name="anim_whisper"> - Flüstern - </string> - <string name="anim_whistle"> - Pfeifen - </string> - <string name="anim_express_wink"> - Zwinkern - </string> - <string name="anim_wink_hollywood"> - Zwinkern (Hollywood) - </string> - <string name="anim_express_worry"> - Sorgenvoll - </string> - <string name="anim_yes_happy"> - Ja (Erfreut) - </string> - <string name="anim_yes_head"> - Ja - </string> - <string name="texture_loading"> - Wird geladen... - </string> - <string name="worldmap_offline"> - Offline - </string> - <string name="whisper"> - flüstert: - </string> - <string name="shout"> - ruft: - </string> - <string name="SIM_ACCESS_PG"> - PG - </string> - <string name="SIM_ACCESS_MATURE"> - Mature - </string> - <string name="SIM_ACCESS_ADULT"> - Adult - </string> - <string name="SIM_ACCESS_DOWN"> - Offline - </string> - <string name="SIM_ACCESS_MIN"> - Unbekannt - </string> - <string name="land_type_unknown"> - (unbekannt) - </string> - <string name="covenant_never_modified"> - Zuletzt geändert: (nie) - </string> - <string name="covenant_modified"> - Zuletzt geändert: - </string> - <string name="all_files"> - Alle Dateien - </string> - <string name="sound_files"> - Sounds - </string> - <string name="animation_files"> - Animationen - </string> - <string name="image_files"> - Bilder - </string> - <string name="save_file_verb"> - Speichern - </string> - <string name="load_file_verb"> - Laden - </string> - <string name="targa_image_files"> - Targa-Bilder - </string> - <string name="bitmap_image_files"> - Bitmap-Bilder - </string> - <string name="avi_movie_file"> - AVI-Filmdatei - </string> - <string name="xaf_animation_file"> - XAF Anim-Datei - </string> - <string name="xml_file"> - XML-Datei - </string> - <string name="dot_raw_file"> - RAW-Datei - </string> - <string name="compressed_image_files"> - Komprimierte Bilder - </string> - <string name="load_files"> - Dateien laden - </string> - <string name="choose_the_directory"> - Verzeichnis auswählen - </string> - <string name="accel-mac-control"> - ⌃ - </string> - <string name="accel-mac-command"> - ⌘ - </string> - <string name="accel-mac-option"> - ⌥ - </string> - <string name="accel-mac-shift"> - ⇧ - </string> - <string name="accel-win-control"> - Strg+ - </string> - <string name="accel-win-alt"> - Alt+ - </string> - <string name="accel-win-shift"> - Umschalt+ - </string> - <string name="GraphicsQualityLow"> - Niedrig - </string> - <string name="GraphicsQualityMid"> - Mittel - </string> - <string name="GraphicsQualityHigh"> - Hoch - </string> - - <!-- PARCEL_CATEGORY_UI_STRING --> - <string name="Linden Location">Lindenort</string> - <string name="Adult">Adult</string> - <string name="Arts&Culture">Kunst & Kultur</string> - <string name="Business">Business</string> - <string name="Educational">Bildung</string> - <string name="Gaming">Spielen</string> - <string name="Hangout">Treffpunkt</string> - <string name="Newcomer Friendly">Anfängergerecht</string> - <string name="Parks&Nature">Parks und Natur</string> - <string name="Residential">Wohngebiet</string> - <string name="Shopping">Shopping</string> - <string name="Other">Sonstige</string> - <string name="ringing"> - Verbindung mit In-Welt-Voice-Chat... - </string> - <string name="connected"> - Verbunden - </string> - <string name="unavailable"> - Der aktuelle Standort unterstützt keine Voice-Kommunikation - </string> - <string name="hang_up"> - Verbindung mit In-Welt-Voice-Chat getrennt - </string> - <string name="ScriptQuestionCautionChatGranted"> - Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS]. - </string> - <string name="ScriptQuestionCautionChatDenied"> - Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS]. - </string> - <string name="ScriptTakeMoney"> - Linden-Dollar (L$) von Ihnen nehmen - </string> - <string name="ActOnControlInputs"> - Steuerung festlegen - </string> - <string name="RemapControlInputs"> - Steuerung neu zuweisen - </string> - <string name="AnimateYourAvatar"> - Avatar animieren - </string> - <string name="AttachToYourAvatar"> - An Avatar anhängen - </string> - <string name="ReleaseOwnership"> - Eigentum aufgeben und öffentlich machen - </string> - <string name="LinkAndDelink"> - Mit Objekten verknüpfen und davon trennen - </string> - <string name="AddAndRemoveJoints"> - Verbindungen zu anderen Objekten hinzufügen und entfernen - </string> - <string name="ChangePermissions"> - Berechtigungen ändern - </string> - <string name="TrackYourCamera"> - Kameraverfolgung - </string> - <string name="ControlYourCamera"> - Kamerasteuerung - </string> - <string name="only_user_message"> - Sie sind der einzige Benutzer in dieser Sitzung. - </string> - <string name="offline_message"> - [FIRST] [LAST] ist offline. - </string> - <string name="invite_message"> - Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen. - </string> - <string name="generic_request_error"> - Fehler bei Anfrage, bitte versuchen Sie es später. - </string> - <string name="insufficient_perms_error"> - Sie sind dazu nicht berechtigt. - </string> - <string name="session_does_not_exist_error"> - Die Sitzung ist abgelaufen - </string> - <string name="no_ability_error"> - Sie besitzen diese Fähigkeit nicht. - </string> - <string name="no_ability"> - Sie besitzen diese Fähigkeit nicht. - </string> - <string name="not_a_mod_error"> - Sie sind kein Sitzungsmoderator. - </string> - <string name="muted_error"> - Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert. - </string> - <string name="add_session_event"> - Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden. - </string> - <string name="message_session_event"> - Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden. - </string> - <string name="removed_from_group"> - Sie wurden von der Gruppe ausgeschlossen. - </string> - <string name="close_on_no_ability"> - Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen. - </string> - <string name="AcctTypeResident"> - Einwohner - </string> - <string name="AcctTypeTrial"> - Test - </string> - <string name="AcctTypeCharterMember"> - Charta-Mitglied - </string> - <string name="AcctTypeEmployee"> - Linden Lab-Mitarbeiter - </string> - <string name="PaymentInfoUsed"> - Zahlungsinfo verwendet - </string> - <string name="PaymentInfoOnFile"> - Zahlungsinfo archiviert - </string> - <string name="NoPaymentInfoOnFile"> - Keine Zahlungsinfo archiviert - </string> - <string name="AgeVerified"> - Altersgeprüft - </string> - <string name="NotAgeVerified"> - Nicht altersgeprüft - </string> -</strings> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- This file contains strings that used to be hardcoded in the source. + It is only for those strings which do not belong in a floater. + For example, the strings used in avatar chat bubbles, and strings + that are returned from one component and may appear in many places--> +<strings> + <string name="SECOND_LIFE"> + Second Life + </string> + <string name="APP_NAME"> + Second Life + </string> + <string name="SECOND_LIFE_GRID"> + Second Life-Grid: + </string> + <string name="SUPPORT_SITE"> + Second Life Support-Portal + </string> + <string name="StartupDetectingHardware"> + Hardware wird erfasst... + </string> + <string name="StartupLoading"> + Wird geladen + </string> + <string name="Fullbright"> + Fullbright (Legacy) + </string> + <string name="LoginInProgress"> + Anmeldevorgang gestartet. [APP_NAME] reagiert möglicherweise nicht. Bitte warten. + </string> + <string name="LoginInProgressNoFrozen"> + Anmeldung erfolgt... + </string> + <string name="LoginAuthenticating"> + Authentifizierung + </string> + <string name="LoginMaintenance"> + Account wird aktualisiert... + </string> + <string name="LoginAttempt"> + Ein früherer Anmeldeversuch ist fehlgeschlagen. Anmeldung, Versuch [NUMBER] + </string> + <string name="LoginPrecaching"> + Welt wird geladen... + </string> + <string name="LoginInitializingBrowser"> + Integrierter Webbrowser wird initialisiert... + </string> + <string name="LoginInitializingMultimedia"> + Multimedia wird initialisiert... + </string> + <string name="LoginVerifyingCache"> + Cache-Dateien werden überprüft (dauert 60-90 Sekunden)... + </string> + <string name="LoginProcessingResponse"> + Antwort wird verarbeitet... + </string> + <string name="LoginInitializingWorld"> + Welt wird initialisiert... + </string> + <string name="LoginDecodingImages"> + Bilder werden entpackt... + </string> + <string name="LoginInitializingQuicktime"> + QuickTime wird initialisiert... + </string> + <string name="LoginQuicktimeNotFound"> + QuickTime nicht gefunden - Initialisierung nicht möglich. + </string> + <string name="LoginQuicktimeOK"> + QuickTime wurde initialisiert. + </string> + <string name="LoginWaitingForRegionHandshake"> + Region-Handshake... + </string> + <string name="LoginConnectingToRegion"> + Region-Verbindung... + </string> + <string name="LoginDownloadingClothing"> + Kleidung wird geladen... + </string> + <string name="AgentLostConnection"> + In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung. + </string> + <string name="TooltipPerson"> + Person + </string> + <string name="TooltipNoName"> + (namenlos) + </string> + <string name="TooltipOwner"> + Eigentümer: + </string> + <string name="TooltipPublic"> + Öffentlich + </string> + <string name="TooltipIsGroup"> + (Gruppe) + </string> + <string name="TooltipForSaleL$"> + Zum Verkauf: [AMOUNT] L$ + </string> + <string name="TooltipFlagGroupBuild"> + Gruppenbau + </string> + <string name="TooltipFlagNoBuild"> + Bauen aus + </string> + <string name="TooltipFlagNoEdit"> + Gruppenbau + </string> + <string name="TooltipFlagNotSafe"> + Unsicher + </string> + <string name="TooltipFlagNoFly"> + Fliegen aus + </string> + <string name="TooltipFlagGroupScripts"> + Gruppenskripte + </string> + <string name="TooltipFlagNoScripts"> + Skripte aus + </string> + <string name="TooltipLand"> + Land: + </string> + <string name="TooltipMustSingleDrop"> + Sie können nur ein einzelnes Objekt hierher ziehen + </string> + <string name="TooltipHttpUrl"> + Anklicken, um Webseite anzuzeigen + </string> + <string name="TooltipSLURL"> + Anklicken, um Informationen zu diesem Standort anzuzeigen + </string> + <string name="TooltipAgentUrl"> + Anklicken, um das Profil dieses Einwohners anzuzeigen + </string> + <string name="TooltipGroupUrl"> + Anklicken, um Beschreibung der Gruppe anzuzeigen + </string> + <string name="TooltipEventUrl"> + Anklicken, um Beschreibung der Veranstaltung anzuzeigen + </string> + <string name="TooltipClassifiedUrl"> + Anklicken, um diese Anzeige anzuzeigen + </string> + <string name="TooltipParcelUrl"> + Anklicken, um Beschreibung der Parzelle anzuzeigen + </string> + <string name="TooltipTeleportUrl"> + Anklicken, um zu diesem Standort zu teleportieren + </string> + <string name="TooltipObjectIMUrl"> + Anklicken, um Beschreibung des Objekts anzuzeigen + </string> + <string name="TooltipSLAPP"> + Anklicken, um Befehl secondlife:// auszuführen + </string> + <string name="BUTTON_CLOSE_DARWIN"> + Schließen (⌘-W) + </string> + <string name="BUTTON_CLOSE_WIN"> + Schließen (Strg+W) + </string> + <string name="BUTTON_RESTORE"> + Wiederherstellen + </string> + <string name="BUTTON_MINIMIZE"> + Minimieren + </string> + <string name="BUTTON_TEAR_OFF"> + Abnehmen + </string> + <string name="BUTTON_DOCK"> + Andocken + </string> + <string name="BUTTON_UNDOCK"> + Abkoppeln + </string> + <string name="BUTTON_HELP"> + Hilfe anzeigen + </string> + <string name="RetrievingData"> + Laden... + </string> + <string name="ReleaseNotes"> + Versionshinweise + </string> + <string name="LoadingData"> + Wird geladen... + </string> + <string name="AvatarNameNobody"> + (niemand) + </string> + <string name="AvatarNameWaiting"> + (wartet) + </string> + <string name="AvatarNameHippos"> + (hippos) + </string> + <string name="GroupNameNone"> + (keiner) + </string> + <string name="AssetErrorNone"> + Kein Fehler + </string> + <string name="AssetErrorRequestFailed"> + Asset-Anforderung: fehlgeschlagen + </string> + <string name="AssetErrorNonexistentFile"> + Asset-Anforderung: Datei existiert nicht + </string> + <string name="AssetErrorNotInDatabase"> + Asset-Anforderung: Asset in Datenbank nicht gefunden + </string> + <string name="AssetErrorEOF"> + Ende der Datei + </string> + <string name="AssetErrorCannotOpenFile"> + Datei kann nicht geöffnet werden + </string> + <string name="AssetErrorFileNotFound"> + Datei nicht gefunden + </string> + <string name="AssetErrorTCPTimeout"> + Zeitüberschreitung bei Dateiübertragung + </string> + <string name="AssetErrorCircuitGone"> + Verbindung verloren + </string> + <string name="AssetErrorPriceMismatch"> + Viewer und Server sind sich nicht über Preis einig + </string> + <string name="AssetErrorUnknownStatus"> + Status unbekannt + </string> + <string name="texture"> + Textur + </string> + <string name="sound"> + Sound + </string> + <string name="calling card"> + Visitenkarte + </string> + <string name="landmark"> + Landmarke + </string> + <string name="legacy script"> + Skript (veraltet) + </string> + <string name="clothing"> + Kleidung + </string> + <string name="object"> + Objekt + </string> + <string name="note card"> + Notizkarte + </string> + <string name="folder"> + Ordner + </string> + <string name="root"> + Hauptverzeichnis + </string> + <string name="lsl2 script"> + LSL2 Skript + </string> + <string name="lsl bytecode"> + LSL Bytecode + </string> + <string name="tga texture"> + tga-Textur + </string> + <string name="body part"> + Körperteil + </string> + <string name="snapshot"> + Foto + </string> + <string name="lost and found"> + Fundbüro + </string> + <string name="targa image"> + targa-Bild + </string> + <string name="trash"> + Papierkorb + </string> + <string name="jpeg image"> + jpeg-Bild + </string> + <string name="animation"> + Animation + </string> + <string name="gesture"> + Geste + </string> + <string name="simstate"> + simstate + </string> + <string name="favorite"> + Favoriten + </string> + <string name="symbolic link"> + Link + </string> + <string name="AvatarAway"> + Abwesend + </string> + <string name="AvatarBusy"> + Beschäftigt + </string> + <string name="AvatarMuted"> + Stummgeschaltet + </string> + <string name="anim_express_afraid"> + Ängstlich + </string> + <string name="anim_express_anger"> + Verärgert + </string> + <string name="anim_away"> + Abwesend + </string> + <string name="anim_backflip"> + Rückwärtssalto + </string> + <string name="anim_express_laugh"> + Lachkrampf + </string> + <string name="anim_express_toothsmile"> + Grinsen + </string> + <string name="anim_blowkiss"> + Kusshand + </string> + <string name="anim_express_bored"> + Gelangweilt + </string> + <string name="anim_bow"> + Verbeugen + </string> + <string name="anim_clap"> + Klatschen + </string> + <string name="anim_courtbow"> + Diener + </string> + <string name="anim_express_cry"> + Weinen + </string> + <string name="anim_dance1"> + Tanz 1 + </string> + <string name="anim_dance2"> + Tanz 2 + </string> + <string name="anim_dance3"> + Tanz 3 + </string> + <string name="anim_dance4"> + Tanz 4 + </string> + <string name="anim_dance5"> + Tanz 5 + </string> + <string name="anim_dance6"> + Tanz 6 + </string> + <string name="anim_dance7"> + Tanz 7 + </string> + <string name="anim_dance8"> + Tanz 8 + </string> + <string name="anim_express_disdain"> + Verachten + </string> + <string name="anim_drink"> + Trinken + </string> + <string name="anim_express_embarrased"> + Verlegen + </string> + <string name="anim_angry_fingerwag"> + Drohen + </string> + <string name="anim_fist_pump"> + Faust pumpen + </string> + <string name="anim_yoga_float"> + Yogaflieger + </string> + <string name="anim_express_frown"> + Stirnrunzeln + </string> + <string name="anim_impatient"> + Ungeduldig + </string> + <string name="anim_jumpforjoy"> + Freudensprung + </string> + <string name="anim_kissmybutt"> + LMA + </string> + <string name="anim_express_kiss"> + Küssen + </string> + <string name="anim_laugh_short"> + Lachen + </string> + <string name="anim_musclebeach"> + Posen + </string> + <string name="anim_no_unhappy"> + Nein (Bedauernd) + </string> + <string name="anim_no_head"> + Nein + </string> + <string name="anim_nyanya"> + Ällabätsch + </string> + <string name="anim_punch_onetwo"> + Eins-Zwei-Punch + </string> + <string name="anim_express_open_mouth"> + Mund offen + </string> + <string name="anim_peace"> + Friede + </string> + <string name="anim_point_you"> + Auf anderen zeigen + </string> + <string name="anim_point_me"> + Auf mich zeigen + </string> + <string name="anim_punch_l"> + Linker Haken + </string> + <string name="anim_punch_r"> + Rechter Haken + </string> + <string name="anim_rps_countdown"> + SSP zählen + </string> + <string name="anim_rps_paper"> + SSP Papier + </string> + <string name="anim_rps_rock"> + SSP Stein + </string> + <string name="anim_rps_scissors"> + SSP Schere + </string> + <string name="anim_express_repulsed"> + Angewidert + </string> + <string name="anim_kick_roundhouse_r"> + Rundkick + </string> + <string name="anim_express_sad"> + Traurig + </string> + <string name="anim_salute"> + Salutieren + </string> + <string name="anim_shout"> + Rufen + </string> + <string name="anim_express_shrug"> + Schulterzucken + </string> + <string name="anim_express_smile"> + Lächeln + </string> + <string name="anim_smoke_idle"> + Zigarette halten + </string> + <string name="anim_smoke_inhale"> + Rauchen + </string> + <string name="anim_smoke_throw_down"> + Zigarette wegwerfen + </string> + <string name="anim_express_surprise"> + Ãœberraschung + </string> + <string name="anim_sword_strike_r"> + Schwerthieb + </string> + <string name="anim_angry_tantrum"> + Wutanfall + </string> + <string name="anim_express_tongue_out"> + Zunge rausstrecken + </string> + <string name="anim_hello"> + Winken + </string> + <string name="anim_whisper"> + Flüstern + </string> + <string name="anim_whistle"> + Pfeifen + </string> + <string name="anim_express_wink"> + Zwinkern + </string> + <string name="anim_wink_hollywood"> + Zwinkern (Hollywood) + </string> + <string name="anim_express_worry"> + Sorgenvoll + </string> + <string name="anim_yes_happy"> + Ja (Erfreut) + </string> + <string name="anim_yes_head"> + Ja + </string> + <string name="texture_loading"> + Wird geladen... + </string> + <string name="worldmap_offline"> + Offline + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + Unvollständige Datei + </string> + <string name="ST_NO_JOINT"> + HAUPTVERZEICHNIS oder VERBINDUNG nicht gefunden. + </string> + <string name="whisper"> + flüstert: + </string> + <string name="shout"> + ruft: + </string> + <string name="ringing"> + Verbindung mit In-Welt-Voice-Chat... + </string> + <string name="connected"> + Verbunden + </string> + <string name="unavailable"> + Der aktuelle Standort unterstützt keine Voice-Kommunikation + </string> + <string name="hang_up"> + Verbindung mit In-Welt-Voice-Chat getrennt + </string> + <string name="ScriptQuestionCautionChatGranted"> + Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS]. + </string> + <string name="ScriptQuestionCautionChatDenied"> + Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung verweigert: [PERMISSIONS]. + </string> + <string name="ScriptTakeMoney"> + Linden-Dollar (L$) von Ihnen nehmen + </string> + <string name="ActOnControlInputs"> + Steuerung festlegen + </string> + <string name="RemapControlInputs"> + Steuerung neu zuweisen + </string> + <string name="AnimateYourAvatar"> + Avatar animieren + </string> + <string name="AttachToYourAvatar"> + An Avatar anhängen + </string> + <string name="ReleaseOwnership"> + Eigentum aufgeben und öffentlich machen + </string> + <string name="LinkAndDelink"> + Mit Objekten verknüpfen und davon trennen + </string> + <string name="AddAndRemoveJoints"> + Verbindungen zu anderen Objekten hinzufügen und entfernen + </string> + <string name="ChangePermissions"> + Berechtigungen ändern + </string> + <string name="TrackYourCamera"> + Kameraverfolgung + </string> + <string name="ControlYourCamera"> + Kamerasteuerung + </string> + <string name="SIM_ACCESS_PG"> + PG + </string> + <string name="SIM_ACCESS_MATURE"> + Mature + </string> + <string name="SIM_ACCESS_ADULT"> + Adult + </string> + <string name="SIM_ACCESS_DOWN"> + Offline + </string> + <string name="SIM_ACCESS_MIN"> + Unbekannt + </string> + <string name="land_type_unknown"> + (unbekannt) + </string> + <string name="all_files"> + Alle Dateien + </string> + <string name="sound_files"> + Sounds + </string> + <string name="animation_files"> + Animationen + </string> + <string name="image_files"> + Bilder + </string> + <string name="save_file_verb"> + Speichern + </string> + <string name="load_file_verb"> + Laden + </string> + <string name="targa_image_files"> + Targa-Bilder + </string> + <string name="bitmap_image_files"> + Bitmap-Bilder + </string> + <string name="avi_movie_file"> + AVI-Filmdatei + </string> + <string name="xaf_animation_file"> + XAF Anim-Datei + </string> + <string name="xml_file"> + XML-Datei + </string> + <string name="dot_raw_file"> + RAW-Datei + </string> + <string name="compressed_image_files"> + Komprimierte Bilder + </string> + <string name="load_files"> + Dateien laden + </string> + <string name="choose_the_directory"> + Verzeichnis auswählen + </string> + <string name="AvatarSetNotAway"> + Als anwesend anzeigen + </string> + <string name="AvatarSetAway"> + Als abwesend anzeigen + </string> + <string name="AvatarSetNotBusy"> + Als nicht beschäftigt anzeigen + </string> + <string name="AvatarSetBusy"> + Als beschäftigt anzeigen + </string> + <string name="shape"> + Form + </string> + <string name="skin"> + Haut + </string> + <string name="hair"> + Haare + </string> + <string name="eyes"> + Augen + </string> + <string name="shirt"> + Hemd + </string> + <string name="pants"> + Hose + </string> + <string name="shoes"> + Schuhe + </string> + <string name="socks"> + Socken + </string> + <string name="jacket"> + Jacke + </string> + <string name="gloves"> + Handschuhe + </string> + <string name="undershirt"> + Unterhemd + </string> + <string name="underpants"> + Unterhose + </string> + <string name="skirt"> + Rock + </string> + <string name="invalid"> + ungültig + </string> + <string name="BodyPartsRightArm"> + Rechter Arm + </string> + <string name="BodyPartsHead"> + Kopf + </string> + <string name="BodyPartsLeftArm"> + Linker Arm + </string> + <string name="BodyPartsLeftLeg"> + Linkes Bein + </string> + <string name="BodyPartsTorso"> + Oberkörper + </string> + <string name="BodyPartsRightLeg"> + Rechtes Bein + </string> + <string name="GraphicsQualityLow"> + Niedrig + </string> + <string name="GraphicsQualityMid"> + Mittel + </string> + <string name="GraphicsQualityHigh"> + Hoch + </string> + <string name="LeaveMouselook"> + ESC drücken, um zur Normalansicht zurückzukehren + </string> + <string name="InventoryNoMatchingItems"> + Im Inventar wurden keine passenden Artikel gefunden. + </string> + <string name="InventoryNoTexture"> + Sie haben keine Kopie dieser Textur in Ihrem Inventar. + </string> + <string name="LoadingContents"> + Inhalte werden geladen... + </string> + <string name="NoContents"> + Keine Inhalte + </string> + <string name="InvFolder My Inventory"> + Mein Inventar + </string> + <string name="InvFolder My Favorites"> + Meine Favoriten + </string> + <string name="InvFolder Library"> + Bibliothek + </string> + <string name="InvFolder Textures"> + Texturen + </string> + <string name="InvFolder Sounds"> + Sounds + </string> + <string name="InvFolder Calling Cards"> + Visitenkarten + </string> + <string name="InvFolder Landmarks"> + Landmarken + </string> + <string name="InvFolder Scripts"> + Skripts + </string> + <string name="InvFolder Clothing"> + Kleidung + </string> + <string name="InvFolder Objects"> + Objekte + </string> + <string name="InvFolder Notecards"> + Notizkarten + </string> + <string name="InvFolder New Folder"> + Neuer Ordner + </string> + <string name="InvFolder Inventory"> + Inventar + </string> + <string name="InvFolder Uncompressed Images"> + Nicht-Komprimierte Bilder + </string> + <string name="InvFolder Body Parts"> + Körperteile + </string> + <string name="InvFolder Trash"> + Papierkorb + </string> + <string name="InvFolder Photo Album"> + Fotoalbum + </string> + <string name="InvFolder Lost And Found"> + Fundbüro + </string> + <string name="InvFolder Uncompressed Sounds"> + Nicht-Komprimierte Sounds + </string> + <string name="InvFolder Animations"> + Animationen + </string> + <string name="InvFolder Gestures"> + Gesten + </string> + <string name="InvFolder favorite"> + Favoriten + </string> + <string name="InvFolder Current Outfit"> + Aktuelles Outfit + </string> + <string name="InvFolder My Outfits"> + Meine Outfits + </string> + <string name="InvFolder Friends"> + Freunde + </string> + <string name="InvFolder All"> + Alle + </string> + <string name="Buy"> + Kaufen + </string> + <string name="BuyforL$"> + Kaufen für L$ + </string> + <string name="Stone"> + Stein + </string> + <string name="Metal"> + Metall + </string> + <string name="Glass"> + Glas + </string> + <string name="Wood"> + Holz + </string> + <string name="Flesh"> + Fleisch + </string> + <string name="Plastic"> + Plastik + </string> + <string name="Rubber"> + Gummi + </string> + <string name="Light"> + Licht + </string> + <string name="KBShift"> + Umschalt-Taste + </string> + <string name="KBCtrl"> + Strg + </string> + <string name="Chest"> + Brust + </string> + <string name="Skull"> + Schädel + </string> + <string name="Left Shoulder"> + Linke Schulter + </string> + <string name="Right Shoulder"> + Rechte Schulter + </string> + <string name="Left Hand"> + Linke Hand + </string> + <string name="Right Hand"> + Rechte Hand + </string> + <string name="Left Foot"> + Linker Fuß + </string> + <string name="Right Foot"> + Rechter Fuß + </string> + <string name="Spine"> + Wirbelsäule + </string> + <string name="Pelvis"> + Becken + </string> + <string name="Mouth"> + Mund + </string> + <string name="Chin"> + Kinn + </string> + <string name="Left Ear"> + Linkes Ohr + </string> + <string name="Right Ear"> + Rechtes Ohr + </string> + <string name="Left Eyeball"> + Linker Augapfel + </string> + <string name="Right Eyeball"> + Rechter Augapfel + </string> + <string name="Nose"> + Nase + </string> + <string name="R Upper Arm"> + R Oberarm + </string> + <string name="R Forearm"> + R Unterarm + </string> + <string name="L Upper Arm"> + L Oberarm + </string> + <string name="L Forearm"> + L Unterarm + </string> + <string name="Right Hip"> + Rechte Hüfte + </string> + <string name="R Upper Leg"> + R Oberschenkel + </string> + <string name="R Lower Leg"> + R Unterschenkel + </string> + <string name="Left Hip"> + Linke Hüfte + </string> + <string name="L Upper Leg"> + L Oberschenkel + </string> + <string name="L Lower Leg"> + L Unterschenkel + </string> + <string name="Stomach"> + Bauch + </string> + <string name="Left Pec"> + Linke Brust + </string> + <string name="Right Pec"> + Rechts + </string> + <string name="YearsMonthsOld"> + [AGEYEARS] [AGEMONTHS] alt + </string> + <string name="YearsOld"> + [AGEYEARS] alt + </string> + <string name="MonthsOld"> + [AGEMONTHS] alt + </string> + <string name="WeeksOld"> + [AGEWEEKS] alt + </string> + <string name="DaysOld"> + [AGEDAYS] alt + </string> + <string name="TodayOld"> + Seit heute Mitglied + </string> + <string name="AgeYearsA"> + [COUNT] Jahr + </string> + <string name="AgeYearsB"> + [COUNT] Jahre + </string> + <string name="AgeYearsC"> + [COUNT] Jahre + </string> + <string name="AgeMonthsA"> + [COUNT] Monat + </string> + <string name="AgeMonthsB"> + [COUNT] Monate + </string> + <string name="AgeMonthsC"> + [COUNT] Monate + </string> + <string name="AgeWeeksA"> + [COUNT] Woche + </string> + <string name="AgeWeeksB"> + [COUNT] Wochen + </string> + <string name="AgeWeeksC"> + [COUNT] Wochen + </string> + <string name="AgeDaysA"> + [COUNT] Tag + </string> + <string name="AgeDaysB"> + [COUNT] Tage + </string> + <string name="AgeDaysC"> + [COUNT] Tage + </string> + <string name="AcctTypeResident"> + Einwohner + </string> + <string name="AcctTypeTrial"> + Test + </string> + <string name="AcctTypeCharterMember"> + Charta-Mitglied + </string> + <string name="AcctTypeEmployee"> + Linden Lab-Mitarbeiter + </string> + <string name="PaymentInfoUsed"> + Zahlungsinfo verwendet + </string> + <string name="PaymentInfoOnFile"> + Zahlungsinfo archiviert + </string> + <string name="NoPaymentInfoOnFile"> + Keine Zahlungsinfo archiviert + </string> + <string name="AgeVerified"> + Altersgeprüft + </string> + <string name="NotAgeVerified"> + Nicht altersgeprüft + </string> + <string name="Center 2"> + Mitte 2 + </string> + <string name="Top Right"> + Oben rechts + </string> + <string name="Top"> + Oben + </string> + <string name="Top Left"> + Oben links + </string> + <string name="Center"> + Zentrieren + </string> + <string name="Bottom Left"> + Unten links + </string> + <string name="Bottom"> + Unten + </string> + <string name="Bottom Right"> + Unten rechts + </string> + <string name="CompileQueueDownloadedCompiling"> + Heruntergeladen, wird kompiliert + </string> + <string name="CompileQueueScriptNotFound"> + Skript wurde auf Server nicht gefunden. + </string> + <string name="CompileQueueProblemDownloading"> + Beim Herunterladen ist ein Problem aufgetreten + </string> + <string name="CompileQueueInsufficientPermDownload"> + Unzureichende Rechte zum Herunterladen eines Skripts. + </string> + <string name="CompileQueueInsufficientPermFor"> + Unzureichende Berechtigungen für + </string> + <string name="CompileQueueUnknownFailure"> + Unbekannter Fehler beim Herunterladen + </string> + <string name="CompileQueueTitle"> + Rekompilierung + </string> + <string name="CompileQueueStart"> + rekompilieren + </string> + <string name="ResetQueueTitle"> + Zurücksetzen + </string> + <string name="ResetQueueStart"> + Zurücksetzen + </string> + <string name="RunQueueTitle"> + Skript ausführen + </string> + <string name="RunQueueStart"> + Skript ausführen + </string> + <string name="NotRunQueueTitle"> + Skript anhalten + </string> + <string name="NotRunQueueStart"> + Skript anhalten + </string> + <string name="CompileSuccessful"> + Kompilieren erfolgreich abgeschlossen! + </string> + <string name="CompileSuccessfulSaving"> + Kompilieren erfolgreich abgeschlossen, speichern... + </string> + <string name="SaveComplete"> + Speichervorgang abgeschlossen. + </string> + <string name="ObjectOutOfRange"> + Skript (Objekt außerhalb des Bereichs) + </string> + <string name="GodToolsObjectOwnedBy"> + Objekt [OBJECT], Besitzer [OWNER] + </string> + <string name="GroupsNone"> + keine + </string> + <string name="Unknown"> + (unbekannt) + </string> + <string name="Balance"> + Kontostand + </string> + <string name="Credits"> + Danksagung + </string> + <string name="Debits"> + Soll + </string> + <string name="Total"> + Gesamtbetrag + </string> + <string name="NoGroupDataFound"> + Für Gruppe wurden keine Gruppendaten gefunden + </string> + <string name="IMParentEstate"> + parent estate + </string> + <string name="IMMainland"> + Mainland + </string> + <string name="IMTeen"> + Teen + </string> + <string name="RegionInfoError"> + Fehler + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + alle Grundstücke gehören [OWNER] + </string> + <string name="RegionInfoAllEstatesYouOwn"> + alle Grundstücke, die Ihnen gehört haben + </string> + <string name="RegionInfoAllEstatesYouManage"> + alle Grundstücke, die Sie für [OWNER] verwaltet haben + </string> + <string name="RegionInfoAllowedResidents"> + Zulässige Einwohner: ([ALLOWEDAGENTS], max [MAXACCESS]) + </string> + <string name="RegionInfoAllowedGroups"> + Zulässige Gruppen: ([ALLOWEDGROUPS], max [MAXACCESS]) + </string> + <string name="CursorPos"> + Zeile [LINE], Spalte [COLUMN] + </string> + <string name="PanelDirCountFound"> + [COUNT] gefunden + </string> + <string name="PanelContentsNewScript"> + Neues Skript + </string> + <string name="MuteByName"> + (nach Namen) + </string> + <string name="MuteAgent"> + (Einwohner) + </string> + <string name="MuteObject"> + (Objekt) + </string> + <string name="MuteGroup"> + (Gruppe) + </string> + <string name="RegionNoCovenant"> + Für dieses Grundstück liegt kein Vertrag vor. + </string> + <string name="RegionNoCovenantOtherOwner"> + Für dieses Grundstück liegt kein Vertrag vor. Das Land auf diesem Grundstück wird vom Grundstückseigentümer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundstückseigentümer in Verbindung. + </string> + <string name="covenant_last_modified"> + Zuletzt geändert: + </string> + <string name="GroupOwned"> + In Gruppenbesitz + </string> + <string name="Public"> + Öffentlich + </string> + <string name="ClassifiedClicksTxt"> + Klicks: [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil + </string> + <string name="ClassifiedUpdateAfterPublish"> + (wird nach Veröffentlichung aktualisiert) + </string> + <string name="GroupVoteYes"> + Ja + </string> + <string name="GroupVoteNo"> + Nein + </string> + <string name="GroupVoteNoActiveProposals"> + Zurzeit sind keine Umfragen aktiv + </string> + <string name="GroupVoteNoArchivedProposals"> + Zurzeit sind keine Umfragen aktiv + </string> + <string name="GroupVoteRetrievingArchivedProposals"> + Archivierte Umfragen werden geladen + </string> + <string name="GroupVoteRetrievingActiveProposals"> + Aktive Umfragen werden geladen + </string> + <string name="MultiPreviewTitle"> + Vorschau + </string> + <string name="MultiPropertiesTitle"> + Eigenschaften + </string> + <string name="InvOfferAnObjectNamed"> + Ein Objekt namens + </string> + <string name="InvOfferOwnedByGroup"> + im Besitz der Gruppe + </string> + <string name="InvOfferOwnedByUnknownGroup"> + im Besitz einer unbekannten Gruppe + </string> + <string name="InvOfferOwnedBy"> + im Besitz von + </string> + <string name="InvOfferOwnedByUnknownUser"> + im Besitz eines unbekannten Einwohners + </string> + <string name="InvOfferGaveYou"> + hat Ihnen folgendes übergeben + </string> + <string name="InvOfferYouDecline"> + Sie lehnen folgendes ab: + </string> + <string name="InvOfferFrom"> + von + </string> + <string name="GroupMoneyTotal"> + Gesamtbetrag + </string> + <string name="GroupMoneyBought"> + gekauft + </string> + <string name="GroupMoneyPaidYou"> + bezahlte Ihnen + </string> + <string name="GroupMoneyPaidInto"> + bezahlte an + </string> + <string name="GroupMoneyBoughtPassTo"> + kaufte Pass für + </string> + <string name="GroupMoneyPaidFeeForEvent"> + bezahlte Gebühr für Event + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + bezahlte Preis für Event + </string> + <string name="GroupMoneyBalance"> + Kontostand + </string> + <string name="GroupMoneyCredits"> + Danksagung + </string> + <string name="GroupMoneyDebits"> + Soll + </string> + <string name="ViewerObjectContents"> + Inhalte + </string> + <string name="AcquiredItems"> + Erworbene Artikel + </string> + <string name="Cancel"> + Abbrechen + </string> + <string name="UploadingCosts"> + Hochladen von %s kostet + </string> + <string name="UnknownFileExtension"> + Unbekanntes Dateiformat .%s +Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh + </string> + <string name="AddLandmarkNavBarMenu"> + Landmarke hinzufügen... + </string> + <string name="EditLandmarkNavBarMenu"> + Landmarke bearbeiten... + </string> + <string name="accel-mac-control"> + ⌃ + </string> + <string name="accel-mac-command"> + ⌘ + </string> + <string name="accel-mac-option"> + ⌥ + </string> + <string name="accel-mac-shift"> + ⇧ + </string> + <string name="accel-win-control"> + Strg+ + </string> + <string name="accel-win-alt"> + Alt+ + </string> + <string name="accel-win-shift"> + Umschalt+ + </string> + <string name="FileSaved"> + Datei wurde gespeichert + </string> + <string name="Receiving"> + Daten werden empfangen + </string> + <string name="AM"> + Uhr + </string> + <string name="PM"> + Uhr + </string> + <string name="PST"> + PST + </string> + <string name="PDT"> + PDT + </string> + <string name="Forward"> + Vorwärts + </string> + <string name="Left"> + Links + </string> + <string name="Right"> + Rechts + </string> + <string name="Back"> + Zurück + </string> + <string name="North"> + Norden + </string> + <string name="South"> + Süden + </string> + <string name="West"> + Westen + </string> + <string name="East"> + Osten + </string> + <string name="Up"> + Nach oben + </string> + <string name="Down"> + Nach unten + </string> + <string name="Any Category"> + Alle Kategorien + </string> + <string name="Shopping"> + Shopping + </string> + <string name="Land Rental"> + Land mieten + </string> + <string name="Property Rental"> + Immobilie mieten + </string> + <string name="Special Attraction"> + Attraktionen + </string> + <string name="New Products"> + Neue Produkte + </string> + <string name="Employment"> + Stellenangebote + </string> + <string name="Wanted"> + Gesucht + </string> + <string name="Service"> + Dienstleistungen + </string> + <string name="Personal"> + Verschiedenes + </string> + <string name="None"> + Keiner + </string> + <string name="Linden Location"> + Lindenort + </string> + <string name="Adult"> + Adult + </string> + <string name="Arts&Culture"> + Kunst & Kultur + </string> + <string name="Business"> + Business + </string> + <string name="Educational"> + Bildung + </string> + <string name="Gaming"> + Spielen + </string> + <string name="Hangout"> + Treffpunkt + </string> + <string name="Newcomer Friendly"> + Anfängergerecht + </string> + <string name="Parks&Nature"> + Parks und Natur + </string> + <string name="Residential"> + Wohngebiet + </string> + <string name="Stage"> + Phase + </string> + <string name="Other"> + Sonstige + </string> + <string name="Any"> + Alle + </string> + <string name="You"> + Sie + </string> + <string name=":"> + : + </string> + <string name=","> + , + </string> + <string name="..."> + ... + </string> + <string name="***"> + *** + </string> + <string name="("> + ( + </string> + <string name=")"> + ) + </string> + <string name="."> + . + </string> + <string name="'"> + ' + </string> + <string name="---"> + --- + </string> + <string name="MBCmdLineError"> + Beim Parsen der Befehlszeile wurde ein Fehler festgestellt. +Weitere Informationen: http://wiki.secondlife.com/wiki/Client_parameters (EN) +Fehler: + </string> + <string name="MBCmdLineUsg"> + [APP_NAME] Verwendung in Befehlszeile: + </string> + <string name="MBUnableToAccessFile"> + [APP_NAME] kann auf die erforderliche Datei nicht zugreifen. + +Grund hierfür ist, dass Sie entweder mehrere Instanzen gleichzeitig ausführen oder dass Ihr System denkt, eine Datei sei geöffnet. +Falls diese Nachricht erneut angezeigt wird, starten Sie bitte Ihren Computer neu und probieren Sie es noch einmal. +Falls der Fehler dann weiterhin auftritt, müssen Sie [APP_NAME] von Ihrem System de-installieren und erneut installieren. + </string> + <string name="MBFatalError"> + Unbehebbarer Fehler + </string> + <string name="MBRequiresAltiVec"> + [APP_NAME] erfordert einen Prozessor mit AltiVec (G4 oder später). + </string> + <string name="MBAlreadyRunning"> + [APP_NAME] läuft bereits. +Bitte sehen Sie in Ihrer Menüleiste nach, dort sollte ein Symbol für das Programm angezeigt werden. +Falls diese Nachricht erneut angezeigt wird, starten Sie Ihren Computer bitte neu. + </string> + <string name="MBFrozenCrashed"> + [APP_NAME] scheint eingefroren zu sein oder ist abgestürzt. +Möchten Sie einen Absturz-Bericht einschicken? + </string> + <string name="MBAlert"> + Alarm + </string> + <string name="MBNoDirectX"> + [APP_NAME] kann DirectX 9.0b oder höher nicht feststellen. +[APP_NAME] verwendet DirectX, um nach Hardware und/oder veralteten Treibern zu suchen, die zu Problemen mit der Stabilität, Leistung und Abstürzen führen können. Sie können [APP_NAME] auch so ausführen, wir empfehlen jedoch, dass DirectX 9.0b vorhanden ist und ausgeführt wird. + +Möchten Sie fortfahren? + </string> + <string name="MBWarning"> + Hinweis + </string> + <string name="MBNoAutoUpdate"> + Für Linux ist zur Zeit noch kein automatisches Aktualisieren möglich. +Bitte laden Sie die aktuellste Version von www.secondlife.com herunter. + </string> + <string name="MBRegClassFailed"> + RegisterClass fehlgeschlagen + </string> + <string name="MBError"> + Fehler + </string> + <string name="MBFullScreenErr"> + Vollbildschirm mit [WIDTH] x [HEIGHT] kann nicht ausgeführt werden. +Ausführung erfolgt in Fenster. + </string> + <string name="MBDestroyWinFailed"> + Fehler beim Herunterfahren während Fenster geschlossen wurde (DestroyWindow() fehlgeschlagen) + </string> + <string name="MBShutdownErr"> + Fehler beim Herunterfahren + </string> + <string name="MBDevContextErr"> + Kann keinen Kontext für GL-Gerät erstellen + </string> + <string name="MBPixelFmtErr"> + Passendes Pixelformat wurde nicht gefunden + </string> + <string name="MBPixelFmtDescErr"> + Beschreibung für Pixelformat nicht verfügbar + </string> + <string name="MBTrueColorWindow"> + Um [APP_NAME] in einem Fenster auszuführen, ist True Color (32-bit) erforderlich. +Klicken Sie auf Systemsteuerung > Anzeige > Einstellungen und stellen Sie den Bildschirm auf 32-bit Farbe ein. +Wenn Sie die Anwendung im Modus Vollbildschirm ausführen möchten, dann wird [APP_NAME] den Bildschirm automatisch während der Ausführung anpassen. + </string> + <string name="MBAlpha"> + [APP_NAME] kann nicht ausgeführt werden, da kein 8-Bit-Alpha-Kanal verfügbar ist. Dies geschieht normalerweise bei Problemen mit dem Treiber der Video-Karte. +Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für Ihre Videokarte installiert haben. +Vergewissern Sie sich außerdem, dass Ihr Bildschirm auf True Color (32-Bit) eingestellt ist (Systemsteuerung > Anzeige > Einstellungen). +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </string> + <string name="MBPixelFmtSetErr"> + Pixel-Format kann nicht eingestellt werden. + </string> + <string name="MBGLContextErr"> + Kann keinen Kontext für GL-Gerät erstellen + </string> + <string name="MBGLContextActErr"> + Kann keinen Kontext für GL-Gerät aktivieren + </string> + <string name="MBVideoDrvErr"> + [APP_NAME] kann nicht ausgeführt werden, da die Treiber Ihrer Videokarte entweder nicht richtig installiert oder veraltet sind, oder die entsprechende Hardware nicht unterstützt wird. Bitte vergewissern Sie sich, dass Sie die aktuellsten Treiber für die Videokarte installiert haben. Falls Sie die aktuellsten Treiber bereits installiert haben, installieren Sie diese bitte erneut. + +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </string> + <string name="5 O'Clock Shadow"> + Bartschatten + </string> + <string name="All White"> + Ganz weiß + </string> + <string name="Anime Eyes"> + Anime-Augen + </string> + <string name="Arced"> + Gewölbt + </string> + <string name="Arm Length"> + Armlänge + </string> + <string name="Attached"> + Angewachsen + </string> + <string name="Attached Earlobes"> + Angewachsene Ohrläppchen + </string> + <string name="Back Bangs"> + Nackenhaar + </string> + <string name="Back Bangs Down"> + Lang + </string> + <string name="Back Bangs Up"> + Kurz + </string> + <string name="Back Fringe"> + Nackenfransen + </string> + <string name="Back Hair"> + Hinterkopfhaar + </string> + <string name="Back Hair Down"> + lang + </string> + <string name="Back Hair Up"> + kurz + </string> + <string name="Baggy"> + Tränensäcke + </string> + <string name="Bangs"> + Pony + </string> + <string name="Bangs Down"> + Pony lang + </string> + <string name="Bangs Up"> + Pony kurz + </string> + <string name="Beady Eyes"> + Knopfaugen + </string> + <string name="Belly Size"> + Bauchgröße + </string> + <string name="Big"> + Groß + </string> + <string name="Big Butt"> + Großer Hintern + </string> + <string name="Big Eyeball"> + Großer Augapfel + </string> + <string name="Big Hair Back"> + Volumen: Hinten + </string> + <string name="Big Hair Front"> + Volumen: Vorne + </string> + <string name="Big Hair Top"> + Volumen: Oben + </string> + <string name="Big Head"> + Großer Kopf + </string> + <string name="Big Pectorals"> + Große Brustmuskeln + </string> + <string name="Big Spikes"> + Große Stacheln + </string> + <string name="Black"> + Schwarz + </string> + <string name="Blonde"> + Blond + </string> + <string name="Blonde Hair"> + Blondes Haar + </string> + <string name="Blush"> + Rouge + </string> + <string name="Blush Color"> + Rougefarbe + </string> + <string name="Blush Opacity"> + Rouge Deckkraft + </string> + <string name="Body Definition"> + Körperkonturen + </string> + <string name="Body Fat"> + Körperfett + </string> + <string name="Body Freckles"> + Sommersprossen + </string> + <string name="Body Thick"> + Körper - breit + </string> + <string name="Body Thickness"> + Körperbreite + </string> + <string name="Body Thin"> + Körper - schmal + </string> + <string name="Bow Legged"> + o-beinig + </string> + <string name="Breast Buoyancy"> + Brust, Straffheit + </string> + <string name="Breast Cleavage"> + Dekolleté + </string> + <string name="Breast Size"> + Brustgröße + </string> + <string name="Bridge Width"> + Rückenbreite + </string> + <string name="Broad"> + Breit + </string> + <string name="Brow Size"> + Brauengröße + </string> + <string name="Bug Eyes"> + Glubschaugen + </string> + <string name="Bugged Eyes"> + Hervortretend + </string> + <string name="Bulbous"> + Knollennase + </string> + <string name="Bulbous Nose"> + Knollennase + </string> + <string name="Bushy Eyebrows"> + Buschige Augenbrauen + </string> + <string name="Bushy Hair"> + Buschiges Haar + </string> + <string name="Butt Size"> + Hintern, Größe + </string> + <string name="bustle skirt"> + Tournürenrock + </string> + <string name="no bustle"> + Ohne + </string> + <string name="more bustle"> + Mit + </string> + <string name="Chaplin"> + Chaplin + </string> + <string name="Cheek Bones"> + Wangenknochen + </string> + <string name="Chest Size"> + Brustgröße + </string> + <string name="Chin Angle"> + Kinnwinkel + </string> + <string name="Chin Cleft"> + Kinnspalte + </string> + <string name="Chin Curtains"> + Schifferfräse + </string> + <string name="Chin Depth"> + Kinnlänge + </string> + <string name="Chin Heavy"> + Kinn ausgeprägt + </string> + <string name="Chin In"> + Kinn zurück + </string> + <string name="Chin Out"> + Kinn nach vorne + </string> + <string name="Chin-Neck"> + Kinn-Hals + </string> + <string name="Clear"> + Löschen + </string> + <string name="Cleft"> + Spalte + </string> + <string name="Close Set Eyes"> + Eng stehende Augen + </string> + <string name="Closed"> + Geschlossen + </string> + <string name="Closed Back"> + Hinten geschlossen + </string> + <string name="Closed Front"> + Vorne geschlossen + </string> + <string name="Closed Left"> + Links geschlossen + </string> + <string name="Closed Right"> + Rechts geschlossen + </string> + <string name="Coin Purse"> + Klein + </string> + <string name="Collar Back"> + Kragen hinten + </string> + <string name="Collar Front"> + Kragen vorne + </string> + <string name="Corner Down"> + Nach unten + </string> + <string name="Corner Normal"> + Normal + </string> + <string name="Corner Up"> + Nach oben + </string> + <string name="Creased"> + Schlupflid + </string> + <string name="Crooked Nose"> + Krumme Nase + </string> + <string name="Cropped Hair"> + Kurze Haare + </string> + <string name="Cuff Flare"> + Hosenaufschlag + </string> + <string name="Dark"> + Dunkel + </string> + <string name="Dark Green"> + Dunkelgrün + </string> + <string name="Darker"> + Dunkler + </string> + <string name="Deep"> + Tief + </string> + <string name="Default Heels"> + Standardabsätze + </string> + <string name="Default Toe"> + Standardspitze + </string> + <string name="Dense"> + Dicht + </string> + <string name="Dense hair"> + Dichtes Haar + </string> + <string name="Double Chin"> + Doppelkinn + </string> + <string name="Downturned"> + Nach unten + </string> + <string name="Duffle Bag"> + Groß + </string> + <string name="Ear Angle"> + Ohrenwinkel + </string> + <string name="Ear Size"> + Ohrengröße + </string> + <string name="Ear Tips"> + Ohrenspitzen + </string> + <string name="Egg Head"> + Eierkopf + </string> + <string name="Eye Bags"> + Augenränder + </string> + <string name="Eye Color"> + Augenfarbe + </string> + <string name="Eye Depth"> + Augentiefe + </string> + <string name="Eye Lightness"> + Helligkeit + </string> + <string name="Eye Opening"> + Öffnung + </string> + <string name="Eye Pop"> + Symmetrie + </string> + <string name="Eye Size"> + Augengröße + </string> + <string name="Eye Spacing"> + Augenstand + </string> + <string name="Eyeball Size"> + Größe des Augapfels + </string> + <string name="Eyebrow Arc"> + Brauenbogen + </string> + <string name="Eyebrow Density"> + Brauendichte + </string> + <string name="Eyebrow Height"> + Brauenhöhe + </string> + <string name="Eyebrow Points"> + Brauenenden + </string> + <string name="Eyebrow Size"> + Brauengröße + </string> + <string name="Eyelash Length"> + Wimpernlänge + </string> + <string name="Eyeliner"> + Eyeliner + </string> + <string name="Eyeliner Color"> + Farbe des Eyeliners + </string> + <string name="Eyes Back"> + Augen zurück + </string> + <string name="Eyes Bugged"> + Glubschaugen + </string> + <string name="Eyes Forward"> + Augen nach vorne + </string> + <string name="Eyes Long Head"> + Augen langer Kopf + </string> + <string name="Eyes Shear Left Up"> + Augen Verzerrung links hoch + </string> + <string name="Eyes Shear Right Up"> + Augen Verzerrung rechts hoch + </string> + <string name="Eyes Short Head"> + Augen kurzer Kopf + </string> + <string name="Eyes Spread"> + Augen auseinander + </string> + <string name="Eyes Sunken"> + eingesunkene Augen + </string> + <string name="Eyes Together"> + Augen zusammen + </string> + <string name="Face Shear"> + Gesichtsverzerrung + </string> + <string name="Facial Definition"> + Gesichtskonturen + </string> + <string name="Far Set Eyes"> + Weit auseinander + </string> + <string name="Fat"> + Dick + </string> + <string name="Fat Head"> + Dicker Kopf + </string> + <string name="Fat Lips"> + Volle Lippen + </string> + <string name="Fat Lower"> + Volle Unterlippe + </string> + <string name="Fat Lower Lip"> + Volle Unterlippe + </string> + <string name="Fat Torso"> + Dicker Körper + </string> + <string name="Fat Upper"> + Volle Oberlippe + </string> + <string name="Fat Upper Lip"> + Volle Oberlippe + </string> + <string name="Female"> + weiblich + </string> + <string name="Fingerless"> + Ohne Finger + </string> + <string name="Fingers"> + Finger + </string> + <string name="Flared Cuffs"> + Ausgestellt + </string> + <string name="Flat"> + Flach + </string> + <string name="Flat Butt"> + Flacher Hintern + </string> + <string name="Flat Head"> + Flacher Kopf + </string> + <string name="Flat Toe"> + Flache Spitze + </string> + <string name="Foot Size"> + Fußgröße + </string> + <string name="Forehead Angle"> + Stirnwinkel + </string> + <string name="Forehead Heavy"> + Stirn ausgeprägt + </string> + <string name="Freckles"> + Sommersprossen + </string> + <string name="Front Bangs Down"> + Langer Pony + </string> + <string name="Front Bangs Up"> + Kurzer Pony + </string> + <string name="Front Fringe"> + Fransen, vorne + </string> + <string name="Front Hair"> + Vorderhaar + </string> + <string name="Front Hair Down"> + langes Vorderhaar + </string> + <string name="Front Hair Up"> + Kurzes Vorderhaar + </string> + <string name="Full Back"> + Hinten volles Haar + </string> + <string name="Full Eyeliner"> + Starker Eyeliner + </string> + <string name="Full Front"> + Vorne volles Haar + </string> + <string name="Full Hair Sides"> + Seitlich volles Haar + </string> + <string name="Full Sides"> + Volle Seiten + </string> + <string name="Glossy"> + Glänzend + </string> + <string name="Glove Fingers"> + Handschuhfinger + </string> + <string name="Glove Length"> + Handschuhlänge + </string> + <string name="Hair"> + Haare + </string> + <string name="Hair Back"> + Haare: Hinten + </string> + <string name="Hair Front"> + Haare: Vorne + </string> + <string name="Hair Sides"> + Haare: Seiten + </string> + <string name="Hair Sweep"> + Haartolle + </string> + <string name="Hair Thickess"> + Haardicke + </string> + <string name="Hair Thickness"> + Haardicke + </string> + <string name="Hair Tilt"> + Haarneigung + </string> + <string name="Hair Tilted Left"> + Nach links + </string> + <string name="Hair Tilted Right"> + Nach rechts + </string> + <string name="Hair Volume"> + Haare: Volumen + </string> + <string name="Hand Size"> + Handgröße + </string> + <string name="Handlebars"> + Zwirbelbart + </string> + <string name="Head Length"> + Kopflänge + </string> + <string name="Head Shape"> + Kopfform + </string> + <string name="Head Size"> + Kopfgröße + </string> + <string name="Head Stretch"> + Kopfstreckung + </string> + <string name="Heel Height"> + Absatzhöhe + </string> + <string name="Heel Shape"> + Absatzform + </string> + <string name="Height"> + Höhe + </string> + <string name="High"> + Hoch + </string> + <string name="High Heels"> + Hohe Absätze + </string> + <string name="High Jaw"> + Hoch + </string> + <string name="High Platforms"> + Hohe Plattformsohlen + </string> + <string name="High and Tight"> + Hoch und eng + </string> + <string name="Higher"> + Höhere + </string> + <string name="Hip Length"> + Länge der Hüfte + </string> + <string name="Hip Width"> + Breite der Hüfte + </string> + <string name="In"> + In + </string> + <string name="In Shdw Color"> + Farbe Innenseite + </string> + <string name="In Shdw Opacity"> + Deckkraft: innerer Lidschatten + </string> + <string name="Inner Eye Corner"> + Ecke: Nasenseite + </string> + <string name="Inner Eye Shadow"> + Innerer Lidschatten + </string> + <string name="Inner Shadow"> + Innerer Lidschatten + </string> + <string name="Jacket Length"> + Jackenlänge + </string> + <string name="Jacket Wrinkles"> + Jackenfalten + </string> + <string name="Jaw Angle"> + Kinnansatz + </string> + <string name="Jaw Jut"> + Kinnposition + </string> + <string name="Jaw Shape"> + Kinnform + </string> + <string name="Join"> + Zusammen + </string> + <string name="Jowls"> + Hängebacken + </string> + <string name="Knee Angle"> + Kniewinkel + </string> + <string name="Knock Kneed"> + X-beinig + </string> + <string name="Large"> + Groß + </string> + <string name="Large Hands"> + Große Hände + </string> + <string name="Left Part"> + Linksscheitel + </string> + <string name="Leg Length"> + Beinlänge + </string> + <string name="Leg Muscles"> + Beinmuskeln + </string> + <string name="Less"> + Weniger + </string> + <string name="Less Body Fat"> + Weniger Speck + </string> + <string name="Less Curtains"> + Weniger + </string> + <string name="Less Freckles"> + Weniger + </string> + <string name="Less Full"> + Weniger + </string> + <string name="Less Gravity"> + Weniger + </string> + <string name="Less Love"> + Weniger + </string> + <string name="Less Muscles"> + Weniger + </string> + <string name="Less Muscular"> + Weniger + </string> + <string name="Less Rosy"> + Weniger + </string> + <string name="Less Round"> + Weniger + </string> + <string name="Less Saddle"> + Weniger + </string> + <string name="Less Square"> + Weniger + </string> + <string name="Less Volume"> + Weniger + </string> + <string name="Less soul"> + Weniger + </string> + <string name="Lighter"> + Heller + </string> + <string name="Lip Cleft"> + Amorbogen + </string> + <string name="Lip Cleft Depth"> + Tiefe: Amorbogen + </string> + <string name="Lip Fullness"> + Fülle + </string> + <string name="Lip Pinkness"> + Pinkton + </string> + <string name="Lip Ratio"> + Lippenproportionen + </string> + <string name="Lip Thickness"> + Lippendicke + </string> + <string name="Lip Width"> + Mundbreite + </string> + <string name="Lipgloss"> + Lipgloss + </string> + <string name="Lipstick"> + Lippenstift + </string> + <string name="Lipstick Color"> + Farbe + </string> + <string name="Long"> + Lang + </string> + <string name="Long Head"> + Langer Kopf + </string> + <string name="Long Hips"> + Lange Hüften + </string> + <string name="Long Legs"> + Lange Beine + </string> + <string name="Long Neck"> + Langer Hals + </string> + <string name="Long Pigtails"> + Lange Zöpfe + </string> + <string name="Long Ponytail"> + Langer Pferdeschwanz + </string> + <string name="Long Torso"> + Langer Oberkörper + </string> + <string name="Long arms"> + Lange Arme + </string> + <string name="Longcuffs"> + Manschetten + </string> + <string name="Loose Pants"> + Weite Hosen + </string> + <string name="Loose Shirt"> + Weites Hemd + </string> + <string name="Loose Sleeves"> + Weite Ärmel + </string> + <string name="Love Handles"> + Fettpölsterchen + </string> + <string name="Low"> + Niedrig + </string> + <string name="Low Heels"> + Niedrig + </string> + <string name="Low Jaw"> + Niedrig + </string> + <string name="Low Platforms"> + Niedrig + </string> + <string name="Low and Loose"> + Weit + </string> + <string name="Lower"> + Absenken + </string> + <string name="Lower Bridge"> + Brücke, Unterer Teil + </string> + <string name="Lower Cheeks"> + Wangen, unterer Bereich + </string> + <string name="Male"> + Männlich + </string> + <string name="Middle Part"> + Mittelscheitel + </string> + <string name="More"> + Mehr + </string> + <string name="More Blush"> + Mehr + </string> + <string name="More Body Fat"> + Mehr Speck + </string> + <string name="More Curtains"> + Mehr + </string> + <string name="More Eyeshadow"> + Mehr + </string> + <string name="More Freckles"> + Mehr + </string> + <string name="More Full"> + Voller + </string> + <string name="More Gravity"> + Mehr + </string> + <string name="More Lipstick"> + Mehr + </string> + <string name="More Love"> + Mehr + </string> + <string name="More Lower Lip"> + Größer + </string> + <string name="More Muscles"> + Mehr + </string> + <string name="More Muscular"> + Mehr + </string> + <string name="More Rosy"> + Mehr + </string> + <string name="More Round"> + Runder + </string> + <string name="More Saddle"> + Mehr + </string> + <string name="More Sloped"> + Mehr + </string> + <string name="More Square"> + Mehr + </string> + <string name="More Upper Lip"> + Mehr + </string> + <string name="More Vertical"> + Mehr + </string> + <string name="More Volume"> + Mehr + </string> + <string name="More soul"> + Mehr + </string> + <string name="Moustache"> + Schnauzer + </string> + <string name="Mouth Corner"> + Mundwinkel + </string> + <string name="Mouth Position"> + Mundposition + </string> + <string name="Mowhawk"> + Irokese + </string> + <string name="Muscular"> + Muskulös + </string> + <string name="Mutton Chops"> + Koteletten + </string> + <string name="Nail Polish"> + Nagellack + </string> + <string name="Nail Polish Color"> + Farbe + </string> + <string name="Narrow"> + Schmal + </string> + <string name="Narrow Back"> + Wenig + </string> + <string name="Narrow Front"> + Wenig + </string> + <string name="Narrow Lips"> + Schmale Lippen + </string> + <string name="Natural"> + Natürlich + </string> + <string name="Neck Length"> + Halslänge + </string> + <string name="Neck Thickness"> + Halsdicke + </string> + <string name="No Blush"> + Kein Rouge + </string> + <string name="No Eyeliner"> + Kein Eyeliner + </string> + <string name="No Eyeshadow"> + Kein Lidschatten + </string> + <string name="No Heels"> + Keine Absätze + </string> + <string name="No Lipgloss"> + Kein Lipgloss + </string> + <string name="No Lipstick"> + Kein Lippenstift + </string> + <string name="No Part"> + Kein Scheitel + </string> + <string name="No Polish"> + Kein Nagellack + </string> + <string name="No Red"> + Nicht rot + </string> + <string name="No Spikes"> + Keine Stachel + </string> + <string name="No White"> + Kein Weiß + </string> + <string name="No Wrinkles"> + Keine Falten + </string> + <string name="Normal Lower"> + Normal unten + </string> + <string name="Normal Upper"> + Normal oben + </string> + <string name="Nose Left"> + Links + </string> + <string name="Nose Right"> + Rechts + </string> + <string name="Nose Size"> + Größe + </string> + <string name="Nose Thickness"> + Dicke + </string> + <string name="Nose Tip Angle"> + Nasenspitze + </string> + <string name="Nose Tip Shape"> + Nasenspitze + </string> + <string name="Nose Width"> + Nasenbreite + </string> + <string name="Nostril Division"> + Teilung + </string> + <string name="Nostril Width"> + Größe + </string> + <string name="Old"> + Alt + </string> + <string name="Opaque"> + Deckend + </string> + <string name="Open"> + Öffnen + </string> + <string name="Open Back"> + Hinten offen + </string> + <string name="Open Front"> + Vorne offen + </string> + <string name="Open Left"> + Links offen + </string> + <string name="Open Right"> + Rechts offen + </string> + <string name="Orange"> + Orange + </string> + <string name="Out"> + Aus + </string> + <string name="Out Shdw Color"> + Farbe: Oberer Lidschatten + </string> + <string name="Out Shdw Opacity"> + Deckkraft: Oberer Lidschatten + </string> + <string name="Outer Eye Corner"> + Äußerer Augenwinkel + </string> + <string name="Outer Eye Shadow"> + Lidschatten: Oben + </string> + <string name="Outer Shadow"> + Lidschatten: Oben + </string> + <string name="Overbite"> + Ãœberbiss + </string> + <string name="Package"> + Ausbeulung + </string> + <string name="Painted Nails"> + Lackierte Nägel + </string> + <string name="Pale"> + Blass + </string> + <string name="Pants Crotch"> + Schritt + </string> + <string name="Pants Fit"> + Passform + </string> + <string name="Pants Length"> + Hosenlänge + </string> + <string name="Pants Waist"> + Hüfte + </string> + <string name="Pants Wrinkles"> + Falten + </string> + <string name="Part"> + Scheitel + </string> + <string name="Part Bangs"> + Pony scheiteln + </string> + <string name="Pectorals"> + Brustmuskel + </string> + <string name="Pigment"> + Pigmentierung + </string> + <string name="Pigtails"> + Zöpfe + </string> + <string name="Pink"> + Pink + </string> + <string name="Pinker"> + Mehr Pink + </string> + <string name="Platform Height"> + Höhe + </string> + <string name="Platform Width"> + Breite + </string> + <string name="Pointy"> + Spitz + </string> + <string name="Pointy Heels"> + Pfennigabsätze + </string> + <string name="Pointy Toe"> + Spitz + </string> + <string name="Ponytail"> + Pferdeschwanz + </string> + <string name="Poofy Skirt"> + Weit ausgestellt + </string> + <string name="Pop Left Eye"> + Linkes Auge größer + </string> + <string name="Pop Right Eye"> + Rechtes Auge größer + </string> + <string name="Puffy"> + Geschwollen + </string> + <string name="Puffy Eyelids"> + Geschwollene Lider + </string> + <string name="Rainbow Color"> + Regenbogenfarben + </string> + <string name="Red Hair"> + Rote Haare + </string> + <string name="Red Skin"> + Rote Haut + </string> + <string name="Regular"> + Normal + </string> + <string name="Regular Muscles"> + Normal muskulös + </string> + <string name="Right Part"> + Scheitel rechts + </string> + <string name="Rosy Complexion"> + Rosiger Teint + </string> + <string name="Round"> + Rund + </string> + <string name="Round Forehead"> + Runde Stirn + </string> + <string name="Ruddiness"> + Röte + </string> + <string name="Ruddy"> + Rötlich + </string> + <string name="Rumpled Hair"> + Zerzauste Haare + </string> + <string name="Saddle Bags"> + Hüftspeck + </string> + <string name="Saddlebags"> + Hüftspeck + </string> + <string name="Scrawny"> + Dürr + </string> + <string name="Scrawny Leg"> + Dürres Bein + </string> + <string name="Separate"> + Auseinander + </string> + <string name="Shading"> + Schattierung + </string> + <string name="Shadow hair"> + Schattenhaar + </string> + <string name="Shallow"> + Flach + </string> + <string name="Shear Back"> + Hinterkopf rasiert + </string> + <string name="Shear Face"> + Gesicht verzerren + </string> + <string name="Shear Front"> + Vorne rasiert + </string> + <string name="Shear Left"> + Links + </string> + <string name="Shear Left Up"> + Links + </string> + <string name="Shear Right"> + Rechts + </string> + <string name="Shear Right Up"> + Rechts + </string> + <string name="Sheared Back"> + Hinterkopf rasiert + </string> + <string name="Sheared Front"> + Vorne rasiert + </string> + <string name="Shift Left"> + Nach links + </string> + <string name="Shift Mouth"> + Mund verschieben + </string> + <string name="Shift Right"> + Nach rechts + </string> + <string name="Shirt Bottom"> + Hemdlänge + </string> + <string name="Shirt Fit"> + Passform + </string> + <string name="Shirt Wrinkles"> + Falten + </string> + <string name="Shoe Height"> + Höhe + </string> + <string name="Short"> + Kurz + </string> + <string name="Short Arms"> + Kurze Arme + </string> + <string name="Short Legs"> + Kurze Beine + </string> + <string name="Short Neck"> + Kurzer Hals + </string> + <string name="Short Pigtails"> + Kurze Zöpfe + </string> + <string name="Short Ponytail"> + Kurzer Pferdeschwanz + </string> + <string name="Short Sideburns"> + Kurze Koteletten + </string> + <string name="Short Torso"> + Kurzer Oberkörper + </string> + <string name="Short hips"> + Kurze Hüften + </string> + <string name="Shoulders"> + Schultern + </string> + <string name="Side Bangs"> + Seitlicher Pony + </string> + <string name="Side Bangs Down"> + Lang + </string> + <string name="Side Bangs Up"> + Kurz + </string> + <string name="Side Fringe"> + Seitliche Fransen + </string> + <string name="Sideburns"> + Koteletten + </string> + <string name="Sides Hair"> + Seitliches Haar + </string> + <string name="Sides Hair Down"> + Lang + </string> + <string name="Sides Hair Up"> + Kurz + </string> + <string name="Skinny"> + Dünn + </string> + <string name="Skinny Neck"> + Dünner Hals + </string> + <string name="Skirt Fit"> + Passform + </string> + <string name="Skirt Length"> + Rocklänge + </string> + <string name="Slanted Forehead"> + Fliehende Stirn + </string> + <string name="Sleeve Length"> + Ärmellänge + </string> + <string name="Sleeve Looseness"> + Passform Ärmel + </string> + <string name="Slit Back"> + Schlitz: Hinten + </string> + <string name="Slit Front"> + Schlitz: Vorne + </string> + <string name="Slit Left"> + Schlitz: Links + </string> + <string name="Slit Right"> + Schlitz: Rechts + </string> + <string name="Small"> + Klein + </string> + <string name="Small Hands"> + Kleine Hände + </string> + <string name="Small Head"> + Kleiner Kopf + </string> + <string name="Smooth"> + Glätten + </string> + <string name="Smooth Hair"> + Glattes Haar + </string> + <string name="Socks Length"> + Strumpflänge + </string> + <string name="Some"> + Etwas + </string> + <string name="Soulpatch"> + Unterlippenbart + </string> + <string name="Sparse"> + Wenig + </string> + <string name="Spiked Hair"> + Stachelhaare + </string> + <string name="Square"> + Rechteck + </string> + <string name="Square Toe"> + Eckig + </string> + <string name="Squash Head"> + Gestaucht + </string> + <string name="Squash/Stretch Head"> + Gestretcht/Gestaucht + </string> + <string name="Stretch Head"> + Gestreckt + </string> + <string name="Sunken"> + Eingefallen + </string> + <string name="Sunken Chest"> + Trichterbrust + </string> + <string name="Sunken Eyes"> + Eingesunkene Augen + </string> + <string name="Sweep Back"> + Nach hinten + </string> + <string name="Sweep Forward"> + Nach vorne + </string> + <string name="Swept Back"> + Nach hinten + </string> + <string name="Swept Back Hair"> + Haar nach hinten + </string> + <string name="Swept Forward"> + Haare nach vorne + </string> + <string name="Swept Forward Hair"> + Haare nach vorne + </string> + <string name="Tall"> + Groß + </string> + <string name="Taper Back"> + Ansatzbreite hinten + </string> + <string name="Taper Front"> + Ansatzbreite vorne + </string> + <string name="Thick Heels"> + Dicke Absätze + </string> + <string name="Thick Neck"> + Dicker Hals + </string> + <string name="Thick Toe"> + Dick + </string> + <string name="Thickness"> + Dicke + </string> + <string name="Thin"> + Dünn + </string> + <string name="Thin Eyebrows"> + Dünne Augenbrauen + </string> + <string name="Thin Lips"> + Dünne Lippen + </string> + <string name="Thin Nose"> + Dünne Nase + </string> + <string name="Tight Chin"> + Straffes Kinn + </string> + <string name="Tight Cuffs"> + Eng + </string> + <string name="Tight Pants"> + Enge Hosen + </string> + <string name="Tight Shirt"> + Enges Hemd + </string> + <string name="Tight Skirt"> + Enger Rock + </string> + <string name="Tight Sleeves"> + Enge Ärmel + </string> + <string name="Tilt Left"> + Nach links + </string> + <string name="Tilt Right"> + Nach rechts + </string> + <string name="Toe Shape"> + Spitze + </string> + <string name="Toe Thickness"> + Dicke + </string> + <string name="Torso Length"> + Länge des Oberkörpers + </string> + <string name="Torso Muscles"> + Muskeln + </string> + <string name="Torso Scrawny"> + Dürr + </string> + <string name="Unattached"> + Frei + </string> + <string name="Uncreased"> + Straffes Lid + </string> + <string name="Underbite"> + Unterbiss + </string> + <string name="Unnatural"> + Unnatürlich + </string> + <string name="Upper Bridge"> + Brücke, oberer Teil + </string> + <string name="Upper Cheeks"> + Obere Wangen + </string> + <string name="Upper Chin Cleft"> + Obere Kinnspalte + </string> + <string name="Upper Eyelid Fold"> + Obere Lidfalte + </string> + <string name="Upturned"> + Stupsnase + </string> + <string name="Very Red"> + Sehr rot + </string> + <string name="Waist Height"> + Bund + </string> + <string name="Well-Fed"> + Gut genährt + </string> + <string name="White Hair"> + Weiße Haare + </string> + <string name="Wide"> + Breit + </string> + <string name="Wide Back"> + Breit + </string> + <string name="Wide Front"> + Breit + </string> + <string name="Wide Lips"> + Breit + </string> + <string name="Wild"> + Wild + </string> + <string name="Wrinkles"> + Falten + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + Zu meinen Landmarken hinzufügen + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + Meine Landmarken bearbeiten + </string> + <string name="UpdaterWindowTitle"> + [APP_NAME] Aktualisierung + </string> + <string name="UpdaterNowUpdating"> + [APP_NAME] wird aktualisiert... + </string> + <string name="UpdaterNowInstalling"> + [APP_NAME] wird installiert... + </string> + <string name="UpdaterUpdatingDescriptive"> + Ihr [APP_NAME]-Viewer wird aktualisiert. Dies kann einen Moment dauern. Wir bitten um Ihr Verständnis. + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + Aktualisierung wird heruntergeladen... + </string> + <string name="UpdaterProgressBarText"> + Aktualisierung wird heruntergeladen + </string> + <string name="UpdaterFailDownloadTitle"> + Herunterladen ist fehlgeschlagen + </string> + <string name="UpdaterFailUpdateDescriptive"> + Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte laden Sie die aktuellste Version von www.secondlife.com herunter. + </string> + <string name="UpdaterFailInstallTitle"> + Aktualisierung konnte nicht installiert werden + </string> + <string name="UpdaterFailStartTitle"> + Viewer konnte nicht gestartet werden + </string> + <string name="only_user_message"> + Sie sind der einzige Benutzer in dieser Sitzung. + </string> + <string name="offline_message"> + [FIRST] [LAST] ist offline. + </string> + <string name="invite_message"> + Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen. + </string> + <string name="generic_request_error"> + Fehler bei Anfrage, bitte versuchen Sie es später. + </string> + <string name="insufficient_perms_error"> + Sie sind dazu nicht berechtigt. + </string> + <string name="session_does_not_exist_error"> + Die Sitzung ist abgelaufen + </string> + <string name="no_ability_error"> + Sie besitzen diese Fähigkeit nicht. + </string> + <string name="no_ability"> + Sie besitzen diese Fähigkeit nicht. + </string> + <string name="not_a_mod_error"> + Sie sind kein Sitzungsmoderator. + </string> + <string name="muted_error"> + Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert. + </string> + <string name="add_session_event"> + Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden. + </string> + <string name="message_session_event"> + Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden. + </string> + <string name="removed_from_group"> + Sie wurden von der Gruppe ausgeschlossen. + </string> + <string name="close_on_no_ability"> + Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen. + </string> +</strings> diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml index 31f92dc920b..231798c6a6f 100644 --- a/indra/newview/skins/default/xui/de/teleport_strings.xml +++ b/indra/newview/skins/default/xui/de/teleport_strings.xml @@ -1,78 +1,78 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<teleport_messages name=""> - <message_set name="errors"> - <message name="invalid_tport"> - Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. Wenn Sie diese Nachricht weiterhin erhalten, konsultieren Sie bitte die Tech-Support-FAQ unter: -www.secondlife.com/support - </message> - <message name="invalid_region_handoff"> - Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen sich zum Wechsel der Region eventuell neu anmelden. Wenn Sie diese Nachricht weiterhin erhalten, konsultieren Sie bitte die Tech-Support-FAQ unter: -www.secondlife.com/support - </message> - <message name="blocked_tport"> - Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal. -Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an. - </message> - <message name="nolandmark_tport"> - Das System konnte das Landmarken-Ziel nicht finden. - </message> - <message name="timeout_tport"> - Das System konnte keine Teleport-Verbindung herstellen. -Versuchen Sie es später noch einmal. - </message> - <message name="noaccess_tport"> - Sie haben leider keinen Zugang zu diesem Teleport-Ziel. - </message> - <message name="missing_attach_tport"> - Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen. - </message> - <message name="too_many_uploads_tport"> - Die Asset-Warteschlange in dieser Region ist zurzeit überlastet. -Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region. - </message> - <message name="expired_tport"> - Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. - </message> - <message name="expired_region_handoff"> - Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. - </message> - <message name="no_host"> - Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut. - </message> - <message name="no_inventory_host"> - Das Inventarsystem ist zurzeit nicht verfügbar. - </message> - </message_set> - <message_set name="progress"> - <message name="sending_dest"> - Transport zum Ziel. - </message> - <message name="redirecting"> - Weiterleitung an anderes Ziel. - </message> - <message name="relaying"> - Weiterleitung zum Ziel. - </message> - <message name="sending_home"> - Zuhause-Position wird ermittelt. - </message> - <message name="sending_landmark"> - Landmarken-Position wird ermittelt. - </message> - <message name="completing"> - Teleport wird abgeschlossen. - </message> - <message name="resolving"> - Ziel wird ermittelt. - </message> - <message name="contacting"> - Verbindung zu neuer Region. - </message> - <message name="arriving"> - Ziel erreicht... - </message> - <message name="requesting"> - Teleport wird initialisiert... - </message> - </message_set> -</teleport_messages> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<teleport_messages name=""> + <message_set name="errors"> + <message name="invalid_tport"> + Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </message> + <message name="invalid_region_handoff"> + Bei der Bearbeitung Ihres Regionswechsels ist ein Problem aufgetreten. Sie müssen eventuell neu anmelden, um die Region wechseln zu können. +Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE]. + </message> + <message name="blocked_tport"> + Teleportieren ist zurzeit leider nicht möglich. Versuchen Sie es später noch einmal. +Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab und wieder an. + </message> + <message name="nolandmark_tport"> + Das System konnte das Landmarken-Ziel nicht finden. + </message> + <message name="timeout_tport"> + Das System konnte keine Teleport-Verbindung herstellen. +Versuchen Sie es später noch einmal. + </message> + <message name="noaccess_tport"> + Sie haben leider keinen Zugang zu diesem Teleport-Ziel. + </message> + <message name="missing_attach_tport"> + Ihre Anhänge sind noch nicht eingetroffen. Warten Sie kurz oder melden Sie sich ab und wieder an, bevor Sie einen neuen Teleport-Versuch unternehmen. + </message> + <message name="too_many_uploads_tport"> + Die Asset-Warteschlange in dieser Region ist zurzeit überlastet. +Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in einigen Minuten erneut oder besuchen Sie eine weniger überfüllte Region. + </message> + <message name="expired_tport"> + Das System konnte Ihre Teleport-Anfrage nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. + </message> + <message name="expired_region_handoff"> + Das System konnte Ihre Anfrage zum Regionswechsel nicht rechtzeitig bearbeiten. Versuchen Sie es in einigen Minuten erneut. + </message> + <message name="no_host"> + Teleport-Ziel wurde nicht gefunden. Das Ziel ist entweder im Moment nicht verfügbar oder existiert nicht mehr. Versuchen Sie es in einigen Minuten erneut. + </message> + <message name="no_inventory_host"> + Das Inventarsystem ist zurzeit nicht verfügbar. + </message> + </message_set> + <message_set name="progress"> + <message name="sending_dest"> + Transport zum Ziel. + </message> + <message name="redirecting"> + Weiterleitung an anderes Ziel. + </message> + <message name="relaying"> + Weiterleitung zum Ziel. + </message> + <message name="sending_home"> + Zuhause-Position wird ermittelt. + </message> + <message name="sending_landmark"> + Landmarken-Position wird ermittelt. + </message> + <message name="completing"> + Teleport wird abgeschlossen. + </message> + <message name="resolving"> + Ziel wird ermittelt. + </message> + <message name="contacting"> + Verbindung zu neuer Region. + </message> + <message name="arriving"> + Ziel erreicht... + </message> + <message name="requesting"> + Teleport wird initialisiert... + </message> + </message_set> +</teleport_messages> diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml index 53e48352f10..8cd1ec4e09a 100644 --- a/indra/newview/skins/default/xui/fr/floater_about.xml +++ b/indra/newview/skins/default/xui/fr/floater_about.xml @@ -1,43 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="A PROPOS DE [APP_NAME]"> -<tab_container name="about_tab"> - <panel name="credits_panel"> - <text_editor name="credits_editor"> - Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl et de nombreuses autres personnes. - - Tous nos remerciements aux résidents suivants pour avoir testé cette version (la meilleure qui soit jusqu'à présent) : able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar - - - - Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant - </text_editor> - </panel> - <panel name="licenses_panel"> - <text_editor name="credits_editor"> - 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion - APR Copyright (C) 2000-2004 The Apache Software Foundation - cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) - expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. - FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). - GL Copyright (C) 1999-2004 Brian Paul. - Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. - jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) - jpeglib Copyright (C) 1991-1998, Thomas G. Lane. - ogg/vorbis Copyright (C) 2001, Xiphophorus - OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. - SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga - SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - xmlrpc-epi Copyright (C) 2000 Epinions, Inc. - zlib Copyright (C) 1995-2002 Jean-loup Gailly et Mark Adler. - google-perftools Copyright (c) 2005, Google Inc. - - Tous droits réservés. Voir licenses.txt pour plus de détails. - - Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) - </text_editor> - </panel> -</tab_container> - <string name="you_are_at"> - Votre position : [POSITION] - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="A PROPOS DE [APP_NAME]"> + <tab_container name="about_tab"> + <panel label="Remerciements" name="credits_panel"> + <text_editor name="credits_editor"> + Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl et de nombreuses autres personnes. + + Tous nos remerciements aux résidents suivants pour avoir testé cette version (la meilleure qui soit jusqu'à présent) : able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar + + + + Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant + </text_editor> + </panel> + <panel label="Licences" name="licenses_panel"> + <text_editor name="credits_editor"> + 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion + APR Copyright (C) 2000-2004 The Apache Software Foundation + cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) + expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. + FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). + GL Copyright (C) 1999-2004 Brian Paul. + Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. + jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) + jpeglib Copyright (C) 1991-1998, Thomas G. Lane. + ogg/vorbis Copyright (C) 2001, Xiphophorus + OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. + SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga + SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + xmlrpc-epi Copyright (C) 2000 Epinions, Inc. + zlib Copyright (C) 1995-2002 Jean-loup Gailly et Mark Adler. + google-perftools Copyright (c) 2005, Google Inc. + + Tous droits réservés. Voir licenses.txt pour plus de détails. + + Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) + </text_editor> + </panel> + </tab_container> +</floater> 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 0729c79cbb8..d1aea074e6a 100644 --- a/indra/newview/skins/default/xui/fr/floater_about_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml @@ -1,501 +1,480 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="À PROPOS DU TERRAIN"> - <tab_container name="landtab"> - <panel label="Général" name="land_general_panel"> - <text name="Name:"> - Nom : - </text> - <line_editor name="Name"/> - <text name="Description:"> - Description : - </text> - <text_editor name="Description"/> - <text name="LandType"> - Type : - </text> - <text name="LandTypeText"> - Continent / Homestead - </text> - <text name="ContentRating"> - Catégorie : - </text> - <text name="ContentRatingText"> - Adult - </text> - <text name="Owner:"> - Propriétaire : - </text> - <text name="OwnerText"> - Leyla Linden - </text> - <button label="Profil..." label_selected="Profil..." name="Profile..."/> - <text name="Group:"> - Groupe : - </text> - <text name="GroupText"/> - <button label="Définir..." label_selected="Définir..." name="Set..."/> - <check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier peut céder ce terrain au groupe. Il viendra alors s'ajouter au patrimoine du groupe."/> - <button label="Céder..." label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d'officier dans le groupe sélectionné."/> - <check_box label="Le propriétaire contribue en cédant du terrain" name="check contrib" tool_tip="Lorsqu'un terrain est cédé au groupe, l'ancien propriétaire fait également un don de terrain suffisant."/> - <text name="For Sale:"> - À vendre : - </text> - <text name="Not for sale."> - Pas à vendre - </text> - <text name="For Sale: Price L$[PRICE]."> - Prix : [PRICE] L$ ([PRICE_PER_SQM] L$/m²). - </text> - <text name="SalePending"/> - <button label="Vendre le terrain..." label_selected="Vendre le terrain..." name="Sell Land..."/> - <text name="For sale to"> - À vendre à : [BUYER] - </text> - <text name="Sell with landowners objects in parcel."> - Objets inclus dans la vente. - </text> - <text name="Selling with no objects in parcel."> - Objets non inclus dans la vente. - </text> - <button label="Annuler la vente du terrain" label_selected="Annuler la vente du terrain" left="275" name="Cancel Land Sale" width="165"/> - <text name="Claimed:"> - Acquis : - </text> - <text name="DateClaimText"> - Tue Aug 15 13:47:25 2006 - </text> - <text name="PriceLabel"> - Superficie : - </text> - <text name="PriceText"> - 4048 m² - </text> - <text name="Traffic:"> - Trafic : - </text> - <text name="DwellText"> - 0 - </text> - <button label="Acheter le terrain..." label_selected="Acheter le terrain..." left="130" name="Buy Land..." width="125"/> - <button label="Acheter pour le groupe..." label_selected="Acheter pour le groupe..." name="Buy For Group..."/> - <button label="Acheter un pass..." label_selected="Acheter un pass..." left="130" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/> - <button label="Abandonner le terrain..." label_selected="Abandonner le terrain..." name="Abandon Land..."/> - <button label="Redemander le terrain..." label_selected="Redemander le terrain…" name="Reclaim Land..."/> - <button label="Vente Linden..." label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d'un résident, avoir un contenu défini et ne pas être aux enchères."/> - <panel.string name="new users only"> - Nouveaux utilisateurs uniquement - </panel.string> - <panel.string name="anyone"> - Tout le monde - </panel.string> - <panel.string name="area_text"> - Surface - </panel.string> - <panel.string name="area_size_text"> - [AREA] m² - </panel.string> - <panel.string name="auction_id_text"> - Code de l'enchère : [ID] - </panel.string> - <panel.string name="need_tier_to_modify"> - Pour modifier ce terrain, vous devez approuver votre achat. - </panel.string> - <panel.string name="group_owned_text"> - (propriété du groupe) - </panel.string> - <panel.string name="profile_text"> - Profil... - </panel.string> - <panel.string name="info_text"> - Infos... - </panel.string> - <panel.string name="public_text"> - (public) - </panel.string> - <panel.string name="none_text"> - (aucun) - </panel.string> - <panel.string name="sale_pending_text"> - (vente en cours) - </panel.string> - <panel.string name="no_selection_text"> - Aucune parcelle sélectionnée. -Allez dans le menu Monde > À propos du terrain ou sélectionnez une autre parcelle pour en afficher les détails. - </panel.string> - </panel> - <panel label="Règlement" name="land_covenant_panel"> - <text name="estate_section_lbl"> - Domaine : - </text> - <text name="estate_name_lbl"> - Nom : - </text> - <text name="estate_name_text"> - continent - </text> - <text name="estate_owner_lbl"> - Propriétaire : - </text> - <text name="estate_owner_text"> - (aucun) - </text> - <text_editor name="covenant_editor"> - Il n'y a aucun règlement pour ce domaine. - </text_editor> - <text name="covenant_timestamp_text"> - Last Modified Wed Dec 31 16:00:00 1969 - </text> - <text name="region_section_lbl"> - Région : - </text> - <text name="region_name_lbl"> - Nom : - </text> - <text name="region_name_text"> - leyla - </text> - <text name="region_landtype_lbl"> - Type : - </text> - <text name="region_landtype_text"> - Continent / Homestead - </text> - <text name="region_maturity_lbl"> - Catégorie : - </text> - <text name="region_maturity_text"> - Adult - </text> - <text name="resellable_lbl"> - Revendre : - </text> - <text name="resellable_clause"> - Le terrain dans cette région ne peut être revendu. - </text> - <text name="changeable_lbl"> - Sous-diviser : - </text> - <text name="changeable_clause"> - Le terrain dans cette région ne peut être fusionné/divisé. - </text> - <panel.string name="can_resell"> - Le terrain acheté dans cette région peut être revendu. - </panel.string> - <panel.string name="can_not_resell"> - Le terrain acheté dans cette région ne peut pas être revendu. - </panel.string> - <panel.string name="can_change"> - Le terrain acheté dans cette région peut être fusionné -ou divisé. - </panel.string> - <panel.string name="can_not_change"> - Le terrain acheté dans cette région ne peut pas être fusionné -ou divisé. - </panel.string> - </panel> - <panel label="Objets" name="land_objects_panel"> - <text name="parcel_object_bonus"> - Facteur Bonus Objets : [BONUS] - </text> - <text name="Simulator primitive usage:"> - Prims utilisées sur la parcelle : - </text> - <text left="214" name="objects_available" width="230"> - [COUNT] sur [MAX] ([AVAILABLE] disponibles) - </text> - <panel.string name="objects_available_text"> - [COUNT] sur [MAX] ([AVAILABLE] disponibles) - </panel.string> - <panel.string name="objects_deleted_text"> - [COUNT] sur [MAX] ([DELETED] seront supprimés) - </panel.string> - <text name="Primitives parcel supports:" width="200"> - Prims max. sur la parcelle : - </text> - <text left="214" name="object_contrib_text" width="152"> - [COUNT] - </text> - <text name="Primitives on parcel:"> - Prims sur la parcelle : - </text> - <text left="214" name="total_objects_text" width="48"> - [COUNT] - </text> - <text left="14" name="Owned by parcel owner:" width="180"> - Appartenant au propriétaire : - </text> - <text left="214" name="owner_objects_text" width="48"> - [COUNT] - </text> - <button label="Afficher" label_selected="Afficher" name="ShowOwner" right="-135" width="60"/> - <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOwner..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> - <text left="14" name="Set to group:" width="180"> - Données au groupe : - </text> - <text left="214" name="group_objects_text" width="48"> - [COUNT] - </text> - <button label="Afficher" label_selected="Afficher" name="ShowGroup" right="-135" width="60"/> - <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnGroup..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> - <text left="14" name="Owned by others:" width="128"> - Appartenant à d'autres : - </text> - <text left="214" name="other_objects_text" width="48"> - [COUNT] - </text> - <button label="Afficher" label_selected="Afficher" name="ShowOther" right="-135" width="60"/> - <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOther..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> - <text left="14" name="Selected / sat upon:" width="193"> - Sélectionnées/où quelqu'un est assis : - </text> - <text left="214" name="selected_objects_text" width="48"> - [COUNT] - </text> - <text left="4" name="Autoreturn" width="412"> - Renvoi automatique des objets des autres résidents (min., 0 pour désactiver) : - </text> - <line_editor name="clean other time" right="-6" width="36"/> - <text name="Object Owners:"> - Propriétaires : - </text> - <button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh List"/> - <button label="Renvoyer les objets..." label_selected="Renvoyer les objets..." name="Return objects..."/> - <name_list label="Plus récents" name="owner list"> - <column label="Type" name="type"/> - <column name="online_status"/> - <column label="Nom" name="name"/> - <column label="Nombre" name="count"/> - <column label="Plus récents" name="mostrecent"/> - </name_list> - </panel> - <panel label="Options" name="land_options_panel"> - <text name="allow_label"> - Autoriser les autres résidents à  : - </text> - <check_box label="Modifier le terrain" name="edit land check" tool_tip="Si cette option est cochée, n'importe qui peut terraformer votre terrain. Il vaut mieux ne pas cocher cette option pour toujours pouvoir modifer votre propre terrain."/> - <check_box label="Créer des repères" name="check landmark"/> - <check_box label="Voler" name="check fly" tool_tip="Si cette option est cochée, les résidents peuvent voler sur votre terrain. Si elle n'est pas cochée, ils ne pourront voler que lorsqu'ils arrivent et passent au dessus de votre terrain."/> - <text left="152" name="allow_label2"> - Créer des objets : - </text> - <check_box label="Tous les résidents" left="285" name="edit objects check"/> - <check_box label="Groupe" left="395" name="edit group objects check"/> - <text left="152" name="allow_label3" width="134"> - Laisser entrer des objets : - </text> - <check_box label="Tous les résidents" left="285" name="all object entry check"/> - <check_box label="Groupe" left="395" name="group object entry check"/> - <text left="152" name="allow_label4"> - Exécuter des scripts : - </text> - <check_box label="Tous les résidents" left="285" name="check other scripts"/> - <check_box label="Groupe" left="395" name="check group scripts"/> - <text name="land_options_label"> - Options du terrain : - </text> - <check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n'y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/> - <check_box bottom="-140" label="Pas de bousculades" left="14" name="PushRestrictCheck" tool_tip="Empêche l'utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/> - <check_box bottom="-160" label="Afficher dans la recherche (30 L$/semaine) sous" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/> - <panel.string name="search_enabled_tooltip"> - Permettre aux autres résidents de voir cette parcelle dans les résultats de recherche - </panel.string> - <panel.string name="search_disabled_small_tooltip"> - Cette option est désactivée car la superficie de cette parcelle est inférieure ou égale à 128 m². -Seules les parcelles de grande taille peuvent apparaître dans la recherche. - </panel.string> - <panel.string name="search_disabled_permissions_tooltip"> - Cette option est désactivée car vous ne pouvez pas modifier les options de cette parcelle. - </panel.string> - <combo_box bottom="-160" left="286" name="land category with adult" width="146"> - <combo_box.item name="item0" label="Toutes catégories" - /> - <combo_box.item name="item1" label="Appartenant aux Lindens" - /> - <combo_box.item name="item2" label="Adult" - /> - <combo_box.item name="item3" label="Art et Culture" - /> - <combo_box.item name="item4" label="Affaires" - /> - <combo_box.item name="item5" label="Éducation" - /> - <combo_box.item name="item6" label="Jeux" - /> - <combo_box.item name="item7" label="Favoris" - /> - <combo_box.item name="item8" label="Accueil pour les nouveaux" - /> - <combo_box.item name="item9" label="Parcs et Nature" - /> - <combo_box.item name="item10" label="Résidentiel" - /> - <combo_box.item name="item11" label="Shopping" - /> - <combo_box.item name="item12" label="Autre" - /> - </combo_box> - <combo_box bottom="-160" left="286" name="land category" width="146"> - <combo_box.item name="item0" label="Toutes catégories" - /> - <combo_box.item name="item1" label="Appartenant aux Lindens" - /> - <combo_box.item name="item3" label="Art et Culture" - /> - <combo_box.item name="item4" label="Affaires" - /> - <combo_box.item name="item5" label="Éducation" - /> - <combo_box.item name="item6" label="Jeux" - /> - <combo_box.item name="item7" label="Favoris" - /> - <combo_box.item name="item8" label="Accueil pour les nouveaux" - /> - <combo_box.item name="item9" label="Parcs et Nature" - /> - <combo_box.item name="item10" label="Résidentiel" - /> - <combo_box.item name="item11" label="Shopping" - /> - <combo_box.item name="item12" label="Autre" - /> - </combo_box> - <button bottom="-160" label="?" label_selected="?" left="436" name="?"/> - <check_box bottom="-180" label="Contenu Mature" name="MatureCheck" tool_tip=""/> - <panel.string name="mature_check_mature"> - Contenu Mature - </panel.string> - <panel.string name="mature_check_adult"> - Contenu Adult - </panel.string> - <panel.string name="mature_check_mature_tooltip"> - Les informations ou contenu de votre parcelle sont classés Mature. - </panel.string> - <panel.string name="mature_check_adult_tooltip"> - Les informations ou contenu de votre parcelle sont classés Adult. - </panel.string> - <text bottom="-200" name="Snapshot:"> - Photo : - </text> - <texture_picker bottom="-319" label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/> - <text bottom="-323" name="landing_point"> - Lieu d'arrivée : [LANDING] - </text> - <panel.string name="landing_point_none"> - (aucun) - </panel.string> - <button bottom="-323" label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le point d'arrivée des visiteurs. Définit l'emplacement de votre avatar sur ce terrain."/> - <button bottom="-323" label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Libérer le lieu d'arrivée."/> - <text bottom="-343" name="Teleport Routing: "> - Règles de téléportation : - </text> - <combo_box bottom="-343" left="140" name="landing type" tool_tip="Vous permet de paramétrer les téléportations sur votre terrain." width="140"> - <combo_box.item name="Blocked" label="Bloqué" - /> - <combo_box.item name="LandingPoint" label="Lieu d'arrivée fixe" - /> - <combo_box.item name="Anywhere" label="Lieu d'arrivée libre" - /> - </combo_box> - <panel.string name="push_restrict_text"> - Pas de bousculades - </panel.string> - <panel.string name="push_restrict_region_text"> - Pas de bousculades (les règles de la région priment) - </panel.string> - </panel> - <panel label="Médias" name="land_media_panel"> - <text name="with media:" width="85"> - Type de média : - </text> - <combo_box left="97" name="media type" tool_tip="Indiquez s'il s'agit de l'URL d'un film, d'une page web ou autre"/> - <text name="mime_type"/> - <text name="at URL:" width="85"> - URL du média : - </text> - <line_editor left="97" name="media_url"/> - <button label="Définir..." label_selected="Définir..." name="set_media_url"/> - <text name="Description:"> - Description : - </text> - <line_editor left="97" name="url_description" tool_tip="Texte affiché à côté du bouton Jouer/Charger"/> - <text name="Media texture:"> - Remplacer -la texture : - </text> - <texture_picker label="" left="97" name="media texture" tool_tip="Cliquez pour sélectionner une image"/> - <text name="replace_texture_help"> - (Les objets avec cette texture affichent le film ou -la page web quand vous cliquez sur la flèche Jouer.) - </text> - <text name="Options:"> - Options -média : - </text> - <check_box label="Échelle automatique" left="97" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l'échelle. La qualité visuelle sera peut-être amoindrie mais vous n'aurez à faire aucune autre mise à l'échelle ou alignement."/> - <check_box label="Média en boucle" name="media_loop" tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera."/> - <check_box label="Masquer l'URL du média" left="97" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l'URL du média. Cette option n'est pas disponible pour les fichiers HTML."/> - <check_box label="Masquer l'URL de la musique" name="hide_music_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l'URL de la musique."/> - <text left="102" name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." width="105"> - Taille du média : - </text> - <spinner left_delta="89" name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/> - <spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/> - <text name="pixels"> - pixels - </text> - <text bottom_delta="-28" name="MusicURL:"> - URL de la -musique : - </text> - <line_editor bottom_delta="-12" left="97" name="music_url"/> - <text name="Sound:"> - Son : - </text> - <check_box label="Limiter les gestes et sons d'objet à cette parcelle" left="97" name="check sound local"/> - <button label="?" label_selected="?" left="378" name="?"/> - <text name="Voice settings:"> - Voix : - </text> - <check_box label="Activer le chat vocal" left="97" name="parcel_enable_voice_channel"/> - <check_box label="Activer le chat vocal (contrôlé par le domaine)" left="97" name="parcel_enable_voice_channel_is_estate_disabled"/> - <check_box label="Limiter le chat vocal à cette parcelle" left="117" name="parcel_enable_voice_channel_parcel"/> - </panel> - <panel label="Accès" name="land_access_panel"> - <text name="Limit access to this parcel to:"> - Accès à cette parcelle - </text> - <check_box label="Autoriser l'accès public" name="public_access"/> - <text name="Only Allow"> - Bloquer l'accès aux résidents : - </text> - <check_box label="Qui n'ont pas fourni leurs informations de paiement à Linden Lab" name="limit_payment" tool_tip="Aux résidents non identifés"/> - <check_box label="Dont l'âge n'a pas été vérifié" name="limit_age_verified" tool_tip="Aux résidents dont l'âge n'a pas été vérifié. Pour plus d'infos, consultez la page support.secondlife.com."/> - <panel.string name="estate_override"> - Au moins une de ces options est définie au niveau du domaine. - </panel.string> - <check_box label="Autoriser l'accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définir le groupe à l'onglet Général."/> - <check_box label="Vendre des pass à  :" name="PassCheck" tool_tip="Autoriser un accès temporaire à cette parcelle"/> - <combo_box name="pass_combo"> - <combo_box.item name="Anyone" label="Tout le monde" - /> - <combo_box.item name="Group" label="Groupe" - /> - </combo_box> - <spinner label="Prix en L$ :" name="PriceSpin"/> - <spinner label="Durée en heures :" name="HoursSpin"/> - <text label="Toujours autoriser" name="AllowedText"> - Résidents autorisés - </text> - <name_list name="AccessList" tool_tip="([LISTED] listés, [MAX] max)"/> - <button label="Ajouter..." label_selected="Ajouter..." name="add_allowed"/> - <button label="Supprimer" label_selected="Supprimer" name="remove_allowed"/> - <text label="Bannir" name="BanCheck"> - Résidents bannis - </text> - <name_list name="BannedList" tool_tip="([LISTED] listés, [MAX] max)"/> - <button label="Ajouter..." label_selected="Ajouter..." name="add_banned"/> - <button label="Supprimer" label_selected="Supprimer" name="remove_banned"/> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floaterland" title="À PROPOS DU TERRAIN"> + <floater.string name="Minutes"> + [MINUTES] minutes + </floater.string> + <floater.string name="Minute"> + minute + </floater.string> + <floater.string name="Seconds"> + [SECONDS] secondes + </floater.string> + <tab_container name="landtab"> + <panel label="Général" name="land_general_panel"> + <panel.string name="new users only"> + Nouveaux utilisateurs uniquement + </panel.string> + <panel.string name="anyone"> + Tout le monde + </panel.string> + <panel.string name="area_text"> + Surface + </panel.string> + <panel.string name="area_size_text"> + [AREA] m² + </panel.string> + <panel.string name="auction_id_text"> + Code de l'enchère : [ID] + </panel.string> + <panel.string name="need_tier_to_modify"> + Pour modifier ce terrain, vous devez approuver votre achat. + </panel.string> + <panel.string name="group_owned_text"> + (propriété du groupe) + </panel.string> + <panel.string name="profile_text"> + Profil... + </panel.string> + <panel.string name="info_text"> + Infos... + </panel.string> + <panel.string name="public_text"> + (public) + </panel.string> + <panel.string name="none_text"> + (aucun) + </panel.string> + <panel.string name="sale_pending_text"> + (vente en cours) + </panel.string> + <panel.string name="no_selection_text"> + Aucune parcelle sélectionnée. +Allez dans le menu Monde > À propos du terrain ou sélectionnez une autre parcelle pour en afficher les détails. + </panel.string> + <text name="Name:"> + Nom : + </text> + <line_editor name="Name"/> + <text name="Description:"> + Description : + </text> + <text_editor name="Description"/> + <text name="LandType"> + Type : + </text> + <text name="LandTypeText"> + Continent / Homestead + </text> + <text name="ContentRating"> + Catégorie : + </text> + <text name="ContentRatingText"> + Adult + </text> + <text name="Owner:"> + Propriétaire : + </text> + <text name="OwnerText"> + Leyla Linden + </text> + <button label="Profil..." label_selected="Profil..." name="Profile..."/> + <text name="Group:"> + Groupe : + </text> + <text name="GroupText"/> + <button label="Définir..." label_selected="Définir..." name="Set..."/> + <check_box label="Autoriser la cession au groupe" name="check deed" tool_tip="Un officier peut céder ce terrain au groupe. Il viendra alors s'ajouter au patrimoine du groupe."/> + <button label="Céder..." label_selected="Céder..." name="Deed..." tool_tip="Vous ne pouvez céder le terrain que si vous avez un rôle d'officier dans le groupe sélectionné."/> + <check_box label="Le propriétaire contribue en cédant du terrain" name="check contrib" tool_tip="Lorsqu'un terrain est cédé au groupe, l'ancien propriétaire fait également un don de terrain suffisant."/> + <text name="For Sale:"> + À vendre : + </text> + <text name="Not for sale."> + Pas à vendre + </text> + <text name="For Sale: Price L$[PRICE]."> + Prix : [PRICE] L$ ([PRICE_PER_SQM] L$/m²). + </text> + <text name="SalePending"/> + <button label="Vendre le terrain..." label_selected="Vendre le terrain..." name="Sell Land..."/> + <text name="For sale to"> + À vendre à : [BUYER] + </text> + <text name="Sell with landowners objects in parcel."> + Objets inclus dans la vente. + </text> + <text name="Selling with no objects in parcel."> + Objets non inclus dans la vente. + </text> + <button label="Annuler la vente du terrain" label_selected="Annuler la vente du terrain" left="275" name="Cancel Land Sale" width="165"/> + <text name="Claimed:"> + Acquis : + </text> + <text name="DateClaimText"> + Tue Aug 15 13:47:25 2006 + </text> + <text name="PriceLabel"> + Superficie : + </text> + <text name="PriceText"> + 4048 m² + </text> + <text name="Traffic:"> + Trafic : + </text> + <text name="DwellText"> + 0 + </text> + <button label="Acheter le terrain..." label_selected="Acheter le terrain..." left="130" name="Buy Land..." width="125"/> + <button label="Acheter pour le groupe..." label_selected="Acheter pour le groupe..." name="Buy For Group..."/> + <button label="Acheter un pass..." label_selected="Acheter un pass..." left="130" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/> + <button label="Abandonner le terrain..." label_selected="Abandonner le terrain..." name="Abandon Land..."/> + <button label="Redemander le terrain..." label_selected="Redemander le terrain…" name="Reclaim Land..."/> + <button label="Vente Linden..." label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d'un résident, avoir un contenu défini et ne pas être aux enchères."/> + </panel> + <panel label="Règlement" name="land_covenant_panel"> + <panel.string name="can_resell"> + Le terrain acheté dans cette région peut être revendu. + </panel.string> + <panel.string name="can_not_resell"> + Le terrain acheté dans cette région ne peut pas être revendu. + </panel.string> + <panel.string name="can_change"> + Le terrain acheté dans cette région peut être fusionné +ou divisé. + </panel.string> + <panel.string name="can_not_change"> + Le terrain acheté dans cette région ne peut pas être fusionné +ou divisé. + </panel.string> + <text name="estate_section_lbl"> + Domaine : + </text> + <text name="estate_name_lbl"> + Nom : + </text> + <text name="estate_name_text"> + continent + </text> + <text name="estate_owner_lbl"> + Propriétaire : + </text> + <text name="estate_owner_text"> + (aucun) + </text> + <text_editor name="covenant_editor"> + Il n'y a aucun règlement pour ce domaine. + </text_editor> + <text name="covenant_timestamp_text"> + Last Modified Wed Dec 31 16:00:00 1969 + </text> + <text name="region_section_lbl"> + Région : + </text> + <text name="region_name_lbl"> + Nom : + </text> + <text name="region_name_text"> + leyla + </text> + <text name="region_landtype_lbl"> + Type : + </text> + <text name="region_landtype_text"> + Continent / Homestead + </text> + <text name="region_maturity_lbl"> + Catégorie : + </text> + <text name="region_maturity_text"> + Adult + </text> + <text name="resellable_lbl"> + Revendre : + </text> + <text name="resellable_clause"> + Le terrain dans cette région ne peut être revendu. + </text> + <text name="changeable_lbl"> + Sous-diviser : + </text> + <text name="changeable_clause"> + Le terrain dans cette région ne peut être fusionné/divisé. + </text> + </panel> + <panel label="Objets" name="land_objects_panel"> + <panel.string name="objects_available_text"> + [COUNT] sur [MAX] ([AVAILABLE] disponibles) + </panel.string> + <panel.string name="objects_deleted_text"> + [COUNT] sur [MAX] ([DELETED] seront supprimés) + </panel.string> + <text name="parcel_object_bonus"> + Facteur Bonus Objets : [BONUS] + </text> + <text name="Simulator primitive usage:"> + Prims utilisées sur la parcelle : + </text> + <text left="214" name="objects_available" width="230"> + [COUNT] sur [MAX] ([AVAILABLE] disponibles) + </text> + <text name="Primitives parcel supports:" width="200"> + Prims max. sur la parcelle : + </text> + <text left="214" name="object_contrib_text" width="152"> + [COUNT] + </text> + <text name="Primitives on parcel:"> + Prims sur la parcelle : + </text> + <text left="214" name="total_objects_text" width="48"> + [COUNT] + </text> + <text left="14" name="Owned by parcel owner:" width="180"> + Appartenant au propriétaire : + </text> + <text left="214" name="owner_objects_text" width="48"> + [COUNT] + </text> + <button label="Afficher" label_selected="Afficher" name="ShowOwner" right="-135" width="60"/> + <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOwner..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> + <text left="14" name="Set to group:" width="180"> + Données au groupe : + </text> + <text left="214" name="group_objects_text" width="48"> + [COUNT] + </text> + <button label="Afficher" label_selected="Afficher" name="ShowGroup" right="-135" width="60"/> + <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnGroup..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> + <text left="14" name="Owned by others:" width="128"> + Appartenant à d'autres : + </text> + <text left="214" name="other_objects_text" width="48"> + [COUNT] + </text> + <button label="Afficher" label_selected="Afficher" name="ShowOther" right="-135" width="60"/> + <button label="Renvoyer..." label_selected="Renvoyer..." name="ReturnOther..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> + <text left="14" name="Selected / sat upon:" width="193"> + Sélectionnées/où quelqu'un est assis : + </text> + <text left="214" name="selected_objects_text" width="48"> + [COUNT] + </text> + <text left="4" name="Autoreturn" width="412"> + Renvoi automatique des objets des autres résidents (min., 0 pour désactiver) : + </text> + <line_editor name="clean other time" right="-6" width="36"/> + <text name="Object Owners:"> + Propriétaires : + </text> + <button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh List"/> + <button label="Renvoyer les objets..." label_selected="Renvoyer les objets..." name="Return objects..."/> + <name_list label="Plus récents" name="owner list"> + <name_list.columns label="Type" name="type"/> + <name_list.columns name="online_status"/> + <name_list.columns label="Nom" name="name"/> + <name_list.columns label="Nombre" name="count"/> + <name_list.columns label="Plus récents" name="mostrecent"/> + </name_list> + </panel> + <panel label="Options" name="land_options_panel"> + <panel.string name="search_enabled_tooltip"> + Permettre aux autres résidents de voir cette parcelle dans les résultats de recherche + </panel.string> + <panel.string name="search_disabled_small_tooltip"> + Cette option est désactivée car la superficie de cette parcelle est inférieure ou égale à 128 m². +Seules les parcelles de grande taille peuvent apparaître dans la recherche. + </panel.string> + <panel.string name="search_disabled_permissions_tooltip"> + Cette option est désactivée car vous ne pouvez pas modifier les options de cette parcelle. + </panel.string> + <panel.string name="mature_check_mature"> + Contenu Mature + </panel.string> + <panel.string name="mature_check_adult"> + Contenu Adult + </panel.string> + <panel.string name="mature_check_mature_tooltip"> + Les informations ou contenu de votre parcelle sont classés Mature. + </panel.string> + <panel.string name="mature_check_adult_tooltip"> + Les informations ou contenu de votre parcelle sont classés Adult. + </panel.string> + <panel.string name="landing_point_none"> + (aucun) + </panel.string> + <panel.string name="push_restrict_text"> + Pas de bousculades + </panel.string> + <panel.string name="push_restrict_region_text"> + Pas de bousculades (les règles de la région priment) + </panel.string> + <text name="allow_label"> + Autoriser les autres résidents à  : + </text> + <check_box label="Modifier le terrain" name="edit land check" tool_tip="Si cette option est cochée, n'importe qui peut terraformer votre terrain. Il vaut mieux ne pas cocher cette option pour toujours pouvoir modifer votre propre terrain."/> + <check_box label="Voler" name="check fly" tool_tip="Si cette option est cochée, les résidents peuvent voler sur votre terrain. Si elle n'est pas cochée, ils ne pourront voler que lorsqu'ils arrivent et passent au dessus de votre terrain."/> + <text left="152" name="allow_label2"> + Créer des objets : + </text> + <check_box label="Tous les résidents" left="285" name="edit objects check"/> + <check_box label="Groupe" left="395" name="edit group objects check"/> + <text left="152" name="allow_label3" width="134"> + Laisser entrer des objets : + </text> + <check_box label="Tous les résidents" left="285" name="all object entry check"/> + <check_box label="Groupe" left="395" name="group object entry check"/> + <text left="152" name="allow_label4"> + Exécuter des scripts : + </text> + <check_box label="Tous les résidents" left="285" name="check other scripts"/> + <check_box label="Groupe" left="395" name="check group scripts"/> + <text name="land_options_label"> + Options du terrain : + </text> + <check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n'y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/> + <check_box bottom="-140" label="Pas de bousculades" left="14" name="PushRestrictCheck" tool_tip="Empêche l'utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/> + <check_box bottom="-160" label="Afficher dans la recherche (30 L$/semaine) sous" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/> + <combo_box bottom="-160" left="286" name="land category with adult" width="146"> + <combo_box.item label="Toutes catégories" name="item0"/> + <combo_box.item label="Appartenant aux Lindens" name="item1"/> + <combo_box.item label="Adult" name="item2"/> + <combo_box.item label="Art et Culture" name="item3"/> + <combo_box.item label="Affaires" name="item4"/> + <combo_box.item label="Éducation" name="item5"/> + <combo_box.item label="Jeux" name="item6"/> + <combo_box.item label="Favoris" name="item7"/> + <combo_box.item label="Accueil pour les nouveaux" name="item8"/> + <combo_box.item label="Parcs et Nature" name="item9"/> + <combo_box.item label="Résidentiel" name="item10"/> + <combo_box.item label="Shopping" name="item11"/> + <combo_box.item label="Autre" name="item12"/> + </combo_box> + <combo_box bottom="-160" left="286" name="land category" width="146"> + <combo_box.item label="Toutes catégories" name="item0"/> + <combo_box.item label="Appartenant aux Lindens" name="item1"/> + <combo_box.item label="Art et Culture" name="item3"/> + <combo_box.item label="Affaires" name="item4"/> + <combo_box.item label="Éducation" name="item5"/> + <combo_box.item label="Jeux" name="item6"/> + <combo_box.item label="Favoris" name="item7"/> + <combo_box.item label="Accueil pour les nouveaux" name="item8"/> + <combo_box.item label="Parcs et Nature" name="item9"/> + <combo_box.item label="Résidentiel" name="item10"/> + <combo_box.item label="Shopping" name="item11"/> + <combo_box.item label="Autre" name="item12"/> + </combo_box> + <check_box bottom="-180" label="Contenu Mature" name="MatureCheck" tool_tip=""/> + <text bottom="-200" name="Snapshot:"> + Photo : + </text> + <texture_picker bottom="-319" label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/> + <text bottom="-323" name="landing_point"> + Lieu d'arrivée : [LANDING] + </text> + <button bottom="-323" label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le point d'arrivée des visiteurs. Définit l'emplacement de votre avatar sur ce terrain."/> + <button bottom="-323" label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Libérer le lieu d'arrivée."/> + <text bottom="-343" name="Teleport Routing: "> + Règles de téléportation : + </text> + <combo_box bottom="-343" left="140" name="landing type" tool_tip="Vous permet de paramétrer les téléportations sur votre terrain." width="140"> + <combo_box.item label="Bloqué" name="Blocked"/> + <combo_box.item label="Lieu d'arrivée fixe" name="LandingPoint"/> + <combo_box.item label="Lieu d'arrivée libre" name="Anywhere"/> + </combo_box> + </panel> + <panel label="Médias" name="land_media_panel"> + <text name="with media:" width="85"> + Type : + </text> + <combo_box left="97" name="media type" tool_tip="Indiquez s'il s'agit de l'URL d'un film, d'une page web ou autre"/> + <text name="mime_type"/> + <text name="at URL:" width="85"> + URL du domicile : + </text> + <line_editor left="97" name="media_url"/> + <button label="Définir..." label_selected="Définir..." name="set_media_url"/> + <text name="CurrentURL:"> + URL actuelle : + </text> + <button label="Réinitialiser..." label_selected="Réinitialiser..." name="reset_media_url"/> + <check_box label="Masquer l'URL" left="97" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l'URL du média. Cette option n'est pas disponible pour les fichiers HTML."/> + <text name="Description:"> + Description : + </text> + <line_editor left="97" name="url_description" tool_tip="Texte affiché à côté du bouton Jouer/Charger"/> + <text name="Media texture:"> + Remplacer +la texture : + </text> + <texture_picker label="" left="97" name="media texture" tool_tip="Cliquez pour sélectionner une image"/> + <text name="replace_texture_help"> + Les objets avec cette texture affichent le film ou la page web quand vous cliquez sur la flèche Jouer. + +Sélectionnez l'image miniature pour choisir une texture différente. + </text> + <check_box label="Échelle automatique" left="97" name="media_auto_scale" tool_tip="Si vous sélectionnez cette option, le contenu de cette parcelle sera automatiquement mis à l'échelle. La qualité visuelle sera peut-être amoindrie mais vous n'aurez à faire aucune autre mise à l'échelle ou alignement."/> + <text left="102" name="media_size" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut." width="105"> + Taille : + </text> + <spinner left_delta="89" name="media_size_width" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/> + <spinner name="media_size_height" tool_tip="Taille du média Web, laisser 0 pour la valeur par défaut."/> + <text name="pixels"> + pixels + </text> + <text name="Options:"> + Options : + </text> + <check_box label="En boucle" name="media_loop" tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera."/> + </panel> + <panel label="Audio" name="land_audio_panel"> + <text name="MusicURL:"> + URL de la musique : + </text> + <text name="Sound:"> + Son : + </text> + <check_box label="Limiter les gestes et sons d'objet à cette parcelle" name="check sound local"/> + <text name="Voice settings:"> + Voix : + </text> + <check_box label="Activer le chat vocal" name="parcel_enable_voice_channel"/> + <check_box label="Activer la voix (contrôlé par le domaine)" name="parcel_enable_voice_channel_is_estate_disabled"/> + <check_box label="Limiter le chat vocal à cette parcelle" name="parcel_enable_voice_channel_parcel"/> + </panel> + <panel label="Accès" name="land_access_panel"> + <panel.string name="estate_override"> + Au moins une de ces options est définie au niveau du domaine. + </panel.string> + <text name="Limit access to this parcel to:"> + Accès à cette parcelle + </text> + <check_box label="Autoriser l'accès public" name="public_access"/> + <text name="Only Allow"> + Bloquer l'accès aux résidents : + </text> + <check_box label="Qui n'ont pas fourni leurs informations de paiement à Linden Lab" name="limit_payment" tool_tip="Aux résidents non identifés"/> + <check_box label="Dont l'âge n'a pas été vérifié" name="limit_age_verified" tool_tip="Interdire les résidents qui n'ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d'informations."/> + <check_box label="Autoriser l'accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définir le groupe à l'onglet Général."/> + <check_box label="Vendre des pass à  :" name="PassCheck" tool_tip="Autoriser un accès temporaire à cette parcelle"/> + <combo_box name="pass_combo"> + <combo_box.item label="Tout le monde" name="Anyone"/> + <combo_box.item label="Groupe" name="Group"/> + </combo_box> + <spinner label="Prix en L$ :" name="PriceSpin"/> + <spinner label="Durée en heures :" name="HoursSpin"/> + <text label="Toujours autoriser" name="AllowedText"> + Résidents autorisés + </text> + <name_list name="AccessList" tool_tip="([LISTED] listés, [MAX] max)"/> + <button label="Ajouter..." label_selected="Ajouter..." name="add_allowed"/> + <button label="Supprimer" label_selected="Supprimer" name="remove_allowed"/> + <text label="Bannir" name="BanCheck"> + Résidents bannis + </text> + <name_list name="BannedList" tool_tip="([LISTED] listés, [MAX] max)"/> + <button label="Ajouter..." label_selected="Ajouter..." name="add_banned"/> + <button label="Supprimer" label_selected="Supprimer" name="remove_banned"/> + </panel> + </tab_container> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml index af6cb41ba85..00ab29703ff 100644 --- a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml @@ -1,91 +1,186 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Animation Preview" title=""> - <text name="name_label"> - Nom : - </text> - <text name="description_label"> - Description : - </text> - <spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/> - <text name="preview_label" width="110"> - Prévisualiser pendant - </text> - <combo_box label="" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales." left_delta="116" width="124"> - <combo_box.item name="Standing" label="Debout" /> - <combo_box.item name="Walking" label="En train de marcher" /> - <combo_box.item name="Sitting" label="Assis" /> - <combo_box.item name="Flying" label="En train de voler" /> - </combo_box> - <check_box left="6" label="Boucle" name="loop_check" tool_tip="Joue cette animation en boucle."/> - <spinner left="76" label_width="55" width="105" label="Début (%)" name="loop_in_point" tool_tip="Définit le moment de l'animation où la boucle repart."/> - <spinner left="195" label="Fin (%)" name="loop_out_point" tool_tip="Définit le moment de l'animation où la boucle finit."/> - <text name="hand_label" width="110"> - Mouvement de main - </text> - <combo_box label="" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l'animation" left_delta="116" width="124"> - <combo_box.item name="Spread" label="Doigts écartés" /> - <combo_box.item name="Relaxed" label="Détendues" /> - <combo_box.item name="PointBoth" label="Pointer (les deux)" /> - <combo_box.item name="Fist" label="Poing" /> - <combo_box.item name="RelaxedLeft" label="Détendue (gauche)" /> - <combo_box.item name="PointLeft" label="Pointer (gauche)" /> - <combo_box.item name="FistLeft" label="Poing (gauche)" /> - <combo_box.item name="RelaxedRight" label="Détendue (droite)" /> - <combo_box.item name="PointRight" label="Pointer (droite)" /> - <combo_box.item name="FistRight" label="Poing (droite)" /> - <combo_box.item name="SaluteRight" label="Saluer (droite)" /> - <combo_box.item name="Typing" label="Taper" /> - <combo_box.item name="PeaceRight" label="Paix (main droite)" /> - </combo_box> - <text name="emote_label"> - Expression - </text> - <combo_box label="" name="emote_combo" tool_tip="Contrôle l'expression du visage au cours de l'animation." left_delta="116" width="124"> - <combo_box.item name="[None]" label="None]" /> - <combo_box.item name="Aaaaah" label="Aaaaah" /> - <combo_box.item name="Afraid" label="Effrayé" /> - <combo_box.item name="Angry" label="En colère" /> - <combo_box.item name="BigSmile" label="Grand sourire" /> - <combo_box.item name="Bored" label="Ennui" /> - <combo_box.item name="Cry" label="Pleurer" /> - <combo_box.item name="Disdain" label="Mépris" /> - <combo_box.item name="Embarrassed" label="Gêne" /> - <combo_box.item name="Frown" label="Froncer les sourcils" /> - <combo_box.item name="Kiss" label="Embrasser" /> - <combo_box.item name="Laugh" label="Rire" /> - <combo_box.item name="Plllppt" label="Plllppt" /> - <combo_box.item name="Repulsed" label="Dégoût" /> - <combo_box.item name="Sad" label="Triste" /> - <combo_box.item name="Shrug" label="Hausser les épaules" /> - <combo_box.item name="Smile" label="Sourire" /> - <combo_box.item name="Surprise" label="Surprise" /> - <combo_box.item name="Wink" label="Clin d'Å“il" /> - <combo_box.item name="Worry" label="Soucis" /> - </combo_box> - <spinner label_width="65" label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l'animation s'intègre au mouvement."/> - <spinner label_width="65" left="160" width="125" label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l'animation disparaît du mouvement."/> - <button label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation." bottom_delta="-48"/> - <button label="" name="stop_btn" tool_tip="Arrêter le playback"/> - <slider label="" name="playback_slider"/> - <text name="bad_animation_text"> - Impossible de lire le fichier d'animation. - -Nous recommandons les fichiers BVH extraits de -Poser 4. - </text> - <button label="Annuler" name="cancel_btn"/> - <button label="Charger ([AMOUNT] L$)" name="ok_btn"/> - <string name="failed_to_initialize"> - Echec de l'initialisation du mouvement - </string> - <string name="anim_too_long"> - Le fichier d'animation fait [LENGTH] secondes. - -La longueur maximale est de [MAX_LENGTH] secondes. - </string> - <string name="failed_file_read"> - Impossible de lire le fichier d'animation. - -[STATUS] - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Animation Preview" title=""> + <floater.string name="failed_to_initialize"> + Echec de l'initialisation du mouvement + </floater.string> + <floater.string name="anim_too_long"> + Le fichier d'animation fait [LENGTH] secondes. + +La longueur maximale est de [MAX_LENGTH] secondes. + </floater.string> + <floater.string name="failed_file_read"> + Impossible de lire le fichier d'animation. + +[STATUS] + </floater.string> + <floater.string name="E_ST_OK"> + Ok + </floater.string> + <floater.string name="E_ST_EOF"> + Fichier incomplet. + </floater.string> + <floater.string name="E_ST_NO_CONSTRAINT"> + Impossible de lire la définition des contraintes. + </floater.string> + <floater.string name="E_ST_NO_FILE"> + Impossible d'ouvrir le fichier BVH. + </floater.string> + <floater.string name="E_ST_NO_HIER"> + En-tête HIERARCHY non valide. + </floater.string> + <floater.string name="E_ST_NO_JOINT"> + Impossible de trouver ROOT ou JOINT. + </floater.string> + <floater.string name="E_ST_NO_NAME"> + Impossible de trouver le nom JOINT. + </floater.string> + <floater.string name="E_ST_NO_OFFSET"> + Impossible de trouver OFFSET. + </floater.string> + <floater.string name="E_ST_NO_CHANNELS"> + Impossible se trouver les CHANNELS. + </floater.string> + <floater.string name="E_ST_NO_ROTATION"> + Impossible d'obtenir l'ordre de rotation. + </floater.string> + <floater.string name="E_ST_NO_AXIS"> + Impossible d'obtenir l'axe de rotation. + </floater.string> + <floater.string name="E_ST_NO_MOTION"> + Impossible de trouver MOTION. + </floater.string> + <floater.string name="E_ST_NO_FRAMES"> + Impossible d'obtenir le nombre de cadres. + </floater.string> + <floater.string name="E_ST_NO_FRAME_TIME"> + Impossible d'obtenir le temps du cadre. + </floater.string> + <floater.string name="E_ST_NO_POS"> + Impossible de trouver les valeurs de la position. + </floater.string> + <floater.string name="E_ST_NO_ROT"> + Impossible de trouver les valeurs de rotation. + </floater.string> + <floater.string name="E_ST_NO_XLT_FILE"> + Impossible d'ouvrir le fichier de traduction. + </floater.string> + <floater.string name="E_ST_NO_XLT_HEADER"> + Impossible de lire l'en-tête de traduction. + </floater.string> + <floater.string name="E_ST_NO_XLT_NAME"> + Impossible de lire la traduction. + </floater.string> + <floater.string name="E_ST_NO_XLT_IGNORE"> + Impossible de lire la traduction. + </floater.string> + <floater.string name="E_ST_NO_XLT_RELATIVE"> + Impossible de lire la valeur de traduction relative. + </floater.string> + <floater.string name="E_ST_NO_XLT_OUTNAME"> + Impossible de lire la traduction. + </floater.string> + <floater.string name="E_ST_NO_XLT_MATRIX"> + Impossible de lire la matrice de traduction. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGECHILD"> + Impossible de trouver le nom mergechild. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGEPARENT"> + Impossible de trouver le nom mergeparent. + </floater.string> + <floater.string name="E_ST_NO_XLT_PRIORITY"> + Impossible de définir la valeur de la priorité. + </floater.string> + <floater.string name="E_ST_NO_XLT_LOOP"> + Impossible de définir la valeur de la boucle + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEIN"> + Impossible de trouver les valeurs easeln. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEOUT"> + Impossible de trouver les valeurs easeOut. + </floater.string> + <floater.string name="E_ST_NO_XLT_HAND"> + Impossible d'obtenir la valeur hand morph. + </floater.string> + <floater.string name="E_ST_NO_XLT_EMOTE"> + Impossible de lire le nom emote. + </floater.string> + <text name="name_label"> + Nom : + </text> + <text name="description_label"> + Description : + </text> + <spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/> + <check_box label="Boucle" left="6" name="loop_check" tool_tip="Joue cette animation en boucle."/> + <spinner label="Début (%)" label_width="55" left="76" name="loop_in_point" tool_tip="Définit le moment de l'animation où la boucle repart." width="105"/> + <spinner label="Fin (%)" left="195" name="loop_out_point" tool_tip="Définit le moment de l'animation où la boucle finit."/> + <text name="hand_label" width="110"> + Mouvement de main + </text> + <combo_box label="" left_delta="116" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l'animation" width="124"> + <combo_box.item label="Doigts écartés" name="Spread"/> + <combo_box.item label="Détendues" name="Relaxed"/> + <combo_box.item label="Pointer (les deux)" name="PointBoth"/> + <combo_box.item label="Poing" name="Fist"/> + <combo_box.item label="Détendue (gauche)" name="RelaxedLeft"/> + <combo_box.item label="Pointer (gauche)" name="PointLeft"/> + <combo_box.item label="Poing (gauche)" name="FistLeft"/> + <combo_box.item label="Détendue (droite)" name="RelaxedRight"/> + <combo_box.item label="Pointer (droite)" name="PointRight"/> + <combo_box.item label="Poing (droite)" name="FistRight"/> + <combo_box.item label="Saluer (droite)" name="SaluteRight"/> + <combo_box.item label="Taper" name="Typing"/> + <combo_box.item label="Paix (main droite)" name="PeaceRight"/> + </combo_box> + <text name="emote_label"> + Expression + </text> + <combo_box label="" left_delta="116" name="emote_combo" tool_tip="Contrôle l'expression du visage au cours de l'animation." width="124"> + <combo_box.item label="None]" name="[None]"/> + <combo_box.item label="Aaaaah" name="Aaaaah"/> + <combo_box.item label="Effrayé" name="Afraid"/> + <combo_box.item label="En colère" name="Angry"/> + <combo_box.item label="Grand sourire" name="BigSmile"/> + <combo_box.item label="Ennui" name="Bored"/> + <combo_box.item label="Pleurer" name="Cry"/> + <combo_box.item label="Mépris" name="Disdain"/> + <combo_box.item label="Gêne" name="Embarrassed"/> + <combo_box.item label="Froncer les sourcils" name="Frown"/> + <combo_box.item label="Embrasser" name="Kiss"/> + <combo_box.item label="Rire" name="Laugh"/> + <combo_box.item label="Plllppt" name="Plllppt"/> + <combo_box.item label="Dégoût" name="Repulsed"/> + <combo_box.item label="Triste" name="Sad"/> + <combo_box.item label="Hausser les épaules" name="Shrug"/> + <combo_box.item label="Sourire" name="Smile"/> + <combo_box.item label="Surprise" name="Surprise"/> + <combo_box.item label="Clin d'Å“il" name="Wink"/> + <combo_box.item label="Soucis" name="Worry"/> + </combo_box> + <text name="preview_label" width="110"> + Prévisualiser pendant + </text> + <combo_box label="" left_delta="116" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales." width="124"> + <combo_box.item label="Debout" name="Standing"/> + <combo_box.item label="En train de marcher" name="Walking"/> + <combo_box.item label="Assis" name="Sitting"/> + <combo_box.item label="En train de voler" name="Flying"/> + </combo_box> + <spinner label="Transition +début (s)" label_width="65" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l'animation s'intègre au mouvement."/> + <spinner label="Transition +fin (s)" label_width="65" left="160" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l'animation disparaît du mouvement." width="125"/> + <button bottom_delta="-48" label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/> + <button label="" name="stop_btn" tool_tip="Arrêter le playback"/> + <slider label="" name="playback_slider"/> + <text name="bad_animation_text"> + Impossible de lire le fichier d'animation. + +Nous recommandons les fichiers BVH extraits de +Poser 4. + </text> + <button label="Annuler" name="cancel_btn"/> + <button label="Charger ([AMOUNT] L$)" name="ok_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml index c713d3e9305..5742b0af04b 100644 --- a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml @@ -1,42 +1,41 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="CHOISIR LE RÉSIDENT"> - <tab_container name="ResidentChooserTabs"> - <panel label="Rechercher" name="SearchPanel"> - <text name="InstructSearchResidentName"> - Saisissez une partie du nom du résident : - </text> - <button label="Trouver" label_selected="Trouver" name="Find"/> - </panel> - <panel label="Cartes de visite" name="CallingCardsPanel"> - <text name="InstructSelectCallingCard"> - Sélectionnez une carte de visite : - </text> - </panel> - <panel label="Près de moi" name="NearMePanel"> - <text name="InstructSelectResident"> - Choisir un résident -près de vous : - </text> - <button font="SansSerifSmall" label="Rafraîchir la liste" label_selected="Rafraîchir la liste" name="Refresh" left_delta="10" width="105"/> - <slider label="Distance" name="near_me_range" bottom_delta="-36"/> - <text name="meters"> - mètres - </text> - <scroll_list bottom_delta="-169" height="159" name="NearMe" /> - </panel> - </tab_container> - <button label="Sélectionner" label_selected="Sélectionner" name="Select"/> - <button label="Annuler" label_selected="Annuler" name="Cancel"/> - <string name="not_found"> - '[TEXT]' introuvable - </string> - <string name="no_one_near"> - Il n'y a personne près de vous - </string> - <string name="no_results"> - Aucun résultat - </string> - <string name="searching"> - Recherche... - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="avatarpicker" title="CHOISIR LE RÉSIDENT"> + <tab_container name="ResidentChooserTabs"> + <panel label="Rechercher" name="SearchPanel"> + <text name="InstructSearchResidentName"> + Saisissez une partie du nom du résident : + </text> + <button label="OK" label_selected="OK" name="Find"/> + </panel> + <panel label="Cartes de visite" name="CallingCardsPanel"> + <text name="InstructSelectCallingCard"> + Sélectionnez une carte de visite : + </text> + </panel> + <panel label="Près de moi" name="NearMePanel"> + <text name="InstructSelectResident"> + Sélectionner une personne près de vous : + </text> + <button font="SansSerifSmall" label="Rafraîchir la liste" label_selected="Rafraîchir la liste" left_delta="10" name="Refresh" width="105"/> + <slider bottom_delta="-36" label="Distance" name="near_me_range"/> + <text name="meters"> + mètres + </text> + <scroll_list bottom_delta="-169" height="159" name="NearMe"/> + </panel> + </tab_container> + <button label="OK" label_selected="OK" name="Select"/> + <button label="Annuler" label_selected="Annuler" name="Cancel"/> + <string name="not_found"> + '[TEXT]' introuvable + </string> + <string name="no_one_near"> + Il n'y a personne près de vous + </string> + <string name="no_results"> + Aucun résultat + </string> + <string name="searching"> + Recherche... + </string> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_beacons.xml b/indra/newview/skins/default/xui/fr/floater_beacons.xml index 4f5c5d442f5..a7476898830 100644 --- a/indra/newview/skins/default/xui/fr/floater_beacons.xml +++ b/indra/newview/skins/default/xui/fr/floater_beacons.xml @@ -1,15 +1,21 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="BALISES"> - <panel name="beacons_panel"> - <check_box label="Objets scriptés avec Toucher uniquement" name="touch_only"/> - <check_box label="Objets scriptés" name="scripted"/> - <check_box label="Objets physiques" name="physical"/> - <check_box label="Sources sonores" name="sounds"/> - <check_box label="Sources de particules" name="particles"/> - <check_box label="Mettre en surbrillance" name="highlights"/> - <check_box label="Montrer les balises" name="beacons"/> - <text name="beacon_width_label"> - Largeur de la balise : - </text> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="beacons" title="BALISES"> + <panel name="beacons_panel"> + <text name="label_show"> + Afficher : + </text> + <check_box label="Balises" name="beacons"/> + <check_box label="Surbrillances" name="highlights"/> + <text name="beacon_width_label" tool_tip="Largeur de la balise"> + Largeur : + </text> + <text name="label_objects"> + Pour ces objets : + </text> + <check_box label="Physique" name="physical"/> + <check_box label="Scripté" name="scripted"/> + <check_box label="Toucher uniquement" name="touch_only"/> + <check_box label="Sources sonores" name="sounds"/> + <check_box label="Sources des particules" name="particles"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_build_options.xml b/indra/newview/skins/default/xui/fr/floater_build_options.xml index 76e8e2f6375..e8e6a59dc4f 100644 --- a/indra/newview/skins/default/xui/fr/floater_build_options.xml +++ b/indra/newview/skins/default/xui/fr/floater_build_options.xml @@ -1,8 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="build options floater" title="OPTIONS DE LA GRILLE"> - <spinner label="Unité (mètres)" name="GridResolution" /> - <spinner label="Mesures (mètres)" name="GridDrawSize" /> - <check_box label="Activer la fixation des sous-unités" name="GridSubUnit" /> - <check_box label="Afficher les sections transversales" name="GridCrossSection" /> - <slider label="Opacité de la grille" name="GridOpacity" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="build options floater" title="OPTIONS DE LA GRILLE"> + <spinner label="Unités (mètres)" name="GridResolution"/> + <spinner label="Mesures (mètres)" name="GridDrawSize"/> + <check_box label="Fixation des sous-unités" name="GridSubUnit"/> + <check_box label="Afficher les sections transversales" name="GridCrossSection"/> + <text name="grid_opacity_label" tool_tip="Opacité de la grille"> + Opacité : + </text> + <slider label="Opacité de la grille" name="GridOpacity"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml index 98b7faa2ccc..212ee2504a8 100644 --- a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml @@ -1,44 +1,53 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="CHANGEMENT DES DROITS RELATIFS AU CONTENU"> - <text name="applyto"> - Types de contenu - </text> - <check_box label="Animation" name="check_animation"/> - <check_box label="Parties du corps" name="check_bodypart"/> - <check_box label="Habits" name="check_clothing"/> - <check_box label="Gestes" name="check_gesture"/> - <check_box label="Repères" name="check_landmark"/> - <check_box label="Notes" name="check_notecard"/> - <check_box label="Objets" name="check_object"/> - <check_box label="Scripts" name="check_script"/> - <check_box label="Sons" name="check_sound"/> - <check_box label="Textures" name="check_texture"/> - <button label="Tout cocher" label_selected="Tout" name="check_all"/> - <button label="Tout décocher" label_selected="Aucun" name="check_none"/> - <text name="newperms"> - Nouveaux droits - </text> - <check_box label="Partager avec le groupe" name="share_with_group"/> - <check_box label="Autoriser tout le monde à copier" name="everyone_copy"/> - <text name="NextOwnerLabel"> - Le prochain propriétaire pourra : - </text> - <check_box label="Modifier" name="next_owner_modify"/> - <check_box label="Copier" name="next_owner_copy"/> - <check_box label="Revendre/Donner" name="next_owner_transfer"/> - <button label="Aide" name="help"/> - <button label="Appliquer" name="apply"/> - <button label="Fermer" name="close"/> - <string name="nothing_to_modify_text"> - La sélection contient des contenus non modifiables. - </string> - <string name="status_text"> - Permissions paramétrées sur [NAME] - </string> - <string name="start_text"> - Demande de changement des droits lancée... - </string> - <string name="done_text"> - Demande de changement des droits finie. - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floaterbulkperms" title="Modifier les droits relatifs au contenu"> + <floater.string name="nothing_to_modify_text"> + La sélection contient des contenus non modifiables. + </floater.string> + <floater.string name="status_text"> + Permissions paramétrées sur [NAME] + </floater.string> + <floater.string name="start_text"> + Demande de changement des droits lancée... + </floater.string> + <floater.string name="done_text"> + Demande de changement des droits finie. + </floater.string> + <check_box label="Animation" name="check_animation"/> + <icon name="icon_animation" tool_tip="Animation"/> + <check_box label="Parties du corps" name="check_bodypart"/> + <icon name="icon_bodypart" tool_tip="Parties du corps"/> + <check_box label="Habits" name="check_clothing"/> + <icon name="icon_clothing" tool_tip="Habits"/> + <check_box label="Gestes" name="check_gesture"/> + <icon name="icon_gesture" tool_tip="Gestes"/> + <check_box label="Notes" name="check_notecard"/> + <icon name="icon_notecard" tool_tip="Notes"/> + <check_box label="Objets" name="check_object"/> + <icon name="icon_object" tool_tip="Objets"/> + <check_box label="Scripts" name="check_script"/> + <icon name="icon_script" tool_tip="Scripts"/> + <check_box label="Sons" name="check_sound"/> + <icon name="icon_sound" tool_tip="Sons"/> + <check_box label="Textures" name="check_texture"/> + <button label="√ Tout" label_selected="Tout" name="check_all"/> + <button label="Effacer" label_selected="Aucun" name="check_none"/> + <text name="newperms"> + Nouvelles permissions relatives au contenu + </text> + <text name="GroupLabel"> + Groupe : + </text> + <check_box label="Partager" name="share_with_group"/> + <text name="AnyoneLabel"> + N'importe qui : + </text> + <check_box label="Copier" name="everyone_copy"/> + <text name="NextOwnerLabel"> + Le prochain propriétaire : + </text> + <check_box label="Modifier" name="next_owner_modify"/> + <check_box label="Copier" name="next_owner_copy"/> + <check_box initial_value="true" label="Transférer" name="next_owner_transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/> + <button label="OK" name="apply"/> + <button label="Annuler" name="close"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_buy_object.xml b/indra/newview/skins/default/xui/fr/floater_buy_object.xml index 893d559e6e8..86b67ad491d 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_object.xml @@ -1,26 +1,26 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="contents" title="ACHETER UNE COPIE DE L'OBJET"> - <text name="contents_text"> - et ses contenus : - </text> - <text name="buy_text"> - Acheter pour [AMOUNT] L$ à [NAME] ? - </text> - <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> - <button label="Acheter" label_selected="Acheter" name="buy_btn"/> - <string name="title_buy_text"> - Acheter - </string> - <string name="title_buy_copy_text"> - Acheter une copie - </string> - <string name="no_copy_text"> - (pas de copie) - </string> - <string name="no_modify_text"> - (pas de modification) - </string> - <string name="no_transfer_text"> - (pas de transfert) - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="contents" title="ACHETER UNE COPIE DE L'OBJET"> + <text name="contents_text"> + Contient : + </text> + <text name="buy_text"> + Acheter pour [AMOUNT] L$ à [NAME] ? + </text> + <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> + <button label="Acheter" label_selected="Acheter" name="buy_btn"/> + <string name="title_buy_text"> + Acheter + </string> + <string name="title_buy_copy_text"> + Acheter une copie + </string> + <string name="no_copy_text"> + (pas de copie) + </string> + <string name="no_modify_text"> + (pas de modification) + </string> + <string name="no_transfer_text"> + (pas de transfert) + </string> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_camera.xml b/indra/newview/skins/default/xui/fr/floater_camera.xml index 8ea640853f2..2fc01b9f171 100644 --- a/indra/newview/skins/default/xui/fr/floater_camera.xml +++ b/indra/newview/skins/default/xui/fr/floater_camera.xml @@ -1,16 +1,23 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="camera_floater"> - <floater.string name="rotate_tooltip"> - Faire tourner la caméra autour du point central - </floater.string> - <floater.string name="zoom_tooltip"> - Zoomer en direction du point central - </floater.string> - <floater.string name="move_tooltip"> - Déplacer la caméra vers le haut et le bas, la gauche et la droite - </floater.string> - <panel name="controls"> - <joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut et le bas, la gauche et la droite"/> - <joystick_zoom name="zoom" tool_tip="Zoomer en direction du point central"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater"> + <floater.string name="rotate_tooltip"> + Faire tourner la caméra autour du point central + </floater.string> + <floater.string name="zoom_tooltip"> + Zoomer en direction du point central + </floater.string> + <floater.string name="move_tooltip"> + Déplacer la caméra vers le haut et le bas, la gauche et la droite + </floater.string> + <panel name="controls"> + <joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut et le bas, la gauche et la droite"/> + <joystick_zoom name="zoom" tool_tip="Zoomer en direction du point central"/> + <joystick_rotate name="cam_rotate_stick" tool_tip="Faire tourner la caméra autour du point central"/> + </panel> + <panel name="buttons"> + <button label="" name="orbit_btn" tool_tip="Faire tourner la caméra"/> + <button label="" name="pan_btn" tool_tip="Vue panoramique"/> + <button label="" name="avatarview_btn" tool_tip="Vue subjective"/> + <button label="" name="freecamera_btn" tool_tip="Voir l'objet"/> + </panel> +</floater> 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 996f3e9b073..111e4d3e5e1 100644 --- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml @@ -1,32 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="ColorPicker" title="CHOIX DE TEXTURE ET DE COULEUR"> - <text name="r_val_text"> - Rouge : - </text> - <text name="g_val_text"> - Vert : - </text> - <text name="b_val_text"> - Bleu : - </text> - <text name="h_val_text"> - Teinte : - </text> - <text name="s_val_text"> - Sat : - </text> - <text name="l_val_text"> - Lum : - </text> - <check_box label="Application auto" left="4" name="apply_immediate" width="108"/> - <button label="" label_selected="" left_delta="138" name="color_pipette"/> - <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> - <button label="Sélectionner" label_selected="Sélectionner" name="select_btn"/> - <text left="8" name="Current color:"> - Couleur actuelle : - </text> - <text left="8" name="(Drag below to save.)" width="114"> - (Faire glisser dessous -pour enregistrer) - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="ColorPicker" title="CHOIX DE TEXTURE ET DE COULEUR"> + <text name="r_val_text"> + Rouge : + </text> + <text name="g_val_text"> + Vert : + </text> + <text name="b_val_text"> + Bleu : + </text> + <text name="h_val_text"> + Teinte : + </text> + <text name="s_val_text"> + Sat : + </text> + <text name="l_val_text"> + Lum : + </text> + <check_box label="Appliquer maintenant" left="4" name="apply_immediate" width="108"/> + <button label="" label_selected="" left_delta="138" name="color_pipette"/> + <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> + <button label="OK" label_selected="Sélectionner" name="select_btn"/> + <text left="8" name="Current color:"> + Couleur actuelle : + </text> + <text left="8" name="(Drag below to save.)" width="114"> + (Faire glisser dessous +pour enregistrer) + </text> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_god_tools.xml b/indra/newview/skins/default/xui/fr/floater_god_tools.xml index 33cb43f7ac7..f670fa9965e 100644 --- a/indra/newview/skins/default/xui/fr/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_god_tools.xml @@ -1,99 +1,106 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="godtools floater" title="OUTILS DIVINS"> - <tab_container name="GodTools Tabs"> - <panel label="Grille" name="grid"> - <button label="Éjecter tous" label_selected="Éjecter tous" name="Kick all users" width="175" /> - <button label="Vider le cache cartographique de la région" label_selected="Vider le cache cartographique de la région" name="Flush This Region's Map Visibility Caches" width="285"/> - </panel> - <panel label="Région" name="region"> - <text name="Sim Name:" width="70"> - Nom du sim : - </text> - <line_editor left="85" name="region name" width="198" /> - <check_box label="Initiation" name="check prelude" tool_tip="Définir cette région comme zone d'initiation."/> - <check_box label="Soleil fixe" name="check fixed sun" tool_tip="Définir la position du soleil (comme dans Région et Domaine > Terrain.)"/> - <check_box label="Réinitialiser le domicile à la téléportation" name="check reset home" tool_tip="Lorsqu'un résident se téléporte à l'extérieur, réinitialise son domicile à la position de sa destination." height="32"/> - <check_box label="Visible" name="check visible" tool_tip="Cochez pour rendre la région visible aux non-admins." bottom_delta="-32"/> - <check_box label="Dégâts" name="check damage" tool_tip="Cochez pour activer les dégâts dans cette région."/> - <check_box label="Bloquer le suivi de trafic" name="block dwell" tool_tip="Cochez pour que la région ne comptabilise pas le trafic."/> - <check_box label="Interdire le terraformage" name="block terraform" tool_tip="Cochez pour empêcher les personnes de terraformer leur terrain"/> - <check_box label="Bac à sable" name="is sandbox" tool_tip="Basculer cette région en bac à sable."/> - <button label="Figer le terrain" label_selected="Figer le terrain" name="Bake Terrain" tool_tip="Enregistrer le terrain actuel comme terrain par défaut." width="118" /> - <button label="Rétablir le terrain" label_selected="Rétablir le terrain" name="Revert Terrain" tool_tip="Remplacer le terrain actuel avec le terrain par défaut." width="118" /> - <button label="Échanger le terrain" label_selected="Échanger le terrain" name="Swap Terrain" tool_tip="Échangez le terrain actuel avec le terrain par défaut." width="118" /> - <text name="estate id"> - ID du domaine : - </text> - <text name="parent id"> - ID parent : - </text> - <line_editor name="parentestate" tool_tip="Il s'agit du domaine parent de cette région"/> - <text name="Grid Pos: "> - Position sur la grille : - </text> - <line_editor name="gridposx" tool_tip="Position x de cette région sur la grille" left_delta="120" width="35"/> - <line_editor name="gridposy" tool_tip="Position y de cette région sur la grille" left_delta="40" width="35" /> - <text name="Redirect to Grid: "> - Rediriger vers la grille : - </text> - <line_editor left_delta="120" name="redirectx" width="35" /> - <line_editor left_delta="40" name="redirecty" width="35" /> - <spinner left="320" name="billable factor" width="70" /> - <text name="billable factor text" font="SansSerifSmall" left_delta="-120" width="120"> - Facteur de facturation : - </text> - <spinner left="320" name="land cost" width="70" /> - <text name="land cost text" left_delta="-120"> - L$ par m² : - </text> - <button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh" tool_tip="Cliquez ici pour rafraîchir les informations ci-dessus."/> - <button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/> - <button label="Sélectionner une région" label_selected="Sélectionner une région" name="Select Region" tool_tip="Sélectionnez une région entière à l'aide de l'outil Terrain." width="140" left="136"/> - <button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." width="140" left="136"/> - </panel> - <panel label="Objets" name="objects"> - <text name="Sim Name:" width="70"> - Nom du sim : - </text> - <text name="region name" left_delta="75"> - Welsh - </text> - <check_box label="Désactiver les scripts" name="disable scripts" tool_tip="Cochez pour désactiver tous les scripts dans cette région"/> - <check_box label="Désactiver les collisions" name="disable collisions" tool_tip="Cochez pour désactiver les collisions entre non-avatars dans cette région"/> - <check_box label="Désactiver la physique" name="disable physics" tool_tip="Cochez pour désactiver tous les effets liés à la physique dans cette région"/> - <button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus." bottom="-85"/> - <button label="Définir la cible" label_selected="Définir la cible" name="Set Target" tool_tip="Définir l'avatar cible pour la suppression de l'objet."/> - <text name="target_avatar_name"> - (aucune cible) - </text> - <button label="Supprimer tous les objets scriptés de la cible sur les terrains des autres" label_selected="Supprimer tous les objets scriptés de la cible sur les terrains des autres" name="Delete Target's Scripted Objects On Others Land" tool_tip="Supprimer tous les objets scriptés appartenant à la cible sur les terrains ne lui appartenant pas. Les objets non copiables seront renvoyés."/> - <button label="Supprimer les objets scriptés de la cible sur *tous* les terrains" label_selected="Supprimer les objets scriptés de la cible sur *tous* les terrains" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Supprimer les objets scriptés appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/> - <button label="Supprimer *tous* les objets de la cible" label_selected="Supprimer *tous* les objets de la cible" name="Delete *ALL* Of Target's Objects" tool_tip="Supprimer tous les objets appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/> - <button width="300" label="Afficher les collisions les plus consommatrices" label_selected="Afficher les collisions les plus consommatrices" name="Get Top Colliders" tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. "/> - <button width="300" label="Afficher les objets scriptés les plus consommateurs" label_selected="Afficher les objets scriptés les plus consommateurs" name="Get Top Scripts" tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts."/> - <button width="300" label="Résumé des scripts" label_selected="Résumé des scripts" name="Scripts digest" tool_tip="Dresse une liste des scripts et de leurs occurrences."/> - </panel> - <panel label="Requête" name="request"> - <text name="Destination:"> - Destination : - </text> - <combo_box name="destination"> - <combo_box.item name="item1" label="Sélection" /> - <combo_box.item name="item2" label="Région de l'avatar" /> - </combo_box> - <text name="Request:"> - Requête : - </text> - <combo_box name="request"> - <combo_box.item name="item1" label="Objets responsables de collisions : étapes" /> - <combo_box.item name="item2" label="Nombre de scripts et schéma optionnel" /> - <combo_box.item name="item3" label="Schéma des objets" /> - <combo_box.item name="item4" label="rezzer <asset_id>" /> - </combo_box> - <text name="Parameter:"> - Paramètre : - </text> - <button label="Effectuer la requête" label_selected="Effectuer la requête" name="Make Request" width="140"/> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="godtools floater" title="OUTILS DIVINS"> + <tab_container name="GodTools Tabs"> + <panel label="Grille" name="grid"> + <button label="Éjecter tous" label_selected="Éjecter tous" name="Kick all users" width="175"/> + <button label="Vider le cache cartographique de la région" label_selected="Vider le cache cartographique de la région" name="Flush This Region's Map Visibility Caches" width="285"/> + </panel> + <panel label="Région" name="region"> + <text name="Sim Name:" width="70"> + Nom du sim : + </text> + <line_editor left="85" name="region name" width="198"/> + <check_box label="Initiation" name="check prelude" tool_tip="Définir cette région comme zone d'initiation."/> + <check_box label="Soleil fixe" name="check fixed sun" tool_tip="Définir la position du soleil (comme dans Région et Domaine > Terrain.)"/> + <check_box height="32" label="Réinitialiser le domicile +à la téléportation" name="check reset home" tool_tip="Lorsqu'un résident se téléporte à l'extérieur, réinitialise son domicile à la position de sa destination."/> + <check_box bottom_delta="-32" label="Visible" name="check visible" tool_tip="Cochez pour rendre la région visible aux non-admins."/> + <check_box label="Dégâts" name="check damage" tool_tip="Cochez pour activer les dégâts dans cette région."/> + <check_box label="Bloquer le suivi de trafic" name="block dwell" tool_tip="Cochez pour que la région ne comptabilise pas le trafic."/> + <check_box label="Interdire le terraformage" name="block terraform" tool_tip="Cochez pour empêcher les personnes de terraformer leur terrain"/> + <check_box label="Bac à sable" name="is sandbox" tool_tip="Basculer cette région en bac à sable."/> + <button label="Figer le terrain" label_selected="Figer le terrain" name="Bake Terrain" tool_tip="Enregistrer le terrain actuel comme terrain par défaut." width="118"/> + <button label="Rétablir le terrain" label_selected="Rétablir le terrain" name="Revert Terrain" tool_tip="Remplacer le terrain actuel avec le terrain par défaut." width="118"/> + <button label="Échanger le terrain" label_selected="Échanger le terrain" name="Swap Terrain" tool_tip="Échangez le terrain actuel avec le terrain par défaut." width="118"/> + <text name="estate id"> + ID du domaine : + </text> + <text name="parent id"> + ID parent : + </text> + <line_editor name="parentestate" tool_tip="Il s'agit du domaine parent de cette région"/> + <text name="Grid Pos: "> + Position sur la grille : + </text> + <line_editor left_delta="120" name="gridposx" tool_tip="Position x de cette région sur la grille" width="35"/> + <line_editor left_delta="40" name="gridposy" tool_tip="Position y de cette région sur la grille" width="35"/> + <text name="Redirect to Grid: "> + Rediriger vers la grille : + </text> + <line_editor left_delta="120" name="redirectx" width="35"/> + <line_editor left_delta="40" name="redirecty" width="35"/> + <text font="SansSerifSmall" left_delta="-120" name="billable factor text" width="120"> + Facteur de facturation : + </text> + <spinner left="320" name="billable factor" width="70"/> + <text left_delta="-120" name="land cost text"> + L$ par m² : + </text> + <spinner left="320" name="land cost" width="70"/> + <button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh" tool_tip="Cliquez ici pour rafraîchir les informations ci-dessus."/> + <button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/> + <button label="Sélectionner une région" label_selected="Sélectionner une région" left="136" name="Select Region" tool_tip="Sélectionnez une région entière à l'aide de l'outil Terrain." width="140"/> + <button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" left="136" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." width="140"/> + </panel> + <panel label="Objets" name="objects"> + <panel.string name="no_target"> + (aucune cible) + </panel.string> + <text name="Sim Name:" width="70"> + Nom du sim : + </text> + <text left_delta="75" name="region name"> + Welsh + </text> + <check_box label="Désactiver les +scripts" name="disable scripts" tool_tip="Cochez pour désactiver tous les scripts dans cette région"/> + <check_box label="Désactiver les +collisions" name="disable collisions" tool_tip="Cochez pour désactiver les collisions entre non-avatars dans cette région"/> + <check_box label="Désactiver la +physique" name="disable physics" tool_tip="Cochez pour désactiver tous les effets liés à la physique dans cette région"/> + <button bottom="-85" label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/> + <button label="Définir la cible" label_selected="Définir la cible" name="Set Target" tool_tip="Définir l'avatar cible pour la suppression de l'objet."/> + <text name="target_avatar_name"> + (aucune cible) + </text> + <button label="Supprimer tous les objets scriptés de la cible sur les terrains des autres" label_selected="Supprimer tous les objets scriptés de la cible sur les terrains des autres" name="Delete Target's Scripted Objects On Others Land" tool_tip="Supprimer tous les objets scriptés appartenant à la cible sur les terrains ne lui appartenant pas. Les objets non copiables seront renvoyés."/> + <button label="Supprimer les objets scriptés de la cible sur *tous* les terrains" label_selected="Supprimer les objets scriptés de la cible sur *tous* les terrains" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="Supprimer les objets scriptés appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/> + <button label="Supprimer *tous* les objets de la cible" label_selected="Supprimer *tous* les objets de la cible" name="Delete *ALL* Of Target's Objects" tool_tip="Supprimer tous les objets appartenant à la cible dans cette région. Les objets non copiables seront renvoyés."/> + <button label="Afficher les collisions les plus consommatrices" label_selected="Afficher les collisions les plus consommatrices" name="Get Top Colliders" tool_tip="Dresse une liste des objets avec les callbacks les plus fréquents. " width="300"/> + <button label="Afficher les objets scriptés les plus consommateurs" label_selected="Afficher les objets scriptés les plus consommateurs" name="Get Top Scripts" tool_tip="Dresse une liste des objets qui passent le plus de temps à exécuter des scripts." width="300"/> + <button label="Résumé des scripts" label_selected="Résumé des scripts" name="Scripts digest" tool_tip="Dresse une liste des scripts et de leurs occurrences." width="300"/> + </panel> + <panel label="Requête" name="request"> + <text name="Destination:"> + Destination : + </text> + <combo_box name="destination"> + <combo_box.item label="Sélection" name="item1"/> + <combo_box.item label="Région de l'avatar" name="item2"/> + </combo_box> + <text name="Request:"> + Requête : + </text> + <combo_box name="request"> + <combo_box.item label="Objets responsables de collisions : étapes" name="item1"/> + <combo_box.item label="Nombre de scripts et schéma optionnel" name="item2"/> + <combo_box.item label="Schéma des objets" name="item3"/> + <combo_box.item label="rezzer <asset_id>" name="item4"/> + </combo_box> + <text name="Parameter:"> + Paramètre : + </text> + <button label="Effectuer la requête" label_selected="Effectuer la requête" name="Make Request" width="140"/> + </panel> + </tab_container> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml index 6c1ea09c903..018c0d81cf2 100644 --- a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml @@ -1,28 +1,28 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Hardware Settings Floater" title="CONFIGURATION DU MATÉRIEL"> - <text name="Filtering:"> - Filtres : - </text> - <check_box label="Filtre anisotrope (plus lent si activé)" name="ani"/> - <text name="Antialiasing:"> - Anti-aliasing : - </text> - <combo_box label="Anti-aliasing" name="fsaa" width="84"> - <combo_box.item name="FSAADisabled" label="Désactivé" /> - <combo_box.item name="2x" label="2x" /> - <combo_box.item name="4x" label="4x" /> - <combo_box.item name="8x" label="8x" /> - <combo_box.item name="16x" label="16x" /> - </combo_box> - <spinner label="Gamma :" name="gamma"/> - <text left="217" name="(brightness, lower is brighter)"> - (0 = défaut, valeur faible = plus lumineux) - </text> - <text name="Enable VBO:"> - Activer le VBO : - </text> - <check_box label="Activer OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Sur un matériel moderne, cette option permet une meilleure performance. Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu'ils sont activés."/> - <slider label="Mémoire vidéo (Mo) :" name="GrapicsCardTextureMemory" tool_tip="Total de la mémoire alloué aux textures. Mémoire de la carte vidéo par défaut. En réduisant cette valeur, vous pouvez accroître la performance mais les textures risquent de devenir floues."/> - <spinner label="Indice du brouillard :" name="fog"/> - <button label="OK" label_selected="OK" name="OK"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Hardware Settings Floater" title="CONFIGURATION DU MATÉRIEL"> + <text name="Filtering:"> + Filtres : + </text> + <check_box label="Filtre anisotrope (plus lent si activé)" name="ani"/> + <text name="Antialiasing:"> + Anti-aliasing : + </text> + <combo_box label="Anti-aliasing" name="fsaa" width="84"> + <combo_box.item label="Désactivé" name="FSAADisabled"/> + <combo_box.item label="2x" name="2x"/> + <combo_box.item label="4x" name="4x"/> + <combo_box.item label="8x" name="8x"/> + <combo_box.item label="16x" name="16x"/> + </combo_box> + <spinner label="Gamma :" name="gamma"/> + <text left="217" name="(brightness, lower is brighter)"> + (0 = défaut, valeur faible = plus lumineux) + </text> + <text name="Enable VBO:"> + Activer le VBO : + </text> + <check_box label="Activer OpenGL Vertex Buffer Objects" name="vbo" tool_tip="Sur un matériel moderne, cette option permet une meilleure performance. Par contre, sur un matériel plus ancien, les VBO sont souvent mal implémentés et peuvent causer des crashs lorsqu'ils sont activés."/> + <slider label="Mémoire vidéo (Mo) :" name="GrapicsCardTextureMemory" tool_tip="Total de la mémoire alloué aux textures. Mémoire de la carte vidéo par défaut. En réduisant cette valeur, vous pouvez accroître la performance mais les textures risquent de devenir floues."/> + <spinner label="Indice du brouillard :" name="fog"/> + <button label="OK" label_selected="OK" name="OK"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_image_preview.xml b/indra/newview/skins/default/xui/fr/floater_image_preview.xml index f12c1fee448..57b60a28bf5 100644 --- a/indra/newview/skins/default/xui/fr/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_image_preview.xml @@ -1,32 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Image Preview" title=""> - <text name="name_label"> - Nom : - </text> - <text name="description_label"> - Description : - </text> - <text name="preview_label"> - Prévisualiser comme : - </text> - <combo_box label="Habits" name="clothing_type_combo" left="126" > - <combo_box.item name="Image" label="Image" /> - <combo_box.item name="Hair" label="Cheveux" /> - <combo_box.item name="FemaleHead" label="Tête de femme" /> - <combo_box.item name="FemaleUpperBody" label="Corps de femme (haut)" /> - <combo_box.item name="FemaleLowerBody" label="Corps de femme (bas)" /> - <combo_box.item name="MaleHead" label="Tête d'homme" /> - <combo_box.item name="MaleUpperBody" label="Corps d'homme (haut)" /> - <combo_box.item name="MaleLowerBody" label="Corps d'homme (bas)" /> - <combo_box.item name="Skirt" label="Jupe" /> - <combo_box.item name="SculptedPrim" label="Sculptie" /> - </combo_box> - <text name="bad_image_text"> - Impossible de lire l'image. - -Sauvegardez en Targa 24 bit (.tga). - </text> - <check_box label="Utiliser une compression sans perte" name="lossless_check"/> - <button label="Annuler" name="cancel_btn"/> - <button label="Charger ([AMOUNT] L$)" name="ok_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Image Preview" title=""> + <text name="name_label"> + Nom : + </text> + <text name="description_label"> + Description : + </text> + <text name="preview_label"> + Prévisualiser comme : + </text> + <combo_box label="Habits" left="126" name="clothing_type_combo"> + <combo_box.item label="Image" name="Image"/> + <combo_box.item label="Cheveux" name="Hair"/> + <combo_box.item label="Tête de femme" name="FemaleHead"/> + <combo_box.item label="Corps de femme (haut)" name="FemaleUpperBody"/> + <combo_box.item label="Corps de femme (bas)" name="FemaleLowerBody"/> + <combo_box.item label="Tête d'homme" name="MaleHead"/> + <combo_box.item label="Corps d'homme (haut)" name="MaleUpperBody"/> + <combo_box.item label="Corps d'homme (bas)" name="MaleLowerBody"/> + <combo_box.item label="Jupe" name="Skirt"/> + <combo_box.item label="Sculptie" name="SculptedPrim"/> + </combo_box> + <text name="bad_image_text"> + Impossible de lire l'image. + +Sauvegardez en Targa 24 bit (.tga). + </text> + <check_box label="Utiliser une compression sans perte" name="lossless_check"/> + <button label="Annuler" name="cancel_btn"/> + <button label="Charger ([AMOUNT] L$)" name="ok_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml index 2885a7e316a..2e982305bf2 100644 --- a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml @@ -1,81 +1,67 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="item properties" title="PROPRIÉTÉS DE L'OBJET DE L'INVENTAIRE"> - <text name="LabelItemNameTitle"> - Nom : - </text> - <text name="LabelItemDescTitle"> - Description : - </text> - <text name="LabelCreatorTitle"> - Créateur : - </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> - <button label="Profil..." label_selected="" name="BtnCreator"/> - <text name="LabelOwnerTitle"> - Propriétaire : - </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> - <button label="Profil..." label_selected="" name="BtnOwner"/> - <text name="LabelAcquiredTitle"> - Acquis : - </text> - <text name="LabelAcquiredDate"> - Wed May 24 12:50:46 2006 - </text> - <text name="OwnerLabel"> - Vous pouvez : - </text> - <check_box label="Modifier" name="CheckOwnerModify"/> - <check_box label="Copier" name="CheckOwnerCopy"/> - <check_box label="Revendre/Donner" name="CheckOwnerTransfer"/> - <text name="BaseMaskDebug"> - B : - </text> - <text name="OwnerMaskDebug"> - O : - </text> - <text name="GroupMaskDebug"> - G : - </text> - <text name="EveryoneMaskDebug"> - E : - </text> - <text name="NextMaskDebug"> - N : - </text> - <check_box label="Partager avec le groupe" name="CheckShareWithGroup"/> - <check_box label="Autoriser tout le monde à copier" name="CheckEveryoneCopy"/> - <text name="NextOwnerLabel" width="192"> - Le prochain propriétaire pourra : - </text> - <check_box label="Modifier" name="CheckNextOwnerModify"/> - <check_box label="Copier" name="CheckNextOwnerCopy"/> - <check_box label="Revendre/Donner" name="CheckNextOwnerTransfer"/> - <text name="SaleLabel"> - Marquer l'objet : - </text> - <check_box label="À vendre" name="CheckPurchase"/> - <radio_group name="RadioSaleType"> - <radio_item name="radio" label="Original" /> - <radio_item name="radio2" label="Copie" /> - </radio_group> - <text name="TextPrice"> - Prix : L$ - </text> - <string name="unknown"> - (inconnu) - </string> - <string name="public"> - (public) - </string> - <string name="you_can"> - Vous pouvez : - </string> - <string name="owner_can"> - Le propriétaire peut : - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="item properties" title="PROPRIÉTÉS DE L'OBJET DE L'INVENTAIRE"> + <floater.string name="unknown"> + (inconnu) + </floater.string> + <floater.string name="public"> + (public) + </floater.string> + <floater.string name="you_can"> + Vous pouvez : + </floater.string> + <floater.string name="owner_can"> + Le propriétaire peut : + </floater.string> + <text name="LabelItemNameTitle"> + Nom : + </text> + <text name="LabelItemDescTitle"> + Description : + </text> + <text name="LabelCreatorTitle"> + Créateur : + </text> + <text name="LabelCreatorName"> + Nicole Linden + </text> + <button label="Profil..." label_selected="" name="BtnCreator"/> + <text name="LabelOwnerTitle"> + Propriétaire : + </text> + <text name="LabelOwnerName"> + Thrax Linden + </text> + <button label="Profil..." label_selected="" name="BtnOwner"/> + <text name="LabelAcquiredTitle"> + Acquis : + </text> + <text name="LabelAcquiredDate"> + Wed May 24 12:50:46 2006 + </text> + <text name="OwnerLabel"> + Vous : + </text> + <check_box label="Éditer" name="CheckOwnerModify"/> + <check_box label="Copier" name="CheckOwnerCopy"/> + <check_box label="Revendre" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + N'importe qui : + </text> + <check_box label="Copier" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + Groupe : + </text> + <check_box label="Partager" name="CheckShareWithGroup"/> + <text name="NextOwnerLabel" width="192"> + Le prochain propriétaire : + </text> + <check_box label="Éditer" name="CheckNextOwnerModify"/> + <check_box label="Copier" name="CheckNextOwnerCopy"/> + <check_box label="Revendre" name="CheckNextOwnerTransfer"/> + <check_box label="À vendre" name="CheckPurchase"/> + <combo_box name="combobox sale copy"> + <combo_box.item label="Copier" name="Copy"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Prix : L$" name="Edit Cost"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_land_holdings.xml b/indra/newview/skins/default/xui/fr/floater_land_holdings.xml index 17adafa8d9f..87fe2a8352e 100644 --- a/indra/newview/skins/default/xui/fr/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/fr/floater_land_holdings.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="MES TERRAINS"> - <scroll_list name="parcel list"> - <column label="Nom de la parcelle" name="name"/> - <column label="Région" name="location"/> - <column label="Type" name="type"/> - <column label="Surface" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="Téléporter" label_selected="Téléporter" name="Teleport" tool_tip="Téléportez-vous au milieu de ce terrain."/> - <button label="Voir sur la carte" label_selected="Voir sur la carte" name="Show on Map" tool_tip="Affichez ce terrain sur la carte du monde."/> - <text name="contrib_label"> - Vos contributions : - </text> - <scroll_list name="grant list"> - <column label="Groupe" name="group"/> - <column label="Surface" name="area"/> - </scroll_list> - <text name="allowed_label"> - Surface de terrain autorisée avec votre compte : - </text> - <text name="allowed_text"> - [AREA] m² - </text> - <text name="current_label"> - Surface occupée actuellement : - </text> - <text name="current_text"> - [AREA] m² - </text> - <text name="available_label"> - Disponible à l'achat : - </text> - <text name="available_text"> - [AREA] m² - </text> - <string name="area_string"> - [AREA] m² - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="land holdings floater" title="MES TERRAINS"> + <scroll_list name="parcel list"> + <column label="Parcelle" name="name"/> + <column label="Région" name="location"/> + <column label="Type" name="type"/> + <column label="Surface" name="area"/> + <column label="" name="hidden"/> + </scroll_list> + <button label="Téléporter" label_selected="Téléporter" name="Teleport" tool_tip="Téléportez-vous au milieu de ce terrain."/> + <button label="Carte" label_selected="Carte" name="Show on Map" tool_tip="Affichez ce terrain sur la carte du monde."/> + <text name="contrib_label"> + Vos contributions : + </text> + <scroll_list name="grant list"> + <column label="Groupe" name="group"/> + <column label="Surface" name="area"/> + </scroll_list> + <text name="allowed_label"> + Surface de terrain autorisée avec votre compte : + </text> + <text name="allowed_text"> + [AREA] m² + </text> + <text name="current_label"> + Surface occupée actuellement : + </text> + <text name="current_text"> + [AREA] m² + </text> + <text name="available_label"> + Disponible à l'achat : + </text> + <text name="available_text"> + [AREA] m² + </text> + <string name="area_string"> + [AREA] m² + </string> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml index 76db22cea43..4879327acee 100644 --- a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml @@ -1,12 +1,15 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="SCRIPT : NOUVEAU SCRIPT"> - <button label="Réinitialiser" label_selected="Réinitialiser" name="Reset" width="100" left="390"/> - <check_box label="Exécution en cours" name="running" left="4"/> - <check_box label="Mono" name="mono" left="130"/> - <string name="not_allowed"> - Vous n'êtes pas autorisé à afficher ce script. - </string> - <string name="script_running"> - Exécution en cours - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script ed float" title="SCRIPT : NOUVEAU SCRIPT"> + <floater.string name="not_allowed"> + Ce scipt ne peut pas être copié, visualisé ou modifié. Pour visualiser ou modifier un script à l'intérieur d'un objet, vous devez avoir les permissions requises. + </floater.string> + <floater.string name="script_running"> + Exécution en cours + </floater.string> + <floater.string name="Title"> + Script : [NAME] + </floater.string> + <button label="Réinitialiser" label_selected="Réinitialiser" left="390" name="Reset" width="100"/> + <check_box initial_value="true" label="Exécution en cours" left="4" name="running"/> + <check_box initial_value="true" label="Mono" left="130" name="mono"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_map.xml b/indra/newview/skins/default/xui/fr/floater_map.xml index ec4bd4ef4ad..de5b707ee49 100644 --- a/indra/newview/skins/default/xui/fr/floater_map.xml +++ b/indra/newview/skins/default/xui/fr/floater_map.xml @@ -1,51 +1,54 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> - <floater.string name="mini_map_north"> - N - </floater.string> - <floater.string name="mini_map_east"> - E - </floater.string> - <floater.string name="mini_map_west"> - O - </floater.string> - <floater.string name="mini_map_south"> - S - </floater.string> - <floater.string name="mini_map_southeast"> - SE - </floater.string> - <floater.string name="mini_map_northeast"> - NE - </floater.string> - <floater.string name="mini_map_southwest"> - SO - </floater.string> - <floater.string name="mini_map_northwest"> - NO - </floater.string> - <text label="N" name="floater_map_north" text="N"> - N - </text> - <text label="E" name="floater_map_east" text="E"> - E - </text> - <text label="O" name="floater_map_west" text="O"> - O - </text> - <text label="S" name="floater_map_south" text="S"> - S - </text> - <text label="SE" name="floater_map_southeast" text="SE"> - SE - </text> - <text label="NE" name="floater_map_northeast" text="NE"> - NE - </text> - <text label="SO" name="floater_map_southwest" text="SO"> - SO - </text> - <text label="NO" name="floater_map_northwest" text="NO"> - NO - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Map"> + <floater.string name="mini_map_north"> + N + </floater.string> + <floater.string name="mini_map_east"> + E + </floater.string> + <floater.string name="mini_map_west"> + O + </floater.string> + <floater.string name="mini_map_south"> + S + </floater.string> + <floater.string name="mini_map_southeast"> + SE + </floater.string> + <floater.string name="mini_map_northeast"> + NE + </floater.string> + <floater.string name="mini_map_southwest"> + SO + </floater.string> + <floater.string name="mini_map_northwest"> + NO + </floater.string> + <floater.string name="ToolTipMsg"> + [AGENT][REGION](Double-cliquez pour ouvrir la carte) + </floater.string> + <text label="N" name="floater_map_north" text="N"> + N + </text> + <text label="E" name="floater_map_east" text="E"> + E + </text> + <text label="O" name="floater_map_west" text="O"> + O + </text> + <text label="S" name="floater_map_south" text="S"> + S + </text> + <text label="SE" name="floater_map_southeast" text="SE"> + SE + </text> + <text label="NE" name="floater_map_northeast" text="NE"> + NE + </text> + <text label="SO" name="floater_map_southwest" text="SO"> + SO + </text> + <text label="NO" name="floater_map_northwest" text="NO"> + NO + </text> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_media_browser.xml b/indra/newview/skins/default/xui/fr/floater_media_browser.xml index 5a787a6bf9d..377b80f847d 100644 --- a/indra/newview/skins/default/xui/fr/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/fr/floater_media_browser.xml @@ -1,20 +1,31 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_about" title="NAVIGATEUR"> - <layout_stack name="stack1"> - <layout_panel name="nav_controls"> - <button label="Précédente" name="back" width="75"/> - <button label="Suivante" left_delta="75" name="forward" width="70"/> - <button label="Rafraîchir" left_delta="75" name="reload"/> - <combo_box left_delta="75" name="address" width="510"/> - <button label="OK" left_delta="515" name="go"/> - </layout_panel> - <layout_panel name="parcel_owner_controls"> - <button label="Envoyer l'URL sur la parcelle" name="assign"/> - </layout_panel> - <layout_panel name="external_controls"> - <button label="Ouvrir dans mon navigateur web" name="open_browser" width="196"/> - <check_box label="Toujours ouvrir dans mon navigateur web" left_delta="201" name="open_always"/> - <button label="Fermer" name="close"/> - </layout_panel> - </layout_stack> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="NAVIGATEUR"> + <floater.string name="home_page_url"> + http://www.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://support.secondlife.com + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="Précédente" name="back" width="75"/> + <button label="Suivante" left_delta="75" name="forward" width="70"/> + <button label="Rafraîchir" left_delta="75" name="reload"/> + <combo_box left_delta="75" name="address" width="510"/> + <button label="OK" left_delta="515" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="en arrière" name="rewind"/> + <button label="stop" name="stop"/> + <button label="en avant" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="Envoyer l'URL sur la parcelle" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="Ouvrir dans mon navigateur web" name="open_browser" width="196"/> + <check_box label="Toujours ouvrir dans mon navigateur web" left_delta="201" name="open_always"/> + <button label="Fermer" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml index e62aad6cd38..aadf16ab8ae 100644 --- a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml @@ -1,18 +1,18 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="MemLeak" title="SIMULATION FUITE MÉMOIRE"> - <spinner label="Vitesse de la fuite (octets) :" name="leak_speed" /> - <spinner label="Max mémoire perdue (Mo) :" name="max_leak" /> - <text name="total_leaked_label"> - Mémoire perdue actuelle : [SIZE] Ko - </text> - <text name="note_label_1"> - [NOTE1] - </text> - <text name="note_label_2"> - [NOTE2] - </text> - <button label="Commencer" name="start_btn" width="85"/> - <button label="Stop" name="stop_btn" left="100"/> - <button label="Libérer" name="release_btn" left="177"/> - <button label="Fermer" name="close_btn" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="MemLeak" title="Simuler une fuite de mémoire"> + <spinner label="Vitesse de la fuite (octets) :" name="leak_speed"/> + <spinner label="Max mémoire perdue (Mo) :" name="max_leak"/> + <text name="total_leaked_label"> + Mémoire perdue actuelle : [SIZE] Ko + </text> + <text name="note_label_1"> + [NOTE1] + </text> + <text name="note_label_2"> + [NOTE2] + </text> + <button label="Commencer" name="start_btn" width="85"/> + <button label="Stop" left="100" name="stop_btn"/> + <button label="Libérer" left="177" name="release_btn"/> + <button label="Fermer" name="close_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_moveview.xml b/indra/newview/skins/default/xui/fr/floater_moveview.xml index e59f09cba1c..7e7dc53c6c8 100644 --- a/indra/newview/skins/default/xui/fr/floater_moveview.xml +++ b/indra/newview/skins/default/xui/fr/floater_moveview.xml @@ -1,14 +1,35 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="move_floater"> -<panel name="panel_actions"> - <button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche"/> - <button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite"/> - <button label="" label_selected="" name="move up btn" tool_tip="Sauter ou voler vers le haut"/> - <button label="" label_selected="" name="move down btn" tool_tip="S'accroupir ou voler vers le bas"/> - <button label="Voler" label_selected="Voler" name="fly btn" tool_tip="Démarrer/arrêter le vol"/> - <joystick_slide name="slide left btn" tool_tip="Se déplacer vers la gauche"/> - <joystick_slide name="slide right btn" tool_tip="Se déplacer vers la droite"/> - <joystick_turn name="forward btn" tool_tip="Se déplacer vers l'avant"/> - <joystick_turn name="backward btn" tool_tip="Se déplacer vers l'arrière"/> -</panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="move_floater"> + <string name="walk_forward_tooltip"> + Vous déplacer vers l'avant (appuyer sur la flèche vers le haut ou W) + </string> + <string name="walk_back_tooltip"> + Marcher en arrière (appuyer sur la flèche vers le bas ou S) + </string> + <string name="run_forward_tooltip"> + Courir vers l'avant (appuyer sur la flèche vers le haut ou W) + </string> + <string name="run_back_tooltip"> + Courir en arrière (appuyer sur la flèche vers le bas ou S) + </string> + <string name="fly_forward_tooltip"> + Voler vers l'avant (appuyer sur la flèche vers le haut ou W) + </string> + <string name="fly_back_tooltip"> + Voler vers l'arrière (appuyer sur la flèche vers le bas ou S) + </string> + <panel name="panel_actions"> + <button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche (appuyer sur la flèche de gauche ou sur A)"/> + <button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite (appuyer sur la flèche de droite ou sur D)"/> + <button label="" label_selected="" name="move up btn" tool_tip="Vous envoler, appuyer sur E"/> + <button label="" label_selected="" name="move down btn" tool_tip="Atterrir, appuyer sur C"/> + <joystick_turn name="forward btn" tool_tip="Vous déplacer vers l'avant (appuyer sur la flèche vers le haut ou W)"/> + <joystick_turn name="backward btn" tool_tip="Marcher en arrière (appuyer sur la flèche vers le bas ou S)"/> + </panel> + <panel name="panel_modes"> + <button label="" name="mode_walk_btn" tool_tip="Mode marche"/> + <button label="" name="mode_run_btn" tool_tip="Mode courir"/> + <button label="" name="mode_fly_btn" tool_tip="Mode voler"/> + <button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_pay.xml b/indra/newview/skins/default/xui/fr/floater_pay.xml index b66ea79e7b6..5432cb27d0a 100644 --- a/indra/newview/skins/default/xui/fr/floater_pay.xml +++ b/indra/newview/skins/default/xui/fr/floater_pay.xml @@ -1,22 +1,20 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Give Money" title=""> - <button label="1 L$" label_selected="1 L$" name="fastpay 1"/> - <button label="5 L$" label_selected="5 L$" name="fastpay 5"/> - <button label="10 L$" label_selected="10 L$" name="fastpay 10"/> - <button label="20 L$" label_selected="20 L$" name="fastpay 20"/> - <button label="Payer" label_selected="Payer" name="pay btn"/> - <button label="Annuler" label_selected="Annuler" name="cancel btn"/> - <text name="payee_label" left="5"> - Payer : - </text> - <text name="payee_name"> - [FIRST] [LAST] - </text> - <text name="fastpay text" width="100" halign="left"> - Paiement rapide : - </text> - <text left="4" name="amount text"> - Montant : - </text> - <line_editor left="60" name="amount" width="55"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Give Money" title=""> + <text left="5" name="payee_label"> + Payer : + </text> + <icon name="icon_person" tool_tip="Résident"/> + <text name="payee_name"> + [FIRST] [LAST] + </text> + <button label="1 L$" label_selected="1 L$" name="fastpay 1"/> + <button label="5 L$" label_selected="5 L$" name="fastpay 5"/> + <button label="10 L$" label_selected="10 L$" name="fastpay 10"/> + <button label="20 L$" label_selected="20 L$" name="fastpay 20"/> + <text left="4" name="amount text"> + Ou choisissez un montant : + </text> + <line_editor left="60" name="amount" width="55"/> + <button label="Payer" label_selected="Payer" name="pay btn"/> + <button label="Annuler" label_selected="Annuler" name="cancel btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_pay_object.xml b/indra/newview/skins/default/xui/fr/floater_pay_object.xml index 077e6965b61..04511f5ba02 100644 --- a/indra/newview/skins/default/xui/fr/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/fr/floater_pay_object.xml @@ -1,31 +1,30 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Give Money" title=""> - <text name="payee_group" width="95"> - Payer le groupe : - </text> - <text name="payee_resident" width="100" halign="left" > - Payer le résident : - </text> - <text name="payee_name" left="105"> - [FIRST] [LAST] - </text> - <text name="object_name_label" left="25"> - Via un objet : - </text> - <text name="object_name_text" left="105"> - ... - </text> - <text name="fastpay text" width="95"> - Paiement rapide : - </text> - <text name="amount text" left="5" halign="left"> - Montant : - </text> - <button label="1 L$" label_selected="1 L$" name="fastpay 1" left="105" /> - <button label="5 L$" label_selected="5 L$" name="fastpay 5" left="190"/> - <button label="10 L$" label_selected="10 L$" name="fastpay 10" left="105" /> - <button label="20 L$" label_selected="20 L$" name="fastpay 20" left="190"/> - <button label="Payer" label_selected="Payer" name="pay btn"/> - <button label="Annuler" label_selected="Annuler" name="cancel btn"/> - <line_editor left="65" name="amount" width="50" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Give Money" title=""> + <string name="payee_group" width="95"> + Payer le groupe : + </string> + <string halign="left" name="payee_resident" width="100"> + Payer le résident : + </string> + <icon name="icon_person" tool_tip="Résident"/> + <text left="105" name="payee_name"> + [FIRST] [LAST] + </text> + <text left="25" name="object_name_label"> + Via un objet : + </text> + <icon name="icon_object" tool_tip="Objets"/> + <text left="105" name="object_name_text"> + ... + </text> + <button label="1 L$" label_selected="1 L$" left="105" name="fastpay 1"/> + <button label="5 L$" label_selected="5 L$" left="190" name="fastpay 5"/> + <button label="10 L$" label_selected="10 L$" left="105" name="fastpay 10"/> + <button label="20 L$" label_selected="20 L$" left="190" name="fastpay 20"/> + <text halign="left" left="5" name="amount text"> + Ou choisissez un montant : + </text> + <line_editor left="65" name="amount" width="50"/> + <button label="Payer" label_selected="Payer" name="pay btn"/> + <button label="Annuler" label_selected="Annuler" name="cancel btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml index 813e6116217..b7d3eb0a799 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml @@ -1,10 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview_anim"> - <text name="desc txt"> - Description : - </text> - <button label="Jouer dans le Monde" label_selected="Stop" name="Anim play btn" - tool_tip="Jouer cette animation et partagez-la avec d'autres." width="131" left="20"/> - <button label="Jouer localement" label_selected="Stop" name="Anim audition btn" - tool_tip="Jouer cette animation et soyez le seul à la voir." width="125" left="162"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_anim"> + <floater.string name="Title"> + Animation : [NAME] + </floater.string> + <text name="desc txt"> + Description : + </text> + <button label="Jouer dans le Monde" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Jouer cette animation et partagez-la avec d'autres." width="131"/> + <button label="Jouer localement" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Jouer cette animation et soyez le seul à la voir." width="125"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_classified.xml b/indra/newview/skins/default/xui/fr/floater_preview_classified.xml index 436a386dc8e..a50a4057f8d 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_classified.xml @@ -1,2 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="classified_preview" title="INFORMATIONS SUR LA PETITE ANNONCE" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="classified_preview" title="INFORMATIONS SUR LA PETITE ANNONCE"> + <floater.string name="Title"> + Petite annonce : [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_event.xml b/indra/newview/skins/default/xui/fr/floater_preview_event.xml index 30eeeec70db..b901751eecf 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_event.xml @@ -1,2 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="event_preview" title="INFORMATIONS SUR L'ÉVÉNEMENT" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="event_preview" title="INFORMATIONS SUR L'ÉVÉNEMENT"> + <floater.string name="Title"> + Événement : [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml new file mode 100644 index 00000000000..e6a4514460b --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="Raccourci du geste"/> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml new file mode 100644 index 00000000000..e6a4514460b --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="Raccourci du geste"/> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml index ea524422369..1039760623e 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml @@ -1,16 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview notecard" title="REMARQUE :"> - <button label="Enregistrer" label_selected="Enregistrer" name="Save" /> - <text name="desc txt"> - Description : - </text> - <text_editor name="Notecard Editor"> - Chargement... - </text_editor> - <string name="no_object"> - Impossible de trouver l'objet contenant cette note. - </string> - <string name="not_allowed"> - Vous n'êtes pas autorisé à afficher cette note. - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview notecard" title="REMARQUE :"> + <floater.string name="no_object"> + Impossible de trouver l'objet contenant cette note. + </floater.string> + <floater.string name="not_allowed"> + Vous n'avez pas le droit de voir cette note. + </floater.string> + <floater.string name="Title"> + Note : [NAME] + </floater.string> + <floater.string label="Enregistrer" label_selected="Enregistrer" name="Save"> + Enregistrer + </floater.string> + <text name="desc txt"> + Description : + </text> + <text_editor name="Notecard Editor"> + Chargement... + </text_editor> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_sound.xml b/indra/newview/skins/default/xui/fr/floater_preview_sound.xml index 19ae28c4630..d1729ac8dfe 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_sound.xml @@ -1,12 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview_sound"> - <text name="desc txt"> - Description : - </text> - <button label="Jouer dans le Monde" label_selected="Jouer dans le Monde" - name="Sound play btn" - tool_tip="Jouer ce son et partagez-le avec d'autres." width="131" left_delta="-142"/> - <button label="Jouer localement" label_selected="Jouer localement" - name="Sound audition btn" - tool_tip="Jouer ce son et soyez le seul à l'entendre." width="125" left="162"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_sound"> + <floater.string name="Title"> + Son : [NAME] + </floater.string> + <text name="desc txt"> + Description : + </text> + <button label="Jouer dans le Monde" label_selected="Jouer dans le Monde" left_delta="-142" name="Sound play btn" tool_tip="Jouer ce son et partagez-le avec d'autres." width="131"/> + <button label="Jouer localement" label_selected="Jouer localement" left="162" name="Sound audition btn" tool_tip="Jouer ce son et soyez le seul à l'entendre." width="125"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_texture.xml b/indra/newview/skins/default/xui/fr/floater_preview_texture.xml index e5fd5fc78f8..beebebfd4da 100644 --- a/indra/newview/skins/default/xui/fr/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/fr/floater_preview_texture.xml @@ -1,9 +1,17 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview_texture"> - <text name="desc txt"> - Description : - </text> - <text name="dimensions"> - Dimensions : [WIDTH] x [HEIGHT] - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_texture"> + <floater.string name="Title"> + Texture : [NAME] + </floater.string> + <floater.string name="Copy"> + Copier dans l'inventaire + </floater.string> + <text name="desc txt"> + Description : + </text> + <button label="Enregistrer" name="Keep"/> + <button label="Supprimer" name="Discard"/> + <text name="dimensions"> + [WIDTH]px x [HEIGHT]px + </text> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml index be97165a3e9..6335e41babb 100644 --- a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml @@ -1,144 +1,104 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="SIGNALER UNE INFRACTION"> - <texture_picker label="" name="screenshot"/> - <check_box label="Inclure une capture d'écran" name="screen_check"/> - <text name="reporter_title" width="60"> - Déposant : - </text> - <text name="reporter_field"> - Loremipsum Dolorsitamut - </text> - <text name="sim_title"> - Région : - </text> - <text name="sim_field"> - Nom de la région - </text> - <text name="pos_title"> - Position : - </text> - <text name="pos_field"> - {128.1, 128.1, 15.4} - </text> - <text name="select_object_label"> - Cliquez sur le bouton puis l'objet : - </text> - <button label="" label_selected="" name="pick_btn" tool_tip="Le sélecteur d'objet vous permet d'identifier un objet comme sujet du rapport."/> - <text name="object_name_label"> - Nom : - </text> - <text left_delta="70" name="object_name" width="105"> - Consetetur Sadipscing - </text> - <text name="owner_name_label" width="66"> - Propriétaire : - </text> - <text left_delta="70" name="owner_name" width="105"> - Hendrerit Vulputate - </text> - <combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport"> - <combo_box.item name="Select_category" label="Sélectionnez une catégorie" - /> - <combo_box.item name="Age__Age_play" label="Âge > « Age play »" - /> - <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Âge > Résident adulte sur Second Life pour adolescents" - /> - <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Âge > Resident mineur en dehors de Teen Second Life" - /> - <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Assaut > Bac à sable utilisé pour des combats/zone non sécurisée" - /> - <combo_box.item name="Assault__Safe_area" label="Assaut > Zone sécurisée" - /> - <combo_box.item name="Assault__Weapons_testing_sandbox" label="Assaut > Bac à sable pour tests d'armes à feu" - /> - <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Commerce > Incapacité à fournir un produit ou service" - /> - <combo_box.item name="Disclosure__Real_world_information" label="Divulgation > Informations sur la vie réelle" - /> - <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Divulgation > Écoute d'un chat à distance" - /> - <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Divulgation > Informations sur Second Life/chat/IM" - /> - <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Trouble de la paix > Utilisation inadéquate des ressources de la région" - /> - <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Trouble de la paix > Nombre d'objets scriptés excessif" - /> - <combo_box.item name="Disturbing_the_peace__Object_littering" label="Trouble de la paix > Abandon d'objets" - /> - <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Trouble de la paix > Spam à répétition" - /> - <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Trouble de la paix > Spam à caractère commercial" - /> - <combo_box.item name="Fraud__L$" label="Fraude > L$" - /> - <combo_box.item name="Fraud__Land" label="Fraude > Terrain" - /> - <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Fraude > Vente pyramidale ou lettre-chaîne" - /> - <combo_box.item name="Fraud__US$" label="Fraude > US$" - /> - <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Harcèlement > Spam visuel" - /> - <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Harcèlement > Diffamation envers des individus ou des groupes" - /> - <combo_box.item name="Harassment__Impeding_movement" label="Harcèlement > Immobilisation" - /> - <combo_box.item name="Harassment__Sexual_harassment" label="Harcèlement > Harcèlement sexuel" - /> - <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Harcèlement > Incitation à enfreindre les Conditions d'utilisation" - /> - <combo_box.item name="Harassment__Verbal_abuse" label="Harcèlement > Abus verbal" - /> - <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Indécence > Contenu ou comportement offensifs" - /> - <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Indécence > Nom d'avatar inapproprié" - /> - <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Indécence > Contenu ou conduite inappropriés dans une région PG" - /> - <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Indécence > Contenu ou conduite inappropriés dans une région Mature" - /> - <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Violation de droits de propriété intellectuelle > Suppression de contenu" - /> - <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Violation de droits de propriété intellectuelle > CopyBot ou exploitation abusive des droits" - /> - <combo_box.item name="Intolerance" label="Intolérance" - /> - <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Terrain > Utilisation abusive des ressources du bac à sable" - /> - <combo_box.item name="Land__Encroachment__Objects_textures" label="Terrain > Empiètement > Objets/textures" - /> - <combo_box.item name="Land__Encroachment__Particles" label="Terrain > Empiètement > Particules" - /> - <combo_box.item name="Land__Encroachment__Trees_plants" label="Terrain > Empiètement > Arbres/plantes" - /> - <combo_box.item name="Wagering_gambling" label="Paris/jeux d'argent" - /> - <combo_box.item name="Other" label="Autre" - /> - </combo_box> - <text name="abuser_name_title"> - Nom du contrevenant : - </text> - <button label="Choisir le résident" label_selected="" name="select_abuser" tool_tip="Sélectionnez le nom du résident dans une liste"/> - <check_box label="Ne connaît pas le nom du contrevenant" name="omit_abuser_name" tool_tip="Cochez cette case si vous ne connaissez pas le nom du contrevenant"/> - <text name="abuser_name_title2"> - Indiquez où l'infraction a eu lieu : - </text> - <text name="sum_title"> - Récapitulatif : - </text> - <text name="dscr_title"> - Détails : - </text> - <text name="bug_aviso"> - Indiquez la date, le lieu, la nature de l'infraction, ainsi que -tout chat ou IM relatif à l'infraction, en étant aussi précis -que possible. Pensez à indiquer un objet si possible. - </text> - <text bottom_delta="-16" name="incomplete_title"> - Remarque : les rapports incomplets ne feront pas l'objet d'une -enquête. - </text> - <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> - <button label="Signaler une infraction" label_selected="Signaler une infraction" name="send_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_report_abuse" title="SIGNALER UNE INFRACTION"> + <floater.string name="Screenshot"> + Capture d'écran + </floater.string> + <check_box label="Utiliser cette capture d'écran" name="screen_check"/> + <text name="reporter_title" width="60"> + Déposant : + </text> + <text name="reporter_field"> + Loremipsum Dolorsitamut + </text> + <text name="sim_title"> + Région : + </text> + <text name="sim_field"> + Nom de la région + </text> + <text name="pos_title"> + Position : + </text> + <text name="pos_field"> + {128.1, 128.1, 15.4} + </text> + <text name="select_object_label"> + Cliquez sur le bouton puis l'objet responsable : + </text> + <button label="" label_selected="" name="pick_btn" tool_tip="Le sélecteur d'objet vous permet d'identifier un objet comme sujet du rapport."/> + <text name="object_name_label"> + Objet : + </text> + <text left_delta="70" name="object_name" width="105"> + Consetetur Sadipscing + </text> + <text name="owner_name_label" width="66"> + Propriétaire : + </text> + <text left_delta="70" name="owner_name" width="105"> + Hendrerit Vulputate + </text> + <combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport"> + <combo_box.item label="Sélectionnez une catégorie" name="Select_category"/> + <combo_box.item label="Âge > « Age play »" name="Age__Age_play"/> + <combo_box.item label="Âge > Résident adulte sur Second Life pour adolescents" name="Age__Adult_resident_on_Teen_Second_Life"/> + <combo_box.item label="Âge > Resident mineur en dehors de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> + <combo_box.item label="Assaut > Bac à sable utilisé pour des combats/zone non sécurisée" name="Assault__Combat_sandbox___unsafe_area"/> + <combo_box.item label="Assaut > Zone sécurisée" name="Assault__Safe_area"/> + <combo_box.item label="Assaut > Bac à sable pour tests d'armes à feu" name="Assault__Weapons_testing_sandbox"/> + <combo_box.item label="Commerce > Incapacité à fournir un produit ou service" name="Commerce__Failure_to_deliver_product_or_service"/> + <combo_box.item label="Divulgation > Informations sur la vie réelle" name="Disclosure__Real_world_information"/> + <combo_box.item label="Divulgation > Écoute d'un chat à distance" name="Disclosure__Remotely_monitoring chat"/> + <combo_box.item label="Divulgation > Informations sur Second Life/chat/IM" name="Disclosure__Second_Life_information_chat_IMs"/> + <combo_box.item label="Trouble de la paix > Utilisation inadéquate des ressources de la région" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> + <combo_box.item label="Trouble de la paix > Nombre d'objets scriptés excessif" name="Disturbing_the_peace__Excessive_scripted_objects"/> + <combo_box.item label="Trouble de la paix > Abandon d'objets" name="Disturbing_the_peace__Object_littering"/> + <combo_box.item label="Trouble de la paix > Spam à répétition" name="Disturbing_the_peace__Repetitive_spam"/> + <combo_box.item label="Trouble de la paix > Spam à caractère commercial" name="Disturbing_the_peace__Unwanted_advert_spam"/> + <combo_box.item label="Fraude > L$" name="Fraud__L$"/> + <combo_box.item label="Fraude > Terrain" name="Fraud__Land"/> + <combo_box.item label="Fraude > Vente pyramidale ou lettre-chaîne" name="Fraud__Pyramid_scheme_or_chain_letter"/> + <combo_box.item label="Fraude > US$" name="Fraud__US$"/> + <combo_box.item label="Harcèlement > Spam visuel" name="Harassment__Advert_farms___visual_spam"/> + <combo_box.item label="Harcèlement > Diffamation envers des individus ou des groupes" name="Harassment__Defaming_individuals_or_groups"/> + <combo_box.item label="Harcèlement > Immobilisation" name="Harassment__Impeding_movement"/> + <combo_box.item label="Harcèlement > Harcèlement sexuel" name="Harassment__Sexual_harassment"/> + <combo_box.item label="Harcèlement > Incitation à enfreindre les Conditions d'utilisation" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> + <combo_box.item label="Harcèlement > Abus verbal" name="Harassment__Verbal_abuse"/> + <combo_box.item label="Indécence > Contenu ou comportement offensifs" name="Indecency__Broadly_offensive_content_or_conduct"/> + <combo_box.item label="Indécence > Nom d'avatar inapproprié" name="Indecency__Inappropriate_avatar_name"/> + <combo_box.item label="Indécence > Contenu ou conduite inappropriés dans une région PG" name="Indecency__Mature_content_in_PG_region"/> + <combo_box.item label="Indécence > Contenu ou conduite inappropriés dans une région Mature" name="Indecency__Inappropriate_content_in_Mature_region"/> + <combo_box.item label="Violation de droits de propriété intellectuelle > Suppression de contenu" name="Intellectual_property_infringement_Content_Removal"/> + <combo_box.item label="Violation de droits de propriété intellectuelle > CopyBot ou exploitation abusive des droits" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> + <combo_box.item label="Intolérance" name="Intolerance"/> + <combo_box.item label="Terrain > Utilisation abusive des ressources du bac à sable" name="Land__Abuse_of_sandbox_resources"/> + <combo_box.item label="Terrain > Empiètement > Objets/textures" name="Land__Encroachment__Objects_textures"/> + <combo_box.item label="Terrain > Empiètement > Particules" name="Land__Encroachment__Particles"/> + <combo_box.item label="Terrain > Empiètement > Arbres/plantes" name="Land__Encroachment__Trees_plants"/> + <combo_box.item label="Paris/jeux d'argent" name="Wagering_gambling"/> + <combo_box.item label="Autre" name="Other"/> + </combo_box> + <text name="abuser_name_title"> + Nom du contrevenant : + </text> + <button label="Choisir" label_selected="" name="select_abuser" tool_tip="Sélectionnez le nom du résident dans une liste"/> + <text name="abuser_name_title2"> + Indiquez où l'infraction a eu lieu : + </text> + <text name="sum_title"> + Récapitulatif : + </text> + <text name="dscr_title"> + Détails : + </text> + <text name="bug_aviso"> + Soyez aussi spécifique que possible + </text> + <text bottom_delta="-16" name="incomplete_title"> + Remarque : les rapports incomplets ne feront pas l'objet d'une +enquête. + </text> + <button label="Signaler une infraction" label_selected="Signaler une infraction" name="send_btn"/> + <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml new file mode 100644 index 00000000000..fc805e879b8 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_script_debug_panel.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script" short_title="[All scripts]" title="[All scripts]"/> diff --git a/indra/newview/skins/default/xui/fr/floater_script_preview.xml b/indra/newview/skins/default/xui/fr/floater_script_preview.xml index 43541e8de31..dbd3558c190 100644 --- a/indra/newview/skins/default/xui/fr/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_script_preview.xml @@ -1,6 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview lsl text" title="SCRIPT : SCRIPT DE ROTATION"> - <text name="desc txt"> - Description : - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview lsl text" title="SCRIPT : SCRIPT DE ROTATION"> + <floater.string name="Title"> + Script : [NAME] + </floater.string> + <text name="desc txt"> + Description : + </text> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_script_queue.xml b/indra/newview/skins/default/xui/fr/floater_script_queue.xml index d5f39e7acef..dbbe2539dc7 100644 --- a/indra/newview/skins/default/xui/fr/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/fr/floater_script_queue.xml @@ -1,4 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="queue" title="RÉINITIALISER PROGRESSION"> - <button label="Fermer" label_selected="Fermer" name="close" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="queue" title="RÉINITIALISER PROGRESSION"> + <floater.string name="Starting"> + Début du [START] sur [COUNT] objets. + </floater.string> + <floater.string name="Done"> + Fini. + </floater.string> + <floater.string name="Resetting"> + Réinitialisation + </floater.string> + <floater.string name="Running"> + Exécution en cours + </floater.string> + <floater.string name="NotRunning"> + Arrêt + </floater.string> + <button label="Fermer" label_selected="Fermer" name="close"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_sell_land.xml b/indra/newview/skins/default/xui/fr/floater_sell_land.xml index 81c3ccc79ab..2ded68309c5 100644 --- a/indra/newview/skins/default/xui/fr/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_sell_land.xml @@ -1,66 +1,66 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="sell land" title="VENDRE TERRAIN"> - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <text name="info_parcel_label"> - Parcelle : - </text> - <text name="info_parcel"> - PARCEL NAME - </text> - <text name="info_size_label"> - Taille : - </text> - <text name="info_size"> - [AREA] m² - </text> - <text name="info_action" bottom_delta="-60"> - Pour vendre cette -parcelle : - </text> - <icon bottom_delta="-86" name="step_price" /> - <text name="price_label"> - Votre prix de vente : - </text> - <text name="price_text"> - Fixez un prix convenable pour ce terrain. - </text> - <text name="price_ld"> - L$ - </text> - <text name="price_per_m"> - ([PER_METER] L$ par mètre carré) - </text> - <text name="sell_to_label"> - Vos acheteurs : - </text> - <text name="sell_to_text"> - Vendez votre terrain à n'importe qui ou uniquement à un acheteur -spécifique. - </text> - <combo_box name="sell_to" bottom_delta="-32"> - <combo_box.item name="--selectone--" label="Sélectionnez --" /> - <combo_box.item name="Anyone" label="N'importe qui" /> - <combo_box.item name="Specificuser:" label="Acheteur spécifique :" /> - </combo_box> - <button label="Sélectionner..." name="sell_to_select_agent" width="100"/> - <text name="sell_objects_label"> - Vendez-vous des objets avec ce terrain ? - </text> - <text name="sell_objects_text"> - Les objets transférables se trouvant sur la parcelle changeront -de propriétaire. - </text> - <radio_group name="sell_objects" right="430" bottom_delta="-54"> - <radio_item name="no" label="Non, rester le propriétaire des objets" /> - <radio_item name="yes" label="Oui, vendre les objets avec le terrain" /> - </radio_group> - <button label="Afficher les objets" name="show_objects" right="420" width="120"/> - <text name="nag_message_label" bottom_delta="-30"> - Rappel : toute vente est définitive. - </text> - <button label="Mettre le terrain en vente" name="sell_btn" width="165"/> - <button label="Annuler" name="cancel_btn"/> - </panel> - </scroll_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="sell land" title="VENDRE TERRAIN"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="info_parcel_label"> + Parcelle : + </text> + <text name="info_parcel"> + PARCEL NAME + </text> + <text name="info_size_label"> + Taille : + </text> + <text name="info_size"> + [AREA] m² + </text> + <text bottom_delta="-60" name="info_action"> + Pour vendre cette +parcelle : + </text> + <icon bottom_delta="-86" name="step_price"/> + <text name="price_label"> + Votre prix de vente : + </text> + <text name="price_text"> + Fixez un prix convenable. + </text> + <text name="price_ld"> + L$ + </text> + <text name="price_per_m"> + ([PER_METER] L$ par mètre carré) + </text> + <text name="sell_to_label"> + Vos acheteurs : + </text> + <text name="sell_to_text"> + Vendez votre terrain à n'importe qui ou uniquement à un acheteur +spécifique. + </text> + <combo_box bottom_delta="-32" name="sell_to"> + <combo_box.item label="Sélectionnez --" name="--selectone--"/> + <combo_box.item label="N'importe qui" name="Anyone"/> + <combo_box.item label="Personne spécifique :" name="Specificuser:"/> + </combo_box> + <button label="Sélectionner..." name="sell_to_select_agent" width="100"/> + <text name="sell_objects_label"> + Vendez-vous des objets avec ce terrain ? + </text> + <text name="sell_objects_text"> + Les objets transférables se trouvant sur la parcelle changeront +de propriétaire. + </text> + <radio_group bottom_delta="-54" name="sell_objects" right="430"> + <radio_item label="Non, rester le propriétaire des objets" name="no"/> + <radio_item label="Oui, vendre les objets avec le terrain" name="yes"/> + </radio_group> + <button label="Afficher les objets" name="show_objects" right="420" width="120"/> + <text bottom_delta="-30" name="nag_message_label"> + Rappel : toute vente est définitive. + </text> + <button label="Mettre le terrain en vente" name="sell_btn" width="165"/> + <button label="Annuler" name="cancel_btn"/> + </panel> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml index f0781d0b321..3550d8c86f6 100644 --- a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml @@ -1,13 +1,13 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="settings_debug" title="PARAMÉTRAGES DU MODE DEBUG"> - <combo_box name="boolean_combo"> - <combo_box.item name="TRUE" label="TRUE" /> - <combo_box.item name="FALSE" label="FALSE" /> - </combo_box> - <color_swatch label="Couleur" name="color_swatch" width="43" /> - <spinner label="x" name="val_spinner_1" /> - <spinner label="x" name="val_spinner_2" /> - <spinner label="x" name="val_spinner_3" /> - <spinner label="x" name="val_spinner_4" /> - <button label="Paramètres par défaut" name="default_btn" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="settings_debug" title="PARAMÉTRAGES DU MODE DEBUG"> + <combo_box name="boolean_combo"> + <combo_box.item label="TRUE" name="TRUE"/> + <combo_box.item label="FALSE" name="FALSE"/> + </combo_box> + <color_swatch label="Couleur" name="val_color_swatch"/> + <spinner label="x" name="val_spinner_1"/> + <spinner label="x" name="val_spinner_2"/> + <spinner label="x" name="val_spinner_3"/> + <spinner label="x" name="val_spinner_4"/> + <button label="Paramètres par défaut" name="default_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_stats.xml b/indra/newview/skins/default/xui/fr/floater_stats.xml new file mode 100644 index 00000000000..5d5e3213ca2 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_stats.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Statistics" title="Statistiques"> + <scroll_container name="statistics_scroll"> + <container_view name="statistics_view"> + <stat_view label="Basic" name="basic"> + <stat_bar label="FPS" name="fps"/> + <stat_bar label="Bandwidth" name="bandwidth"/> + <stat_bar label="Packet Loss" name="packet_loss"/> + <stat_bar label="Ping Sim" name="ping"/> + </stat_view> + <stat_view label="Advanced" name="advanced"> + <stat_view label="Render" name="render"> + <stat_bar label="KTris Drawn" name="ktrisframe"/> + <stat_bar label="KTris Drawn" name="ktrissec"/> + <stat_bar label="Total Objects" name="objs"/> + <stat_bar label="New Objects" name="newobjs"/> + </stat_view> + <stat_view label="Texture" name="texture"> + <stat_bar label="Count" name="numimagesstat"/> + <stat_bar label="Raw Count" name="numrawimagesstat"/> + <stat_bar label="GL Mem" name="gltexmemstat"/> + <stat_bar label="Formatted Mem" name="formattedmemstat"/> + <stat_bar label="Raw Mem" name="rawmemstat"/> + <stat_bar label="Bound Mem" name="glboundmemstat"/> + </stat_view> + <stat_view label="Network" name="network"> + <stat_bar label="Packets In" name="packetsinstat"/> + <stat_bar label="Packets Out" name="packetsoutstat"/> + <stat_bar label="Objects" name="objectkbitstat"/> + <stat_bar label="Texture" name="texturekbitstat"/> + <stat_bar label="Asset" name="assetkbitstat"/> + <stat_bar label="Layers" name="layerskbitstat"/> + <stat_bar label="Actual In" name="actualinkbitstat"/> + <stat_bar label="Actual Out" name="actualoutkbitstat"/> + <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/> + </stat_view> + </stat_view> + <stat_view label="Simulator" name="sim"> + <stat_bar label="Time Dilation" name="simtimedilation"/> + <stat_bar label="Sim FPS" name="simfps"/> + <stat_bar label="Physics FPS" name="simphysicsfps"/> + <stat_view label="Physics Details" name="physicsdetail"> + <stat_bar label="Pinned Objects" name="physicspinnedtasks"/> + <stat_bar label="Low LOD Objects" name="physicslodtasks"/> + <stat_bar label="Memory Allocated" name="physicsmemoryallocated"/> + <stat_bar label="Agent Updates/Sec" name="simagentups"/> + <stat_bar label="Main Agents" name="simmainagents"/> + <stat_bar label="Child Agents" name="simchildagents"/> + <stat_bar label="Objets" name="simobjects"/> + <stat_bar label="Active Objects" name="simactiveobjects"/> + <stat_bar label="Active Scripts" name="simactivescripts"/> + <stat_bar label="Script Events" name="simscripteps"/> + <stat_bar label="Packets In" name="siminpps"/> + <stat_bar label="Packets Out" name="simoutpps"/> + <stat_bar label="Pending Downloads" name="simpendingdownloads"/> + <stat_bar label="Pending Uploads" name="simpendinguploads"/> + <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/> + </stat_view> + <stat_view label="Time (ms)" name="simperf"> + <stat_bar label="Total Frame Time" name="simframemsec"/> + <stat_bar label="Net Time" name="simnetmsec"/> + <stat_bar label="Physics Time" name="simsimphysicsmsec"/> + <stat_bar label="Simulation Time" name="simsimothermsec"/> + <stat_bar label="Agent Time" name="simagentmsec"/> + <stat_bar label="Images Time" name="simimagesmsec"/> + <stat_bar label="Script Time" name="simscriptmsec"/> + </stat_view> + </stat_view> + </container_view> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index 3638c3fb425..5ded9a1de4e 100644 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -1,513 +1,479 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="CONSTRUIRE"> - <button label="" label_selected="" name="button focus" tool_tip="Mise au point"/> - <button label="" label_selected="" name="button move" tool_tip="Déplacer"/> - <button label="" label_selected="" name="button edit" tool_tip="Modifier"/> - <button label="" label_selected="" name="button create" tool_tip="Créer"/> - <button label="" label_selected="" name="button land" tool_tip="Terrain"/> - <radio_group name="focus_radio_group"> - <radio_item label="Zoom" name="radio zoom"/> - <radio_item label="Orbite (Ctrl)" name="radio orbit"/> - <radio_item label="Panoramique (Ctrl-Maj)" name="radio pan"/> - </radio_group> - <radio_group name="move_radio_group"> - <radio_item label="Déplacer" name="radio move"/> - <radio_item label="Orbite (Ctrl)" name="radio lift"/> - <radio_item label="Faire tourner (Ctrl-Maj)" name="radio spin"/> - </radio_group> - <radio_group name="edit_radio_group"> - <radio_item label="Positionner" name="radio position"/> - <radio_item label="Pivoter (Ctrl)" name="radio rotate"/> - <radio_item label="Étirer (Ctrl-Maj)" name="radio stretch"/> - <radio_item label="Sélectionner une face" name="radio select face"/> - </radio_group> - <check_box label="Modifier les parties liées" name="checkbox edit linked parts"/> - <text name="text ruler mode"> - Axe : - </text> - <combo_box name="combobox grid mode"> - <combo_box.item name="World" label="Monde"/> - <combo_box.item name="Local" label="Local"/> - <combo_box.item name="Reference" label="Référence"/> - </combo_box> - <check_box label="Étirer les deux côtés" name="checkbox uniform"/> - <check_box label="Étirer les textures" name="checkbox stretch textures"/> - <check_box label="Utiliser la grille" name="checkbox snap to grid"/> - <button label="Options..." label_selected="Options..." name="Options..."/> - <text name="text status"> - Glissez pour déplacer, Maj-glissez pour copier. - </text> - <button label="" label_selected="" name="ToolCube" tool_tip="Cube"/> - <button label="" label_selected="" name="ToolPrism" tool_tip="Prisme droit"/> - <button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/> - <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tétraèdre"/> - <button label="" label_selected="" name="ToolCylinder" tool_tip="Cylindre"/> - <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Demi-cylindre"/> - <button label="" label_selected="" name="ToolCone" tool_tip="Cône"/> - <button label="" label_selected="" name="ToolHemiCone" tool_tip="Demi-cône"/> - <button label="" label_selected="" name="ToolSphere" tool_tip="Sphère"/> - <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Demi-sphère"/> - <button label="" label_selected="" name="ToolTorus" tool_tip="Tore"/> - <button label="" label_selected="" name="ToolTube" tool_tip="Tube"/> - <button label="" label_selected="" name="ToolRing" tool_tip="Anneau"/> - <button label="" label_selected="" name="ToolTree" tool_tip="Arbre"/> - <button label="" label_selected="" name="ToolGrass" tool_tip="Herbe"/> - <check_box label="Maintenir l'outil sélectionné" name="checkbox sticky"/> - <check_box label="Copier la sélection" name="checkbox copy selection"/> - <check_box label="Centrer" name="checkbox copy centers"/> - <check_box label="Pivoter" name="checkbox copy rotates"/> - <radio_group name="land_radio_group"> - <radio_item label="Sélectionner le terrain" name="radio select land"/> - <radio_item label="Aplatir" name="radio flatten"/> - <radio_item label="Élever" name="radio raise"/> - <radio_item label="Abaisser" name="radio lower"/> - <radio_item label="Lisser" name="radio smooth"/> - <radio_item label="Bosseler" name="radio noise"/> - <radio_item label="Annuler modification" name="radio revert"/> - </radio_group> - <button label="Appliquer" label_selected="Appliquer" name="button apply to selection" tool_tip="Modifier le terrain sélectionné" left="176"/> - <text name="Bulldozer:"> - Bulldozer : - </text> - <text name="Dozer Size:"> - Taille - </text> - <text name="Strength:"> - Force - </text> - <text name="obj_count"> - Objets sélectionnés : [COUNT] - </text> - <text name="prim_count"> - Prims : [COUNT] - </text> - <tab_container name="Object Info Tabs"> - <panel label="Général" name="General"> - <text name="Name:"> - Nom : - </text> - <text name="Description:"> - Description : - </text> - <text name="Creator:"> - Créateur : - </text> - <text name="Creator Name"> - Thrax Linden - </text> - <button label="Profil..." label_selected="Profil..." name="button creator profile"/> - <text name="Owner:"> - Propriétaire : - </text> - <text name="Owner Name"> - Thrax Linden - </text> - <button label="Profil..." label_selected="Profil..." name="button owner profile"/> - <text name="Group:"> - Groupe : - </text> - <text name="Group Name Proxy"> - Les Lindens - </text> - <button label="Définir..." label_selected="Définir..." name="button set group"/> - <text name="Permissions:"> - Droits : - </text> - - <check_box label="Partager avec le groupe" name="checkbox share with group" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d'abord cliquer sur Transférer."/> - <string name="text deed continued"> - Transférer... - </string> - <string name="text deed"> - Transférer - </string> - <button label="Céder..." label_selected="Céder..." name="button deed" tool_tip="Les objets partagés par un groupe peuvent être cédés par un officier."/> - <check_box label="Autoriser tout le monde à déplacer" name="checkbox allow everyone move"/> - <check_box label="Autoriser tout le monde à copier" name="checkbox allow everyone copy"/> - <check_box label="Afficher dans la recherche" name="search_check" tool_tip="Afficher l'objet dans les résultats de recherche"/> - <check_box label="À vendre" name="checkbox for sale"/> - <text name="Cost"> - Prix : L$ - </text> - <combo_box name="sale type"> - <combo_box.item label="Copie" name="Copy"/> - <combo_box.item label="Contenus" name="Contents"/> - <combo_box.item label="Original" name="Original"/> - </combo_box> - - <text name="label click action"> - Action du clic-gauche : - </text> - <combo_box name="clickaction" width="178"> - <combo_box.item name="Touch/grab(default)" label="Toucher/attraper (défaut)"/> - <combo_box.item name="Sitonobject" label="S'asseoir sur l'objet"/> - <combo_box.item name="Buyobject" label="Acheter l'objet"/> - <combo_box.item name="Payobject" label="Payer l'objet"/> - <combo_box.item name="Open" label="Ouvrir"/> - <combo_box.item name="Play" label="Jouer le média de la parcelle"/> - <combo_box.item name="Opemmedia" label="Ouvrir le média de la parcelle"/> - </combo_box> - <panel name="perms_build"> - <text name="perm_modify"> - Vous pouvez modifier cet objet - </text> - <text name="B:"> - B : - </text> - <text name="O:"> - O : - </text> - <text name="G:"> - G : - </text> - <text name="E:"> - E : - </text> - <text name="N:"> - N : - </text> - <text name="F:"> - F : - </text> - <text name="Next owner can:"> - Le prochain propriétaire pourra : - </text> - <check_box label="Modifier" name="checkbox next owner can modify"/> - <check_box label="Copier" left_delta="66" name="checkbox next owner can copy"/> - <check_box name="checkbox next owner can transfer"/> - </panel> - <string name="text modify info 1"> - Vous pouvez modifier cet objet - </string> - <string name="text modify info 2"> - Vous pouvez modifier ces objets - </string> - <string name="text modify info 3"> - Vous ne pouvez pas modifier cet objet - </string> - <string name="text modify info 4"> - Vous ne pouvez pas modifier ces objets - </string> - <string name="text modify warning"> - Sélectionnez l'objet en entier - </string> - <string name="Cost Default"> - Prix : L$ - </string> - <string name="Cost Total"> - Prix total : L$ - </string> - <string name="Cost Per Unit"> - Prix par : L$ - </string> - <string name="Cost Mixed"> - Prix mixte - </string> - <string name="Sale Mixed"> - Vente mixte - </string> - </panel> - <panel label="Objet" name="Object"> - <text name="select_single"> - Sélectionnez un prim pour modifier les paramètres. - </text> - <text name="edit_object"> - Modifier les paramètres de l'objet : - </text> - <check_box label="Verrouillé" name="checkbox locked" tool_tip="Empêche l'objet d'être déplacé ou supprimé. Utile pendant la construction pour éviter les modifications involontaires."/> - <check_box label="Physique" name="Physical Checkbox Ctrl" tool_tip="Permet à l'objet d'être poussé et affecté par la gravité"/> - <check_box label="Temporaire" name="Temporary Checkbox Ctrl" tool_tip="L'objet est supprimé 1 mn après sa création."/> - <check_box label="Fantôme" name="Phantom Checkbox Ctrl" tool_tip="Permet à l'objet de ne pas entrer en collision avec d'autres objets ou avatars."/> - <text name="label position"> - Position (mètres) - </text> - <spinner label="X" name="Pos X"/> - <spinner label="Y" name="Pos Y"/> - <spinner label="Z" name="Pos Z"/> - <text name="label size"> - Taille (mètres) - </text> - <spinner label="X" name="Scale X"/> - <spinner label="Y" name="Scale Y"/> - <spinner label="Z" name="Scale Z"/> - <text name="label rotation"> - Rotation (degrés) - </text> - <spinner label="X" name="Rot X"/> - <spinner label="Y" name="Rot Y"/> - <spinner label="Z" name="Rot Z"/> - <text name="label material"> - Matériau - </text> - <combo_box name="material"> - <combo_box.item name="Stone" label="Pierre"/> - <combo_box.item name="Metal" label="Métal"/> - <combo_box.item name="Glass" label="Verre"/> - <combo_box.item name="Wood" label="Bois"/> - <combo_box.item name="Flesh" label="Chair"/> - <combo_box.item name="Plastic" label="Plastique"/> - <combo_box.item name="Rubber" label="Caoutchouc"/> - </combo_box> - <text name="label basetype"> - Type de construction - </text> - <combo_box name="comboBaseType"> - <combo_box.item name="Box" label="Boîte"/> - <combo_box.item name="Cylinder" label="Cylindre"/> - <combo_box.item name="Prism" label="Prisme"/> - <combo_box.item name="Sphere" label="Sphère"/> - <combo_box.item name="Torus" label="Tore"/> - <combo_box.item name="Tube" label="Tube"/> - <combo_box.item name="Ring" label="Anneau"/> - <combo_box.item name="Sculpted" label="Sculptie"/> - </combo_box> - <text name="text cut"> - Début et fin de découpe du tracé - </text> - <spinner label="D" name="cut begin"/> - <spinner label="F" name="cut end"/> - <text name="text hollow"> - Creux - </text> - <text name="text skew"> - Biais - </text> - <text name="Hollow Shape"> - Forme du creux - </text> - <combo_box name="hole"> - <combo_box.item name="Default" label="Défaut"/> - <combo_box.item name="Circle" label="Cercle"/> - <combo_box.item name="Square" label="Carré"/> - <combo_box.item name="Triangle" label="Triangle"/> - </combo_box> - <text name="text twist"> - Début et fin de vrille - </text> - <spinner label="D" name="Twist Begin"/> - <spinner label="F" name="Twist End"/> - <text name="scale_taper"> - Biseautage - </text> - <text name="scale_hole"> - Taille du trou - </text> - <spinner label="X" name="Taper Scale X"/> - <spinner label="Y" name="Taper Scale Y"/> - <text name="text topshear"> - Inclinaison - </text> - <spinner label="X" name="Shear X"/> - <spinner label="Y" name="Shear Y"/> - <text name="advanced_cut"> - Début et fin de découpe du profilé - </text> - <text name="advanced_dimple"> - Début et fin du creux - </text> - <text name="advanced_slice"> - Début et fin de la tranche - </text> - <spinner label="D" name="Path Limit Begin"/> - <spinner label="F" name="Path Limit End"/> - <text name="text taper2"> - Biseautage - </text> - <spinner label="X" name="Taper X"/> - <spinner label="Y" name="Taper Y"/> - <text name="text radius delta"> - Rayon - </text> - <text name="text revolutions"> - Révolutions - </text> - <texture_picker label="Texture du sculptie" name="sculpt texture control" tool_tip="Cliquez pour sélectionner une image"/> - <check_box label="Mirroir" name="sculpt mirror control" tool_tip="Retourne le sculptie le long de l'axe des X."/> - <check_box label="A l'envers" name="sculpt invert control" tool_tip="Inverse les valeurs normales d'un sculptie et le fait apparaître à l'envers."/> - <text name="label sculpt type"> - Type de raccord - </text> - <combo_box name="sculpt type control"> - <combo_box.item name="None" label="(aucun)"/> - <combo_box.item name="Sphere" label="Sphère"/> - <combo_box.item name="Torus" label="Tore"/> - <combo_box.item name="Plane" label="Plan"/> - <combo_box.item name="Cylinder" label="Cylindre"/> - </combo_box> - </panel> - <panel label="Attributs" name="Features"> - <text name="select_single"> - Sélectionnez un prim pour modifier les attributs. - </text> - <text name="edit_object"> - Modifier les attributs de l'objet : - </text> - <check_box label="Flexibilité" name="Flexible1D Checkbox Ctrl" tool_tip="Donne à l'objet de la souplesse sur l'axe des Z (côté client uniquement)."/> - <spinner label="Souplesse" name="FlexNumSections"/> - <spinner label="Gravité" name="FlexGravity"/> - <spinner label="Élasticité" name="FlexFriction"/> - <spinner label="Vent" name="FlexWind"/> - <spinner label="Tension" name="FlexTension"/> - <spinner label="Force X" name="FlexForceX"/> - <spinner label="Force Y" name="FlexForceY"/> - <spinner label="Force Z" name="FlexForceZ"/> - <check_box label="Lumière" name="Light Checkbox Ctrl" tool_tip="Permet aux objets d'émettre de la lumière"/> - <text name="label color"> - Couleur - </text> - <color_swatch label="" name="colorswatch" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> - <spinner label="Intensité" name="Light Intensity"/> - <spinner label="Portée" name="Light Radius"/> - <spinner label="Atténuation" name="Light Falloff"/> - </panel> - <panel label="Texture" name="Texture"> - <texture_picker label="Texture" name="texture control" tool_tip="Cliquez pour sélectionner une image"/> - <color_swatch label="Couleur" name="colorswatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/> - <text name="color trans" width="88"> - Transparence - </text> - <text name="glow label"> - Rayonnement - </text> - <check_box label="Lumineux" name="checkbox fullbright"/> - <text name="tex gen"> - Application - </text> - <combo_box name="combobox texgen"> - <combo_box.item name="Default" label="Défaut"/> - <combo_box.item name="Planar" label="Planar"/> - </combo_box> - <text name="label shininess"> - Brillance - </text> - <combo_box name="combobox shininess"> - <combo_box.item name="None" label="Aucune"/> - <combo_box.item name="Low" label="Faible"/> - <combo_box.item name="Medium" label="Moyenne"/> - <combo_box.item name="High" label="Élevée"/> - </combo_box> - <text name="label bumpiness"> - Relief - </text> - <combo_box name="combobox bumpiness"> - <combo_box.item name="None" label="Aucun"/> - <combo_box.item name="Brightness" label="Luminosité"/> - <combo_box.item name="Darkness" label="Obscurité"/> - <combo_box.item name="woodgrain" label="Aggloméré"/> - <combo_box.item name="bark" label="Écorce"/> - <combo_box.item name="bricks" label="Briques"/> - <combo_box.item name="checker" label="Damier"/> - <combo_box.item name="concrete" label="Béton"/> - <combo_box.item name="crustytile" label="Carrelage"/> - <combo_box.item name="cutstone" label="Pierre de taille"/> - <combo_box.item name="discs" label="Disques"/> - <combo_box.item name="gravel" label="Gravier"/> - <combo_box.item name="petridish" label="Boîte de Petri"/> - <combo_box.item name="siding" label="Lattes"/> - <combo_box.item name="stonetile" label="Carreaux"/> - <combo_box.item name="stucco" label="Stuc"/> - <combo_box.item name="suction" label="Ventouses"/> - <combo_box.item name="weave" label="Tissage"/> - </combo_box> - <text name="tex scale"> - Répétitions par face - </text> - <spinner label="Horizontal (U)" name="TexScaleU"/> - <check_box label="Inverser" name="checkbox flip s"/> - <spinner label="Vertical (V)" name="TexScaleV"/> - <check_box label="Inverser" name="checkbox flip t"/> - <text name="tex rotate"> - Rotation (degrés) - </text> - <spinner left="122" name="TexRot" width="58"/> - <string name="string repeats per meter"> - Répétitions au mètre - </string> - <string name="string repeats per face"> - Répétitions par face - </string> - <text name="rpt" width="160"> - Répétitions au mètre - </text> - <spinner left="122" name="rptctrl" width="58"/> - <button label="Appliquer" label_selected="Appliquer" left_delta="68" name="button apply" width="75"/> - <text name="tex offset"> - Décalage - </text> - <spinner label="Horizontal (U)" name="TexOffsetU"/> - <spinner label="Vertical (V)" name="TexOffsetV"/> - <text name="textbox autofix"> - Ajuster la texture du média -(chargement préalable) - </text> - <button label="Ajuster" label_selected="Ajuster" left="150" name="button align"/> - </panel> - <panel label="Contenu" name="Contents"> - <button label="Nouveau script" label_selected="Nouveau script" name="button new script"/> - <button label="Droits" name="button permissions"/> - </panel> - </tab_container> - <panel name="land info panel"> - <text name="label_parcel_info"> - Informations sur la parcelle - </text> - <text name="label_area_price"> - Prix : [PRICE] L$ pour [AREA] m². - </text> - <text name="label_area"> - Surface : [AREA] m² - </text> - <button label="À propos du terrain..." label_selected="À propos du terrain..." name="button about land" width="142"/> - <check_box label="Afficher les propriétaires" name="checkbox show owners" tool_tip="Colorie les parcelles en fonction de leur propriétaire : Vert = votre terrain Turquoise = le terrain de votre groupe Rouge = appartenant à d'autres Jaune = en vente Mauve = aux enchères Gris = public"/> - <button label="?" label_selected="?" name="button show owners help" left_delta="154"/> - <text name="label_parcel_modify"> - Modifier la parcelle - </text> - <button label="Diviser" label_selected="Diviser" name="button subdivide land" width="142"/> - <button label="Fusionner" label_selected="Fusionner" name="button join land" width="142"/> - <text name="label_parcel_trans"> - Transactions - </text> - <button label="Acheter le terrain" label_selected="Acheter le terrain" name="button buy land" width="142"/> - <button label="Abandonner le terrain" label_selected="Abandonner le terrain" name="button abandon land" width="142"/> - </panel> - <floater.string name="status_rotate"> - Pour faire tourner l'objet, faîtes glisser les bandes de couleur. - </floater.string> - <floater.string name="status_scale"> - Pour étirer le côté sélectionné, cliquez et faites glisser. - </floater.string> - <floater.string name="status_move"> - Glissez pour déplacer, Maj-glissez pour copier. - </floater.string> - <floater.string name="status_modifyland"> - Cliquez et maintenez pour modifier le terrain. - </floater.string> - <floater.string name="status_camera"> - Cliquez et faites glisser pour changer l'affichage. - </floater.string> - <floater.string name="status_grab"> - Glisser pour déplacer, Ctrl pour soulever, Crtl-Maj pour pivoter. - </floater.string> - <floater.string name="status_place"> - Cliquez dans le monde pour construire. - </floater.string> - <floater.string name="status_selectland"> - Cliquez et faites glisser pour sélectionner le terrain. - </floater.string> - <floater.string name="grid_screen_text"> - Écran - </floater.string> - <floater.string name="grid_local_text"> - Local - </floater.string> - <floater.string name="grid_world_text"> - Monde - </floater.string> - <floater.string name="grid_reference_text"> - Référence - </floater.string> - <floater.string name="grid_attachment_text"> - Pièce-jointe - </floater.string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="toolbox floater" short_title="Outils de construction" title=""> + <floater.string name="status_rotate"> + Pour faire tourner l'objet, faîtes glisser les bandes de couleur. + </floater.string> + <floater.string name="status_scale"> + Pour étirer le côté sélectionné, cliquez et faites glisser. + </floater.string> + <floater.string name="status_move"> + Glissez pour déplacer, Maj-glissez pour copier. + </floater.string> + <floater.string name="status_modifyland"> + Cliquez et maintenez pour modifier le terrain. + </floater.string> + <floater.string name="status_camera"> + Cliquez et faîtes glisser pour bouger la caméra + </floater.string> + <floater.string name="status_grab"> + Glisser pour déplacer, Ctrl pour soulever, Crtl-Maj pour pivoter. + </floater.string> + <floater.string name="status_place"> + Cliquez dans le monde pour construire. + </floater.string> + <floater.string name="status_selectland"> + Cliquez et faites glisser pour sélectionner le terrain. + </floater.string> + <floater.string name="grid_screen_text"> + Écran + </floater.string> + <floater.string name="grid_local_text"> + Local + </floater.string> + <floater.string name="grid_world_text"> + Monde + </floater.string> + <floater.string name="grid_reference_text"> + Référence + </floater.string> + <floater.string name="grid_attachment_text"> + Pièce-jointe + </floater.string> + <button label="" label_selected="" name="button focus" tool_tip="Mise au point"/> + <button label="" label_selected="" name="button move" tool_tip="Déplacer"/> + <button label="" label_selected="" name="button edit" tool_tip="Modifier"/> + <button label="" label_selected="" name="button create" tool_tip="Créer"/> + <button label="" label_selected="" name="button land" tool_tip="Terrain"/> + <text name="text status"> + Glissez pour déplacer, Maj-glissez pour copier. + </text> + <radio_group name="focus_radio_group"> + <radio_item label="Zoom" name="radio zoom"/> + <radio_item label="Orbite (Ctrl)" name="radio orbit"/> + <radio_item label="Panoramique (Ctrl-Maj)" name="radio pan"/> + </radio_group> + <radio_group name="move_radio_group"> + <radio_item label="Déplacer" name="radio move"/> + <radio_item label="Orbite (Ctrl)" name="radio lift"/> + <radio_item label="Faire tourner (Ctrl-Maj)" name="radio spin"/> + </radio_group> + <radio_group name="edit_radio_group"> + <radio_item label="Bouger" name="radio position"/> + <radio_item label="Pivoter (Ctrl)" name="radio rotate"/> + <radio_item label="Étirer (Ctrl-Maj)" name="radio stretch"/> + <radio_item label="Sélectionner une face" name="radio select face"/> + </radio_group> + <check_box label="Modification liée" name="checkbox edit linked parts"/> + <check_box label="Étirer les deux côtés" name="checkbox uniform"/> + <check_box initial_value="true" label="Étirer les textures" name="checkbox stretch textures"/> + <check_box initial_value="true" label="Fixer sur la grille" name="checkbox snap to grid"/> + <combo_box name="combobox grid mode"> + <combo_box.item label="Axe du monde" name="World"/> + <combo_box.item label="Axe local" name="Local"/> + <combo_box.item label="Axe de référence" name="Reference"/> + </combo_box> + <button label="Options..." label_selected="Options..." name="Options..." tool_tip="Définir les options de la grille"/> + <button label="" label_selected="" name="ToolCube" tool_tip="Cube"/> + <button label="" label_selected="" name="ToolPrism" tool_tip="Prisme droit"/> + <button label="" label_selected="" name="ToolPyramid" tool_tip="Pyramide"/> + <button label="" label_selected="" name="ToolTetrahedron" tool_tip="Tétraèdre"/> + <button label="" label_selected="" name="ToolCylinder" tool_tip="Cylindre"/> + <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="Demi-cylindre"/> + <button label="" label_selected="" name="ToolCone" tool_tip="Cône"/> + <button label="" label_selected="" name="ToolHemiCone" tool_tip="Demi-cône"/> + <button label="" label_selected="" name="ToolSphere" tool_tip="Sphère"/> + <button label="" label_selected="" name="ToolHemiSphere" tool_tip="Demi-sphère"/> + <button label="" label_selected="" name="ToolTorus" tool_tip="Tore"/> + <button label="" label_selected="" name="ToolTube" tool_tip="Tube"/> + <button label="" label_selected="" name="ToolRing" tool_tip="Anneau"/> + <button label="" label_selected="" name="ToolTree" tool_tip="Arbre"/> + <button label="" label_selected="" name="ToolGrass" tool_tip="Herbe"/> + <check_box label="Maintenir l'outil sélectionné" name="checkbox sticky"/> + <check_box label="Copier la sélection" name="checkbox copy selection"/> + <check_box initial_value="true" label="Centrer" name="checkbox copy centers"/> + <check_box label="Pivoter" name="checkbox copy rotates"/> + <radio_group name="land_radio_group"> + <radio_item label="Sélectionner le terrain" name="radio select land"/> + <radio_item label="Aplatir" name="radio flatten"/> + <radio_item label="Élever" name="radio raise"/> + <radio_item label="Abaisser" name="radio lower"/> + <radio_item label="Lisser" name="radio smooth"/> + <radio_item label="Bosseler" name="radio noise"/> + <radio_item label="Annuler modification" name="radio revert"/> + </radio_group> + <text name="Bulldozer:"> + Bulldozer : + </text> + <text name="Dozer Size:"> + Taille + </text> + <text name="Strength:"> + Force + </text> + <button label="Appliquer" label_selected="Appliquer" left="176" name="button apply to selection" tool_tip="Modifier le terrain sélectionné"/> + <text name="obj_count"> + Objets : [COUNT] + </text> + <text name="prim_count"> + Prims : [COUNT] + </text> + <tab_container name="Object Info Tabs"> + <panel label="Général" name="General"> + <panel.string name="text deed continued"> + Céder + </panel.string> + <panel.string name="text deed"> + Transférer + </panel.string> + <panel.string name="text modify info 1"> + Vous pouvez modifier cet objet + </panel.string> + <panel.string name="text modify info 2"> + Vous pouvez modifier ces objets + </panel.string> + <panel.string name="text modify info 3"> + Vous ne pouvez pas modifier cet objet + </panel.string> + <panel.string name="text modify info 4"> + Vous ne pouvez pas modifier ces objets + </panel.string> + <panel.string name="text modify warning"> + Sélectionnez l'objet en entier + </panel.string> + <panel.string name="Cost Default"> + Prix : L$ + </panel.string> + <panel.string name="Cost Total"> + Prix total : L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Prix par : L$ + </panel.string> + <panel.string name="Cost Mixed"> + Prix mixte + </panel.string> + <panel.string name="Sale Mixed"> + Vente mixte + </panel.string> + <text name="Name:"> + Nom : + </text> + <text name="Description:"> + Description : + </text> + <text name="Creator:"> + Créateur : + </text> + <text name="Creator Name"> + Thrax Linden + </text> + <text name="Owner:"> + Propriétaire : + </text> + <text name="Owner Name"> + Thrax Linden + </text> + <text name="Group:"> + Groupe : + </text> + <button label="Définir..." label_selected="Définir..." name="button set group" tool_tip="Choisissez un groupe pour partager les permissions de cet objet"/> + <name_box initial_value="Chargement…" name="Group Name Proxy"/> + <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les permissions au prochain propriétaire. Seul un officier peut céder les objets d'un groupe."/> + <check_box label="Partager" name="checkbox share with group" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d'abord cliquer sur Transférer."/> + <text name="label click action"> + Cliquer pour : + </text> + <combo_box name="clickaction" width="178"> + <combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/> + <combo_box.item label="S'asseoir sur l'objet" name="Sitonobject"/> + <combo_box.item label="Acheter l'objet" name="Buyobject"/> + <combo_box.item label="Payer l'objet" name="Payobject"/> + <combo_box.item label="Ouvrir" name="Open"/> + </combo_box> + <check_box label="À vendre :" name="checkbox for sale"/> + <combo_box name="sale type"> + <combo_box.item label="Copie" name="Copy"/> + <combo_box.item label="Contenus" name="Contents"/> + <combo_box.item label="Original" name="Original"/> + </combo_box> + <spinner label="Prix : L$" name="Edit Cost"/> + <check_box label="Afficher dans la recherche" name="search_check" tool_tip="Afficher l'objet dans les résultats de recherche"/> + <panel name="perms_build"> + <text name="perm_modify"> + Vous pouvez modifier cet objet + </text> + <text name="Anyone can:"> + N'importe qui : + </text> + <check_box label="Copier" name="checkbox allow everyone copy"/> + <text name="Next owner can:"> + Le prochain propriétaire : + </text> + <check_box label="Modifier" name="checkbox next owner can modify"/> + <check_box label="Copier" left_delta="66" name="checkbox next owner can copy"/> + <check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/> + <text name="B:"> + B : + </text> + <text name="O:"> + O : + </text> + <text name="G:"> + G : + </text> + <text name="E:"> + E : + </text> + <text name="N:"> + N : + </text> + <text name="F:"> + F : + </text> + </panel> + </panel> + <panel label="Objet" name="Object"> + <check_box label="Verrouillé" name="checkbox locked" tool_tip="Empêche l'objet d'être déplacé ou supprimé. Utile pendant la construction pour éviter les modifications involontaires."/> + <check_box label="Physique" name="Physical Checkbox Ctrl" tool_tip="Permet à l'objet d'être poussé et affecté par la gravité"/> + <check_box label="Temporaire" name="Temporary Checkbox Ctrl" tool_tip="L'objet est supprimé 1 mn après sa création."/> + <check_box label="Fantôme" name="Phantom Checkbox Ctrl" tool_tip="Permet à l'objet de ne pas entrer en collision avec d'autres objets ou avatars."/> + <text name="label position"> + Position (mètres) + </text> + <spinner label="X" name="Pos X"/> + <spinner label="Y" name="Pos Y"/> + <spinner label="Z" name="Pos Z"/> + <text name="label size"> + Taille (mètres) + </text> + <spinner label="X" name="Scale X"/> + <spinner label="Y" name="Scale Y"/> + <spinner label="Z" name="Scale Z"/> + <text name="label rotation"> + Rotation (degrés) + </text> + <spinner label="X" name="Rot X"/> + <spinner label="Y" name="Rot Y"/> + <spinner label="Z" name="Rot Z"/> + <combo_box name="comboBaseType"> + <combo_box.item label="Boîte" name="Box"/> + <combo_box.item label="Cylindre" name="Cylinder"/> + <combo_box.item label="Prisme" name="Prism"/> + <combo_box.item label="Sphère" name="Sphere"/> + <combo_box.item label="Tore" name="Torus"/> + <combo_box.item label="Tube" name="Tube"/> + <combo_box.item label="Anneau" name="Ring"/> + <combo_box.item label="Sculptie" name="Sculpted"/> + </combo_box> + <combo_box name="material"> + <combo_box.item label="Pierre" name="Stone"/> + <combo_box.item label="Métal" name="Metal"/> + <combo_box.item label="Verre" name="Glass"/> + <combo_box.item label="Bois" name="Wood"/> + <combo_box.item label="Chair" name="Flesh"/> + <combo_box.item label="Plastique" name="Plastic"/> + <combo_box.item label="Caoutchouc" name="Rubber"/> + </combo_box> + <text name="text cut"> + Découpe du tracé (début/fin) + </text> + <spinner label="D" name="cut begin"/> + <spinner label="F" name="cut end"/> + <text name="text hollow"> + Creux + </text> + <text name="text skew"> + Biais + </text> + <text name="Hollow Shape"> + Forme du creux + </text> + <combo_box name="hole"> + <combo_box.item label="Défaut" name="Default"/> + <combo_box.item label="Cercle" name="Circle"/> + <combo_box.item label="Carré" name="Square"/> + <combo_box.item label="Triangle" name="Triangle"/> + </combo_box> + <text name="text twist"> + Vrille (début/fin) + </text> + <spinner label="D" name="Twist Begin"/> + <spinner label="F" name="Twist End"/> + <text name="scale_taper"> + Biseautage + </text> + <text name="scale_hole"> + Taille du trou + </text> + <spinner label="X" name="Taper Scale X"/> + <spinner label="Y" name="Taper Scale Y"/> + <text name="text topshear"> + Inclinaison + </text> + <spinner label="X" name="Shear X"/> + <spinner label="Y" name="Shear Y"/> + <text name="advanced_cut"> + Découpe du profilé (début/fin) + </text> + <text name="advanced_dimple"> + Creux (début/fin) + </text> + <text name="advanced_slice"> + Tranche (début/fin) + </text> + <spinner label="D" name="Path Limit Begin"/> + <spinner label="F" name="Path Limit End"/> + <text name="text taper2"> + Biseautage + </text> + <spinner label="X" name="Taper X"/> + <spinner label="Y" name="Taper Y"/> + <text name="text radius delta"> + Rayon + </text> + <text name="text revolutions"> + Révolutions + </text> + <texture_picker label="Texture du sculptie" name="sculpt texture control" tool_tip="Cliquez pour sélectionner une image"/> + <check_box label="Mirroir" name="sculpt mirror control" tool_tip="Retourne le sculptie le long de l'axe des X."/> + <check_box label="A l'envers" name="sculpt invert control" tool_tip="Inverse les valeurs normales d'un sculptie et le fait apparaître à l'envers."/> + <text name="label sculpt type"> + Type de raccord + </text> + <combo_box name="sculpt type control"> + <combo_box.item label="(aucun)" name="None"/> + <combo_box.item label="Sphère" name="Sphere"/> + <combo_box.item label="Tore" name="Torus"/> + <combo_box.item label="Plan" name="Plane"/> + <combo_box.item label="Cylindre" name="Cylinder"/> + </combo_box> + </panel> + <panel label="Attributs" name="Features"> + <text name="select_single"> + Sélectionnez un prim pour modifier les attributs. + </text> + <text name="edit_object"> + Modifier les attributs de l'objet : + </text> + <check_box label="Flexibilité" name="Flexible1D Checkbox Ctrl" tool_tip="Donne à l'objet de la souplesse sur l'axe des Z (côté client uniquement)."/> + <spinner label="Souplesse" name="FlexNumSections"/> + <spinner label="Gravité" name="FlexGravity"/> + <spinner label="Élasticité" name="FlexFriction"/> + <spinner label="Vent" name="FlexWind"/> + <spinner label="Tension" name="FlexTension"/> + <spinner label="Force X" name="FlexForceX"/> + <spinner label="Force Y" name="FlexForceY"/> + <spinner label="Force Z" name="FlexForceZ"/> + <check_box label="Lumière" name="Light Checkbox Ctrl" tool_tip="Permet aux objets d'émettre de la lumière"/> + <color_swatch label="" name="colorswatch" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <spinner label="Intensité" name="Light Intensity"/> + <spinner label="Portée" name="Light Radius"/> + <spinner label="Atténuation" name="Light Falloff"/> + </panel> + <panel label="Texture" name="Texture"> + <panel.string name="string repeats per meter"> + Répétitions au mètre + </panel.string> + <panel.string name="string repeats per face"> + Répétitions par face + </panel.string> + <texture_picker label="Texture" name="texture control" tool_tip="Cliquez pour sélectionner une image"/> + <color_swatch label="Couleur" name="colorswatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/> + <text name="color trans" width="88"> + Transparence + </text> + <text name="glow label"> + Rayonnement + </text> + <check_box label="Lumineux" name="checkbox fullbright"/> + <text name="tex gen"> + Application + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="Défaut" name="Default"/> + <combo_box.item label="Planar" name="Planar"/> + </combo_box> + <text name="label shininess"> + Brillance + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="Aucune" name="None"/> + <combo_box.item label="Faible" name="Low"/> + <combo_box.item label="Moyenne" name="Medium"/> + <combo_box.item label="Élevée" name="High"/> + </combo_box> + <text name="label bumpiness"> + Relief + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="Aucun" name="None"/> + <combo_box.item label="Luminosité" name="Brightness"/> + <combo_box.item label="Obscurité" name="Darkness"/> + <combo_box.item label="Aggloméré" name="woodgrain"/> + <combo_box.item label="Écorce" name="bark"/> + <combo_box.item label="Briques" name="bricks"/> + <combo_box.item label="Damier" name="checker"/> + <combo_box.item label="Béton" name="concrete"/> + <combo_box.item label="Carrelage" name="crustytile"/> + <combo_box.item label="Pierre de taille" name="cutstone"/> + <combo_box.item label="Disques" name="discs"/> + <combo_box.item label="Gravier" name="gravel"/> + <combo_box.item label="Boîte de Petri" name="petridish"/> + <combo_box.item label="Lattes" name="siding"/> + <combo_box.item label="Carreaux" name="stonetile"/> + <combo_box.item label="Stuc" name="stucco"/> + <combo_box.item label="Ventouses" name="suction"/> + <combo_box.item label="Tissage" name="weave"/> + </combo_box> + <text name="tex scale"> + Répétitions par face + </text> + <spinner label="Horizontal (U)" name="TexScaleU"/> + <check_box label="Inverser" name="checkbox flip s"/> + <spinner label="Vertical (V)" name="TexScaleV"/> + <check_box label="Inverser" name="checkbox flip t"/> + <spinner label="RotationËš" left="122" name="TexRot" width="58"/> + <spinner label="Repeats / Meter" left="122" name="rptctrl" width="58"/> + <button label="Appliquer" label_selected="Appliquer" left_delta="68" name="button apply" width="75"/> + <text name="tex offset"> + Décalage de la texture + </text> + <spinner label="Horizontal (U)" name="TexOffsetU"/> + <spinner label="Vertical (V)" name="TexOffsetV"/> + </panel> + <panel label="Contenu" name="Contents"> + <button label="Nouveau script" label_selected="Nouveau script" name="button new script"/> + <button label="Droits" name="button permissions"/> + </panel> + </tab_container> + <panel name="land info panel"> + <text name="label_parcel_info"> + Informations sur la parcelle + </text> + <text name="label_area_price"> + Prix : [PRICE] L$ pour [AREA] m². + </text> + <text name="label_area"> + Surface : [AREA] m² + </text> + <button label="À propos du terrain..." label_selected="À propos du terrain..." name="button about land" width="142"/> + <check_box label="Afficher les propriétaires" name="checkbox show owners" tool_tip="Colorie les parcelles en fonction de leur propriétaire : + +Vert = votre terrain +Turquoise = le terrain de votre groupe +Rouge = appartenant à d'autres +Jaune = en vente +Mauve = aux enchères +Gris = public"/> + <text name="label_parcel_modify"> + Modifier la parcelle + </text> + <button label="Diviser" label_selected="Diviser" name="button subdivide land" width="142"/> + <button label="Fusionner" label_selected="Fusionner" name="button join land" width="142"/> + <text name="label_parcel_trans"> + Transactions + </text> + <button label="Acheter le terrain" label_selected="Acheter le terrain" name="button buy land" width="142"/> + <button label="Abandonner le terrain" label_selected="Abandonner le terrain" name="button abandon land" width="142"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/fr/inspect_avatar.xml b/indra/newview/skins/default/xui/fr/inspect_avatar.xml new file mode 100644 index 00000000000..993f2bd5e43 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/inspect_avatar.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [AGE] + </string> + <string name="Details"> + [ACCTTYPE], [PAYMENTINFO] +Profil : [SL_PROFILE] + </string> + <slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/> + <button label="Devenir amis" name="add_friend_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml b/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml new file mode 100644 index 00000000000..ba2559a9a11 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_avatar_icon.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="Voir le profil..." name="Show Profile"/> + <menu_item_call label="Envoyer IM..." name="Send IM"/> + <menu_item_call label="Devenir amis..." name="Add Friend"/> + <menu_item_call label="Supprimer cet ami..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_favorites.xml b/indra/newview/skins/default/xui/fr/menu_favorites.xml new file mode 100644 index 00000000000..663df9449ac --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_favorites.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Téléporter" name="Teleport To Landmark"/> + <menu_item_call label="Voir/Modifier le repère" name="Landmark Open"/> + <menu_item_call label="Copier la SLurl" name="Copy slurl"/> + <menu_item_call label="Voir sur la carte" name="Show On Map"/> + <menu_item_call label="Copier" name="Landmark Copy"/> + <menu_item_call label="Coller" name="Landmark Paste"/> + <menu_item_call label="Supprimer" name="Delete"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_group_plus.xml b/indra/newview/skins/default/xui/fr/menu_group_plus.xml new file mode 100644 index 00000000000..e4ad89751f5 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_group_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="Rejoignez des groupes..." name="item_join"/> + <menu_item_call label="Nouveau groupe..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml index ce347afe899..c3c931ad5c3 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml @@ -1,66 +1,76 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Popup"> - <menu_item_call label="Acheter" name="Task Buy"/> - <menu_item_call label="Ouvrir" name="Task Open"/> - <menu_item_call label="Jouer" name="Task Play"/> - <menu_item_call label="Propriétés" name="Task Properties"/> - <menu_item_call label="Renommer" name="Task Rename"/> - <menu_item_call label="Supprimer" name="Task Remove"/> - <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_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 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 tricot" name="New Undershirt"/> - <menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/> - </menu> - <menu 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_item_call label="Téléporter" name="Landmark Open"/> - <menu_item_call label="Ouvrir" name="Animation Open"/> - <menu_item_call label="Ouvrir" name="Sound Open"/> - <menu_item_call label="Purger l'objet" name="Purge Item"/> - <menu_item_call label="Restaurer l'objet" name="Restore Item"/> - <menu_item_call label="Ouvrir" name="Open"/> - <menu_item_call label="Propriétés" name="Properties"/> - <menu_item_call label="Renommer" name="Rename"/> - <menu_item_call label="Copier l'UUID (identifiant universel unique)" name="Copy Asset UUID"/> - <menu_item_call label="Copier" name="Copy"/> - <menu_item_call label="Coller" name="Paste"/> - <menu_item_call label="Supprimer" name="Delete"/> - <menu_item_call label="Enlever les objets" name="Take Off Items"/> - <menu_item_call label="Ajouter à l'ensemble" name="Add To Outfit"/> - <menu_item_call label="Remplacer l'ensemble" name="Replace Outfit"/> - <menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder"/> - <menu_item_call label="Jouer" name="Sound Play"/> - <menu_item_call label="Au sujet du repère" name="Teleport To Landmark"/> - <menu_item_call label="Jouer dans le Monde" name="Animation Play"/> - <menu_item_call label="Jouer localement" name="Animation Audition"/> - <menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/> - <menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/> - <menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/> - <menu_item_call label="Activer" name="Activate"/> - <menu_item_call label="Désactiver" name="Deactivate"/> - <menu_item_call label="Détacher de vous" name="Detach From Yourself"/> - <menu_item_call label="Remettre dans le dernier emplacement" name="Restore to Last Position"/> - <menu_item_call label="Porter" name="Object Wear"/> - <menu label="Attacher à " name="Attach To"/> - <menu label="Attacher au HUD " name="Attach To HUD"/> - <menu_item_call label="Éditer" name="Wearable Edit"/> - <menu_item_call label="Porter" name="Wearable Wear"/> - <menu_item_call label="Enlever" name="Take Off"/> - <menu_item_call label="--aucune option--" name="--no options--"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="Acheter" name="Task Buy"/> + <menu_item_call label="Ouvrir" name="Task Open"/> + <menu_item_call label="Jouer" name="Task Play"/> + <menu_item_call label="Propriétés" name="Task Properties"/> + <menu_item_call label="Renommer" name="Task Rename"/> + <menu_item_call label="Supprimer" name="Task Remove"/> + <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_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 tricot" name="New Undershirt"/> + <menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/> + </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 label="Changer de type" name="Change Type"> + <menu_item_call label="Défaut" name="Default"/> + <menu_item_call label="Gants" name="Gloves"/> + <menu_item_call label="Veste" name="Jacket"/> + <menu_item_call label="Pantalon" name="Pants"/> + <menu_item_call label="Silhouette" name="Shape"/> + <menu_item_call label="Chaussures" name="Shoes"/> + <menu_item_call label="Chemise" name="Shirt"/> + <menu_item_call label="Jupe" name="Skirt"/> + <menu_item_call label="Sous-vêtements (femme)" name="Underpants"/> + <menu_item_call label="Sous-vêtements (homme)" name="Undershirt"/> + </menu> + <menu_item_call label="Téléporter" name="Landmark Open"/> + <menu_item_call label="Ouvrir" name="Animation Open"/> + <menu_item_call label="Ouvrir" name="Sound Open"/> + <menu_item_call label="Purger l'objet" name="Purge Item"/> + <menu_item_call label="Restaurer l'objet" name="Restore Item"/> + <menu_item_call label="Ouvrir" name="Open"/> + <menu_item_call label="Propriétés" name="Properties"/> + <menu_item_call label="Renommer" name="Rename"/> + <menu_item_call label="Copier l'UUID (identifiant universel unique)" name="Copy Asset UUID"/> + <menu_item_call label="Copier" name="Copy"/> + <menu_item_call label="Coller" name="Paste"/> + <menu_item_call label="Supprimer" name="Delete"/> + <menu_item_call label="Enlever les objets" name="Take Off Items"/> + <menu_item_call label="Ajouter à l'ensemble" name="Add To Outfit"/> + <menu_item_call label="Remplacer l'ensemble" name="Replace Outfit"/> + <menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder"/> + <menu_item_call label="Jouer" name="Sound Play"/> + <menu_item_call label="Jouer dans le Monde" name="Animation Play"/> + <menu_item_call label="Jouer localement" name="Animation Audition"/> + <menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/> + <menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/> + <menu_item_call label="Démarrer le chat conférence" name="Conference Chat"/> + <menu_item_call label="Activer" name="Activate"/> + <menu_item_call label="Désactiver" name="Deactivate"/> + <menu_item_call label="Détacher de vous" name="Detach From Yourself"/> + <menu_item_call label="Porter" name="Object Wear"/> + <menu label="Attacher à " name="Attach To"/> + <menu label="Attacher au HUD " name="Attach To HUD"/> + <menu_item_call label="Éditer" name="Wearable Edit"/> + <menu_item_call label="Porter" name="Wearable Wear"/> + <menu_item_call label="Enlever" name="Take Off"/> + <menu_item_call label="--aucune option--" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_landmark.xml b/indra/newview/skins/default/xui/fr/menu_landmark.xml new file mode 100644 index 00000000000..d887fb0f399 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_landmark.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="Copier la SLurl" name="copy"/> + <menu_item_call label="Supprimer" name="delete"/> + <menu_item_call label="Créer un Favori" name="pick"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_mini_map.xml b/indra/newview/skins/default/xui/fr/menu_mini_map.xml index 36107885f4c..5ab5f56ec59 100644 --- a/indra/newview/skins/default/xui/fr/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/fr/menu_mini_map.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> - <menu_item_call label="Zoom rapproché" name="Zoom Close"/> - <menu_item_call label="Zoom moyen" name="Zoom Medium"/> - <menu_item_call label="Zoom éloigné" name="Zoom Far"/> - <menu_item_call label="Arrêter de suivre" name="Stop Tracking"/> - <menu_item_call label="Profil..." name="Profile"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="popup"> + <menu_item_call label="Zoom rapproché" name="Zoom Close"/> + <menu_item_call label="Zoom moyen" name="Zoom Medium"/> + <menu_item_call label="Zoom éloigné" name="Zoom Far"/> + <menu_item_call label="Arrêter de suivre" name="Stop Tracking"/> + <menu_item_call label="Carte du monde" name="World Map"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_navbar.xml b/indra/newview/skins/default/xui/fr/menu_navbar.xml new file mode 100644 index 00000000000..ce48f8e6171 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_navbar.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="Voir les coordonnées" name="Show Coordinates"/> + <menu_item_call label="Repère" name="Landmark"/> + <menu_item_call label="Couper" name="Cut"/> + <menu_item_call label="Copier" name="Copy"/> + <menu_item_call label="Coller" name="Paste"/> + <menu_item_call label="Supprimer" name="Delete"/> + <menu_item_call label="Tout sélectionner" name="Select All"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_picks.xml b/indra/newview/skins/default/xui/fr/menu_picks.xml new file mode 100644 index 00000000000..6fcb8570540 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="Infos" name="pick_info"/> + <menu_item_call label="Éditer" name="pick_edit"/> + <menu_item_call label="Téléporter" name="pick_teleport"/> + <menu_item_call label="Carte" name="pick_map"/> + <menu_item_call label="Supprimer" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_place.xml b/indra/newview/skins/default/xui/fr/menu_place.xml new file mode 100644 index 00000000000..85d8d339826 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_place.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="Enregistrer comme repère" name="landmark"/> + <menu_item_call label="Créer un Favori" name="pick"/> + <menu_item_call label="Acheter un pass" name="pass"/> + <menu_item_call label="Éditer" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_slurl.xml b/indra/newview/skins/default/xui/fr/menu_slurl.xml index ebd042a38a5..055be714cf3 100644 --- a/indra/newview/skins/default/xui/fr/menu_slurl.xml +++ b/indra/newview/skins/default/xui/fr/menu_slurl.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu name="Popup"> - <menu_item_call label="À propos de l'URL" name="about_url" /> - <menu_item_call label="Téléporter vers l'URL" name="teleport_to_url" /> - <menu_item_call label="Voir sur la carte" name="show_on_map" /> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="À propos de l'URL" name="about_url"/> + <menu_item_call label="Téléporter vers l'URL" name="teleport_to_url"/> + <menu_item_call label="Carte" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_agent.xml b/indra/newview/skins/default/xui/fr/menu_url_agent.xml new file mode 100644 index 00000000000..76a573cfd57 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_url_agent.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Voir le profil du résident" name="show_agent"/> + <menu_item_call label="Copier le nom dans le presse-papier" name="url_copy_label"/> + <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_group.xml b/indra/newview/skins/default/xui/fr/menu_url_group.xml new file mode 100644 index 00000000000..4615ad0939b --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_url_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Voir le profil du groupe" name="show_group"/> + <menu_item_call label="Copier le groupe dans le presse-papier" name="url_copy_label"/> + <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_http.xml b/indra/newview/skins/default/xui/fr/menu_url_http.xml new file mode 100644 index 00000000000..27bcb91f7e9 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_url_http.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Ouvrir la page Web" name="url_open"/> + <menu_item_call label="Ouvrir dans un navigateur interne" name="url_open_internal"/> + <menu_item_call label="Ouvrir dans un navigateur externe" name="url_open_external"/> + <menu_item_call label="Copier l'URL dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml new file mode 100644 index 00000000000..50bd5b4f747 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Afficher les informations sur l'objet" name="show_object"/> + <menu_item_call label="Me téléporter à l'endroit de l'objet" name="teleport_to_object"/> + <menu_item_call label="Copier le nom de l'objet dans le presse-papier" name="url_copy_label"/> + <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_parcel.xml b/indra/newview/skins/default/xui/fr/menu_url_parcel.xml new file mode 100644 index 00000000000..1f30203a434 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_url_parcel.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Afficher les informations sur la parcelle" name="show_parcel"/> + <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_slurl.xml b/indra/newview/skins/default/xui/fr/menu_url_slurl.xml new file mode 100644 index 00000000000..143da035330 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_url_slurl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Afficher les informations sur ce lieu" name="show_place"/> + <menu_item_call label="Me téléporter à cet endroit" name="teleport_to_location"/> + <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_teleport.xml b/indra/newview/skins/default/xui/fr/menu_url_teleport.xml new file mode 100644 index 00000000000..a32ce65ec15 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_url_teleport.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Me téléporter à cet endroit." name="teleport"/> + <menu_item_call label="Copier la SLurl dans le presse-papier" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index a38cf858e0c..8832550add5 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -1,2974 +1,2547 @@ -<?xml version="1.0" encoding="utf-8"?> -<notifications> - <global name="skipnexttime"> - Ne plus afficher - </global> - <global name="alwayschoose"> - Toujours choisir cette option - </global> - <global name="implicitclosebutton"> - Fermer - </global> - <template name="okbutton"> - <form> - <button - name="OK" - text="$yestext"/> - </form> - </template> - - <template name="okignore"> - <form> - <button - name="OK" - text="$yestext"/> - <ignore text="$ignoretext"/> - </form> - </template> - - <template name="okcancelbuttons"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Cancel" - text="$notext"/> - </form> - </template> - - <template name="okcancelignore"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Cancel" - text="$notext"/> - <ignore text="$ignoretext"/> - </form> - </template> - - <template name="okhelpbuttons"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Help" - text="$helptext"/> - </form> - </template> - - <template name="yesnocancelbuttons"> - <form> - <button - name="Yes" - text="$yestext"/> - <button - name="No" - text="$notext"/> - <button - name="Cancel" - text="$canceltext"/> - </form> - </template> - <notification functor="GenericAcknowledge" label="Message d'alerte inconnu" name="MissingAlert"> - Votre version de [APP_NAME] ne peut afficher ce message d'erreur. - -Détails de l'erreur : L'alerte, appelée '[_NAME]' est introuvable dans notifications.xml. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="FloaterNotFound"> - Erreur floater : impossible de trouver les contrôles suivants : - -[CONTROLS] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="TutorialNotFound"> - Aucun didacticiel n'est disponible actuellement. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="GenericAlert"> - [MESSAGE] - </notification> - <notification name="GenericAlertYesCancel"> - [MESSAGE] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> - </notification> - <notification name="BadInstallation"> - Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version depuis secondlife.com. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LoginFailedNoNetwork"> - Erreur réseau : impossible d'établir une connexion. -'[DIAGNOSTIC]' -Veuillez vérifier votre connexion. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MessageTemplateNotFound"> - Le modèle de message [PATH] est introuvable. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="WearableSave"> - Enregistrer les changements dans la partie du corps/les habits actuels ? - <usetemplate canceltext="Cancel" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> - </notification> - <notification name="CompileQueueSaveText"> - Une erreur est survenue lors du chargement du texte pour un script, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement. - </notification> - <notification name="CompileQueueSaveBytecode"> - Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement. - </notification> - <notification name="WriteAnimationFail"> - Une erreur est survenue lors de l'écriture des données d'animation. Veuillez réessayer ultérieurement. - </notification> - <notification name="UploadAuctionSnapshotFail"> - Un problème est survenu lors du chargement du script compilé, suite au problème suivant : [REASON] - </notification> - <notification name="UnableToViewContentsMoreThanOne"> - Impossible d'afficher les contenus de plus d'un objet à la fois. -Veuillez ne sélectionner qu'un seul objet. - </notification> - <notification name="SaveClothingBodyChanges"> - Enregistrer tous les changements dans les habits/parties du corps ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Tout enregistrer"/> - </notification> - <notification name="GrantModifyRights"> - Lorsque vous accordez des droits d'édition à un autre résident, vous lui permettez de changer, supprimer ou prendre n'importe lequel de vos objets dans le Monde. Réfléchissez bien avant d'accorder ces droits. -Souhaitez-vous accorder des droits d'édition à [FIRST_NAME] [LAST_NAME] ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="GrantModifyRightsMultiple"> - Lorsque vous accordez des droits d'édition à un autre résident, vous lui permettez de changer n'importe lequel de vos objets dans le Monde. Réfléchissez bien avant d'accorder ces droits. -Souhaitez-vous accorder des droits d'édition aux résidents selectionnés ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="RevokeModifyRights"> - Souhaitez-vous retirer les droits d'édition à [FIRST_NAME] [LAST_NAME] ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="RevokeModifyRightsMultiple"> - Souhaitez-vous retirer les droits d'édition aux résidents selectionnés ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="UnableToCreateGroup"> - Impossible de créer le groupe. -[MESSAGE] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PanelGroupApply"> - [NEEDS_APPLY_MESSAGE] -[WANT_APPLY_MESSAGE] - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ignorer les modifications" yestext="Enregistrer les modifications"/> - </notification> - <notification name="MustSpecifyGroupNoticeSubject"> - Pour envoyer une notice au groupe, vous devez indiquer un sujet. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AddGroupOwnerWarning"> - Vous êtes sur le point d'ajouter des membres du groupe dans le rôle de [ROLE_NAME]. -Les membres ne peuvent pas être destitués de ce rôle. -Ils doivent donner eux-mêmes leur démission. -Êtes-vous certain de vouloir continuer ? - <usetemplate ignoretext="Lorsque vous donnez à des membres du groupe le rôle de « propriétaire »" name="okcancelignore" notext="Non" yestext="Oui"/> - </notification> - <notification name="AssignDangerousActionWarning"> - Vous êtes sur le point d'ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ». - *Avertissement* - Tout membre disposant de ce pouvoir peut s'affecter lui-même, ainsi que tout autre membre, à des rôles disposant de pouvoirs plus importants, et accéder potentiellement à des pouvoirs proches de ceux d'un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d'attribuer ce pouvoir. - -Ajouter ce pouvoir à « [ROLE_NAME] » ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="AssignDangerousAbilityWarning"> - Vous êtes sur le point d'ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ». - - *Avertissement* - Tout membre dans un rôle avec ce pouvoir peut s'attribuer à lui-même, ainsi qu'à tout autre membre, Tous les pouvoirs, et accéder potentiellement à des pouvoirs proches de ceux d'un propriétaire. - -Ajouter ce pouvoir à « [ROLE_NAME] » ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="ClickPublishHelpLand"> - Sélectionner l'option Afficher dans la recherche -En cochant cette case, votre parcelle apparaîtra : -- dans les résultats de recherche ; -- dans les objets publics ; -- dans la recherche web. - </notification> - <notification name="ClickSoundHelpLand"> - La musique et le média ne peuvent être utilisés que sur cette parcelle. Les options Son et Voix peuvent être limités à la parcelle ou seront entendus par les résidents en dehors de la parcelle, en fonction de leur catégorie d'accès. Souhaitez-vous en savoir plus sur le paramétrage de ces options ? - <url name="url"> - http://wiki.secondlife.com/wiki/M%C3%A9dias_sur_la_parcelle_(KB) - </url> - <usetemplate name="okcancelbuttons" notext="Fermer" yestext="Consulter les pages d'aide"/> - </notification> - <notification name="ClickSearchHelpAll"> - Les résultats de recherche sont organisés en fonction de l'onglet dans lequel vous vous trouvez, votre catégorie d'accès, la catégorie choisie, ainsi que d'autres facteurs. Pour plus de détails, veuillez consulter les pages d'aide. - <url name="url"> - http://wiki.secondlife.com/wiki/FAQ_sur_la_recherche_(KB) - </url> - <usetemplate name="okcancelbuttons" notext="Fermer" yestext="Consulter les pages d'aide"/> - </notification> - <notification name="ClickPublishHelpLandDisabled"> - Cette parcelle ne peut pas apparaître dans la recherche car elle est dans une région où cela n'est pas autorisé. - </notification> - <notification name="ClickPublishHelpAvatar"> - Si vous sélectionnez Afficher dans la recherche : -- votre profil apparaîtra dans les résultats de recherche ; -- un lien vers votre profil apparaîtra dans les pages de groupe publiques. - </notification> - <notification name="ClickPartnerHelpAvatar"> - Vous pouvez proposer à un autre résident de devenir votre partenaire ou dissoudre un partenariat existant à partir du site de [SECOND_LIFE]. - -Aller sur le site de [SECOND_LIFE] pour avoir plus d'informations sur les partenariats ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Aller sur cette page"/> - </notification> - <notification name="ClickUploadHelpPermissions"> - Il est possible que vos droits par défaut ne fonctionnent pas dans les anciennes régions. - </notification> - <notification name="ClickWebProfileHelpAvatar"> - Si ce résident a défini une URL de profil web, vous pouvez : - * Cliquer sur Charger pour afficher la page dans cet onglet ; - * Cliquer sur Charger > Dans un navigateur externe, pour afficher la page dans votre navigateur par défaut ; - * Cliquer sur Charger > URL du domicile, pour retourner au profil web du résident. - -Lorsque vous êtes dans votre propre profil, vous pouvez définir n'importe quelle URL comme profil web. Pour cela, saisissez l'URL et cliquez sur OK. -Les autres résidents peuvent visiter l'URL que vous avez définie en regardant votre profil. - </notification> - <notification name="JoinGroupCanAfford"> - Rejoindre ce groupe coûte [COST] L$. -Voulez-vous continuer ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/> - </notification> - <notification name="JoinGroupCannotAfford"> - Rejoindre ce groupe coûte [COST] L$. -Vous n'avez pas suffisamment de L$ pour rejoindre ce groupe. - </notification> - <notification name="LandBuyPass"> - Pour [COST] L$ vous pouvez pénétrer sur ce terrain ([PARCEL_NAME]) et y rester [TIME] heures. Acheter un pass ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="SalePriceRestriction"> - Pour rendre l'annonce disponible à tous, le prix de vente doit être supérieur à 0 L$. -Si le prix de vente est de 0 L$, vous devez choisir un acheteur spécifique. - </notification> - <notification name="ConfirmLandSaleChange"> - Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente. -Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME]. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmLandSaleToAnyoneChange"> - Attention : en cliquant sur Vendre à n'importe qui, vous rendez votre terrain disponible à toute la communauté de [SECOND_LIFE], même aux personnes qui ne sont pas dans cette région. - -Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente. -Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME]. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnObjectsDeededToGroup"> - Êtes-vous certain de vouloir renvoyer tous les objets partagés par le groupe [NAME] sur cette parcelle dans l'inventaire du propriétaire précédent ? - -*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés ! - -Objets : [N] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedByUser"> - Etes-vous certain de vouloir renvoyer tous les objets que [NAME] possède sur cette parcelle dans son inventaire ? - -Objets : [N] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedBySelf"> - Êtes-vous certain de vouloir renvoyer tous les objets que vous possédez sur cette parcelle dans votre inventaire ? - -Objets : [N] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedBySelf"> - Êtes-vous certain de vouloir renvoyer tous les objets que vous ne possédez pas sur cette parcelle dans l'inventaire de leur propriétaire ? -Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents. - -*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés ! - -Objets : [N] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByUser"> - Êtes-vous certain de vouloir renvoyer tous les objets que [NAME] ne possède pas sur cette parcelle dans l'inventaire de leur propriétaire ? -Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents. - -*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés ! - -Objets : [N] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnAllTopObjects"> - Êtes-vous certain de vouloir renvoyer tous les objets de la liste dans l'inventaire de leur propriétaire ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="DisableAllTopObjects"> - Êtes-vous certain de vouloir désactiver tous les objets dans cette région ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByGroup"> - Renvoyer les objets de cette parcelle qui ne sont pas partagés avec le groupe [NAME] à leur propriétaire ? - -Objets : [N] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="UnableToDisableOutsideScripts"> - Impossible de désactiver les scripts. -Les dégâts sont autorisés dans toute la région. -Pour que les armes fonctionnent, les scripts doivent être autorisés. - </notification> - <notification name="MustBeInParcel"> - Pour définir le point d'atterrissage, vous devez vous trouver à l'intérieur de la parcelle. - </notification> - <notification name="PromptRecipientEmail"> - Veuillez saisir une adresse e-mail valide pour le(s) destinataire(s). - </notification> - <notification name="PromptSelfEmail"> - Veuillez saisir votre adresse e-mail. - </notification> - <notification name="PromptMissingSubjMsg"> - Envoyer la photo avec le sujet ou le message par défaut ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ErrorProcessingSnapshot"> - Erreur dans le traitement des données de la photo - </notification> - <notification name="ErrorEncodingSnapshot"> - Erreur d'encodage de la photo. - </notification> - <notification name="ErrorUploadingPostcard"> - Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON] - </notification> - <notification name="ErrorUploadingReportScreenshot"> - Une erreur est survenue lors du chargement de la capture d'écran destinée au rapport, suite au problème suivant : [REASON] - </notification> - <notification name="MustAgreeToLogIn"> - Pour vous connecter à [SECOND_LIFE], vous devez accepter les Conditions d'utilisation. - </notification> - <notification name="CouldNotPutOnOutfit"> - Impossible de mettre cet ensemble. -Ce dossier ne contient pas d'habits, de parties du corps ni de pièces jointes. - </notification> - <notification name="CannotWearTrash"> - Vous ne pouvez pas porter d'habits ni de parties du corps se trouvant dans la corbeille. - </notification> - <notification name="CannotWearInfoNotComplete"> - Vous ne pouvez pas porter cet article car il n'a pas encore été chargé. Veuillez réessayer dans une minute. - </notification> - <notification name="MustHaveAccountToLogIn"> - Oups! Vous avez oublié de fournir certaines informations. -Vous devez saisir le nom et le prénom de votre avatar. - -Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ? - <usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/> - </notification> - <notification name="AddClassified"> - Les petites annonces sont publiées à l'onglet Petites annonces de la section Recherche pendant une semaine. -Rédigez votre annonce, puis cliquez sur Publier pour l'ajouter à la liste des annonces. -Au moment de cliquer sur Publier, vous serez invité à payer des frais. -Plus vous payez cher, plus votre annonce est visible dans la liste ainsi que dans les résultats de recherche de mots-clés. - <usetemplate ignoretext="Lors de l'ajout d'une nouvelle petite annonce" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="DeleteClassified"> - Supprimer l'annonce [NAME] ? -Une fois payés, les frais ne sont pas remboursables. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ClassifiedSave"> - Enregistrer les changements dans l'annonce [NAME] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> - </notification> - <notification name="DeleteAvatarPick"> - Supprimer le favori [PICK] ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="PromptGoToEventsPage"> - Aller à la page web de [SECOND_LIFE] réservée aux événements ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="SelectProposalToView"> - Veuillez sélectionner une proposition. - </notification> - <notification name="SelectHistoryItemToView"> - Veuillez sélectionner un historique. - </notification> - <notification name="ResetShowNextTimeDialogs"> - Souhaitez-vous réactiver tous les pop-ups que vous aviez désactivés ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="SkipShowNextTimeDialogs"> - Voulez-vous désactiver tous les pop-ups qui peuvent être évités ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="CacheWillClear"> - Le cache sera vidé après le redémarrage de [APP_NAME]. - </notification> - <notification name="CacheWillBeMoved"> - Le cache sera déplacé après le redémarrage de [APP_NAME]. -Remarque : cela videra le cache. - </notification> - <notification name="ChangeConnectionPort"> - Les paramètres du port prendront effet après le redémarrage de [APP_NAME]. - </notification> - <notification name="ChangeSkin"> - Le nouveau thème apparaîtra après le redémarrage de [APP_NAME]. - </notification> - <notification name="GoToAuctionPage"> - Aller à la page web de [SECOND_LIFE] pour voir le détail des enchères ou enchérir ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="SaveChanges"> - Enregistrer les changements ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> - </notification> - <notification name="GestureSaveFailedTooManySteps"> - L'enregistrement du geste a échoué. -Il y a trop d'étapes dans ce geste. -Essayez d'en supprimer quelques-unes. - </notification> - <notification name="GestureSaveFailedTryAgain"> - L'enregistrement du geste a échoué. Veuillez réessayer dans une minute. - </notification> - <notification name="GestureSaveFailedObjectNotFound"> - Le geste n'a pas pu être enregistré car l'objet ou l'inventaire de l'objet associé n'a pas été trouvé. -L'objet est peut-être inaccessible ou a peut-être été supprimé. - </notification> - <notification name="GestureSaveFailedReason"> - Une erreur est survenue lors de l'enregistrement du geste, suite au problème suivant : [REASON]. Essayez d'enregistrer votre geste ultérieurement. - </notification> - <notification name="SaveNotecardFailObjectNotFound"> - La note n'a pas pu être enregistrée car l'objet ou l'inventaire de l'objet associé n'a pas été trouvé. -L'objet est peut-être inaccessible ou a peut-être été supprimé. - </notification> - <notification name="SaveNotecardFailReason"> - Une erreur est survenue lors de l'enregistrement de la note, suite au problème suivant : [REASON]. Essayez d'enregistrer votre note ultérieurement. - </notification> - <notification name="ScriptCannotUndo"> - Impossible d'annuler tous les changements dans votre version du script. -Souhaitez-vous charger la dernière version enregistrée sur le serveur ? -(**Attention** Cette opération est irréversible.) - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="SaveScriptFailReason"> - Une erreur est survenue lors de l'enregistrement du script, suite au problème suivant : [REASON]. Essayez d'enregistrer votre script ultérieurement. - </notification> - <notification name="SaveScriptFailObjectNotFound"> - Impossible d'enregistrer le script car l'objet qui le contient est introuvable. -L'objet est peut-être inaccessible ou a peut-être été supprimé. - </notification> - <notification name="SaveBytecodeFailReason"> - Une erreur est survenue lors de l'enregistrement du script compilé, suite au problème suivant : [REASON]. Essayez d'enregistrer votre script ultérieurement. - </notification> - <notification name="CouldNotStartStopScript"> - Impossible de lancer ou d'arrêter le script car l'objet qui le contient est introuvable. -L'objet est peut-être inaccessible ou a peut-être été supprimé. - </notification> - <notification name="CannotDownloadFile"> - Impossible de télécharger le fichier - </notification> - <notification name="CannotWriteFile"> - Impossible d'écrire le fichier [[FILE]] - </notification> - <notification name="UnsupportedHardware"> - Avertissement : vous n'avez pas la configuration système requise pour utiliser [APP_NAME]. Si vous continuez à utiliser [APP_NAME], votre performance risque d'être moindre. Malheureusement, nous n'offrons aucune assistance pour les problèmes de configuration système. - -MINSPECS -Voulez-vous visiter [_URL] pour plus d'informations ? - <url name="url" option="0"> - http://secondlife.com/support/sysreqs.php?lang=fr - </url> - <usetemplate ignoretext="Lors de la détection de matériel non pris en charge" name="okcancelignore" notext="Non" yestext="Oui"/> - </notification> - <notification name="UnknownGPU"> - Votre système contient une carte graphique que nous ne connaissons pas actuellement. -Cela est souvent le cas avec le nouveau materiel qui n'a pas encore été testé. -Vous pourrez probablement utiliser [APP_NAME] sans problème, mais vous devrez peut-être ajuster les paramètres de vos graphiques. -(Menu Édition > Préférences > Graphiques). - <form name="form"> - <ignore name="ignore" text="Lors de la détection d'une carte graphique inconnue"/> - </form> - </notification> - <notification name="DisplaySettingsNoShaders"> - [APP_NAME] a planté lors de l'initialisation des drivers graphiques. -La qualité des graphiques sera paramétrée sur Faible pour éviter certaines erreurs de driver fréquentes. -Certaines fonctionnalités graphiques seront donc désactivées. -Nous vous recommandons de mettre à jour les drivers de votre carte graphique. -La qualité des graphiques peut être augmentée à la section Préférences > Graphiques - </notification> - <notification name="RegionNoTerraforming"> - Le terraformage est interdit dans la région [REGION]. - </notification> - <notification name="CannotCopyWarning"> - Vous n'êtes pas autorisé à copier cet objet et il disparaîtra de votre inventaire si vous le donnez. Souhaitez-vous vraiment offrir cet objet ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="CannotGiveItem"> - Impossible de donner l'objet de l'inventaire. - </notification> - <notification name="TransactionCancelled"> - Transaction annulée. - </notification> - <notification name="TooManyItems"> - Impossible de donner plus de 42 objets au cours d'un seul transfert d'inventaire. - </notification> - <notification name="NoItems"> - Vous n'êtes pas autorisé à transférer les objets sélectionnés. - </notification> - <notification name="CannotCopyCountItems"> - Vous n'êtes pas autorisé à copier [COUNT] des objets sélectionnés. Ces objets disparaîtront de votre inventaire. -Souhaitez-vous vraiment donner ces objets ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="CannotGiveCategory"> - Vous n'êtes pas autorisé à transférer le dossier sélectionné. - </notification> - <notification name="FreezeAvatar"> - Geler cet avatar ? -Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde. - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Dégeler" yestext="Geler"/> - </notification> - <notification name="FreezeAvatarFullname"> - Geler [AVATAR_NAME] ? -Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde. - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Dégeler" yestext="Geler"/> - </notification> - <notification name="EjectAvatarFullname"> - Expulser [AVATAR_NAME] de votre terrain ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Expulser et bannir" yestext="Expulser"/> - </notification> - <notification name="EjectAvatarNoBan"> - Expulser cet avatar de votre terrain ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/> - </notification> - <notification name="EjectAvatarFullnameNoBan"> - Expulser [AVATAR_NAME] de votre terrain ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/> - </notification> - <notification name="AcquireErrorTooManyObjects"> - Erreur d'acquisition : trop d'objets sélectionnés. - </notification> - <notification name="AcquireErrorObjectSpan"> - Erreur d'acquisition : les objets sont répartis dans plus d'une région. -Veuillez mettre tous les objets que vous souhaitez acquérir dans la même région. - </notification> - <notification name="PromptGoToCurrencyPage"> - [EXTRA] - -Aller sur [_URL] pour obtenir des informations sur l'achat de L$ ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="UnableToLinkObjects"> - Impossible de lier ces [COUNT] objets. -Vous pouvez lier un maximum de [MAX] objets. - </notification> - <notification name="CannotLinkIncompleteSet"> - Vous ne pouvez lier que des ensembles d'objets complets et vous devez choisir un minimum de deux objets. - </notification> - <notification name="CannotLinkModify"> - Impossible de lier car vous n'avez pas le droit de modifier tous les objets. - -Assurez-vous que vous êtes le propriétaire de tous les objets et qu'aucun d'eux n'est verrouillé. - </notification> - <notification name="CannotLinkDifferentOwners"> - Impossible de lier car les objets n'ont pas tous le même propriétaire. - -Assurez-vous que vous êtes le propriétaire de tous les objets sélectionnés. - </notification> - <notification name="NoFileExtension"> - Pas d'extension pour le fichier suivant : '[FILE]' - -Assurez-vous que le fichier a l'extension correcte. - </notification> - <notification name="InvalidFileExtension"> - Extension de fichier [EXTENSION] invalide -[VALIDS] attendu - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotUploadSoundFile"> - Impossible de lire le fichier son chargé : -[FILE] - </notification> - <notification name="SoundFileNotRIFF"> - Il semble que le fichier ne soit pas un fichier RIFF WAVE : -[FILE] - </notification> - <notification name="SoundFileNotPCM"> - Il semble que le fichier ne soit pas un fichier audio PCM WAVE : -[FILE] - </notification> - <notification name="SoundFileInvalidChannelCount"> - Le fichier contient un nombre de canaux invalide (doit être mono ou stéréo) : -[FILE] - </notification> - <notification name="SoundFileInvalidSampleRate"> - Le fichier ne semble pas être pris en charge (doit être 44,1 k) : -[FILE] - </notification> - <notification name="SoundFileInvalidWordSize"> - Le fichier ne semble pas être pris en charge (doit faire 8 ou 16 bit) : -[FILE] - </notification> - <notification name="SoundFileInvalidHeader"> - Impossible de trouver les données dans l'en-tête WAV : -[FILE] - </notification> - <notification name="SoundFileInvalidTooLong"> - Le fichier audio est trop long (10 secondes maximum) : -[FILE] - </notification> - <notification name="ProblemWithFile"> - Problème avec le fichier [FILE] : - -[ERROR] - </notification> - <notification name="CannotOpenTemporarySoundFile"> - Impossible d'ouvrir le fichier son compressé temporaire : [FILE] - </notification> - <notification name="UnknownVorbisEncodeFailure"> - Échec d'encodage Vorbis inconnu sur : [FILE] - </notification> - <notification name="CannotEncodeFile"> - Impossible d'encoder le fichier : [FILE] - </notification> - <notification name="CorruptResourceFile"> - Fichier ressource corrompu : [FILE] - </notification> - <notification name="UnknownResourceFileVersion"> - Version de fichier ressource Linden inconnu : [FILE] - </notification> - <notification name="UnableToCreateOutputFile"> - Impossible de créer le fichier de sortie : [FILE] - </notification> - <notification name="DoNotSupportBulkAnimationUpload"> - Actuellement, nous ne prenons pas en charge le chargement de lots de fichiers d'animation. - </notification> - <notification name="CannotUploadReason"> - Impossible de charger [FILE] suite au problème suivant : [REASON] -Veuillez réessayer ultérieurement. - </notification> - <notification name="CannotCreateLandmarkNotOwner"> - Vous ne pouvez pas créer de repère ici car le propriétaire du terrain ne l'autorise pas. - </notification> - <notification name="CannotRecompileSelectObjectsNoScripts"> - Impossible d'effectuer les recompilations. -Sélectionnez un objet avec un script. - </notification> - <notification name="CannotRecompileSelectObjectsNoPermission"> - Impossible d'effectuer les recompilations. - -Sélectionnez des objets qui ont des scripts et que vous pouvez modifier. - </notification> - <notification name="CannotResetSelectObjectsNoScripts"> - Impossible d'effectuer la réinitialisation. - -Veuillez sélectionner des objets avec des scripts. - </notification> - <notification name="CannotResetSelectObjectsNoPermission"> - Impossible d'effectuer la réinitialisation. - -Sélectionnez des objets qui ont des scripts et que vous pouvez modifier. - </notification> - <notification name="CannotSetRunningSelectObjectsNoScripts"> - Impossible de définir les scripts sur « exécution ». - -Veuillez sélectionner des objets avec des scripts. - </notification> - <notification name="CannotSetRunningNotSelectObjectsNoScripts"> - Impossible de définir les scripts sur « non-exécution ». - -Veuillez sélectionner des objets avec des scripts. - </notification> - <notification name="NoFrontmostFloater"> - Aucun floater frontmost à sauvegarder. - </notification> - <notification name="SeachFilteredOnShortWords"> - Votre requête a été modifiée et les mots trops courts ont été supprimés. - -Recherche effectuée : [FINALQUERY] - </notification> - <notification name="SeachFilteredOnShortWordsEmpty"> - Vos termes de recherche étaient trop courts et aucune recherche n'a été effectuée. - </notification> - <notification name="CouldNotTeleportReason"> - Impossible de téléporter. -[REASON] - </notification> - <notification name="invalid_tport"> - Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir être téléporté. Si vous continuez à recevoir ce message, veuillez consulter le Support à  la page suivante : -www.secondlife.com/support - </notification> - <notification name="invalid_region_handoff"> - Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir être téléporté. Si vous continuez à recevoir ce message, veuillez consulter le Support à  la page suivante : -www.secondlife.com/support - </notification> - <notification name="blocked_tport"> - Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment. -Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème. - </notification> - <notification name="nolandmark_tport"> - Désolé, le système n'a pas réussi à localiser la destination de votre repère. - </notification> - <notification name="timeout_tport"> - Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. -Veuillez réessayer dans un moment. - </notification> - <notification name="noaccess_tport"> - Désolé, vous n'avez pas accès à cette destination. - </notification> - <notification name="missing_attach_tport"> - Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter. - </notification> - <notification name="too_many_uploads_tport"> - Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée. - </notification> - <notification name="expired_tport"> - Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. - </notification> - <notification name="expired_region_handoff"> - Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. - </notification> - <notification name="no_host"> - Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes. - </notification> - <notification name="no_inventory_host"> - L'inventaire est temporairement indisponible. - </notification> - <notification name="CannotSetLandOwnerNothingSelected"> - Impossible de définir le propriétaire foncier : -aucune parcelle sélectionnée. - </notification> - <notification name="CannotSetLandOwnerMultipleRegions"> - Impossible de définir un propriétaire car la sélection couvre plusieurs régions. Veuillez sélectionner une zone plus petite et réessayer. - </notification> - <notification name="ForceOwnerAuctionWarning"> - Cette parcelle est mise aux enchères. Définir un propriétaire annulerait les enchères, ce qui pourrait être gênant pour certains résidents si ces dernières ont commencé. Souhaitez-vous définir un propriétaire ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="CannotContentifyNothingSelected"> - Problème : -Aucune parcelle sélectionnée. - </notification> - <notification name="CannotContentifyNoRegion"> - Problème : -Aucune région sélectionnée. - </notification> - <notification name="CannotReleaseLandNothingSelected"> - Impossible d'abandonner le terrain : -aucune parcelle sélectionnée. - </notification> - <notification name="CannotReleaseLandNoRegion"> - Impossible d'abandonner le terrain : -la région est introuvable. - </notification> - <notification name="CannotBuyLandNothingSelected"> - Impossible d'acheter le terrain : -aucune parcelle sélectionnée. - </notification> - <notification name="CannotBuyLandNoRegion"> - Impossible d'acheter le terrain : -la région dans laquelle il est situé est introuvable. - </notification> - <notification name="CannotCloseFloaterBuyLand"> - Vous ne pouvez pas fermer la fenêtre Acheter le terrain avant que [APP_NAME] n'estime le montant de cette transaction. - </notification> - <notification name="CannotDeedLandNothingSelected"> - Cession du terrain impossible : -aucune parcelle sélectionnée. - </notification> - <notification name="CannotDeedLandNoGroup"> - Cession du terrain impossible : -aucun groupe sélectionné. - </notification> - <notification name="CannotDeedLandNoRegion"> - Cession du terrain impossible : -la région dans laquelle il est situé est introuvable. - </notification> - <notification name="CannotDeedLandMultipleSelected"> - Cession du terrain impossible : -plusieurs parcelles sélectionnées. - -Essayez de ne sélectionner qu'une seule parcelle. - </notification> - <notification name="ParcelCanPlayMedia"> - Cette parcelle propose des flux média. -Pour jouer des flux média, il faut avoir une connexion internet rapide. - -Jouer les flux média lorsqu'ils sont disponibles ? -(Vous pourrez modifier cette option ultérieurement sous Préférences > Audio et vidéo.) - <usetemplate name="okcancelbuttons" notext="Désactiver" yestext="Jouer le média"/> - </notification> - <notification name="CannotDeedLandWaitingForServer"> - Cession du terrain impossible : -rapport de propriété sur le point d'être envoyé par le serveur. - -Merci de réessayer. - </notification> - <notification name="CannotDeedLandNoTransfer"> - Cession du terrain impossible : -la cession de terrain est interdite dans la région [REGION]. - </notification> - <notification name="CannotReleaseLandWatingForServer"> - Impossible d'abandonner le terrain : -mise à jour des informations sur la parcelle sur le point d'être envoyée par le serveur. - -Veuillez réessayer dans quelques secondes. - </notification> - <notification name="CannotReleaseLandSelected"> - Impossible d'abandonner le terrain : -vous n'êtes pas le propriétaire des parcelles sélectionnées. - -Veuillez sélectionner une seule parcelle. - </notification> - <notification name="CannotReleaseLandDontOwn"> - Impossible d'abandonner le terrain : -vous n'avez pas le droit de libérer cette parcelle. -Les parcelles qui vous appartiennent sont en vert. - </notification> - <notification name="CannotReleaseLandRegionNotFound"> - Impossible d'abandonner le terrain : -la région dans laquelle il est situé est introuvable. - </notification> - <notification name="CannotReleaseLandNoTransfer"> - Impossible d'abandonner le terrain : -le transfert de terrain est interdit dans la région [REGION]. - </notification> - <notification name="CannotReleaseLandPartialSelection"> - Impossible d'abandonner le terrain : -vous devez sélectionner une parcelle entière pour la libérer. - -Sélectionnez toute la parcelle ou divisez-la d'abord. - </notification> - <notification name="ReleaseLandWarning"> - Vous vous apprêtez à libérer [AREA] m² de terrain. -Si vous libérez cette parcelle, elle sera supprimée de votre patrimoine, mais vous ne recevrez pas de L$. - -Libérer ce terrain ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNothingSelected"> - Division du terrain impossible : - -aucune parcelle sélectionnée. - </notification> - <notification name="CannotDivideLandPartialSelection"> - Division du terrain impossible : - -Toute la parcelle est sélectionnée. -Sélectionnez une partie de la parcelle uniquement. - </notification> - <notification name="LandDivideWarning"> - Si vous divisez ce terrain, cette parcelle sera partagée en deux et chaque parcelle pourra avoir ses propres paramètres. Après cette opération, certains paramètres reviendront aux paramètres par défaut. - -Diviser le terrain ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNoRegion"> - Division du terrain impossible : -la région dans laquelle il est situé est introuvable. - </notification> - <notification name="CannotJoinLandNoRegion"> - Impossible de fusionner le terrain : -la région dans laquelle il est situé est introuvable. - </notification> - <notification name="CannotJoinLandNothingSelected"> - Impossible de fusionner le terrain : -aucune parcelle sélectionnée. - </notification> - <notification name="CannotJoinLandEntireParcelSelected"> - Impossible de fusionner le terrain : -vous avez sélectionné une seule parcelle. - -Sélectionnez le terrain sur les deux parcelles. - </notification> - <notification name="CannotJoinLandSelection"> - Impossible de fusionner le terrain : -vous devez sélectionner au moins deux parcelles. - -Sélectionnez le terrain sur les deux parcelles. - </notification> - <notification name="JoinLandWarning"> - En fusionnant ce terrain, vous créerez une grande parcelle composée de toutes les parcelles se trouvant dans le rectangle sélectionné. -Vous devrez réinitialiser le nom et les options de la nouvelle parcelle. - -Fusionner le terrain ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ShowOwnersHelp"> - Afficher les propriétaires : -La couleur des parcelles indique le type de propriété. - -Vert = votre terrain -Turquoise = le terrain de votre groupe -Rouge = appartenant à d'autres -Jaune = en vente -Mauve = aux enchères -Gris = public - </notification> - <notification name="ConfirmNotecardSave"> - Cette note doit être sauvegardée avant que l'objet ne puisse être copié ou visualisé. Enregistrer la note ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmItemCopy"> - Copier cet objet dans votre inventaire ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Copier"/> - </notification> - <notification name="ResolutionSwitchFail"> - Échec du changement de résolution (à [RESX], de [RESY]) - </notification> - <notification name="ErrorUndefinedGrasses"> - Erreur : herbes non identifiées : [SPECIES] - </notification> - <notification name="ErrorUndefinedTrees"> - Erreur : arbres non identifiés : [SPECIES] - </notification> - <notification name="CannotSaveWearableOutOfSpace"> - Impossible de sauvegarder [NAME]. Pour pouvoir sauvegarder ce fichier, vous devez d'abord libérer de la mémoire sur votre ordinateur. - </notification> - <notification name="CannotSaveToAssetStore"> - Impossible de sauvegarder le fichier [NAME] dans la base de données centrale. -Cette erreur est généralement temporaire. Veuillez éditer et sauvegarder l'élément endossable à nouveau d'ici quelques minutes. - </notification> - <notification name="YouHaveBeenLoggedOut"> - Vous avez été déconnecté(e) de [SECOND_LIFE] : - [MESSAGE] -Vous pouvez afficher vos messages instantanés et votre chat en cliquant sur Afficher IM et chat. Sinon, cliquez sur Quitter pour quitter immédiatement [APP_NAME]. - <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Afficher IM et chat"/> - </notification> - <notification name="OnlyOfficerCanBuyLand"> - Impossible d'acheter du terrain pour le groupe : -Vous n'avez pas le droit d'acheter de terrain pour votre groupe. - </notification> - <notification label="Devenir amis" name="AddFriend"> - Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu'ils se connectent. - -Proposer à [NAME] de devenir votre ami(e) ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification label="Devenir amis" name="AddFriendWithMessage"> - Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu'ils se connectent. - -Proposer à [NAME] de devenir votre ami(e) ? - <form name="form"> - <input name="message"> - Voulez-vous être mon ami(e) ? - </input> - <button name="Offer" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="RemoveFromFriends"> - Voulez-vous supprimer [FIRST_NAME] [LAST_NAME] de votre liste d'amis ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="RemoveMultipleFromFriends"> - Voulez-vous supprimer plusieurs résidents de votre liste d'amis ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="GodDeleteAllScriptedPublicObjectsByUser"> - Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains des autres résidents dans cette région ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="GodDeleteAllScriptedObjectsByUser"> - Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains de cette région ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="GodDeleteAllObjectsByUser"> - Êtes-vous certain de vouloir supprimer tous les objets (scriptés ou pas) appartenant à ** [AVATAR_NAME] ** sur tous les terrains de cette région ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BlankClassifiedName"> - Vous devez choisir un nom pour votre petite annonce. - </notification> - <notification name="MinClassifiedPrice"> - Le coût de l'annonce doit être de [MIN_PRICE] L$ minimum. - -Veuillez saisir un montant plus élevé. - </notification> - <notification name="ConfirmObjectDeleteLock"> - Au moins un des objets que vous avez sélectionnés est verrouillé. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopy"> - Au moins un des objets que vous avez sélectionnés n'est pas copiable. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoOwn"> - Au moins un des objets que vous avez sélectionnés ne vous appartient pas. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopy"> - Au moins un des objets est verrouillé. -Au moins un des objets n'est pas copiable. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoOwn"> - Au moins un des objets est verrouillé. -Au moins un des objets ne vous appartient pas. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - Au moins un des objets n'est pas copiable. -Au moins un des objets ne vous appartient pas. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> - Au moins un des objets est verrouillé. -Au moins un des objets n'est pas copiable. -Au moins un des objets ne vous appartient pas. - -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLock"> - Au moins un des objets est verrouillé. - -Êtes-vous certain de vouloir prendre ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeNoOwn"> - Vous n'êtes pas le propriétaire de tous les objets que vous prenez. -Si vous continuez, les droits accordés au prochain propriétaire seront activés et vous risquez de ne plus pouvoir modifier ou copier les objets. - -Êtes-vous certain de vouloir prendre ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLockNoOwn"> - Au moins un des objets est verrouillé. -Vous n'êtes pas le propriétaire de tous les objets que vous prenez. -Si vous continuez, les droits accordés au prochain propriétaire seront activés et vous risquez de ne plus pouvoir modifier ou copier les objets. -Par contre, vous pouvez prendre les objets sélectionnés. - -Êtes-vous certain de vouloir prendre ces objets ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="CantBuyLandAcrossMultipleRegions"> - Impossible d'acheter le terrain car la sélection couvre plusieurs régions. - -Veuillez sélectionner une zone plus petite et réessayer. - </notification> - <notification name="DeedLandToGroup"> - Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge. -Le prix de la vente du terrain n'est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe. - -Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="DeedLandToGroupWithContribution"> - Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge. -La cession incluera une contribution de terrain simultanée au groupe de [FIRST_NAME] [LAST_NAME]. -Le prix de la vente du terrain n'est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe. - -Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="DisplaySetToSafe"> - Les paramètres d'affichage sont au niveau le plus sûr, comme vous l'aviez indiqué. - </notification> - <notification name="DisplaySetToRecommended"> - Vos paramètres d'affichage ont été réglés avec une marge de sécurité en fonction de votre configuration système. - </notification> - <notification name="ErrorMessage"> - [ERROR_MESSAGE] - </notification> - <notification name="AvatarMoved"> - L'emplacement [TYPE] n'est pas disponible actuellement. [HELP] -Vous avez été déplacé dans une région voisine. - </notification> - <notification name="ClothingLoading"> - Vos habits sont toujours en train d'être téléchargés. -Vous pouvez utiliser [SECOND_LIFE] sans problème, les autres résidents vous voient normalement. - <form name="form"> - <ignore name="ignore" text="Lorsque les habits prennent longtemps à télécharger"/> - </form> - </notification> - <notification name="FirstRun"> - L'installation de [APP_NAME] est terminée. - -S'il s'agit de la première fois que vous utilisez [SECOND_LIFE], vous devrez créer un compte avant de pouvoir vous connecter. -Retourner sur www.secondlife.com pour créer un nouveau compte ? - <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Nouveau compte..."/> - </notification> - <notification name="LoginPacketNeverReceived"> - Vous avez des problèmes à vous connecter. Il peut s'agir d'un problème avec votre connexion internet ou les serveurs de [SECOND_LIFE]. - -Nous vous conseillons de vérifier votre connexion Internet et de réessayer dans quelques minutes, de cliquer sur Aide, ou bien de cliquer sur Téléporter pour être téléporté vers votre domicile. - <form name="form"> - <button name="OK" text="OK"/> - <button name="Help" text="Aide"/> - <button name="Teleport" text="Téléporter"/> - </form> - </notification> - <notification name="WelcomeChooseSex"> - Votre personnage va apparaître dans un moment. - -Pour marcher, utilisez les flèches de direction. -Appuyez sur F1 pour obtenir de l'aide ou en savoir plus sur [SECOND_LIFE]. -Choisissez un avatar homme ou femme. -Vous pourrez revenir sur votre décision plus tard. - <usetemplate name="okcancelbuttons" notext="Femme" yestext="Homme"/> - </notification> - <notification name="NotEnoughCurrency"> - [NAME] [PRICE] L$ Vous n'avez pas suffisamment de L$ pour faire cela. - </notification> - <notification name="GrantedModifyRights"> - Vous avez reçu le droit de modifier les objets de [FIRST_NAME] [LAST_NAME]. - </notification> - <notification name="RevokedModifyRights"> - Vous n'avez plus le droit de modifier les objets de [FIRST_NAME] [LAST_NAME]. - </notification> - <notification name="FlushMapVisibilityCaches"> - Cela videra le cache cartographique de cette région. -Cela n'est vraiment utile que pour faire du débugage. -(En production, attendez 5 minutes. Les cartes seront mises à jour après reconnexion.) - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BuyOneObjectOnly"> - Impossible d'acheter plus d'un objet à la fois. Veuillez ne sélectionner qu'un seul objet. - </notification> - <notification name="OnlyCopyContentsOfSingleItem"> - Impossible de copier les contenus de plus d'un objet à la fois. -Veuillez ne sélectionner qu'un seul objet. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="KickUsersFromRegion"> - Téléporter tous les résidents de cette région chez eux ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="EstateObjectReturn"> - Etes-vous certain de vouloir renvoyer les objets appartenant à [USER_NAME] ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="InvalidTerrainBitDepth"> - Impossible de definir les textures de la région : -La texture du terrain [TEXTURE_NUM] a une profondeur invalide ([TEXTURE_BIT_DEPTH]). - -Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus petite, puis cliquez à nouveau sur Appliquer. - </notification> - <notification name="InvalidTerrainSize"> - Impossible de definir les textures de la région : -La texture du terrain [TEXTURE_NUM] est trop volumineuse ([TEXTURE_SIZE_X] X [TEXTURE_SIZE_Y]). - -Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus petite, puis cliquez à nouveau sur Appliquer. - </notification> - <notification name="RawUploadStarted"> - Le chargement a commencé. Cela va prendre une à deux minutes, -suivant votre vitesse de connexion. - </notification> - <notification name="ConfirmBakeTerrain"> - Etes-vous sûr(e) de vouloir figer le relief actuel, en faire le point central des limites d'élévation/abaissement de relief et la valeur par défaut du bouton Annuler modification ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="MaxAllowedAgentOnRegion"> - Vous ne pouvez pas autoriser plus de [MAX_AGENTS] résidents. - </notification> - <notification name="MaxBannedAgentsOnRegion"> - Vous ne pouvez pas bannir plus de [MAX_BANNED] résidents. - </notification> - <notification name="MaxAgentOnRegionBatch"> - Echec lors de la tentative d'ajout de [NUM_ADDED] agents : -Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS]. - </notification> - <notification name="MaxAllowedGroupsOnRegion"> - Vous ne pouvez pas avoir plus que [MAX_GROUPS] groupes autorisés. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Figer"/> - </notification> - <notification name="MaxManagersOnRegion"> - Vous ne pouvez avoir que [MAX_MANAGER] gérants de domaine. - </notification> - <notification name="OwnerCanNotBeDenied"> - Impossible d'ajouter le propriétaire du domaine à la liste des résidents bannis. - </notification> - <notification name="CanNotChangeAppearanceUntilLoaded"> - Impossible de changer d'apparence jusqu'à ce que les habits et la silhouette soient chargés. - </notification> - <notification name="ClassifiedMustBeAlphanumeric"> - Le nom de votre petite annonce doit commencer par un chiffre ou une lettre (A à Z). La ponctuation n'est pas autorisée. - </notification> - <notification name="CantSetBuyObject"> - Cet objet n'est pas à vendre. -Veuillez choisir un objet à vendre et réessayer. - </notification> - <notification name="FinishedRawDownload"> - Chargement du fichier de terrain raw effectué vers : -[DOWNLOAD_PATH]. - </notification> - <notification name="DownloadWindowsMandatory"> - Une nouvelle version de [APP_NAME] est disponible. -[MESSAGE] -Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour. - <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/> - </notification> - <notification name="DownloadWindows"> - Une mise à jour de [APP_NAME] est disponible. -[MESSAGE] -Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. - <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> - </notification> - <notification name="DownloadWindowsReleaseForDownload"> - Une mise à jour de [APP_NAME] est disponible. -[MESSAGE] -Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. - <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> - </notification> - <notification name="DownloadMacMandatory"> - Une nouvelle version de [APP_NAME] est disponible. -[MESSAGE] -Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour. - -Télécharger vers le dossier Applications ? - <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/> - </notification> - <notification name="DownloadMac"> - Une mise à jour de [APP_NAME] est disponible. -[MESSAGE] -Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. - -Télécharger vers le dossier Applications ? - <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> - </notification> - <notification name="DownloadMacReleaseForDownload"> - Une mise à jour de [APP_NAME] est disponible. -[MESSAGE] -Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. - -Télécharger vers le dossier Applications ? - <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> - </notification> - <notification name="DeedObjectToGroup"> - Si vous cédez cet objet, le groupe : -* recevra les L$ versés pour l'objet ; - <usetemplate ignoretext="Lors de la cession d'objets au groupe" name="okcancelignore" notext="Annuler" yestext="Céder"/> - </notification> - <notification name="WebLaunchExternalTarget"> - Ouvrir votre navigateur web système pour afficher ce contenu ? - <usetemplate ignoretext="Lors de l'ouverture de votre navigateur système pour afficher une page web" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="WebLaunchJoinNow"> - Aller sur www.secondlife.com pour gérer votre compte ? - <usetemplate ignoretext="Lors de l'ouverture du navigateur web pour gérer votre compte" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="WebLaunchSecurityIssues"> - Pour apprendre à signaler un problème de sécurité, consultez le Wiki de [SECOND_LIFE]. - <usetemplate ignoretext="Lors de l'ouverture du navigateur web pour consulter la page Wiki sur les problèmes de sécurité." name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="WebLaunchQAWiki"> - Consultez le Wiki sur l'Assurance Qualité de [SECOND_LIFE]. - <usetemplate ignoretext="Lors de l'ouverture du navigateur web pour consulter la page Wiki sur l'Assurance Qualité." name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="WebLaunchPublicIssue"> - Pour signaler des bugs et autres problèmes, utilisez le JIRA de [SECOND_LIFE]. - <usetemplate ignoretext="Lors de l'ouverture du navigateur web pour consulter le JIRA" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/> - </notification> - <notification name="WebLaunchPublicIssueHelp"> - Pour apprendre à utiliser JIRA, consultez le Wiki de [SECOND_LIFE]. - <usetemplate ignoretext="Lors de l'ouverture du navigateur web pour consulter la page Wiki sur le JIRA" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/> - </notification> - <notification name="WebLaunchSupportWiki"> - Visitez le blog officiel des Lindens pour les dernières nouvelles et informations. - <usetemplate ignoretext="Lors de l'ouverture du navigateur web pour consulter le blog" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/> - </notification> - <notification name="WebLaunchLSLGuide"> - Consulter le Guide guide pour l'écriture de scripts pour obtenir de l'aide ? - <usetemplate ignoretext="Lors de l'ouverture du navigateur web pour voir le Guide pour l'écriture de scripts" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="WebLaunchLSLWiki"> - Consulter le Wiki LSL pour de l'aide sur les scripts ? - <usetemplate ignoretext="Lors de l'ouverture du navigateur web pour consulter le Guide sur l'écriture de scripts" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/> - </notification> - <notification name="ReturnToOwner"> - Êtes-vous certain de vouloir renvoyer les objets sélectionnés à leur propriétaire ? Les objets donnés transférables seront renvoyés à leur ancien propriétaire. - -*Avertissement* Les objets non transférables seront supprimés ! - <usetemplate ignoretext="Lors du renvoi d'objets à leurs propriétaires" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="GroupLeaveConfirmMember"> - Vous êtes actuellement membre du groupe [GROUP]. -Quitter le groupe ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmKick"> - Souhaitez-vous vraiment éjecter tous les utilisateurs de la grille ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Éjecter tous"/> - </notification> - <notification name="MuteLinden"> - Désolé, vous ne pouvez pas ignorer un Linden. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotStartAuctionAlreadyForSale"> - Vous ne pouvez pas démarrer des enchères sur une parcelle déjà en vente. Si vous êtes certain de vouloir démarrer des enchères, mettez fin à la vente. - </notification> - <notification label="Échec de la fonction Ignorer les objets par nom" name="MuteByNameFailed"> - Vous ignorez déjà ce résident. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RemoveItemWarn"> - Si vous supprimez des contenus, vous risquez d'endommager l'objet. Souhaitez-vous supprimer cet objet ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="CantOfferCallingCard"> - Impossible d'offrir une carte de visite actuellement. Veuillez réessayer dans un moment. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CantOfferFriendship"> - Impossible de proposer votre amitié actuellement. Veuillez réessayer dans un moment. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="BusyModeSet"> - Mode occupé activé. -Les chats et les messages instantanés ne s'afficheront pas. Vous répondrez aux messages instantanés en utilisant la réponse automatique que vous avez créée. Toutes les propositions de téléportation seront refusées. Tous objets envoyés iront dans la corbeille. - <usetemplate ignoretext="Lors de l'utilisation du mode Occupé" name="okignore" yestext="OK"/> - </notification> - <notification name="JoinedTooManyGroupsMember"> - Vous appartenez déjà à un nombre élevé de groupes et nous ne pouvez pas en rejoindre un nouveau. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre. -Pour quitter un groupe, sélectionnez l'option Groupe dans le menu Éditer. -[NAME] vous invite à rejoindre un groupe. -[INVITE] - <usetemplate name="okcancelbuttons" notext="Refuser" yestext="Rejoindre"/> - </notification> - <notification name="KickUser"> - Éjecter cet utilisateur avec quel message ? - <form name="form"> - <input name="message"> - Un administrateur vous a déconnecté. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="KickAllUsers"> - Éjecter tous les résidents actuellement en ligne avec quel message ? - <form name="form"> - <input name="message"> - Un administrateur vous a déconnecté. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="FreezeUser"> - Geler cet utilisateur avec quel message ? - <form name="form"> - <input name="message"> - Vous avez été gelé. Vous ne pouvez ni bouger ni chatter. Un administrateur va vous envoyer un message instantané (IM). - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="UnFreezeUser"> - Dégeler cet utilisateur avec quel message ? - <form name="form"> - <input name="message"> - Vous n'êtes plus gelé. - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="OfferTeleport"> - Proposez une téléportation avec le message suivant ? - <form name="form"> - <input name="message"> - On se rejoint à [REGION] ? - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="OfferTeleportFromGod"> - Demander au résident de venir vous rejoindre ? - <form name="form"> - <input name="message"> - On se rejoint à [REGION] ? - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="TeleportFromLandmark"> - Êtes-vous certain de vouloir être téléporté ? - <usetemplate ignoretext="Lors de la téléportation depuis un repère de l'inventaire" name="okcancelignore" notext="Annuler" yestext="Téléporter"/> - </notification> - <notification label="Envoyer un message à tout le monde dans votre domaine" name="MessageEstate"> - Saisissez un message court qui sera envoyé à tous les résidents se trouvant actuellement sur votre domaine. - <form name="form"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification label="Modifier un domaine Linden" name="ChangeLindenEstate"> - Vous vous apprêtez à modifier un domaine appartenant aux Lindens (continent, zone réservée aux ados, orientation etc.). - -Cela est extrêmement délicat car l'expérience des résidents est en jeu. Sur le continent, cela modifiera des milliers de régions et sera difficile à digérer pour le serveur. - -Continuer ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification label="Modifier l'accès à un domaine Linden" name="ChangeLindenAccess"> - Vous vous apprêtez à modifier la liste d'accès à un domaine appartenant aux Linden (continent, zone réservée aux ados, orientation etc.). - -Cette action est délicate et ne doit être effectuée que pour appeler le hack autorisant des objets/L$ à être transférés à l'intérieur/extérieur de la grille. -Cette action modifiera des milliers de régions et sera difficile à digérer pour le serveur. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification label="Choisir le domaine" name="EstateAllowedAgentAdd"> - Ajouter à la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateAllowedAgentRemove"> - Supprimer de la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateAllowedGroupAdd"> - Ajouter à la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateAllowedGroupRemove"> - Supprimer de la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateBannedAgentAdd"> - Refuser l'accès à ce domaine uniquement ou à [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateBannedAgentRemove"> - Supprimer ce résident de la liste des résidents bannis pour ce domaine uniquement ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateManagerAdd"> - Ajouter un gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Choisir le domaine" name="EstateManagerRemove"> - Supprimer le gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> - </notification> - <notification label="Confirmer" name="EstateKickUser"> - Éjecter [EVIL_USER] de ce domaine ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="EstateChangeCovenant"> - Êtes-vous certain de vouloir modifier le règlement du domaine ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="RegionEntryAccessBlocked"> - Votre catégorie d'accès ne vous autorise pas à pénétrer dans cette région. Cela vient peut-être du fait qu'il manquait des informations pour valider votre âge. - -Vérifiez que vous avez la toute dernière version du client et consultez les pages d'aide pour savoir comment accéder aux zones ayant ce niveau d'accès. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RegionEntryAccessBlocked_KB"> - Votre catégorie d'accès ne vous permet pas de pénétrer dans cette région. - -Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? - <url name="url"> - http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB) - </url> - <usetemplate ignoretext="Lorsque l'accès à une région est bloqué à cause de la catégorie d'accès" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d'aide"/> - </notification> - <notification name="RegionEntryAccessBlocked_Notify"> - Votre catégorie d'accès ne vous permet pas de pénétrer dans cette région. - </notification> - <notification name="RegionEntryAccessBlocked_Change"> - Votre catégorie d'accès ne vous permet pas de pénétrer dans cette région. - -En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d'accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition > Préférences... > Général. - <form name="form"> - <button - name="OK" - text="Modifier les Préférences"/> - <button - default="true" - name="Cancel" - text="Fermer"/> - <ignore name="ignore" text="Lorsque l'accès à une région est bloqué à cause des préférences concernant la catégorie d'accès"/> - </form> - </notification> - <notification name="LandClaimAccessBlocked"> - Votre catégorie d'accès ne vous permet pas de réclamer cette région. Cela vient peut-être du fait qu'il manquait des informations pour valider votre âge. - -Vérifiez que vous avez la toute dernière version du client et consultez les pages d'aide pour savoir comment accéder aux zones ayant ce niveau d'accès. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandClaimAccessBlocked_KB"> - Votre catégorie d'accès ne vous permet pas de réclamer cette région. - -Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? - <url name="url"> - http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB) - </url> - <usetemplate ignoretext="Lorsqu'une région ne peut pas être réclamée à cause de la catégorie d'accès" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d'aide"/> - </notification> - <notification name="LandClaimAccessBlocked_Notify"> - Votre catégorie d'accès ne vous autorise pas à réclamer cette région. - </notification> - <notification name="LandClaimAccessBlocked_Change"> - Votre catégorie d'accès ne vous permet pas de réclamer cette région. - -En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d'accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition > Préférences... > Général. - <usetemplate ignoretext="Lorsqu'une région ne peut pas être réclamée à cause des préférences concernant la catégorie d'accès" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/> - </notification> - <notification name="LandBuyAccessBlocked"> - Votre catégorie d'accès ne vous permet pas d'acheter cette région. Cela vient peut-être du fait qu'il manquait des informations pour valider votre âge. - -Vérifiez que vous avez la toute dernière version du client et consultez les pages d'aide pour savoir comment accéder aux zones ayant ce niveau d'accès. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandBuyAccessBlocked_KB"> - Votre catégorie d'accès ne vous permet pas d'acheter cette région. - -Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? - <url name="url"> - http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB) - </url> - <usetemplate ignoretext="Lorsqu'une région ne peut pas être achetée à cause de la catégorie d'accès" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d'aide"/> - </notification> - <notification name="LandBuyAccessBlocked_Notify"> - Votre catégorie d'accès ne vous permet pas d'acheter cette région. - </notification> - <notification name="LandBuyAccessBlocked_Change"> - Votre catégorie d'accès ne vous autorise pas à acheter cette région. - -En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d'accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition > Préférences... > Général. - <usetemplate ignoretext="Lorsqu'une région ne peut pas être achetée à cause des préférences concernant la catégorie d'accès" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/> - </notification> - <notification name="TooManyPrimsSelected"> - "Vous avez sélectionné trop de prims. Veuillez sélectionner au maximum [MAX_PRIM_COUNT] prims et réessayer." - </notification> - <notification name="ProblemImportingEstateCovenant"> - Problème lors de l'importation du règlement du domaine. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ProblemAddingEstateManager"> - Problèmes lors de l'ajout d'un nouveau gérant de domaine. Il est possible qu'au moins un des domaines ait une liste de gérants complète. - </notification> - <notification name="ProblemAddingEstateGeneric"> - Problème lors de l'ajout à la liste de ce domaine. Il est possible qu'au moins un des domaines ait une liste complète. - </notification> - <notification name="UnableToLoadNotecardAsset"> - Impossible de charger les données de la note actuellement. - </notification> - <notification name="NotAllowedToViewNotecard"> - Permissions pour afficher la note insuffisantes. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MissingNotecardAssetID"> - Les références de la note ne se trouvent pas dans la base de données. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PublishClassified"> - Rappel : les frais pour passer des petites annonces ne sont pas remboursables. - -Publier cette petite annonce maintenant pour [AMOUNT] L$ ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="SetClassifiedMature"> - Cette petite annonce contient-elle du contenu Mature ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="SetGroupMature"> - Ce groupe contient-il du contenu Mature ? - <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification label="Confirmer le redémarrage" name="ConfirmRestart"> - Souhaitez-vous vraiment redémarrer cette région dans 2 minutes ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification label="Envoyer un message à la région" name="MessageRegion"> - Saisissez une message qui sera envoyé à tous les résidents présents dans cette région. - <form name="form"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification label="Interdire le terraformage" name="HelpRegionBlockTerraform"> - Si vous cochez cette case, les propriétaires ne pourront plus terraformer leur terrain, quel que soit le paramétrage individuel des parcelles. - -Valeur par défaut : désactivé - </notification> - <notification label="Interdire le vol" name="HelpRegionBlockFly"> - Si vous cochez cette case, les résidents ne pourront plus voler dans cette région, quel que soit le paramétrage individuel des parcelles. - -Valeur par défaut : désactivé - </notification> - <notification label="Modifications groupées des droits relatifs au contenu" name="HelpBulkPermission"> - L'outil Modifications groupées des droits vous permet de modifier rapidement et simultanément les droits dans les contenus des objets séléctionnés. Notez toutefois que vous paramétrez uniquement les droits des objets dans les Contenus des objets sélectionnés, et non les droits sur les objets eux-mêmes. - -Notez aussi que les droits ne s'appliquent pas aux contenus imbriqués dans les objets contenus. Votre requête ne porte que sur les objets de premier niveau. - -Vous pouvez sélectionner quels types d'objets modifier à la section Types de contenu. Les photos sont incluses quand vous sélectionnez Textures. - -* Cet outil ne vous permettra de changer que les droits des objets que vous êtes autorisés à modifier. -* Vous ne pouvez pas accorder de droits que vous n'avez pas au prochain propriétaire. -* Les droits accordés au prochain propriétaire de sont que des requêtes. Si un objet ne peut recevoir tous les nouveaux droits, aucun de ses droits ne changera. - -Lorsque vous êtes prêt à modifier tous les droits, cliquez sur Appliquer et attendez de voir s'afficher les résultats. - -Si vous fermez la fenêtre des modifications groupées alors que les droits sont en train d'être modifiés, vous suspendez l'opération. - </notification> - <notification label="Autoriser les dégâts" name="HelpRegionAllowDamage"> - Si vous cochez cette case, les résidents peuvent subir des dégâts dans toute la région quel que soit le paramétrage individuel des parcelles. Si la case n'est pas cochée, les propriétaires sont libres d'activer ou non cette option sur leur parcelle. - -Valeur par défaut : désactivé - </notification> - <notification label="Nombre maximum d'avatars" name="HelpRegionAgentLimit"> - Définit le nombre maximum d'avatars autorisés dans cette région. -La performance peut varier en fonction du nombre d'avatars présents. - -Valeur par défaut : 40 - </notification> - <notification label="Bonus objet" name="HelpRegionObjectBonus"> - Le bonus objet est le multiplicateur de prims autorisées sur une parcelle donnée. L'échelle autorisée est comprise entre 1 et 10. Lorsque ce chiffre est de 1, chaque parcelle de 512 m² peut contenir 117 prims. S'il est de 2, chaque parcelle peut contenir 234 prims, ou deux fois plus, et ainsi de suite. Le nombre maximum de prims autorisées dans une région est de 15 000, quel que soit le bonus objet. Attention : si vous définissez un bonus objet et décidez ensuite de le diminuer, cela peut entraîner la suppression ou le renvoi d'objets. - -Valeur par défaut : 1.0 - </notification> - <notification label="Accès" name="HelpRegionMaturity"> - Définit la catégorie d'accès de la région, telle qu'affichée dans la barre de menu en haut du client et dans les infobulles de la carte lorsque vous passez votre curseur au-dessus de cette région. Ce paramètre affecte aussi l'accès à cette région et les résultats de recherche. Les autres résidents ne peuvent pénétrer que dans les régions ou n'afficher que les résultats de recherche ayant la même catégorie d'accès que celle indiquée dans leurs Préférences. - -Ce changement n'apparaîtra pas immédiatement sur la carte. - </notification> - <notification label="Interdire les bousculades" name="HelpRegionRestrictPushObject"> - Cette case permet de restreindre les bousculades dans toute une région. -Lorsqu'elle est cochée, les résidents ne peuvent être bousculés que par d'autres résidents ou par le propriétaire de la parcelle. -(Bousculer fait référence à la fonction LSL llPushObjet().) - -Valeur par défaut : désactivé - </notification> - <notification label="Fusionner/Diviser des parcelles" name="HelpParcelChanges"> - Cette case permet de choisir si les parcelles n'appartenant pas au gérant du domaine peuvent ou pas être fusionnées ou divisées. -Si cette case n'est pas cochée : - * Seuls les propriétaires ou gérants de domaine peuvent fusionner ou diviser des parcelles. - * Ils ne peuvent fusionner ou diviser que les parcelles du propriétaire, - ou celles d'un groupe dans lequel ils ont les pouvoirs nécessaires. - Si cette case est cochée : - * Tous les propriétaires peuvent fusionner ou diviser leurs parcelles. - * Pour les parcelles appartenant à un groupe, les membres avec les pouvoirs nécessaires peuvent fusionner ou diviser les parcelles. - -Valeur par défaut : activée - </notification> - <notification label="Ne pas afficher dans la recherche" name="HelpRegionSearch"> - Si vous cochez cette option, les propriétaires ne pourront pas faire apparaître leurs parcelles dans les résultats de recherche. -Valeur par défaut : désactivé - </notification> - <notification label="Catégorie de la région modifiée" name="RegionMaturityChange"> - La catégorie d'accès de cette région a été mise à jour. -Ce changement n'apparaîtra pas immédiatement sur la carte. - </notification> - <notification label="Revente de terrain" name="HelpRegionLandResell"> - Les propriétaires et gérants de domaine peuvent vendre n'importe quel terrain appartenant au propriétaire du domaine. -Si cette option n'est pas cochée, les propriétaires ne peuvent pas revendre leur parcelle. -Si cette option est cochée, les propriétaires sont libres de revendre leur parcelle. - -Valeur par défaut : désactivé - </notification> - <notification label="Désactiver les scripts" name="HelpRegionDisableScripts"> - Lorsque la performance d'une région est faible, cela peut venir d'un script. Ouvrez la section Statistiques (Ctrl+Maj+1) et vérifiez le FPS Physique (Physics FPS) de la section Simulateur. -Si le FPS est en dessous de 45, ouvrez la section Time située en fin de liste. Si le Script Time est au dessus de 25ms, cliquez sur le bouton Afficher les objets scriptés les plus consommateurs. Vous verrez le nom et l'emplacement des scripts éventuellement à l'origine du problème. - -Si vous cochez la case Désactiver les scripts et que vous appuyez sur Appliquer, tous les scripts de cette région seront temporairement désactivés. Vous devrez peut-être faire cela le temps d'arriver à l'endroit su script en cause. Une fois sur place, assurez-vous que le script est bien à l'origine du problème. Pour cela, vous devrez peut-être contacter le propriétaire du script ou bien supprimer ou renvoyer l'objet. -Décochez la case Désactiver le script, puis cliquez sur Appliquer pour réactiver tous les scripts dans la région. - -Valeur par défaut : désactivé - </notification> - <notification label="Désactiver les collisions" name="HelpRegionDisableCollisions"> - Des objets physiques peuvent fortement réduire les performances d'une région. -Ouvrez la barre de statistiques (Ctrl+Maj+1) et vérifiez le FPS Physique (Physics FPS) de la section Simulateur. -Si le FPS est en dessous de 45, ouvrez la section Time située en fin de liste. Si le Script Time est au dessus de 25ms, cliquez sur le bouton Afficher les collisions les plus consommatrices. -Vous verrez le nom et l'emplacement des objets physiques éventuellement à l'origine du problème. - -Si vous décochez la case Désactiver les collisions et que vous cliquez sur Appliquer, toutes les collisions entre objets seront désactivées. Vous pourrez avoir besoin de cette fonction le temps d'arriver à l'emplacement des objets en cause. Une fois sur place, vérifiez que l''objet est bien responsable du problème (entre-t-il sans cesse en collision avec d'autres objets ?) Pour cela, vous devrez peut-être contacter le propriétaire de l'objet ou bien supprimer ou renvoyer l'objet. -Décochez la case Désactiver les collisions, puis cliquez sur le bouton Appliquer pour réactiver les collisions dans la région. - -Valeur par défaut : désactivé - </notification> - <notification label="Désactiver la physique" name="HelpRegionDisablePhysics"> - L'option Désactiver la physique est similaire à l'option Désactiver les collisions sauf qu'elle englobe tous les effets liés à la physique. Cela signifie que les objets n'entreront plus en collision et que les avatars ne pourront plus bouger. - -Vous ne devriez utiliser cette option que lorsque l'option Désactiver les collisions n'améliore pas sufisamment la performance de la région pour résoudre un problème de physique ou trouver les objets entrant en collision. - -Une fois que vous avez fini, n'oubliez pas de réactiver les propriétés physiques sinon les avatars ne pourront pas bouger. - -Valeur par défaut : désactivé - </notification> - <notification label="Afficher les collisions les plus consommatrices" name="HelpRegionTopColliders"> - Montre une liste des objets générant le plus de collisions avec d'autres objets. Ces objets peuvent ralentir les performances de votre région. Sélectionnez Affichage > Statistiques et regardez sous Simulator > Time > Sim Time (Physics) pour voir si le temps du moteur physique est au dessus de 20 ms. - </notification> - <notification label="Afficher les objets scriptés les plus consommateurs" name="HelpRegionTopScripts"> - Dresse une liste des objets dont les scripts consomment le plus de ressources. Ces objets peuvent ralentir la performance de votre région. -Sélectionnez Affichage > Statistiques et regardez sous Simulator > Time > Script Time pour voir si le temps des scripts est au dessus de 25 ms. - </notification> - <notification label="Redémarrer la région" name="HelpRegionRestart"> - Redémarre le serveur en charge de la région après deux minutes d'avertissement. Tous les résidents dans cette région seront déconnectés. Les données de la région seront sauvegardées et réapparaîtront au bout de 90 secondes. - -Le redémarrage de la région ne permet pas de résoudre la plupart des problèmes de performance. Les redémarrages ne doivent avoir lieu qu'en dernier recours. - </notification> - <notification label="Niveau de l'eau" name="HelpRegionWaterHeight"> - Il s'agit de la hauteur de l'eau en mètres. -Si ce paramètre est différent de 20 et que vous avez de l'eau adjacente au bord du monde ou de l'eau « vide », il y aura un espace vide visible. - - -Valeur par défaut : 20 - </notification> - <notification label="Surélévation du terrain" name="HelpRegionTerrainRaise"> - Il s'agit de la distance (en mètres) à laquelle les propriétaires de parcelle peuvent surélever leur terrain, par rapport au terrain « figé » dont la hauteur est fixée par défaut. - -Valeur par défaut : 4 - </notification> - <notification label="Abaisser le terrain" name="HelpRegionTerrainLower"> - Il s'agit de la distance (en mètres) à laquelle les propriétaires de parcelle peuvent abaisser leur terrain, par rapport au terrain « figé » dont la hauteur est fixée par défaut. - -Valeur par défaut : -4 - </notification> - <notification label="Charger le terrain au format RAW" name="HelpRegionUploadRaw"> - Ce bouton permet de charger un fichier .RAW dans la région où vous vous trouvez. -Ce fichier doit avoir les bonnes dimensions (RGB, 256 x 256) et 13 canaux. Le meilleur moyen de créer un fichier terrain est de télécharger le fichier RAW existant. Un bon moyen est de modifier le canal rouge (hauteur terrain) et de le charger. - -Le chargement peut prendre jusqu'à 45 secondes. Veuillez noter que le chargement d'un fichier terrain ne déplacera pas les objets qui se trouvent sur le terrain, mais seulement le terrain et les droits associés aux parcelles. Certains objets risquent d'aller sous la terre. - -Pour en savoir plus sur la modification de la hauteur des terrains d'une région, consultez l'Aide F1. - </notification> - <notification label="Télécharger le terrain au format RAW" name="HelpRegionDownloadRaw"> - Ce bouton permet de télécharger un fichier contenant les données relatives à la hauteur du terrain, dimensions de la parcelle, les mises en vente ainsi que certains droits relatifs à la parcelle pour cette région. Lorsque vous ouvrez le fichier avec un programme tel que Photoshop, vous devez indiquer les dimensions du document qui sont les suivantes : RGB, 256 x 256 avec 13 canaux. Le fichier terrain ne peut pas être ouvert différemment. - -Pour en savoir plus sur la modification de la hauteur des terrains d'une région, consultez l'Aide F1. - </notification> - <notification label="Utiliser le soleil du domaine" name="HelpRegionUseEstateSun"> - Si vous cochez cette case, la position du soleil dans cette région sera la même que dans le reste du domaine. - -Valeur par défaut : activé - </notification> - <notification label="Soleil fixe" name="HelpRegionFixedSun"> - Si vous cochez cette case, la position du soleil se fixe sur celle du curseur Phase et le soleil arrête de bouger. - -Valeur par défaut : désactivé - </notification> - <notification label="Figer le terrain" name="HelpRegionBakeTerrain"> - Ce bouton permet d'enregistrer la forme actuelle du terrain comme nouvelle forme par défaut pour la région. Une fois figé, le terrain peut reprendre la forme enregistrée à partir de l'option Rétablir le terrain à la section Modifer le terrain. Le terrain figé est aussi le point de référence pour les limites de surélévation et d'abaissement. - </notification> - <notification label="Gérants du domaine" name="HelpEstateEstateManager"> - Un gérant de domaine est un résident chargé du contrôle de la région et des paramètres du domaine. Un gérant de domaine peut modifier tous les paramètres, mais ne peut pas charger, télécharger ni figer de terrain. Un des pouvoirs principaux du gérant est de bannir ou d'autoriser un résident sur votre domaine. - -Seuls les propriétaires de domaine peuvent ajouter ou supprimer des gérants de domaine. Lorsque vous choisissez un gérant de domaine, prenez un résident en qui vous avez confiance car vous serez en quelque sorte responsable de ses actions. - </notification> - <notification label="Utiliser le temps universel" name="HelpEstateUseGlobalTime"> - Cette case permet au soleil de votre domaine de suivre la position du soleil sur les domaines Linden du continent. - -Valeur par défaut : activé - </notification> - <notification label="Soleil fixe" name="HelpEstateFixedSun"> - Si vous cochez cette case, la position du soleil se fixe sur celle du curseur Phase et le soleil arrête de bouger. - </notification> - <notification label="Accès public" name="HelpEstateExternallyVisible"> - Cette option vous permet de choisir quels résidents d'autres domaines peuvent pénétrer sur votre domaine sans devoir être ajoutés à la liste d'accès. - -Valeur par défaut : activé - </notification> - <notification label="Autoriser la téléportation directe" name="HelpEstateAllowDirectTeleport"> - Lorsqu'elle est cochée, cette option permet aux résidents d'être téléportés à n'importe quel endroit sur votre domaine. Lorsque cette option n'est pas cochée, les résidents sont téléportés au téléhub le plus proche. - -Valeur par défaut : désactivé - </notification> - <notification label="Autoriser l'accès" name="HelpEstateAllowResident"> - L'accès à ce domaine sera réservé aux résidents figurant dans cette liste et aux groupes ci-dessous. -Cette option n'est disponible que lorsque la case Accès public est décochée. - </notification> - <notification label="Autoriser l'accès de groupe" name="HelpEstateAllowGroup"> - L'accès à ce domaine sera réservé aux groupes figurant dans cette liste et aux résidents ci-dessous. Cette option n'est disponible que lorsque la case Accès public est décochée. - </notification> - <notification label="Adresse e-mail où signaler une infraction" name="HelpEstateAbuseEmailAddress"> - Si vous utilisez une adresse e-mail valide, les rapports d'infraction de ce domaine iront à cette adresse. -Si vous laissez ce champ vide, les rapports d'infraction seront envoyés à Linden Lab uniquement. - </notification> - <notification label="Refuser l'accès" name="HelpEstateBanResident"> - Les résidents figurant sur cette liste ne peuvent pas pénétrer sur votre domaine, quels que soient les autres paramètres. - </notification> - <notification label="Autoriser les chats vocaux" name="HelpEstateVoiceChat"> - Les parcelles de ce domaine peuvent avoir leurs propres canaux vocaux, ce qui permet aux résidents de communiquer avec leurs voisins. - -Valeur par défaut : désactivé - </notification> - <notification label="Versions de voix non compatibles" name="VoiceVersionMismatch"> - Cette version de [APP_NAME] n'est pas compatible avec la fonctionnalité de chat vocal dans cette région. Vous devez mettre à jour [APP_NAME] pour que le chat vocal fonctionne correctement. - </notification> - <notification label="Règlement du domaine" name="HelpEstateCovenant"> - Définir un règlement pour le domaine vous permet de vendre les parcelles de ce domaine. S'il n'y a pas de règlement, vous ne pouvez pas vendre le terrain. Si vous ne souhaitez pas indiquer de règlement ou donner de conseils aux acheteurs, laissez la section relative au règlement vide. - -Un règlement sert à communiquer des règles, des lignes directrices ou informations culturelles, ou simplement à expliquer vos attentes à un acheteur potentiel. Il peut s'agir de régulations concernant la construction, les options de paiement ou tout autre information que vous souhaitez faire passer au résident avant que l'achat n'ait lieu. - -L'acheteur est tenu d'accepter le règlement en cochant une case avant de pouvoir finaliser l'achat. Les règlements, lorsqu'ils existent, apparaissent toujours dans la boîte de dialogue À propos du terrain. - </notification> - <notification label="Impossible d'acheter des objets" name="BuyObjectOneOwner"> - Impossible d'acheter simultanément des objets de propriétaires différents. -Veuillez ne sélectionner qu'un seul objet. - </notification> - <notification label="Impossible d'acheter des contenus" name="BuyContentsOneOnly"> - Impossible d'acheter les contenus de plus d'un objet à la fois. -Veuillez ne sélectionner qu'un seul objet. - </notification> - <notification label="Impossible d'acheter des contenus" name="BuyContentsOneOwner"> - Impossible d'acheter simultanément des objets de propriétaires différents. -Veuillez ne sélectionner qu'un seul objet. - </notification> - <notification name="BuyOriginal"> - Acheter l'objet original pour [PRICE] L$ à [PRICE] ? -Vous deviendrez le propriétaire de cet objet. -Vous pourrez : - Modifier : [MODIFYPERM] - Copier : [COPYPERM] - Revendre ou donner : [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BuyOriginalNoOwner"> - Acheter l'objet original pour [PRICE] L$ ? -Vous deviendrez le propriétaire de cet objet. -Vous pourrez : - Modifier : [MODIFYPERM] - Copier : [COPYPERM] - Revendre ou donner : [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BuyCopy"> - Acheter une copie pour [PRICE] L$ à [OWNER] ? -L'objet sera copié dans votre inventaire. -Vous pourrez : - Modifier : [MODIFYPERM] - Copier : [COPYPERM] - Revendre ou donner : [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BuyCopyNoOwner"> - Acheter une copie pour [PRICE] L$ ? -L'objet sera copié dans votre inventaire. -Vous pourrez : - Modifier : [MODIFYPERM] - Copier : [COPYPERM] - Revendre ou donner : [RESELLPERM] - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BuyContents"> - Acheter des contenus pour [PRICE] L$ à [OWNER] ? -Ils seront copiés dans votre inventaire. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="BuyContentsNoOwner"> - Acheter des contenus pour [PRICE] L$ ? -Ils seront copiés dans votre inventaire. - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmPurchase"> - Suite à cette transaction, vous allez : -[ACTION] - -Êtes-vous certain de vouloir effectuer cette transaction ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmPurchasePassword"> - Suite à cette transaction, vous allez : -[ACTION] - -Êtes-vous certain de vouloir effectuer cette transaction ? -Veuillez saisir à nouveau votre mot de passe et cliquer sur OK. - <form name="form"> - <button name="ConfirmPurchase" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="SetPickLocation"> - Remarque : -vous avez mis à jour l'emplacement de ce favori mais les autres détails resteront inchangés. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromObject"> - Vous avez sélectionné des objets non copiables. -Ces objets seront déplacés dans votre inventaire et non pas copiés. - -Déplacer les objets de l'inventaire ? - <usetemplate ignoretext="Lors du transfert d'un inventaire non copiable depuis des objets" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromScriptedObject"> - Vous avez sélectionné des objets de l'inventaire qui ne peuvent pas être copiés. Ces objets seront déplacés vers votre inventaire, et non pas copiés. -L'objet les contenant est scripté, déplacer ces objets peut causer des problèmes au niveau du script. - -Déplacer les objets de l'inventaire ? - <usetemplate ignoretext="Lors du transfert d'un inventaire non copiable depuis des objets scriptés" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ClickActionNotPayable"> - Avertissement : l'action du clic 'Payer l'objet' a été défini mais ne fonctionnera que si un script est ajouté avec l'event money(). - <form name="form"> - <ignore name="ignore" text="Lors du paramétrage de la fonction Payer sur des objets sans événement monétaire"/> - </form> - </notification> - <notification name="OpenObjectCannotCopy"> - Vous n'êtes autorisé à copier aucun élément dans cet objet. - </notification> - <notification name="WebLaunchAccountHistory"> - Aller sur le site de [SECOND_LIFE] pour consulter l'historique de votre compte ? - <usetemplate ignoretext="Lors du chargement de la page web contenant l'historique de votre compte" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/> - </notification> - <notification name="ClickOpenF1Help"> - Visiter les pages d'aide de [SECOND_LIFE] ? - <usetemplate ignoretext="Lors de la visite des pages d'aide de [SECOND_LIFE]" name="okcancelignore" notext="Annuler" yestext="Aller"/> - </notification> - <notification name="ConfirmQuit"> - Êtes-vous certain de vouloir quitter ? - <usetemplate ignoretext="Lorsque vous quittez [APP_NAME]" name="okcancelignore" notext="Continuer" yestext="Quitter"/> - </notification> - <notification name="HelpReportAbuseEmailLL"> - Utilisez cet outil pour signaler des infractions aux Conditions d'utilisation et aux Règles de la communauté. Voir : - -http://secondlife.com/corporate/tos.php -http://secondlife.com/corporate/cs.php - -Lorsqu'elles sont signalées, toutes les infractions aux Conditions d'utilisation et aux Règles de la communauté font l'objet d'une enquête et sont résolues. Pour accéder aux détails de la résolution d'un incident, allez sur : - -http://secondlife.com/support/incidentreport.php - </notification> - <notification name="HelpReportAbuseEmailEO"> - Important : ce rapport ira au propriétaire de la région dans laquelle vous êtes et non à Linden Lab. - -Pour aider les résidents et les visiteurs, le propriétaire de la région dans laquelle vous êtes a choisi de recevoir et de s'occuper de tous les rapports envoyés à partir de cette région. Linden Lab n'enquêtera pas sur les rapports que vous envoyez à partir de cet endroit. - -Le propriétaire de la région traitera les rapports en fonction des règles de cette région, comme indiqué dans le réglement du domaine. -(Les réglements sont visibles à partir du menu Monde > À propos du terrain.) - -La résolution de ce rapport ne s'applique qu'à cette région ; L'accès aux autres endroits de [SECOND_LIFE] ne sera pas affecté par les résultats de cette enquête. Seul Linden Lab peut interdire l'accès à l'ensemble de [SECOND_LIFE]. - </notification> - <notification name="HelpReportAbuseSelectCategory"> - Veuillez choisir une catégorie pour ce rapport d'infraction. -Le choix d'une catégorie nous permet de traiter les rapports d'infraction plus rapidement. - </notification> - <notification name="HelpReportAbuseAbuserNameEmpty"> - Veuillez saisir le nom du contrevenant. -Lorsque nous avons le nom du contrevenant, nous sommes en mesure de traiter les rapports plus rapidement. - </notification> - <notification name="HelpReportAbuseAbuserLocationEmpty"> - Veuillez indiquer l'endroit où l'infraction a eu lieu. -Les informations précises et exactes nous permettent de traiter les rapports plus rapidement. - </notification> - <notification name="HelpReportAbuseSummaryEmpty"> - Veuillez saisir un récapitulatif de l'infraction. -Les récapitulatifs précis nous permettent de traiter les rapports plus rapidement. - </notification> - <notification name="HelpReportAbuseDetailsEmpty"> - Veuillez saisir une description détaillée de l'infraction. -Soyez aussi précis que possible et essayez de fournir des noms ainsi que des détails sur l'incident que vous signalez. -Les descriptions précises nous permettent de traiter les rapports plus rapidement. - </notification> - <notification name="HelpReportAbuseContainsCopyright"> - Cher résident, - -Il semble que vous souhaitiez reporter une infraction à des droits de propriété intellectuelle. Pour signaler correctement cette infraction : - -(1) Remplissez un rapport d'infraction. Vous pouvez soumettre un rapport d'infraction si vous pensez qu'un résident exploite le système de droits de [SECOND_LIFE], par exemple en utilisant un CopyBot ou des outils similaires pour enfreindre des droits de propriété intellectuelle. Notre équipe chargée des infractions mènera une enquête et prendra les mesures nécessaires à l'encontre du résident non respectueux des Conditions d'utilisation ou des règles de la communauté. Sachez toutefois que l'équipe chargée des infractions ne supprimera pas de contenu à l'intérieur de [SECOND_LIFE]. - -(2) Demandez à ce que du contenu à l'intérieur de [SECOND_LIFE] soit supprimé. Pour demander à ce que du contenu soit supprimé de [SECOND_LIFE], vous devez soumettre un rapport d'infraction valide, tel que fourni dans notre Règlement contre les violations des droit d'auteurs (DMCA), à http://secondlife.com/corporate/dmca.php. - -Si vous souhaitez toujours reporter cette infraction, veuillez fermer cette fenêtre et soumettre votre rapport. Vous devrez peut-être sélectionner la catégorie CopyBot ou exploitation abusive des droits. - -Merci, - -Linden Lab - </notification> - <notification name="FailedRequirementsCheck"> - Les composantes requises suivantes ne se trouvent pas dans [FLOATER]: -[COMPONENTS] - </notification> - <notification label="Remplacer la pièce-jointe existante" name="ReplaceAttachment"> - Vous avez déjà un objet sur cette partie du corps. -Voulez-vous le remplacer par l'objet sélectionné ? - <form name="form"> - <ignore name="ignore" save_option="true" text="Lors du remplacement de pièces-jointes existantes"/> - <button ignore="Remplacer automatiquement" name="Yes" text="OK"/> - <button ignore="Ne jamais remplacer" name="No" text="Annuler"/> - </form> - </notification> - <notification label="Réponse si occupé(e)" name="BusyModePay"> - Vous êtes en mode occupé et vous ne recevrez donc aucun objet en échange de ce paiement. - -Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ? - <form name="form"> - <ignore name="ignore" save_option="true" text="Lorsque vous envoyez de l'argent à une personne en mode Occupé"/> - <button ignore="Toujours quitter le mode occupé" name="Yes" text="OK"/> - <button ignore="Ne jamais quitter le mode occupé" name="No" text="Annuler"/> - </form> - </notification> - <notification name="ConfirmEmptyTrash"> - Êtes-vous certain de vouloir supprimer le contenu de votre corbeille de manière permanente  ? - <usetemplate ignoretext="Lorsque vous videz la corbeille de l'inventaire" name="okcancelignore" notext="Annuler" yestext="OK"/> - </notification> - <notification name="ConfirmClearBrowserCache"> - Êtes-vous certain de vouloir vider le cache de votre navigateur ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> - </notification> - <notification name="ConfirmClearCookies"> - Êtes-vous certain de vouloir supprimer vos cookies ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> - </notification> - <notification name="ConfirmClearMediaUrlList"> - Êtes-vous certain de vouloir supprimer la liste des URL enregistrées ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> - </notification> - <notification name="ConfirmEmptyLostAndFound"> - Êtes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ? - <usetemplate ignoretext="Losque vous videz le dossier Objets trouvés dans votre inventaire" name="okcancelignore" notext="Non" yestext="Oui"/> - </notification> - <notification name="CopySLURL"> - La SLurl suivante a été copiée dans votre presse-papiers : - [SLURL] - -Mettez-la dans une page web pour permettre aux autres résidents d'accéder facilement à cet endroit ou bien collez-la dans la barre d'adresse de votre navigateur. - <form name="form"> - <ignore name="ignore" text="Lorsque vous copiez une SLurl dans votre presse-papier"/> - </form> - </notification> - <notification name="GraphicsPreferencesHelp"> - Ce menu permet de contrôler la taille de la fenêtre et la résolution, ainsi que la qualité des graphiques client. Les préférences de l'interface graphique vous permettent de choisir entre 4 niveaux de graphiques : Faible, Moyen, Élevé et Ultra. Personnalisez vos options graphiques en cliquant sur le bouton Personnaliser et en changeant les paramètres suivants : - -Effets : active ou désactive les différents types de shaders pixels. - -Objets reflétés : définit le type d'objets reflétés dans l'eau. - -Rendu de l'avatar : définit les options qui influent sur la manière dont le client rend les avatars. - -Limite d'affichage : la distance à laquelle vous voyez les objets s'afficher dans la scène. - -Nombre de particules max. : définit le nombre maximum de particules que vous pouvez voir à la fois sur votre écran. - -Qualité post-traitement : définit la résolution du rayonnement. - -Détails des rendus : définit le niveau de détail ou le nombre de polygones utilisés dans le rendu de certains objets. Une valeur plus élevée prendra plus de temps pour apparaître, mais permettra d'avoir des objets plus détaillés. - -Sources lumineuses : définit les types de lumières que vous souhaitez faire apparaître. - -Rendu du terrain : définit le niveau de détail que vous souhaitez utiliser dans la texture du terrain. - </notification> - <notification name="WLSavePresetAlert"> - Voulez-vous écraser l'option précédemment enregistrée ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="WLDeletePresetAlert"> - Voulez-vous supprimer [SKY] ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="WLNoEditDefault"> - Vous ne pouvez pas éditer ou supprimer un préréglage par défaut. - </notification> - <notification name="WLMissingSky"> - Une dossier semble manquer au Cycle du jour : [SKY]. - </notification> - <notification name="PPSaveEffectAlert"> - Certains effets post-traitement existent. Voulez-vous quand même écraser ce fichier ? - <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> - </notification> - <notification name="HelpEditSky"> - Pour créer et sauvegarder plusieurs ciels, utilisez les curseurs WindLight. - </notification> - <notification name="HelpEditDayCycle"> - Choisissez quel ciel apparaît au cours de la journée. - </notification> - <notification name="EnvSettingsHelpButton"> - Ces paramètres permettent de modifier l'environnement local sur votre ordinateur. Pour que vous ayez accès à tous les paramètres, votre carte graphique doit prendre en charge les effets atmosphériques. - -Pour changer les différentes phases de la journée dans le client, utilisez le curseur Heure de la journée. - -Le curseur Couverture nuageuse permet de contrôler le nombre de nuages dans le ciel. - -L'option Couleur de l'eau vous permet de modifier la couleur de l'eau grâce au sélecteur de couleurs. - -Le curseur Brouillard dans l'eau permet de contrôler la densité du brouillard sous l'eau. - -Pour synchroniser l'heure du jour sur celle de la région, cliquez sur Utiliser heure domaine. - -En cliquant sur le bouton Ciel Avancé, vous aurez accès à tous les réglages relatifs au ciel. - -En cliquant sur le bouton Eau Avancée, vous aurez accès à tous les réglages relatifs à l'eau. - </notification> - <notification name="HelpDayCycle"> - L'éditeur du cycle du jour vous permet de contrôler le ciel au cours du cycle jour/nuit de [SECOND_LIFE]. C'est ce même cycle qui est contrôlé par le curseur Heure de la journée dans l'éditeur d'environnement basique. - -L'éditeur du jour fonctionne grâce au réglage d'images-clés. Ces images-clés sont représentées par les marques grises sur la ligne du temps et ont des préréglages qui leurs sont associées. Au cours de la journée et de la nuit, le ciel WindLight s'anime en passant d'une clé à l'autre. - -La flèche jaune au dessus de la ligne du temps représente votre vue actuelle, basée sur l'heure de la journée. Cliquez et faites glisser pour voir l'animation au cours de votre journée. Ajoutez ou supprimez des clés en appuyant sur les boutons Ajouter clé ou Supprimer clé, à droite de la ligne du temps. - -Vous pouvez définir la position d'une clé en la faisant glisser le long de la ligne du temps ou en définissant manuellement ses valeurs dans la section Réglages des images-clés. Dans cette même section, vous pouvez associer chaque clé au préréglage WindLight respectif. - -La Durée du cycle contrôle la durée d'une « journée ». Si vous choisissez une valeur basse (2mn par exemple), cela signifie que toutes les animations de votre journée de 24h se dérouleront en 2mn seulement ! Une fois satisfait de vos choix, utilisez les boutons Jouer et Stop ! pour prévisualiser les résultats. Pour voir l'animation, vous pouvez aussi bouger la flèche jaune au dessus de la ligne du temps. Si vous sélectionnez l'option Utiliser heure domaine, vous synchronisez la durée de votre journée et votre heure avec celle du cycle du jour du domaine. - -Une fois que vous êtes satisfait de votre Cycle du jour, vous pouvez le sauvegarder et le charger grâce aux boutons Enregistrer jour test et Charger Jour Test. Veuillez noter que pour l'instant, nous ne pouvez avoir qu'un seul Cycle du jour. - </notification> - <notification name="HelpBlueHorizon"> - Utilisez les curseurs Rouge/Vert/Bleu (RVB) pour ajuster la couleur du ciel. Pour déplacer les trois curseurs en même temps, utilisez le curseur Intensité. - </notification> - <notification name="HelpHazeHorizon"> - Le paramètre Quantité de brume est l'un des plus utiles pour ajuster l'exposition lumineuse de la scène. -Il permet de simuler de nombreux paramètres d'exposition, tels que les voiles blancs créés par le soleil ou des lumières plus foncées. - </notification> - <notification name="HelpBlueDensity"> - La Densité du bleu affecte la saturation générale des couleurs du ciel et du brouillard. Si vous déplacez le curseur Intensité (I) vers la droite, les couleurs deviennent plus vives et plus vibrantes. Si vous le déplacez complètement à gauche, les couleurs deviennent plus fades, puis finalement noires et blanches. Pour paramétrer avec précision la couleur du ciel, vous pouvez contrôler chacun des éléments de la saturation à l'aide des curseurs Rouge/Vert/Bleu (RVB). - </notification> - <notification name="HelpHazeDensity"> - Le paramètre Densité de la brume permet de contrôler le niveau de brume grisâtre dans l'atmosphère. Ce paramètre est utile pour simuler les scènes dans lesquelles il y a beaucoup de fumée et de substances polluantes émises par l'homme. Il est également utile pour simuler le brouillard et la brume. - </notification> - <notification name="HelpDensityMult"> - Utilisez le Multiplicateur de densité pour modifier la densité atmosphérique générale. Une valeur basse donne l'impression d'un air « léger » alors qu'une valeur élevée donne l'impression d'un air « lourd » et enfumé. - </notification> - <notification name="HelpDistanceMult"> - Ajuste la distance perçue par WindLight. -La valeur zéro désactive l'influence de WindLight sur le terrain et les objets. -Les valeurs supérieures à 1 simulent des distances plus importantes pour des effets atmosphériques plus épais. - </notification> - <notification name="HelpMaxAltitude"> - L'Altitude max. ajuste les calculs de WindLight lors de la computation de la lumière atmosphérique. Quand la fin de la journée approche, il est utile pour ajuster la « profondeur » du coucher de soleil. - </notification> - <notification name="HelpSunlightColor"> - Ajuste la couleur et l'intensité de la lumière directe de la scène. - </notification> - <notification name="HelpSunAmbient"> - Ajuste la couleur et l'intensité de la lumière atmosphérique ambiante. - </notification> - <notification name="HelpSunGlow"> - Le curseur Taille contrôle la taille du soleil. -Le curseur Netteté permet de rendre le soleil plus ou moins flou dans le ciel. - </notification> - <notification name="HelpSceneGamma"> - Ajuste la distribution de clair et de foncé sur l'écran. - </notification> - <notification name="HelpStarBrightness"> - Vous permet de contrôler l'intensité des étoiles dans le ciel. - </notification> - <notification name="HelpTimeOfDay"> - Contrôle la position du soleil dans le ciel. -Même chose que l'élévation. - </notification> - <notification name="HelpEastAngle"> - Contrôle la position du soleil dans le ciel. -Même chose que l'azimut. - </notification> - <notification name="HelpCloudColor"> - Modifie la couleur des nuages. Il est recommandé de laisser les nuages en blanc mais vous pouvez aussi faire preuve de créativité... - </notification> - <notification name="HelpCloudDetail"> - Contrôle le détail de l'image placée sur l'image du nuage principal. X et Y contrôlent sa position. D (Densité) permet de rendre les nuages plus ou moins pleins ou plus ou moins fracturés. - </notification> - <notification name="HelpCloudDensity"> - Vous permet de contrôler la position des nuages avec les curseurs X et Y ainsi que leur densité avec le curseur D. - </notification> - <notification name="HelpCloudCoverage"> - Contrôle la surface du ciel couverte par les nuages. - </notification> - <notification name="HelpCloudScale"> - Contrôle l'échelle de l'image des nuages sur le dôme du ciel. - </notification> - <notification name="HelpCloudScrollX"> - Contrôle la vitesse des nuages sur l'axe des X. - </notification> - <notification name="HelpCloudScrollY"> - Contrôle la vitesse des nuages sur l'axe des Y. - </notification> - <notification name="HelpClassicClouds"> - Cochez cette option pour utiliser les anciens nuages de [SECOND_LIFE] en plus des nuages WindLight. - </notification> - <notification name="HelpWaterFogColor"> - Permet de sélectionner la couleur du brouillard sous l'eau. - </notification> - <notification name="HelpWaterFogDensity"> - Contrôle la densité du brouillard sous l'eau, ainsi que votre visibilité. - </notification> - <notification name="HelpUnderWaterFogMod"> - Modifie l'effet créé par l'option Densité du brouillard pour contrôler votre visibilité quand votre avatar est sous l'eau. - </notification> - <notification name="HelpWaterGlow"> - Contrôle l'éclat de l'eau à la surface. - </notification> - <notification name="HelpWaterNormalScale"> - Contrôle l'échelle des trois vaguelettes qui forment l'eau. - </notification> - <notification name="HelpWaterFresnelScale"> - Contrôle la quantité de lumière réfléchie à des angles différents. - </notification> - <notification name="HelpWaterFresnelOffset"> - Contrôle l'intensité de la lumière réfléchie. - </notification> - <notification name="HelpWaterScaleAbove"> - Contrôle la quantité de lumière réfractée lorsque votre avatar regarde au dessus de l'eau. - </notification> - <notification name="HelpWaterScaleBelow"> - Contrôle la quantité de lumière réfractée lorsque votre avatar est sous l'eau. - </notification> - <notification name="HelpWaterBlurMultiplier"> - Contrôle le mélange reflets/vagues. - </notification> - <notification name="HelpWaterNormalMap"> - Contrôle quelle normal map est posée sur l'eau pour déterminer la réflection/réfraction. - </notification> - <notification name="HelpWaterWave1"> - Contrôle dans quelle direction et à quelle vitesse la version grande échelle de la normal map se déplace sur l'axe des X et l'axe des Y. - </notification> - <notification name="HelpWaterWave2"> - Contrôle dans quelle direction et à quelle vitesse la version grande échelle de la normal map se déplace sur l'axe des X et l'axe des Y. - </notification> - <notification name="NewSkyPreset"> - Nommez le nouveau ciel. - <form name="form"> - <input name="message"> - Nouveau préréglage - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="ExistsSkyPresetAlert"> - Ce préréglage existe déjà  ! - </notification> - <notification name="NewWaterPreset"> - Nommez ce nouveau préréglage d'eau. - <form name="form"> - <input name="message"> - Nouveau préréglage - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="ExistsWaterPresetAlert"> - Ce préréglage existe déjà  ! - </notification> - <notification name="WaterNoEditDefault"> - Vous ne pouvez pas éditer ou supprimer un préréglage par défaut. - </notification> - <notification name="ChatterBoxSessionStartError"> - Impossible de démarrer une nouvelle session de chat avec [RECIPIENT]. -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ChatterBoxSessionEventError"> - [EVENT] -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ForceCloseChatterBoxSession"> - Vous devez terminer votre session de chat avec [NAME]. -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="Cannot_Purchase_an_Attachment"> - Les objets qui font partie d'une pièce-jointe ne peuvent pas être achetés. - </notification> - <notification label="À propos des requêtes pour les autorisations de débit" name="DebitPermissionDetails"> - Accepter cette requête donne au script l'autorisation de prélever des dollars Linden (L$) sur votre compte de manière continue. Pour révoquer cette autorisation, le propriétaire de l'objet doit supprimer l'objet ou bien réinitialiser les scripts dans l'objet. - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AutoWearNewClothing"> - Voulez-vous automatiquement porter l'habit que vous créez ? - <usetemplate ignoretext="Porter automatiquement" name="okcancelignore" notext="Non" yestext="Oui"/> - </notification> - <notification name="NotAgeVerified"> - Pour que vous puissiez accéder à cette parcelle, votre âge doit être vérifié. -Voulez-vous aller sur le site de [SECOND_LIFE] pour vérifier votre âge ? - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/verification.php?lang=fr - </url> - <usetemplate ignoretext="Avertir si l'âge n'a pas été vérifié" name="okcancelignore" notext="Non" yestext="Oui"/> - </notification> - <notification name="Cannot enter parcel: no payment info on file"> - Avant de pouvoir pénétrer sur cette parcelle, vous devez enregistrer vos informations de paiement. -Voulez-vous aller sur le site de [SECOND_LIFE] pour enregistrer ces informations ? - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/index.php?lang=fr - </url> - <usetemplate ignoretext="Avertir si les informations de paiement ne sont pas fournies" name="okcancelignore" notext="Non" yestext="Oui"/> - </notification> - <notification name="MissingString"> - The string [STRING_NAME] is missing from strings.xml - </notification> - <notification name="SystemMessageTip"> - [MESSAGE] - </notification> - <notification name="Cancelled"> - Annulé - </notification> - <notification name="CancelledSit"> - Action annulée - </notification> - <notification name="CancelledAttach"> - Attachement annulé - </notification> - <notification name="ReplacedMissingWearable"> - Habits et parties du corps manquants remplacés par les éléments par défaut. - </notification> - <notification name="GroupNotice"> - Sujet : [SUBJECT], Message : [MESSAGE] - </notification> - <notification name="FriendOnline"> - [FIRST] [LAST] est connecté(e) - </notification> - <notification name="FriendOffline"> - [FIRST] [LAST] est déconnecté(e) - </notification> - <notification name="AddSelfFriend"> - Vous ne pouvez pas devenir ami avec vous-même. - </notification> - <notification name="UploadingAuctionSnapshot"> - Importation de photos SL et Web en cours... -(prend environ 5 minutes.) - </notification> - <notification name="UploadPayment"> - Le chargement a coûté [AMOUNT] L$. - </notification> - <notification name="UploadWebSnapshotDone"> - Photo Web importée - </notification> - <notification name="UploadSnapshotDone"> - Photo SL importée - </notification> - <notification name="TerrainDownloaded"> - Fichier terrain.raw téléchargé - </notification> - <notification name="GestureMissing"> - Geste [NAME] absent de la base de données. - </notification> - <notification name="UnableToLoadGesture"> - Impossible de charger le geste [NAME]. -Merci de réessayer. - </notification> - <notification name="LandmarkMissing"> - Repère absent de la base de données. - </notification> - <notification name="UnableToLoadLandmark"> - Impossible de charger le repère. Merci de réessayer. - </notification> - <notification name="CapsKeyOn"> - La touche Verr.maj est activée. -Ce mode modifie le mot de passe que vous saisissez, vous devriez le quitter. - </notification> - <notification name="NotecardMissing"> - Note absente de la base de données. - </notification> - <notification name="NotecardNoPermissions"> - Permissions insuffisantes pour voir la note. - </notification> - <notification name="RezItemNoPermissions"> - Permissions insuffisantes pour rezzer l'objet. - </notification> - <notification name="UnableToLoadNotecard"> - Impossible de lire les données de la note actuellement. - </notification> - <notification name="ScriptMissing"> - Script absent de la base de données. - </notification> - <notification name="ScriptNoPermissions"> - Permissions insuffisantes pour voir le script. - </notification> - <notification name="UnableToLoadScript"> - Impossible de charger le script. Merci de réessayer. - </notification> - <notification name="IncompleteInventory"> - Tous les éléments que vous souhaitez transférer ne sont pas encore disponibles sur le serveur. -Merci d'essayer à nouveau dans une minute. - </notification> - <notification name="CannotModifyProtectedCategories"> - Vous ne pouvez pas modifier de catégories protégées. - </notification> - <notification name="CannotRemoveProtectedCategories"> - Vous ne pouvez pas supprimer de catégories protégées. - </notification> - <notification name="OfferedCard"> - Vous avez offert votre carte de visite à [FIRST] [LAST] - </notification> - <notification name="UnableToBuyWhileDownloading"> - Achat impossible durant le chargement de l'objet. -Merci de réessayer. - </notification> - <notification name="UnableToLinkWhileDownloading"> - Impossible de lier durant le chargement de l'objet. -Merci de réessayer. - </notification> - <notification name="CannotBuyObjectsFromDifferentOwners"> - Impossible d'acheter simultanément des objets de propriétaires différents. Veuillez sélectionner un seul objet. - </notification> - <notification name="ObjectNotForSale"> - Cet objet ne semble pas à vendre. - </notification> - <notification name="EnteringGodMode"> - Activation du mode divin : niveau [LEVEL] - </notification> - <notification name="LeavingGodMode"> - Désactivation du mode divin : niveau [LEVEL] - </notification> - <notification name="CopyFailed"> - Copie impossible, droits insuffisants. - </notification> - <notification name="InventoryAccepted"> - [NAME] a accepté votre envoi. - </notification> - <notification name="InventoryDeclined"> - [NAME] a refusé votre envoi. - </notification> - <notification name="ObjectMessage"> - [NAME]: [MESSAGE] - </notification> - <notification name="CallingCardAccepted"> - Votre carte de visite a été acceptée. - </notification> - <notification name="CallingCardDeclined"> - Votre carte de visite a été refusée. - </notification> - <notification name="TeleportToLandmark"> - A présent que vous êtes sur le continent, vous pouvez voyager par téléportation (vers [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l'écran puis sélectionnez le dossier Repères (Landmarks). -Choisissez un repère, double-cliquez dessus et cliquez sur Téléporter. - </notification> - <notification name="TeleportToPerson"> - A présent que vous êtes sur le continent, vous pouvez contacter des résidents (tel [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l'écran puis sélectionnez le dossier Cartes de visite (Calling Cards). -Choisissez en une, double-cliquez dessus et cliquez sur Message Instantané. - </notification> - <notification name="CantSelectLandFromMultipleRegions"> - Vous ne pouvez pas sélectionner de terrain en dehors des limites du serveur. -Veuillez sélectionner un terrain plus petit. - </notification> - <notification name="SearchWordBanned"> - Certains termes de votre recherche ont été exclus car ils ne correspondaient pas aux standards fixés dans les Règles communautaires. - </notification> - <notification name="NoContentToSearch"> - Veuillez sélectionner au moins un type de contenu à rechercher (PG, Mature ou Adulte) - </notification> - <notification name="GroupVote"> - [NAME] a proposé un vote pour : -[MESSAGE] - <form name="form"> - <button name="VoteNow" text="Voter"/> - <button name="Later" text="Plus tard"/> - </form> - </notification> - <notification name="SystemMessage"> - [MESSAGE] - </notification> - <notification name="EventNotification"> - Avis d'événement : - -[NAME] -[DATE] - <form name="form"> - <button name="Teleport" text="Téléporter"/> - <button name="Description" text="Description"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="TransferObjectsHighlighted"> - Tous les objets de cette parcelle qui seront transférés à l'acheteur sont maintenant mis en surbrillance. - -* Les arbres et la pelouse qui seront transférés ne sont pas mis en surbrillance. - <form name="form"> - <button name="Done" text="Transfert effectué"/> - </form> - </notification> - <notification name="DeactivatedGesturesTrigger"> - Gestes désactivés ayant le même mot-clé : -[NAMES] - </notification> - <notification name="NoQuickTime"> - Le logiciel Apple QuickTime ne semble pas installé sur votre système. -Pour voir les vidéos sur les terrains qui le permettent, allez sur le site de QuickTime (http://www.apple.com/fr/quicktime/download) et installez le lecteur QuickTime. - </notification> - <notification name="OwnedObjectsReturned"> - Les objets que vous possédez sur la parcelle de terrain sélectionnée ont été renvoyés dans votre inventaire. - </notification> - <notification name="OtherObjectsReturned"> - Les objets que vous possédez sur la parcelle de terrain appartenant à [FIRST] [LAST] ont été renvoyés dans votre inventaire. - </notification> - <notification name="OtherObjectsReturned2"> - Les objets sur la parcelle appartenant à « [NAME] » ont étés renvoyés à leur propriétaire. - </notification> - <notification name="GroupObjectsReturned"> - Les objets sélectionnés sur la parcelle de terrain partagée avec le groupe [GROUPNAME] ont été renvoyés dans l'inventaire de leur propriétaire. -Les objets donnés transférables ont étés renvoyés à leur propriétaire. -Les objets non transférables donnés au groupe ont étés supprimés. - </notification> - <notification name="UnOwnedObjectsReturned"> - Les objets sélectionnés sur la parcelle et qui ne sont pas à vous ont été rendus à leurs propriétaires. - </notification> - <notification name="NotSafe"> - Les dégâts sont autorisés sur ce terrain (« non sécurisé »). -Vous pouvez être blessé ici. Si vous décédez, vous serez téléporté à votre domicile. - </notification> - <notification name="NoFly"> - Le vol est interdit sur ce terrain (« pas de vol »). -Vous ne pouvez pas voler ici. - </notification> - <notification name="PushRestricted"> - Les bousculades sont interdites sur ce terrain. -Vous ne pouvez pas pousser les autres à moins que vous soyez propriétaire de ce terrain. - </notification> - <notification name="NoVoice"> - La voix est désactivée sur ce terrain. - </notification> - <notification name="NoBuild"> - Le mode construction sur ce terrain est désactivé (« pas de construction »). -Vous ne pouvez pas créer d'objets ici. - </notification> - <notification name="ScriptsStopped"> - Un administrateur a temporairement stoppé les scripts dans cette région. - </notification> - <notification name="ScriptsNotRunning"> - Aucun script ne fonctionne dans cette région. - </notification> - <notification name="NoOutsideScripts"> - Les scripts externes sont désactivés sur ce terrain (« pas de scripts externes »). -Aucun script n'est exécuté à part ceux du propriétaire du terrain. - </notification> - <notification name="ClaimPublicLand"> - Vous ne pouvez réclamer qu'un terrain public dans la région où vous vous trouvez actuellement. - </notification> - <notification name="RegionTPAccessBlocked"> - Votre catégorie d'accès ne vous autorise pas à pénétrer dans cette région. Vous devez sans doute procéder à la vérification de votre âge ou installer une version plus récente du client. - -Pour savoir comment accéder aux zones ayant un tel niveau d'accès, veuillez consulter les pages d'aide. - </notification> - <notification name="URBannedFromRegion"> - Vous avez été banni de cette région. - </notification> - <notification name="NoTeenGridAccess"> - Votre compte ne peut pas se connecter à cette région du Teen grid. - </notification> - <notification name="NoHelpIslandTP"> - Vous ne pouvez pas retourner sur Help Island. -Pour répéter le didacticiel, veuillez aller sur Help Island Public. - </notification> - <notification name="ImproperPaymentStatus"> - Vous n'avez pas le statut de paiement approprié pour pénétrer dans cette région. - </notification> - <notification name="MustGetAgeRegion"> - Pour pouvoir pénétrer dans cette région, vous devez avoir procédé à la vérification de votre âge. - </notification> - <notification name="MustGetAgeParcel"> - Pour pouvoir pénétrer sur cette parcelle, vous devez avoir procédé à la vérification de votre âge. - </notification> - <notification name="NoDestRegion"> - Région de destination introuvable. - </notification> - <notification name="NotAllowedInDest"> - Vous n'êtes pas autorisé dans cette région. - </notification> - <notification name="RegionParcelBan"> - Impossible de traverser une parcelle bannie. Veuillez trouver une autre solution. - </notification> - <notification name="TelehubRedirect"> - Vous avez été redirigé vers un téléhub. - </notification> - <notification name="CouldntTPCloser"> - Il n'a pas été possible de vous téléporter vers une destination plus proche. - </notification> - <notification name="TPCancelled"> - Téléportation annulée. - </notification> - <notification name="FullRegionTryAgain"> - La région dans laquelle vous essayez de pénétrer est pleine actuellement. -Veuillez réessayer dans quelques minutes. - </notification> - <notification name="GeneralFailure"> - Panne générale. - </notification> - <notification name="RoutedWrongRegion"> - Dirigé vers la mauvaise région. Merci de réessayer. - </notification> - <notification name="NoValidAgentID"> - ID agent non valide. - </notification> - <notification name="NoValidSession"> - ID de session non valide. - </notification> - <notification name="NoValidCircuit"> - Aucun code de circuit valide. - </notification> - <notification name="NoValidTimestamp"> - Timestamp non valide. - </notification> - <notification name="NoPendingConnection"> - Impossible de créer la connexion en attente. - </notification> - <notification name="InternalUsherError"> - Erreur interne lors de la tentative de connexion. - </notification> - <notification name="NoGoodTPDestination"> - Impossible de trouver un lieu de téléportation valide dans cette région. - </notification> - <notification name="InternalErrorRegionResolver"> - Une erreur interne est survenue lors de la résolution des coodonnées de la région. - </notification> - <notification name="NoValidLanding"> - Impossible de trouver un point d'atterrissage valide. - </notification> - <notification name="NoValidParcel"> - Aucune parcelle valide n'a été trouvée. - </notification> - <notification name="ObjectGiveItem"> - Un objet appelé [OBJECTFROMNAME] appartenant à [FIRST] [LAST] vous a donné : [OBJECTTYPE] appelé(e) [OBJECTNAME]. - <form name="form"> - <button name="Keep" text="Garder"/> - <button name="Discard" text="Jeter"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="ObjectGiveItemUnknownUser"> - L'objet [OBJECTFROMNAME] appartenant à un utilisateur inconnu vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME]. - <form name="form"> - <button name="Keep" text="Garder"/> - <button name="Discard" text="Jeter"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="UserGiveItem"> - [NAME] vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME]. - <form name="form"> - <button name="Keep" text="Garder"/> - <button name="Discard" text="Jeter"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="GodMessage"> - [NAME] -[MESSAGE] - </notification> - <notification name="JoinGroup"> - [MESSAGE] - <form name="form"> - <button name="Join" text="Rejoindre"/> - <button name="Decline" text="Refuser"/> - <button name="Info" text="Infos"/> - </form> - </notification> - <notification name="TeleportOffered"> - [NAME] vous propose de le/la rejoindre par téléportation : - -[MESSAGE] - <form name="form"> - <button name="Teleport" text="Téléporter"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="GotoURL"> - [MESSAGE] -[URL] - <form name="form"> - <button name="Later" text="Plus tard"/> - <button name="GoNow..." text="Y aller maintenant..."/> - </form> - </notification> - <notification name="OfferFriendship"> - [NAME] vous demande de devenir son ami(e). - -[MESSAGE] - -(Par défaut, vous pourrez voir lorsque vous êtes tous deux connectés.) - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - </form> - </notification> - <notification name="OfferFriendshipNoMessage"> - [NAME] vous demande de devenir son ami. - -(Par défaut, vous pourrez voir quand vous êtes tous deux connectés) - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - </form> - </notification> - <notification name="FriendshipAccepted"> - [NAME] a accepté votre amitié. - </notification> - <notification name="FriendshipDeclined"> - [NAME] a refusé votre amitié. - </notification> - <notification name="OfferCallingCard"> - [FIRST] [LAST] vous offre sa carte de visite. -Cela ajoute un marque-page dans votre inventaire, ce qui vous permet d'envoyer rapidement un IM à ce résident. - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - </form> - </notification> - <notification name="RegionRestartMinutes"> - La région va redémarrer dans [MINUTES] minutes. -Si vous restez dans cette région, vous serez déconnecté(e). - </notification> - <notification name="RegionRestartSeconds"> - La région va redémarrer dans [SECONDS] secondes. -Si vous restez dans cette région, vous serez déconnecté(e). - </notification> - <notification name="LoadWebPage"> - Charger cette page web [URL] ? - -[MESSAGE] - -Venant de l'objet : [OBJECTNAME], appartenant à : [NAME]? - <form name="form"> - <button name="Gotopage" text="Charger"/> - <button name="Cancel" text="Annuler"/> - </form> - </notification> - <notification name="FailedToFindWearableUnnamed"> - La recherche du [TYPE] dans la base de données a échoué. - </notification> - <notification name="FailedToFindWearable"> - La recherche du [TYPE] nommé(e) [DESC] dans la base de données a échoué. - </notification> - <notification name="InvalidWearable"> - L'objet que vous essayez de porter utilise une fonctionnalité que le client ne peut lire. Pour porter cet objet, veuillez télécharger une mise à jour du client. - </notification> - <notification name="ScriptQuestion"> - '[OBJECTNAME]', un objet appartenant à '[NAME]', aimerait : - -[QUESTIONS] -Acceptez-vous ? - <form name="form"> - <button name="Yes" text="Oui"/> - <button name="No" text="Non"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="ScriptQuestionCaution"> - [OBJECTNAME], un objet appartenant à [NAME], aimerait : - -[QUESTIONS] -Si vous n'avez pas confiance en cet objet ni en son créateur, vous devriez refuser cette requête. Pour plus d'informations, cliquez sur le bouton Détails. - -Accepter cette requête ? - <form name="form"> - <button name="Grant" text="Accepter"/> - <button name="Deny" text="Refuser"/> - <button name="Details" text="Détails..."/> - </form> - </notification> - <notification name="ScriptDialog"> - '[TITLE]' de [FIRST] [LAST] -[MESSAGE] - <form name="form"> - <button name="Ignore" text="Ignorer"/> - </form> - </notification> - <notification name="ScriptDialogGroup"> - '[TITLE]' de [GROUPNAME] -[MESSAGE] - <form name="form"> - <button name="Ignore" text="Ignorer"/> - </form> - </notification> - <notification name="FirstBalanceIncrease"> - Vous venez de recevoir [AMOUNT] L$. -Des objets et des utilisateurs peuvent vous donner des L$. -Votre solde est affiché dans le coin supérieur droit de votre écran. - </notification> - <notification name="FirstBalanceDecrease"> - Vous venez de payer [AMOUNT] L$. -Votre solde est affiché dans le coin supérieur droit de votre écran. - </notification> - <notification name="FirstSit"> - Vous êtes assis(e). -Utilisez les touches de direction (ou AWSD) pour changer la vue. -Pour vous lever, cliquez sur le bouton Me lever. - </notification> - <notification name="FirstMap"> - Cliquez et faites glisser pour faire défiler la carte. -Double-cliquez pour vous téléporter. -Utilisez les contrôles à droite pour trouver des choses et afficher différents arrière-plans. - </notification> - <notification name="FirstBuild"> - Vous pouvez construire des objets dans certaines zones de [SECOND_LIFE]. -Utilisez les outils en haut à gauche pour construire et gardez la touche Ctrl ou Alt enfoncée pour passer rapidement d'un outil à l'autre. -Appuyez sur la touche Esc pour arrêter de construire. - </notification> - <notification name="FirstLeftClickNoHit"> - Un clic gauche permet d'interagir avec certains objets. -Si le pointeur de la souris se transforme en main, vous pouvez interagir avec l'objet. -Un clic droit fait toujours apparaître un menu des choses que vous pouvez faire. - </notification> - <notification name="FirstTeleport"> - Cette région n'autorise pas la téléportation de point à point. Vous avez donc été transporté au téléhub le plus proche. -Votre destination est marquée par une grande balise. -Suivez la flèche rouge vers la balise ou cliquez sur la flèche pour faire disparaître la balise. - </notification> - <notification name="FirstOverrideKeys"> - Vos mouvements sont maintenant pris en charge par un objet. -Essayez les flèches de votre clavier ou AWSD pour voir à quoi elles servent. -Certains objets (comme les armes) nécessitent l'activation du mode Vue subjective pour être utilisés. -Pour cela, appuyez sur la touche M. - </notification> - <notification name="FirstAppearance"> - Vous êtes en train d'éditer votre apparence. -Pour tourner et zoomer, utilisez les flèches de direction. -Lorsque vous avez terminé, appuyez sur Enregistrer tout pour sauvegarder votre apparence et sortir. -Vous pouvez modifier votre apparence aussi souvent que vous le souhaitez. - </notification> - <notification name="FirstInventory"> - Il s'agit de votre inventaire qui contient des objets, notes, vêtements, et autres possessions. -* Pour porter un objet ou le dossier contenant un ensemble complet, faites-le glisser sur vous-même. -* Pour mettre un objet dans le monde, faites-le glisser sur le sol. -* Pour lire une note, double-cliquez dessus. - </notification> - <notification name="FirstSandbox"> - Cette région est un bac à sable. -Les objets que vous construisez ici peuvent être supprimés quand vous partez. Les bacs à sable sont nettoyés régulièrement, veuillez lire les informations en haut de l'écran à côté du nom de la région. - -Les régions bacs à sable sont rares et sont signalées par des panneaux. - </notification> - <notification name="FirstFlexible"> - Cet objet est flexible. -Les objets flexibles ne peuvent pas avoir de propriétés physiques et doivent rester fantômes jusqu'à ce que la case Fantôme soit décochée. - </notification> - <notification name="FirstDebugMenus"> - Vous avez activé le menu Avancé. -Ce menu contient des fonctionnalités utiles pour les développeurs qui travaillent sur [SECOND_LIFE]. -Pour activer/désactiver ce menu sous Windows, appuyez sur Ctrl+Alt+D. Sur un Mac, appuyez sur ⌥⌘D - </notification> - <notification name="FirstSculptedPrim"> - Vous êtes en train d'éditer un sculptie. -Pour modifier la forme d'un sculptie, vous devez utiliser une texture spécifique. -Vous trouverez des textures dans la bibliothèque de votre inventaire. - </notification> - <notification name="FirstMedia"> - Vous avez lancé la lecture d'un média. Dans le menu Préférences, à l'onglet Audio et vidéo, vous pouvez choisir de lire automatiquement les médias. Notez que cela peut être risqué lorsque les médias viennent de sites que vous ne connaissez pas. - </notification> - <notification name="MaxListSelectMessage"> - Vous ne pouvez sélectionner que [MAX_SELECT] objets maximum dans cette liste. - </notification> - <notification name="VoiceInviteP2P"> - [NAME] vous invite à un chat vocal. -Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer. - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="AutoUnmuteByIM"> - [FIRST] [LAST] a reçu un message instantané et n'est donc plus ignoré. - </notification> - <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] a reçu de l'argent et n'est donc plus ignoré. - </notification> - <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST] a reçu un inventaire et n'est donc plus ignoré. - </notification> - <notification name="VoiceInviteGroup"> - [NAME] a rejoint un chat vocal avec le groupe [GROUP]. -Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer. - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="VoiceInviteAdHoc"> - [NAME] a rejoint un chat vocal avec conférence. -Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer. - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="InviteAdHoc"> - [NAME] vous invite à un chat conférence. -Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer. - <form name="form"> - <button name="Accept" text="Accepter"/> - <button name="Decline" text="Refuser"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> - <notification name="VoiceChannelFull"> - L'appel auquel vous essayez de participer, [VOICE_CHANNEL_NAME], a atteint le nombre maximum de participants. Veuillez réessayer ultérieurement. - </notification> - <notification name="ProximalVoiceChannelFull"> - Nous sommes désolés. Le nombre maximum de conversations vocales a été atteint dans cette zone. Veuillez trouver un autre endroit pour discuter. - </notification> - <notification name="VoiceChannelDisconnected"> - Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. Vous allez maintenant être reconnecté au chat vocal spatial. - </notification> - <notification name="VoiceChannelDisconnectedP2P"> - [VOICE_CHANNEL_NAME] a mis fin à l'appel. Vous allez maintenant être reconnecté au chat vocal spatial. - </notification> - <notification name="P2PCallDeclined"> - [VOICE_CHANNEL_NAME] a refusé votre appel. Vous allez maintenant être reconnecté au chat vocal spatial. - </notification> - <notification name="P2PCallNoAnswer"> - [VOICE_CHANNEL_NAME] ne peut pas prendre votre appel. Vous allez maintenant être reconnecté au chat vocal spatial. - </notification> - <notification name="VoiceChannelJoinFailed"> - Echec de la connexion avec [VOICE_CHANNEL_NAME], veuillez réessayer ultérieurement. Vous allez maintenant être reconnecté au chat vocal spatial. - </notification> - <notification name="VoiceLoginRetry"> - Nous sommes en train de créer un canal vocal pour vous. Veuillez patienter quelques instants. - </notification> - <notification name="Cannot enter parcel: not a group member"> - Vous ne pouvez pas pénétrer sur ce terrain car vous n'êtes pas membre du groupe adéquat. - </notification> - <notification name="Cannot enter parcel: banned"> - Vous ne pouvez pas pénétrer sur ce terrain car l'accès vous y est interdit. - </notification> - <notification name="Cannot enter parcel: not on access list"> - Vous ne pouvez pas pénétrer sur ce terrain car vous n'avez pas les droits d'accès requis. - </notification> - <notification name="VoiceNotAllowed"> - Vous n'êtes pas autorisé à vous connecter au chat vocal pour [VOICE_CHANNEL_NAME]. - </notification> - <notification name="VoiceCallGenericError"> - Une erreur est survenue pendant la connexion au chat vocal pour [VOICE_CHANNEL_NAME]. Veuillez réessayer ultérieurement. - </notification> - <notification name="ServerVersionChanged"> - La région dans laquelle vous avez pénétré utilise une version de simulateur différente. Pour plus de détails, cliquez sur ce message. - </notification> - <notification name="UnableToOpenCommandURL"> - L'URL sur laquelle vous avez cliqué ne peut pas être ouverte dans ce navigateur. - </notification> - <global name="UnsupportedCPU"> - - Votre processeur ne remplit pas les conditions minimum requises. - </global> - <global name="UnsupportedGLRequirements"> - Vous semblez ne pas avoir le matériel requis pour utiliser [APP_NAME]. [APP_NAME] requiert une carte graphique OpenGL avec une prise en charge du multitexturing. Si vous avez une telle carte, assurez-vous que vous avez aussi les drivers les plus récents pour la carte, ainsi que les service packs et les patchs pour votre système d'exploitation. - -Si vous avez toujours des problèmes, veuillez consulter la page suivante : http://www.secondlife.com/support - </global> - <global name="UnsupportedCPUAmount"> - 796 - </global> - <global name="UnsupportedRAMAmount"> - 510 - </global> - <global name="UnsupportedGPU"> - - Votre carte graphique ne remplit pas les conditions minimum requises. - </global> - <global name="UnsupportedRAM"> - - Votre mémoire système ne remplit pas les conditions minimum requises. - </global> - <global name="PermYes"> - Oui - </global> - <global name="PermNo"> - Non - </global> -</notifications> +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <global name="skipnexttime"> + Ne plus afficher + </global> + <global name="alwayschoose"> + Toujours choisir cette option + </global> + <global name="implicitclosebutton"> + Fermer + </global> + <template name="okbutton"> + <form> + <button name="OK" text="$yestext"/> + </form> + </template> + <template name="okignore"/> + <template name="okcancelbuttons"> + <form> + <button name="Cancel" text="$notext"/> + </form> + </template> + <template name="okcancelignore"/> + <template name="okhelpbuttons"> + <form> + <button name="Help" text="$helptext"/> + </form> + </template> + <template name="yesnocancelbuttons"> + <form> + <button name="Yes" text="$yestext"/> + <button name="No" text="$notext"/> + </form> + </template> + <notification functor="GenericAcknowledge" label="Message d'alerte inconnu" name="MissingAlert"> + Votre version de [APP_NAME] ne peut afficher ce message d'erreur. Veuillez vous assurer que vous avez bien la toute dernière version du client. + +Détails de l'erreur : L'alerte, appelée '[_NAME]' est introuvable dans notifications.xml. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FloaterNotFound"> + Erreur floater : impossible de trouver les contrôles suivants : + +[CONTROLS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TutorialNotFound"> + Aucun didacticiel n'est disponible actuellement. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GenericAlert"> + [MESSAGE] + </notification> + <notification name="GenericAlertYesCancel"> + [MESSAGE] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> + </notification> + <notification name="BadInstallation"> + Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version su client. http://get.secondlife.com + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LoginFailedNoNetwork"> + Connexion à [SECOND_LIFE_GRID] impossible. +'[DIAGNOSTIC]' +Veuillez vérifier votre connexion Internet. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MessageTemplateNotFound"> + Le modèle de message [PATH] est introuvable. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="WearableSave"> + Enregistrer les changements dans la partie du corps/les habits actuels ? + <usetemplate canceltext="Cancel" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> + </notification> + <notification name="CompileQueueSaveText"> + Une erreur est survenue lors du chargement du texte pour un script, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement. + </notification> + <notification name="CompileQueueSaveBytecode"> + Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON]. Veuillez réessayer ultérieurement. + </notification> + <notification name="WriteAnimationFail"> + Une erreur est survenue lors de l'écriture des données d'animation. Veuillez réessayer ultérieurement. + </notification> + <notification name="UploadAuctionSnapshotFail"> + Un problème est survenu lors du chargement du script compilé, suite au problème suivant : [REASON] + </notification> + <notification name="UnableToViewContentsMoreThanOne"> + Impossible d'afficher les contenus de plus d'un objet à la fois. +Veuillez ne sélectionner qu'un seul objet. + </notification> + <notification name="SaveClothingBodyChanges"> + Enregistrer tous les changements dans les habits/parties du corps ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Tout enregistrer"/> + </notification> + <notification name="GrantModifyRights"> + Lorsque vous accordez des droits d'édition à un autre résident, vous lui permettez de changer, supprimer ou prendre n'importe lequel de vos objets dans le Monde. Réfléchissez bien avant d'accorder ces droits. +Souhaitez-vous accorder des droits d'édition à [FIRST_NAME] [LAST_NAME] ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="GrantModifyRightsMultiple"> + Lorsque vous accordez des droits d'édition à un autre résident, vous lui permettez de changer n'importe lequel de vos objets dans le Monde. Réfléchissez bien avant d'accorder ces droits. +Souhaitez-vous accorder des droits d'édition aux résidents selectionnés ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="RevokeModifyRights"> + Souhaitez-vous retirer les droits d'édition à [FIRST_NAME] [LAST_NAME] ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="RevokeModifyRightsMultiple"> + Souhaitez-vous retirer les droits d'édition aux résidents selectionnés ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="UnableToCreateGroup"> + Impossible de créer le groupe. +[MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PanelGroupApply"> + [NEEDS_APPLY_MESSAGE] +[WANT_APPLY_MESSAGE] + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ignorer les modifications" yestext="Enregistrer les modifications"/> + </notification> + <notification name="MustSpecifyGroupNoticeSubject"> + Pour envoyer une notice au groupe, vous devez indiquer un sujet. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AddGroupOwnerWarning"> + Vous êtes sur le point d'ajouter des membres du groupe dans le rôle de [ROLE_NAME]. +Les membres ne peuvent pas être destitués de ce rôle. +Ils doivent donner eux-mêmes leur démission. +Êtes-vous certain de vouloir continuer ? + <usetemplate ignoretext="Confirmer avant d'ajouter un nouveau propriétaire" name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="AssignDangerousActionWarning"> + Vous êtes sur le point d'ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ». + *Avertissement* + Tout membre disposant de ce pouvoir peut s'affecter lui-même, ainsi que tout autre membre, à des rôles disposant de pouvoirs plus importants, et accéder potentiellement à des pouvoirs proches de ceux d'un propriétaire. Assurez-vous de bien comprendre ce que vous faites avant d'attribuer ce pouvoir. + +Ajouter ce pouvoir à « [ROLE_NAME] » ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="AssignDangerousAbilityWarning"> + Vous êtes sur le point d'ajouter le pouvoir « [ACTION_NAME] » au rôle « [ROLE_NAME] ». + + *Avertissement* + Tout membre dans un rôle avec ce pouvoir peut s'attribuer à lui-même, ainsi qu'à tout autre membre, Tous les pouvoirs, et accéder potentiellement à des pouvoirs proches de ceux d'un propriétaire. + +Ajouter ce pouvoir à « [ROLE_NAME] » ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="JoinGroupCanAfford"> + Rejoindre ce groupe coûte [COST] L$. +Voulez-vous continuer ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/> + </notification> + <notification name="JoinGroupCannotAfford"> + Rejoindre ce groupe coûte [COST] L$. +Vous n'avez pas suffisamment de L$ pour rejoindre ce groupe. + </notification> + <notification name="CreateGroupCost"> + La création de ce groupe coûte 100 L$. +Les groupes doivent comporter plus d'un membre, sinon ils sont supprimés. +Veuillez inviter des membres d'ici 48 heures. + <usetemplate canceltext="Annuler" name="okcancelbuttons" notext="Annuler" yestext="Créer un groupe pour 100 L$"/> + </notification> + <notification name="LandBuyPass"> + Pour [COST] L$ vous pouvez pénétrer sur ce terrain ([PARCEL_NAME]) et y rester [TIME] heures. Acheter un pass ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="SalePriceRestriction"> + Pour rendre l'annonce disponible à tous, le prix de vente doit être supérieur à 0 L$. +Si le prix de vente est de 0 L$, vous devez choisir un acheteur spécifique. + </notification> + <notification name="ConfirmLandSaleChange"> + Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente. +Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME]. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmLandSaleToAnyoneChange"> + Attention : en cliquant sur Vendre à n'importe qui, vous rendez votre terrain disponible à toute la communauté de [SECOND_LIFE], même aux personnes qui ne sont pas dans cette région. + +Le terrain sélectionné, de [LAND_SIZE] m², est mis en vente. +Votre prix de vente sera de [SALE_PRICE] L$ et la vente sera disponible à [NAME]. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnObjectsDeededToGroup"> + Êtes-vous certain de vouloir renvoyer tous les objets partagés par le groupe [NAME] sur cette parcelle dans l'inventaire du propriétaire précédent ? + +*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés ! + +Objets : [N] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedByUser"> + Etes-vous certain de vouloir renvoyer tous les objets que [NAME] possède sur cette parcelle dans son inventaire ? + +Objets : [N] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedBySelf"> + Êtes-vous certain de vouloir renvoyer tous les objets que vous possédez sur cette parcelle dans votre inventaire ? + +Objets : [N] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedBySelf"> + Êtes-vous certain de vouloir renvoyer tous les objets que vous ne possédez pas sur cette parcelle dans l'inventaire de leur propriétaire ? +Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents. + +*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés ! + +Objets : [N] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByUser"> + Êtes-vous certain de vouloir renvoyer tous les objets que [NAME] ne possède pas sur cette parcelle dans l'inventaire de leur propriétaire ? +Les objets transférables cédés à un groupe seront renvoyés aux propriétaires précédents. + +*Avertissement* Tous les objets non transférables cédés au groupe seront supprimés ! + +Objets : [N] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnAllTopObjects"> + Êtes-vous certain de vouloir renvoyer tous les objets de la liste dans l'inventaire de leur propriétaire ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="DisableAllTopObjects"> + Êtes-vous certain de vouloir désactiver tous les objets dans cette région ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByGroup"> + Renvoyer les objets de cette parcelle qui ne sont pas partagés avec le groupe [NAME] à leur propriétaire ? + +Objets : [N] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="UnableToDisableOutsideScripts"> + Impossible de désactiver les scripts. +Les dégâts sont autorisés dans toute la région. +Pour que les armes fonctionnent, les scripts doivent être autorisés. + </notification> + <notification name="MustBeInParcel"> + Pour définir le point d'atterrissage, vous devez vous trouver à l'intérieur de la parcelle. + </notification> + <notification name="PromptRecipientEmail"> + Veuillez saisir une adresse e-mail valide pour le(s) destinataire(s). + </notification> + <notification name="PromptSelfEmail"> + Veuillez saisir votre adresse e-mail. + </notification> + <notification name="PromptMissingSubjMsg"> + Envoyer la photo avec le sujet ou le message par défaut ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ErrorProcessingSnapshot"> + Erreur dans le traitement des données de la photo + </notification> + <notification name="ErrorEncodingSnapshot"> + Erreur d'encodage de la photo. + </notification> + <notification name="ErrorUploadingPostcard"> + Une erreur est survenue lors du chargement du script compilé, suite au problème suivant : [REASON] + </notification> + <notification name="ErrorUploadingReportScreenshot"> + Une erreur est survenue lors du chargement de la capture d'écran destinée au rapport, suite au problème suivant : [REASON] + </notification> + <notification name="MustAgreeToLogIn"> + Pour vous connecter à [SECOND_LIFE], vous devez accepter les Conditions d'utilisation. + </notification> + <notification name="CouldNotPutOnOutfit"> + Impossible de mettre cet ensemble. +Ce dossier ne contient pas d'habits, de parties du corps ni de pièces jointes. + </notification> + <notification name="CannotWearTrash"> + Vous ne pouvez pas porter d'habits ni de parties du corps se trouvant dans la corbeille. + </notification> + <notification name="CannotWearInfoNotComplete"> + Vous ne pouvez pas porter cet article car il n'a pas encore été chargé. Veuillez réessayer dans une minute. + </notification> + <notification name="MustHaveAccountToLogIn"> + Oups! Vous avez oublié de fournir certaines informations. +Vous devez saisir le nom et le prénom de votre avatar. + +Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ? + <url name="url"> + http://join.secondlife.com/ + </url> + <usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/> + </notification> + <notification name="AddClassified"> + Les petites annonces sont publiées à l'onglet Petites annonces de la section Recherche pendant une semaine. +Rédigez votre annonce, puis cliquez sur Publier pour l'ajouter à la liste des annonces. +Au moment de cliquer sur Publier, vous serez invité à payer des frais. +Plus vous payez cher, plus votre annonce est visible dans la liste ainsi que dans les résultats de recherche de mots-clés. + <usetemplate ignoretext="Comment ajouter une nouvelle petite annonce" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="DeleteClassified"> + Supprimer l'annonce [NAME] ? +Une fois payés, les frais ne sont pas remboursables. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ClassifiedSave"> + Enregistrer les changements dans l'annonce [NAME] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> + </notification> + <notification name="DeleteAvatarPick"> + Supprimer le favori [PICK] ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="PromptGoToEventsPage"> + Aller à la page web de [SECOND_LIFE] réservée aux événements ? + <url name="url"> + http://secondlife.com/events/ + </url> + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="SelectProposalToView"> + Veuillez sélectionner une proposition. + </notification> + <notification name="SelectHistoryItemToView"> + Veuillez sélectionner un historique. + </notification> + <notification name="ResetShowNextTimeDialogs"> + Souhaitez-vous réactiver tous les pop-ups que vous aviez désactivés ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="SkipShowNextTimeDialogs"> + Voulez-vous désactiver tous les pop-ups qui peuvent être évités ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="CacheWillClear"> + Le cache sera vidé après le redémarrage de [APP_NAME]. + </notification> + <notification name="CacheWillBeMoved"> + Le cache sera déplacé après le redémarrage de [APP_NAME]. +Remarque : cela videra le cache. + </notification> + <notification name="ChangeConnectionPort"> + Les paramètres du port prendront effet après le redémarrage de [APP_NAME]. + </notification> + <notification name="ChangeSkin"> + Le nouveau thème apparaîtra après le redémarrage de [APP_NAME]. + </notification> + <notification name="GoToAuctionPage"> + Aller à la page web de [SECOND_LIFE] pour voir le détail des enchères ou enchérir ? + <url name="url"> + http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] + </url> + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="SaveChanges"> + Enregistrer les changements ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/> + </notification> + <notification name="GestureSaveFailedTooManySteps"> + L'enregistrement du geste a échoué. +Il y a trop d'étapes dans ce geste. +Essayez d'en supprimer quelques-unes. + </notification> + <notification name="GestureSaveFailedTryAgain"> + L'enregistrement du geste a échoué. Veuillez réessayer dans une minute. + </notification> + <notification name="GestureSaveFailedObjectNotFound"> + Le geste n'a pas pu être enregistré car l'objet ou l'inventaire de l'objet associé n'a pas été trouvé. +L'objet est peut-être inaccessible ou a peut-être été supprimé. + </notification> + <notification name="GestureSaveFailedReason"> + Une erreur est survenue lors de l'enregistrement du geste, suite au problème suivant : [REASON]. Essayez d'enregistrer votre geste ultérieurement. + </notification> + <notification name="SaveNotecardFailObjectNotFound"> + La note n'a pas pu être enregistrée car l'objet ou l'inventaire de l'objet associé n'a pas été trouvé. +L'objet est peut-être inaccessible ou a peut-être été supprimé. + </notification> + <notification name="SaveNotecardFailReason"> + Une erreur est survenue lors de l'enregistrement de la note, suite au problème suivant : [REASON]. Essayez d'enregistrer votre note ultérieurement. + </notification> + <notification name="ScriptCannotUndo"> + Impossible d'annuler tous les changements dans votre version du script. +Souhaitez-vous charger la dernière version enregistrée sur le serveur ? +(**Attention** Cette opération est irréversible.) + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="SaveScriptFailReason"> + Une erreur est survenue lors de l'enregistrement du script, suite au problème suivant : [REASON]. Essayez d'enregistrer votre script ultérieurement. + </notification> + <notification name="SaveScriptFailObjectNotFound"> + Impossible d'enregistrer le script car l'objet qui le contient est introuvable. +L'objet est peut-être inaccessible ou a peut-être été supprimé. + </notification> + <notification name="SaveBytecodeFailReason"> + Une erreur est survenue lors de l'enregistrement du script compilé, suite au problème suivant : [REASON]. Essayez d'enregistrer votre script ultérieurement. + </notification> + <notification name="StartRegionEmpty"> + Vous n'avez pas défini de région de départ. +Veuillez saisir le nom de la région dans la case Lieu de départ, ou choisissez Dernier emplacement ou Domicile comme Lieu de départ. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CouldNotStartStopScript"> + Impossible de lancer ou d'arrêter le script car l'objet qui le contient est introuvable. +L'objet est peut-être inaccessible ou a peut-être été supprimé. + </notification> + <notification name="CannotDownloadFile"> + Impossible de télécharger le fichier + </notification> + <notification name="CannotWriteFile"> + Impossible d'écrire le fichier [[FILE]] + </notification> + <notification name="UnsupportedHardware"> + Avertissement : vous n'avez pas la configuration système requise pour utiliser [APP_NAME]. Si vous continuez à utiliser [APP_NAME], votre performance risque d'être moindre. Malheureusement, la section [SUPPORT_SITE] n'offre aucune aide pour les problèmes de configuration système. + +MINSPECS +Voulez-vous visiter [_URL] pour plus d'informations ? + <url name="url" option="0"> + http://secondlife.com/support/sysreqs.php?lang=fr + </url> + <usetemplate ignoretext="Mon matériel n'est pas pris en charge" name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="UnknownGPU"> + Votre système contient une carte graphique que nous ne connaissons pas actuellement. +Cela est souvent le cas avec le nouveau materiel qui n'a pas encore été testé avec [APP_NAME]. Vous pourrez probablement utiliser [APP_NAME] sans problème, mais vous devrez peut-être ajuster les paramètres de vos graphiques. +(Préférences > Graphiques). + <form name="form"> + <ignore name="ignore" text="Ma carte graphique ne peut être identifiée"/> + </form> + </notification> + <notification name="DisplaySettingsNoShaders"> + [APP_NAME] a planté lors de l'initialisation des drivers graphiques. +La qualité des graphiques sera paramétrée sur Faible pour éviter certaines erreurs de driver fréquentes. +Certaines fonctionnalités graphiques seront donc désactivées. +Nous vous recommandons de mettre à jour les drivers de votre carte graphique. +La qualité des graphiques peut être augmentée à la section Préférences > Graphiques + </notification> + <notification name="RegionNoTerraforming"> + Le terraformage est interdit dans la région [REGION]. + </notification> + <notification name="CannotCopyWarning"> + Vous n'êtes pas autorisé à copier cet objet et il disparaîtra de votre inventaire si vous le donnez. Souhaitez-vous vraiment offrir cet objet ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="CannotGiveItem"> + Impossible de donner l'objet de l'inventaire. + </notification> + <notification name="TransactionCancelled"> + Transaction annulée. + </notification> + <notification name="TooManyItems"> + Impossible de donner plus de 42 objets au cours d'un seul transfert d'inventaire. + </notification> + <notification name="NoItems"> + Vous n'êtes pas autorisé à transférer les objets sélectionnés. + </notification> + <notification name="CannotCopyCountItems"> + Vous n'êtes pas autorisé à copier [COUNT] des objets sélectionnés. Ces objets disparaîtront de votre inventaire. +Souhaitez-vous vraiment donner ces objets ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="CannotGiveCategory"> + Vous n'êtes pas autorisé à transférer le dossier sélectionné. + </notification> + <notification name="FreezeAvatar"> + Geler cet avatar ? +Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde. + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Dégeler" yestext="Geler"/> + </notification> + <notification name="FreezeAvatarFullname"> + Geler [AVATAR_NAME] ? +Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde. + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Dégeler" yestext="Geler"/> + </notification> + <notification name="EjectAvatarFullname"> + Expulser [AVATAR_NAME] de votre terrain ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Expulser et bannir" yestext="Expulser"/> + </notification> + <notification name="EjectAvatarNoBan"> + Expulser cet avatar de votre terrain ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/> + </notification> + <notification name="EjectAvatarFullnameNoBan"> + Expulser [AVATAR_NAME] de votre terrain ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Expulser"/> + </notification> + <notification name="AcquireErrorTooManyObjects"> + Erreur d'acquisition : trop d'objets sélectionnés. + </notification> + <notification name="AcquireErrorObjectSpan"> + Erreur d'acquisition : les objets sont répartis dans plus d'une région. +Veuillez mettre tous les objets que vous souhaitez acquérir dans la même région. + </notification> + <notification name="PromptGoToCurrencyPage"> + [EXTRA] + +Aller sur [_URL] pour obtenir des informations sur l'achat de L$ ? + <url name="url"> + http://secondlife.com/app/currency/ + </url> + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="UnableToLinkObjects"> + Impossible de lier ces [COUNT] objets. +Vous pouvez lier un maximum de [MAX] objets. + </notification> + <notification name="CannotLinkIncompleteSet"> + Vous ne pouvez lier que des ensembles d'objets complets et vous devez choisir un minimum de deux objets. + </notification> + <notification name="CannotLinkModify"> + Impossible de lier car vous n'avez pas le droit de modifier tous les objets. + +Assurez-vous que vous êtes le propriétaire de tous les objets et qu'aucun d'eux n'est verrouillé. + </notification> + <notification name="CannotLinkDifferentOwners"> + Impossible de lier car les objets n'ont pas tous le même propriétaire. + +Assurez-vous que vous êtes le propriétaire de tous les objets sélectionnés. + </notification> + <notification name="NoFileExtension"> + Pas d'extension pour le fichier suivant : '[FILE]' + +Assurez-vous que le fichier a l'extension correcte. + </notification> + <notification name="InvalidFileExtension"> + Extension de fichier [EXTENSION] invalide +[VALIDS] attendu + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotUploadSoundFile"> + Impossible de lire le fichier son chargé : +[FILE] + </notification> + <notification name="SoundFileNotRIFF"> + Il semble que le fichier ne soit pas un fichier RIFF WAVE : +[FILE] + </notification> + <notification name="SoundFileNotPCM"> + Il semble que le fichier ne soit pas un fichier audio PCM WAVE : +[FILE] + </notification> + <notification name="SoundFileInvalidChannelCount"> + Le fichier contient un nombre de canaux invalide (doit être mono ou stéréo) : +[FILE] + </notification> + <notification name="SoundFileInvalidSampleRate"> + Le fichier ne semble pas être pris en charge (doit être 44,1 k) : +[FILE] + </notification> + <notification name="SoundFileInvalidWordSize"> + Le fichier ne semble pas être pris en charge (doit faire 8 ou 16 bit) : +[FILE] + </notification> + <notification name="SoundFileInvalidHeader"> + Impossible de trouver les données dans l'en-tête WAV : +[FILE] + </notification> + <notification name="SoundFileInvalidTooLong"> + Le fichier audio est trop long (10 secondes maximum) : +[FILE] + </notification> + <notification name="ProblemWithFile"> + Problème avec le fichier [FILE] : + +[ERROR] + </notification> + <notification name="CannotOpenTemporarySoundFile"> + Impossible d'ouvrir le fichier son compressé temporaire : [FILE] + </notification> + <notification name="UnknownVorbisEncodeFailure"> + Échec d'encodage Vorbis inconnu sur : [FILE] + </notification> + <notification name="CannotEncodeFile"> + Impossible d'encoder le fichier : [FILE] + </notification> + <notification name="CorruptResourceFile"> + Fichier ressource corrompu : [FILE] + </notification> + <notification name="UnknownResourceFileVersion"> + Version de fichier ressource Linden inconnu : [FILE] + </notification> + <notification name="UnableToCreateOutputFile"> + Impossible de créer le fichier de sortie : [FILE] + </notification> + <notification name="DoNotSupportBulkAnimationUpload"> + Actuellement, APP_NAME] ne prend pas en charge le chargement de lots de fichiers d'animation. + </notification> + <notification name="CannotUploadReason"> + Impossible de charger [FILE] suite au problème suivant : [REASON] +Veuillez réessayer ultérieurement. + </notification> + <notification name="LandmarkCreated"> + Vous avez ajouté "[LANDMARK_NAME]" à votre dossier [FOLDER_NAME]. + </notification> + <notification name="CannotCreateLandmarkNotOwner"> + Vous ne pouvez pas créer de repère ici car le propriétaire du terrain ne l'autorise pas. + </notification> + <notification name="CannotRecompileSelectObjectsNoScripts"> + Impossible d'effectuer les recompilations. +Sélectionnez un objet avec un script. + </notification> + <notification name="CannotRecompileSelectObjectsNoPermission"> + Impossible d'effectuer les recompilations. + +Sélectionnez des objets qui ont des scripts et que vous pouvez modifier. + </notification> + <notification name="CannotResetSelectObjectsNoScripts"> + Impossible d'effectuer la réinitialisation. + +Veuillez sélectionner des objets avec des scripts. + </notification> + <notification name="CannotResetSelectObjectsNoPermission"> + Impossible d'effectuer la réinitialisation. + +Sélectionnez des objets qui ont des scripts et que vous pouvez modifier. + </notification> + <notification name="CannotSetRunningSelectObjectsNoScripts"> + Impossible de définir les scripts sur « exécution ». + +Veuillez sélectionner des objets avec des scripts. + </notification> + <notification name="CannotSetRunningNotSelectObjectsNoScripts"> + Impossible de définir les scripts sur « non-exécution ». + +Veuillez sélectionner des objets avec des scripts. + </notification> + <notification name="NoFrontmostFloater"> + Aucun floater frontmost à sauvegarder. + </notification> + <notification name="SeachFilteredOnShortWords"> + Votre requête a été modifiée et les mots trops courts ont été supprimés. + +Recherche effectuée : [FINALQUERY] + </notification> + <notification name="SeachFilteredOnShortWordsEmpty"> + Vos termes de recherche étaient trop courts et aucune recherche n'a été effectuée. + </notification> + <notification name="CouldNotTeleportReason"> + Impossible de téléporter. +[REASON] + </notification> + <notification name="invalid_tport"> + Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter. +Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. + </notification> + <notification name="invalid_region_handoff"> + Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions. +Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. + </notification> + <notification name="blocked_tport"> + Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment. +Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème. + </notification> + <notification name="nolandmark_tport"> + Désolé, le système n'a pas réussi à localiser la destination de votre repère. + </notification> + <notification name="timeout_tport"> + Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. +Veuillez réessayer dans un moment. + </notification> + <notification name="noaccess_tport"> + Désolé, vous n'avez pas accès à cette destination. + </notification> + <notification name="missing_attach_tport"> + Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter. + </notification> + <notification name="too_many_uploads_tport"> + Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée. + </notification> + <notification name="expired_tport"> + Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. + </notification> + <notification name="expired_region_handoff"> + Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. + </notification> + <notification name="no_host"> + Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes. + </notification> + <notification name="no_inventory_host"> + L'inventaire est temporairement indisponible. + </notification> + <notification name="CannotSetLandOwnerNothingSelected"> + Impossible de définir le propriétaire foncier : +aucune parcelle sélectionnée. + </notification> + <notification name="CannotSetLandOwnerMultipleRegions"> + Impossible de définir un propriétaire car la sélection couvre plusieurs régions. Veuillez sélectionner une zone plus petite et réessayer. + </notification> + <notification name="ForceOwnerAuctionWarning"> + Cette parcelle est mise aux enchères. Définir un propriétaire annulerait les enchères, ce qui pourrait être gênant pour certains résidents si ces dernières ont commencé. Souhaitez-vous définir un propriétaire ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="CannotContentifyNothingSelected"> + Problème : +Aucune parcelle sélectionnée. + </notification> + <notification name="CannotContentifyNoRegion"> + Problème : +Aucune région sélectionnée. + </notification> + <notification name="CannotReleaseLandNothingSelected"> + Impossible d'abandonner le terrain : +aucune parcelle sélectionnée. + </notification> + <notification name="CannotReleaseLandNoRegion"> + Impossible d'abandonner le terrain : +la région est introuvable. + </notification> + <notification name="CannotBuyLandNothingSelected"> + Impossible d'acheter le terrain : +aucune parcelle sélectionnée. + </notification> + <notification name="CannotBuyLandNoRegion"> + Impossible d'acheter le terrain : +la région dans laquelle il est situé est introuvable. + </notification> + <notification name="CannotCloseFloaterBuyLand"> + Vous ne pouvez pas fermer la fenêtre Acheter le terrain avant que [APP_NAME] n'estime le montant de cette transaction. + </notification> + <notification name="CannotDeedLandNothingSelected"> + Cession du terrain impossible : +aucune parcelle sélectionnée. + </notification> + <notification name="CannotDeedLandNoGroup"> + Cession du terrain impossible : +aucun groupe sélectionné. + </notification> + <notification name="CannotDeedLandNoRegion"> + Cession du terrain impossible : +la région dans laquelle il est situé est introuvable. + </notification> + <notification name="CannotDeedLandMultipleSelected"> + Cession du terrain impossible : +plusieurs parcelles sélectionnées. + +Essayez de ne sélectionner qu'une seule parcelle. + </notification> + <notification name="ParcelCanPlayMedia"> + Cette parcelle propose des flux média. +Pour jouer des flux média, il faut avoir une connexion internet rapide. + +Jouer les flux média lorsqu'ils sont disponibles ? +(Vous pourrez modifier cette option ultérieurement sous Préférences > Audio et vidéo.) + <usetemplate name="okcancelbuttons" notext="Désactiver" yestext="Jouer le média"/> + </notification> + <notification name="CannotDeedLandWaitingForServer"> + Cession du terrain impossible : +rapport de propriété sur le point d'être envoyé par le serveur. + +Merci de réessayer. + </notification> + <notification name="CannotDeedLandNoTransfer"> + Cession du terrain impossible : +la cession de terrain est interdite dans la région [REGION]. + </notification> + <notification name="CannotReleaseLandWatingForServer"> + Impossible d'abandonner le terrain : +mise à jour des informations sur la parcelle sur le point d'être envoyée par le serveur. + +Veuillez réessayer dans quelques secondes. + </notification> + <notification name="CannotReleaseLandSelected"> + Impossible d'abandonner le terrain : +vous n'êtes pas le propriétaire des parcelles sélectionnées. + +Veuillez sélectionner une seule parcelle. + </notification> + <notification name="CannotReleaseLandDontOwn"> + Impossible d'abandonner le terrain : +vous n'avez pas le droit de libérer cette parcelle. +Les parcelles qui vous appartiennent sont en vert. + </notification> + <notification name="CannotReleaseLandRegionNotFound"> + Impossible d'abandonner le terrain : +la région dans laquelle il est situé est introuvable. + </notification> + <notification name="CannotReleaseLandNoTransfer"> + Impossible d'abandonner le terrain : +le transfert de terrain est interdit dans la région [REGION]. + </notification> + <notification name="CannotReleaseLandPartialSelection"> + Impossible d'abandonner le terrain : +vous devez sélectionner une parcelle entière pour la libérer. + +Sélectionnez toute la parcelle ou divisez-la d'abord. + </notification> + <notification name="ReleaseLandWarning"> + Vous vous apprêtez à libérer [AREA] m² de terrain. +Si vous libérez cette parcelle, elle sera supprimée de votre patrimoine, mais vous ne recevrez pas de L$. + +Libérer ce terrain ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNothingSelected"> + Division du terrain impossible : + +aucune parcelle sélectionnée. + </notification> + <notification name="CannotDivideLandPartialSelection"> + Division du terrain impossible : + +Toute la parcelle est sélectionnée. +Sélectionnez une partie de la parcelle uniquement. + </notification> + <notification name="LandDivideWarning"> + Si vous divisez ce terrain, cette parcelle sera partagée en deux et chaque parcelle pourra avoir ses propres paramètres. Après cette opération, certains paramètres reviendront aux paramètres par défaut. + +Diviser le terrain ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNoRegion"> + Division du terrain impossible : +la région dans laquelle il est situé est introuvable. + </notification> + <notification name="CannotJoinLandNoRegion"> + Impossible de fusionner le terrain : +la région dans laquelle il est situé est introuvable. + </notification> + <notification name="CannotJoinLandNothingSelected"> + Impossible de fusionner le terrain : +aucune parcelle sélectionnée. + </notification> + <notification name="CannotJoinLandEntireParcelSelected"> + Impossible de fusionner le terrain : +vous avez sélectionné une seule parcelle. + +Sélectionnez le terrain sur les deux parcelles. + </notification> + <notification name="CannotJoinLandSelection"> + Impossible de fusionner le terrain : +vous devez sélectionner au moins deux parcelles. + +Sélectionnez le terrain sur les deux parcelles. + </notification> + <notification name="JoinLandWarning"> + En fusionnant ce terrain, vous créerez une grande parcelle composée de toutes les parcelles se trouvant dans le rectangle sélectionné. +Vous devrez réinitialiser le nom et les options de la nouvelle parcelle. + +Fusionner le terrain ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmNotecardSave"> + Cette note doit être sauvegardée avant que l'objet ne puisse être copié ou visualisé. Enregistrer la note ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmItemCopy"> + Copier cet objet dans votre inventaire ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Copier"/> + </notification> + <notification name="ResolutionSwitchFail"> + Échec du changement de résolution (à [RESX], de [RESY]) + </notification> + <notification name="ErrorUndefinedGrasses"> + Erreur : herbes non identifiées : [SPECIES] + </notification> + <notification name="ErrorUndefinedTrees"> + Erreur : arbres non identifiés : [SPECIES] + </notification> + <notification name="CannotSaveWearableOutOfSpace"> + Impossible de sauvegarder [NAME]. Pour pouvoir sauvegarder ce fichier, vous devez d'abord libérer de la mémoire sur votre ordinateur. + </notification> + <notification name="CannotSaveToAssetStore"> + Impossible de sauvegarder le fichier [NAME] dans la base de données centrale. +Cette erreur est généralement temporaire. Veuillez éditer et sauvegarder l'élément endossable à nouveau d'ici quelques minutes. + </notification> + <notification name="YouHaveBeenLoggedOut"> + Vous avez été déconnecté(e) de [SECOND_LIFE] : + [MESSAGE] +Vous pouvez afficher vos messages instantanés et votre chat en cliquant sur Afficher IM et chat. Sinon, cliquez sur Quitter pour quitter immédiatement [APP_NAME]. + <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Afficher IM et chat"/> + </notification> + <notification name="OnlyOfficerCanBuyLand"> + Impossible d'acheter du terrain pour le groupe : +Vous n'avez pas le droit d'acheter de terrain pour votre groupe. + </notification> + <notification label="Devenir amis" name="AddFriend"> + Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu'ils se connectent. + +Proposer à [NAME] de devenir votre ami(e) ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification label="Devenir amis" name="AddFriendWithMessage"> + Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu'ils se connectent. + +Proposer à [NAME] de devenir votre ami(e) ? + <form name="form"> + <input name="message"> + Voulez-vous être mon ami(e) ? + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="RemoveFromFriends"> + Voulez-vous supprimer [FIRST_NAME] [LAST_NAME] de votre liste d'amis ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="RemoveMultipleFromFriends"> + Voulez-vous supprimer plusieurs résidents de votre liste d'amis ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedPublicObjectsByUser"> + Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains des autres résidents dans cette région ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedObjectsByUser"> + Êtes-vous certain de vouloir supprimer tous les objets scriptés appartenant à ** [AVATAR_NAME] ** sur tous les terrains de cette région ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="GodDeleteAllObjectsByUser"> + Êtes-vous certain de vouloir supprimer tous les objets (scriptés ou pas) appartenant à ** [AVATAR_NAME] ** sur tous les terrains de cette région ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BlankClassifiedName"> + Vous devez choisir un nom pour votre petite annonce. + </notification> + <notification name="MinClassifiedPrice"> + Le coût de l'annonce doit être de [MIN_PRICE] L$ minimum. + +Veuillez saisir un montant plus élevé. + </notification> + <notification name="ConfirmObjectDeleteLock"> + Au moins un des objets que vous avez sélectionnés est verrouillé. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopy"> + Au moins un des objets que vous avez sélectionnés n'est pas copiable. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoOwn"> + Au moins un des objets que vous avez sélectionnés ne vous appartient pas. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopy"> + Au moins un des objets est verrouillé. +Au moins un des objets n'est pas copiable. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoOwn"> + Au moins un des objets est verrouillé. +Au moins un des objets ne vous appartient pas. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopyNoOwn"> + Au moins un des objets n'est pas copiable. +Au moins un des objets ne vous appartient pas. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> + Au moins un des objets est verrouillé. +Au moins un des objets n'est pas copiable. +Au moins un des objets ne vous appartient pas. + +Êtes-vous certain de vouloir supprimer ces objets ? + <usetemplate name="okcancelbuttons" notext="annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLock"> + Au moins un des objets est verrouillé. + +Êtes-vous certain de vouloir prendre ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeNoOwn"> + Vous n'êtes pas le propriétaire de tous les objets que vous prenez. +Si vous continuez, les droits accordés au prochain propriétaire seront activés et vous risquez de ne plus pouvoir modifier ou copier les objets. + +Êtes-vous certain de vouloir prendre ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLockNoOwn"> + Au moins un des objets est verrouillé. +Vous n'êtes pas le propriétaire de tous les objets que vous prenez. +Si vous continuez, les droits accordés au prochain propriétaire seront activés et vous risquez de ne plus pouvoir modifier ou copier les objets. +Par contre, vous pouvez prendre les objets sélectionnés. + +Êtes-vous certain de vouloir prendre ces objets ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="CantBuyLandAcrossMultipleRegions"> + Impossible d'acheter le terrain car la sélection couvre plusieurs régions. + +Veuillez sélectionner une zone plus petite et réessayer. + </notification> + <notification name="DeedLandToGroup"> + Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge. +Le prix de la vente du terrain n'est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe. + +Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="DeedLandToGroupWithContribution"> + Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge. +La cession incluera une contribution de terrain simultanée au groupe de [FIRST_NAME] [LAST_NAME]. +Le prix de la vente du terrain n'est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe. + +Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="DisplaySetToSafe"> + Les paramètres d'affichage sont au niveau le plus sûr, comme vous l'aviez indiqué. + </notification> + <notification name="DisplaySetToRecommended"> + Vos paramètres d'affichage ont été réglés avec une marge de sécurité en fonction de votre configuration système. + </notification> + <notification name="ErrorMessage"> + [ERROR_MESSAGE] + </notification> + <notification name="AvatarMovedDesired"> + La destination que vous avez choisie n'est pas disponible actuellement. +Vous avez été téléporté vers une région voisine. + </notification> + <notification name="AvatarMovedLast"> + Votre dernière destination n'est pas disponible actuellement. +Vous avez été téléporté vers une région voisine. + </notification> + <notification name="AvatarMovedHome"> + La destination que vous avez choisie n'est pas disponible actuellement. +Vous avez été téléporté vers une région voisine. +Nous vous conseillons de définir votre domicile ailleurs. + </notification> + <notification name="ClothingLoading"> + Vos vêtements sont en cours de téléchargement. +Vous pouvez utiliser [SECOND_LIFE] normalement, les autres résidents vous voient correctement. + <form name="form"> + <ignore name="ignore" text="Vos habits prennent du temps à télécharger"/> + </form> + </notification> + <notification name="FirstRun"> + L'installation de [APP_NAME] est terminée. + +S'il s'agit de la première fois que vous utilisez [SECOND_LIFE], vous devrez créer un compte avant de pouvoir vous connecter. +Retourner sur www.secondlife.com pour créer un nouveau compte ? + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Nouveau compte..."/> + </notification> + <notification name="LoginPacketNeverReceived"> + Nous avons des difficultés à vous connecter. Il y a peut-être un problème avec votre connexion Internet ou la [SECOND_LIFE_GRID]. + +Vérifiez votre connextion Internet et réessayez dans quelques minutes, cliquez sur Aide pour consulter la page [SUPPORT_SITE] ou bien sur Téléporter pour essayer d'aller chez vous. + <url name="url"> + http://secondlife.com/support/ + </url> + <form name="form"> + <button name="OK" text="OK"/> + <button name="Help" text="Aide"/> + <button name="Teleport" text="Téléporter"/> + </form> + </notification> + <notification name="WelcomeChooseSex"> + Votre personnage va apparaître dans un moment. + +Pour marcher, utilisez les flèches de direction. +Appuyez sur F1 pour obtenir de l'aide ou en savoir plus sur [SECOND_LIFE]. +Choisissez un avatar homme ou femme. +Vous pourrez revenir sur votre décision plus tard. + <usetemplate name="okcancelbuttons" notext="Femme" yestext="Homme"/> + </notification> + <notification name="NotEnoughCurrency"> + [NAME] [PRICE] L$ Vous n'avez pas suffisamment de L$ pour faire cela. + </notification> + <notification name="GrantedModifyRights"> + [FIRST_NAME] [LAST_NAME] vous avez donné la permission de modifier ses objets. + </notification> + <notification name="RevokedModifyRights"> + Vous n'avez plus le droit de modifier les objets de [FIRST_NAME] [LAST_NAME]. + </notification> + <notification name="FlushMapVisibilityCaches"> + Cela videra le cache cartographique de cette région. +Cela n'est vraiment utile que pour faire du débugage. +(En production, attendez 5 minutes. Les cartes seront mises à jour après reconnexion.) + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BuyOneObjectOnly"> + Impossible d'acheter plus d'un objet à la fois. Veuillez ne sélectionner qu'un seul objet. + </notification> + <notification name="OnlyCopyContentsOfSingleItem"> + Impossible de copier les contenus de plus d'un objet à la fois. +Veuillez ne sélectionner qu'un seul objet. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="KickUsersFromRegion"> + Téléporter tous les résidents de cette région chez eux ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="EstateObjectReturn"> + Etes-vous certain de vouloir renvoyer les objets appartenant à [USER_NAME] ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="InvalidTerrainBitDepth"> + Impossible de definir les textures de la région : +La texture du terrain [TEXTURE_NUM] a une profondeur invalide ([TEXTURE_BIT_DEPTH]). + +Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus petite, puis cliquez à nouveau sur Appliquer. + </notification> + <notification name="InvalidTerrainSize"> + Impossible de definir les textures de la région : +La texture du terrain [TEXTURE_NUM] est trop volumineuse ([TEXTURE_SIZE_X] X [TEXTURE_SIZE_Y]). + +Remplacer la texture [TEXTURE_NUM] avec une image de 24 bits, 512 X 512, ou plus petite, puis cliquez à nouveau sur Appliquer. + </notification> + <notification name="RawUploadStarted"> + Le chargement a commencé. Cela va prendre une à deux minutes, +suivant votre vitesse de connexion. + </notification> + <notification name="ConfirmBakeTerrain"> + Etes-vous sûr(e) de vouloir figer le relief actuel, en faire le point central des limites d'élévation/abaissement de relief et la valeur par défaut du bouton Annuler modification ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="MaxAllowedAgentOnRegion"> + Vous ne pouvez pas autoriser plus de [MAX_AGENTS] résidents. + </notification> + <notification name="MaxBannedAgentsOnRegion"> + Vous ne pouvez pas bannir plus de [MAX_BANNED] résidents. + </notification> + <notification name="MaxAgentOnRegionBatch"> + Echec lors de la tentative d'ajout de [NUM_ADDED] agents : +Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS]. + </notification> + <notification name="MaxAllowedGroupsOnRegion"> + Vous ne pouvez pas avoir plus que [MAX_GROUPS] groupes autorisés. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Figer"/> + </notification> + <notification name="MaxManagersOnRegion"> + Vous ne pouvez avoir que [MAX_MANAGER] gérants de domaine. + </notification> + <notification name="OwnerCanNotBeDenied"> + Impossible d'ajouter le propriétaire du domaine à la liste des résidents bannis. + </notification> + <notification name="CanNotChangeAppearanceUntilLoaded"> + Impossible de changer d'apparence jusqu'à ce que les habits et la silhouette soient chargés. + </notification> + <notification name="ClassifiedMustBeAlphanumeric"> + Le nom de votre petite annonce doit commencer par un chiffre ou une lettre (A à Z). La ponctuation n'est pas autorisée. + </notification> + <notification name="CantSetBuyObject"> + Cet objet n'est pas à vendre. +Veuillez choisir un objet à vendre et réessayer. + </notification> + <notification name="FinishedRawDownload"> + Chargement du fichier de terrain raw effectué vers : +[DOWNLOAD_PATH]. + </notification> + <notification name="DownloadWindowsMandatory"> + Une nouvelle version de [APP_NAME] est disponible. +[MESSAGE] +Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour. + <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/> + </notification> + <notification name="DownloadWindows"> + Une mise à jour de [APP_NAME] est disponible. +[MESSAGE] +Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> + </notification> + <notification name="DownloadWindowsReleaseForDownload"> + Une mise à jour de [APP_NAME] est disponible. +[MESSAGE] +Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> + </notification> + <notification name="DownloadLinuxMandatory"> + Une nouvelle version de [APP_NAME] est disponible. +[MESSAGE] +Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour. + <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/> + </notification> + <notification name="DownloadLinux"> + Une mise à jour de [SECOND_LIFE] est disponible. +[MESSAGE] +Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> + </notification> + <notification name="DownloadLinuxReleaseForDownload"> + Une mise à jour de [SECOND_LIFE] est disponible. +[MESSAGE] +Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> + </notification> + <notification name="DownloadMacMandatory"> + Une nouvelle version de [APP_NAME] est disponible. +[MESSAGE] +Pour utiliser [APP_NAME] vous devez télécharger cette mise à jour. + +Télécharger vers le dossier Applications ? + <usetemplate name="okcancelbuttons" notext="Quitter" yestext="Télécharger"/> + </notification> + <notification name="DownloadMac"> + Une mise à jour de [APP_NAME] est disponible. +[MESSAGE] +Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. + +Télécharger vers le dossier Applications ? + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> + </notification> + <notification name="DownloadMacReleaseForDownload"> + Une mise à jour de [APP_NAME] est disponible. +[MESSAGE] +Cette mise à jour n'est pas requise mais si vous voulez une meilleure performance et plus de stabilité, nous vous recommandons de l'installer. + +Télécharger vers le dossier Applications ? + <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> + </notification> + <notification name="DeedObjectToGroup"> + Si vous cédez cet objet, le groupe : +* recevra les L$ versés pour l'objet ; + <usetemplate ignoretext="Confimer avant que je ne cède un objet à un groupe" name="okcancelignore" notext="Annuler" yestext="Céder"/> + </notification> + <notification name="WebLaunchExternalTarget"> + Voulez-vous ouvrir votre navigateur web système pour afficher ce contenu ? + <usetemplate ignoretext="Ouvrir mon navigateur pour consulter une page web" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="WebLaunchJoinNow"> + Aller sur secondlife.com pour gérer votre compte ? + <usetemplate ignoretext="Lancer mon navigateur pour gérer mon compte" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="WebLaunchSecurityIssues"> + Pour apprendre à signaler un problème de sécurité, consultez le Wiki de [SECOND_LIFE]. + <usetemplate ignoretext="Lancer mon navigateur pour apprendre comment signaler un problème de sécurité" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="WebLaunchQAWiki"> + Consultez le Wiki sur l'Assurance Qualité de [SECOND_LIFE]. + <usetemplate ignoretext="Lancer mon navigateur web pour consulter la page Wiki sur l'Assurance Qualité." name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="WebLaunchPublicIssue"> + Pour signaler des bugs et autres problèmes, utilisez le JIRA de [SECOND_LIFE]. + <usetemplate ignoretext="Lancer mon navigateur pour utiliser le Public Issue Tracker (JIRA)" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/> + </notification> + <notification name="WebLaunchSupportWiki"> + Visitez le blog officiel des Lindens pour les dernières nouvelles et informations. + <usetemplate ignoretext="Lancer mon navigateur web pour consulter le blog" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/> + </notification> + <notification name="WebLaunchLSLGuide"> + Voulez-vous ouvrir le guide pour l'écriture de scripts ? + <usetemplate ignoretext="Lancer mon navigateur web pour consulter le guide pour l'écriture de scripts" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLWiki"> + Voulez-vous ouvrir le portail LSL pour l'écriture de scripts ? + <usetemplate ignoretext="Lancer mon navigateur web pour consulter le portail LSL" name="okcancelignore" notext="Annuler" yestext="Aller à la page"/> + </notification> + <notification name="ReturnToOwner"> + Êtes-vous certain de vouloir renvoyer les objets sélectionnés à leur propriétaire ? Les objets donnés transférables seront renvoyés à leur ancien propriétaire. + +*Avertissement* Les objets non transférables seront supprimés ! + <usetemplate ignoretext="Confirmer avant de rendre les objets à leurs propriétaires" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="GroupLeaveConfirmMember"> + Vous êtes actuellement membre du groupe [GROUP]. +Quitter le groupe ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmKick"> + Souhaitez-vous vraiment éjecter tous les utilisateurs de la grille ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Éjecter tous"/> + </notification> + <notification name="MuteLinden"> + Désolé, vous ne pouvez pas ignorer un Linden. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotStartAuctionAlreadyForSale"> + Vous ne pouvez pas démarrer des enchères sur une parcelle déjà en vente. Si vous êtes certain de vouloir démarrer des enchères, mettez fin à la vente. + </notification> + <notification label="Échec de la fonction Ignorer les objets par nom" name="MuteByNameFailed"> + Vous ignorez déjà ce résident. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RemoveItemWarn"> + Si vous supprimez des contenus, vous risquez d'endommager l'objet. Souhaitez-vous supprimer cet objet ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="CantOfferCallingCard"> + Impossible d'offrir une carte de visite actuellement. Veuillez réessayer dans un moment. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CantOfferFriendship"> + Impossible de proposer votre amitié actuellement. Veuillez réessayer dans un moment. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="BusyModeSet"> + Le mode Occupé est sélectionné. +Les chats et les messages instantanés ne s'afficheront pas. Les messages instantanés génèreront la réponse en mode occupé que vous avez créée. Toutes les offres de téléportation seront refusées. Toutes les offres d'inventaire iront dans la corbeille. + <usetemplate ignoretext="Je change mon statut en mode Occupé" name="okignore" yestext="OK"/> + </notification> + <notification name="JoinedTooManyGroupsMember"> + Vous avez atteint le nombre de groupes maximum. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre. +[NAME] vous invite à rejoindre un groupe. +[INVITE] + <usetemplate name="okcancelbuttons" notext="Refuser" yestext="Rejoindre"/> + </notification> + <notification name="KickUser"> + Éjecter cet utilisateur avec quel message ? + <form name="form"> + <input name="message"> + Un administrateur vous a déconnecté. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="KickAllUsers"> + Éjecter tous les résidents actuellement en ligne avec quel message ? + <form name="form"> + <input name="message"> + Un administrateur vous a déconnecté. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="FreezeUser"> + Geler cet utilisateur avec quel message ? + <form name="form"> + <input name="message"> + Vous avez été gelé. Vous ne pouvez ni bouger ni chatter. Un administrateur va vous envoyer un message instantané (IM). + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="UnFreezeUser"> + Dégeler cet utilisateur avec quel message ? + <form name="form"> + <input name="message"> + Vous n'êtes plus gelé. + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="OfferTeleport"> + Proposez une téléportation avec le message suivant ? + <form name="form"> + <input name="message"> + On se rejoint à [REGION] ? + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="OfferTeleportFromGod"> + Demander au résident de venir vous rejoindre ? + <form name="form"> + <input name="message"> + On se rejoint à [REGION] ? + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="TeleportFromLandmark"> + Êtes-vous certain de vouloir être téléporté ? + <usetemplate ignoretext="Confirmer que je veux me téléporter à un repère" name="okcancelignore" notext="Annuler" yestext="Téléporter"/> + </notification> + <notification name="TeleportToPick"> + Téléporter vers [PICK] ? + <usetemplate ignoretext="Confirmer que je veux me téléporter à un endroit dans mes Préférences" name="okcancelignore" notext="Annuler" yestext="Téléporter"/> + </notification> + <notification label="Envoyer un message à tout le monde dans votre domaine" name="MessageEstate"> + Saisissez un message court qui sera envoyé à tous les résidents se trouvant actuellement sur votre domaine. + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification label="Modifier un domaine Linden" name="ChangeLindenEstate"> + Vous vous apprêtez à modifier un domaine appartenant aux Lindens (continent, zone réservée aux ados, orientation etc.). + +Cela est extrêmement délicat car l'expérience des résidents est en jeu. Sur le continent, cela modifiera des milliers de régions et sera difficile à digérer pour le serveur. + +Continuer ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification label="Modifier l'accès à un domaine Linden" name="ChangeLindenAccess"> + Vous vous apprêtez à modifier la liste d'accès à un domaine appartenant aux Linden (continent, zone réservée aux ados, orientation etc.). + +Cette action est délicate et ne doit être effectuée que pour appeler le hack autorisant des objets/L$ à être transférés à l'intérieur/extérieur de la grille. +Cette action modifiera des milliers de régions et sera difficile à digérer pour le serveur. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification label="Choisir le domaine" name="EstateAllowedAgentAdd"> + Ajouter à la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateAllowedAgentRemove"> + Supprimer de la liste des résidents autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateAllowedGroupAdd"> + Ajouter à la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateAllowedGroupRemove"> + Supprimer de la liste des groupes autorisés uniquement pour ce domaine ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateBannedAgentAdd"> + Refuser l'accès à ce domaine uniquement ou à [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateBannedAgentRemove"> + Supprimer ce résident de la liste des résidents bannis pour ce domaine uniquement ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateManagerAdd"> + Ajouter un gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Choisir le domaine" name="EstateManagerRemove"> + Supprimer le gérant de domaine pour ce domaine uniquement ou pour [ALL_ESTATES] ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> + </notification> + <notification label="Confirmer" name="EstateKickUser"> + Éjecter [EVIL_USER] de ce domaine ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="EstateChangeCovenant"> + Êtes-vous certain de vouloir modifier le règlement du domaine ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked"> + Votre catégorie d'accès ne vous autorise pas à pénétrer dans cette région. Cela vient peut-être du fait qu'il manquait des informations pour valider votre âge. + +Vérifiez que vous avez la toute dernière version du client et consultez les pages d'aide pour savoir comment accéder aux zones ayant ce niveau d'accès. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked_KB"> + Votre catégorie d'accès ne vous permet pas de pénétrer dans cette région. + +Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? + <url name="url"> + http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB) + </url> + <usetemplate ignoretext="Je ne peux pas pénétrer dans cette région car je n'ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d'aide"/> + </notification> + <notification name="RegionEntryAccessBlocked_Notify"> + Votre catégorie d'accès ne vous permet pas de pénétrer dans cette région. + </notification> + <notification name="RegionEntryAccessBlocked_Change"> + Votre catégorie d'accès ne vous permet pas de pénétrer dans cette région. + +En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d'accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition > Préférences... > Général. + <form name="form"> + <button name="OK" text="Modifier les Préférences"/> + <button default="true" name="Cancel" text="Fermer"/> + <ignore name="ignore" text="La catégorie de contenu que j'ai choisie m'empêche de pénétrer dans une région"/> + </form> + </notification> + <notification name="LandClaimAccessBlocked"> + Votre catégorie d'accès ne vous permet pas de réclamer cette région. Cela vient peut-être du fait qu'il manquait des informations pour valider votre âge. + +Vérifiez que vous avez la toute dernière version du client et consultez les pages d'aide pour savoir comment accéder aux zones ayant ce niveau d'accès. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandClaimAccessBlocked_KB"> + Votre catégorie d'accès ne vous permet pas de réclamer cette région. + +Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? + <url name="url"> + http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB) + </url> + <usetemplate ignoretext="Je ne peux pas réclamer cette région car je n'ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d'aide"/> + </notification> + <notification name="LandClaimAccessBlocked_Notify"> + Votre catégorie d'accès ne vous autorise pas à réclamer cette région. + </notification> + <notification name="LandClaimAccessBlocked_Change"> + Votre catégorie d'accès ne vous permet pas de réclamer cette région. + +En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d'accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition > Préférences... > Général. + <usetemplate ignoretext="La catégorie de contenu que j'ai choisie m'empêche de réclamer un terrain" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/> + </notification> + <notification name="LandBuyAccessBlocked"> + Votre catégorie d'accès ne vous permet pas d'acheter cette région. Cela vient peut-être du fait qu'il manquait des informations pour valider votre âge. + +Vérifiez que vous avez la toute dernière version du client et consultez les pages d'aide pour savoir comment accéder aux zones ayant ce niveau d'accès. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandBuyAccessBlocked_KB"> + Votre catégorie d'accès ne vous permet pas d'acheter cette région. + +Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? + <url name="url"> + http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB) + </url> + <usetemplate ignoretext="Je ne peux pas acheter ce terrain car je n'ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d'aide"/> + </notification> + <notification name="LandBuyAccessBlocked_Notify"> + Votre catégorie d'accès ne vous permet pas d'acheter cette région. + </notification> + <notification name="LandBuyAccessBlocked_Change"> + Votre catégorie d'accès ne vous autorise pas à acheter cette région. + +En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d'accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Édition > Préférences... > Général. + <usetemplate ignoretext="La catégorie de contenu que j'ai choisie m'empêche d'acheter un terrain" name="okcancelignore" notext="Fermer" yestext="Modifier les Préférences"/> + </notification> + <notification name="TooManyPrimsSelected"> + "Vous avez sélectionné trop de prims. Veuillez sélectionner au maximum [MAX_PRIM_COUNT] prims et réessayer." + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ProblemImportingEstateCovenant"> + Problème lors de l'importation du règlement du domaine. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ProblemAddingEstateManager"> + Problèmes lors de l'ajout d'un nouveau gérant de domaine. Il est possible qu'au moins un des domaines ait une liste de gérants complète. + </notification> + <notification name="ProblemAddingEstateGeneric"> + Problème lors de l'ajout à la liste de ce domaine. Il est possible qu'au moins un des domaines ait une liste complète. + </notification> + <notification name="UnableToLoadNotecardAsset"> + Impossible de charger les données de la note actuellement. + </notification> + <notification name="NotAllowedToViewNotecard"> + Permissions pour afficher la note insuffisantes. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MissingNotecardAssetID"> + Les références de la note ne se trouvent pas dans la base de données. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PublishClassified"> + Rappel : les frais pour passer des petites annonces ne sont pas remboursables. + +Publier cette petite annonce maintenant pour [AMOUNT] L$ ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="SetClassifiedMature"> + Cette petite annonce contient-elle du contenu Mature ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="SetGroupMature"> + Ce groupe contient-il du contenu Mature ? + <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification label="Confirmer le redémarrage" name="ConfirmRestart"> + Souhaitez-vous vraiment redémarrer cette région dans 2 minutes ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification label="Envoyer un message à la région" name="MessageRegion"> + Saisissez une message qui sera envoyé à tous les résidents présents dans cette région. + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification label="Catégorie de la région modifiée" name="RegionMaturityChange"> + La catégorie d'accès de cette région a été mise à jour. +Ce changement n'apparaîtra pas immédiatement sur la carte. + </notification> + <notification label="Versions de voix non compatibles" name="VoiceVersionMismatch"> + Cette version de [APP_NAME] n'est pas compatible avec la fonctionnalité de chat vocal dans cette région. Vous devez mettre à jour [APP_NAME] pour que le chat vocal fonctionne correctement. + </notification> + <notification label="Impossible d'acheter des objets" name="BuyObjectOneOwner"> + Impossible d'acheter simultanément des objets de propriétaires différents. +Veuillez ne sélectionner qu'un seul objet. + </notification> + <notification label="Impossible d'acheter des contenus" name="BuyContentsOneOnly"> + Impossible d'acheter les contenus de plus d'un objet à la fois. +Veuillez ne sélectionner qu'un seul objet. + </notification> + <notification label="Impossible d'acheter des contenus" name="BuyContentsOneOwner"> + Impossible d'acheter simultanément des objets de propriétaires différents. +Veuillez ne sélectionner qu'un seul objet. + </notification> + <notification name="BuyOriginal"> + Acheter l'objet original pour [PRICE] L$ à [PRICE] ? +Vous deviendrez le propriétaire de cet objet. +Vous pourrez : + Modifier : [MODIFYPERM] + Copier : [COPYPERM] + Revendre ou donner : [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BuyOriginalNoOwner"> + Acheter l'objet original pour [PRICE] L$ ? +Vous deviendrez le propriétaire de cet objet. +Vous pourrez : + Modifier : [MODIFYPERM] + Copier : [COPYPERM] + Revendre ou donner : [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BuyCopy"> + Acheter une copie pour [PRICE] L$ à [OWNER] ? +L'objet sera copié dans votre inventaire. +Vous pourrez : + Modifier : [MODIFYPERM] + Copier : [COPYPERM] + Revendre ou donner : [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BuyCopyNoOwner"> + Acheter une copie pour [PRICE] L$ ? +L'objet sera copié dans votre inventaire. +Vous pourrez : + Modifier : [MODIFYPERM] + Copier : [COPYPERM] + Revendre ou donner : [RESELLPERM] + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BuyContents"> + Acheter des contenus pour [PRICE] L$ à [OWNER] ? +Ils seront copiés dans votre inventaire. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="BuyContentsNoOwner"> + Acheter des contenus pour [PRICE] L$ ? +Ils seront copiés dans votre inventaire. + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmPurchase"> + Suite à cette transaction, vous allez : +[ACTION] + +Êtes-vous certain de vouloir effectuer cette transaction ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmPurchasePassword"> + Suite à cette transaction, vous allez : +[ACTION] + +Êtes-vous certain de vouloir effectuer cette transaction ? +Veuillez saisir à nouveau votre mot de passe et cliquer sur OK. + <form name="form"> + <button name="ConfirmPurchase" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="SetPickLocation"> + Remarque : +vous avez mis à jour l'emplacement de ce favori mais les autres détails resteront inchangés. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromObject"> + Vous avez sélectionné des objets non copiables. +Ces objets seront déplacés dans votre inventaire et non pas copiés. + +Déplacer les objets de l'inventaire ? + <usetemplate ignoretext="M'avertir avant que je ne déplace des objets pour lesquels la copie est interdite" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromScriptedObject"> + Vous avez sélectionné des objets de l'inventaire qui ne peuvent pas être copiés. Ces objets seront déplacés vers votre inventaire, et non pas copiés. +L'objet les contenant est scripté, déplacer ces objets peut causer des problèmes au niveau du script. + +Déplacer les objets de l'inventaire ? + <usetemplate ignoretext="M'avertir avant que je ne déplace des objets pour lesquels la copie est interdite et qui pourraient casser des objets scriptés" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ClickActionNotPayable"> + Avertissement : l'action du clic Payer l'objet a été définie mais ne fonctionnera que si un script est ajouté avec l'event money(). + <form name="form"> + <ignore name="ignore" text="Je définis l'action du clic Payer l'objet lorsque je construis un objet sans le script money()"/> + </form> + </notification> + <notification name="OpenObjectCannotCopy"> + Vous n'êtes autorisé à copier aucun élément dans cet objet. + </notification> + <notification name="WebLaunchAccountHistory"> + Aller sur secondlife.com pour consulter l'historique de votre compte ? + <usetemplate ignoretext="Lancer mon navigateur pour consulter l'historique de mon compte" name="okcancelignore" notext="Annuler" yestext="Aller sur cette page"/> + </notification> + <notification name="ConfirmQuit"> + Êtes-vous certain de vouloir quitter ? + <usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/> + </notification> + <notification name="HelpReportAbuseEmailLL"> + Utilisez cet outil pour signaler des infractions aux Conditions d'utilisation et aux Règles de la communauté. Voir : + +http://secondlife.com/corporate/tos.php +http://secondlife.com/corporate/cs.php + +Lorsqu'elles sont signalées, toutes les infractions aux Conditions d'utilisation et aux Règles de la communauté font l'objet d'une enquête et sont résolues. Pour accéder aux détails de la résolution d'un incident, allez sur : + +http://secondlife.com/support/incidentreport.php + </notification> + <notification name="HelpReportAbuseEmailEO"> + Important : ce rapport ira au propriétaire de la région dans laquelle vous êtes et non à Linden Lab. + +Pour aider les résidents et les visiteurs, le propriétaire de la région dans laquelle vous êtes a choisi de recevoir et de s'occuper de tous les rapports envoyés à partir de cette région. Linden Lab n'enquêtera pas sur les rapports que vous envoyez à partir de cet endroit. + +Le propriétaire de la région traitera les rapports en fonction des règles de cette région, comme indiqué dans le réglement du domaine. +(Les réglements sont visibles à partir du menu Monde > À propos du terrain.) + +La résolution de ce rapport ne s'applique qu'à cette région ; L'accès aux autres endroits de [SECOND_LIFE] ne sera pas affecté par les résultats de cette enquête. Seul Linden Lab peut interdire l'accès à l'ensemble de [SECOND_LIFE]. + </notification> + <notification name="HelpReportAbuseSelectCategory"> + Veuillez choisir une catégorie pour ce rapport d'infraction. +Le choix d'une catégorie nous permet de traiter les rapports d'infraction plus rapidement. + </notification> + <notification name="HelpReportAbuseAbuserNameEmpty"> + Veuillez saisir le nom du contrevenant. +Lorsque nous avons le nom du contrevenant, nous sommes en mesure de traiter les rapports plus rapidement. + </notification> + <notification name="HelpReportAbuseAbuserLocationEmpty"> + Veuillez indiquer l'endroit où l'infraction a eu lieu. +Les informations précises et exactes nous permettent de traiter les rapports plus rapidement. + </notification> + <notification name="HelpReportAbuseSummaryEmpty"> + Veuillez saisir un récapitulatif de l'infraction. +Les récapitulatifs précis nous permettent de traiter les rapports plus rapidement. + </notification> + <notification name="HelpReportAbuseDetailsEmpty"> + Veuillez saisir une description détaillée de l'infraction. +Soyez aussi précis que possible et essayez de fournir des noms ainsi que des détails sur l'incident que vous signalez. +Les descriptions précises nous permettent de traiter les rapports plus rapidement. + </notification> + <notification name="HelpReportAbuseContainsCopyright"> + Cher résident, + +Il semble que vous souhaitiez reporter une infraction à des droits de propriété intellectuelle. Pour signaler correctement cette infraction : + +(1) Remplissez un rapport d'infraction. Vous pouvez soumettre un rapport d'infraction si vous pensez qu'un résident exploite le système de droits de [SECOND_LIFE], par exemple en utilisant un CopyBot ou des outils similaires pour enfreindre des droits de propriété intellectuelle. Notre équipe chargée des infractions mènera une enquête et prendra les mesures nécessaires à l'encontre du résident non respectueux des Conditions d'utilisation ou des règles de la communauté. Sachez toutefois que l'équipe chargée des infractions ne supprimera pas de contenu à l'intérieur de [SECOND_LIFE]. + +(2) Demandez à ce que du contenu à l'intérieur de [SECOND_LIFE] soit supprimé. Pour demander à ce que du contenu soit supprimé de [SECOND_LIFE], vous devez soumettre un rapport d'infraction valide, tel que fourni dans notre Règlement contre les violations des droit d'auteurs (DMCA), à http://secondlife.com/corporate/dmca.php. + +Si vous souhaitez toujours reporter cette infraction, veuillez fermer cette fenêtre et soumettre votre rapport. Vous devrez peut-être sélectionner la catégorie CopyBot ou exploitation abusive des droits. + +Merci, + +Linden Lab + </notification> + <notification name="FailedRequirementsCheck"> + Les composantes requises suivantes ne se trouvent pas dans [FLOATER]: +[COMPONENTS] + </notification> + <notification label="Remplacer la pièce-jointe existante" name="ReplaceAttachment"> + Vous avez déjà un objet sur cette partie du corps. +Voulez-vous le remplacer par l'objet sélectionné ? + <form name="form"> + <ignore name="ignore" save_option="true" text="Remplacer une pièce-jointe existante par l'objet sélectionné"/> + <button ignore="Remplacer automatiquement" name="Yes" text="OK"/> + <button ignore="Ne jamais remplacer" name="No" text="Annuler"/> + </form> + </notification> + <notification label="Réponse si occupé(e)" name="BusyModePay"> + Vous êtes en mode occupé et vous ne recevrez donc aucun objet en échange de ce paiement. + +Souhaitez-vous quitter le mode occupé avant de terminer cette transaction ? + <form name="form"> + <ignore name="ignore" save_option="true" text="Je suis sur le point de payer une personne ou un objet mais suis en mode Occupé"/> + <button ignore="Toujours quitter le mode occupé" name="Yes" text="OK"/> + <button ignore="Ne jamais quitter le mode occupé" name="No" text="Annuler"/> + </form> + </notification> + <notification name="ConfirmEmptyTrash"> + Êtes-vous certain de vouloir supprimer le contenu de votre corbeille de manière permanente ? + <usetemplate ignoretext="Confimer avant de vider la corbeille" name="okcancelignore" notext="Annuler" yestext="OK"/> + </notification> + <notification name="ConfirmClearBrowserCache"> + Êtes-vous certain de vouloir supprimer l'historique de vos visites et recherches ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> + </notification> + <notification name="ConfirmClearCookies"> + Êtes-vous certain de vouloir supprimer vos cookies ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> + </notification> + <notification name="ConfirmClearMediaUrlList"> + Êtes-vous certain de vouloir supprimer la liste des URL enregistrées ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Oui"/> + </notification> + <notification name="ConfirmEmptyLostAndFound"> + Êtes-vous certain de vouloir supprimer le contenu de votre dossier Objets trouvés de manière permanente ? + <usetemplate ignoretext="Confimer avant de vider le dossier Objets trouvés" name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="CopySLURL"> + La SLurl suivante a été copiée dans votre presse-papier : + [SLURL] + +Liez-la à partir d'une page web pour permettre aux autres résidents d'accéder facilement à cet endroit ou bien collez-la dans la barre d'adresse de votre navigateur. + <form name="form"> + <ignore name="ignore" text="La SLurl est copiée dans mon presse-papier"/> + </form> + </notification> + <notification name="WLSavePresetAlert"> + Voulez-vous écraser l'option précédemment enregistrée ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="WLDeletePresetAlert"> + Voulez-vous supprimer [SKY] ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="WLNoEditDefault"> + Vous ne pouvez pas éditer ou supprimer un préréglage par défaut. + </notification> + <notification name="WLMissingSky"> + Une dossier semble manquer au Cycle du jour : [SKY]. + </notification> + <notification name="PPSaveEffectAlert"> + Certains effets post-traitement existent. Voulez-vous quand même écraser ce fichier ? + <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> + </notification> + <notification name="NewSkyPreset"> + Nommez le nouveau ciel. + <form name="form"> + <input name="message"> + Nouveau préréglage + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="ExistsSkyPresetAlert"> + Ce préréglage existe déjà  ! + </notification> + <notification name="NewWaterPreset"> + Nommez ce nouveau préréglage d'eau. + <form name="form"> + <input name="message"> + Nouveau préréglage + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="ExistsWaterPresetAlert"> + Ce préréglage existe déjà  ! + </notification> + <notification name="WaterNoEditDefault"> + Vous ne pouvez pas éditer ou supprimer un préréglage par défaut. + </notification> + <notification name="ChatterBoxSessionStartError"> + Impossible de démarrer une nouvelle session de chat avec [RECIPIENT]. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ChatterBoxSessionEventError"> + [EVENT] +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ForceCloseChatterBoxSession"> + Vous devez terminer votre session de chat avec [NAME]. +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="Cannot_Purchase_an_Attachment"> + Vous ne pouvez pas acheter un objet s'il fait partie d'une pièce-jointe. + </notification> + <notification label="À propos des requêtes pour les autorisations de débit" name="DebitPermissionDetails"> + Accepter cette requête donne au script l'autorisation de prélever des dollars Linden (L$) sur votre compte de manière continue. Pour révoquer cette autorisation, le propriétaire de l'objet doit supprimer l'objet ou bien réinitialiser les scripts dans l'objet. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AutoWearNewClothing"> + Voulez-vous automatiquement porter l'habit que vous allez créer ? + <usetemplate ignoretext="Porter automatiquement tout en modifiant mon apparence" name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="NotAgeVerified"> + Pour pouvoir pénétrer dans cette zone, vous devez avoir procédé à la vérification de votre âge. Souhaitez-vous aller sur [SECOND_LIFE] et procéder à la vérification de votre âge ? + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/verification.php?lang=fr + </url> + <usetemplate ignoretext="Je n'ai pas procédé à la vérification de mon âge" name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="Cannot enter parcel: no payment info on file"> + Pour pouvoir pénétrer dans cette zone, vous devez avoir enregistré vos informations de paiement. Souhaitez-vous aller sur [SECOND_LIFE] et enregistrer vos informations de paiement ? + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/index.php?lang=fr + </url> + <usetemplate ignoretext="Mes informations de paiement ne sont pas enregistrées" name="okcancelignore" notext="Non" yestext="Oui"/> + </notification> + <notification name="MissingString"> + The string [STRING_NAME] is missing from strings.xml + </notification> + <notification name="SystemMessageTip"> + [MESSAGE] + </notification> + <notification name="Cancelled"> + Annulé + </notification> + <notification name="CancelledSit"> + Action annulée + </notification> + <notification name="CancelledAttach"> + Attachement annulé + </notification> + <notification name="ReplacedMissingWearable"> + Habits et parties du corps manquants remplacés par les éléments par défaut. + </notification> + <notification name="GroupNotice"> + Sujet : [SUBJECT], Message : [MESSAGE] + </notification> + <notification name="FriendOnline"> + [FIRST] [LAST] est connecté(e) + </notification> + <notification name="FriendOffline"> + [FIRST] [LAST] est déconnecté(e) + </notification> + <notification name="AddSelfFriend"> + Même si vous êtes extrêmement sympathique, vous ne pouvez pas devenir ami avec vous-même. + </notification> + <notification name="UploadingAuctionSnapshot"> + Importation de photos SL et Web en cours... +(prend environ 5 minutes.) + </notification> + <notification name="UploadPayment"> + Le chargement a coûté [AMOUNT] L$. + </notification> + <notification name="UploadWebSnapshotDone"> + Photo Web importée + </notification> + <notification name="UploadSnapshotDone"> + Photo SL importée + </notification> + <notification name="TerrainDownloaded"> + Fichier terrain.raw téléchargé + </notification> + <notification name="GestureMissing"> + Geste [NAME] absent de la base de données. + </notification> + <notification name="UnableToLoadGesture"> + Impossible de charger le geste [NAME]. +Merci de réessayer. + </notification> + <notification name="LandmarkMissing"> + Repère absent de la base de données. + </notification> + <notification name="UnableToLoadLandmark"> + Impossible de charger le repère. Merci de réessayer. + </notification> + <notification name="CapsKeyOn"> + La touche Verr.maj est activée. +Cela risque d'impacter votre mot de passe. + </notification> + <notification name="NotecardMissing"> + Note absente de la base de données. + </notification> + <notification name="NotecardNoPermissions"> + Vous n'avez pas le droit de consulter cette note. + </notification> + <notification name="RezItemNoPermissions"> + Permissions insuffisantes pour rezzer l'objet. + </notification> + <notification name="UnableToLoadNotecard"> + Impossible de lire les données de la note actuellement. + </notification> + <notification name="ScriptMissing"> + Script absent de la base de données. + </notification> + <notification name="ScriptNoPermissions"> + Permissions insuffisantes pour voir le script. + </notification> + <notification name="UnableToLoadScript"> + Impossible de charger le script. Merci de réessayer. + </notification> + <notification name="IncompleteInventory"> + Tous les éléments que vous souhaitez transférer ne sont pas encore disponibles sur le serveur. +Merci d'essayer à nouveau dans une minute. + </notification> + <notification name="CannotModifyProtectedCategories"> + Vous ne pouvez pas modifier de catégories protégées. + </notification> + <notification name="CannotRemoveProtectedCategories"> + Vous ne pouvez pas supprimer de catégories protégées. + </notification> + <notification name="OfferedCard"> + Vous avez offert votre carte de visite à [FIRST] [LAST] + </notification> + <notification name="UnableToBuyWhileDownloading"> + Achat impossible durant le chargement de l'objet. +Merci de réessayer. + </notification> + <notification name="UnableToLinkWhileDownloading"> + Impossible de lier durant le chargement de l'objet. +Merci de réessayer. + </notification> + <notification name="CannotBuyObjectsFromDifferentOwners"> + Vous ne pouvez pas acheter simultanément des objets de propriétaires différents. +Veuillez sélectionner un seul objet. + </notification> + <notification name="ObjectNotForSale"> + Cet objet n'est pas à vendre. + </notification> + <notification name="EnteringGodMode"> + Activation du mode divin : niveau [LEVEL] + </notification> + <notification name="LeavingGodMode"> + Désactivation du mode divin : niveau [LEVEL] + </notification> + <notification name="CopyFailed"> + Vous n'avez pas le droit de copier ceci. + </notification> + <notification name="InventoryAccepted"> + [NAME] a accepté votre envoi. + </notification> + <notification name="InventoryDeclined"> + [NAME] a refusé votre envoi. + </notification> + <notification name="ObjectMessage"> + [NAME]: [MESSAGE] + </notification> + <notification name="CallingCardAccepted"> + Votre carte de visite a été acceptée. + </notification> + <notification name="CallingCardDeclined"> + Votre carte de visite a été refusée. + </notification> + <notification name="TeleportToLandmark"> + A présent que vous êtes sur le continent, vous pouvez voyager par téléportation (vers [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l'écran puis sélectionnez le dossier Repères (Landmarks). +Choisissez un repère, double-cliquez dessus et cliquez sur Téléporter. + </notification> + <notification name="TeleportToPerson"> + A présent que vous êtes sur le continent, vous pouvez contacter des résidents (tel [NAME] par exemple). Cliquez sur le bouton Inventaire en bas à droite de l'écran puis sélectionnez le dossier Cartes de visite (Calling Cards). +Choisissez en une, double-cliquez dessus et cliquez sur Message Instantané. + </notification> + <notification name="CantSelectLandFromMultipleRegions"> + Vous ne pouvez pas sélectionner de terrain en dehors des limites du serveur. +Veuillez sélectionner un terrain plus petit. + </notification> + <notification name="SearchWordBanned"> + Certains termes de votre recherche ont été exclus car ils ne correspondaient pas aux standards fixés dans les Règles communautaires. + </notification> + <notification name="NoContentToSearch"> + Veuillez sélectionner au moins un type de contenu à rechercher (PG, Mature ou Adulte) + </notification> + <notification name="GroupVote"> + [NAME] a proposé un vote pour : +[MESSAGE] + <form name="form"> + <button name="VoteNow" text="Voter"/> + <button name="Later" text="Plus tard"/> + </form> + </notification> + <notification name="SystemMessage"> + [MESSAGE] + </notification> + <notification name="EventNotification"> + Avis d'événement : + +[NAME] +[DATE] + <form name="form"> + <button name="Teleport" text="Téléporter"/> + <button name="Description" text="Description"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="TransferObjectsHighlighted"> + Tous les objets de cette parcelle qui seront transférés à l'acheteur sont maintenant mis en surbrillance. + +* Les arbres et la pelouse qui seront transférés ne sont pas mis en surbrillance. + <form name="form"> + <button name="Done" text="Transfert effectué"/> + </form> + </notification> + <notification name="DeactivatedGesturesTrigger"> + Gestes désactivés ayant le même mot-clé : +[NAMES] + </notification> + <notification name="NoQuickTime"> + Le logiciel Apple QuickTime ne semble pas installé sur votre système. +Pour voir les vidéos sur les terrains qui le permettent, allez sur le site de QuickTime (http://www.apple.com/fr/quicktime/download) et installez le lecteur QuickTime. + </notification> + <notification name="NoPlugin"> + Aucun Media Plugin n'a été trouvé pour prendre en charge "[MIME_TYPE]". Les médias de ce type ne sont pas disponibles. + </notification> + <notification name="MediaPluginFailed"> + Le Media Plugin suivant a échoué : + [PLUGIN] + +Si le problème persiste, veuillez réinstaller le plugin ou contacter le vendeur. + <form name="form"> + <ignore name="ignore" text="L'éxécution d'un Media Plugin a échoué"/> + </form> + </notification> + <notification name="OwnedObjectsReturned"> + Les objets que vous possédez sur la parcelle de terrain sélectionnée ont été renvoyés dans votre inventaire. + </notification> + <notification name="OtherObjectsReturned"> + Les objets que vous possédez sur la parcelle de terrain appartenant à [FIRST] [LAST] ont été renvoyés dans votre inventaire. + </notification> + <notification name="OtherObjectsReturned2"> + Les objets sur la parcelle appartenant à « [NAME] » ont étés renvoyés à leur propriétaire. + </notification> + <notification name="GroupObjectsReturned"> + Les objets sélectionnés sur la parcelle de terrain partagée avec le groupe [GROUPNAME] ont été renvoyés dans l'inventaire de leur propriétaire. +Les objets donnés transférables ont étés renvoyés à leur propriétaire. +Les objets non transférables donnés au groupe ont étés supprimés. + </notification> + <notification name="UnOwnedObjectsReturned"> + Les objets sélectionnés sur la parcelle et qui ne sont pas à vous ont été rendus à leurs propriétaires. + </notification> + <notification name="NotSafe"> + Les dégâts sont autorisés sur ce terrain. +Vous pouvez être blessé ici. Si vous décédez, vous serez téléporté à votre domicile. + </notification> + <notification name="NoFly"> + Le vol est interdit dans cette zone. +Vous ne pouvez pas voler ici. + </notification> + <notification name="PushRestricted"> + Les bousculades sont interdites dans cette zone. +Vous ne pouvez pas pousser les autres à moins que vous soyez propriétaire de ce terrain. + </notification> + <notification name="NoVoice"> + Le chat vocal est interdit dans cette zone. Vous n'entendrez personne parler. + </notification> + <notification name="NoBuild"> + La construction est interdite dans cette zone. Vous ne pouvez pas construite ou rezzer d'objets ici. + </notification> + <notification name="ScriptsStopped"> + Un administrateur a temporairement stoppé les scripts dans cette région. + </notification> + <notification name="ScriptsNotRunning"> + Aucun script ne fonctionne dans cette région. + </notification> + <notification name="NoOutsideScripts"> + Les scripts externes sont désactivés sur ce terrain. + +Aucun script ne marche ici à part ceux du propriétaire du terrain. + </notification> + <notification name="ClaimPublicLand"> + Vous ne pouvez réclamer qu'un terrain public dans la région où vous vous trouvez actuellement. + </notification> + <notification name="RegionTPAccessBlocked"> + Votre catégorie d'accès ne vous autorise pas à pénétrer dans cette région. Vous devez sans doute procéder à la vérification de votre âge ou installer une version plus récente du client. + +Pour savoir comment accéder aux zones ayant un tel niveau d'accès, veuillez consulter les pages d'aide. + </notification> + <notification name="URBannedFromRegion"> + Vous avez été banni de cette région. + </notification> + <notification name="NoTeenGridAccess"> + Votre compte ne peut pas se connecter à cette région du Teen grid. + </notification> + <notification name="ImproperPaymentStatus"> + Vous n'avez pas le statut de paiement approprié pour pénétrer dans cette région. + </notification> + <notification name="MustGetAgeParcel"> + Pour pouvoir pénétrer sur cette parcelle, vous devez avoir procédé à la vérification de votre âge. + </notification> + <notification name="NoDestRegion"> + Région de destination introuvable. + </notification> + <notification name="NotAllowedInDest"> + Vous n'êtes pas autorisé dans cette région. + </notification> + <notification name="RegionParcelBan"> + Impossible de traverser une parcelle bannie. Veuillez trouver une autre solution. + </notification> + <notification name="TelehubRedirect"> + Vous avez été redirigé vers un téléhub. + </notification> + <notification name="CouldntTPCloser"> + Il n'a pas été possible de vous téléporter vers une destination plus proche. + </notification> + <notification name="TPCancelled"> + Téléportation annulée. + </notification> + <notification name="FullRegionTryAgain"> + La région dans laquelle vous essayez de pénétrer est pleine actuellement. +Veuillez réessayer dans quelques minutes. + </notification> + <notification name="GeneralFailure"> + Panne générale. + </notification> + <notification name="RoutedWrongRegion"> + Dirigé vers la mauvaise région. Merci de réessayer. + </notification> + <notification name="NoValidAgentID"> + ID agent non valide. + </notification> + <notification name="NoValidSession"> + ID de session non valide. + </notification> + <notification name="NoValidCircuit"> + Aucun code de circuit valide. + </notification> + <notification name="NoValidTimestamp"> + Timestamp non valide. + </notification> + <notification name="NoPendingConnection"> + Impossible de créer la connexion en attente. + </notification> + <notification name="InternalUsherError"> + Erreur interne lors de la tentative de connexion. + </notification> + <notification name="NoGoodTPDestination"> + Impossible de trouver un lieu de téléportation valide dans cette région. + </notification> + <notification name="InternalErrorRegionResolver"> + Une erreur interne est survenue lors de la résolution des coodonnées de la région. + </notification> + <notification name="NoValidLanding"> + Impossible de trouver un point d'atterrissage valide. + </notification> + <notification name="NoValidParcel"> + Aucune parcelle valide n'a été trouvée. + </notification> + <notification name="ObjectGiveItem"> + Un objet appelé [OBJECTFROMNAME] appartenant à [FIRST] [LAST] vous a donné : [OBJECTTYPE] appelé(e) [OBJECTNAME]. + <form name="form"> + <button name="Keep" text="Garder"/> + <button name="Discard" text="Jeter"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="ObjectGiveItemUnknownUser"> + L'objet [OBJECTFROMNAME] appartenant à un utilisateur inconnu vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME]. + <form name="form"> + <button name="Keep" text="Garder"/> + <button name="Discard" text="Jeter"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="UserGiveItem"> + [NAME] vous a donné un(e) [OBJECTTYPE] nommé(e) [OBJECTNAME]. + <form name="form"> + <button name="Keep" text="Garder"/> + <button name="Discard" text="Jeter"/> + </form> + </notification> + <notification name="GodMessage"> + [NAME] +[MESSAGE] + </notification> + <notification name="JoinGroup"> + [MESSAGE] + <form name="form"> + <button name="Join" text="Rejoindre"/> + <button name="Decline" text="Refuser"/> + <button name="Info" text="Infos"/> + </form> + </notification> + <notification name="TeleportOffered"> + [NAME] vous propose de le/la rejoindre par téléportation : + +[MESSAGE] + <form name="form"> + <button name="Teleport" text="Téléporter"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="GotoURL"> + [MESSAGE] +[URL] + <form name="form"> + <button name="Later" text="Plus tard"/> + <button name="GoNow..." text="Y aller maintenant..."/> + </form> + </notification> + <notification name="OfferFriendship"> + [NAME] vous demande de devenir son ami(e). + +[MESSAGE] + +(Par défaut, vous pourrez voir lorsque vous êtes tous deux connectés.) + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + </form> + </notification> + <notification name="OfferFriendshipNoMessage"> + [NAME] vous demande de devenir son ami. + +(Par défaut, vous pourrez voir quand vous êtes tous deux connectés) + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + </form> + </notification> + <notification name="FriendshipAccepted"> + [NAME] a accepté votre amitié. + </notification> + <notification name="FriendshipDeclined"> + [NAME] a refusé votre amitié. + </notification> + <notification name="OfferCallingCard"> + [FIRST] [LAST] vous offre sa carte de visite. +Cela ajoute un marque-page dans votre inventaire, ce qui vous permet d'envoyer rapidement un IM à ce résident. + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + </form> + </notification> + <notification name="RegionRestartMinutes"> + La région va redémarrer dans [MINUTES] minutes. +Si vous restez dans cette région, vous serez déconnecté(e). + </notification> + <notification name="RegionRestartSeconds"> + La région va redémarrer dans [SECONDS] secondes. +Si vous restez dans cette région, vous serez déconnecté(e). + </notification> + <notification name="LoadWebPage"> + Charger cette page web [URL] ? + +[MESSAGE] + +Venant de l'objet : [OBJECTNAME], appartenant à : [NAME]? + <form name="form"> + <button name="Gotopage" text="Charger"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification name="FailedToFindWearableUnnamed"> + La recherche du [TYPE] dans la base de données a échoué. + </notification> + <notification name="FailedToFindWearable"> + La recherche du [TYPE] nommé(e) [DESC] dans la base de données a échoué. + </notification> + <notification name="InvalidWearable"> + L'objet que vous essayez de porter utilise une fonctionnalité que le client ne peut lire. Pour porter cet objet, veuillez télécharger une mise à jour du client. + </notification> + <notification name="ScriptQuestion"> + '[OBJECTNAME]', un objet appartenant à '[NAME]', aimerait : + +[QUESTIONS] +Acceptez-vous ? + <form name="form"> + <button name="Yes" text="Oui"/> + <button name="No" text="Non"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="ScriptQuestionCaution"> + Un objet appelé « [OBJECTNAME] », appartenant à « [NAME] », aimerait : + +[QUESTIONS] +Si vous n'avez pas confiance en cet objet ni en son créateur, vous devriez refuser cette requête. + +Accepter cette requête ? + <form name="form"> + <button name="Grant" text="Accepter"/> + <button name="Deny" text="Refuser"/> + <button name="Details" text="Détails..."/> + </form> + </notification> + <notification name="ScriptDialog"> + '[TITLE]' de [FIRST] [LAST] +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Ignorer"/> + </form> + </notification> + <notification name="ScriptDialogGroup"> + '[TITLE]' de [GROUPNAME] +[MESSAGE] + <form name="form"> + <button name="Ignore" text="Ignorer"/> + </form> + </notification> + <notification name="FirstBalanceIncrease"> + Vous venez de recevoir [AMOUNT] L$. +Votre solde en L$ est affiché en haut à droite. + </notification> + <notification name="FirstBalanceDecrease"> + Vous venez de payer [AMOUNT] L$. +Votre solde en L$ est affiché en haut à droite. + </notification> + <notification name="FirstSit"> + Vous êtes assis(e). +Utilisez les touches de direction (ou AWSD) pour regarder autour de vous. +Pour vous lever, cliquez sur le bouton Me lever. + </notification> + <notification name="FirstMap"> + Cliquez et faîtes glisser pour faire défiler la carte. +Double-cliquez pour vous téléporter. +Utilisez les contrôles à droite pour trouver des choses et afficher différents arrière-plans. + </notification> + <notification name="FirstBuild"> + Vous avez ouvert les outils de construction. Tous les objets autour de vous ont été créés avec ces outils. + </notification> + <notification name="FirstTeleport"> + Vous ne pouvez vous téléporter que dans certaines zones de cette région. La flèche pointe vers votre destination. Cliquez sur la flèche pour la faire disparaître. + </notification> + <notification name="FirstOverrideKeys"> + Vos mouvements sont maintenant pris en charge par un objet. +Essayez les flèches de votre clavier ou AWSD pour voir à quoi elles servent. +Certains objets (comme les armes) nécessitent l'activation du mode Vue subjective pour être utilisés. +Pour cela, appuyez sur la touche M. + </notification> + <notification name="FirstAppearance"> + Vous êtes en train d'éditer votre apparence. +Utilisez les touches de direction pour regarder autour de vous. +Une fois terminé, cliquer sur Tout enregistrer. + </notification> + <notification name="FirstInventory"> + Il s'agit de votre inventaire qui contient vos possessions. + +* Pour porter quelque chose, faites glisser l'objet sur vous-même. +* Pour rezzer un objet dans le monde, faites-le glisser sur le sol. +* Pour lire une note, double-cliquez dessus. + </notification> + <notification name="FirstSandbox"> + Cette région est un bac à sable et est utilisée par les résidents pour apprendre à construire. + +Les objets que vous construisez ici seront supprimés après votre départ. N'oubliez donc pas de cliquer droit et de choisir Prendre pour sauvegarder votre création dans votre inventaire. + </notification> + <notification name="FirstFlexible"> + Cet objet est flexible. Les objets flexibles ne peuvent pas avoir de propriétés physiques et doivent rester fantômes. + </notification> + <notification name="FirstDebugMenus"> + Vous avez ouvert le menu Avancé. + +Pour activer/désactiver ce menu, + Windows : Ctrl-Alt-D + Mac : ⌘-Opt-D + </notification> + <notification name="FirstSculptedPrim"> + Vous êtes en train d'éditer un sculptie. Pour spécifier la forme d'un sculptie, vous devez utiliser une texture spécifique. + </notification> + <notification name="MaxListSelectMessage"> + Vous ne pouvez sélectionner que [MAX_SELECT] objets maximum dans cette liste. + </notification> + <notification name="VoiceInviteP2P"> + [NAME] vous invite à un chat vocal. +Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer. + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="AutoUnmuteByIM"> + [FIRST] [LAST] a reçu un message instantané et n'est donc plus ignoré. + </notification> + <notification name="AutoUnmuteByMoney"> + [FIRST] [LAST] a reçu de l'argent et n'est donc plus ignoré. + </notification> + <notification name="AutoUnmuteByInventory"> + [FIRST] [LAST] a reçu un inventaire et n'est donc plus ignoré. + </notification> + <notification name="VoiceInviteGroup"> + [NAME] a rejoint un chat vocal avec le groupe [GROUP]. +Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cette personne, cliquez sur Ignorer. + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="VoiceInviteAdHoc"> + [NAME] a rejoint un chat vocal avec conférence. +Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer. + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="InviteAdHoc"> + [NAME] vous invite à un chat conférence. +Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignorer cet utilisateur, cliquez sur Ignorer. + <form name="form"> + <button name="Accept" text="Accepter"/> + <button name="Decline" text="Refuser"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> + <notification name="VoiceChannelFull"> + L'appel auquel vous essayez de participer, [VOICE_CHANNEL_NAME], a atteint le nombre maximum de participants. Veuillez réessayer ultérieurement. + </notification> + <notification name="ProximalVoiceChannelFull"> + Nous sommes désolés. Le nombre maximum de conversations vocales a été atteint dans cette zone. Veuillez trouver un autre endroit pour discuter. + </notification> + <notification name="VoiceChannelDisconnected"> + Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. Vous allez maintenant être reconnecté au chat vocal spatial. + </notification> + <notification name="VoiceChannelDisconnectedP2P"> + [VOICE_CHANNEL_NAME] a mis fin à l'appel. Vous allez maintenant être reconnecté au chat vocal spatial. + </notification> + <notification name="P2PCallDeclined"> + [VOICE_CHANNEL_NAME] a refusé votre appel. Vous allez maintenant être reconnecté au chat vocal spatial. + </notification> + <notification name="P2PCallNoAnswer"> + [VOICE_CHANNEL_NAME] ne peut pas prendre votre appel. Vous allez maintenant être reconnecté au chat vocal spatial. + </notification> + <notification name="VoiceChannelJoinFailed"> + Echec de la connexion avec [VOICE_CHANNEL_NAME], veuillez réessayer ultérieurement. Vous allez maintenant être reconnecté au chat vocal spatial. + </notification> + <notification name="VoiceLoginRetry"> + Nous sommes en train de créer un canal vocal pour vous. Veuillez patienter quelques instants. + </notification> + <notification name="Cannot enter parcel: not a group member"> + Seuls les membres d'un certain groupe peuvent visiter cette zone. + </notification> + <notification name="Cannot enter parcel: banned"> + Vous ne pouvez pas pénétrer sur ce terrain car l'accès vous y est interdit. + </notification> + <notification name="Cannot enter parcel: not on access list"> + Vous ne pouvez pas pénétrer sur ce terrain car vous n'avez pas les droits d'accès requis. + </notification> + <notification name="VoiceNotAllowed"> + Vous n'êtes pas autorisé à vous connecter au chat vocal pour [VOICE_CHANNEL_NAME]. + </notification> + <notification name="VoiceCallGenericError"> + Une erreur est survenue pendant la connexion au chat vocal pour [VOICE_CHANNEL_NAME]. Veuillez réessayer ultérieurement. + </notification> + <notification name="ServerVersionChanged"> + La région dans laquelle vous avez pénétré utilise une version de serveur différente, ce qui peut avoir un impact sur votre performance. Cliquez pour voir les notes de version. + </notification> + <notification name="UnsupportedCommandSLURL"> + La SLurl que vous avez saisie n'est pas prise en charge. + </notification> + <notification name="IMToast"> + <form name="form"> + <button name="respondbutton" text="Répondre"/> + </form> + </notification> + <notification name="AttachmentSaved"> + L'élément joint a été sauvegardé. + </notification> + <notification name="UnableToFindHelpTopic"> + Impossible de trouver l'aide. + </notification> + <global name="UnsupportedCPU"> + - Votre processeur ne remplit pas les conditions minimum requises. + </global> + <global name="UnsupportedGLRequirements"> + Vous semblez ne pas avoir le matériel requis pour utiliser [APP_NAME]. [APP_NAME] requiert une carte graphique OpenGL avec une prise en charge du multitexturing. Si vous avez une telle carte, assurez-vous que vous avez aussi les pilotes les plus récents pour la carte, ainsi que les service packs et les patchs pour votre système d'exploitation. + +Si vous avez toujours des problèmes, veuillez consulter la page [SUPPORT_SITE]. + </global> + <global name="UnsupportedCPUAmount"> + 796 + </global> + <global name="UnsupportedRAMAmount"> + 510 + </global> + <global name="UnsupportedGPU"> + - Votre carte graphique ne remplit pas les conditions minimum requises. + </global> + <global name="UnsupportedRAM"> + - Votre mémoire système ne remplit pas les conditions minimum requises. + </global> + <global name="PermYes"> + Oui + </global> + <global name="PermNo"> + Non + </global> + <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> + Si vous possédez un terrain, vous pouvez le définir comme domicile. +Sinon, consultez la carte et trouvez les « infohubs ». + </global> +</notifications> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml index 3a1585bce29..afadd109b1d 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml @@ -1,45 +1,38 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="edit_profile_panel"> - <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] - </string> - <string name="AcctTypeResident" - value="Résident" /> - <string name="AcctTypeTrial" - value="Essai" /> - <string name="AcctTypeCharterMember" - value="Membre originaire" /> - <string name="AcctTypeEmployee" - value="Employé(e) de Linden Lab" /> - <string name="PaymentInfoUsed" - value="Infos de paiement utilisées" /> - <string name="PaymentInfoOnFile" - value="Infos de paiement enregistrées" /> - <string name="NoPaymentInfoOnFile" - value="Aucune info de paiement" /> - <string name="AgeVerified" - value="Âge vérifié" /> - <string name="NotAgeVerified" - value="Âge non vérifié" /> - <string name="partner_edit_link_url"> - http://www.secondlife.com/account/partners.php?lang=fr - </string> - <panel name="scroll_content_panel"> - <panel name="data_panel" > - <panel name="lifes_images_panel"> - <panel name="second_life_image_panel"> - <text name="second_life_photo_title_text"> - [SECOND_LIFE]: - </text> - </panel> - </panel> - <text name="title_partner_text" value="Partenaire :"/> - <panel name="partner_data_panel"> - <text name="partner_text" value="[FIRST] [LAST]"/> - </panel> - <text name="text_box3"> - Réponse si occupé(e) : - </text> - </panel> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profile Edit" name="edit_profile_panel"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="AcctTypeResident" value="Résident"/> + <string name="AcctTypeTrial" value="Essai"/> + <string name="AcctTypeCharterMember" value="Membre originaire"/> + <string name="AcctTypeEmployee" value="Employé(e) de Linden Lab"/> + <string name="PaymentInfoUsed" value="Infos de paiement utilisées"/> + <string name="PaymentInfoOnFile" value="Infos de paiement enregistrées"/> + <string name="NoPaymentInfoOnFile" value="Aucune info de paiement"/> + <string name="AgeVerified" value="Âge vérifié"/> + <string name="NotAgeVerified" value="Âge non vérifié"/> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=fr + </string> + <string name="no_partner_text" value="Aucun"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="data_panel"> + <panel name="lifes_images_panel"> + <icon label="" name="2nd_life_edit_icon" tool_tip="Cliquez pour sélectionner une image"/> + </panel> + <icon label="" name="real_world_edit_icon" tool_tip="Cliquez pour sélectionner une image"/> + <text name="title_homepage_text"> + Page d'accueil : + </text> + <check_box label="Afficher dans les résultats de recherche" name="show_in_search_checkbox"/> + <text name="title_acc_status_text" value="Statut du compte :"/> + </panel> + </panel> + </scroll_container> + <panel name="profile_me_buttons_panel"> + <button label="Enregistrer les changements" name="save_btn"/> + <button label="Annuler" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_invite.xml b/indra/newview/skins/default/xui/fr/panel_group_invite.xml index 4cb0b886726..ae01f05bfbf 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_invite.xml @@ -1,26 +1,29 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Inviter un résident" name="invite_panel"> - <text name="help_text"> - Vous pouvez inviter plusieurs résidents -à la fois. Cliquez d'abord sur -Choisir un résident. - </text> - <button label="Choisir un résident" name="add_button" tool_tip=""/> - <name_list name="invitee_list" tool_tip="Pour sélectionner plusieurs noms, maintenez la touche Ctrl enfoncée en cliquant sur le nom des résidents."/> - <button label="Supprimer de la liste" name="remove_button" tool_tip="Supprime les résidents sélectionnés de la liste des invités."/> - <text> - Assignez-leur un rôle : - </text> - <text name="role_text"> - Assignez-leur un rôle : - </text> - <combo_box name="role_name" tool_tip="Choisissez des rôles à assigner aux membres dans la liste."/> - <button label="Envoyer les invitations" name="ok_button"/> - <button label="Annuler" name="cancel_button"/> - <string name="confirm_invite_owner_str"> - Etes-vous certain de vouloir inviter un/de nouveau(x) propriétaire(s) ? Ce choix est permanent ! - </string> - <string name="loading"> - (en cours de chargement...) - </string> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Inviter un résident" name="invite_panel"> + <panel.string name="confirm_invite_owner_str"> + Etes-vous certain de vouloir inviter un/de nouveau(x) propriétaire(s) ? Ce choix est permanent ! + </panel.string> + <panel.string name="loading"> + (en cours de chargement...) + </panel.string> + <panel.string name="already_in_group"> + Certains des avatars font déjà partie du groupe et n'ont pas été invités. + </panel.string> + <text name="help_text"> + Vous pouvez inviter plusieurs résidents +à la fois. Cliquez d'abord sur +Choisir un résident. + </text> + <button label="Choisir un résident" name="add_button" tool_tip=""/> + <name_list name="invitee_list" tool_tip="Pour sélectionner plusieurs noms, maintenez la touche Ctrl enfoncée en cliquant sur le nom des résidents."/> + <button label="Supprimer de la liste" name="remove_button" tool_tip="Supprime les résidents sélectionnés de la liste des invités."/> + <text name="role_text"> + Assignez-leur un rôle : + </text> + <combo_box name="role_name" tool_tip="Choisissez des rôles à assigner aux membres dans la liste."/> + <button label="Envoyer les invitations" name="ok_button"/> + <button label="Annuler" name="cancel_button"/> + <string name="GroupInvitation"> + Invitations au groupe + </string> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml index 29259e2e42a..9a24b7a6871 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml @@ -1,86 +1,86 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Terrain et L$" name="land_money_tab"> - <string name="help_text"> - Les parcelles appartenant au groupe sont indiquées avec le détails des contributions. Un avertissement apparaît si la surface utilisée par le groupe est supérieure ou égale au total des contributions. Les onglets Planification, Détails et Ventes correspondent aux finances du groupe. - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> - Vous n'avez pas la permission de voir quel terrain possède ce groupe. - </string> - <string name="cant_view_group_accounting_text"> - Vous n'avez pas la permission d'accéder aux informations -financières de ce groupe. - </string> - <string name="loading_txt"> - Chargement... - </string> - <text name="group_land_heading"> - Terrain du groupe - </text> - <scroll_list name="group_parcel_list"> - <column label="Parcelle" name="name"/> - <column label="Région" name="location"/> - <column label="Type" name="type"/> - <column label="Surface" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="Voir sur la carte" label_selected="Voir sur la carte" name="map_button"/> - <text name="total_contributed_land_label"> - Total des contributions : - </text> - <text name="total_contributed_land_value"> - [AREA] m² - </text> - <text name="total_land_in_use_label"> - Superficie déjà utilisée : - </text> - <text name="total_land_in_use_value"> - [AREA] m² - </text> - <text name="land_available_label"> - Superficie disponible : - </text> - <text name="land_available_value"> - [AREA] m² - </text> - <text name="your_contribution_label"> - Votre contribution : - </text> - <string name="land_contrib_error"> - Impossible de définir votre don de terre. - </string> - <text name="your_contribution_units"> - ( m² ) - </text> - <text name="your_contribution_max_value"> - ([AMOUNT] max.) - </text> - <text name="group_over_limit_text"> - Une contribution supplémentaire du groupe est requise pour prendre en -charge le terrain utilisé. - </text> - <text name="group_money_heading"> - Finances - </text> - <tab_container name="group_money_tab_container"> - <panel label="Planification" name="group_money_planning_tab"> - <text_editor name="group_money_planning_text"> - Calcul en cours... - </text_editor> - </panel> - <panel label="Détails" name="group_money_details_tab"> - <text_editor name="group_money_details_text"> - Calcul en cours... - </text_editor> - <button label="< Plus tôt" label_selected="< Plus tôt" name="earlier_details_button" tool_tip="Reculer dans le temps"/> - <button label="Plus tard >" label_selected="Plus tard >" name="later_details_button" tool_tip="Avancer dans le temps"/> - </panel> - <panel label="Ventes" name="group_money_sales_tab"> - <text_editor name="group_money_sales_text"> - Calcul en cours... - </text_editor> - <button label="< Plus tôt" label_selected="< Plus tôt" name="earlier_sales_button" tool_tip="Reculer dans le temps"/> - <button label="Plus tard >" label_selected="Plus tard >" name="later_sales_button" tool_tip="Avancer dans le temps"/> - </panel> - </tab_container> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Terrain et L$" name="land_money_tab"> + <string name="help_text"> + Les parcelles appartenant au groupe sont indiquées avec le détails des contributions. Un avertissement apparaît si la surface utilisée par le groupe est supérieure ou égale au total des contributions. Les onglets Planification, Détails et Ventes correspondent aux finances du groupe. + </string> + <button label="?" name="help_button"/> + <string name="cant_view_group_land_text"> + Vous n'avez pas la permission de voir quel terrain possède ce groupe. + </string> + <string name="cant_view_group_accounting_text"> + Vous n'avez pas la permission d'accéder aux informations +financières de ce groupe. + </string> + <string name="loading_txt"> + Chargement... + </string> + <text name="group_land_heading"> + Terrain du groupe + </text> + <scroll_list name="group_parcel_list"> + <column label="Parcelle" name="name"/> + <column label="Région" name="location"/> + <column label="Type" name="type"/> + <column label="Surface" name="area"/> + <column label="" name="hidden"/> + </scroll_list> + <button label="Carte" label_selected="Carte" name="map_button"/> + <text name="total_contributed_land_label"> + Total des contributions : + </text> + <text name="total_contributed_land_value"> + [AREA] m² + </text> + <text name="total_land_in_use_label"> + Superficie déjà utilisée : + </text> + <text name="total_land_in_use_value"> + [AREA] m² + </text> + <text name="land_available_label"> + Superficie disponible : + </text> + <text name="land_available_value"> + [AREA] m² + </text> + <text name="your_contribution_label"> + Votre contribution : + </text> + <string name="land_contrib_error"> + Impossible de définir votre don de terre. + </string> + <text name="your_contribution_units"> + ( m² ) + </text> + <text name="your_contribution_max_value"> + ([AMOUNT] max.) + </text> + <text name="group_over_limit_text"> + Une contribution supplémentaire du groupe est requise pour prendre en +charge le terrain utilisé. + </text> + <text name="group_money_heading"> + Finances + </text> + <tab_container name="group_money_tab_container"> + <panel label="Planification" name="group_money_planning_tab"> + <text_editor name="group_money_planning_text"> + Calcul en cours... + </text_editor> + </panel> + <panel label="Détails" name="group_money_details_tab"> + <text_editor name="group_money_details_text"> + Calcul en cours... + </text_editor> + <button label="< Plus tôt" label_selected="< Plus tôt" name="earlier_details_button" tool_tip="Reculer dans le temps"/> + <button label="Plus tard >" label_selected="Plus tard >" name="later_details_button" tool_tip="Avancer dans le temps"/> + </panel> + <panel label="Ventes" name="group_money_sales_tab"> + <text_editor name="group_money_sales_text"> + Calcul en cours... + </text_editor> + <button label="< Plus tôt" label_selected="< Plus tôt" name="earlier_sales_button" tool_tip="Reculer dans le temps"/> + <button label="Plus tard >" label_selected="Plus tard >" name="later_sales_button" tool_tip="Avancer dans le temps"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_list_item.xml b/indra/newview/skins/default/xui/fr/panel_group_list_item.xml new file mode 100644 index 00000000000..15d48c4eb4c --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_group_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="group_list_item"> + <text name="group_name" value="Inconnu"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_notices.xml b/indra/newview/skins/default/xui/fr/panel_group_notices.xml index 841ac5e7ee5..b719f1f07ff 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_notices.xml @@ -1,67 +1,67 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Notices" name="notices_tab"> - <text name="help_text"> - Les notices vous permettent d'envoyer des messages et pièces-jointes aux membres du groupe autorisés à les recevoir. Vous pouvez désactiver la réception des notices à l'onglet Général. - </text> - <text name="no_notices_text"> - Aucune notice - </text> - <button label="?" label_selected="?" name="help_button"/> - <text name="lbl"> - Anciennes notices du groupe - </text> - <text name="lbl2"> - Les notices sont conservées pendant 14 jours et chaque groupe a une limite quotidienne de 200 notices. - </text> - <scroll_list name="notice_list"> - <column label="" name="icon"/> - <column label="Sujet" name="subject"/> - <column label="De" name="from"/> - <column label="Date" name="date"/> - </scroll_list> - <text name="notice_list_none_found"> - Aucun résultat. - </text> - <button label="Créer une notice" label_selected="Créer une notice" name="create_new_notice"/> - <button label="Rafraîchir" label_selected="Rafraîchir la liste" name="refresh_notices"/> - <panel label="Créer une notice" name="panel_create_new_notice"> - <text name="lbl"> - Créer une notice - </text> - <text name="lbl2"> - Pour joindre une pièce-jointe à cette notice, faites-la glisser depuis votre inventaire vers cette fenêtre. Les pièces-jointes doivent être copiables et transférables. Il n'est pas possible d'envoyer de dossiers. - </text> - <text bottom_delta="-79" name="lbl3" left="20"> - Sujet : - </text> - <line_editor name="create_subject" width="331" left_delta="61"/> - <text name="lbl4" left="20"> - Message : - </text> - <text_editor name="create_message" bottom_delta="-90" height="104" left_delta="61" width="330"/> - <text name="lbl5" width="68"> - Pièce-jointe : - </text> - <line_editor name="create_inventory_name" width="190" left_delta="74"/> - <button label="Supprimer pièce-jointe" label_selected="Supprimer pièce-jointe" left="274" name="remove_attachment" width="140"/> - <button label="Envoyer" label_selected="Envoyer" left="274" name="send_notice" width="140"/> - <panel name="drop_target2" tool_tip="Pour joindre un objet de l'inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l'objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/> - <panel name="drop_target" tool_tip="Pour joindre un objet de l'inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l'objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/> - </panel> - <panel label="Voir ancienne notice" name="panel_view_past_notice"> - <text name="lbl"> - Détails - </text> - <text name="lbl2"> - Pour envoyer une nouvelle notice, cliquez sur Créer une notice ci-dessus. - </text> - <text name="lbl3"> - Sujet : - </text> - <text name="lbl4"> - Message : - </text> - <button label="Ouvrir pièce-jointe" label_selected="Ouvrir pièce-jointe" name="open_attachment" width="118"/> - <line_editor left="128" name="view_inventory_name" width="256"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Notices" name="notices_tab"> + <text name="help_text"> + Les notices vous permettent d'envoyer des messages et pièces-jointes aux membres du groupe autorisés à les recevoir. Vous pouvez désactiver la réception des notices à l'onglet Général. + </text> + <text name="no_notices_text"> + Aucune notice + </text> + <button label="?" label_selected="?" name="help_button"/> + <text name="lbl"> + Anciennes notices du groupe + </text> + <text name="lbl2"> + Les notes sont conservées pendant 14 jours. La limite est de 200 notes quotidiennes par groupe. + </text> + <scroll_list name="notice_list"> + <column label="" name="icon"/> + <column label="Sujet" name="subject"/> + <column label="De" name="from"/> + <column label="Date" name="date"/> + </scroll_list> + <text name="notice_list_none_found"> + Aucun résultat. + </text> + <button label="Nouvelle note" label_selected="Créer une notice" name="create_new_notice"/> + <button label="Rafraîchir" label_selected="Rafraîchir la liste" name="refresh_notices"/> + <panel label="Créer une notice" name="panel_create_new_notice"> + <text name="lbl"> + Créer une notice + </text> + <text name="lbl2"> + Vous pouvez ajouter un objet simple à la note en le faisant glisser de votre inventaire vers cette section. Les objets joints doivent pouvoir être copiés et transférés. Vous ne pouvez pas envoyer de dossier. + </text> + <text bottom_delta="-79" left="20" name="lbl3"> + Sujet : + </text> + <line_editor left_delta="61" name="create_subject" width="331"/> + <text left="20" name="lbl4"> + Message : + </text> + <text_editor bottom_delta="-90" height="104" left_delta="61" name="create_message" width="330"/> + <text name="lbl5" width="68"> + Pièce-jointe : + </text> + <line_editor left_delta="74" name="create_inventory_name" width="190"/> + <button label="Supprimer pièce-jointe" label_selected="Supprimer pièce-jointe" left="274" name="remove_attachment" width="140"/> + <button label="Envoyer" label_selected="Envoyer" left="274" name="send_notice" width="140"/> + <panel name="drop_target2" tool_tip="Pour joindre un objet de l'inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l'objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/> + <panel name="drop_target" tool_tip="Pour joindre un objet de l'inventaire à la notice, faites-le glisser dans la boîte de message. Pour envoyer l'objet avec la notice, vous devez avoir la permission de le copier et de le transférer."/> + </panel> + <panel label="Voir ancienne notice" name="panel_view_past_notice"> + <text name="lbl"> + Détails + </text> + <text name="lbl2"> + Pour envoyer une nouvelle notice, cliquez sur Créer une notice ci-dessus. + </text> + <text name="lbl3"> + Sujet : + </text> + <text name="lbl4"> + Message : + </text> + <button label="Ouvrir pièce-jointe" label_selected="Ouvrir pièce-jointe" name="open_attachment" width="118"/> + <line_editor left="128" name="view_inventory_name" width="256"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_roles.xml b/indra/newview/skins/default/xui/fr/panel_group_roles.xml index 008402db327..1b716babc65 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_roles.xml @@ -1,160 +1,113 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Membres et rôles" name="roles_tab"> - <text name="default_needs_apply_text"> - Certains changements n'ont pas été appliqués sur ce sous-onglet. - </text> - <text name="want_apply_text"> - Voulez-vous enregistrer les modifications ? - </text> - <text name="cant_delete_role"> - Les Rôles Tout le monde et Propriétaires sont spéciaux et ne peuvent être supprimés. - </text> - <button label="?" name="help_button"/> - <panel name="members_header"> - <text name="static"> - Membres - </text> - <text name="static2"> - Les rôles de chaque membre peuvent être personnalisés, ce qui permet une -meilleure organisation du groupe. - </text> - </panel> - <panel name="roles_header"> - <text name="static"> - Rôles - </text> - <text name="role_properties_modifiable"> - Sélectionnez un rôle ci-dessous. Vous pouvez modifier le nom, la -description et le titre du membre. - </text> - <text name="role_properties_not_modifiable"> - Sélectionnez un rôle ci-dessous pour en connaître les propriétés, les -membres et les pouvoirs. - </text> - <text bottom_delta="-28" name="role_actions_modifiable"> - Vous pouvez aussi assigner des pouvoirs au rôle. - </text> - <text name="role_actions_not_modifiable"> - Vous pouvez afficher mais non modifier les pouvoirs assignés. - </text> - </panel> - <panel name="actions_header"> - <text name="static"> - Pouvoirs - </text> - <text name="static2"> - Vous pouvez afficher la description du pouvoir et voir à quels rôles ou à -quels membres ces pouvoirs sont assignés. - </text> - </panel> - <tab_container height="164" name="roles_tab_container"> - <panel height="148" label="Membres" name="members_sub_tab" tool_tip="Membres"> - <line_editor bottom="127" name="search_text"/> - <button label="Rechercher" name="search_button" width="75"/> - <button label="Afficher tout" left_delta="80" name="show_all_button"/> - <name_list bottom_delta="-105" height="104" name="member_list"> - <column label="Nom du membre" name="name"/> - <column label="Surface donnée" name="donated" width="116"/> - <column label="Dernière connexion" name="online" width="136"/> - </name_list> - <button label="Inviter un membre..." name="member_invite" width="165"/> - <button label="Expulser un membre" name="member_eject"/> - <text name="help_text"> - Vous pouvez ajouter ou supprimer les rôles assignés aux membres. -Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la touche Ctrl enfoncée. - </text> - </panel> - <panel height="148" label="Rôles" name="roles_sub_tab"> - <line_editor bottom="127" name="search_text"/> - <button label="Rechercher" name="search_button" width="75"/> - <button label="Afficher tout" left_delta="80" name="show_all_button"/> - <scroll_list bottom_delta="-104" height="104" name="role_list"> - <column label="Nom du rôle" name="name"/> - <column label="Titre" name="title"/> - <column label="Membres" name="members"/> - </scroll_list> - <button label="Créer un rôle..." name="role_create"/> - <button label="Supprimer le rôle" name="role_delete"/> - <text name="help_text"> - Chaque rôle possède un titre et des pouvoirs. Un membre peut avoir plusieurs rôles mais il ne peut y avoir que 10 rôles dans un groupe, Visiteur et Propriétaire inclus. - </text> - <string name="cant_delete_role"> - Les rôles Tous et Propriétaires sont spéciaux et ne peuvent pas être supprimés. - </string> - </panel> - <panel height="148" label="Pouvoirs" name="actions_sub_tab"> - <line_editor bottom="127" name="search_text"/> - <button label="Rechercher" name="search_button" width="75"/> - <button label="Afficher tout" left_delta="80" name="show_all_button"/> - <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Sélectionnez un pouvoir pour en afficher les détails."> - <column label="" name="icon"/> - <column label="" name="action"/> - </scroll_list> - <text name="help_text"> - Les pouvoirs déterminent les facultés de chaque membre dans le groupe. - </text> - </panel> - </tab_container> - <panel name="members_footer"> - <text name="static"> - Rôles assignés - </text> - <text name="static2"> - Pouvoirs attribués - </text> - <scroll_list name="member_assigned_roles"> - <column label="" name="checkbox"/> - <column label="" name="role"/> - </scroll_list> - <scroll_list name="member_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l'onglet Pouvoirs."> - <column label="" name="icon"/> - <column label="" name="action"/> - </scroll_list> - </panel> - <panel name="roles_footer"> - <text name="static"> - Nom - </text> - <text name="static2"> - Description - </text> - <line_editor name="role_name"> - Employés - </line_editor> - <text name="static3"> - Titre - </text> - <line_editor name="role_title"> - (en attente) - </line_editor> - <text_editor name="role_description"> - (en attente) - </text_editor> - <text name="static4"> - Membres assignés - </text> - <text name="static5" tool_tip="Une liste des pouvoirs auquel le rôle sélectionné a accès."> - Pouvoirs attribués - </text> - <check_box label="Membres visibles" name="role_visible_in_list" tool_tip="Définit si les membres de ce rôle sont visibles à partir de l'onglet Général aux personnes en dehors du groupe."/> - <scroll_list name="role_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l'onglet Pouvoirs."> - <column label="" name="icon"/> - <column label="" name="checkbox"/> - <column label="" name="action"/> - </scroll_list> - </panel> - <panel name="actions_footer"> - <text name="static"> - Description - </text> - <text_editor name="action_description"> - Ce pouvoir permet d'expulser des membres du groupe. Seul un propriétaire peut expulser un autre propriétaire. - </text_editor> - <text name="static2"> - Rôles avec ce pouvoir - </text> - <text name="static3"> - Membres avec ce pouvoir - </text> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Membres et rôles" name="roles_tab"> + <panel.string name="default_needs_apply_text"> + Certains changements n'ont pas été appliqués sur ce sous-onglet. + </panel.string> + <panel.string name="want_apply_text"> + Voulez-vous enregistrer les modifications ? + </panel.string> + <tab_container height="164" name="roles_tab_container"> + <panel height="148" label="Membres" name="members_sub_tab" tool_tip="Membres"> + <panel.string name="help_text"> + Vous pouvez ajouter ou supprimer les rôles assignés aux membres. +Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la touche Ctrl enfoncée. + </panel.string> + <filter_editor label="Filtrer les membres" name="filter_input"/> + <name_list bottom_delta="-105" height="104" name="member_list"> + <name_list.columns label="Membre" name="name"/> + <name_list.columns label="Donations" name="donated" width="116"/> + <name_list.columns label="En ligne" name="online" width="136"/> + </name_list> + <button label="Inviter" name="member_invite" width="165"/> + <button label="Expulser" name="member_eject"/> + </panel> + <panel height="148" label="Rôles" name="roles_sub_tab"> + <panel.string name="help_text"> + Chaque rôle possède un titre et des pouvoirs. Un membre peut avoir plusieurs rôles mais il ne peut y avoir que 10 rôles dans un groupe, Visiteur et Propriétaire inclus. + </panel.string> + <panel.string name="cant_delete_role"> + Les rôles Tous et Propriétaires sont spéciaux et ne peuvent pas être supprimés. + </panel.string> + <filter_editor label="Filtrer les rôles" name="filter_input"/> + <scroll_list bottom_delta="-104" height="104" name="role_list"> + <scroll_list.columns label="Rôle" name="name"/> + <scroll_list.columns label="Titre" name="title"/> + <scroll_list.columns label="Membres" name="members"/> + </scroll_list> + <button label="Ajouter un rôle" name="role_create"/> + <button label="Supprimer le rôle" name="role_delete"/> + </panel> + <panel height="148" label="Pouvoirs" name="actions_sub_tab" tool_tip="Vous pouvez afficher une description du pouvoir et voir quels membres et rôles peuvent s'en servir."> + <panel.string name="help_text"> + Les pouvoirs déterminent les facultés de chaque membre dans le groupe. + </panel.string> + <filter_editor label="Filtrer les pouvoirs" name="filter_input"/> + <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Sélectionnez un pouvoir pour en afficher les détails."> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + </tab_container> + <panel name="members_footer"> + <text name="static"> + Rôles assignés + </text> + <scroll_list name="member_assigned_roles"> + <scroll_list.columns label="" name="checkbox"/> + <scroll_list.columns label="" name="role"/> + </scroll_list> + <text name="static2"> + Pouvoirs attribués + </text> + <scroll_list name="member_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l'onglet Pouvoirs."> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + <panel name="roles_footer"> + <text name="static"> + Nom + </text> + <line_editor name="role_name"> + Employés + </line_editor> + <text name="static3"> + Titre + </text> + <line_editor name="role_title"> + (en attente) + </line_editor> + <text name="static2"> + Description + </text> + <text_editor name="role_description"> + (en attente) + </text_editor> + <text name="static4"> + Membres assignés + </text> + <check_box label="Membres visibles" name="role_visible_in_list" tool_tip="Définit si les membres de ce rôle sont visibles à partir de l'onglet Général aux personnes en dehors du groupe."/> + <text name="static5" tool_tip="Une liste des pouvoirs auquel le rôle sélectionné a accès."> + Pouvoirs attribués + </text> + <scroll_list name="role_allowed_actions" tool_tip="Pour avoir des détails sur chacun des pouvoirs attribués, allez à l'onglet Pouvoirs."> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="checkbox"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + <panel name="actions_footer"> + <text name="static"> + Description + </text> + <text_editor name="action_description"> + Ce pouvoir permet d'expulser des membres du groupe. Seul un propriétaire peut expulser un autre propriétaire. + </text_editor> + <text name="static2"> + Rôles avec ce pouvoir + </text> + <text name="static3"> + Membres avec ce pouvoir + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml b/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml new file mode 100644 index 00000000000..7f8f03f9aba --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <button label="Voir le profil" name="view_profile_btn"/> + <button label="Devenir amis" name="add_friend_btn"/> + <button label="Partager" name="share_btn"/> + <panel name="panel_call_buttons"> + <button label="Appeler" name="call_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml index eeef97454f5..3c174aa45bd 100644 --- a/indra/newview/skins/default/xui/fr/panel_login.xml +++ b/indra/newview/skins/default/xui/fr/panel_login.xml @@ -1,43 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="panel_login"> - <string name="forgot_password_url"> - http://secondlife.com/account/request.php - </string> - <text name="first_name_text"> - Prénom : - </text> - <text name="last_name_text"> - Nom : - </text> - <text name="password_text"> - Mot de passe : - </text> - <text name="start_location_text"> - Lieu de départ : - </text> - <combo_box name="start_location_combo"> - <combo_box.item name="MyHome" label="Domicile" /> - <combo_box.item name="MyLastLocation" label="Dernier emplacement" /> - <combo_box.item name="Typeregionname" label="<Nom de la région>" /> - </combo_box> - <check_box label="Mémoriser" name="remember_check"/> - <text name="full_screen_text"> - Le plein écran sera activé après identification. - </text> - <button label="Nouveau Compte..." label_selected="Nouveau Compte..." name="new_account_btn"/> - <button label="Me connecter" label_selected="Me connecter" name="connect_btn"/> - <button label="Préférences..." label_selected="Préférences..." name="preferences_btn"/> - <button label="Quitter" label_selected="Quitter" name="quit_btn"/> - <text name="version_text"> - 1.23.4 (5) - </text> - <text name="create_new_account_text"> - Créer un compte - </text> - <text name="forgot_password_text"> - Nom ou mot de passe oublié ? - </text> - <text name="channel_text"> - [VERSION] - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="create_account_url"> + http://secondlife.com/registration/ + </panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php + </panel.string> + <panel name="login_widgets"> + <line_editor name="first_name_edit" tool_tip="Prénom sur [SECOND_LIFE]"/> + <line_editor name="last_name_edit" tool_tip="Nom sur [SECOND_LIFE]"/> + <text name="start_location_text"> + Lieu de départ : + </text> + <text name="create_new_account_text"> + Créer un compte + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml new file mode 100644 index 00000000000..7aa8f244049 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chat_bar"> + <line_editor label="Cliquer ici pour chatter." name="chat_box" tool_tip="Appuyer sur Entrée pour dire, Ctrl-Entrée pour crier"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_picks.xml b/indra/newview/skins/default/xui/fr/panel_picks.xml new file mode 100644 index 00000000000..534af5ed3f2 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_picks.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Favoris" name="panel_picks"> + <panel label="bottom_panel" name="edit_panel"> + <button name="new_btn" tool_tip="Ajouter cet endroit à mes Favoris"/> + </panel> + <panel name="buttons_cucks"> + <button label="Carte" name="show_on_map_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index f616591c4e8..1f7c9a57dc8 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -1,59 +1,42 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Chat écrit" name="chat"> - <text name="text_box"> - Taille de la police -du chat : - </text> - <radio_group name="chat_font_size"> - <radio_item name="radio" label="Petite" /> - <radio_item name="radio2" label="Moyenne" /> - <radio_item name="radio3" label="Grande" /> - </radio_group> - <color_swatch label="Vous" name="user"/> - <text name="text_box1"> - Vous - </text> - <color_swatch label="Avatars" name="agent"/> - <text name="text_box2"> - Avatars - </text> - <color_swatch label="IM" name="im"/> - <text name="text_box3"> - IM - </text> - <color_swatch label="Système" name="system"/> - <text name="text_box4"> - Système - </text> - <color_swatch label="Erreurs de script" name="script_error"/> - <text name="text_box5"> - Erreurs de script - </text> - <color_swatch label="Objets" name="objects"/> - <text name="text_box6"> - Objets - </text> - <color_swatch label="Propriétaire" name="owner"/> - <text name="text_box7"> - Propriétaire - </text> - <color_swatch label="Bulle" name="background"/> - <text name="text_box8"> - Bulle - </text> - <color_swatch label="URL" name="links"/> - <text name="text_box9"> - URL - </text> - <spinner label="Effacer le texte après" label_width="112" name="fade_chat_time" width="162"/> - <spinner left="335" name="max_chat_count"/> - <slider label="Opacité" name="console_opacity"/> - <check_box label="Utiliser la largeur de l'écran (redémarrage requis)" name="chat_full_width_check"/> - <check_box label="Fermer le chat après avoir appuyé sur Entrée" name="close_chat_on_return_check"/> - <check_box label="Faire bouger l'avatar avec les touches de direction" name="arrow_keys_move_avatar_check"/> - <check_box label="Afficher les heures dans le chat" name="show_timestamps_check"/> - <check_box label="Jouer l'animation clavier quand vous écrivez" name="play_typing_animation"/> - <check_box label="Afficher les bulles de chat" name="bubble_text_chat"/> - <slider label="Opacité" name="bubble_chat_opacity"/> - <check_box label="Afficher les erreurs dans le chat" name="script_errors_as_chat"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Chat écrit" name="chat"> + <radio_group name="chat_font_size"> + <radio_item label="Petite" name="radio"/> + <radio_item label="Moyenne" name="radio2"/> + <radio_item label="Grande" name="radio3"/> + </radio_group> + <color_swatch label="Vous" name="user"/> + <text name="text_box1"> + Moi + </text> + <color_swatch label="Avatars" name="agent"/> + <text name="text_box2"> + Avatars + </text> + <color_swatch label="IM" name="im"/> + <text name="text_box3"> + IM + </text> + <color_swatch label="Système" name="system"/> + <text name="text_box4"> + Système + </text> + <color_swatch label="Erreurs de script" name="script_error"/> + <text name="text_box5"> + Erreurs de script + </text> + <color_swatch label="Objets" name="objects"/> + <text name="text_box6"> + Objets + </text> + <color_swatch label="Propriétaire" name="owner"/> + <text name="text_box7"> + Propriétaire + </text> + <color_swatch label="URL" name="links"/> + <text name="text_box9"> + URL + </text> + <check_box initial_value="true" label="Jouer l'animation clavier quand vous écrivez" name="play_typing_animation"/> + <check_box label="M'envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml index 726ebc78b0f..2afd7152cb7 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml @@ -1,163 +1,116 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Graphiques" name="Display panel"> - <button label="?" name="GraphicsPreferencesHelpButton"/> - <text_editor bottom="-56" height="40" left="25" name="FullScreenInfo" width="460"> - Décochez cette option pour passer en mode plein écran. - </text_editor> - <text name="WindowSizeLabel"> - Taille de la fenêtre : - </text> - <combo_box name="windowsize combo"> - <combo_box.item name="640x480" label="640 x 480" /> - <combo_box.item name="800x600" label="800 x 600" /> - <combo_box.item name="720x480" label="720 x 480 (NTSC)" /> - <combo_box.item name="768x576" label="768 x 576 (PAL)" /> - <combo_box.item name="1024x768" label="1024 x 768" /> - </combo_box> - <text name="DisplayResLabel" width="165"> - Résolution de l'affichage : - </text> - <text name="AspectRatioLabel1" tool_tip="largeur/hauteur"> - Rapport hauteur/largeur : - </text> - <combo_box name="aspect_ratio" tool_tip="largeur/hauteur"> - <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standard CRT)" /> - <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280 x 1024 LCD)" /> - <combo_box.item name="8:5(Widescreen)" label="8:5 (écran large)" /> - <combo_box.item name="16:9(Widescreen)" label="16:9 (plein écran)" /> - </combo_box> - <text name="text"> - Résolution d'affichage : - </text> - <text name="Fullscreen Aspect Ratio:"> - Format de plein écran : - </text> - <text name="(width / height)"> - (largeur / hauteur) - </text> - <text name="UI Size:"> - Taille de l'IU : - </text> - <text name="(meters, lower is faster)"> - (mètres, moins = plus rapide) - </text> - <text name="text2"> - Options d'affichage : - </text> - <check_box label="Lancer Second Life en mode fenêtré" name="windowed mode"/> - <check_box label="Auto-détection du ratio" left="350" name="aspect_auto_detect"/> - <check_box label="Utiliser échelle de résolution indépendante" name="ui_auto_scale"/> - <check_box label="Montrer l'avatar en vue subjective" name="avfp"/> - <spinner label="Distance d'affichage :" name="draw_distance"/> - <text name="HigherText"> - Qualité et - </text> - <text name="QualityText"> - Performance : - </text> - <text left="105" name="FasterText"> - Plus rapide - </text> - <text name="ShadersPrefText"> - Faible - </text> - <text name="ShadersPrefText2"> - Moyen - </text> - <text name="ShadersPrefText3"> - Élevé - </text> - <text name="ShadersPrefText4"> - Ultra - </text> - <text bottom="-86" left="325" name="HigherText2"> - Plus élevée - </text> - <text name="QualityText2" visible="false"/> - <check_box label="Personnaliser" left="395" name="CustomSettings"/> - <panel name="CustomGraphics Panel"> - <text name="ShadersText"> - Effets : - </text> - <check_box label="Placage de relief et brillance" name="BumpShiny"/> - <check_box label="Effets de base" name="BasicShaders" tool_tip="Désactiver cette option peut empêcher certains drivers de cartes graphiques de planter."/> - <check_box label="Effets atmosphériques" name="WindLightUseAtmosShaders"/> - <check_box label="Reflets de l'eau" name="Reflections"/> - <text name="ReflectionDetailText"> - Objets reflétés : - </text> - <radio_group name="ReflectionDetailRadio"> - <radio_item name="0" label="Terrain et Arbres" /> - <radio_item name="1" label="Objets statiques" /> - <radio_item name="2" label="Objets et avatars" /> - <radio_item name="3" label="Tout" /> - </radio_group> - <text name="AvatarRenderingText"> - Rendu de l'avatar : - </text> - <check_box label="Avatars éloignés en 2D" name="AvatarImpostors"/> - <check_box label="Accélération du rendu" name="AvatarVertexProgram"/> - <check_box label="Mouvement des habits" name="AvatarCloth"/> - <text name="DrawDistanceMeterText1"> - m - </text> - <text name="DrawDistanceMeterText2"> - m - </text> - <slider label="Limite d'affichage :" name="DrawDistance"/> - <slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount"/> - <slider label="Qualité post-traitement :" name="RenderPostProcess"/> - <text name="MeshDetailText"> - Détails des rendus : - </text> - <slider label=" Objets :" name="ObjectMeshDetail"/> - <slider label=" Flexiprims :" name="FlexibleMeshDetail"/> - <slider label=" Arbres :" name="TreeMeshDetail"/> - <slider label=" Avatars :" name="AvatarMeshDetail"/> - <slider label=" Relief :" name="TerrainMeshDetail"/> - <slider label=" Ciel :" name="SkyMeshDetail"/> - <text name="PostProcessText"> - Faible - </text> - <text name="ObjectMeshDetailText"> - Faible - </text> - <text name="FlexibleMeshDetailText"> - Faible - </text> - <text name="TreeMeshDetailText"> - Faible - </text> - <text name="AvatarMeshDetailText"> - Faible - </text> - <text name="TerrainMeshDetailText"> - Faible - </text> - <text name="SkyMeshDetailText"> - Faible - </text> - <text name="LightingDetailText"> - Sources lumineuses : - </text> - <radio_group name="LightingDetailRadio"> - <radio_item name="SunMoon" label="Soleil et lune uniquement" /> - <radio_item name="LocalLights" label="Lumières à proximité" /> - </radio_group> - <text left="380" name="TerrainDetailText"> - Rendu du terrain : - </text> - <radio_group name="TerrainDetailRadio"> - <radio_item name="0" label="Faible" /> - <radio_item name="2" label="Élevé" /> - </radio_group> - </panel> - <button label="Paramètres recommandés" name="Defaults"/> - <button label="Configuration du matériel" label_selected="Configuration du matériel" name="GraphicsHardwareButton"/> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> - <panel.string name="aspect_ratio_text"> - [NUM]:[DEN] - </panel.string> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Graphiques" name="Display panel"> + <text name="WindowSizeLabel"> + Taille de la fenêtre : + </text> + <check_box label="Utiliser le plein écran" name="windowed mode"/> + <combo_box name="windowsize combo"> + <combo_box.item label="640 x 480" name="640x480"/> + <combo_box.item label="800 x 600" name="800x600"/> + <combo_box.item label="720 x 480 (NTSC)" name="720x480"/> + <combo_box.item label="768 x 576 (PAL)" name="768x576"/> + <combo_box.item label="1024 x 768" name="1024x768"/> + </combo_box> + <text name="UI Size:"> + Taille de l'IU : + </text> + <text name="QualitySpeed"> + Qualité et vitesse : + </text> + <text left="105" name="FasterText"> + Plus rapide + </text> + <text name="BetterText"> + Mieux + </text> + <text name="ShadersPrefText"> + Faible + </text> + <text name="ShadersPrefText2"> + Moyen + </text> + <text name="ShadersPrefText3"> + Élevé + </text> + <text name="ShadersPrefText4"> + Ultra + </text> + <panel label="CustomGraphics" name="CustomGraphics Panel"> + <text name="ShadersText"> + Effets : + </text> + <check_box initial_value="true" label="Placage de relief et brillance" name="BumpShiny"/> + <check_box initial_value="true" label="Effets de base" name="BasicShaders" tool_tip="Désactiver cette option peut empêcher certains drivers de cartes graphiques de planter."/> + <check_box initial_value="true" label="Effets atmosphériques" name="WindLightUseAtmosShaders"/> + <check_box initial_value="true" label="Reflets de l'eau" name="Reflections"/> + <text name="ReflectionDetailText"> + Objets reflétés : + </text> + <radio_group name="ReflectionDetailRadio"> + <radio_item label="Terrain et Arbres" name="0"/> + <radio_item label="Objets statiques" name="1"/> + <radio_item label="Objets et avatars" name="2"/> + <radio_item label="Tout" name="3"/> + </radio_group> + <text name="AvatarRenderingText"> + Rendu de l'avatar : + </text> + <check_box initial_value="true" label="Avatars éloignés en 2D" name="AvatarImpostors"/> + <check_box initial_value="true" label="Accélération du rendu" name="AvatarVertexProgram"/> + <check_box initial_value="true" label="Mouvement des habits" name="AvatarCloth"/> + <slider label="Limite d'affichage :" name="DrawDistance"/> + <text name="DrawDistanceMeterText2"> + m + </text> + <slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount"/> + <slider label="Qualité post-traitement :" name="RenderPostProcess"/> + <text name="MeshDetailText"> + Détails des rendus : + </text> + <slider label=" Objets :" name="ObjectMeshDetail"/> + <slider label=" Flexiprims :" name="FlexibleMeshDetail"/> + <slider label=" Arbres :" name="TreeMeshDetail"/> + <slider label=" Avatars :" name="AvatarMeshDetail"/> + <slider label=" Relief :" name="TerrainMeshDetail"/> + <slider label=" Ciel :" name="SkyMeshDetail"/> + <text name="PostProcessText"> + Faible + </text> + <text name="ObjectMeshDetailText"> + Faible + </text> + <text name="FlexibleMeshDetailText"> + Faible + </text> + <text name="TreeMeshDetailText"> + Faible + </text> + <text name="AvatarMeshDetailText"> + Faible + </text> + <text name="TerrainMeshDetailText"> + Faible + </text> + <text name="SkyMeshDetailText"> + Faible + </text> + <text name="LightingDetailText"> + Sources lumineuses : + </text> + <radio_group name="LightingDetailRadio"> + <radio_item label="Soleil et lune uniquement" name="SunMoon"/> + <radio_item label="Lumières à proximité" name="LocalLights"/> + </radio_group> + <text left="380" name="TerrainDetailText"> + Rendu du terrain : + </text> + <radio_group name="TerrainDetailRadio"> + <radio_item label="Faible" name="0"/> + <radio_item label="Élevé" name="2"/> + </radio_group> + </panel> + <button label="Appliquer" label_selected="Appliquer" name="Apply"/> + <button label="Réinitialiser" name="Defaults"/> + <button label="Avancé" name="Advanced"/> + <button label="Matériel" label_selected="Matériel" name="GraphicsHardwareButton"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml index 527097b392f..c1a6d450891 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml @@ -1,32 +1,21 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Communication" name="im"> - <text name="text_box"> - Mon statut en ligne : - </text> - <check_box label="Seuls mes amis et groupes voient quand je suis connecté(e)" name="online_visibility"/> - <text name="log_in_to_change"> - se connecter pour changer - </text> - <check_box label="Envoyer les IM à mon adresse e-mail ([EMAIL])" name="send_im_to_email"/> - <check_box label="Afficher les IM dans la console du chat" name="include_im_in_chat_console"/> - <check_box label="Afficher l'heure dans les IM" name="show_timestamps_check"/> - <check_box label="Me prévenir quand des amis se connectent" name="friends_online_notify_checkbox"/> - <text name="text_box3"> - Réponse si occupé(e) : - </text> - <text name="text_box4"> - Enregistrements : - </text> - <check_box label="Enregistrer les IM sur mon ordinateur" name="log_instant_messages"/> - <check_box label="Inclure les heures" name="log_instant_messages_timestamp"/> - <check_box label="Enregistrer le chat local sur mon ordinateur" name="log_chat"/> - <check_box label="Inclure la fin de la dernière conversation IM" name="log_show_history"/> - <check_box label="Inclure les heures" name="log_chat_timestamp"/> - <check_box label="Inclure les IM reçus" name="log_chat_IM"/> - <check_box label="Inclure la date avec les heures" name="log_date_timestamp"/> - <button label="Changer d'emplacement" label_selected="Changer d'emplacement" name="log_path_button" width="150"/> - <line_editor left="308" name="log_path_string" right="-20"/> - <text name="text_box2"> - IM : - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Communication" name="im"> + <panel.string name="log_in_to_change"> + se connecter pour changer + </panel.string> + <button label="Vider le cache" name="clear_cache"/> + <text name="cache_size_label_l"> + (Endroits, images, web, historique des recherches) + </text> + <check_box label="Seuls mes amis et groupes voient quand je suis en ligne" name="online_visibility"/> + <check_box label="Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM" name="voice_call_friends_only_check"/> + <check_box label="Fermer le micro à la fin d'un appel" name="auto_disengage_mic_check"/> + <check_box label="Accepter les cookies" name="cookies_enabled"/> + <check_box label="Sauvegarder les journaux sur mon ordinateur" name="log_instant_messages"/> + <radio_group name="ChatIMLogs"> + <radio_item label="Chat" name="radio1"/> + <radio_item label="IM" name="radio2"/> + </radio_group> + <line_editor left="308" name="log_path_string" right="-20"/> + <button label="Parcourir" label_selected="Parcourir" name="log_path_button" width="150"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml index b52ab672b00..7f6c7c57bd9 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml @@ -1,30 +1,46 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Contrôle et caméra" name="Input panel"> - <text name=" Mouselook Options:"> - Vue subjective : - </text> - <text name=" Mouse Sensitivity:"> - Sensibilité de la souris : - </text> - <check_box label="Inverser la souris" name="invert_mouse"/> - <text name=" Auto Fly Options:"> - Vol automatique : - </text> - <check_box label="Voler/atterrir en appuyant sur la flèche du haut/bas" name="automatic_fly"/> - <text name=" Camera Options:"> - Options de la caméra : - </text> - <text name="camera_fov_label"> - Angle de vision : - </text> - <text name="Camera Follow Distance:"> - Distance : - </text> - <check_box label="Ajustement automatique en mode Édition" name="edit_camera_movement" tool_tip="Positionner automatiquement la caméra lors de l'entrée ou de la sortie du mode Édition"/> - <check_box label="Ajustement automatique en mode Édition d'apparence" name="appearance_camera_movement" tool_tip="Positionner automatiquement la caméra en mode Édition"/> - <text name="text2"> - Affichage de l'avatar : - </text> - <check_box label="Montrer l'avatar en vue subjective" name="first_person_avatar_visible"/> - <button label="Configuration du joystick" name="joystick_setup_button" width="175"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Contrôle et caméra" name="Input panel"> + <button label="Autres accessoires" name="joystick_setup_button" width="175"/> + <text name="Mouselook:"> + Vue subjective : + </text> + <text name=" Mouse Sensitivity"> + Sensibilité de la souris + </text> + <check_box label="Inverser" name="invert_mouse"/> + <text name="Network:"> + Réseau : + </text> + <text name="Maximum bandwidth"> + Bande passante maximale + </text> + <text name="text_box2"> + kbps + </text> + <check_box label="Port de connexion personnalisé" name="connection_port_enabled"/> + <spinner label="Numéro de port :" name="web_proxy_port"/> + <text name="cache_size_label_l"> + Taille de la mémoire + </text> + <text name="text_box5"> + Mo + </text> + <button label="Parcourir" label_selected="Parcourir" name="set_cache"/> + <button label="Réinitialiser" label_selected="Choisir" name="reset_cache"/> + <text name="Cache location"> + Emplacement du cache + </text> + <text name="Web:"> + Web : + </text> + <radio_group name="use_external_browser"> + <radio_item label="Utiliser le navigateur intégré" name="internal" tool_tip="Utilisez le navigateur intégré pour obtenir de l'aide, ouvrir des liens etc. Ce navigateur s'ouvre dans [APP_NAME]."/> + <radio_item label="Utiliser mon navigateur (IE, Firefox etc.)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l'aide, les liens etc. Non recommandé en mode plein écran."/> + </radio_group> + <check_box initial_value="false" label="Proxy web" name="web_proxy_enabled"/> + <line_editor name="web_proxy_editor" tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser"/> + <button label="Parcourir" label_selected="Parcourir" name="set_proxy"/> + <text name="Proxy location"> + Emplacement du proxy + </text> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml index facd22988c7..c002c55c23e 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Audio et vidéo" name="Preference Media panel"> - <slider label="Principal" name="System Volume"/> - <slider label="Son ambiant" name="Wind Volume"/> - <slider label="Sons" name="SFX Volume"/> - <slider label="Média" name="Media Volume"/> - <slider label="Interface" name="UI Volume"/> - <slider label="Musique" name="Music Volume"/> - <slider label="Voix" name="Voice Volume"/> - <text_editor name="voice_unavailable"> - Le chat vocal n'est pas disponible - </text_editor> - <check_box label="Activer la voix" name="enable_voice_check"/> - <radio_group name="ear_location"> - <radio_item name="0" label="Écouter depuis la position de la caméra." /> - <radio_item name="1" label="Écouter depuis la position de l'avatar." /> - </radio_group> - <button label="Paramètres du matériel" name="device_settings_btn"/> - <text name="muting_text"> - Volume : - </text> - <panel name="Volume Panel" width="249"/> - <check_box label="Couper le son" name="disable audio"/> - <text bottom="-195" name="streaming_prefs_text" width="145"> - Média : - </text> - <text name="audio_prefs_text"> - Audio : - </text> - <panel label="Volume" name="Volume Panel"/> - <check_box label="Couper le son lorsque la fenêtre est minimisée" name="mute_when_minimized"/> - <check_box label="Jouer la musique disponible" name="streaming_music"/> - <check_box label="Jouer le média disponible" name="streaming_video"/> - <check_box label="Lire automatiquement le média" name="auto_streaming_video"/> - <slider label="Effet Doppler" label_width="115" name="Doppler Effect"/> - <slider label="Facteur d'éloignement" label_width="115" name="Distance Factor"/> - <slider label="Facteur d'atténuation" label_width="115" name="Rolloff Factor"/> - <spinner label="Alerte L$" name="L$ Change Threshold"/> - <spinner label="Alerte santé" name="Health Change Threshold"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Audio et vidéo" name="Preference Media panel"> + <slider label="Volume principal" name="System Volume"/> + <slider label="Son ambiant" name="Wind Volume"/> + <slider label="Sons" name="SFX Volume"/> + <slider label="Média" name="Media Volume"/> + <slider label="Interface" name="UI Volume"/> + <slider label="Musique" name="Music Volume"/> + <slider label="Voix" name="Voice Volume"/> + <text_editor name="voice_unavailable"> + Le chat vocal n'est pas disponible + </text_editor> + <check_box label="Chat vocal" name="enable_voice_check"/> + <radio_group name="ear_location"> + <radio_item label="Écouter depuis la position de la caméra" name="0"/> + <radio_item label="Écouter depuis la position de l'avatar" name="1"/> + </radio_group> + <button label="Paramètres du matériel" name="device_settings_btn"/> + <text name="muting_text"> + Volume : + </text> + <panel name="Volume Panel" width="249"/> + <check_box label="Couper le son" name="disable audio"/> + <text bottom="-195" name="streaming_prefs_text" width="145"> + Média : + </text> + <text name="audio_prefs_text"> + Audio : + </text> + <panel label="Volume" name="Volume Panel"/> + <check_box label="Couper le son quand minimisé" name="mute_when_minimized"/> + <check_box label="Jouer la musique disponible" name="streaming_music"/> + <check_box label="Jouer le média disponible" name="streaming_video"/> + <check_box label="Lire automatiquement le média" name="auto_streaming_video"/> + <slider label="Effet Doppler" label_width="115" name="Doppler Effect"/> + <slider label="Facteur d'éloignement" label_width="115" name="Distance Factor"/> + <slider label="Facteur d'atténuation" label_width="115" name="Rolloff Factor"/> + <spinner label="Alerte L$" name="L$ Change Threshold"/> + <spinner label="Alerte santé" name="Health Change Threshold"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml new file mode 100644 index 00000000000..bd67605d9f2 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_profile.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profil" name="panel_profile"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="payment_update_link_url"> + http://www.secondlife.com/account/billing.php?lang=en + </string> + <string name="my_account_link_url" value="http://secondlife.com/account"/> + <string name="no_partner_text" value="Aucun"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="second_life_image_panel"> + <text name="title_sl_descr_text" value="[SECOND_LIFE] :"/> + </panel> + <panel name="first_life_image_panel"> + <text name="title_rw_descr_text" value="Monde physique :"/> + </panel> + <text name="me_homepage_text"> + Page d'accueil : + </text> + <text name="title_member_text" value="Membre depuis :"/> + <text name="title_acc_status_text" value="Statut du compte :"/> + <text name="title_partner_text" value="Partenaire :"/> + <panel name="partner_data_panel"> + <text name="partner_text" value="[FIRST] [LAST]"/> + </panel> + <text name="title_groups_text" value="Groupes :"/> + </panel> + </scroll_container> + <panel name="profile_buttons_panel"> + <button label="Devenir amis" name="add_friend"/> + <button label="IM" name="im"/> + <button label="Appeler" name="call"/> + <button label="Téléporter" name="teleport"/> + </panel> + <panel name="profile_me_buttons_panel"> + <button label="Modifier le profil" name="edit_profile_btn"/> + <button label="Changer d'apparence" name="edit_appearance_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_profile_view.xml b/indra/newview/skins/default/xui/fr/panel_profile_view.xml new file mode 100644 index 00000000000..44539ddba47 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_profile_view.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_target_profile"> + <string name="status_online"> + En ligne + </string> + <string name="status_offline"> + Hors ligne + </string> + <text name="user_name" value="(en cours de chargement...)"/> + <text name="status" value="En ligne"/> + <tab_container name="tabs"> + <panel label="Profil" name="panel_profile"/> + <panel label="Favoris" name="panel_picks"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_script_ed.xml b/indra/newview/skins/default/xui/fr/panel_script_ed.xml new file mode 100644 index 00000000000..5790efe2f8f --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_script_ed.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="script panel"> + <panel.string name="loading"> + Chargement… + </panel.string> + <panel.string name="can_not_view"> + Ce scipt ne peut pas être copié, visualisé ou modifié. Pour visualiser ou modifier un script à l'intérieur d'un objet, vous devez avoir les permissions requises. + </panel.string> + <panel.string name="public_objects_can_not_run"> + Les objets publics ne peuvent pas exécuter de scripts + </panel.string> + <panel.string name="script_running"> + Exécution en cours + </panel.string> + <panel.string name="Title"> + Script : [NAME] + </panel.string> + <text_editor name="Script Editor"> + Chargement… + </text_editor> + <button label="Enregistrer" label_selected="Enregistrer" name="Save_btn"/> + <combo_box label="Insérer..." name="Insert..."/> + <menu_bar name="script_menu"> + <menu label="Fichier" name="File"> + <menu_item_call label="Enregistrer" name="Save"/> + <menu_item_call label="Annuler tous les changements" name="Revert All Changes"/> + </menu> + <menu label="Éditer" name="Edit"> + <menu_item_call label="Annuler" name="Undo"/> + <menu_item_call label="Refaire" name="Redo"/> + <menu_item_call label="Couper" name="Cut"/> + <menu_item_call label="Copier" name="Copy"/> + <menu_item_call label="Coller" name="Paste"/> + <menu_item_call label="Tout sélectionner" name="Select All"/> + <menu_item_call label="Désélectionner" name="Deselect"/> + <menu_item_call label="Rechercher / Remplacer..." name="Search / Replace..."/> + </menu> + <menu label="Aide" name="Help"> + <menu_item_call label="Aide..." name="Help..."/> + <menu_item_call label="Aide par mots-clés..." name="Keyword Help..."/> + </menu> + </menu_bar> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml new file mode 100644 index 00000000000..9a2567c831a --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_stand_stop_flying.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml--> +<panel name="panel_stand_stop_flying"> + <button label="Me lever" name="stand_btn" tool_tip="Cliquez ici pour vous lever."/> + <button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml index 9545b251261..c963b4d8cba 100644 --- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml @@ -1,41 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="status"> - <text name="ParcelNameText" tool_tip="Nom de la parcelle de terrain sur laquelle vous vous trouvez. Cliquez pour ouvrir la section À propos du terrain."> - Saisissez le nom de la parcelle ici - </text> - <text name="BalanceText" tool_tip="Solde du compte"> - Chargement... - </text> - <button label="" label_selected="" name="buycurrency" tool_tip="Acheter des devises"/> - <text name="TimeText" tool_tip="Heure actuelle (Californie)"> - midi - </text> - <string name="StatBarDaysOfWeek"> - Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday - </string> - <string name="StatBarMonthsOfYear"> - January:February:March:April:May:June:July:August:September:October:November:December - </string> - <button label="" label_selected="" name="scriptout" tool_tip="Alertes et erreurs de scripts"/> - <button label="" label_selected="" name="health" tool_tip="Santé"/> - <text name="HealthText" tool_tip="Santé"> - 100 % - </text> - <button label="" label_selected="" name="fly" tool_tip="Vol interdit"/> - <button label="" label_selected="" name="build" tool_tip="Construction interdite"/> - <button label="" label_selected="" name="scripts" tool_tip="Scripts interdits"/> - <button name="no_fly" tool_tip="Interdiction de voler"/> - <button name="no_build" tool_tip="Interdiction de construire/rezzer"/> - <button name="no_scripts" tool_tip="Interdiction d'utiliser des scripts"/> - <button label="" label_selected="" name="restrictpush" tool_tip="Pas de bousculades"/> - <button name="status_no_voice" tool_tip="Voix non disponible ici"/> - <button label="" label_selected="" name="buyland" tool_tip="Acheter cette parcelle"/> - <line_editor label="Rechercher" name="search_editor" tool_tip="Rechercher dans [SECOND_LIFE]"/> - <button name="search_btn" tool_tip="Rechercher dans [SECOND_LIFE]"/> - <text name="packet_loss_tooltip"> - Perte de paquets - </text> - <text name="bandwidth_tooltip"> - Bande passante - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + January:February:March:April:May:June:July:August:September:October:November:December + </panel.string> + <panel.string name="packet_loss_tooltip"> + Perte de paquets + </panel.string> + <panel.string name="bandwidth_tooltip"> + Bande passante + </panel.string> + <panel.string name="buycurrencylabel"> + [AMT] L$ + </panel.string> + <button label="" label_selected="" name="buycurrency" tool_tip="Mon solde : Cliquez ici pour acheter plus de L$"/> + <text name="TimeText" tool_tip="Heure actuelle (Californie)"> + midi + </text> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_world_map.xml b/indra/newview/skins/default/xui/fr/panel_world_map.xml index d00157a2973..2fb7baaf7ca 100644 --- a/indra/newview/skins/default/xui/fr/panel_world_map.xml +++ b/indra/newview/skins/default/xui/fr/panel_world_map.xml @@ -1,51 +1,57 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="world_map"> - <panel.string name="world_map_north"> - N - </panel.string> - <panel.string name="world_map_east"> - E - </panel.string> - <panel.string name="world_map_west"> - O - </panel.string> - <panel.string name="world_map_south"> - S - </panel.string> - <panel.string name="world_map_southeast"> - SE - </panel.string> - <panel.string name="world_map_northeast"> - NE - </panel.string> - <panel.string name="world_map_southwest"> - SO - </panel.string> - <panel.string name="world_map_northwest"> - NO - </panel.string> - <text label="N" name="floater_map_north" text="N"> - N - </text> - <text label="E" name="floater_map_east" text="E"> - E - </text> - <text label="O" name="floater_map_west" text="O"> - O - </text> - <text label="S" name="floater_map_south" text="S"> - S - </text> - <text label="SE" name="floater_map_southeast" text="SE"> - SE - </text> - <text label="NE" name="floater_map_northeast" text="NE"> - NE - </text> - <text label="SO" name="floater_map_southwest" text="SO"> - SO - </text> - <text label="NO" name="floater_map_northwest" text="NO"> - NO - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="world_map"> + <panel.string name="Loading"> + Chargement… + </panel.string> + <panel.string name="InvalidLocation"> + Lieu invalide... + </panel.string> + <panel.string name="world_map_north"> + N + </panel.string> + <panel.string name="world_map_east"> + E + </panel.string> + <panel.string name="world_map_west"> + O + </panel.string> + <panel.string name="world_map_south"> + S + </panel.string> + <panel.string name="world_map_southeast"> + SE + </panel.string> + <panel.string name="world_map_northeast"> + NE + </panel.string> + <panel.string name="world_map_southwest"> + SO + </panel.string> + <panel.string name="world_map_northwest"> + NO + </panel.string> + <text label="N" name="floater_map_north" text="N"> + N + </text> + <text label="E" name="floater_map_east" text="E"> + E + </text> + <text label="O" name="floater_map_west" text="O"> + O + </text> + <text label="S" name="floater_map_south" text="S"> + S + </text> + <text label="SE" name="floater_map_southeast" text="SE"> + SE + </text> + <text label="NE" name="floater_map_northeast" text="NE"> + NE + </text> + <text label="SO" name="floater_map_southwest" text="SO"> + SO + </text> + <text label="NO" name="floater_map_northwest" text="NO"> + NO + </text> +</panel> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 070d2cd1a5f..06cc7d4a791 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -1,655 +1,3149 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- This file contains strings that used to be hardcoded in the source. - It is only for those strings which do not belong in a floater. - For example, the strings used in avatar chat bubbles, and strings - that are returned from one component and may appear in many places--> -<strings> - <string name="LoginInProgress"> - La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter. - </string> - <string name="LoginAuthenticating"> - Authentification en cours - </string> - <string name="LoginMaintenance"> - Maintenance du compte en cours… - </string> - <string name="LoginAttempt"> - La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER] - </string> - <string name="LoginPrecaching"> - Monde en cours de chargement… - </string> - <string name="LoginInitializingBrowser"> - Navigateur Web incorporé en cours d'initialisation… - </string> - <string name="LoginInitializingMultimedia"> - Multimédia en cours d'initialisation… - </string> - <string name="LoginVerifyingCache"> - Fichiers du cache en cours de vérification (peut prendre 60-90 s)... - </string> - <string name="LoginProcessingResponse"> - Réponse en cours de traitement… - </string> - <string name="LoginInitializingWorld"> - Monde en cours d'initialisation… - </string> - <string name="LoginDecodingImages"> - Décodage des images en cours... - </string> - <string name="LoginInitializingQuicktime"> - Quicktime en cours d'initialisation - </string> - <string name="LoginQuicktimeNotFound"> - Quicktime introuvable, impossible de procéder à l'initialisation. - </string> - <string name="LoginQuicktimeOK"> - Initialisation de Quicktime réussie. - </string> - <string name="LoginWaitingForRegionHandshake"> - Liaison avec la région en cours de création... - </string> - <string name="LoginConnectingToRegion"> - Connexion avec la région en cours... - </string> - <string name="LoginDownloadingClothing"> - Habits en cours de téléchargement... - </string> - <string name="AgentLostConnection"> - Il y a peut-être des problèmes techniques dans cette region. Veuillez vérifier votre connexion Internet. - </string> - <string name="TooltipPerson"> - Personne - </string> - <string name="TooltipNoName"> - (pas de nom) - </string> - <string name="TooltipOwner"> - Propriétaire : - </string> - <string name="TooltipPublic"> - Public - </string> - <string name="TooltipIsGroup"> - (Groupe) - </string> - <string name="TooltipFlagScript"> - Script - </string> - <string name="TooltipFlagPhysics"> - Propriétés physique - </string> - <string name="TooltipFlagTouch"> - Toucher - </string> - <string name="TooltipFlagL$"> - L$ - </string> - <string name="TooltipFlagDropInventory"> - Laisser tomber l'inventaire - </string> - <string name="TooltipFlagPhantom"> - Fantôme - </string> - <string name="TooltipFlagTemporary"> - Temporaire - </string> - <string name="TooltipFlagRightClickMenu"> - (cliquez-droit pour le menu) - </string> - <string name="TooltipFreeToCopy"> - Copie autorisée - </string> - <string name="TooltipForSaleL$"> - À vendre : [AMOUNT] L$ - </string> - <string name="TooltipForSaleMsg"> - À vendre : [MESSAGE] - </string> - <string name="TooltipFlagGroupBuild"> - Contruction de groupe - </string> - <string name="TooltipFlagNoBuild"> - Pas de construction - </string> - <string name="TooltipFlagNoEdit"> - Contruction de groupe - </string> - <string name="TooltipFlagNotSafe"> - Non sécurisé - </string> - <string name="TooltipFlagNoFly"> - Interdiction de voler - </string> - <string name="TooltipFlagGroupScripts"> - Scripts de groupe - </string> - <string name="TooltipFlagNoScripts"> - Pas de scripts - </string> - <string name="TooltipLand"> - Terrain : - </string> - <string name="TooltipMustSingleDrop"> - Impossible de faire glisser plus d'un objet ici - </string> - <string name="RetrievingData"> - En cours d'extraction... - </string> - <string name="ReleaseNotes"> - Notes de version - </string> - <string name="LoadingData"> - Chargement.. - </string> - <string name="AvatarNameNobody"> - (personne) - </string> - <string name="AvatarNameWaiting"> - (en attente) - </string> - <string name="AvatarNameHippos"> - (hippos) - </string> - <string name="GroupNameNone"> - (aucun) - </string> - <string name="AssetErrorNone"> - Aucune erreur - </string> - <string name="AssetErrorRequestFailed"> - Requête de l'actif : échec - </string> - <string name="AssetErrorNonexistentFile"> - Requête de l'actif : fichier inexistant - </string> - <string name="AssetErrorNotInDatabase"> - Requête de l'actif : actif introuvable dans la base de données - </string> - <string name="AssetErrorEOF"> - Fin du ficher - </string> - <string name="AssetErrorCannotOpenFile"> - Impossible d'ouvrir le fichier - </string> - <string name="AssetErrorFileNotFound"> - Fichier introuvable - </string> - <string name="AssetErrorTCPTimeout"> - Délai d'attente du transfert du fichier dépassé - </string> - <string name="AssetErrorCircuitGone"> - Disparition du circuit - </string> - <string name="AssetErrorPriceMismatch"> - Il y a une différence de prix entre le client et le serveur - </string> - <string name="AssetErrorUnknownStatus"> - Statut inconnu - </string> - <string name="AvatarEditingApparance"> - (Apparence en cours de modification) - </string> - <string name="AvatarAway"> - Absent - </string> - <string name="AvatarBusy"> - Occupé - </string> - <string name="AvatarMuted"> - Ignoré - </string> - <string name="anim_express_afraid"> - Effrayé - </string> - <string name="anim_express_anger"> - En colère - </string> - <string name="anim_away"> - Absent - </string> - <string name="anim_backflip"> - Salto arrière - </string> - <string name="anim_express_laugh"> - Rire en se tenant le ventre - </string> - <string name="anim_express_toothsmile"> - Grand sourire - </string> - <string name="anim_blowkiss"> - Envoyer un baiser - </string> - <string name="anim_express_bored"> - Bailler d'ennui - </string> - <string name="anim_bow"> - S'incliner - </string> - <string name="anim_clap"> - Applaudir - </string> - <string name="anim_courtbow"> - Révérence de cour - </string> - <string name="anim_express_cry"> - Pleurer - </string> - <string name="anim_dance1"> - Danse 1 - </string> - <string name="anim_dance2"> - Danse 2 - </string> - <string name="anim_dance3"> - Danse 3 - </string> - <string name="anim_dance4"> - Danse 4 - </string> - <string name="anim_dance5"> - Danse 5 - </string> - <string name="anim_dance6"> - Danse 6 - </string> - <string name="anim_dance7"> - Danse 7 - </string> - <string name="anim_dance8"> - Danse 8 - </string> - <string name="anim_express_disdain"> - Mépris - </string> - <string name="anim_drink"> - Boire - </string> - <string name="anim_express_embarrased"> - Gêne - </string> - <string name="anim_angry_fingerwag"> - Désapprobation - </string> - <string name="anim_fist_pump"> - Victoire - </string> - <string name="anim_yoga_float"> - Yoga - </string> - <string name="anim_express_frown"> - Froncer les sourcils - </string> - <string name="anim_impatient"> - Impatient - </string> - <string name="anim_jumpforjoy"> - Sauter de joie - </string> - <string name="anim_kissmybutt"> - Va te faire voir ! - </string> - <string name="anim_express_kiss"> - Baiser - </string> - <string name="anim_laugh_short"> - Rire - </string> - <string name="anim_musclebeach"> - Montrer ses muscles - </string> - <string name="anim_no_unhappy"> - Non (mécontent) - </string> - <string name="anim_no_head"> - Non - </string> - <string name="anim_nyanya"> - Na na na na nère - </string> - <string name="anim_punch_onetwo"> - Gauche-droite - </string> - <string name="anim_express_open_mouth"> - Bouche ouverte - </string> - <string name="anim_peace"> - Paix - </string> - <string name="anim_point_you"> - Montrer quelqu'un du doigt - </string> - <string name="anim_point_me"> - Se montrer du doigt - </string> - <string name="anim_punch_l"> - Gauche - </string> - <string name="anim_punch_r"> - Droite - </string> - <string name="anim_rps_countdown"> - Compter (pierre-papier-ciseaux) - </string> - <string name="anim_rps_paper"> - Papier (pierre-papier-ciseaux) - </string> - <string name="anim_rps_rock"> - Pierre (pierre-papier-ciseaux) - </string> - <string name="anim_rps_scissors"> - Ciseaux (pierre-papier-ciseaux) - </string> - <string name="anim_express_repulsed"> - Dégoût - </string> - <string name="anim_kick_roundhouse_r"> - Coup de pied circulaire - </string> - <string name="anim_express_sad"> - Triste - </string> - <string name="anim_salute"> - Salut - </string> - <string name="anim_shout"> - Crier - </string> - <string name="anim_express_shrug"> - Hausser les épaules - </string> - <string name="anim_express_smile"> - Sourire - </string> - <string name="anim_smoke_idle"> - Fumer, immobile - </string> - <string name="anim_smoke_inhale"> - Fumer, prendre une bouffée - </string> - <string name="anim_smoke_throw_down"> - Fumer, jeter son mégot - </string> - <string name="anim_express_surprise"> - Surprise - </string> - <string name="anim_sword_strike_r"> - Coup d'épée - </string> - <string name="anim_angry_tantrum"> - Caprice - </string> - <string name="anim_express_tongue_out"> - Tirer la langue - </string> - <string name="anim_hello"> - Faire signe - </string> - <string name="anim_whisper"> - Chuchoter - </string> - <string name="anim_whistle"> - Siffler - </string> - <string name="anim_express_wink"> - Clin d'Å“il - </string> - <string name="anim_wink_hollywood"> - Clin d'Å“il (Hollywood) - </string> - <string name="anim_express_worry"> - Soucis - </string> - <string name="anim_yes_happy"> - Oui (Joie) - </string> - <string name="anim_yes_head"> - Oui - </string> - <string name="texture_loading"> - Chargement... - </string> - <string name="worldmap_offline"> - Hors ligne - </string> - <string name="whisper"> - chuchote : - </string> - <string name="shout"> - crie : - </string> - <string name="SIM_ACCESS_PG"> - PG - </string> - <string name="SIM_ACCESS_MATURE"> - Mature - </string> - <string name="SIM_ACCESS_ADULT"> - Adult - </string> - <string name="SIM_ACCESS_DOWN"> - Hors ligne - </string> - <string name="SIM_ACCESS_MIN"> - Inconnu - </string> - <string name="land_type_unknown"> - (inconnu) - </string> - <string name="covenant_never_modified"> - Dernière modification : (jamais) - </string> - <string name="covenant_modified"> - Dernière modification : - </string> - <string name="all_files"> - Tous fichiers - </string> - <string name="sound_files"> - Sons - </string> - <string name="animation_files"> - Animations - </string> - <string name="image_files"> - Images - </string> - <string name="save_file_verb"> - Enregistrer - </string> - <string name="load_file_verb"> - Charger - </string> - <string name="targa_image_files"> - Images Targa - </string> - <string name="bitmap_image_files"> - Images Bitmap - </string> - <string name="avi_movie_file"> - Fichier de film AVI - </string> - <string name="xaf_animation_file"> - Fichier d'animation XAF - </string> - <string name="xml_file"> - Fichier XML - </string> - <string name="dot_raw_file"> - Fichier RAW - </string> - <string name="compressed_image_files"> - Images compressées - </string> - <string name="load_files"> - Charger des fichiers - </string> - <string name="choose_the_directory"> - Choisir le répertoire - </string> - <string name="accel-mac-control"> - ⌃ - </string> - <string name="accel-mac-command"> - ⌘ - </string> - <string name="accel-mac-option"> - ⌥ - </string> - <string name="accel-mac-shift"> - ⇧ - </string> - <string name="accel-win-control"> - Ctrl+ - </string> - <string name="accel-win-alt"> - Alt+ - </string> - <string name="accel-win-shift"> - Maj+ - </string> - <string name="GraphicsQualityLow"> - Faible - </string> - <string name="GraphicsQualityMid"> - Moyen - </string> - <string name="GraphicsQualityHigh"> - Élevé - </string> - - <!-- PARCEL_CATEGORY_UI_STRING --> - <string name="Linden Location">Appartenant aux Lindens</string> - <string name="Adult">Adult</string> - <string name="Arts&Culture">Art et Culture</string> - <string name="Business">Affaires</string> - <string name="Educational">Éducation</string> - <string name="Gaming">Jeux</string> - <string name="Hangout">Favoris</string> - <string name="Newcomer Friendly">Accueil pour les nouveaux</string> - <string name="Parks&Nature">Parcs et Nature</string> - <string name="Residential">Résidentiel</string> - <string name="Shopping">Shopping</string> - <string name="Other">Autre</string> - - <string name="ringing"> - Connexion au chat vocal du Monde en cours… - </string> - <string name="connected"> - Connecté(e) - </string> - <string name="unavailable"> - Voix non disponible à l'endroit où vous êtes - </string> - <string name="hang_up"> - Déconnecté du chat vocal - </string> - <string name="ScriptQuestionCautionChatGranted"> - '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS]. - </string> - <string name="ScriptQuestionCautionChatDenied"> - '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n'a pas reçu le droit de : [PERMISSIONS]. - </string> - <string name="ScriptTakeMoney"> - Débiter vos Linden dollars (L$) - </string> - <string name="ActOnControlInputs"> - Utiliser vos touches de commandes - </string> - <string name="RemapControlInputs"> - Reconfigurer vos touches de commandes - </string> - <string name="AnimateYourAvatar"> - Animer votre avatar - </string> - <string name="AttachToYourAvatar"> - Attacher à votre avatar - </string> - <string name="ReleaseOwnership"> - Passer l'objet dans le domaine public (sans propriétaire) - </string> - <string name="LinkAndDelink"> - Lier et délier d'autres objets - </string> - <string name="AddAndRemoveJoints"> - Créer et supprimer des liens avec d'autres objets - </string> - <string name="ChangePermissions"> - Modifier ses droits - </string> - <string name="TrackYourCamera"> - Suivre votre caméra - </string> - <string name="ControlYourCamera"> - Contrôler votre caméra - </string> - <text name="only_user_message"> - Vous êtes le seul participant à cette session. - </text> - <text name="offline_message"> - [FIRST] [LAST] est déconnecté(e). - </text> - <string name="invite_message"> - Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME]. - </string> - <string name="generic_request_error"> - Erreur lors de la requête, veuillez réessayer ultérieurement. - </string> - <string name="insufficient_perms_error"> - Vous n'avez pas les droits requis. - </string> - <string name="session_does_not_exist_error"> - La session a expiré - </string> - <string name="no_ability_error"> - Vous n'avez pas ce pouvoir. - </string> - <string name="no_ability"> - Vous n'avez pas ce pouvoir. - </string> - <string name="not_a_mod_error"> - Vous n'êtes pas modérateur de session. - </string> - <string name="muted_error"> - Un modérateur de groupe a désactivé votre chat écrit. - </string> - <string name="add_session_event"> - Impossible d'ajouter des participants à la session de chat avec [RECIPIENT]. - </string> - <string name="message_session_event"> - Impossible d'envoyer votre message à la session de chat avec [RECIPIENT]. - </string> - <string name="removed_from_group"> - Vous avez été supprimé du groupe. - </string> - <string name="close_on_no_ability"> - Vous ne pouvez plus participer à la session de chat. - </string> - <string name="AcctTypeResident"> - Résident - </string> - <string name="AcctTypeTrial"> - Essai - </string> - <string name="AcctTypeCharterMember"> - Membre originaire - </string> - <string name="AcctTypeEmployee"> - Employé(e) de Linden Lab - </string> - <string name="PaymentInfoUsed"> - Infos de paiement utilisées - </string> - <string name="PaymentInfoOnFile"> - Infos de paiement enregistrées - </string> - <string name="NoPaymentInfoOnFile"> - Aucune info de paiement - </string> - <string name="AgeVerified"> - Âge vérifié - </string> - <string name="NotAgeVerified"> - Âge non vérifié - </string> -</strings> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- This file contains strings that used to be hardcoded in the source. + It is only for those strings which do not belong in a floater. + For example, the strings used in avatar chat bubbles, and strings + that are returned from one component and may appear in many places--> +<strings> + <string name="SECOND_LIFE"> + Second Life + </string> + <string name="APP_NAME"> + Second Life + </string> + <string name="SECOND_LIFE_GRID"> + Grille de Second Life + </string> + <string name="SUPPORT_SITE"> + Portail Assistance Second Life + </string> + <string name="StartupDetectingHardware"> + Détection du matériel... + </string> + <string name="StartupLoading"> + Chargement + </string> + <string name="Fullbright"> + Fullbright (Legacy) + </string> + <string name="LoginInProgress"> + La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter. + </string> + <string name="LoginInProgressNoFrozen"> + Connexion... + </string> + <string name="LoginAuthenticating"> + Authentification en cours + </string> + <string name="LoginMaintenance"> + Maintenance du compte en cours… + </string> + <string name="LoginAttempt"> + La tentative de connexion précédente a échoué. Connexion, esssai [NUMBER] + </string> + <string name="LoginPrecaching"> + Monde en cours de chargement… + </string> + <string name="LoginInitializingBrowser"> + Navigateur Web incorporé en cours d'initialisation… + </string> + <string name="LoginInitializingMultimedia"> + Multimédia en cours d'initialisation… + </string> + <string name="LoginVerifyingCache"> + Fichiers du cache en cours de vérification (peut prendre 60-90 s)... + </string> + <string name="LoginProcessingResponse"> + Réponse en cours de traitement… + </string> + <string name="LoginInitializingWorld"> + Monde en cours d'initialisation… + </string> + <string name="LoginDecodingImages"> + Décodage des images en cours... + </string> + <string name="LoginInitializingQuicktime"> + Quicktime en cours d'initialisation + </string> + <string name="LoginQuicktimeNotFound"> + Quicktime introuvable, impossible de procéder à l'initialisation. + </string> + <string name="LoginQuicktimeOK"> + Initialisation de Quicktime réussie. + </string> + <string name="LoginWaitingForRegionHandshake"> + Liaison avec la région en cours de création... + </string> + <string name="LoginConnectingToRegion"> + Connexion avec la région en cours... + </string> + <string name="LoginDownloadingClothing"> + Habits en cours de téléchargement... + </string> + <string name="AgentLostConnection"> + Il y a peut-être des problèmes techniques dans cette region. Veuillez vérifier votre connexion Internet. + </string> + <string name="TooltipPerson"> + Personne + </string> + <string name="TooltipNoName"> + (pas de nom) + </string> + <string name="TooltipOwner"> + Propriétaire : + </string> + <string name="TooltipPublic"> + Public + </string> + <string name="TooltipIsGroup"> + (Groupe) + </string> + <string name="TooltipForSaleL$"> + À vendre : [AMOUNT] L$ + </string> + <string name="TooltipFlagGroupBuild"> + Contruction de groupe + </string> + <string name="TooltipFlagNoBuild"> + Pas de construction + </string> + <string name="TooltipFlagNoEdit"> + Contruction de groupe + </string> + <string name="TooltipFlagNotSafe"> + Non sécurisé + </string> + <string name="TooltipFlagNoFly"> + Interdiction de voler + </string> + <string name="TooltipFlagGroupScripts"> + Scripts de groupe + </string> + <string name="TooltipFlagNoScripts"> + Pas de scripts + </string> + <string name="TooltipLand"> + Terrain : + </string> + <string name="TooltipMustSingleDrop"> + Impossible de faire glisser plus d'un objet ici + </string> + <string name="TooltipHttpUrl"> + Cliquez pour afficher cette page web + </string> + <string name="TooltipSLURL"> + Cliquez pour en savoir plus sur cet endroit + </string> + <string name="TooltipAgentUrl"> + Cliquez pour afficher le profil de ce résident + </string> + <string name="TooltipGroupUrl"> + Cliquez pour afficher la description de ce groupe + </string> + <string name="TooltipEventUrl"> + Cliquez pour afficher la description de cet événement + </string> + <string name="TooltipClassifiedUrl"> + Cliquez pour afficher cette petite annonce + </string> + <string name="TooltipParcelUrl"> + Cliquez pour afficher la description de cette parcelle + </string> + <string name="TooltipTeleportUrl"> + Cliquez pour vous téléporter à cet endroit + </string> + <string name="TooltipObjectIMUrl"> + Cliquez pour afficher la description de cet objet + </string> + <string name="TooltipSLAPP"> + Cliquez pour exécuter la commande secondlife:// command + </string> + <string name="BUTTON_CLOSE_DARWIN"> + Fermer (⌘-W) + </string> + <string name="BUTTON_CLOSE_WIN"> + Fermer (Ctrl+W) + </string> + <string name="BUTTON_RESTORE"> + Restaurer + </string> + <string name="BUTTON_MINIMIZE"> + Minimiser + </string> + <string name="BUTTON_TEAR_OFF"> + Réduire + </string> + <string name="BUTTON_DOCK"> + Attacher + </string> + <string name="BUTTON_UNDOCK"> + Détacher + </string> + <string name="BUTTON_HELP"> + Afficher l'aide + </string> + <string name="RetrievingData"> + En cours d'extraction... + </string> + <string name="ReleaseNotes"> + Notes de version + </string> + <string name="LoadingData"> + Chargement.. + </string> + <string name="AvatarNameNobody"> + (personne) + </string> + <string name="AvatarNameWaiting"> + (en attente) + </string> + <string name="AvatarNameHippos"> + (hippos) + </string> + <string name="GroupNameNone"> + (aucun) + </string> + <string name="AssetErrorNone"> + Aucune erreur + </string> + <string name="AssetErrorRequestFailed"> + Requête de l'actif : échec + </string> + <string name="AssetErrorNonexistentFile"> + Requête de l'actif : fichier inexistant + </string> + <string name="AssetErrorNotInDatabase"> + Requête de l'actif : actif introuvable dans la base de données + </string> + <string name="AssetErrorEOF"> + Fin du ficher + </string> + <string name="AssetErrorCannotOpenFile"> + Impossible d'ouvrir le fichier + </string> + <string name="AssetErrorFileNotFound"> + Fichier introuvable + </string> + <string name="AssetErrorTCPTimeout"> + Délai d'attente du transfert du fichier dépassé + </string> + <string name="AssetErrorCircuitGone"> + Disparition du circuit + </string> + <string name="AssetErrorPriceMismatch"> + Il y a une différence de prix entre le client et le serveur + </string> + <string name="AssetErrorUnknownStatus"> + Statut inconnu + </string> + <string name="texture"> + texture + </string> + <string name="sound"> + son + </string> + <string name="calling card"> + carte de visite + </string> + <string name="landmark"> + repère + </string> + <string name="legacy script"> + script (ancienne version) + </string> + <string name="clothing"> + habits + </string> + <string name="object"> + objet + </string> + <string name="note card"> + note + </string> + <string name="folder"> + dossier + </string> + <string name="root"> + racine + </string> + <string name="lsl2 script"> + script lsl2 + </string> + <string name="lsl bytecode"> + bytecode lsl + </string> + <string name="tga texture"> + texture tga + </string> + <string name="body part"> + partie du corps + </string> + <string name="snapshot"> + photo + </string> + <string name="lost and found"> + objets trouvés + </string> + <string name="targa image"> + image targa + </string> + <string name="trash"> + poubelle + </string> + <string name="jpeg image"> + image jpeg + </string> + <string name="animation"> + animation + </string> + <string name="gesture"> + geste + </string> + <string name="simstate"> + simstate + </string> + <string name="favorite"> + favori + </string> + <string name="symbolic link"> + lien + </string> + <string name="AvatarAway"> + Absent + </string> + <string name="AvatarBusy"> + Occupé + </string> + <string name="AvatarMuted"> + Ignoré + </string> + <string name="anim_express_afraid"> + Effrayé + </string> + <string name="anim_express_anger"> + En colère + </string> + <string name="anim_away"> + Absent + </string> + <string name="anim_backflip"> + Salto arrière + </string> + <string name="anim_express_laugh"> + Rire en se tenant le ventre + </string> + <string name="anim_express_toothsmile"> + Grand sourire + </string> + <string name="anim_blowkiss"> + Envoyer un baiser + </string> + <string name="anim_express_bored"> + Bailler d'ennui + </string> + <string name="anim_bow"> + S'incliner + </string> + <string name="anim_clap"> + Applaudir + </string> + <string name="anim_courtbow"> + Révérence de cour + </string> + <string name="anim_express_cry"> + Pleurer + </string> + <string name="anim_dance1"> + Danse 1 + </string> + <string name="anim_dance2"> + Danse 2 + </string> + <string name="anim_dance3"> + Danse 3 + </string> + <string name="anim_dance4"> + Danse 4 + </string> + <string name="anim_dance5"> + Danse 5 + </string> + <string name="anim_dance6"> + Danse 6 + </string> + <string name="anim_dance7"> + Danse 7 + </string> + <string name="anim_dance8"> + Danse 8 + </string> + <string name="anim_express_disdain"> + Mépris + </string> + <string name="anim_drink"> + Boire + </string> + <string name="anim_express_embarrased"> + Gêne + </string> + <string name="anim_angry_fingerwag"> + Désapprobation + </string> + <string name="anim_fist_pump"> + Victoire + </string> + <string name="anim_yoga_float"> + Yoga + </string> + <string name="anim_express_frown"> + Froncer les sourcils + </string> + <string name="anim_impatient"> + Impatient + </string> + <string name="anim_jumpforjoy"> + Sauter de joie + </string> + <string name="anim_kissmybutt"> + Va te faire voir ! + </string> + <string name="anim_express_kiss"> + Baiser + </string> + <string name="anim_laugh_short"> + Rire + </string> + <string name="anim_musclebeach"> + Montrer ses muscles + </string> + <string name="anim_no_unhappy"> + Non (mécontent) + </string> + <string name="anim_no_head"> + Non + </string> + <string name="anim_nyanya"> + Na na na na nère + </string> + <string name="anim_punch_onetwo"> + Gauche-droite + </string> + <string name="anim_express_open_mouth"> + Bouche ouverte + </string> + <string name="anim_peace"> + Paix + </string> + <string name="anim_point_you"> + Montrer quelqu'un du doigt + </string> + <string name="anim_point_me"> + Se montrer du doigt + </string> + <string name="anim_punch_l"> + Gauche + </string> + <string name="anim_punch_r"> + Droite + </string> + <string name="anim_rps_countdown"> + Compter (pierre-papier-ciseaux) + </string> + <string name="anim_rps_paper"> + Papier (pierre-papier-ciseaux) + </string> + <string name="anim_rps_rock"> + Pierre (pierre-papier-ciseaux) + </string> + <string name="anim_rps_scissors"> + Ciseaux (pierre-papier-ciseaux) + </string> + <string name="anim_express_repulsed"> + Dégoût + </string> + <string name="anim_kick_roundhouse_r"> + Coup de pied circulaire + </string> + <string name="anim_express_sad"> + Triste + </string> + <string name="anim_salute"> + Salut + </string> + <string name="anim_shout"> + Crier + </string> + <string name="anim_express_shrug"> + Hausser les épaules + </string> + <string name="anim_express_smile"> + Sourire + </string> + <string name="anim_smoke_idle"> + Fumer, immobile + </string> + <string name="anim_smoke_inhale"> + Fumer, prendre une bouffée + </string> + <string name="anim_smoke_throw_down"> + Fumer, jeter son mégot + </string> + <string name="anim_express_surprise"> + Surprise + </string> + <string name="anim_sword_strike_r"> + Coup d'épée + </string> + <string name="anim_angry_tantrum"> + Caprice + </string> + <string name="anim_express_tongue_out"> + Tirer la langue + </string> + <string name="anim_hello"> + Faire signe + </string> + <string name="anim_whisper"> + Chuchoter + </string> + <string name="anim_whistle"> + Siffler + </string> + <string name="anim_express_wink"> + Clin d'Å“il + </string> + <string name="anim_wink_hollywood"> + Clin d'Å“il (Hollywood) + </string> + <string name="anim_express_worry"> + Soucis + </string> + <string name="anim_yes_happy"> + Oui (Joie) + </string> + <string name="anim_yes_head"> + Oui + </string> + <string name="texture_loading"> + Chargement... + </string> + <string name="worldmap_offline"> + Hors ligne + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + Fichier incomplet + </string> + <string name="ST_NO_JOINT"> + Impossible de trouver ROOT ou JOINT. + </string> + <string name="whisper"> + chuchote : + </string> + <string name="shout"> + crie : + </string> + <string name="ringing"> + Connexion au chat vocal du Monde en cours… + </string> + <string name="connected"> + Connecté(e) + </string> + <string name="unavailable"> + Voix non disponible à l'endroit où vous êtes + </string> + <string name="hang_up"> + Déconnecté du chat vocal + </string> + <string name="ScriptQuestionCautionChatGranted"> + '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS]. + </string> + <string name="ScriptQuestionCautionChatDenied"> + '[OBJECTNAME]', un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], n'a pas reçu le droit de : [PERMISSIONS]. + </string> + <string name="ScriptTakeMoney"> + Débiter vos Linden dollars (L$) + </string> + <string name="ActOnControlInputs"> + Utiliser vos touches de commandes + </string> + <string name="RemapControlInputs"> + Reconfigurer vos touches de commandes + </string> + <string name="AnimateYourAvatar"> + Animer votre avatar + </string> + <string name="AttachToYourAvatar"> + Attacher à votre avatar + </string> + <string name="ReleaseOwnership"> + Passer l'objet dans le domaine public (sans propriétaire) + </string> + <string name="LinkAndDelink"> + Lier et délier d'autres objets + </string> + <string name="AddAndRemoveJoints"> + Créer et supprimer des liens avec d'autres objets + </string> + <string name="ChangePermissions"> + Modifier ses droits + </string> + <string name="TrackYourCamera"> + Suivre votre caméra + </string> + <string name="ControlYourCamera"> + Contrôler votre caméra + </string> + <string name="SIM_ACCESS_PG"> + PG + </string> + <string name="SIM_ACCESS_MATURE"> + Mature + </string> + <string name="SIM_ACCESS_ADULT"> + Adult + </string> + <string name="SIM_ACCESS_DOWN"> + Hors ligne + </string> + <string name="SIM_ACCESS_MIN"> + Inconnu + </string> + <string name="land_type_unknown"> + (inconnu) + </string> + <string name="all_files"> + Tous fichiers + </string> + <string name="sound_files"> + Sons + </string> + <string name="animation_files"> + Animations + </string> + <string name="image_files"> + Images + </string> + <string name="save_file_verb"> + Enregistrer + </string> + <string name="load_file_verb"> + Charger + </string> + <string name="targa_image_files"> + Images Targa + </string> + <string name="bitmap_image_files"> + Images Bitmap + </string> + <string name="avi_movie_file"> + Fichier de film AVI + </string> + <string name="xaf_animation_file"> + Fichier d'animation XAF + </string> + <string name="xml_file"> + Fichier XML + </string> + <string name="dot_raw_file"> + Fichier RAW + </string> + <string name="compressed_image_files"> + Images compressées + </string> + <string name="load_files"> + Charger des fichiers + </string> + <string name="choose_the_directory"> + Choisir le répertoire + </string> + <string name="AvatarSetNotAway"> + Ne plus me mettre en mode absent + </string> + <string name="AvatarSetAway"> + Me mettre en mode absent + </string> + <string name="AvatarSetNotBusy"> + Ne plus me mettre en mode occupé + </string> + <string name="AvatarSetBusy"> + Me mettre en mode occupé + </string> + <string name="shape"> + Silhouette + </string> + <string name="skin"> + Peau + </string> + <string name="hair"> + Cheveux + </string> + <string name="eyes"> + Yeux + </string> + <string name="shirt"> + Chemise + </string> + <string name="pants"> + Pantalon + </string> + <string name="shoes"> + Chaussures + </string> + <string name="socks"> + Chaussettes + </string> + <string name="jacket"> + Veste + </string> + <string name="gloves"> + Gants + </string> + <string name="undershirt"> + Sous-vêtements (homme) + </string> + <string name="underpants"> + Sous-vêtements (femme) + </string> + <string name="skirt"> + Jupe + </string> + <string name="invalid"> + non valide + </string> + <string name="BodyPartsRightArm"> + Bras droit + </string> + <string name="BodyPartsHead"> + Tête + </string> + <string name="BodyPartsLeftArm"> + Bras gauche + </string> + <string name="BodyPartsLeftLeg"> + Jambe gauche + </string> + <string name="BodyPartsTorso"> + Torse + </string> + <string name="BodyPartsRightLeg"> + Jambe droite + </string> + <string name="GraphicsQualityLow"> + Faible + </string> + <string name="GraphicsQualityMid"> + Moyen + </string> + <string name="GraphicsQualityHigh"> + Élevé + </string> + <string name="LeaveMouselook"> + Appuyez sur ESC pour quitter la vue subjective + </string> + <string name="InventoryNoMatchingItems"> + Aucun objet correspondant ne se trouve dans l'inventaire. + </string> + <string name="InventoryNoTexture"> + Vous n'avez pas de copie de cette texture dans votre inventaire + </string> + <string name="LoadingContents"> + chargement des contenus en cours... + </string> + <string name="NoContents"> + Aucun contenu + </string> + <string name="InvFolder My Inventory"> + Mon inventaire + </string> + <string name="InvFolder My Favorites"> + Mes favoris + </string> + <string name="InvFolder Library"> + Bibliothèque + </string> + <string name="InvFolder Textures"> + Textures + </string> + <string name="InvFolder Sounds"> + Sons + </string> + <string name="InvFolder Calling Cards"> + Cartes de visite + </string> + <string name="InvFolder Landmarks"> + Repères + </string> + <string name="InvFolder Scripts"> + Scripts + </string> + <string name="InvFolder Clothing"> + Habits + </string> + <string name="InvFolder Objects"> + Objets + </string> + <string name="InvFolder Notecards"> + Notes + </string> + <string name="InvFolder New Folder"> + Nouveau dossier + </string> + <string name="InvFolder Inventory"> + Inventaire + </string> + <string name="InvFolder Uncompressed Images"> + Images non compressées + </string> + <string name="InvFolder Body Parts"> + Parties du corps + </string> + <string name="InvFolder Trash"> + Poubelle + </string> + <string name="InvFolder Photo Album"> + Albums photo + </string> + <string name="InvFolder Lost And Found"> + Objets trouvés + </string> + <string name="InvFolder Uncompressed Sounds"> + Sons non compressés + </string> + <string name="InvFolder Animations"> + Animations + </string> + <string name="InvFolder Gestures"> + Gestes + </string> + <string name="InvFolder favorite"> + Favoris + </string> + <string name="InvFolder Current Outfit"> + Tenue actuelle + </string> + <string name="InvFolder My Outfits"> + Mes tenues + </string> + <string name="InvFolder Friends"> + Amis + </string> + <string name="InvFolder All"> + Tout + </string> + <string name="Buy"> + Acheter + </string> + <string name="BuyforL$"> + Acheter des L$ + </string> + <string name="Stone"> + Pierre + </string> + <string name="Metal"> + Métal + </string> + <string name="Glass"> + Verre + </string> + <string name="Wood"> + Bois + </string> + <string name="Flesh"> + Chair + </string> + <string name="Plastic"> + Plastique + </string> + <string name="Rubber"> + Caoutchouc + </string> + <string name="Light"> + Léger + </string> + <string name="KBShift"> + Maj- + </string> + <string name="KBCtrl"> + Ctrl + </string> + <string name="Chest"> + Poitrine + </string> + <string name="Skull"> + Crâne + </string> + <string name="Left Shoulder"> + Épaule gauche + </string> + <string name="Right Shoulder"> + Épaule droite + </string> + <string name="Left Hand"> + Main gauche + </string> + <string name="Right Hand"> + Main droite + </string> + <string name="Left Foot"> + Pied gauche + </string> + <string name="Right Foot"> + Pied droit + </string> + <string name="Spine"> + Colonne + </string> + <string name="Pelvis"> + Bassin + </string> + <string name="Mouth"> + Bouche + </string> + <string name="Chin"> + Menton + </string> + <string name="Left Ear"> + Oreille gauche + </string> + <string name="Right Ear"> + Oreille droite + </string> + <string name="Left Eyeball"> + Globe oculaire gauche + </string> + <string name="Right Eyeball"> + Globe oculaire droit + </string> + <string name="Nose"> + Nez + </string> + <string name="R Upper Arm"> + Bras D + </string> + <string name="R Forearm"> + Avant-bras D + </string> + <string name="L Upper Arm"> + Bras G + </string> + <string name="L Forearm"> + Avant-bras G + </string> + <string name="Right Hip"> + Hanche droite + </string> + <string name="R Upper Leg"> + Cuisse D + </string> + <string name="R Lower Leg"> + Jambe D + </string> + <string name="Left Hip"> + Hanche gauche + </string> + <string name="L Upper Leg"> + Cuisse G + </string> + <string name="L Lower Leg"> + Jambe G + </string> + <string name="Stomach"> + Estomac + </string> + <string name="Left Pec"> + Pectoral gauche + </string> + <string name="Right Pec"> + Pectoral droit + </string> + <string name="YearsMonthsOld"> + [AGEYEARS] [AGEMONTHS] + </string> + <string name="YearsOld"> + [AGEYEARS] + </string> + <string name="MonthsOld"> + [AGEMONTHS] + </string> + <string name="WeeksOld"> + [AGEWEEKS] + </string> + <string name="DaysOld"> + [AGEDAYS] + </string> + <string name="TodayOld"> + Inscrit aujourd'hui + </string> + <string name="AgeYearsA"> + [COUNT] an + </string> + <string name="AgeYearsB"> + [COUNT] ans + </string> + <string name="AgeYearsC"> + [COUNT] ans + </string> + <string name="AgeMonthsA"> + [COUNT] mois + </string> + <string name="AgeMonthsB"> + [COUNT] mois + </string> + <string name="AgeMonthsC"> + [COUNT] mois + </string> + <string name="AgeWeeksA"> + [COUNT] semaine + </string> + <string name="AgeWeeksB"> + [COUNT] semaines + </string> + <string name="AgeWeeksC"> + [COUNT] semaines + </string> + <string name="AgeDaysA"> + [COUNT] jour + </string> + <string name="AgeDaysB"> + [COUNT] jours + </string> + <string name="AgeDaysC"> + [COUNT] jours + </string> + <string name="AcctTypeResident"> + Résident + </string> + <string name="AcctTypeTrial"> + Essai + </string> + <string name="AcctTypeCharterMember"> + Membre originaire + </string> + <string name="AcctTypeEmployee"> + Employé(e) de Linden Lab + </string> + <string name="PaymentInfoUsed"> + Infos de paiement utilisées + </string> + <string name="PaymentInfoOnFile"> + Infos de paiement enregistrées + </string> + <string name="NoPaymentInfoOnFile"> + Aucune info de paiement + </string> + <string name="AgeVerified"> + Âge vérifié + </string> + <string name="NotAgeVerified"> + Âge non vérifié + </string> + <string name="Center 2"> + Centrer 2 + </string> + <string name="Top Right"> + En haut à droite + </string> + <string name="Top"> + En haut + </string> + <string name="Top Left"> + En haut à gauche + </string> + <string name="Center"> + Centrer + </string> + <string name="Bottom Left"> + En bas à gauche + </string> + <string name="Bottom"> + Bas + </string> + <string name="Bottom Right"> + En bas à droite + </string> + <string name="CompileQueueDownloadedCompiling"> + Téléchargé, compilation en cours + </string> + <string name="CompileQueueScriptNotFound"> + Script introuvable sur le serveur. + </string> + <string name="CompileQueueProblemDownloading"> + Problème lors du téléchargement + </string> + <string name="CompileQueueInsufficientPermDownload"> + Permissions insuffisantes pour télécharger un script. + </string> + <string name="CompileQueueInsufficientPermFor"> + Permissions insuffisantes pour + </string> + <string name="CompileQueueUnknownFailure"> + Échec du téléchargement, erreur inconnue + </string> + <string name="CompileQueueTitle"> + Recompilation - progrès + </string> + <string name="CompileQueueStart"> + recompiler + </string> + <string name="ResetQueueTitle"> + Réinitialiser les progrès + </string> + <string name="ResetQueueStart"> + réinitialiser + </string> + <string name="RunQueueTitle"> + Lancer + </string> + <string name="RunQueueStart"> + lancer + </string> + <string name="NotRunQueueTitle"> + Arrêter + </string> + <string name="NotRunQueueStart"> + arrêter + </string> + <string name="CompileSuccessful"> + Compilation réussie ! + </string> + <string name="CompileSuccessfulSaving"> + Compilation réussie, enregistrement en cours... + </string> + <string name="SaveComplete"> + Enregistrement terminé. + </string> + <string name="ObjectOutOfRange"> + Script (objet hors de portée) + </string> + <string name="GodToolsObjectOwnedBy"> + Objet [OBJECT] possédé par [OWNER] + </string> + <string name="GroupsNone"> + aucun + </string> + <string name="Unknown"> + (Inconnu) + </string> + <string name="Balance"> + Solde + </string> + <string name="Credits"> + Remerciements + </string> + <string name="Debits"> + Débits + </string> + <string name="Total"> + Total + </string> + <string name="NoGroupDataFound"> + Aucune donnée trouvée pour le groupe + </string> + <string name="IMParentEstate"> + domaine parent + </string> + <string name="IMMainland"> + continent + </string> + <string name="IMTeen"> + teen + </string> + <string name="RegionInfoError"> + erreur + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + tous les domaines possédés par [OWNER] + </string> + <string name="RegionInfoAllEstatesYouOwn"> + tous les domaines que vous possédez + </string> + <string name="RegionInfoAllEstatesYouManage"> + tous les domaines que vous gérez pour [owner] + </string> + <string name="RegionInfoAllowedResidents"> + Résidents autorisés : ([ALLOWEDAGENTS], max [MAXACCESS]) + </string> + <string name="RegionInfoAllowedGroups"> + Groupes autorisés : ([ALLOWEDGROUPS], max [MAXACCESS]) + </string> + <string name="CursorPos"> + Ligne [LINE], Colonne [COLUMN] + </string> + <string name="PanelDirCountFound"> + [COUNT] trouvé(s) + </string> + <string name="PanelContentsNewScript"> + Nouveau script + </string> + <string name="MuteByName"> + (par nom) + </string> + <string name="MuteAgent"> + (résident) + </string> + <string name="MuteObject"> + (objet) + </string> + <string name="MuteGroup"> + (groupe) + </string> + <string name="RegionNoCovenant"> + Il n'y a aucun règlement pour ce domaine. + </string> + <string name="RegionNoCovenantOtherOwner"> + Il n'y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab. Pour en savoir plus, veuillez contacter le propriétaire. + </string> + <string name="covenant_last_modified"> + Dernière modification : + </string> + <string name="GroupOwned"> + Propriété du groupe + </string> + <string name="Public"> + Public + </string> + <string name="ClassifiedClicksTxt"> + Clics : [TELEPORT] téléporter, [MAP] carte, [PROFILE] profile + </string> + <string name="ClassifiedUpdateAfterPublish"> + (mise à jour après la publication) + </string> + <string name="GroupVoteYes"> + Oui + </string> + <string name="GroupVoteNo"> + Non + </string> + <string name="GroupVoteNoActiveProposals"> + Il n'y a aucune proposition active actuellement + </string> + <string name="GroupVoteNoArchivedProposals"> + Il n'y a aucune proposition archivée actuellement + </string> + <string name="GroupVoteRetrievingArchivedProposals"> + Extraction des propositions archivées + </string> + <string name="GroupVoteRetrievingActiveProposals"> + Extraction des propositions actives + </string> + <string name="MultiPreviewTitle"> + Prévisualiser + </string> + <string name="MultiPropertiesTitle"> + Propriétés + </string> + <string name="InvOfferAnObjectNamed"> + Un objet appelé + </string> + <string name="InvOfferOwnedByGroup"> + possédé par le groupe + </string> + <string name="InvOfferOwnedByUnknownGroup"> + possédé par un groupe inconnu + </string> + <string name="InvOfferOwnedBy"> + possédé par + </string> + <string name="InvOfferOwnedByUnknownUser"> + possédé par un résident inconnu + </string> + <string name="InvOfferGaveYou"> + vous a donné + </string> + <string name="InvOfferYouDecline"> + Vous avez refusé + </string> + <string name="InvOfferFrom"> + de la part de + </string> + <string name="GroupMoneyTotal"> + Total + </string> + <string name="GroupMoneyBought"> + acheté + </string> + <string name="GroupMoneyPaidYou"> + vous a payé + </string> + <string name="GroupMoneyPaidInto"> + payé + </string> + <string name="GroupMoneyBoughtPassTo"> + a acheté un pass à + </string> + <string name="GroupMoneyPaidFeeForEvent"> + a payé des frais pour un événement + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + a payé un prix pour un événement + </string> + <string name="GroupMoneyBalance"> + Solde + </string> + <string name="GroupMoneyCredits"> + Remerciements + </string> + <string name="GroupMoneyDebits"> + Débits + </string> + <string name="ViewerObjectContents"> + Contenus + </string> + <string name="AcquiredItems"> + Objets acquis + </string> + <string name="Cancel"> + Annuler + </string> + <string name="UploadingCosts"> + Chargement de %s coûts + </string> + <string name="UnknownFileExtension"> + Extension de fichier inconnue. %s +.wav, .tga, .bmp, .jpg, .jpeg, ou .bvh acceptés + </string> + <string name="AddLandmarkNavBarMenu"> + Ajouter un repère... + </string> + <string name="EditLandmarkNavBarMenu"> + Modifier le repère... + </string> + <string name="accel-mac-control"> + ⌃ + </string> + <string name="accel-mac-command"> + ⌘ + </string> + <string name="accel-mac-option"> + ⌥ + </string> + <string name="accel-mac-shift"> + ⇧ + </string> + <string name="accel-win-control"> + Ctrl+ + </string> + <string name="accel-win-alt"> + Alt+ + </string> + <string name="accel-win-shift"> + Maj+ + </string> + <string name="FileSaved"> + Fichier enregistré + </string> + <string name="Receiving"> + Réception + </string> + <string name="AM"> + AM + </string> + <string name="PM"> + PM + </string> + <string name="PST"> + PST + </string> + <string name="PDT"> + PDT + </string> + <string name="Forward"> + Vers l'avant + </string> + <string name="Left"> + Gauche + </string> + <string name="Right"> + Droite + </string> + <string name="Back"> + Précédente + </string> + <string name="North"> + Nord + </string> + <string name="South"> + Sud + </string> + <string name="West"> + Ouest + </string> + <string name="East"> + Est + </string> + <string name="Up"> + Vers le haut + </string> + <string name="Down"> + Vers le bas + </string> + <string name="Any Category"> + Toutes catégories + </string> + <string name="Shopping"> + Shopping + </string> + <string name="Land Rental"> + Terrains à louer + </string> + <string name="Property Rental"> + Propriétés à louer + </string> + <string name="Special Attraction"> + Divertissements + </string> + <string name="New Products"> + Nouveaux produits + </string> + <string name="Employment"> + Emplois + </string> + <string name="Wanted"> + Offres + </string> + <string name="Service"> + Services + </string> + <string name="Personal"> + Divers + </string> + <string name="None"> + Aucun + </string> + <string name="Linden Location"> + Appartenant aux Lindens + </string> + <string name="Adult"> + Adult + </string> + <string name="Arts&Culture"> + Art et Culture + </string> + <string name="Business"> + Affaires + </string> + <string name="Educational"> + Éducation + </string> + <string name="Gaming"> + Jeux + </string> + <string name="Hangout"> + Favoris + </string> + <string name="Newcomer Friendly"> + Accueil pour les nouveaux + </string> + <string name="Parks&Nature"> + Parcs et Nature + </string> + <string name="Residential"> + Résidentiel + </string> + <string name="Stage"> + Phase + </string> + <string name="Other"> + Autre + </string> + <string name="Any"> + Aucun + </string> + <string name="You"> + Vous + </string> + <string name=":"> + : + </string> + <string name=","> + , + </string> + <string name="..."> + ... + </string> + <string name="***"> + *** + </string> + <string name="("> + ( + </string> + <string name=")"> + ) + </string> + <string name="."> + . + </string> + <string name="'"> + ' + </string> + <string name="---"> + --- + </string> + <string name="MBCmdLineError"> + Une erreur est survenue lors de la lecture de la ligne de commande. +Merci de consulter : http://wiki.secondlife.com/wiki/Client_parameters +Erreur : + </string> + <string name="MBCmdLineUsg"> + [APP_NAME] Utilisation de la ligne de commande : + </string> + <string name="MBUnableToAccessFile"> + [APP_NAME] ne peut accéder à un fichier requis. + +Cela vient du fait que quelqu'un a ouvert plusieurs copies ou que votre système pense qu'un fichier est ouvert. +Si ce message persiste, veuillez redémarrer votre ordinateur. +Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME]. + </string> + <string name="MBFatalError"> + Erreur fatale + </string> + <string name="MBRequiresAltiVec"> + [APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure). + </string> + <string name="MBAlreadyRunning"> + [APP_NAME] est déjà lancé. +Vérifiez si une version minimisée du programme apparaît dans votre barre de tâches. +Si ce message persiste, redémarrez votre ordinateur. + </string> + <string name="MBFrozenCrashed"> + [APP_NAME] semble avoir crashé lors de l'utilisation précédente. +Voulez-vous envoyer un rapport de crash ? + </string> + <string name="MBAlert"> + Alerte + </string> + <string name="MBNoDirectX"> + [APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure. +[APP_NAME] utilise DirectX pour détecter les matériels et/ou les pilotes qui ne sont pas à jour et peuvent causer des problèmes de stabilité, de performance, ou des plantages. Bien que vous puissiez utiliser [APP_NAME] sans DirectX, nous vous recommandons de l'utiliser avec DirectX 9.0b. + +Voulez-vous continuer ? + </string> + <string name="MBWarning"> + Avertissement + </string> + <string name="MBNoAutoUpdate"> + Les mises à jour automatiques n'existent pas encore pour Linux. +Veuillez télécharger la dernière version sur www.secondlife.com. + </string> + <string name="MBRegClassFailed"> + RegisterClass a échoué + </string> + <string name="MBError"> + Erreur + </string> + <string name="MBFullScreenErr"> + Impossible d'ouvrir le mode plein écran de [WIDTH] x [HEIGHT] +Utilisation du mode fenêtré. + </string> + <string name="MBDestroyWinFailed"> + Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() failed)) + </string> + <string name="MBShutdownErr"> + Erreur de fermeture + </string> + <string name="MBDevContextErr"> + Impossible de créer le contexte GL + </string> + <string name="MBPixelFmtErr"> + Impossible de trouver le format pixel approprié + </string> + <string name="MBPixelFmtDescErr"> + Impossible de trouver la description du format pixel + </string> + <string name="MBTrueColorWindow"> + [APP_NAME] nécessite que True Color (32-bit) soit exécuté dans une fenêtre. +Veuillez allez sous Panneau de configuration > Affichage > Paramètres et régler la couleur de l'écran sur 32-bit. +Sinon, lorsque vous choisissez le mode plein écran, [APP_NAME] ajustera automatiquement l'écran à chaque utilisation. + </string> + <string name="MBAlpha"> + [APP_NAME] ne peut pas être lancé car il n'y pas de channel 8 bit accessible. En général, ceci vient de problèmes avec le pilote de la carte vidéo. +Assurez-vous d'avoir installé le pilote de carte vidéo le plus récent possible. + Assurez-vous aussi que votre écran est réglé sur True Clor (22-bit) sous Panneau de configuration > Affichage > Paramètres. +Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. + </string> + <string name="MBPixelFmtSetErr"> + Impossible de trouver le format pixel approprié + </string> + <string name="MBGLContextErr"> + Impossible de créer le contexte de rendu GL + </string> + <string name="MBGLContextActErr"> + Impossible d'activer le contexte de rendu GL + </string> + <string name="MBVideoDrvErr"> + [APP_NAME] ne peut pas être exécuté car les pilotes de votre carte vidéo n'ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d'avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les. + +Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. + </string> + <string name="5 O'Clock Shadow"> + Barbe naissante + </string> + <string name="All White"> + Tout blancs + </string> + <string name="Anime Eyes"> + Grand yeux + </string> + <string name="Arced"> + Arquées + </string> + <string name="Arm Length"> + Longueur des bras + </string> + <string name="Attached"> + Minces + </string> + <string name="Attached Earlobes"> + Largeur des lobes + </string> + <string name="Back Bangs"> + Mèches de derrière + </string> + <string name="Back Bangs Down"> + Mèches de derrière Bas + </string> + <string name="Back Bangs Up"> + Mèches de derrière haut + </string> + <string name="Back Fringe"> + Mèches de derrière + </string> + <string name="Back Hair"> + Cheveux de derrière + </string> + <string name="Back Hair Down"> + Cheveux de derrière Bas + </string> + <string name="Back Hair Up"> + Cheveux de derrière haut + </string> + <string name="Baggy"> + Cernés + </string> + <string name="Bangs"> + Frange + </string> + <string name="Bangs Down"> + Frange Bas + </string> + <string name="Bangs Up"> + Frange Haut + </string> + <string name="Beady Eyes"> + Yeux perçants + </string> + <string name="Belly Size"> + Taille du ventre + </string> + <string name="Big"> + Gros + </string> + <string name="Big Butt"> + Grosses fesses + </string> + <string name="Big Eyeball"> + Gros globe oculaire + </string> + <string name="Big Hair Back"> + Cheveux volumineux : Derrière + </string> + <string name="Big Hair Front"> + Cheveux volumineux : Devant + </string> + <string name="Big Hair Top"> + Cheveux volumineux : En haut + </string> + <string name="Big Head"> + Grosse tête + </string> + <string name="Big Pectorals"> + Gros pectoraux + </string> + <string name="Big Spikes"> + Spikes + </string> + <string name="Black"> + Noir + </string> + <string name="Blonde"> + Blond + </string> + <string name="Blonde Hair"> + Cheveux blonds + </string> + <string name="Blush"> + Blush + </string> + <string name="Blush Color"> + Couleur du blush + </string> + <string name="Blush Opacity"> + Opacité du blush + </string> + <string name="Body Definition"> + Contour du corps + </string> + <string name="Body Fat"> + Graisse + </string> + <string name="Body Freckles"> + Grains de beauté + </string> + <string name="Body Thick"> + Corps épais + </string> + <string name="Body Thickness"> + Épaisseur du corps + </string> + <string name="Body Thin"> + Corps mince + </string> + <string name="Bow Legged"> + Jambes arquées + </string> + <string name="Breast Buoyancy"> + Hauteur des seins + </string> + <string name="Breast Cleavage"> + Clivage + </string> + <string name="Breast Size"> + Taille des seins + </string> + <string name="Bridge Width"> + Arête du nez + </string> + <string name="Broad"> + Large + </string> + <string name="Brow Size"> + Taille des sourcils + </string> + <string name="Bug Eyes"> + Yeux globuleux + </string> + <string name="Bugged Eyes"> + Yeux globuleux + </string> + <string name="Bulbous"> + En bulbe + </string> + <string name="Bulbous Nose"> + Nez en bulbe + </string> + <string name="Bushy Eyebrows"> + Sourcils touffus + </string> + <string name="Bushy Hair"> + Cheveux touffus + </string> + <string name="Butt Size"> + Taille des fesses + </string> + <string name="bustle skirt"> + Jupe gonflante + </string> + <string name="no bustle"> + Pas gonflante + </string> + <string name="more bustle"> + Plus gonflante + </string> + <string name="Chaplin"> + Chaplin + </string> + <string name="Cheek Bones"> + Pommettes + </string> + <string name="Chest Size"> + Taille de la poitrine + </string> + <string name="Chin Angle"> + Angle du menton + </string> + <string name="Chin Cleft"> + Fente labiale + </string> + <string name="Chin Curtains"> + Favoris + </string> + <string name="Chin Depth"> + Profondeur du menton + </string> + <string name="Chin Heavy"> + Menton lourd + </string> + <string name="Chin In"> + Menton rentré + </string> + <string name="Chin Out"> + Menton sorti + </string> + <string name="Chin-Neck"> + Menton-cou + </string> + <string name="Clear"> + Effacer + </string> + <string name="Cleft"> + Fente + </string> + <string name="Close Set Eyes"> + Yeux rapprochés + </string> + <string name="Closed"> + Fermé(s) + </string> + <string name="Closed Back"> + Fermé à l'arrière + </string> + <string name="Closed Front"> + Fermé devant + </string> + <string name="Closed Left"> + Fermé à gauche + </string> + <string name="Closed Right"> + Fermé à droite + </string> + <string name="Coin Purse"> + Bijoux de famille + </string> + <string name="Collar Back"> + Col arrière + </string> + <string name="Collar Front"> + Col devant + </string> + <string name="Corner Down"> + Coin vers le bas + </string> + <string name="Corner Normal"> + Coin normal + </string> + <string name="Corner Up"> + Coin vers le haut + </string> + <string name="Creased"> + Frippée + </string> + <string name="Crooked Nose"> + Nez en bec d'aigle + </string> + <string name="Cropped Hair"> + Garçonne + </string> + <string name="Cuff Flare"> + Jambe + </string> + <string name="Dark"> + Sombre + </string> + <string name="Dark Green"> + Vert foncé + </string> + <string name="Darker"> + Plus foncé + </string> + <string name="Deep"> + Profonde + </string> + <string name="Default Heels"> + Talons par défaut + </string> + <string name="Default Toe"> + Orteil par défaut + </string> + <string name="Dense"> + Dense + </string> + <string name="Dense hair"> + Cheveux denses + </string> + <string name="Double Chin"> + Double menton + </string> + <string name="Downturned"> + Pointant vers le bas + </string> + <string name="Duffle Bag"> + Membre viril + </string> + <string name="Ear Angle"> + Angle de l'oreille + </string> + <string name="Ear Size"> + Taille de l'oreille + </string> + <string name="Ear Tips"> + Pointes de l'oreille + </string> + <string name="Egg Head"> + Forme de la tête + </string> + <string name="Eye Bags"> + Cernes + </string> + <string name="Eye Color"> + Couleur des yeux + </string> + <string name="Eye Depth"> + Profondeur des yeux + </string> + <string name="Eye Lightness"> + Clarté des yeux + </string> + <string name="Eye Opening"> + Ouverture des yeux + </string> + <string name="Eye Pop"> + Å’il proéminent + </string> + <string name="Eye Size"> + Taille de l'Å“il + </string> + <string name="Eye Spacing"> + Espacement des yeux + </string> + <string name="Eyeball Size"> + Taille du globe oculaire + </string> + <string name="Eyebrow Arc"> + Arc des sourcils + </string> + <string name="Eyebrow Density"> + Épaisseur des sourcils + </string> + <string name="Eyebrow Height"> + Hauteur des sourcils + </string> + <string name="Eyebrow Points"> + Direction des sourcils + </string> + <string name="Eyebrow Size"> + Taille des sourcils + </string> + <string name="Eyelash Length"> + Longueur des cils + </string> + <string name="Eyeliner"> + Eyeliner + </string> + <string name="Eyeliner Color"> + Couleur de l'eyeliner + </string> + <string name="Eyes Back"> + Yeux noirs + </string> + <string name="Eyes Bugged"> + Yeux globuleux + </string> + <string name="Eyes Forward"> + Yeux vers l'avant + </string> + <string name="Eyes Long Head"> + Yeux longue tête + </string> + <string name="Eyes Shear Left Up"> + Å’il gauche vers le haut + </string> + <string name="Eyes Shear Right Up"> + Å’il droit vers le haut + </string> + <string name="Eyes Short Head"> + Yeux petite tête + </string> + <string name="Eyes Spread"> + Espacement des yeux + </string> + <string name="Eyes Sunken"> + Yeux enfoncés + </string> + <string name="Eyes Together"> + Yeux rapprochés + </string> + <string name="Face Shear"> + Visage + </string> + <string name="Facial Definition"> + Définition du visage + </string> + <string name="Far Set Eyes"> + Yeux écartés + </string> + <string name="Fat"> + Grosse + </string> + <string name="Fat Head"> + Grosse tête + </string> + <string name="Fat Lips"> + Lèvres épaisses + </string> + <string name="Fat Lower"> + Inférieure plus épaisse + </string> + <string name="Fat Lower Lip"> + Lèvre inférieure épaisse + </string> + <string name="Fat Torso"> + Torse épais + </string> + <string name="Fat Upper"> + Supérieure plus épaisse + </string> + <string name="Fat Upper Lip"> + Lèvre supérieure épaisse + </string> + <string name="Female"> + Femme + </string> + <string name="Fingerless"> + Sans doigts + </string> + <string name="Fingers"> + Doigts + </string> + <string name="Flared Cuffs"> + Jambes larges + </string> + <string name="Flat"> + Plat + </string> + <string name="Flat Butt"> + Fesses plates + </string> + <string name="Flat Head"> + Tête plate + </string> + <string name="Flat Toe"> + Orteil plat + </string> + <string name="Foot Size"> + Pointure + </string> + <string name="Forehead Angle"> + Angle du front + </string> + <string name="Forehead Heavy"> + Front lourd + </string> + <string name="Freckles"> + Tâches de rousseur + </string> + <string name="Front Bangs Down"> + Mèches de devant longues + </string> + <string name="Front Bangs Up"> + Mèches de devant courtes + </string> + <string name="Front Fringe"> + Mèches de devant + </string> + <string name="Front Hair"> + Cheveux devant + </string> + <string name="Front Hair Down"> + Cheveux de devant longs + </string> + <string name="Front Hair Up"> + Cheveux de devant courts + </string> + <string name="Full Back"> + Arrière touffu + </string> + <string name="Full Eyeliner"> + Eyeliner marqué + </string> + <string name="Full Front"> + Devant touffu + </string> + <string name="Full Hair Sides"> + Côtés touffus + </string> + <string name="Full Sides"> + Côtés touffus + </string> + <string name="Glossy"> + Brillant + </string> + <string name="Glove Fingers"> + Doigts avec gants + </string> + <string name="Glove Length"> + Longueur des gants + </string> + <string name="Hair"> + Cheveux + </string> + <string name="Hair Back"> + Cheveux : Derrière + </string> + <string name="Hair Front"> + Cheveux : Devant + </string> + <string name="Hair Sides"> + Cheveux : Côtés + </string> + <string name="Hair Sweep"> + Sens de la coiffure + </string> + <string name="Hair Thickess"> + Épaisseur des cheveux + </string> + <string name="Hair Thickness"> + Épaisseur des cheveux + </string> + <string name="Hair Tilt"> + Inclinaison des cheveux + </string> + <string name="Hair Tilted Left"> + Vers la gauche + </string> + <string name="Hair Tilted Right"> + Vers la droite + </string> + <string name="Hair Volume"> + Cheveux : Volume + </string> + <string name="Hand Size"> + Taille de la main + </string> + <string name="Handlebars"> + Guidons + </string> + <string name="Head Length"> + Longueur de la tête + </string> + <string name="Head Shape"> + Forme de la tête + </string> + <string name="Head Size"> + Taille de la tête + </string> + <string name="Head Stretch"> + Allongement de la tête + </string> + <string name="Heel Height"> + Hauteur des talons + </string> + <string name="Heel Shape"> + Forme des talons + </string> + <string name="Height"> + Taille + </string> + <string name="High"> + Haut + </string> + <string name="High Heels"> + Talons hauts + </string> + <string name="High Jaw"> + Mâchoire haute + </string> + <string name="High Platforms"> + Plateformes hautes + </string> + <string name="High and Tight"> + Haut et serré + </string> + <string name="Higher"> + Plus élevé + </string> + <string name="Hip Length"> + Longueur hanche + </string> + <string name="Hip Width"> + Largeur hanche + </string> + <string name="In"> + In + </string> + <string name="In Shdw Color"> + Couleur ombre interne + </string> + <string name="In Shdw Opacity"> + Opacité ombre interne + </string> + <string name="Inner Eye Corner"> + Coin de l'Å“il interne + </string> + <string name="Inner Eye Shadow"> + Ombre de l'Å“il interne + </string> + <string name="Inner Shadow"> + Ombre interne + </string> + <string name="Jacket Length"> + Longueur de la veste + </string> + <string name="Jacket Wrinkles"> + Plis de la veste + </string> + <string name="Jaw Angle"> + Angle de la mâchoire + </string> + <string name="Jaw Jut"> + saillie de la mâchoire + </string> + <string name="Jaw Shape"> + Forme de la mâchoire + </string> + <string name="Join"> + Rapprochés + </string> + <string name="Jowls"> + Bajoues + </string> + <string name="Knee Angle"> + Angle du genou + </string> + <string name="Knock Kneed"> + Genoux rapprochés + </string> + <string name="Large"> + Grande + </string> + <string name="Large Hands"> + Grandes mains + </string> + <string name="Left Part"> + Raie à gauche + </string> + <string name="Leg Length"> + Longueur de la jambe + </string> + <string name="Leg Muscles"> + Muscles de la jambe + </string> + <string name="Less"> + Moins + </string> + <string name="Less Body Fat"> + Moins de graisse + </string> + <string name="Less Curtains"> + Moins + </string> + <string name="Less Freckles"> + Moins + </string> + <string name="Less Full"> + Moins + </string> + <string name="Less Gravity"> + Moins + </string> + <string name="Less Love"> + Moins + </string> + <string name="Less Muscles"> + Moins + </string> + <string name="Less Muscular"> + Moins + </string> + <string name="Less Rosy"> + Moins + </string> + <string name="Less Round"> + Moins + </string> + <string name="Less Saddle"> + Moins + </string> + <string name="Less Square"> + Moins + </string> + <string name="Less Volume"> + Moins + </string> + <string name="Less soul"> + Moins + </string> + <string name="Lighter"> + Plus léger + </string> + <string name="Lip Cleft"> + Fente labiale + </string> + <string name="Lip Cleft Depth"> + Profondeur de la fente labiale + </string> + <string name="Lip Fullness"> + Volume des lèvres + </string> + <string name="Lip Pinkness"> + Rougeur des lèvres + </string> + <string name="Lip Ratio"> + Proportion des lèvres + </string> + <string name="Lip Thickness"> + Épaisseur des lèvres + </string> + <string name="Lip Width"> + Largeur des lèvres + </string> + <string name="Lipgloss"> + Brillant à lèvres + </string> + <string name="Lipstick"> + Rouge à lèvres + </string> + <string name="Lipstick Color"> + Couleur du rouge à lèvres + </string> + <string name="Long"> + Long + </string> + <string name="Long Head"> + Tête longue + </string> + <string name="Long Hips"> + Hanches longues + </string> + <string name="Long Legs"> + Jambes longues + </string> + <string name="Long Neck"> + Long cou + </string> + <string name="Long Pigtails"> + Longues couettes + </string> + <string name="Long Ponytail"> + Longue queue de cheval + </string> + <string name="Long Torso"> + Torse long + </string> + <string name="Long arms"> + Longs bras + </string> + <string name="Longcuffs"> + Manches longues + </string> + <string name="Loose Pants"> + Pantalons amples + </string> + <string name="Loose Shirt"> + Chemise ample + </string> + <string name="Loose Sleeves"> + Manches amples + </string> + <string name="Love Handles"> + Poignées d'amour + </string> + <string name="Low"> + Bas + </string> + <string name="Low Heels"> + Talons bas + </string> + <string name="Low Jaw"> + Mâchoire basse + </string> + <string name="Low Platforms"> + Plateformes basses + </string> + <string name="Low and Loose"> + Bas et ample + </string> + <string name="Lower"> + Abaisser + </string> + <string name="Lower Bridge"> + Arête plus basse + </string> + <string name="Lower Cheeks"> + Joues plus basses + </string> + <string name="Male"> + Homme + </string> + <string name="Middle Part"> + Raie au milieu + </string> + <string name="More"> + Plus + </string> + <string name="More Blush"> + Plus + </string> + <string name="More Body Fat"> + Plus + </string> + <string name="More Curtains"> + Plus + </string> + <string name="More Eyeshadow"> + Plus + </string> + <string name="More Freckles"> + Plus + </string> + <string name="More Full"> + Plus + </string> + <string name="More Gravity"> + Plus + </string> + <string name="More Lipstick"> + Plus + </string> + <string name="More Love"> + Plus + </string> + <string name="More Lower Lip"> + Plus + </string> + <string name="More Muscles"> + Plus + </string> + <string name="More Muscular"> + Plus + </string> + <string name="More Rosy"> + Plus + </string> + <string name="More Round"> + Plus + </string> + <string name="More Saddle"> + Plus + </string> + <string name="More Sloped"> + Plus + </string> + <string name="More Square"> + Plus + </string> + <string name="More Upper Lip"> + Plus + </string> + <string name="More Vertical"> + Plus + </string> + <string name="More Volume"> + Plus + </string> + <string name="More soul"> + Plus + </string> + <string name="Moustache"> + Moustache + </string> + <string name="Mouth Corner"> + Coin de la bouche + </string> + <string name="Mouth Position"> + Position de la bouche + </string> + <string name="Mowhawk"> + Mowhawk + </string> + <string name="Muscular"> + Musclé + </string> + <string name="Mutton Chops"> + Rouflaquettes + </string> + <string name="Nail Polish"> + Vernis à ongles + </string> + <string name="Nail Polish Color"> + Couleur du vernis + </string> + <string name="Narrow"> + Étroit + </string> + <string name="Narrow Back"> + Arrière étroit + </string> + <string name="Narrow Front"> + Devant étroit + </string> + <string name="Narrow Lips"> + Lèvres étroites + </string> + <string name="Natural"> + Naturel + </string> + <string name="Neck Length"> + Longueur du cou + </string> + <string name="Neck Thickness"> + Épaisseur du cou + </string> + <string name="No Blush"> + Pas de blush + </string> + <string name="No Eyeliner"> + Pas de eyeliner + </string> + <string name="No Eyeshadow"> + Pas d'ombre à paupières + </string> + <string name="No Heels"> + Pas de talons + </string> + <string name="No Lipgloss"> + Pas de brillant à lèvres + </string> + <string name="No Lipstick"> + Pas de rouge à lèvres + </string> + <string name="No Part"> + Pas de raie + </string> + <string name="No Polish"> + Pas de vernis + </string> + <string name="No Red"> + Pas de rouge + </string> + <string name="No Spikes"> + Pas de spikes + </string> + <string name="No White"> + Pas de blanc + </string> + <string name="No Wrinkles"> + Pas de rides + </string> + <string name="Normal Lower"> + Normal plus bas + </string> + <string name="Normal Upper"> + Normal plus haut + </string> + <string name="Nose Left"> + Nez à gauche + </string> + <string name="Nose Right"> + Nez à droite + </string> + <string name="Nose Size"> + Taille du nez + </string> + <string name="Nose Thickness"> + Épaisseur du nez + </string> + <string name="Nose Tip Angle"> + Angle du bout du nez + </string> + <string name="Nose Tip Shape"> + Forme du bout du nez + </string> + <string name="Nose Width"> + Largeur du nez + </string> + <string name="Nostril Division"> + Division des narines + </string> + <string name="Nostril Width"> + Largeur des narines + </string> + <string name="Old"> + Vieux + </string> + <string name="Opaque"> + Opaque + </string> + <string name="Open"> + Ouvert + </string> + <string name="Open Back"> + Derrière ouvert + </string> + <string name="Open Front"> + Devant ouvert + </string> + <string name="Open Left"> + Ouvert à gauche + </string> + <string name="Open Right"> + Ouvert à droite + </string> + <string name="Orange"> + Orange + </string> + <string name="Out"> + Dehors + </string> + <string name="Out Shdw Color"> + Couleur de l'ombre externe + </string> + <string name="Out Shdw Opacity"> + Opacité de l'ombre externe + </string> + <string name="Outer Eye Corner"> + Coin de l'Å“il externe + </string> + <string name="Outer Eye Shadow"> + Ombre de l'Å“il externe + </string> + <string name="Outer Shadow"> + Ombre externe + </string> + <string name="Overbite"> + Chevauchement + </string> + <string name="Package"> + Parties + </string> + <string name="Painted Nails"> + Ongles vernis + </string> + <string name="Pale"> + Pâle + </string> + <string name="Pants Crotch"> + Entrejambe + </string> + <string name="Pants Fit"> + Taille + </string> + <string name="Pants Length"> + Longueur + </string> + <string name="Pants Waist"> + Taille + </string> + <string name="Pants Wrinkles"> + Plis + </string> + <string name="Part"> + Raie + </string> + <string name="Part Bangs"> + Séparation de la frange + </string> + <string name="Pectorals"> + Pectoraux + </string> + <string name="Pigment"> + Pigmentation + </string> + <string name="Pigtails"> + Couettes + </string> + <string name="Pink"> + Rose + </string> + <string name="Pinker"> + Plus rose + </string> + <string name="Platform Height"> + Hauteur de la plateforme + </string> + <string name="Platform Width"> + Largeur de la plateforme + </string> + <string name="Pointy"> + Pointu + </string> + <string name="Pointy Heels"> + Talons pointus + </string> + <string name="Pointy Toe"> + Orteil pointu + </string> + <string name="Ponytail"> + Queue de cheval + </string> + <string name="Poofy Skirt"> + Jupe bouffante + </string> + <string name="Pop Left Eye"> + Å’il gauche saillant + </string> + <string name="Pop Right Eye"> + Å’il droit saillant + </string> + <string name="Puffy"> + Gonflé + </string> + <string name="Puffy Eyelids"> + Paupières gonflées + </string> + <string name="Rainbow Color"> + Couleur de l'arc en ciel + </string> + <string name="Red Hair"> + Cheveux roux + </string> + <string name="Red Skin"> + Peau rouge + </string> + <string name="Regular"> + Standard + </string> + <string name="Regular Muscles"> + Muscles normaux + </string> + <string name="Right Part"> + Raie à droite + </string> + <string name="Rosy Complexion"> + Teint rosé + </string> + <string name="Round"> + Rond + </string> + <string name="Round Forehead"> + Front rond + </string> + <string name="Ruddiness"> + Rougeur + </string> + <string name="Ruddy"> + Rouge + </string> + <string name="Rumpled Hair"> + Texture + </string> + <string name="Saddle Bags"> + Culotte de cheval + </string> + <string name="Saddlebags"> + Culotte de cheval + </string> + <string name="Scrawny"> + Maigre + </string> + <string name="Scrawny Leg"> + Jambes maigres + </string> + <string name="Separate"> + Séparés + </string> + <string name="Shading"> + Dégradé + </string> + <string name="Shadow hair"> + Cheveux + </string> + <string name="Shallow"> + Creux + </string> + <string name="Shear Back"> + Coupe derrière + </string> + <string name="Shear Face"> + Visage + </string> + <string name="Shear Front"> + Devant dégagé + </string> + <string name="Shear Left"> + Gauche dégagée + </string> + <string name="Shear Left Up"> + Haut gauche dégagé + </string> + <string name="Shear Right"> + Droite dégagée + </string> + <string name="Shear Right Up"> + Haut droit dégagé + </string> + <string name="Sheared Back"> + Dégagé derrière + </string> + <string name="Sheared Front"> + Dégagé devant + </string> + <string name="Shift Left"> + Déplacer vers la gauche + </string> + <string name="Shift Mouth"> + Déplacer la bouche + </string> + <string name="Shift Right"> + Déplacer vers la droite + </string> + <string name="Shirt Bottom"> + Chemise + </string> + <string name="Shirt Fit"> + Taille + </string> + <string name="Shirt Wrinkles"> + Plis + </string> + <string name="Shoe Height"> + Hauteur de la chaussure + </string> + <string name="Short"> + Court + </string> + <string name="Short Arms"> + Bras courts + </string> + <string name="Short Legs"> + Jambes courtes + </string> + <string name="Short Neck"> + Petit cou + </string> + <string name="Short Pigtails"> + Couettes courtes + </string> + <string name="Short Ponytail"> + Queue de cheval courte + </string> + <string name="Short Sideburns"> + Favoris courts + </string> + <string name="Short Torso"> + Torse court + </string> + <string name="Short hips"> + Hanches courtes + </string> + <string name="Shoulders"> + Épaules + </string> + <string name="Side Bangs"> + Mèches sur le côté + </string> + <string name="Side Bangs Down"> + Mèches sur le côté en bas + </string> + <string name="Side Bangs Up"> + Mèches sur le côté en haut + </string> + <string name="Side Fringe"> + Frange sur le côté + </string> + <string name="Sideburns"> + Favoris + </string> + <string name="Sides Hair"> + Cheveux sur le côté + </string> + <string name="Sides Hair Down"> + Cheveux sur le côté en bas + </string> + <string name="Sides Hair Up"> + Cheveux sur le côté en haut + </string> + <string name="Skinny"> + Maigre + </string> + <string name="Skinny Neck"> + Cou maigre + </string> + <string name="Skirt Fit"> + Taille de la jupe + </string> + <string name="Skirt Length"> + Longueur de la jupe + </string> + <string name="Slanted Forehead"> + Front incliné + </string> + <string name="Sleeve Length"> + Longueur de la manche + </string> + <string name="Sleeve Looseness"> + Ampleur de la manche + </string> + <string name="Slit Back"> + Fente : Derrière + </string> + <string name="Slit Front"> + Fente : Devant + </string> + <string name="Slit Left"> + Fente : Gauche + </string> + <string name="Slit Right"> + Fente : Droite + </string> + <string name="Small"> + Petite + </string> + <string name="Small Hands"> + Petites mains + </string> + <string name="Small Head"> + Petite tête + </string> + <string name="Smooth"> + Lisse + </string> + <string name="Smooth Hair"> + Cheveux lisses + </string> + <string name="Socks Length"> + Longueur des chaussettes + </string> + <string name="Some"> + Quelques un(e)s + </string> + <string name="Soulpatch"> + Soulpatch + </string> + <string name="Sparse"> + Rares + </string> + <string name="Spiked Hair"> + Mèches en pointe + </string> + <string name="Square"> + Carré + </string> + <string name="Square Toe"> + Orteil carré + </string> + <string name="Squash Head"> + Écraser la tête + </string> + <string name="Squash/Stretch Head"> + Allonger/écraser la tête + </string> + <string name="Stretch Head"> + Allonger la tête + </string> + <string name="Sunken"> + Enfoncées + </string> + <string name="Sunken Chest"> + Poitrine enfoncée + </string> + <string name="Sunken Eyes"> + Yeux enfoncés + </string> + <string name="Sweep Back"> + En arrière + </string> + <string name="Sweep Forward"> + Vers l'avant + </string> + <string name="Swept Back"> + En arrière + </string> + <string name="Swept Back Hair"> + Cheveux en arrière + </string> + <string name="Swept Forward"> + Vers l'avant + </string> + <string name="Swept Forward Hair"> + Cheveux vers l''avant + </string> + <string name="Tall"> + Grand + </string> + <string name="Taper Back"> + Biseauter à l'arrière + </string> + <string name="Taper Front"> + Biseauter à l'avant + </string> + <string name="Thick Heels"> + Talons épais + </string> + <string name="Thick Neck"> + Cou épais + </string> + <string name="Thick Toe"> + Orteil épais + </string> + <string name="Thickness"> + Épaisseur + </string> + <string name="Thin"> + Fins + </string> + <string name="Thin Eyebrows"> + Sourcils fins + </string> + <string name="Thin Lips"> + Lèvres fines + </string> + <string name="Thin Nose"> + Nez fin + </string> + <string name="Tight Chin"> + Menton fin + </string> + <string name="Tight Cuffs"> + Jambes serrées + </string> + <string name="Tight Pants"> + Pantalons serrés + </string> + <string name="Tight Shirt"> + Chemise serrée + </string> + <string name="Tight Skirt"> + Jupe serrée + </string> + <string name="Tight Sleeves"> + Manches serrées + </string> + <string name="Tilt Left"> + Pencher sur la gauche + </string> + <string name="Tilt Right"> + Pencher sur la droite + </string> + <string name="Toe Shape"> + Forme de l'orteil + </string> + <string name="Toe Thickness"> + Épaisseur de l'orteil + </string> + <string name="Torso Length"> + Longueur du torse + </string> + <string name="Torso Muscles"> + Muscles du torse + </string> + <string name="Torso Scrawny"> + Torse maigre + </string> + <string name="Unattached"> + Séparés + </string> + <string name="Uncreased"> + Lisse + </string> + <string name="Underbite"> + Rentré + </string> + <string name="Unnatural"> + Artificiel + </string> + <string name="Upper Bridge"> + Arête supérieure + </string> + <string name="Upper Cheeks"> + Pommettes + </string> + <string name="Upper Chin Cleft"> + Fente du menton supérieure + </string> + <string name="Upper Eyelid Fold"> + Paupière supérieure + </string> + <string name="Upturned"> + En trompette + </string> + <string name="Very Red"> + Très rouge + </string> + <string name="Waist Height"> + Hauteur de la taille + </string> + <string name="Well-Fed"> + Bien nourri + </string> + <string name="White Hair"> + Cheveux blancs + </string> + <string name="Wide"> + Large + </string> + <string name="Wide Back"> + Dos large + </string> + <string name="Wide Front"> + Devant large + </string> + <string name="Wide Lips"> + Lèvres larges + </string> + <string name="Wild"> + Revêche + </string> + <string name="Wrinkles"> + Rides + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + Ajouter à mes repères + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + Modifier mes repères + </string> + <string name="UpdaterWindowTitle"> + [APP_NAME] Mettre à jour + </string> + <string name="UpdaterNowUpdating"> + En train de charger [APP_NAME]... + </string> + <string name="UpdaterNowInstalling"> + En train d'installer [APP_NAME]... + </string> + <string name="UpdaterUpdatingDescriptive"> + Le client [APP_NAME] est en train d'être mis à jour. Cela peut prendre un certain temps, merci de votre patience. + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + Mise à jour en cours... + </string> + <string name="UpdaterProgressBarText"> + Mise à jour en cours + </string> + <string name="UpdaterFailDownloadTitle"> + Le téléchargement de la mise à jour a échoué + </string> + <string name="UpdaterFailUpdateDescriptive"> + Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez télécharger la dernière version sur www.secondlife.com. + </string> + <string name="UpdaterFailInstallTitle"> + L'installation de la mise à jour a échoué + </string> + <string name="UpdaterFailStartTitle"> + Impossible de lancer le client + </string> + <string name="only_user_message"> + Vous êtes le seul participant à cette session. + </string> + <string name="offline_message"> + [FIRST] [LAST] est déconnecté(e). + </string> + <string name="invite_message"> + Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME]. + </string> + <string name="generic_request_error"> + Erreur lors de la requête, veuillez réessayer ultérieurement. + </string> + <string name="insufficient_perms_error"> + Vous n'avez pas les droits requis. + </string> + <string name="session_does_not_exist_error"> + La session a expiré + </string> + <string name="no_ability_error"> + Vous n'avez pas ce pouvoir. + </string> + <string name="no_ability"> + Vous n'avez pas ce pouvoir. + </string> + <string name="not_a_mod_error"> + Vous n'êtes pas modérateur de session. + </string> + <string name="muted_error"> + Un modérateur de groupe a désactivé votre chat écrit. + </string> + <string name="add_session_event"> + Impossible d'ajouter des participants à la session de chat avec [RECIPIENT]. + </string> + <string name="message_session_event"> + Impossible d'envoyer votre message à la session de chat avec [RECIPIENT]. + </string> + <string name="removed_from_group"> + Vous avez été supprimé du groupe. + </string> + <string name="close_on_no_ability"> + Vous ne pouvez plus participer à la session de chat. + </string> +</strings> diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml index 810a32f64ec..1315a4b1004 100644 --- a/indra/newview/skins/default/xui/fr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml @@ -1,77 +1,77 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<teleport_messages name=""> - <message_set name="errors"> - <message name="invalid_tport"> - Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir être téléporté. Si vous continuez à recevoir ce message, veuillez consulter le Support à  la page suivante : -www.secondlife.com/support - </message> - <message name="invalid_region_handoff"> - Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir être téléporté. Si vous continuez à recevoir ce message, veuillez consulter le Support à  la page suivante : -www.secondlife.com/support - </message> - <message name="blocked_tport"> - Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment. -Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème. - </message> - <message name="nolandmark_tport"> - Désolé, le système n'a pas réussi à localiser la destination de votre repère. - </message> - <message name="timeout_tport"> - Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. -Veuillez réessayer dans un moment. - </message> - <message name="noaccess_tport"> - Désolé, vous n'avez pas accès à cette destination. - </message> - <message name="missing_attach_tport"> - Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter. - </message> - <message name="too_many_uploads_tport"> - Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée. - </message> - <message name="expired_tport"> - Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. - </message> - <message name="expired_region_handoff"> - Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. - </message> - <message name="no_host"> - Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes. - </message> - <message name="no_inventory_host"> - L'inventaire est temporairement indisponible. - </message> - </message_set> - <message_set name="progress"> - <message name="sending_dest"> - Envoi vers la destination en cours. - </message> - <message name="redirecting"> - Redirection vers un emplacement différent en cours. - </message> - <message name="relaying"> - Relai vers la destination en cours. - </message> - <message name="sending_home"> - Requête de la demande d'envoi vers votre domicile en cours. - </message> - <message name="sending_landmark"> - Requête de la demande d'envoi vers le repère en cours. - </message> - <message name="completing"> - Téléportation sur le point d'aboutir. - </message> - <message name="resolving"> - Destination en cours de résolution. - </message> - <message name="contacting"> - Contact avec la nouvelle région en cours. - </message> - <message name="arriving"> - Vous arrivez... - </message> - <message name="requesting"> - Demande de téléportation en cours... - </message> - </message_set> -</teleport_messages> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<teleport_messages name=""> + <message_set name="errors"> + <message name="invalid_tport"> + Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter. +Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. + </message> + <message name="invalid_region_handoff"> + Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir traverser des régions. +Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. + </message> + <message name="blocked_tport"> + Désolé, la téléportation est bloquée actuellement. Veuillez réessayer dans un moment. +Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis reconnectez-vous pour résoudre le problème. + </message> + <message name="nolandmark_tport"> + Désolé, le système n'a pas réussi à localiser la destination de votre repère. + </message> + <message name="timeout_tport"> + Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. +Veuillez réessayer dans un moment. + </message> + <message name="noaccess_tport"> + Désolé, vous n'avez pas accès à cette destination. + </message> + <message name="missing_attach_tport"> + Vos pieces-jointes ne sont pas encore arrivées. Attendez quelques secondes de plus ou déconnectez-vous puis reconnectez-vous avant d'essayer de vous téléporter. + </message> + <message name="too_many_uploads_tport"> + Le trafic vers cette région est bouché en ce moment. Votre téléportation ne pourra pas avoir lieu immédiatement. Veuillez réessayer dans quelques minutes ou bien aller dans une zone moins fréquentée. + </message> + <message name="expired_tport"> + Désolé, votre demande de téléportation n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. + </message> + <message name="expired_region_handoff"> + Désolé, votre demande pour passer dans une autre région n'a pas abouti assez rapidement. Veuillez réessayer dans quelques minutes. + </message> + <message name="no_host"> + Impossible de trouver la destination de la téléportation. Il est possible que cette destination soit temporairement indisponible ou qu'elle n'existe plus. Veuillez réessayer dans quelques minutes. + </message> + <message name="no_inventory_host"> + L'inventaire est temporairement indisponible. + </message> + </message_set> + <message_set name="progress"> + <message name="sending_dest"> + Envoi vers la destination en cours. + </message> + <message name="redirecting"> + Redirection vers un emplacement différent en cours. + </message> + <message name="relaying"> + Relai vers la destination en cours. + </message> + <message name="sending_home"> + Requête de la demande d'envoi vers votre domicile en cours. + </message> + <message name="sending_landmark"> + Requête de la demande d'envoi vers le repère en cours. + </message> + <message name="completing"> + Téléportation sur le point d'aboutir. + </message> + <message name="resolving"> + Destination en cours de résolution. + </message> + <message name="contacting"> + Contact avec la nouvelle région en cours. + </message> + <message name="arriving"> + Vous arrivez... + </message> + <message name="requesting"> + Demande de téléportation en cours... + </message> + </message_set> +</teleport_messages> diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml index 834d49e169b..07911c68b1f 100644 --- a/indra/newview/skins/default/xui/ja/floater_about.xml +++ b/indra/newview/skins/default/xui/ja/floater_about.xml @@ -1,43 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_about" title="[APP_NAME]ã«ã¤ã„ã¦"> -<tab_container name="about_tab"> - <panel name="credits_panel"> - <text_editor name="credits_editor"> - Second Lifeã¯ã€ Philipã€Tessaã€Andrewã€Coryã€Jamesã€Benã€Charã€Charlieã€Colinã€Danã€Danielã€Dougã€Ericã€Hamletã€Haneyã€Eveã€Hunterã€Ianã€Jeffã€Jenniferã€Jimã€Johnã€Leeã€Markã€Peterã€Phoenixã€Richardã€Robinã€Xenonã€Steveã€Tanyaã€Eddieã€Aviã€Frankã€Bruceã€Aaronã€Aliceã€Bobã€Debraã€Eileenã€Helenã€Janetã€Louieã€Leviathaniaã€Stefanã€Rayã€Kevinã€Tomã€Mikebã€MikeTã€Burgessã€Elenaã€Tracyã€Billã€Toddã€Ryanã€Zachã€Sarahã€Novaã€Timã€Stephanieã€Michaelã€Evanã€Nicolasã€Catherineã€Rachelleã€Daveã€Hollyã€Bubã€Kellyã€Magellanã€Ramziã€Donã€Sabinã€Jillã€Rheyaã€Jeskaã€Torleyã€Konaã€Callumã€Charityã€Ventrellaã€Jackã€Vektorã€Irisã€Chrisã€Nicoleã€Mickã€Reubenã€Blueã€Babbageã€Yedwabã€Deanaã€Laurenã€Brentã€Pathfinderã€Chadrickã€Altruimaã€Jesseã€Teenyã€Monroeã€Icculusã€Davidã€Tessã€Lizzieã€Patsyã€Isaacã€Lawrenceã€Cynã€Boã€Giaã€Annetteã€Mariusã€Tboneã€Jonathanã€Karenã€Ginsuã€Satokoã€Yukoã€Makikoã€Thomasã€Harryã€Sethã€Alexeiã€Brianã€Guyã€Runitaiã€Ethanã€Dataã€Corneliusã€Kennyã€Swissã€Zeroã€Natriaã€Wendyã€Stephenã€Teepleã€Thumperã€Lucyã€Deeã€Miaã€Lianaã€Warrenã€Brankaã€Auraã€beezã€Miloã€Hermiaã€Redã€Thraxã€Joeã€Sallyã€Magentaã€Moguraã€Paulã€Joseã€Rejeanã€Henrikã€Lexieã€Amberã€Loganã€Xanã€Noraã€Morpheusã€Donovanã€Leylaã€MichaelFrancisã€Beastã€Cubeã€Buckyã€Joshuaã€Stryfeã€Harmonyã€Teresaã€Claudiaã€Walkerã€Glennã€Fritzã€Fordakã€Juneã€Cleopetraã€Jeanã€Ivyã€Betsyã€Rooseveltã€Spikeã€Kenã€Whichã€Tofuã€Chiyoã€Robã€Zeeã€dustinã€Georgeã€Delã€Matthewã€Catã€Jacquiã€Lightfootã€Adrianã€Violaã€Alfredã€Noelã€Irfanã€Sunilã€Yoolã€Rikaã€Janeã€Xtremeã€Frontierã€a2ã€Neoã€Siobhanã€Yozã€Justinã€Elleã€Qarlã€Benjaminã€Isabelã€Gulliverã€Everettã€Christopherã€Izzyã€Stephanyã€Garryã€Sejongã€Seanã€Tobinã€Iridiumã€Metaã€Anthonyã€Jeremyã€JPã€Jakeã€Mauriceã€Madhaviã€Leopardã€Kyleã€Joonã€Kariã€Bertã€Belindaã€Jonã€Kristiã€Bridieã€Pramodã€KJã€Socratesã€Mariaã€Ivanã€Aricã€Yamasakiã€Adreanneã€Jayã€MitchKã€Cerenã€Cocoã€Durlã€Jennyã€Periapseã€Karticã€Storrsã€Lotteã€Sandyã€Rohnã€Colossusã€Zenã€BigPapiã€Bradã€Pastramiã€Kurzã€Maniã€Neuroã€Jaimeã€MJã€Rowanã€Sgtã€Elvisã€Geckoã€Samuelã€Sardonyxã€Leoã€Bryanã€Nikoã€Softã€Poppyã€Rachelã€Akiã€Angeloã€Banzaiã€Alexaã€Sueã€CeeLoã€Benderã€CGã€Gillianã€Pelleã€Nickã€Echoã€Zaraã€Christineã€Shamiranã€Emmaã€Blakeã€Keikoã€Plexusã€Joppaã€Sidewinderã€Ericaã€Ashleiã€Twilightã€Kristenã€Brettã€Qã€Enusã€Simonã€Bevisã€Kraftã€Kipã€Chandlerã€Ronã€LauraPã€Ramã€KyleJMã€Scouseã€Prosperoã€Melissaã€Martyã€Natã€Hamiltonã€Kendã€Lordanã€Jimmyã€Kosmoã€Seraphã€Greenã€Ekimã€Wiggoã€JTã€Romeã€Dorisã€Mizã€Benocã€Whumpã€Trinityã€Patchã€Kateã€TJã€Baoã€Joohwanã€Christyã€Sofiaã€Matiasã€Cogsworthã€Johanã€Orehã€Cheahã€Angelaã€Brandyã€Mangoã€Lanã€Aleksã€Gloriaã€Heidyã€Mitchellã€Spaceã€Coltonã€Bambersã€Einsteinã€Maggieã€Malbersã€Roseã€Winnieã€Stellaã€Miltonã€Rothmanã€Niallã€Marinã€Allisonã€Katieã€Dawnã€Kattã€Dustyã€Kalpanaã€Judyã€Andreaã€Ambroffã€Infinityã€Gailã€Ricoã€Raymondã€Yiã€Williamã€Christaã€Mã€Teaganã€Scoutã€Mollyã€Danteã€Corrã€Dynamikeã€Usiã€Kayleeã€Vidtutsã€Lilã€Danicaã€Saschaã€Kelvã€Jacobã€Nyaã€Rodneyã€Brandonã€Elsieã€Blondinã€Grantã€Katrinã€Nyxã€Gabrielã€Locklainnã€Claireã€Devinã€Minervaã€Montyã€Austinã€Bradfordã€Siã€Keiraã€Hã€Caitlinã€Ditaã€Makaiã€Jennã€Annã€Meredithã€Clareã€Joyã€Praveenã€Codyã€Edmundã€Rutheã€Sirenaã€Gayathriã€Spiderã€FJã€Davidoffã€Tianã€Jennieã€Louiseã€Oskarã€Landonã€Noelleã€Jarvã€Ingridã€Alã€Sommerã€Docã€Ariaã€Huinã€Grayã€Liliã€Virã€DJã€Yangã€Tã€Simoneã€Maestroã€Scottã€Charleneã€Quixoteã€Amandaã€Susanã€Zedã€Anneã€Enkiduã€Esbeeã€Joroanã€Katelinã€Roxieã€Tayã€Scarletã€Kevinã€Johnnyã€Wolfgangã€Andrenã€Bobã€Howardã€Merovã€Randã€Rayã€Michonã€Newellã€Galenã€Dessieã€Lesã€Michonã€Jenelleã€Geoã€Sizã€Shapiroã€Peteã€Calyleã€Seleneã€Allenã€Phoebeã€Goldinã€Kimmoraã€Dakotaã€Slatonã€Lindquistã€Zoeyã€Hariã€Othelloã€Rohitã€Sheldonã€Petraã€Vialeã€Gordonã€Kayeã€Pinkã€Fernyã€Emersonã€Davyã€Briã€Chanã€Juanã€Robertã€Terrenceã€Nathanã€Carlã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•ã‚Œã¾ã—ãŸã€‚ - - ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ã“ã‚Œã¾ã§ã§æœ€é«˜ã®ã‚‚ã®ã«ãªã‚‹ã‚ˆã†ã”å”力をã„ãŸã ã„ãŸä»¥ä¸‹ã®ä½äººã®çš†æ§˜ã«æ·±ãæ„Ÿè¬ã„ãŸã—ã¾ã™ã€‚ able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar - - - - ビジãƒã‚¹ã§æˆåŠŸã™ã‚‹ã«ã¯ã€å‹‡æ°—ã‚’æŒã£ã¦ã€èª°ã‚ˆã‚Šã‚‚å…ˆã«ã€äººã¨é•ã£ãŸã“ã¨ã‚’ã™ã‚‹ã“ã¨ã 。 --Henry Marchant - </text_editor> - </panel> - <panel name="licenses_panel"> - <text_editor name="credits_editor"> - 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion - APR Copyright (C) 2000-2004 The Apache Software Foundation - cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) - expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. - FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). - GL Copyright (C) 1999-2004 Brian Paul. - Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. - jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) - jpeglib Copyright (C) 1991-1998, Thomas G. Lane. - ogg/vorbis Copyright (C) 2001, Xiphophorus - OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. - SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga - SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - xmlrpc-epi Copyright (C) 2000 Epinions, Inc. - zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. - google-perftools Copyright (c) 2005, Google Inc. - - ç„¡æ–転写ã€è¤‡è£½ã€è»¢è¼‰ã‚’ç¦ã˜ã¾ã™ã€‚ 詳細ã¯licenses.txtã‚’å‚ç…§ã—ã¦ãã ã•ã„。 - - Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) - </text_editor> - </panel> -</tab_container> - <text name="you_are_at"> - [POSITION] - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="[APP_NAME]ã«ã¤ã„ã¦"> + <tab_container name="about_tab"> + <panel label="クレジット" name="credits_panel"> + <text_editor name="credits_editor"> + Second Lifeã¯ã€ Philipã€Tessaã€Andrewã€Coryã€Jamesã€Benã€Charã€Charlieã€Colinã€Danã€Danielã€Dougã€Ericã€Hamletã€Haneyã€Eveã€Hunterã€Ianã€Jeffã€Jenniferã€Jimã€Johnã€Leeã€Markã€Peterã€Phoenixã€Richardã€Robinã€Xenonã€Steveã€Tanyaã€Eddieã€Aviã€Frankã€Bruceã€Aaronã€Aliceã€Bobã€Debraã€Eileenã€Helenã€Janetã€Louieã€Leviathaniaã€Stefanã€Rayã€Kevinã€Tomã€Mikebã€MikeTã€Burgessã€Elenaã€Tracyã€Billã€Toddã€Ryanã€Zachã€Sarahã€Novaã€Timã€Stephanieã€Michaelã€Evanã€Nicolasã€Catherineã€Rachelleã€Daveã€Hollyã€Bubã€Kellyã€Magellanã€Ramziã€Donã€Sabinã€Jillã€Rheyaã€Jeskaã€Torleyã€Konaã€Callumã€Charityã€Ventrellaã€Jackã€Vektorã€Irisã€Chrisã€Nicoleã€Mickã€Reubenã€Blueã€Babbageã€Yedwabã€Deanaã€Laurenã€Brentã€Pathfinderã€Chadrickã€Altruimaã€Jesseã€Teenyã€Monroeã€Icculusã€Davidã€Tessã€Lizzieã€Patsyã€Isaacã€Lawrenceã€Cynã€Boã€Giaã€Annetteã€Mariusã€Tboneã€Jonathanã€Karenã€Ginsuã€Satokoã€Yukoã€Makikoã€Thomasã€Harryã€Sethã€Alexeiã€Brianã€Guyã€Runitaiã€Ethanã€Dataã€Corneliusã€Kennyã€Swissã€Zeroã€Natriaã€Wendyã€Stephenã€Teepleã€Thumperã€Lucyã€Deeã€Miaã€Lianaã€Warrenã€Brankaã€Auraã€beezã€Miloã€Hermiaã€Redã€Thraxã€Joeã€Sallyã€Magentaã€Moguraã€Paulã€Joseã€Rejeanã€Henrikã€Lexieã€Amberã€Loganã€Xanã€Noraã€Morpheusã€Donovanã€Leylaã€MichaelFrancisã€Beastã€Cubeã€Buckyã€Joshuaã€Stryfeã€Harmonyã€Teresaã€Claudiaã€Walkerã€Glennã€Fritzã€Fordakã€Juneã€Cleopetraã€Jeanã€Ivyã€Betsyã€Rooseveltã€Spikeã€Kenã€Whichã€Tofuã€Chiyoã€Robã€Zeeã€dustinã€Georgeã€Delã€Matthewã€Catã€Jacquiã€Lightfootã€Adrianã€Violaã€Alfredã€Noelã€Irfanã€Sunilã€Yoolã€Rikaã€Janeã€Xtremeã€Frontierã€a2ã€Neoã€Siobhanã€Yozã€Justinã€Elleã€Qarlã€Benjaminã€Isabelã€Gulliverã€Everettã€Christopherã€Izzyã€Stephanyã€Garryã€Sejongã€Seanã€Tobinã€Iridiumã€Metaã€Anthonyã€Jeremyã€JPã€Jakeã€Mauriceã€Madhaviã€Leopardã€Kyleã€Joonã€Kariã€Bertã€Belindaã€Jonã€Kristiã€Bridieã€Pramodã€KJã€Socratesã€Mariaã€Ivanã€Aricã€Yamasakiã€Adreanneã€Jayã€MitchKã€Cerenã€Cocoã€Durlã€Jennyã€Periapseã€Karticã€Storrsã€Lotteã€Sandyã€Rohnã€Colossusã€Zenã€BigPapiã€Bradã€Pastramiã€Kurzã€Maniã€Neuroã€Jaimeã€MJã€Rowanã€Sgtã€Elvisã€Geckoã€Samuelã€Sardonyxã€Leoã€Bryanã€Nikoã€Softã€Poppyã€Rachelã€Akiã€Angeloã€Banzaiã€Alexaã€Sueã€CeeLoã€Benderã€CGã€Gillianã€Pelleã€Nickã€Echoã€Zaraã€Christineã€Shamiranã€Emmaã€Blakeã€Keikoã€Plexusã€Joppaã€Sidewinderã€Ericaã€Ashleiã€Twilightã€Kristenã€Brettã€Qã€Enusã€Simonã€Bevisã€Kraftã€Kipã€Chandlerã€Ronã€LauraPã€Ramã€KyleJMã€Scouseã€Prosperoã€Melissaã€Martyã€Natã€Hamiltonã€Kendã€Lordanã€Jimmyã€Kosmoã€Seraphã€Greenã€Ekimã€Wiggoã€JTã€Romeã€Dorisã€Mizã€Benocã€Whumpã€Trinityã€Patchã€Kateã€TJã€Baoã€Joohwanã€Christyã€Sofiaã€Matiasã€Cogsworthã€Johanã€Orehã€Cheahã€Angelaã€Brandyã€Mangoã€Lanã€Aleksã€Gloriaã€Heidyã€Mitchellã€Spaceã€Coltonã€Bambersã€Einsteinã€Maggieã€Malbersã€Roseã€Winnieã€Stellaã€Miltonã€Rothmanã€Niallã€Marinã€Allisonã€Katieã€Dawnã€Kattã€Dustyã€Kalpanaã€Judyã€Andreaã€Ambroffã€Infinityã€Gailã€Ricoã€Raymondã€Yiã€Williamã€Christaã€Mã€Teaganã€Scoutã€Mollyã€Danteã€Corrã€Dynamikeã€Usiã€Kayleeã€Vidtutsã€Lilã€Danicaã€Saschaã€Kelvã€Jacobã€Nyaã€Rodneyã€Brandonã€Elsieã€Blondinã€Grantã€Katrinã€Nyxã€Gabrielã€Locklainnã€Claireã€Devinã€Minervaã€Montyã€Austinã€Bradfordã€Siã€Keiraã€Hã€Caitlinã€Ditaã€Makaiã€Jennã€Annã€Meredithã€Clareã€Joyã€Praveenã€Codyã€Edmundã€Rutheã€Sirenaã€Gayathriã€Spiderã€FJã€Davidoffã€Tianã€Jennieã€Louiseã€Oskarã€Landonã€Noelleã€Jarvã€Ingridã€Alã€Sommerã€Docã€Ariaã€Huinã€Grayã€Liliã€Virã€DJã€Yangã€Tã€Simoneã€Maestroã€Scottã€Charleneã€Quixoteã€Amandaã€Susanã€Zedã€Anneã€Enkiduã€Esbeeã€Joroanã€Katelinã€Roxieã€Tayã€Scarletã€Kevinã€Johnnyã€Wolfgangã€Andrenã€Bobã€Howardã€Merovã€Randã€Rayã€Michonã€Newellã€Galenã€Dessieã€Lesã€Michonã€Jenelleã€Geoã€Sizã€Shapiroã€Peteã€Calyleã€Seleneã€Allenã€Phoebeã€Goldinã€Kimmoraã€Dakotaã€Slatonã€Lindquistã€Zoeyã€Hariã€Othelloã€Rohitã€Sheldonã€Petraã€Vialeã€Gordonã€Kayeã€Pinkã€Fernyã€Emersonã€Davyã€Briã€Chanã€Juanã€Robertã€Terrenceã€Nathanã€Carlã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•ã‚Œã¾ã—ãŸã€‚ + + ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ã“ã‚Œã¾ã§ã§æœ€é«˜ã®ã‚‚ã®ã«ãªã‚‹ã‚ˆã†ã”å”力をã„ãŸã ã„ãŸä»¥ä¸‹ã®ä½äººã®çš†æ§˜ã«æ·±ãæ„Ÿè¬ã„ãŸã—ã¾ã™ã€‚ able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar + + + + ビジãƒã‚¹ã§æˆåŠŸã™ã‚‹ã«ã¯ã€å‹‡æ°—ã‚’æŒã£ã¦ã€èª°ã‚ˆã‚Šã‚‚å…ˆã«ã€äººã¨é•ã£ãŸã“ã¨ã‚’ã™ã‚‹ã“ã¨ã 。 --Henry Marchant + </text_editor> + </panel> + <panel label="ライセンス" name="licenses_panel"> + <text_editor name="credits_editor"> + 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion + APR Copyright (C) 2000-2004 The Apache Software Foundation + cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) + expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. + FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). + GL Copyright (C) 1999-2004 Brian Paul. + Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. + jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) + jpeglib Copyright (C) 1991-1998, Thomas G. Lane. + ogg/vorbis Copyright (C) 2001, Xiphophorus + OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. + SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga + SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + xmlrpc-epi Copyright (C) 2000 Epinions, Inc. + zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. + google-perftools Copyright (c) 2005, Google Inc. + + ç„¡æ–転写ã€è¤‡è£½ã€è»¢è¼‰ã‚’ç¦ã˜ã¾ã™ã€‚ 詳細ã¯licenses.txtã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + + Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) + </text_editor> + </panel> + </tab_container> +</floater> 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 fb7136d7ced..bb9dcac83bb 100644 --- a/indra/newview/skins/default/xui/ja/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml @@ -1,495 +1,475 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterland" title="åœŸåœ°æƒ…å ±"> - <tab_container name="landtab"> - <panel label="一般" name="land_general_panel"> - <text name="Name:"> - åå‰ï¼š - </text> - <line_editor name="Name"/> - <text name="Description:"> - 説明: - </text> - <text name="LandType"> - 種類: - </text> - <text name="LandTypeText"> - メインランド/ホームステッド - </text> - <text name="ContentRating"> - 区分: - </text> - <text name="ContentRatingText"> - Adult - </text> - <text name="Owner:"> - オーナー: - </text> - <text name="OwnerText"> - Leyla Linden - </text> - <button label="プãƒãƒ•ã‚£ãƒ¼ãƒ«..." label_selected="プãƒãƒ•ã‚£ãƒ¼ãƒ«..." name="Profile..."/> - <text name="Group:"> - グループ: - </text> - <button label="è¨å®š..." label_selected="è¨å®š..." name="Set..."/> - <check_box label="グループã¸ã®è²æ¸¡ã‚’許å¯" name="check deed" tool_tip="グループ・オフィサーã¯ã€ã“ã®åœŸåœ°ã‚’グループã«è²æ¸¡ã—ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®åœŸåœ°é…分ã«å§”ãã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> - <button label="è²æ¸¡..." label_selected="è²æ¸¡..." name="Deed..." tool_tip="é¸æŠžã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ã‚£ã‚µãƒ¼ã§ã‚ã‚‹ã¨ãã®ã¿ã€åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã™ã€‚"/> - <check_box label="オーナーãŒè²æ¸¡ã¨å…±ã«å¯„付" name="check contrib" tool_tip="土地ãŒã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•ã‚Œã‚‹ã¨ãã€å‰ã®æ‰€æœ‰è€…ã¯è²æ¸¡ãŒæˆç«‹ã™ã‚‹ã‚ˆã†ã€å分ãªåœŸåœ°ã‚’寄付ã—ã¾ã™ã€‚"/> - <text name="For Sale:"> - 販売ã®æœ‰ç„¡ï¼š - </text> - <text name="Not for sale."> - 販売対象外 - </text> - <text name="For Sale: Price L$[PRICE]."> - ä¾¡æ ¼ï¼š L$[PRICE] (L$[PRICE_PER_SQM]/平方メートル) - </text> - <button label="土地を販売..." label_selected="土地を販売..." name="Sell Land..."/> - <text name="For sale to"> - 販売先:[BUYER] - </text> - <text name="Sell with landowners objects in parcel."> - ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚‚è²©å£²ä¾¡æ ¼ã«å«ã¾ã‚Œã¾ã™ - </text> - <text name="Selling with no objects in parcel."> - オブジェクトã¯è²©å£²å¯¾è±¡å¤–ã§ã™ - </text> - <button label="土地販売ã®å–り消ã—" label_selected="土地販売ã®å–り消ã—" name="Cancel Land Sale"/> - <text name="Claimed:"> - å–得日時: - </text> - <text name="DateClaimText"> - 2006å¹´8月15æ—¥ç«æ›œæ—¥13:47:25 - </text> - <text name="PriceLabel"> - é¢ç©ï¼š - </text> - <text name="PriceText"> - 4048平方メートル - </text> - <text name="Traffic:"> - 交通é‡: - </text> - <text name="DwellText"> - 誤 - </text> - <button label="土地を購入..." label_selected="土地を購入..." left="130" name="Buy Land..." width="125"/> - <button label="グループ用ã«è³¼å…¥..." label_selected="グループ用ã«è³¼å…¥..." name="Buy For Group..."/> - <button label="å…¥å ´è¨±å¯ã‚’購入..." label_selected="å…¥å ´è¨±å¯ã‚’購入..." left="130" name="Buy Pass..." tool_tip="ã“ã®åœŸåœ°ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚" width="125"/> - <button label="土地を放棄..." label_selected="土地を放棄..." name="Abandon Land..."/> - <button label="土地ã®è¿”é‚„ã‚’è¦æ±‚..." label_selected="土地ã®è¿”é‚„ã‚’è¦æ±‚..." name="Reclaim Land..."/> - <button label="Lindenセール..." label_selected="Lindenセール..." name="Linden Sale..." tool_tip="土地ãŒæ‰€æœ‰ã•ã‚Œã¦ãŠã‚Šã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒè¨å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚オークションã®å¯¾è±¡ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚å¿…è¦æ¡ä»¶ã§ã™ã€‚"/> - <panel.string name="new users only"> - æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿ - </panel.string> - <panel.string name="anyone"> - 誰ã§ã‚‚ - </panel.string> - <panel.string name="area_text"> - é¢ç©ï¼š - </panel.string> - <panel.string name="area_size_text"> - [AREA]平方メートル - </panel.string> - <panel.string name="auction_id_text"> - オークションID: [ID] - </panel.string> - <panel.string name="need_tier_to_modify"> - ã“ã®åœŸåœ°ã‚’ä¿®æ£å¤‰æ›´ã™ã‚‹ã«ã¯ã€è³¼å…¥ã‚’承èªã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - </panel.string> - <panel.string name="group_owned_text"> - (グループ所有) - </panel.string> - <panel.string name="profile_text"> - プãƒãƒ•ã‚£ãƒ¼ãƒ«... - </panel.string> - <panel.string name="info_text"> - æƒ…å ±... - </panel.string> - <panel.string name="public_text"> - (公共) - </panel.string> - <panel.string name="none_text"> - (ãªã—) - </panel.string> - <panel.string name="sale_pending_text"> - (購入審査ä¸) - </panel.string> - <panel.string name="no_selection_text"> - 区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 -「世界ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ï¼žã€ŒåœŸåœ°æƒ…å ±ã€ã«é€²ã‚€ã‹ã€åˆ¥ã®åŒºç”»ã‚’é¸æŠžã—ã¦ã€è©³ç´°ã‚’表示ã—ã¾ã™ã€‚ - </panel.string> - </panel> - <panel label="約款" name="land_covenant_panel"> - <text font="SansSerifLarge" name="estate_section_lbl"> - ä¸å‹•ç”£ï¼š - </text> - <text name="estate_name_lbl"> - åå‰ï¼š - </text> - <text name="estate_name_text"> - メインランド - </text> - <text name="estate_owner_lbl"> - オーナー: - </text> - <text name="estate_owner_text"> - (ãªã—) - </text> - <text_editor name="covenant_editor"> - ã“ã®ä¸å‹•ç”£ã«ã¯ç´„款ãŒã‚ã‚Šã¾ã›ã‚“。 - </text_editor> - <text name="covenant_timestamp_text"> - 最後ã®æ›´æ–°1969å¹´12月31日水曜日16:00:00 - </text> - <text font="SansSerifLarge" name="region_section_lbl"> - 地域: - </text> - <text name="region_name_lbl"> - åå‰ï¼š - </text> - <text name="region_name_text"> - Leyla - </text> - <text name="region_landtype_lbl"> - 種類: - </text> - <text name="region_landtype_text"> - メインランド/ホームステッド - </text> - <text name="region_maturity_lbl"> - 区分: - </text> - <text name="region_maturity_text"> - Adult - </text> - <text name="resellable_lbl"> - å†è²©ï¼š - </text> - <text name="resellable_clause"> - ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã‚る土地ã¯å†è²©ã§ãã¾ã›ã‚“。 - </text> - <text name="changeable_lbl"> - å†åˆ†å‰²ï¼š - </text> - <text name="changeable_clause"> - ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã‚る土地ã¯çµ±åˆã¾ãŸã¯åˆ†å‰²ãŒã§ã -ã¾ã›ã‚“。 - </text> - <panel.string name="can_resell"> - ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ãã¾ã™ã€‚ - </panel.string> - <panel.string name="can_not_resell"> - ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ããªã„ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ - </panel.string> - <panel.string name="can_change"> - ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã¾ã™ã€‚ - </panel.string> - <panel.string name="can_not_change"> - ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆï¼å†åˆ†å‰²ã§ããªã„ã“ã¨ãŒ -ã‚ã‚Šã¾ã™ã€‚ - </panel.string> - </panel> - <panel label="オブジェクト" name="land_objects_panel"> - <text name="parcel_object_bonus"> - 地域オブジェクトボーナスè¦å› : [BONUS] - </text> - <text name="Simulator primitive usage:" width="500"> - 地域全体ã®ãƒ—リム使用状æ³ï¼š - </text> - <text left="200" name="objects_available"> - [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰ - </text> - <panel.string left="200" name="objects_available_text"> - [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰ - </panel.string> - <panel.string left="200" name="objects_deleted_text"> - [MAX]ã®å†…[COUNT]([DELETED]を削除) - </panel.string> - <text name="Primitives parcel supports:" width="200"> - 区画ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã‚‹ãƒ—リム数: - </text> - <text left="200" name="object_contrib_text"> - [COUNT] - </text> - <text name="Primitives on parcel:"> - 区画上ã®ãƒ—リム数: - </text> - <text left="200" name="total_objects_text"> - [COUNT] - </text> - <text name="Owned by parcel owner:" width="300"> - 区画オーナーã«ã‚ˆã‚‹æ‰€æœ‰ï¼š - </text> - <text left="200" name="owner_objects_text"> - [COUNT] - </text> - <button label="表示" label_selected="表示" name="ShowOwner" right="-145"/> - <button label="è¿”å´..." label_selected="è¿”å´..." name="ReturnOwner..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> - <text name="Set to group:"> - グループã«è¨å®šï¼š - </text> - <text left="200" name="group_objects_text"> - [COUNT] - </text> - <button label="表示" label_selected="表示" name="ShowGroup" right="-145"/> - <button label="è¿”å´..." label_selected="è¿”å´..." name="ReturnGroup..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> - <text name="Owned by others:"> - 他人ã«ã‚ˆã‚‹æ‰€æœ‰ï¼š - </text> - <text left="200" name="other_objects_text"> - [COUNT] - </text> - <button label="表示" label_selected="表示" name="ShowOther" right="-145"/> - <button label="è¿”å´..." label_selected="è¿”å´..." name="ReturnOther..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> - <text name="Selected / sat upon:"> - é¸æŠžæ¸ˆã¿ï¼æ±ºå®šæ¸ˆã¿ï¼š - </text> - <text left="200" name="selected_objects_text"> - [COUNT] - </text> - <text name="Autoreturn" width="500"> - ä»–ã®ä½äººã®ã‚ªãƒ–ジェクトã®è‡ªå‹•è¿”å´(分ã€0ã§è‡ªå‹•è¿”å´ãªã—) - </text> - <line_editor left_delta="5" name="clean other time" right="-80"/> - <text name="Object Owners:" width="150"> - オブジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ï¼š - </text> - <button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List"/> - <button label="オブジェクトã®è¿”å´..." label_selected="オブジェクトã®è¿”å´..." left="256" name="Return objects..."/> - <name_list label="カウント" name="owner list"> - <column label="タイプ" name="type"/> - <column name="online_status"/> - <column label="åå‰" name="name"/> - <column label="カウント" name="count"/> - <column label="最新" name="mostrecent"/> - </name_list> - </panel> - <panel label="オプション" name="land_options_panel"> - <text name="allow_label"> - ä»–ã®ä½äººã«ä»¥ä¸‹ã‚’許å¯ï¼š - </text> - <check_box label="地形を編集" name="edit land check" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã€ä»–人ãŒã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ã‚’è¡Œã†ã“ã¨ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãŠãã“ã¨ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚外ã—ãŸçŠ¶æ…‹ã§ã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ãŒå¯èƒ½ã§ã™ã€‚"/> - <check_box label="ランドマーク作æˆ" name="check landmark"/> - <check_box label="飛行" name="check fly" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®é£›è¡ŒãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨åœŸåœ°ã«å…¥ã‚‹éš›ã¨é€šã‚ŠéŽãŽã‚‹ã¨ãã®ã¿é£›è¡Œå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚"/> - <text left="138" name="allow_label2" width="144"> - オブジェクトã®ä½œæˆï¼š - </text> - <check_box label="ã™ã¹ã¦ã®ä½äºº" left="280" name="edit objects check"/> - <check_box label="グループ" left="380" name="edit group objects check"/> - <text left="138" name="allow_label3" width="144"> - オブジェクトã®é€²å…¥ï¼š - </text> - <check_box label="ã™ã¹ã¦ã®ä½äºº" left="280" name="all object entry check"/> - <check_box label="グループ" left="380" name="group object entry check"/> - <text left="138" name="allow_label4" width="144"> - スクリプトã®å®Ÿè¡Œï¼š - </text> - <check_box label="ã™ã¹ã¦ã®ä½äºº" left="280" name="check other scripts"/> - <check_box label="グループ" left="380" name="check group scripts"/> - <text name="land_options_label"> - 土地オプション: - </text> - <check_box label="安全(ダメージãªã—)" name="check safe" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚³ãƒ³ãƒãƒƒãƒˆãŒç„¡åŠ¹ã«ãªã‚Šã€ã€Œå®‰å…¨ã€ã«è¨å®šã•ã‚Œã¾ã™ã€‚ ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚³ãƒ³ãƒãƒƒãƒˆãŒæœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚"/> - <check_box label="プッシングを制é™" name="PushRestrictCheck" tool_tip="スクリプトã«ã‚ˆã‚‹ãƒ—ッシングを制é™ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ションをé¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚ãªãŸã®åœŸåœ°ã§ã®ç ´å£Šçš„行動を妨ã’ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> - <check_box label="検索ã«è¡¨ç¤ºï¼žï¼ˆé€±L$30)以下ã®å ´æ‰€" name="ShowDirectoryCheck" tool_tip="検索çµæžœã§ã“ã®åŒºç”»ã‚’表示ã•ã›ã‚‹"/> - <panel.string name="search_enabled_tooltip"> - ã“ã®åŒºç”»ã‚’検索çµæžœã«è¡¨ç¤ºã™ã‚‹ - </panel.string> - <panel.string name="search_disabled_small_tooltip"> - 区画é¢ç©ãŒ128平方メートルã‹ãれ以下ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åŠ¹ã§ã™ã€‚ -大ããªåŒºç”»ã®ã¿æ¤œç´¢ã«è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ - </panel.string> - <panel.string name="search_disabled_permissions_tooltip"> - ã‚ãªãŸã¯ã“ã®åŒºç”»ã®è¨å®šç·¨é›†ãŒã§ããªã„ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åŠ¹ã§ã™ã€‚ - </panel.string> - <combo_box name="land category with adult"> - <combo_box.item name="item0" label="全カテゴリ" - /> - <combo_box.item name="item1" label="Linden所在地" - /> - <combo_box.item name="item2" label="Adult" - /> - <combo_box.item name="item3" label="アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼" - /> - <combo_box.item name="item4" label="ビジãƒã‚¹" - /> - <combo_box.item name="item5" label="教育的" - /> - <combo_box.item name="item6" label="ゲーム" - /> - <combo_box.item name="item7" label="ãŸã¾ã‚Šå ´" - /> - <combo_box.item name="item8" label="æ–°ä½äººã«å¥½æ„çš„" - /> - <combo_box.item name="item9" label="公園ã¨è‡ªç„¶" - /> - <combo_box.item name="item10" label="ä½å®…用" - /> - <combo_box.item name="item11" label="ショッピング" - /> - <combo_box.item name="item12" label="ãã®ä»–" - /> - </combo_box> - <combo_box name="land category"> - <combo_box.item name="item0" label="全カテゴリー" - /> - <combo_box.item name="item1" label="Linden所在地" - /> - <combo_box.item name="item3" label="アート&カルãƒãƒ£ãƒ¼" - /> - <combo_box.item name="item4" label="ビジãƒã‚¹" - /> - <combo_box.item name="item5" label="教育的" - /> - <combo_box.item name="item6" label="ゲーム" - /> - <combo_box.item name="item7" label="ãŸã¾ã‚Šå ´" - /> - <combo_box.item name="item8" label="æ–°ä½äººã«å¥½æ„çš„" - /> - <combo_box.item name="item9" label="公園ã¨è‡ªç„¶" - /> - <combo_box.item name="item10" label="ä½å®…用" - /> - <combo_box.item name="item11" label="ショッピング" - /> - <combo_box.item name="item12" label="ãã®ä»–" - /> - </combo_box> - <button label="?" label_selected="?" name="?"/> - <check_box label="Matureコンテンツ" name="MatureCheck" tool_tip=""/> - <panel.string name="mature_check_mature"> - Matureコンテンツ - </panel.string> - <panel.string name="mature_check_adult"> - Adultコンテンツ - </panel.string> - <panel.string name="mature_check_mature_tooltip"> - ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯Matureã¨ã•ã‚Œã¦ã„ã¾ã™ã€‚ - </panel.string> - <panel.string name="mature_check_adult_tooltip"> - ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯Adultã¨ã•ã‚Œã¦ã„ã¾ã™ã€‚ - </panel.string> - <text name="Snapshot:"> - スナップショット: - </text> - <texture_picker label="" left="116" name="snapshot_ctrl" tool_tip="写真をクリックã—ã¦é¸æŠž"/> - <text name="landing_point"> - ç€åœ°ç‚¹: [LANDING] - </text> - <panel.string name="landing_point_none"> - (ãªã—) - </panel.string> - <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="Teleport Routing -- select how to handle teleports onto your land."> - <combo_box.item name="Blocked" label="ä¸å¯" - /> - <combo_box.item name="LandingPoint" label="ç€åœ°ç‚¹" - /> - <combo_box.item name="Anywhere" label="ã©ã“ã§ã‚‚" - /> - </combo_box> - <panel.string name="push_restrict_text"> - ãƒ—ãƒƒã‚·ãƒ³ã‚°ã‚’åˆ¶é™ - </panel.string> - <panel.string name="push_restrict_region_text"> - ãƒ—ãƒƒã‚·ãƒ³ã‚°ã‚’åˆ¶é™ (地域優先) - </panel.string> - </panel> - <panel label="メディア" name="land_media_panel"> - <text name="with media:"> - タイプ: - </text> - <combo_box name="media type" tool_tip="URL ãŒå‹•ç”»ã€ã‚¦ã‚§ãƒ–・ページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®å ´åˆã«æŒ‡å®šã—ã¾ã™"/> - <text name="at URL:"> - URL: - </text> - <button label="è¨å®š..." label_selected="è¨å®š..." name="set_media_url"/> - <text name="Description:"> - 説明: - </text> - <line_editor name="url_description" tool_tip="ï¼»å†ç”Ÿï¼½/ï¼»ãƒãƒ¼ãƒ‰ï¼½ãƒœã‚¿ãƒ³ã®éš£ã«è¡¨ç¤ºã•ã‚Œã‚‹ãƒ†ã‚スト"/> - <text name="Media texture:"> - テクスム-ャå–替: - </text> - <texture_picker label="" name="media texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/> - <text name="replace_texture_help" width="290"> - 「å†ç”Ÿã€çŸ¢å°ã‚’クリックã™ã‚‹ã¨ã€ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã‚’ - 使用ã™ã‚‹ã‚ªãƒ–ジェクトã«å‹•ç”»ã¾ãŸã¯ã‚¦ã‚§ãƒ–・ページ - ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ - </text> - <text name="Options:"> - メディア -オプション: - </text> - <check_box label="スケールを自動è¨å®š" name="media_auto_scale" tool_tip="ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã“ã®åŒºç”»ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒè‡ªå‹•çš„ã«è¨å®šã•ã‚Œã¾ã™ã€‚ 動作速度ã¨ç”»è³ªãŒå°‘ã—低下ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ãŒã€ä»–ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã®ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã‚„整列ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。"/> - <check_box label="メディアã®ãƒ«ãƒ¼ãƒ—" name="media_loop" tool_tip="メディアをループå†ç”Ÿã—ã¾ã™ã€‚ メディアã®å†ç”ŸãŒçµ‚ã‚ã£ãŸã‚‰ã€æœ€åˆã‹ã‚‰å†ç”Ÿã—ç›´ã—ã¾ã™ã€‚"/> - <check_box label="メディア URL ã‚’éš ã™" name="hide_media_url" tool_tip="ã“ã®ã‚ªãƒ—ションをオンã«ã™ã‚‹ã¨ã€è¨±å¯ãªã—ã§ã“ã®åŒºç”»æƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„るユーザーã«ã¯ãƒ¡ãƒ‡ã‚£ã‚¢ URL ãŒè¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。 ã“れ㯠HTML タイプã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ã®ã§ã”注æ„ãã ã•ã„。"/> - <check_box label="音楽ã®URLã‚’éš ã™" name="hide_music_url" tool_tip="ã“ã®ã‚ªãƒ—ションをオンã«ã™ã‚‹ã¨ã€è¨±å¯ãªã—ã§ã“ã®åŒºç”»æƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„るユーザーã«ã¯éŸ³æ¥½ã® URL ãŒè¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。"/> - <text name="media_size" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"> - サイズ: - </text> - <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> - <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> - <text name="pixels"> - ピクセル - </text> - <text name="MusicURL:"> - 音楽ã®URL: - </text> - <text name="Sound:"> - サウンド: - </text> - <check_box label="ジェスãƒãƒ£ãƒ¼ã¨ã‚ªãƒ–ジェクトã®éŸ³ã‚’ã“ã®åŒºç”»ã ã‘ã«é™å®š" name="check sound local"/> - <button label="?" label_selected="?" left="408" name="?"/> - <text name="Voice settings:"> - ボイス: - </text> - <check_box label="ボイスを有効ã«ã™ã‚‹" name="parcel_enable_voice_channel"/> - <check_box label="ボイスを有効ã«ã™ã‚‹ï¼ˆä¸å‹•ç”£è¨å®šï¼‰" name="parcel_enable_voice_channel_is_estate_disabled"/> - <check_box label="ã“ã®åŒºç”»ã§ã®ãƒœã‚¤ã‚¹ä½¿ç”¨ã‚’制é™ã™ã‚‹" name="parcel_enable_voice_channel_parcel"/> - </panel> - <panel label="アクセス" name="land_access_panel"> - <text name="Limit access to this parcel to:"> - ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ - </text> - <check_box label="パブリック・アクセスを許å¯" name="public_access"/> - <text name="Only Allow"> - 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ブãƒãƒƒã‚¯ï¼š - </text> - <check_box label="Linden Labã«æ”¯æ‰•ã„æƒ…å ±ã‚’ç™»éŒ²ã—ã¦ã„ãªã„ä½äºº" name="limit_payment" tool_tip="支払ã„æƒ…å ±æœªç¢ºèªã®ä½äººã‚’排除ã™ã‚‹"/> - <check_box label="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„æˆäººã®ä½äºº" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã‚’排除ã™ã‚‹è©³ç´°ã«ã¤ã„ã¦ã¯ã€support.secondlife.comã‚’å‚ç…§ã—ã¦ãã ã•ã„。"/> - <panel.string name="estate_override"> - 1ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•ç”£ãƒ¬ãƒ™ãƒ«ã§è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ - </panel.string> - <check_box label="グループ・アクセスを許å¯ï¼š[GROUP]" name="GroupCheck" tool_tip="[一般]タブã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> - <check_box label="å…¥å ´è¨±å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯"/> - <combo_box name="pass_combo"> - <combo_box.item name="Anyone" label="誰ã§ã‚‚" - /> - <combo_box.item name="Group" label="グループ" - /> - </combo_box> - <spinner label="ä¾¡æ ¼ï¼ˆL$):" name="PriceSpin"/> - <spinner label="アクセス時間:" name="HoursSpin"/> - <text label="常ã«è¨±å¯" name="AllowedText"> - 許å¯ã•ã‚ŒãŸä½äºº - </text> - <name_list name="AccessList" tool_tip="([LISTED]リスト入りã€[MAX]最大)"/> - <button label="è¿½åŠ ..." label_selected="è¿½åŠ ..." name="add_allowed"/> - <button label="削除" label_selected="削除" name="remove_allowed"/> - <text label="ç¦æ¢" name="BanCheck"> - ç¦æ¢ã•ã‚ŒãŸä½äºº - </text> - <name_list name="BannedList" tool_tip="([LISTED]リスト入りã€[MAX]最大)"/> - <button label="è¿½åŠ ..." label_selected="è¿½åŠ ..." name="add_banned"/> - <button label="削除" label_selected="削除" name="remove_banned"/> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floaterland" title="åœŸåœ°æƒ…å ±"> + <floater.string name="Minutes"> + [MINUTES] 分 + </floater.string> + <floater.string name="Minute"> + 分 + </floater.string> + <floater.string name="Seconds"> + [SECONDS] 秒 + </floater.string> + <tab_container name="landtab"> + <panel label="一般" name="land_general_panel"> + <panel.string name="new users only"> + æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿ + </panel.string> + <panel.string name="anyone"> + 誰ã§ã‚‚ + </panel.string> + <panel.string name="area_text"> + é¢ç©ï¼š + </panel.string> + <panel.string name="area_size_text"> + [AREA]平方メートル + </panel.string> + <panel.string name="auction_id_text"> + オークションID: [ID] + </panel.string> + <panel.string name="need_tier_to_modify"> + ã“ã®åœŸåœ°ã‚’ä¿®æ£å¤‰æ›´ã™ã‚‹ã«ã¯ã€è³¼å…¥ã‚’承èªã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + </panel.string> + <panel.string name="group_owned_text"> + (グループ所有) + </panel.string> + <panel.string name="profile_text"> + プãƒãƒ•ã‚£ãƒ¼ãƒ«... + </panel.string> + <panel.string name="info_text"> + æƒ…å ±... + </panel.string> + <panel.string name="public_text"> + (公共) + </panel.string> + <panel.string name="none_text"> + (ãªã—) + </panel.string> + <panel.string name="sale_pending_text"> + (購入審査ä¸) + </panel.string> + <panel.string name="no_selection_text"> + 区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 +「世界ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ï¼žã€ŒåœŸåœ°æƒ…å ±ã€ã«é€²ã‚€ã‹ã€åˆ¥ã®åŒºç”»ã‚’é¸æŠžã—ã¦ã€è©³ç´°ã‚’表示ã—ã¾ã™ã€‚ + </panel.string> + <text name="Name:"> + åå‰ï¼š + </text> + <line_editor name="Name"/> + <text name="Description:"> + 説明: + </text> + <text name="LandType"> + 種類: + </text> + <text name="LandTypeText"> + メインランド/ホームステッド + </text> + <text name="ContentRating"> + 区分: + </text> + <text name="ContentRatingText"> + Adult + </text> + <text name="Owner:"> + オーナー: + </text> + <text name="OwnerText"> + Leyla Linden + </text> + <button label="プãƒãƒ•ã‚£ãƒ¼ãƒ«..." label_selected="プãƒãƒ•ã‚£ãƒ¼ãƒ«..." name="Profile..."/> + <text name="Group:"> + グループ: + </text> + <button label="è¨å®š..." label_selected="è¨å®š..." name="Set..."/> + <check_box label="グループã¸ã®è²æ¸¡ã‚’許å¯" name="check deed" tool_tip="グループ・オフィサーã¯ã€ã“ã®åœŸåœ°ã‚’グループã«è²æ¸¡ã—ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®åœŸåœ°é…分ã«å§”ãã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> + <button label="è²æ¸¡..." label_selected="è²æ¸¡..." name="Deed..." tool_tip="é¸æŠžã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ã‚£ã‚µãƒ¼ã§ã‚ã‚‹ã¨ãã®ã¿ã€åœŸåœ°ã‚’è²æ¸¡ã§ãã¾ã™ã€‚"/> + <check_box label="オーナーãŒè²æ¸¡ã¨å…±ã«å¯„付" name="check contrib" tool_tip="土地ãŒã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•ã‚Œã‚‹ã¨ãã€å‰ã®æ‰€æœ‰è€…ã¯è²æ¸¡ãŒæˆç«‹ã™ã‚‹ã‚ˆã†ã€å分ãªåœŸåœ°ã‚’寄付ã—ã¾ã™ã€‚"/> + <text name="For Sale:"> + 販売ã®æœ‰ç„¡ï¼š + </text> + <text name="Not for sale."> + 販売対象外 + </text> + <text name="For Sale: Price L$[PRICE]."> + ä¾¡æ ¼ï¼š L$[PRICE] (L$[PRICE_PER_SQM]/平方メートル) + </text> + <button label="土地を販売..." label_selected="土地を販売..." name="Sell Land..."/> + <text name="For sale to"> + 販売先:[BUYER] + </text> + <text name="Sell with landowners objects in parcel."> + ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚‚è²©å£²ä¾¡æ ¼ã«å«ã¾ã‚Œã¾ã™ + </text> + <text name="Selling with no objects in parcel."> + オブジェクトã¯è²©å£²å¯¾è±¡å¤–ã§ã™ + </text> + <button label="土地販売ã®å–り消ã—" label_selected="土地販売ã®å–り消ã—" name="Cancel Land Sale"/> + <text name="Claimed:"> + å–得日時: + </text> + <text name="DateClaimText"> + 2006å¹´8月15æ—¥ç«æ›œæ—¥13:47:25 + </text> + <text name="PriceLabel"> + é¢ç©ï¼š + </text> + <text name="PriceText"> + 4048平方メートル + </text> + <text name="Traffic:"> + 交通é‡: + </text> + <text name="DwellText"> + 誤 + </text> + <button label="土地を購入..." label_selected="土地を購入..." left="130" name="Buy Land..." width="125"/> + <button label="グループ用ã«è³¼å…¥..." label_selected="グループ用ã«è³¼å…¥..." name="Buy For Group..."/> + <button label="å…¥å ´è¨±å¯ã‚’購入..." label_selected="å…¥å ´è¨±å¯ã‚’購入..." left="130" name="Buy Pass..." tool_tip="ã“ã®åœŸåœ°ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚" width="125"/> + <button label="土地を放棄..." label_selected="土地を放棄..." name="Abandon Land..."/> + <button label="土地ã®è¿”é‚„ã‚’è¦æ±‚..." label_selected="土地ã®è¿”é‚„ã‚’è¦æ±‚..." name="Reclaim Land..."/> + <button label="Lindenセール..." label_selected="Lindenセール..." name="Linden Sale..." tool_tip="土地ãŒæ‰€æœ‰ã•ã‚Œã¦ãŠã‚Šã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒè¨å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚オークションã®å¯¾è±¡ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚å¿…è¦æ¡ä»¶ã§ã™ã€‚"/> + </panel> + <panel label="約款" name="land_covenant_panel"> + <panel.string name="can_resell"> + ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ãã¾ã™ã€‚ + </panel.string> + <panel.string name="can_not_resell"> + ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ããªã„ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ + </panel.string> + <panel.string name="can_change"> + ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã¾ã™ã€‚ + </panel.string> + <panel.string name="can_not_change"> + ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆï¼å†åˆ†å‰²ã§ããªã„ã“ã¨ãŒ +ã‚ã‚Šã¾ã™ã€‚ + </panel.string> + <text font="SansSerifLarge" name="estate_section_lbl"> + ä¸å‹•ç”£ï¼š + </text> + <text name="estate_name_lbl"> + åå‰ï¼š + </text> + <text name="estate_name_text"> + メインランド + </text> + <text name="estate_owner_lbl"> + オーナー: + </text> + <text name="estate_owner_text"> + (ãªã—) + </text> + <text_editor name="covenant_editor"> + ã“ã®ä¸å‹•ç”£ã«ã¯ç´„款ãŒã‚ã‚Šã¾ã›ã‚“。 + </text_editor> + <text name="covenant_timestamp_text"> + 最後ã®æ›´æ–°1969å¹´12月31日水曜日16:00:00 + </text> + <text font="SansSerifLarge" name="region_section_lbl"> + 地域: + </text> + <text name="region_name_lbl"> + åå‰ï¼š + </text> + <text name="region_name_text"> + Leyla + </text> + <text name="region_landtype_lbl"> + 種類: + </text> + <text name="region_landtype_text"> + メインランド/ホームステッド + </text> + <text name="region_maturity_lbl"> + 区分: + </text> + <text name="region_maturity_text"> + Adult + </text> + <text name="resellable_lbl"> + å†è²©ï¼š + </text> + <text name="resellable_clause"> + ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã‚る土地ã¯å†è²©ã§ãã¾ã›ã‚“。 + </text> + <text name="changeable_lbl"> + å†åˆ†å‰²ï¼š + </text> + <text name="changeable_clause"> + ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã‚る土地ã¯çµ±åˆã¾ãŸã¯åˆ†å‰²ãŒã§ã +ã¾ã›ã‚“。 + </text> + </panel> + <panel label="オブジェクト" name="land_objects_panel"> + <panel.string left="200" name="objects_available_text"> + [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰ + </panel.string> + <panel.string left="200" name="objects_deleted_text"> + [MAX]ã®å†…[COUNT]([DELETED]を削除) + </panel.string> + <text name="parcel_object_bonus"> + 地域オブジェクトボーナスè¦å› : [BONUS] + </text> + <text name="Simulator primitive usage:" width="500"> + 地域全体ã®ãƒ—リム使用状æ³ï¼š + </text> + <text left="200" name="objects_available"> + [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰ + </text> + <text name="Primitives parcel supports:" width="200"> + 区画ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã‚‹ãƒ—リム数: + </text> + <text left="200" name="object_contrib_text"> + [COUNT] + </text> + <text name="Primitives on parcel:"> + 区画上ã®ãƒ—リム数: + </text> + <text left="200" name="total_objects_text"> + [COUNT] + </text> + <text name="Owned by parcel owner:" width="300"> + 区画オーナーã«ã‚ˆã‚‹æ‰€æœ‰ï¼š + </text> + <text left="200" name="owner_objects_text"> + [COUNT] + </text> + <button label="表示" label_selected="表示" name="ShowOwner" right="-145"/> + <button label="è¿”å´..." label_selected="è¿”å´..." name="ReturnOwner..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> + <text name="Set to group:"> + グループã«è¨å®šï¼š + </text> + <text left="200" name="group_objects_text"> + [COUNT] + </text> + <button label="表示" label_selected="表示" name="ShowGroup" right="-145"/> + <button label="è¿”å´..." label_selected="è¿”å´..." name="ReturnGroup..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> + <text name="Owned by others:"> + 他人ã«ã‚ˆã‚‹æ‰€æœ‰ï¼š + </text> + <text left="200" name="other_objects_text"> + [COUNT] + </text> + <button label="表示" label_selected="表示" name="ShowOther" right="-145"/> + <button label="è¿”å´..." label_selected="è¿”å´..." name="ReturnOther..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/> + <text name="Selected / sat upon:"> + é¸æŠžæ¸ˆã¿ï¼æ±ºå®šæ¸ˆã¿ï¼š + </text> + <text left="200" name="selected_objects_text"> + [COUNT] + </text> + <text name="Autoreturn" width="500"> + ä»–ã®ä½äººã®ã‚ªãƒ–ジェクトã®è‡ªå‹•è¿”å´(分ã€0ã§è‡ªå‹•è¿”å´ãªã—) + </text> + <line_editor left_delta="5" name="clean other time" right="-80"/> + <text name="Object Owners:" width="150"> + オブジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ï¼š + </text> + <button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List"/> + <button label="オブジェクトã®è¿”å´..." label_selected="オブジェクトã®è¿”å´..." left="256" name="Return objects..."/> + <name_list label="カウント" name="owner list"> + <name_list.columns label="タイプ" name="type"/> + <name_list.columns name="online_status"/> + <name_list.columns label="åå‰" name="name"/> + <name_list.columns label="カウント" name="count"/> + <name_list.columns label="最新" name="mostrecent"/> + </name_list> + </panel> + <panel label="オプション" name="land_options_panel"> + <panel.string name="search_enabled_tooltip"> + ã“ã®åŒºç”»ã‚’検索çµæžœã«è¡¨ç¤ºã™ã‚‹ + </panel.string> + <panel.string name="search_disabled_small_tooltip"> + 区画é¢ç©ãŒ128平方メートルã‹ãれ以下ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åŠ¹ã§ã™ã€‚ +大ããªåŒºç”»ã®ã¿æ¤œç´¢ã«è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ + </panel.string> + <panel.string name="search_disabled_permissions_tooltip"> + ã‚ãªãŸã¯ã“ã®åŒºç”»ã®è¨å®šç·¨é›†ãŒã§ããªã„ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åŠ¹ã§ã™ã€‚ + </panel.string> + <panel.string name="mature_check_mature"> + Matureコンテンツ + </panel.string> + <panel.string name="mature_check_adult"> + Adultコンテンツ + </panel.string> + <panel.string name="mature_check_mature_tooltip"> + ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯Matureã¨ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </panel.string> + <panel.string name="mature_check_adult_tooltip"> + ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯Adultã¨ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </panel.string> + <panel.string name="landing_point_none"> + (ãªã—) + </panel.string> + <panel.string name="push_restrict_text"> + ãƒ—ãƒƒã‚·ãƒ³ã‚°ã‚’åˆ¶é™ + </panel.string> + <panel.string name="push_restrict_region_text"> + ãƒ—ãƒƒã‚·ãƒ³ã‚°ã‚’åˆ¶é™ (地域優先) + </panel.string> + <text name="allow_label"> + ä»–ã®ä½äººã«ä»¥ä¸‹ã‚’許å¯ï¼š + </text> + <check_box label="地形を編集" name="edit land check" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã€ä»–人ãŒã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ã‚’è¡Œã†ã“ã¨ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãŠãã“ã¨ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚外ã—ãŸçŠ¶æ…‹ã§ã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ãŒå¯èƒ½ã§ã™ã€‚"/> + <check_box label="飛行" name="check fly" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®é£›è¡ŒãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨åœŸåœ°ã«å…¥ã‚‹éš›ã¨é€šã‚ŠéŽãŽã‚‹ã¨ãã®ã¿é£›è¡Œå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚"/> + <text left="138" name="allow_label2" width="144"> + オブジェクトã®ä½œæˆï¼š + </text> + <check_box label="ã™ã¹ã¦ã®ä½äºº" left="280" name="edit objects check"/> + <check_box label="グループ" left="380" name="edit group objects check"/> + <text left="138" name="allow_label3" width="144"> + オブジェクトã®é€²å…¥ï¼š + </text> + <check_box label="ã™ã¹ã¦ã®ä½äºº" left="280" name="all object entry check"/> + <check_box label="グループ" left="380" name="group object entry check"/> + <text left="138" name="allow_label4" width="144"> + スクリプトã®å®Ÿè¡Œï¼š + </text> + <check_box label="ã™ã¹ã¦ã®ä½äºº" left="280" name="check other scripts"/> + <check_box label="グループ" left="380" name="check group scripts"/> + <text name="land_options_label"> + 土地オプション: + </text> + <check_box label="安全(ダメージãªã—)" name="check safe" 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"/> + <combo_box.item label="Linden所在地" name="item1"/> + <combo_box.item label="Adult" name="item2"/> + <combo_box.item label="アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼" name="item3"/> + <combo_box.item label="ビジãƒã‚¹" name="item4"/> + <combo_box.item label="教育的" name="item5"/> + <combo_box.item label="ゲーム" name="item6"/> + <combo_box.item label="ãŸã¾ã‚Šå ´" name="item7"/> + <combo_box.item label="æ–°ä½äººã«å¥½æ„çš„" name="item8"/> + <combo_box.item label="公園ã¨è‡ªç„¶" name="item9"/> + <combo_box.item label="ä½å®…用" name="item10"/> + <combo_box.item label="ショッピング" name="item11"/> + <combo_box.item label="ãã®ä»–" name="item12"/> + </combo_box> + <combo_box name="land category"> + <combo_box.item label="全カテゴリー" name="item0"/> + <combo_box.item label="Linden所在地" name="item1"/> + <combo_box.item label="アート&カルãƒãƒ£ãƒ¼" name="item3"/> + <combo_box.item label="ビジãƒã‚¹" name="item4"/> + <combo_box.item label="教育的" name="item5"/> + <combo_box.item label="ゲーム" name="item6"/> + <combo_box.item label="ãŸã¾ã‚Šå ´" name="item7"/> + <combo_box.item label="æ–°ä½äººã«å¥½æ„çš„" name="item8"/> + <combo_box.item label="公園ã¨è‡ªç„¶" name="item9"/> + <combo_box.item label="ä½å®…用" name="item10"/> + <combo_box.item label="ショッピング" name="item11"/> + <combo_box.item label="ãã®ä»–" name="item12"/> + </combo_box> + <check_box label="Matureコンテンツ" name="MatureCheck" tool_tip=""/> + <text name="Snapshot:"> + スナップショット: + </text> + <texture_picker label="" left="116" name="snapshot_ctrl" tool_tip="写真をクリックã—ã¦é¸æŠž"/> + <text name="landing_point"> + ç€åœ°ç‚¹: [LANDING] + </text> + <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="Teleport Routing -- select how to handle teleports onto your land."> + <combo_box.item label="ä¸å¯" name="Blocked"/> + <combo_box.item label="ç€åœ°ç‚¹" name="LandingPoint"/> + <combo_box.item label="ã©ã“ã§ã‚‚" name="Anywhere"/> + </combo_box> + </panel> + <panel label="メディア" name="land_media_panel"> + <text name="with media:"> + 種類: + </text> + <combo_box name="media type" tool_tip="URL ãŒå‹•ç”»ã€ã‚¦ã‚§ãƒ–・ページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®å ´åˆã«æŒ‡å®šã—ã¾ã™"/> + <text name="at URL:"> + ホームURL: + </text> + <button label="è¨å®š..." label_selected="è¨å®š..." name="set_media_url"/> + <text name="CurrentURL:"> + ç¾åœ¨ã® URL: + </text> + <button label="リセット..." label_selected="リセット..." name="reset_media_url"/> + <check_box label="URL ã‚’éžè¡¨ç¤º" name="hide_media_url" tool_tip="ã“ã®ã‚ªãƒ—ションをオンã«ã™ã‚‹ã¨ã€è¨±å¯ãªã—ã§ã“ã®åŒºç”»æƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„るユーザーã«ã¯ãƒ¡ãƒ‡ã‚£ã‚¢ URL ãŒè¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。 ã“れ㯠HTML タイプã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ã®ã§ã”注æ„ãã ã•ã„。"/> + <text name="Description:"> + 説明: + </text> + <line_editor name="url_description" tool_tip="ï¼»å†ç”Ÿï¼½/ï¼»ãƒãƒ¼ãƒ‰ï¼½ãƒœã‚¿ãƒ³ã®éš£ã«è¡¨ç¤ºã•ã‚Œã‚‹ãƒ†ã‚スト"/> + <text name="Media texture:"> + テクスム+ャå–替: + </text> + <texture_picker label="" name="media texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/> + <text name="replace_texture_help" width="290"> + ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’使用ã™ã‚‹ã‚ªãƒ–ジェクトã®ãƒ—レイをクリックã™ã‚‹ã¨ã€ãƒ ービーや Web ページを表示ã—ã¾ã™ã€‚ + +テクスãƒãƒ£ã‚’変更ã™ã‚‹ã«ã¯ã‚µãƒ ãƒã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </text> + <check_box label="スケールを自動è¨å®š" name="media_auto_scale" tool_tip="ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã“ã®åŒºç”»ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒè‡ªå‹•çš„ã«è¨å®šã•ã‚Œã¾ã™ã€‚ 動作速度ã¨ç”»è³ªãŒå°‘ã—低下ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ãŒã€ä»–ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã®ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã‚„整列ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。"/> + <text name="media_size" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"> + サイズ: + </text> + <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> + <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/> + <text name="pixels"> + ピクセル + </text> + <text name="Options:"> + オプション: + </text> + <check_box label="ループ" name="media_loop" tool_tip="メディアをループå†ç”Ÿã—ã¾ã™ã€‚ メディアã®å†ç”ŸãŒçµ‚ã‚ã£ãŸã‚‰ã€æœ€åˆã‹ã‚‰å†ç”Ÿã—ç›´ã—ã¾ã™ã€‚"/> + </panel> + <panel label="オーディオ" name="land_audio_panel"> + <text name="MusicURL:"> + 音楽 URL: + </text> + <text name="Sound:"> + サウンド: + </text> + <check_box label="ジェスãƒãƒ£ãƒ¼ã¨ã‚ªãƒ–ジェクトã®éŸ³ã‚’ã“ã®åŒºç”»ã ã‘ã«é™å®š" name="check sound local"/> + <text name="Voice settings:"> + ボイス: + </text> + <check_box label="ボイスを有効ã«ã™ã‚‹" name="parcel_enable_voice_channel"/> + <check_box label="ボイスを有効ã«ã™ã‚‹ï¼ˆä¸å‹•ç”£è¨å®šï¼‰" name="parcel_enable_voice_channel_is_estate_disabled"/> + <check_box label="ã“ã®åŒºç”»ã§ã®ãƒœã‚¤ã‚¹ä½¿ç”¨ã‚’制é™ã™ã‚‹" name="parcel_enable_voice_channel_parcel"/> + </panel> + <panel label="アクセス" name="land_access_panel"> + <panel.string name="estate_override"> + 1ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•ç”£ãƒ¬ãƒ™ãƒ«ã§è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ + </panel.string> + <text name="Limit access to this parcel to:"> + ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ + </text> + <check_box label="パブリック・アクセスを許å¯" name="public_access"/> + <text name="Only Allow"> + 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ブãƒãƒƒã‚¯ï¼š + </text> + <check_box label="Linden Labã«æ”¯æ‰•ã„æƒ…å ±ã‚’ç™»éŒ²ã—ã¦ã„ãªã„ä½äºº" name="limit_payment" tool_tip="支払ã„æƒ…å ±æœªç¢ºèªã®ä½äººã‚’排除ã™ã‚‹"/> + <check_box label="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„æˆäººã®ä½äºº" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã‚’ç¦æ¢ã—ã¾ã™ã€‚ 詳ã—ã„æƒ…å ±ã¯ [SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/> + <check_box label="グループ・アクセスを許å¯ï¼š[GROUP]" name="GroupCheck" tool_tip="[一般]タブã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> + <check_box label="å…¥å ´è¨±å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯"/> + <combo_box name="pass_combo"> + <combo_box.item label="誰ã§ã‚‚" name="Anyone"/> + <combo_box.item label="グループ" name="Group"/> + </combo_box> + <spinner label="ä¾¡æ ¼ï¼ˆL$):" name="PriceSpin"/> + <spinner label="アクセス時間:" name="HoursSpin"/> + <text label="常ã«è¨±å¯" name="AllowedText"> + 許å¯ã•ã‚ŒãŸä½äºº + </text> + <name_list name="AccessList" tool_tip="([LISTED]リスト入りã€[MAX]最大)"/> + <button label="è¿½åŠ ..." label_selected="è¿½åŠ ..." name="add_allowed"/> + <button label="削除" label_selected="削除" name="remove_allowed"/> + <text label="ç¦æ¢" name="BanCheck"> + ç¦æ¢ã•ã‚ŒãŸä½äºº + </text> + <name_list name="BannedList" tool_tip="([LISTED]リスト入りã€[MAX]最大)"/> + <button label="è¿½åŠ ..." label_selected="è¿½åŠ ..." name="add_banned"/> + <button label="削除" label_selected="削除" name="remove_banned"/> + </panel> + </tab_container> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml index b61007d86e6..1bc12b839ce 100644 --- a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml @@ -1,101 +1,183 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Animation Preview" title=""> - <text name="name_label"> - åå‰ï¼š - </text> - <text name="description_label"> - 説明: - </text> - <spinner label="å„ªå…ˆé †ä½" name="priority" - tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã§ä¸Šæ›¸ãå¯èƒ½ãªä»–ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’制御ã—ã¾ã™ã€‚" /> - <text name="preview_label"> - åŒæ™‚進行行動 - </text> - <combo_box label="" name="preview_base_anim" - tool_tip="ã‚¢ãƒã‚¿ãƒ¼ãŒæ™®é€šã®è¡Œå‹•ã‚’ã™ã‚‹ã¨ãã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®å‹•ãをテストã™ã‚‹ãŸã‚ã«ã“れを使ã„ã¾ã™ã€‚"> - <combo_box.item name="Standing" label="ç«‹ã¤" /> - <combo_box.item name="Walking" label="æ©ã" /> - <combo_box.item name="Sitting" label="座る" /> - <combo_box.item name="Flying" label="飛行" /> - </combo_box> - <pad height="7" /> - <check_box label="ループ" name="loop_check" - tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ループå†ç”Ÿã—ã¾ã™ã€‚" /> - <spinner label="イン(ï¼…)" name="loop_in_point" - tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—復帰点をè¨å®šã—ã¾ã™ã€‚" label_width="45" left="70" width="100" /> - <spinner label="アウト(ï¼…)" name="loop_out_point" - tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—終了点をè¨å®šã—ã¾ã™ã€‚" label_width="60" left="170" width="100" /> - <text name="hand_label"> - 手ã®å‹•ã - </text> - <combo_box label="" name="hand_pose_combo" - tool_tip="アニメーションã®æ‰‹ã®å‹•ãをコントãƒãƒ¼ãƒ«ã—ã¾ã™ã€‚"> - <combo_box.item name="Spread" label="広ãŒã‚‹" /> - <combo_box.item name="Relaxed" label="リラックス" /> - <combo_box.item name="PointBoth" label="両方を指ã™" /> - <combo_box.item name="Fist" label="拳" /> - <combo_box.item name="RelaxedLeft" label="リラックス左" /> - <combo_box.item name="PointLeft" label="左を指ã™" /> - <combo_box.item name="FistLeft" label="拳左" /> - <combo_box.item name="RelaxedRight" label="リラックスå³" /> - <combo_box.item name="PointRight" label="å³ã‚’指ã™" /> - <combo_box.item name="FistRight" label="拳å³" /> - <combo_box.item name="SaluteRight" label="敬礼å³" /> - <combo_box.item name="Typing" label="入力ã™ã‚‹" /> - <combo_box.item name="PeaceRight" label="ピース・サインå³" /> - </combo_box> - <text name="emote_label"> - è¡¨ç¾ - </text> - <combo_box label="" name="emote_combo" - tool_tip="アニメーションã®é¡”を表情をコントãƒãƒ¼ãƒ«ã—ã¾ã™ã€‚"> - <combo_box.item name="[None]" label="None]" /> - <combo_box.item name="Aaaaah" label="アーーーーー" /> - <combo_box.item name="Afraid" label="怖れ" /> - <combo_box.item name="Angry" label="怒り" /> - <combo_box.item name="BigSmile" label="満é¢ã®ç¬‘ã¿" /> - <combo_box.item name="Bored" label="退屈" /> - <combo_box.item name="Cry" label="æ³£ã" /> - <combo_box.item name="Disdain" label="侮蔑" /> - <combo_box.item name="Embarrassed" label="困惑" /> - <combo_box.item name="Frown" label="ã—ã‹ã‚ã£é¢" /> - <combo_box.item name="Kiss" label="ã‚ス" /> - <combo_box.item name="Laugh" label="笑ã†" /> - <combo_box.item name="Plllppt" label="Plllppt" /> - <combo_box.item name="Repulsed" label="嫌悪感" /> - <combo_box.item name="Sad" label="悲ã—ã„" /> - <combo_box.item name="Shrug" label="è‚©ã‚’ã™ãã‚ã‚‹" /> - <combo_box.item name="Smile" label="笑ã¿" /> - <combo_box.item name="Surprise" label="é©šã" /> - <combo_box.item name="Wink" label="ウィンク" /> - <combo_box.item name="Worry" label="心é…" /> - </combo_box> - <spinner label="フェーズイï¾(秒)" name="ease_in_time" - tool_tip="アニメーションã®ãƒ–レンド・イン時間(秒)" /> - <spinner label="フェーズアウト(秒)" name="ease_out_time" - tool_tip="アニメーションã®ãƒ–レンド・アウト時間(秒)" /> - <button label="" name="play_btn" - tool_tip="アニメーションã®å†ç”Ÿï¼ä¸€æ™‚åœæ¢" /> - <button label="" name="stop_btn" tool_tip="アニメーションã®å†ç”Ÿã‚’åœæ¢" /> - <slider label="" name="playback_slider" /> - <text name="bad_animation_text"> - アニメーション・ファイルをèªã¿è¾¼ã‚ã¾ã›ã‚“。 - - Poser 4ã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚ŒãŸBVHファイルを推奨ã—ã¾ã™ã€‚ - </text> - <button label="å–り消ã—" name="cancel_btn" /> - <button label="アップロードL$[AMOUNT]" name="ok_btn" /> - <text name="failed_to_initialize"> - モーションをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—㟠- </text> - <text name="anim_too_long"> - アニメーションファイルã®é•·ã•ã¯[LENGTH]秒ã§ã™ã€‚ - -アニメーションã®æœ€å¤§ã®é•·ã•ã¯[MAX_LENGTH]秒ã§ã™ã€‚ - </text> - <text name="failed_file_read"> - アニメーションファイルをèªã¿å–ã‚Œã¾ã›ã‚“。 - -[STATUS] - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Animation Preview" title=""> + <floater.string name="failed_to_initialize"> + モーションをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—㟠+ </floater.string> + <floater.string name="anim_too_long"> + アニメーションファイルã®é•·ã•ã¯[LENGTH]秒ã§ã™ã€‚ + +アニメーションã®æœ€å¤§ã®é•·ã•ã¯[MAX_LENGTH]秒ã§ã™ã€‚ + </floater.string> + <floater.string name="failed_file_read"> + アニメーションファイルをèªã¿å–ã‚Œã¾ã›ã‚“。 + +[STATUS] + </floater.string> + <floater.string name="E_ST_OK"> + Ok + </floater.string> + <floater.string name="E_ST_EOF"> + ä¸å®Œå…¨ãªãƒ•ã‚¡ã‚¤ãƒ«ã€‚ + </floater.string> + <floater.string name="E_ST_NO_CONSTRAINT"> + 制約定義をèªã¿ã¨ã‚Œã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_FILE"> + BVH ファイルを開ã‘ã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_HIER"> + 無効㪠HIERARCHY ヘッダーã§ã™ã€‚. + </floater.string> + <floater.string name="E_ST_NO_JOINT"> + ROOT ã¾ãŸã¯ JOINT ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_NAME"> + JOINT ãƒãƒ¼ãƒ ã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_OFFSET"> + OFFSET ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_CHANNELS"> + CHANNELS ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_ROTATION"> + å›žè»¢é †åºã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_AXIS"> + 回転軸をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_MOTION"> + MOTION ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_FRAMES"> + フレーム数をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_FRAME_TIME"> + フレームタイムをå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_POS"> + ãƒã‚¸ã‚·ãƒ§ãƒ³å€¤ã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_ROT"> + 回転値をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_FILE"> + Cannot open translation file. + </floater.string> + <floater.string name="E_ST_NO_XLT_HEADER"> + Cannot read translation header. + </floater.string> + <floater.string name="E_ST_NO_XLT_NAME"> + Cannot read translation names. + </floater.string> + <floater.string name="E_ST_NO_XLT_IGNORE"> + Cannot read translation ignore value. + </floater.string> + <floater.string name="E_ST_NO_XLT_RELATIVE"> + Cannot read translation relative value. + </floater.string> + <floater.string name="E_ST_NO_XLT_OUTNAME"> + Cannot read translation outname value. + </floater.string> + <floater.string name="E_ST_NO_XLT_MATRIX"> + Cannot read translation matrix. + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGECHILD"> + Mergechild åã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_MERGEPARENT"> + Mergeparent åã‚’å–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_PRIORITY"> + プãƒãƒ‘ティ値をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_LOOP"> + ループ値をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEIN"> + Cannot get easeIn values. + </floater.string> + <floater.string name="E_ST_NO_XLT_EASEOUT"> + easeOut 値をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_HAND"> + Hand morph 値をå–å¾—ã§ãã¾ã›ã‚“。 + </floater.string> + <floater.string name="E_ST_NO_XLT_EMOTE"> + エモートåã‚’èªã¿ã¨ã‚Œã¾ã›ã‚“。 + </floater.string> + <text name="name_label"> + åå‰ï¼š + </text> + <text name="description_label"> + 説明: + </text> + <spinner label="å„ªå…ˆé †ä½" name="priority" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã§ä¸Šæ›¸ãå¯èƒ½ãªä»–ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’制御ã—ã¾ã™ã€‚"/> + <check_box label="ループ" name="loop_check" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ループå†ç”Ÿã—ã¾ã™ã€‚"/> + <spinner label="イン(ï¼…)" label_width="45" left="70" name="loop_in_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—復帰点をè¨å®šã—ã¾ã™ã€‚" width="100"/> + <spinner label="アウト(ï¼…)" label_width="60" left="170" name="loop_out_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—終了点をè¨å®šã—ã¾ã™ã€‚" width="100"/> + <text name="hand_label"> + 手ã®å‹•ã + </text> + <combo_box label="" name="hand_pose_combo" tool_tip="アニメーションã®æ‰‹ã®å‹•ãをコントãƒãƒ¼ãƒ«ã—ã¾ã™ã€‚"> + <combo_box.item label="広ãŒã‚‹" name="Spread"/> + <combo_box.item label="リラックス" name="Relaxed"/> + <combo_box.item label="両方を指ã™" name="PointBoth"/> + <combo_box.item label="拳" name="Fist"/> + <combo_box.item label="リラックス左" name="RelaxedLeft"/> + <combo_box.item label="左を指ã™" name="PointLeft"/> + <combo_box.item label="拳左" name="FistLeft"/> + <combo_box.item label="リラックスå³" name="RelaxedRight"/> + <combo_box.item label="å³ã‚’指ã™" name="PointRight"/> + <combo_box.item label="拳å³" name="FistRight"/> + <combo_box.item label="敬礼å³" name="SaluteRight"/> + <combo_box.item label="入力ã™ã‚‹" name="Typing"/> + <combo_box.item label="ピース・サインå³" name="PeaceRight"/> + </combo_box> + <text name="emote_label"> + è¡¨ç¾ + </text> + <combo_box label="" name="emote_combo" tool_tip="アニメーションã®é¡”を表情をコントãƒãƒ¼ãƒ«ã—ã¾ã™ã€‚"> + <combo_box.item label="None]" name="[None]"/> + <combo_box.item label="アーーーーー" name="Aaaaah"/> + <combo_box.item label="怖れ" name="Afraid"/> + <combo_box.item label="怒り" name="Angry"/> + <combo_box.item label="満é¢ã®ç¬‘ã¿" name="BigSmile"/> + <combo_box.item label="退屈" name="Bored"/> + <combo_box.item label="æ³£ã" name="Cry"/> + <combo_box.item label="侮蔑" name="Disdain"/> + <combo_box.item label="困惑" name="Embarrassed"/> + <combo_box.item label="ã—ã‹ã‚ã£é¢" name="Frown"/> + <combo_box.item label="ã‚ス" name="Kiss"/> + <combo_box.item label="笑ã†" name="Laugh"/> + <combo_box.item label="Plllppt" name="Plllppt"/> + <combo_box.item label="嫌悪感" name="Repulsed"/> + <combo_box.item label="悲ã—ã„" name="Sad"/> + <combo_box.item label="è‚©ã‚’ã™ãã‚ã‚‹" name="Shrug"/> + <combo_box.item label="笑ã¿" name="Smile"/> + <combo_box.item label="é©šã" name="Surprise"/> + <combo_box.item label="ウィンク" name="Wink"/> + <combo_box.item label="心é…" name="Worry"/> + </combo_box> + <text name="preview_label"> + åŒæ™‚進行行動 + </text> + <combo_box label="" name="preview_base_anim" tool_tip="ã‚¢ãƒã‚¿ãƒ¼ãŒæ™®é€šã®è¡Œå‹•ã‚’ã™ã‚‹ã¨ãã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®å‹•ãをテストã™ã‚‹ãŸã‚ã«ã“れを使ã„ã¾ã™ã€‚"> + <combo_box.item label="ç«‹ã¤" name="Standing"/> + <combo_box.item label="æ©ã" name="Walking"/> + <combo_box.item label="座る" name="Sitting"/> + <combo_box.item label="飛行" name="Flying"/> + </combo_box> + <spinner label="フェーズイï¾(秒)" name="ease_in_time" tool_tip="アニメーションã®ãƒ–レンド・イン時間(秒)"/> + <spinner label="フェーズアウト(秒)" name="ease_out_time" tool_tip="アニメーションã®ãƒ–レンド・アウト時間(秒)"/> + <button label="" name="play_btn" tool_tip="アニメーションã®å†ç”Ÿï¼ä¸€æ™‚åœæ¢"/> + <button label="" name="stop_btn" tool_tip="アニメーションã®å†ç”Ÿã‚’åœæ¢"/> + <slider label="" name="playback_slider"/> + <text name="bad_animation_text"> + アニメーション・ファイルをèªã¿è¾¼ã‚ã¾ã›ã‚“。 + + Poser 4ã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚ŒãŸBVHファイルを推奨ã—ã¾ã™ã€‚ + </text> + <button label="å–り消ã—" name="cancel_btn"/> + <button label="アップロードL$[AMOUNT]" name="ok_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml index ea076846529..eebc7eb88e6 100644 --- a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="avatarpicker" title="ä½äººã‚’é¸æŠž" min_width="275" width="275"> - <tab_container name="ResidentChooserTabs" width="265"> - <panel label="検索" name="SearchPanel" width="145"> - <text name="InstructSearchResidentName"> - ä½äººã®åå‰ã®ä¸€éƒ¨ã‚’入力: - </text> - <button label="検索" label_selected="検索" name="Find"/> - </panel> - <panel label="コーリングカード" name="CallingCardsPanel" width="145"> - <text name="InstructSelectCallingCard"> - コーリングカードをé¸æŠžï¼š - </text> - </panel> - <panel label="自分ã®è¿‘ã" name="NearMePanel" width="145"> - <text name="InstructSelectResident"> - è¿‘ãã®ä½äººã‚’é¸æŠžï¼š - </text> - <button label="リスト更新" label_selected="リスト更新" name="Refresh"/> - <slider label="範囲" name="near_me_range"/> - <text name="meters" width="50"> - メートル - </text> - </panel> - </tab_container> - <button label="é¸æŠž" label_selected="é¸æŠž" name="Select"/> - <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/> - <string name="not_found"> - 「[TEXT]ã€ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠- </string> - <string name="no_one_near"> - è¿‘ãã«èª°ã‚‚ã„ã¾ã›ã‚“ - </string> - <string name="no_results"> - 検索çµæžœï¼šã‚¼ãƒ - </string> - <string name="searching"> - 検索ä¸... - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater min_width="275" name="avatarpicker" title="ä½äººã‚’é¸æŠž" width="275"> + <tab_container name="ResidentChooserTabs" width="265"> + <panel label="検索" name="SearchPanel" width="145"> + <text name="InstructSearchResidentName"> + åå‰ã®ä¸€éƒ¨ã‚’入力: + </text> + <button label="検索" label_selected="検索" name="Find"/> + </panel> + <panel label="コーリングカード" name="CallingCardsPanel" width="145"> + <text name="InstructSelectCallingCard"> + コーリングカードをé¸æŠžï¼š + </text> + </panel> + <panel label="自分ã®è¿‘ã" name="NearMePanel" width="145"> + <text name="InstructSelectResident"> + è¿‘ãã®äººã‚’é¸æŠžï¼š + </text> + <button label="リスト更新" label_selected="リスト更新" name="Refresh"/> + <slider label="範囲" name="near_me_range"/> + <text name="meters" width="50"> + メートル + </text> + </panel> + </tab_container> + <button label="OK" label_selected="OK" name="Select"/> + <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/> + <string name="not_found"> + 「[TEXT]ã€ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠+ </string> + <string name="no_one_near"> + è¿‘ãã«èª°ã‚‚ã„ã¾ã›ã‚“ + </string> + <string name="no_results"> + 検索çµæžœï¼šã‚¼ãƒ + </string> + <string name="searching"> + 検索ä¸... + </string> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_beacons.xml b/indra/newview/skins/default/xui/ja/floater_beacons.xml index 2065656732f..4e89e11d0d2 100644 --- a/indra/newview/skins/default/xui/ja/floater_beacons.xml +++ b/indra/newview/skins/default/xui/ja/floater_beacons.xml @@ -1,15 +1,21 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="beacons" title="ビーコン(標è˜ï¼‰"> - <panel name="beacons_panel"> - <check_box label="タッï¾ï½µï¾ï¾˜ï½°ã®ï½½ï½¸ï¾˜ï¾Œï¾Ÿï¾„ã‚’å«ã‚€ï½µï¾Œï¾žï½¼ï¾žï½ªï½¸ï¾„" name="touch_only"/> - <check_box label="スクリプト・オブジェクト" name="scripted"/> - <check_box label="物ç†çš„オブジェクト" name="physical"/> - <check_box label="音æº" name="sounds"/> - <check_box label="パーティクルæº" name="particles"/> - <check_box label="ãƒã‚¤ãƒ©ã‚¤ãƒˆã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°" name="highlights"/> - <check_box label="ビーコン(標è˜)ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°" name="beacons"/> - <text name="beacon_width_label"> - ビーコン(標è˜)ã®å¹… - </text> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="beacons" title="ビーコン(標è˜ï¼‰"> + <panel name="beacons_panel"> + <text name="label_show"> + 表示: + </text> + <check_box label="ビーコン(標è˜ï¼‰" name="beacons"/> + <check_box label="ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="highlights"/> + <text name="beacon_width_label" tool_tip="ビーコン(標è˜ï¼‰ã®å¹…"> + 幅: + </text> + <text name="label_objects"> + 対象オブジェクト: + </text> + <check_box label="物ç†çš„" name="physical"/> + <check_box label="スクリプト" name="scripted"/> + <check_box label="触れる" name="touch_only"/> + <check_box label="音æº" name="sounds"/> + <check_box label="パーティクルæº" name="particles"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_build_options.xml b/indra/newview/skins/default/xui/ja/floater_build_options.xml index 49348aaa105..8b5e88fa7f4 100644 --- a/indra/newview/skins/default/xui/ja/floater_build_options.xml +++ b/indra/newview/skins/default/xui/ja/floater_build_options.xml @@ -1,8 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="build options floater" title="グリッドã®ã‚ªãƒ—ション"> - <spinner label="グリッドå˜ä½ï¼ˆï¾’ートル)" name="GridResolution" /> - <spinner label="グリッド範囲(メートル)" name="GridDrawSize" /> - <check_box label="サブユニット・スナッピングを有効化" name="GridSubUnit" /> - <check_box label="æ–é¢ã‚’表示" name="GridCrossSection" /> - <slider label="グリッドã®ä¸é€æ˜Žåº¦" name="GridOpacity" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="build options floater" title="グリッドã®ã‚ªãƒ—ション"> + <spinner label="グリッドユニット(メートル)" name="GridResolution"/> + <spinner label="グリッド範囲(メートル)" name="GridDrawSize"/> + <check_box label="サブユニットã«ã‚¹ãƒŠãƒƒãƒ—" name="GridSubUnit"/> + <check_box label="横æ–é¢ã‚’表示" name="GridCrossSection"/> + <text name="grid_opacity_label" tool_tip="グリッドã®é€æ˜Žåº¦"> + é€æ˜Žåº¦ï¼š + </text> + <slider label="グリッドã®ä¸é€æ˜Žåº¦" name="GridOpacity"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml index 6ee90038fb7..b86a3647fe3 100644 --- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml @@ -1,44 +1,53 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="コンテンツ権é™ã®ä¸€æ‹¬å¤‰æ›´"> - <text name="applyto"> - コンテンツã®ç¨®é¡ž - </text> - <check_box label="アニメーション" name="check_animation"/> - <check_box label="身体部ä½" name="check_bodypart"/> - <check_box label="æœ" name="check_clothing"/> - <check_box label="ジェスãƒãƒ£ãƒ¼" name="check_gesture"/> - <check_box label="ランドマーク" name="check_landmark"/> - <check_box label="ノートカード" name="check_notecard"/> - <check_box label="オブジェクト" name="check_object"/> - <check_box label="スクリプト" name="check_script"/> - <check_box label="サウンド" name="check_sound"/> - <check_box label="テクスãƒãƒ£ãƒ¼" name="check_texture"/> - <button label="å…¨ã¦é¸æŠž" label_selected="å…¨ã¦" name="check_all"/> - <button label="å…¨ã¦è§£é™¤" label_selected="ãªã—" name="check_none"/> - <text name="newperms"> - æ–°ã—ã„æ¨©é™ - </text> - <check_box label="グループã§å…±åŒç®¡ç†" name="share_with_group"/> - <check_box label="誰ã«å¯¾ã—ã¦ã‚‚コピーを許å¯" name="everyone_copy"/> - <text name="NextOwnerLabel"> - 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ãŒã§ãã‚‹æ“作: - </text> - <check_box label="ä¿®æ£" name="next_owner_modify"/> - <check_box label="コピー" name="next_owner_copy"/> - <check_box label="å†è²©/プレゼント" name="next_owner_transfer"/> - <button label="ヘルプ" name="help"/> - <button label="é©ç”¨" name="apply"/> - <button label="é–‰ã˜ã‚‹" name="close"/> - <string name="nothing_to_modify_text"> - é¸æŠžã—ãŸä¸ã«ç·¨é›†ã§ããªã„コンテンツãŒå«ã¾ã‚Œã¦ã„ã¾ã™ - </string> - <string name="status_text"> - [NAME]ã«æ¨©é™ã‚’è¨å®šä¸ã§ã™ã€‚ - </string> - <string name="start_text"> - 権é™å¤‰æ›´ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã—ã¦ã„ã¾ã™ - </string> - <string name="done_text"> - 権é™å¤‰æ›´ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒå®Œäº†ã—ã¾ã—㟠- </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floaterbulkperms" title="コンテンツ権é™ã‚’編集"> + <floater.string name="nothing_to_modify_text"> + é¸æŠžã—ãŸä¸ã«ç·¨é›†ã§ããªã„コンテンツãŒå«ã¾ã‚Œã¦ã„ã¾ã™ + </floater.string> + <floater.string name="status_text"> + [NAME]ã«æ¨©é™ã‚’è¨å®šä¸ã§ã™ã€‚ + </floater.string> + <floater.string name="start_text"> + 権é™å¤‰æ›´ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã—ã¦ã„ã¾ã™ + </floater.string> + <floater.string name="done_text"> + 権é™å¤‰æ›´ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒå®Œäº†ã—ã¾ã—㟠+ </floater.string> + <check_box label="アニメーション" name="check_animation"/> + <icon name="icon_animation" tool_tip="アニメーション"/> + <check_box label="身体部ä½" name="check_bodypart"/> + <icon name="icon_bodypart" tool_tip="身体部ä½"/> + <check_box label="æœ" name="check_clothing"/> + <icon name="icon_clothing" tool_tip="衣類"/> + <check_box label="ジェスãƒãƒ£ãƒ¼" name="check_gesture"/> + <icon name="icon_gesture" tool_tip="ジェスãƒãƒ£ãƒ¼"/> + <check_box label="ノートカード" name="check_notecard"/> + <icon name="icon_notecard" tool_tip="ノートカード"/> + <check_box label="オブジェクト" name="check_object"/> + <icon name="icon_object" tool_tip="オブジェクト"/> + <check_box label="スクリプト" name="check_script"/> + <icon name="icon_script" tool_tip="スクリプト"/> + <check_box label="サウンド" name="check_sound"/> + <icon name="icon_sound" tool_tip="サウンド"/> + <check_box label="テクスãƒãƒ£ãƒ¼" name="check_texture"/> + <button label="√ ã™ã¹ã¦" label_selected="å…¨ã¦" name="check_all"/> + <button label="クリア" label_selected="ãªã—" name="check_none"/> + <text name="newperms"> + æ–°ã—ã„ã‚³ãƒ³ãƒ†ãƒ³ãƒ„æ¨©é™ + </text> + <text name="GroupLabel"> + グループ: + </text> + <check_box label="共有" name="share_with_group"/> + <text name="AnyoneLabel"> + ã™ã¹ã¦ã®äººï¼š + </text> + <check_box label="コピー" name="everyone_copy"/> + <text name="NextOwnerLabel"> + 次ã®æ‰€æœ‰è€…: + </text> + <check_box label="ä¿®æ£" name="next_owner_modify"/> + <check_box label="コピー" name="next_owner_copy"/> + <check_box initial_value="true" label="å†è²©/プレゼント" name="next_owner_transfer" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/> + <button label="OK" name="apply"/> + <button label="ã‚ャンセル" name="close"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_buy_object.xml b/indra/newview/skins/default/xui/ja/floater_buy_object.xml index 1b5dd8b9794..fc0418f8088 100644 --- a/indra/newview/skins/default/xui/ja/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/ja/floater_buy_object.xml @@ -1,26 +1,26 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="contents" title="オブジェクトã®ã‚³ãƒ”ーを購入"> - <text name="contents_text"> - ãŠã‚ˆã³ãã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„: - </text> - <text name="buy_text"> - [NAME]ã‹ã‚‰L$[AMOUNT]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ - </text> - <button label="å–消" label_selected="å–消" name="cancel_btn" /> - <button label="購入" label_selected="購入" name="buy_btn" /> - <text name="title_buy_text"> - 購入 - </text> - <string name="title_buy_copy_text"> - 次ã®ã‚‚ã®ã‚’買ㆠ- </string> - <text name="no_copy_text"> - (コピーãªã—) - </text> - <text name="no_modify_text"> - (ä¿®æ£ãªã—) - </text> - <text name="no_transfer_text"> - (転é€ãªã—) - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="contents" title="オブジェクトã®ã‚³ãƒ”ーを購入"> + <text name="contents_text"> + 内容: + </text> + <text name="buy_text"> + [NAME]ã‹ã‚‰L$[AMOUNT]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ + </text> + <button label="å–消" label_selected="å–消" name="cancel_btn"/> + <button label="購入" label_selected="購入" name="buy_btn"/> + <text name="title_buy_text"> + 購入 + </text> + <string name="title_buy_copy_text"> + 次ã®ã‚‚ã®ã‚’買ㆠ+ </string> + <text name="no_copy_text"> + (コピーãªã—) + </text> + <text name="no_modify_text"> + (ä¿®æ£ãªã—) + </text> + <text name="no_transfer_text"> + (転é€ãªã—) + </text> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_camera.xml b/indra/newview/skins/default/xui/ja/floater_camera.xml index bb87b194a47..06e42a29d9b 100644 --- a/indra/newview/skins/default/xui/ja/floater_camera.xml +++ b/indra/newview/skins/default/xui/ja/floater_camera.xml @@ -1,16 +1,23 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="camera_floater"> - <floater.string name="rotate_tooltip"> - フォーカスをä¸å¿ƒã«ã‚«ãƒ¡ãƒ©ã‚’回転 - </floater.string> - <floater.string name="zoom_tooltip"> - フォーカスã«å‘ã‘ã¦ã‚«ãƒ¡ãƒ©ã‚’ズーム- </floater.string> - <floater.string name="move_tooltip"> - カメラを上下左å³ã«ç§»å‹• - </floater.string> - <panel name="controls"> - <joystick_track name="cam_track_stick" tool_tip="カメラを上下左å³ã«ç§»å‹•"/> - <joystick_zoom name="zoom" tool_tip="フォーカスã«å‘ã‘ã¦ã‚«ãƒ¡ãƒ©ã‚’ズーム"/> - </panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="camera_floater"> + <floater.string name="rotate_tooltip"> + フォーカスをä¸å¿ƒã«ã‚«ãƒ¡ãƒ©ã‚’回転 + </floater.string> + <floater.string name="zoom_tooltip"> + フォーカスã«å‘ã‘ã¦ã‚«ãƒ¡ãƒ©ã‚’ズーム+ </floater.string> + <floater.string name="move_tooltip"> + カメラを上下左å³ã«ç§»å‹• + </floater.string> + <panel name="controls"> + <joystick_track name="cam_track_stick" tool_tip="カメラを上下左å³ã«ç§»å‹•"/> + <joystick_zoom name="zoom" tool_tip="å‘ã„ã¦ã‚‹æ–¹æ³•ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム"/> + <joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸ã«ã‚«ãƒ¡ãƒ©ã‚’回ã™"/> + </panel> + <panel name="buttons"> + <button label="" name="orbit_btn" tool_tip="カメラを旋回"/> + <button label="" name="pan_btn" tool_tip="カメラを水平・垂直移動"/> + <button label="" name="avatarview_btn" tool_tip="ã‚¢ãƒã‚¿ãƒ¼è¦–点"/> + <button label="" name="freecamera_btn" tool_tip="オブジェクトを見る"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_color_picker.xml b/indra/newview/skins/default/xui/ja/floater_color_picker.xml index 8047e49b756..cd871f72143 100644 --- a/indra/newview/skins/default/xui/ja/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/ja/floater_color_picker.xml @@ -1,31 +1,31 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="ColorPicker" title="カラー・ピッカー"> - <text name="r_val_text"> - 赤: - </text> - <text name="g_val_text"> - 緑: - </text> - <text name="b_val_text"> - é’: - </text> - <text name="h_val_text"> - 色相: - </text> - <text name="s_val_text"> - 色調: - </text> - <text name="l_val_text"> - è¼åº¦ï¼š - </text> - <check_box label="ãŸã ã¡ã«é©ç”¨" name="apply_immediate" /> - <button label="" label_selected="" name="color_pipette" /> - <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn" /> - <button label="é¸æŠž" label_selected="é¸æŠž" name="select_btn" /> - <text name="Current color:"> - ç¾åœ¨ã®è‰²ï¼š - </text> - <text name="(Drag below to save.)"> - ドラッグã—ã¦ä¿å˜ - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="ColorPicker" title="カラー・ピッカー"> + <text name="r_val_text"> + 赤: + </text> + <text name="g_val_text"> + 緑: + </text> + <text name="b_val_text"> + é’: + </text> + <text name="h_val_text"> + 色相: + </text> + <text name="s_val_text"> + 色調: + </text> + <text name="l_val_text"> + è¼åº¦ï¼š + </text> + <check_box label="今ã™ãé©ç”¨" name="apply_immediate"/> + <button label="" label_selected="" name="color_pipette"/> + <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/> + <button label="OK" label_selected="é¸æŠž" name="select_btn"/> + <text name="Current color:"> + ç¾åœ¨ã®è‰²ï¼š + </text> + <text name="(Drag below to save.)"> + ドラッグã—ã¦ä¿å˜ + </text> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_god_tools.xml b/indra/newview/skins/default/xui/ja/floater_god_tools.xml index 8fe41a823a9..e21b06988c3 100644 --- a/indra/newview/skins/default/xui/ja/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_god_tools.xml @@ -1,144 +1,97 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="godtools floater" title="ゴッド・ツール"> - <tab_container name="GodTools Tabs"> - <panel label="グリッド" name="grid"> - <button label="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" - label_selected="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" - name="Kick all users" /> - <button label="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚ャッシュを消去" - label_selected="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚ャッシュを消去" - name="Flush This Region's Map Visibility Caches" /> - </panel> - <panel label="地域" name="region"> - <text name="Sim Name:"> - シムå: - </text> - <check_box label="準備" name="check prelude" - tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã®æº–備をã—ã¾ã™ã€‚" /> - <check_box label="太陽固定" name="check fixed sun" - tool_tip="太陽ä½ç½®ã‚’固定([地域ï¼ä¸å‹•ç”£]>[地形]ã®å ´åˆã¨åŒæ§˜ï¼‰" /> - <check_box label="テレãƒãƒ¼ãƒˆã®ãƒ›ãƒ¼ãƒ をリセット" name="check reset home" - tool_tip="ä½äººãŒãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§åŽ»ã£ãŸã¨ãã€å½¼ã‚‰ã®ãƒ›ãƒ¼ãƒ を目的地ã«ãƒªã‚»ãƒƒãƒˆã™ã‚‹ã€‚" /> - <check_box label="å¯è¦–" name="check visible" - tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã‚’ゴッド・モード以外ã§ã‚‚å¯è¦–ã«ã—ã¾ã™ã€‚" /> - <check_box label="ダメージ" name="check damage" - tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’有効化ã—ã¾ã™ã€‚" /> - <check_box label="トラフィック・トラッã‚ングをブãƒãƒƒã‚¯" - name="block dwell" - tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯è¨ˆç®—をオフã«ã—ã¾ã™ã€‚" /> - <check_box label="土地整備をブãƒãƒƒã‚¯" name="block terraform" - tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ã®åœŸåœ°æ•´å‚™ã‚’ç¦æ¢" /> - <check_box label="サンドボックス" name="is sandbox" - tool_tip="ã“ã‚ŒãŒã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹åœ°åŸŸã§ã‚‚切り替ãˆ" /> - <button label="地形を構築ã™ã‚‹" label_selected="地形を構築ã™ã‚‹" - name="Bake Terrain" - tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨ã—ã¦ä¿å˜ã—ã¾ã™ã€‚" /> - <button label="地形を元ã«æˆ»ã™" label_selected="地形を元ã«æˆ»ã™" - name="Revert Terrain" - tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚" /> - <button label="地形を交æ›" label_selected="地形を交æ›" name="Swap Terrain" - tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨å…¥ã‚Œæ›¿ãˆã¾ã™ã€‚" /> - <text name="estate id"> - ä¸å‹•ç”£ID: - </text> - <text name="parent id"> - 親ID: - </text> - <line_editor name="parentestate" tool_tip="ã“ã‚Œã¯ã€ã“ã®åœ°åŸŸã®è¦ªä¸å‹•ç”£ã§ã™ã€‚" /> - <text name="Grid Pos: "> - グリッドä½ç½®ï¼š - </text> - <line_editor name="gridposx" - tool_tip="ã“ã‚Œã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰xã®ä½ç½®ã§ã™ã€‚" /> - <line_editor name="gridposy" - tool_tip="ã“ã‚Œã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰yã®ä½ç½®ã§ã™ã€‚" /> - <text name="Redirect to Grid: "> - グリッドã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆï¼š - </text> - <text name="billable factor text"> - 請求率: - </text> - <text name="land cost text"> - 平方メートル当ãŸã‚ŠL$: - </text> - <button label="æ›´æ–°" label_selected="æ›´æ–°" name="Refresh" - tool_tip="上記ã®æƒ…å ±ã‚’æ›´æ–°ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚" /> - <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" - tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚" /> - <button label="地域をé¸æŠž" label_selected="地域をé¸æŠž" name="Select Region" - tool_tip="土地ツールã§åœ°åŸŸå…¨ä½“ã‚’é¸æŠžã—ã¦ãã ã•ã„。" /> - <button label="ãŸã ã¡ã«è‡ªå‹•ä¿å˜ã™ã‚‹" - label_selected="ãŸã ã¡ã«è‡ªå‹•ä¿å˜ã™ã‚‹" name="Autosave now" - tool_tip="Gzip状態を自動ä¿å˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ä¿å˜ã—ã¾ã™ã€‚" /> - </panel> - <panel label="オブジェクト" name="objects"> - <text name="Sim Name:"> - シムå: - </text> - <text name="region name"> - ウェルシュ - </text> - <check_box label="スクリプトを無効化" name="disable scripts" - tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åŠ¹åŒ–" /> - <check_box label="è¡çªã‚’無効化" name="disable collisions" - tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®éžã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆè¡çªã‚’無効化" /> - <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable physics" - tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ç‰©ç†çš„作用をã™ã¹ã¦ç„¡åŠ¹åŒ–" /> - <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" - tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚" /> - <button label="対象ã®è¨å®š" label_selected="対象ã®è¨å®š" name="Set Target" - tool_tip="オブジェクト削除ã®å¯¾è±¡ã¨ãªã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‚’è¨å®šã—ã¦ãã ã•ã„。" /> - <text name="target_avatar_name"> - (対象ãªã—) - </text> - <button - label="ä»–ã®åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" - label_selected="ä»–ã®åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" - name="Delete Target's Scripted Objects On Others Land" - tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„ãªã„スクリプト・オブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ (コピーç¦æ¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•ã‚Œã¾ã™ã€‚" /> - <button - label="「ã™ã¹ã¦ã®ã€åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" - label_selected="「ã™ã¹ã¦ã®ã€åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" - name="Delete Target's Scripted Objects On *Any* Land" - tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„るスクリプト・オブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ (コピーç¦æ¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•ã‚Œã¾ã™ã€‚" /> - <button label="対象ã®ã‚ªãƒ–ジェクトを「ã™ã¹ã¦ã€å‰Šé™¤" - label_selected="対象ã®ã‚ªãƒ–ジェクトを「ã™ã¹ã¦ã€å‰Šé™¤" - name="Delete *ALL* Of Target's Objects" - tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ (コピーç¦æ¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•ã‚Œã¾ã™ã€‚" /> - <button label="トップ・コライダーをå–å¾—" - label_selected="トップ・コライダーをå–å¾—" - name="Get Top Colliders" - tool_tip="最も段階ã®ç‹ã„コールãƒãƒƒã‚¯ãŒç™ºç”Ÿã—ãŸã‚ªãƒ–ジェクトã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚" /> - <button label="トップ・スクリプトをå–å¾—" - label_selected="トップ・スクリプトをå–å¾—" - name="Get Top Scripts" - tool_tip="スクリプトã®èµ·å‹•ã«æœ€ã‚‚時間を費やã—ã¦ã„るオブジェクトã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚" /> - <button label="スクリプト・ダイジェスト" - label_selected="スクリプト・ダイジェスト" name="Scripts digest" - tool_tip="ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トã¨ãれらã®ä½¿ç”¨å›žæ•°ã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚" /> - </panel> - <panel label="è¦æ±‚" name="request"> - <text name="Destination:"> - 目的地: - </text> - <combo_box name="destination"> - <combo_box.item name="item1" label="é¸æŠž"/> - <combo_box.item name="item2" label="エージェント地域"/> - </combo_box> - <text name="Request:"> - è¦æ±‚: - </text> - <combo_box name="request"> - <combo_box.item name="item1" label="コライダー<ステップ>"/> - <combo_box.item name="item2" label="スクリプト<回数>ã€ï¼œã‚ªãƒ—ション・パターン>"/> - <combo_box.item name="item3" label="オブジェクト<パターン>"/> - <combo_box.item name="item4" label="rez <asset_id>"/> - </combo_box> - <text name="Parameter:"> - パラメーター: - </text> - <button label="リクエストã™ã‚‹" label_selected="リクエストã™ã‚‹" - name="Make Request" /> - </panel> - </tab_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="godtools floater" title="ゴッド・ツール"> + <tab_container name="GodTools Tabs"> + <panel label="グリッド" name="grid"> + <button label="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" label_selected="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" name="Kick all users"/> + <button label="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚ャッシュを消去" label_selected="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚ャッシュを消去" name="Flush This Region's Map Visibility Caches"/> + </panel> + <panel label="地域" name="region"> + <text name="Sim Name:"> + シムå: + </text> + <check_box label="準備" name="check prelude" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã®æº–備をã—ã¾ã™ã€‚"/> + <check_box label="太陽固定" name="check fixed sun" tool_tip="太陽ä½ç½®ã‚’固定([地域ï¼ä¸å‹•ç”£]>[地形]ã®å ´åˆã¨åŒæ§˜ï¼‰"/> + <check_box label="テレãƒãƒ¼ãƒˆã®ãƒ›ãƒ¼ãƒ をリセット" name="check reset home" tool_tip="ä½äººãŒãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§åŽ»ã£ãŸã¨ãã€å½¼ã‚‰ã®ãƒ›ãƒ¼ãƒ を目的地ã«ãƒªã‚»ãƒƒãƒˆã™ã‚‹ã€‚"/> + <check_box label="å¯è¦–" name="check visible" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã‚’ゴッド・モード以外ã§ã‚‚å¯è¦–ã«ã—ã¾ã™ã€‚"/> + <check_box label="ダメージ" name="check damage" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’有効化ã—ã¾ã™ã€‚"/> + <check_box label="トラフィック・トラッã‚ングをブãƒãƒƒã‚¯" name="block dwell" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯è¨ˆç®—をオフã«ã—ã¾ã™ã€‚"/> + <check_box label="土地整備をブãƒãƒƒã‚¯" name="block terraform" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ã®åœŸåœ°æ•´å‚™ã‚’ç¦æ¢"/> + <check_box label="サンドボックス" name="is sandbox" tool_tip="ã“ã‚ŒãŒã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹åœ°åŸŸã§ã‚‚切り替ãˆ"/> + <button label="地形を構築ã™ã‚‹" label_selected="地形を構築ã™ã‚‹" name="Bake Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨ã—ã¦ä¿å˜ã—ã¾ã™ã€‚"/> + <button label="地形を元ã«æˆ»ã™" label_selected="地形を元ã«æˆ»ã™" name="Revert Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚"/> + <button label="地形を交æ›" label_selected="地形を交æ›" name="Swap Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨å…¥ã‚Œæ›¿ãˆã¾ã™ã€‚"/> + <text name="estate id"> + ä¸å‹•ç”£ID: + </text> + <text name="parent id"> + 親ID: + </text> + <line_editor name="parentestate" tool_tip="ã“ã‚Œã¯ã€ã“ã®åœ°åŸŸã®è¦ªä¸å‹•ç”£ã§ã™ã€‚"/> + <text name="Grid Pos: "> + グリッドä½ç½®ï¼š + </text> + <line_editor name="gridposx" tool_tip="ã“ã‚Œã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰xã®ä½ç½®ã§ã™ã€‚"/> + <line_editor name="gridposy" tool_tip="ã“ã‚Œã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰yã®ä½ç½®ã§ã™ã€‚"/> + <text name="Redirect to Grid: "> + グリッドã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆï¼š + </text> + <text name="billable factor text"> + 請求率: + </text> + <text name="land cost text"> + 平方メートル当ãŸã‚ŠL$: + </text> + <button label="æ›´æ–°" label_selected="æ›´æ–°" name="Refresh" tool_tip="上記ã®æƒ…å ±ã‚’æ›´æ–°ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/> + <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/> + <button label="地域をé¸æŠž" label_selected="地域をé¸æŠž" name="Select Region" tool_tip="土地ツールã§åœ°åŸŸå…¨ä½“ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> + <button label="ãŸã ã¡ã«è‡ªå‹•ä¿å˜ã™ã‚‹" label_selected="ãŸã ã¡ã«è‡ªå‹•ä¿å˜ã™ã‚‹" name="Autosave now" tool_tip="Gzip状態を自動ä¿å˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ä¿å˜ã—ã¾ã™ã€‚"/> + </panel> + <panel label="オブジェクト" name="objects"> + <panel.string name="no_target"> + (ターゲットãªã—) + </panel.string> + <text name="Sim Name:"> + シムå: + </text> + <text name="region name"> + ウェルシュ + </text> + <check_box label="スクリプトを無効化" name="disable scripts" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åŠ¹åŒ–"/> + <check_box label="è¡çªã‚’無効化" name="disable collisions" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®éžã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆè¡çªã‚’無効化"/> + <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable physics" tool_tip="ã“ã®è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ç‰©ç†çš„作用をã™ã¹ã¦ç„¡åŠ¹åŒ–"/> + <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/> + <button label="対象ã®è¨å®š" label_selected="対象ã®è¨å®š" name="Set Target" tool_tip="オブジェクト削除ã®å¯¾è±¡ã¨ãªã‚‹ã‚¢ãƒã‚¿ãƒ¼ã‚’è¨å®šã—ã¦ãã ã•ã„。"/> + <text name="target_avatar_name"> + (対象ãªã—) + </text> + <button label="ä»–ã®åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" label_selected="ä»–ã®åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" name="Delete Target's Scripted Objects On Others Land" tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„ãªã„スクリプト・オブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ (コピーç¦æ¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•ã‚Œã¾ã™ã€‚"/> + <button label="「ã™ã¹ã¦ã®ã€åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" label_selected="「ã™ã¹ã¦ã®ã€åœŸåœ°ã«ãŠã‘る対象ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトを削除" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„るスクリプト・オブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ (コピーç¦æ¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•ã‚Œã¾ã™ã€‚"/> + <button label="対象ã®ã‚ªãƒ–ジェクトを「ã™ã¹ã¦ã€å‰Šé™¤" label_selected="対象ã®ã‚ªãƒ–ジェクトを「ã™ã¹ã¦ã€å‰Šé™¤" name="Delete *ALL* Of Target's Objects" tool_tip="ã“ã®åœ°åŸŸã«ãŠã„ã¦å¯¾è±¡ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトをã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã€‚ (コピーç¦æ¢ï¼‰ã‚ªãƒ–ジェクトã¯è¿”å´ã•ã‚Œã¾ã™ã€‚"/> + <button label="トップ・コライダーをå–å¾—" label_selected="トップ・コライダーをå–å¾—" name="Get Top Colliders" tool_tip="最も段階ã®ç‹ã„コールãƒãƒƒã‚¯ãŒç™ºç”Ÿã—ãŸã‚ªãƒ–ジェクトã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚"/> + <button label="トップ・スクリプトをå–å¾—" label_selected="トップ・スクリプトをå–å¾—" name="Get Top Scripts" tool_tip="スクリプトã®èµ·å‹•ã«æœ€ã‚‚時間を費やã—ã¦ã„るオブジェクトã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚"/> + <button label="スクリプト・ダイジェスト" label_selected="スクリプト・ダイジェスト" name="Scripts digest" tool_tip="ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トã¨ãれらã®ä½¿ç”¨å›žæ•°ã®ãƒªã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚"/> + </panel> + <panel label="è¦æ±‚" name="request"> + <text name="Destination:"> + 目的地: + </text> + <combo_box name="destination"> + <combo_box.item label="é¸æŠž" name="item1"/> + <combo_box.item label="エージェント地域" name="item2"/> + </combo_box> + <text name="Request:"> + è¦æ±‚: + </text> + <combo_box name="request"> + <combo_box.item label="コライダー<ステップ>" name="item1"/> + <combo_box.item label="スクリプト<回数>ã€ï¼œã‚ªãƒ—ション・パターン>" name="item2"/> + <combo_box.item label="オブジェクト<パターン>" name="item3"/> + <combo_box.item label="rez <asset_id>" name="item4"/> + </combo_box> + <text name="Parameter:"> + パラメーター: + </text> + <button label="リクエストã™ã‚‹" label_selected="リクエストã™ã‚‹" name="Make Request"/> + </panel> + </tab_container> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml index 67d105c2a44..309a35a2a28 100644 --- a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml @@ -1,32 +1,28 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Hardware Settings Floater" title="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢è¨å®š"> - <text name="Filtering:"> - フィルタリング: - </text> - <check_box - label="異方的フィルタリング(有効ã«ã™ã‚‹ã¨é€Ÿåº¦ãŒä½Žä¸‹ã—ã¾ã™ï¼‰" - name="ani" /> - <text name="Antialiasing:"> - アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°: - </text> - <combo_box label="アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°" name="fsaa"> - <combo_box.item name="FSAADisabled" label="無効" /> - <combo_box.item name="2x" label="2x" /> - <combo_box.item name="4x" label="4x" /> - <combo_box.item name="8x" label="8x" /> - <combo_box.item name="16x" label="16x" /> - </combo_box> - <spinner label="ガンマ:" name="gamma" /> - <text name="(brightness, lower is brighter)"> - (è¼åº¦ï¼šä½Žã„ï¼é«˜è¼åº¦ã€0ï¼ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ï¼‰ - </text> - <text name="Enable VBO:"> - VBO を有効化: - </text> - <check_box label="OpenGL Vertex Buffer Objectsを有効化" name="vbo" - tool_tip="最新ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã“ã®è¨å®šã‚’有効ã«ã™ã‚‹ã¨ã€ãƒ‘フォーマンスãŒå‘上ã—ã¾ã™ã€‚ ã—ã‹ã—ã€æ—§åž‹ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã¯ VBO ã®å®Ÿè£…ãŒè²§å¼±ãªå ´åˆãŒå¤šãã€ã“ã®è¨å®šã‚’有効ã«ã™ã‚‹ã“ã¨ã§ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã«ã¤ãªãŒã‚‹ãŠãã‚ŒãŒã‚ã‚Šã¾ã™ã€‚" /> - <slider label="テクスãƒãƒ£ï¾’モリ(MB):" name="GrapicsCardTextureMemory" - tool_tip="テクスãƒãƒ£ãƒ¼ã«å‰²ã‚Šå½“ã¦ã‚‹ãƒ¡ãƒ¢ãƒªã®åˆè¨ˆã€‚ ビデオ・カード・メモリをデフォルトã«ã—ã¾ã™ã€‚ ã“ã®æ•°å€¤ã‚’減らã™ã¨ã€ãƒ‘フォーマンスãŒæ”¹å–„ã•ã‚Œã¾ã™ãŒã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ãŒã¼ã‚„ã‘ãŸæ„Ÿã˜ã«ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚" /> - <spinner label="フォグã®è·é›¢æ¯”率:" name="fog" /> - <button label="OK" label_selected="OK" name="OK" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Hardware Settings Floater" title="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢è¨å®š"> + <text name="Filtering:"> + フィルタリング: + </text> + <check_box label="異方的フィルタリング(有効ã«ã™ã‚‹ã¨é€Ÿåº¦ãŒä½Žä¸‹ã—ã¾ã™ï¼‰" name="ani"/> + <text name="Antialiasing:"> + アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°: + </text> + <combo_box label="アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°" name="fsaa"> + <combo_box.item label="無効" name="FSAADisabled"/> + <combo_box.item label="2x" name="2x"/> + <combo_box.item label="4x" name="4x"/> + <combo_box.item label="8x" name="8x"/> + <combo_box.item label="16x" name="16x"/> + </combo_box> + <spinner label="ガンマ:" name="gamma"/> + <text name="(brightness, lower is brighter)"> + (0 ã§ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã€ä½Žã„ã»ã©æ˜Žã‚‹ã„) + </text> + <text name="Enable VBO:"> + VBO を有効化: + </text> + <check_box label="OpenGL Vertex Buffer Objectsを有効化" name="vbo" tool_tip="最新ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã“ã®è¨å®šã‚’有効ã«ã™ã‚‹ã¨ã€ãƒ‘フォーマンスãŒå‘上ã—ã¾ã™ã€‚ ã—ã‹ã—ã€æ—§åž‹ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã¯ VBO ã®å®Ÿè£…ãŒè²§å¼±ãªå ´åˆãŒå¤šãã€ã“ã®è¨å®šã‚’有効ã«ã™ã‚‹ã“ã¨ã§ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã«ã¤ãªãŒã‚‹ãŠãã‚ŒãŒã‚ã‚Šã¾ã™ã€‚"/> + <slider label="テクスãƒãƒ£ï¾’モリ(MB):" name="GrapicsCardTextureMemory" tool_tip="テクスãƒãƒ£ãƒ¼ã«å‰²ã‚Šå½“ã¦ã‚‹ãƒ¡ãƒ¢ãƒªã®åˆè¨ˆã€‚ ビデオ・カード・メモリをデフォルトã«ã—ã¾ã™ã€‚ ã“ã®æ•°å€¤ã‚’減らã™ã¨ã€ãƒ‘フォーマンスãŒæ”¹å–„ã•ã‚Œã¾ã™ãŒã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ãŒã¼ã‚„ã‘ãŸæ„Ÿã˜ã«ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚"/> + <spinner label="フォグã®è·é›¢æ¯”率:" name="fog"/> + <button label="OK" label_selected="OK" name="OK"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_image_preview.xml b/indra/newview/skins/default/xui/ja/floater_image_preview.xml index fae9c87da48..42a4a2fd7f8 100644 --- a/indra/newview/skins/default/xui/ja/floater_image_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_image_preview.xml @@ -1,32 +1,32 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Image Preview" title=""> - <text name="name_label"> - åå‰ï¼š - </text> - <text name="description_label"> - 説明: - </text> - <text name="preview_label"> - イメージã®ï¾Œï¾Ÿï¾šï¾‹ï¾žï½ï½°ï¼š - </text> - <combo_box label="æœã®ç¨®é¡ž" name="clothing_type_combo"> - <combo_box.item name="Image" label="ç”»åƒ" /> - <combo_box.item name="Hair" label="髪" /> - <combo_box.item name="FemaleHead" label="女性ã®é " /> - <combo_box.item name="FemaleUpperBody" label="女性ã®ä¸ŠåŠèº«" /> - <combo_box.item name="FemaleLowerBody" label="女性ã®ä¸‹åŠèº«" /> - <combo_box.item name="MaleHead" label="男性ã®é " /> - <combo_box.item name="MaleUpperBody" label="男性ã®ä¸ŠåŠèº«" /> - <combo_box.item name="MaleLowerBody" label="男性ã®ä¸‹åŠèº«" /> - <combo_box.item name="Skirt" label="スカート" /> - <combo_box.item name="SculptedPrim" label="変形ã•ã‚ŒãŸãƒ—リム" /> - </combo_box> - <text name="bad_image_text"> - イメージをèªã¿å–ã‚Œã¾ã›ã‚“。 - -24bitTarga(.tga)ã§ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’ä¿å˜ã—ã¦ãã ã•ã„。 - </text> - <check_box label="ãƒã‚¹ã®ãªã„圧縮を使用" name="lossless_check" /> - <button label="å–り消ã—" name="cancel_btn" /> - <button label="アップロードL$[AMOUNT]" name="ok_btn" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Image Preview" title=""> + <text name="name_label"> + åå‰ï¼š + </text> + <text name="description_label"> + 説明: + </text> + <text name="preview_label"> + イメージã®ï¾Œï¾Ÿï¾šï¾‹ï¾žï½ï½°ï¼š + </text> + <combo_box label="æœã®ç¨®é¡ž" name="clothing_type_combo"> + <combo_box.item label="ç”»åƒ" name="Image"/> + <combo_box.item label="髪" name="Hair"/> + <combo_box.item label="女性ã®é " name="FemaleHead"/> + <combo_box.item label="女性ã®ä¸ŠåŠèº«" name="FemaleUpperBody"/> + <combo_box.item label="女性ã®ä¸‹åŠèº«" name="FemaleLowerBody"/> + <combo_box.item label="男性ã®é " name="MaleHead"/> + <combo_box.item label="男性ã®ä¸ŠåŠèº«" name="MaleUpperBody"/> + <combo_box.item label="男性ã®ä¸‹åŠèº«" name="MaleLowerBody"/> + <combo_box.item label="スカート" name="Skirt"/> + <combo_box.item label="スカルプトプリム" name="SculptedPrim"/> + </combo_box> + <text name="bad_image_text"> + イメージをèªã¿å–ã‚Œã¾ã›ã‚“。 + +24bitTarga(.tga)ã§ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’ä¿å˜ã—ã¦ãã ã•ã„。 + </text> + <check_box label="ãƒã‚¹ã®ãªã„圧縮を使用" name="lossless_check"/> + <button label="å–り消ã—" name="cancel_btn"/> + <button label="アップロードL$[AMOUNT]" name="ok_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml index 8588ee1a966..bc34878fde0 100644 --- a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml @@ -1,81 +1,67 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="item properties" title="æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã®ãƒ—ãƒãƒ‘ティ"> - <text name="LabelItemNameTitle"> - åå‰ï¼š - </text> - <text name="LabelItemDescTitle"> - 説明: - </text> - <text name="LabelCreatorTitle"> - クリエーター - </text> - <text name="LabelCreatorName"> - Nicole Linden - </text> - <button label="æƒ…å ±" label_selected="" name="BtnCreator" /> - <text name="LabelOwnerTitle"> - オーナー: - </text> - <text name="LabelOwnerName"> - Thrax Linden - </text> - <button label="æƒ…å ±" label_selected="" name="BtnOwner" /> - <text name="LabelAcquiredTitle"> - 入手日時: - </text> - <text name="LabelAcquiredDate"> - 2006å¹´5月24日水曜日12:50:46 - </text> - <text name="OwnerLabel"> - ã§ãã‚‹ã“ã¨ï¼š - </text> - <check_box label="ä¿®æ£" name="CheckOwnerModify" /> - <check_box label="コピー" name="CheckOwnerCopy" /> - <check_box label="å†è²©ï¼ãƒ—レゼント" name="CheckOwnerTransfer" /> - <text name="BaseMaskDebug"> - B: - </text> - <text name="OwnerMaskDebug"> - O: - </text> - <text name="GroupMaskDebug"> - G: - </text> - <text name="EveryoneMaskDebug"> - E: - </text> - <text name="NextMaskDebug"> - N: - </text> - <check_box label="グループ分担" name="CheckShareWithGroup" /> - <check_box label="誰ã«å¯¾ã—ã¦ã‚‚コピーを許å¯" name="CheckEveryoneCopy" /> - <text name="NextOwnerLabel" width="158"> - 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ãŒã§ãã‚‹ã“ã¨ï¼š - </text> - <check_box label="ä¿®æ£" name="CheckNextOwnerModify" /> - <check_box label="コピー" name="CheckNextOwnerCopy" /> - <check_box label="å†è²©ï¼ãƒ—レゼント" name="CheckNextOwnerTransfer" /> - <text name="SaleLabel"> - アイテムã«ãƒžãƒ¼ã‚¯ï¼š - </text> - <check_box label="売り出ã—ä¸" name="CheckPurchase" /> - <radio_group name="RadioSaleType"> - <radio_item name="radio" label="オリジナル" /> - <radio_item name="radio2" label="コピー" /> - </radio_group> - <text name="TextPrice"> - 料金:L$ - </text> - <text name="unknown"> - (ä¸æ˜Žï¼‰ - </text> - <text name="public"> - (公共) - </text> - <text name="you_can"> - ã§ãã‚‹ã“ã¨ï¼š - </text> - <text name="owner_can"> - オーナーã¯æ¬¡ã®ã“ã¨ãŒã§ãã¾ã™ï¼š - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="item properties" title="æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã®ãƒ—ãƒãƒ‘ティ"> + <floater.string name="unknown"> + (ä¸æ˜Žï¼‰ + </floater.string> + <floater.string name="public"> + (公共) + </floater.string> + <floater.string name="you_can"> + ã§ãã‚‹ã“ã¨ï¼š + </floater.string> + <floater.string name="owner_can"> + オーナーã¯æ¬¡ã®ã“ã¨ãŒã§ãã¾ã™ï¼š + </floater.string> + <text name="LabelItemNameTitle"> + åå‰ï¼š + </text> + <text name="LabelItemDescTitle"> + 説明: + </text> + <text name="LabelCreatorTitle"> + クリエーター + </text> + <text name="LabelCreatorName"> + Nicole Linden + </text> + <button label="æƒ…å ±" label_selected="" name="BtnCreator"/> + <text name="LabelOwnerTitle"> + オーナー: + </text> + <text name="LabelOwnerName"> + Thrax Linden + </text> + <button label="æƒ…å ±" label_selected="" name="BtnOwner"/> + <text name="LabelAcquiredTitle"> + 入手日時: + </text> + <text name="LabelAcquiredDate"> + 2006å¹´5月24日水曜日12:50:46 + </text> + <text name="OwnerLabel"> + ã‚ãªãŸï¼š + </text> + <check_box label="編集" name="CheckOwnerModify"/> + <check_box label="コピー" name="CheckOwnerCopy"/> + <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="CheckOwnerTransfer"/> + <text name="AnyoneLabel"> + 全員: + </text> + <check_box label="コピー" name="CheckEveryoneCopy"/> + <text name="GroupLabel"> + グループ: + </text> + <check_box label="共有" name="CheckShareWithGroup"/> + <text name="NextOwnerLabel" width="158"> + 次ã®æ‰€æœ‰è€…: + </text> + <check_box label="編集" name="CheckNextOwnerModify"/> + <check_box label="コピー" name="CheckNextOwnerCopy"/> + <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="CheckNextOwnerTransfer"/> + <check_box label="売り出ã—ä¸" name="CheckPurchase"/> + <combo_box name="combobox sale copy"> + <combo_box.item label="コピー" name="Copy"/> + <combo_box.item label="オリジナル" name="Original"/> + </combo_box> + <spinner label="ä¾¡æ ¼ï¼š L$" name="Edit Cost"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml index cb87dafb49f..49a42a71658 100644 --- a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml @@ -1,40 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="land holdings floater" title="自分ã®åœŸåœ°"> - <scroll_list name="parcel list"> - <column label="区画å" name="name"/> - <column label="地域(リージョン)" name="location"/> - <column label="種類" name="type"/> - <column label="é¢ç©" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="ã“ã®åœŸåœ°ã®ä¸å¿ƒã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/> - <button label="地図上ã«è¡¨ç¤º" label_selected="地図上ã«è¡¨ç¤º" name="Show on Map" tool_tip="ã“ã®åœŸåœ°ã‚’世界地図ã«è¡¨ç¤ºã—ã¾ã™ã€‚"/> - <text name="contrib_label"> - ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®è²¢çŒ®ï¼š - </text> - <scroll_list name="grant list"> - <column label="グループå" name="group"/> - <column label="é¢ç©" name="area"/> - </scroll_list> - <text name="allowed_label"> - ç¾åœ¨ã®æ”¯æ‰•ã„プランã§ã®è¨±å¯ã•ã‚ŒãŸä¿æœ‰åœ°ï¼š - </text> - <text name="allowed_text"> - [AREA]平方メートル - </text> - <text name="current_label"> - ç¾åœ¨ã®ä¿æœ‰åœ°ï¼š - </text> - <text name="current_text"> - [AREA]平方メートル - </text> - <text name="available_label"> - 土地購入å¯ï¼š - </text> - <text name="available_text"> - [AREA]平方メートル - </text> - <string name="area_string"> - [AREA]平方メートル - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="land holdings floater" title="自分ã®åœŸåœ°"> + <scroll_list name="parcel list"> + <column label="区画" name="name"/> + <column label="地域(リージョン)" name="location"/> + <column label="種類" name="type"/> + <column label="é¢ç©" name="area"/> + <column label="" name="hidden"/> + </scroll_list> + <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="ã“ã®åœŸåœ°ã®ä¸å¿ƒã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/> + <button label="地図" label_selected="地図" name="Show on Map" tool_tip="ã“ã®åœŸåœ°ã‚’世界地図ã«è¡¨ç¤ºã—ã¾ã™ã€‚"/> + <text name="contrib_label"> + ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®è²¢çŒ®ï¼š + </text> + <scroll_list name="grant list"> + <column label="グループå" name="group"/> + <column label="é¢ç©" name="area"/> + </scroll_list> + <text name="allowed_label"> + ç¾åœ¨ã®æ”¯æ‰•ã„プランã§ã®è¨±å¯ã•ã‚ŒãŸä¿æœ‰åœ°ï¼š + </text> + <text name="allowed_text"> + [AREA]平方メートル + </text> + <text name="current_label"> + ç¾åœ¨ã®ä¿æœ‰åœ°ï¼š + </text> + <text name="current_text"> + [AREA]平方メートル + </text> + <text name="available_label"> + 土地購入å¯ï¼š + </text> + <text name="available_text"> + [AREA]平方メートル + </text> + <string name="area_string"> + [AREA]平方メートル + </string> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml index 79942738ea3..b108a3e70ca 100644 --- a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml @@ -1,12 +1,15 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="script ed float" title="スクリプト:新ã—ã„スクリプト"> - <button label="リセット" label_selected="リセット" name="Reset" /> - <check_box label="実行ä¸" name="running" /> - <check_box label="Mono" name="mono" /> - <text name="not_allowed"> - ã‚ãªãŸã¯ã“ã®ã‚¹ã‚¯ãƒªãƒ—トを見るã“ã¨ãŒã§ãã¾ã›ã‚“。 - </text> - <string name="script_running"> - å®Ÿè¡Œä¸ - </string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script ed float" title="スクリプト:新ã—ã„スクリプト"> + <floater.string name="not_allowed"> + ã“ã®ã‚¹ã‚¯ãƒªãƒ—トã¯ã€Œã‚³ãƒ”ーä¸å¯ã€ã®ãŸã‚ã€è¡¨ç¤ºã¾ãŸã¯ç·¨é›†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 オブジェクト内ã®ã‚¹ã‚¯ãƒªãƒ—トã®è¡¨ç¤ºã¾ãŸã¯ç·¨é›†ã«ã¯ã€å…¨æ¨©é™ãŒå¿…è¦ã§ã™ã€‚ + </floater.string> + <floater.string name="script_running"> + å®Ÿè¡Œä¸ + </floater.string> + <floater.string name="Title"> + スクリプト: [NAME] + </floater.string> + <button label="リセット" label_selected="リセット" name="Reset"/> + <check_box initial_value="true" label="実行ä¸" name="running"/> + <check_box initial_value="true" label="Mono" name="mono"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml index 3356d4948ac..aefe24ae48d 100644 --- a/indra/newview/skins/default/xui/ja/floater_map.xml +++ b/indra/newview/skins/default/xui/ja/floater_map.xml @@ -1,51 +1,54 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Map"> - <floater.string name="mini_map_north"> - 北 - </floater.string> - <floater.string name="mini_map_east"> - æ± - </floater.string> - <floater.string name="mini_map_west"> - 西 - </floater.string> - <floater.string name="mini_map_south"> - å— - </floater.string> - <floater.string name="mini_map_southeast"> - å—æ± - </floater.string> - <floater.string name="mini_map_northeast"> - åŒ—æ± - </floater.string> - <floater.string name="mini_map_southwest"> - å—西 - </floater.string> - <floater.string name="mini_map_northwest"> - 北西 - </floater.string> - <text label="北" name="floater_map_north" text="北"> - 北 - </text> - <text label="æ±" name="floater_map_east" text="æ±"> - æ± - </text> - <text label="西" name="floater_map_west" text="西"> - 西 - </text> - <text label="å—" name="floater_map_south" text="å—"> - å— - </text> - <text label="å—æ±" name="floater_map_southeast" text="å—æ±"> - å—æ± - </text> - <text label="北æ±" name="floater_map_northeast" text="北æ±"> - åŒ—æ± - </text> - <text label="å—西" name="floater_map_southwest" text="å—西"> - å—西 - </text> - <text label="北西" name="floater_map_northwest" text="北西"> - 北西 - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Map"> + <floater.string name="mini_map_north"> + 北 + </floater.string> + <floater.string name="mini_map_east"> + æ± + </floater.string> + <floater.string name="mini_map_west"> + 西 + </floater.string> + <floater.string name="mini_map_south"> + å— + </floater.string> + <floater.string name="mini_map_southeast"> + å—æ± + </floater.string> + <floater.string name="mini_map_northeast"> + åŒ—æ± + </floater.string> + <floater.string name="mini_map_southwest"> + å—西 + </floater.string> + <floater.string name="mini_map_northwest"> + 北西 + </floater.string> + <floater.string name="ToolTipMsg"> + [AGENT][REGION] (ダブルクリックã§åœ°å›³ã‚’é–‹ã) + </floater.string> + <text label="北" name="floater_map_north" text="北"> + 北 + </text> + <text label="æ±" name="floater_map_east" text="æ±"> + æ± + </text> + <text label="西" name="floater_map_west" text="西"> + 西 + </text> + <text label="å—" name="floater_map_south" text="å—"> + å— + </text> + <text label="å—æ±" name="floater_map_southeast" text="å—æ±"> + å—æ± + </text> + <text label="北æ±" name="floater_map_northeast" text="北æ±"> + åŒ—æ± + </text> + <text label="å—西" name="floater_map_southwest" text="å—西"> + å—西 + </text> + <text label="北西" name="floater_map_northwest" text="北西"> + 北西 + </text> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_media_browser.xml b/indra/newview/skins/default/xui/ja/floater_media_browser.xml index 6877cc7f532..5e60b9f1a2e 100644 --- a/indra/newview/skins/default/xui/ja/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/ja/floater_media_browser.xml @@ -1,19 +1,30 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="floater_about" title="メディア・ブラウザ"> - <layout_stack name="stack1"> - <layout_panel name="nav_controls"> - <button label="戻る" name="back" /> - <button label="進む" name="forward" /> - <button label="æ›´æ–°" name="reload" /> - <button label="閲覧" name="go" /> - </layout_panel> - <layout_panel name="parcel_owner_controls"> - <button label="ç¾åœ¨ã® URL を区画ã«é€ä¿¡" name="assign" /> - </layout_panel> - <layout_panel name="external_controls"> - <button label="外部ウェブ・ブラウザã§é–‹ã" name="open_browser" /> - <check_box label="常ã«å¤–部ã®ã‚¦ã‚§ãƒ–・ブラウザã§é–‹ã" name="open_always" /> - <button label="é–‰ã˜ã‚‹" name="close" /> - </layout_panel> - </layout_stack> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_about" title="メディア・ブラウザ"> + <floater.string name="home_page_url"> + http://jp.secondlife.com + </floater.string> + <floater.string name="support_page_url"> + http://jp.secondlife.com/support + </floater.string> + <layout_stack name="stack1"> + <layout_panel name="nav_controls"> + <button label="戻る" name="back"/> + <button label="進む" name="forward"/> + <button label="æ›´æ–°" name="reload"/> + <button label="閲覧" name="go"/> + </layout_panel> + <layout_panel name="time_controls"> + <button label="å·»ã戻ã—" name="rewind"/> + <button label="åœæ¢" name="stop"/> + <button label="æ—©é€ã‚Š" name="seek"/> + </layout_panel> + <layout_panel name="parcel_owner_controls"> + <button label="ç¾åœ¨ã® URL を区画ã«é€ä¿¡" name="assign"/> + </layout_panel> + <layout_panel name="external_controls"> + <button label="外部ウェブ・ブラウザã§é–‹ã" name="open_browser"/> + <check_box label="常ã«å¤–部ã®ã‚¦ã‚§ãƒ–・ブラウザã§é–‹ã" name="open_always"/> + <button label="é–‰ã˜ã‚‹" name="close"/> + </layout_panel> + </layout_stack> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml index 4d6b6ca70a7..1f7fcb94950 100644 --- a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml +++ b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml @@ -1,19 +1,18 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="MemLeak" title="メモリ・リーク・シミュレーション"> - <spinner label="リークスピード(1フレームã”ã¨ã®ãƒã‚¤ãƒˆæ•°):" - name="leak_speed" label_width="244" /> - <spinner label="リークã—ãŸæœ€å¤§ãƒ¡ãƒ¢ãƒªæ•°(MB):" name="max_leak" label_width="244" /> - <text name="total_leaked_label"> - ç¾åœ¨ã®ãƒªãƒ¼ã‚¯ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºï¼š [SIZE] KB - </text> - <text name="note_label_1"> - [NOTE1] - </text> - <text name="note_label_2"> - [NOTE2] - </text> - <button label="開始" name="start_btn" /> - <button label="åœæ¢" name="stop_btn" /> - <button label="解放" name="release_btn" /> - <button label="é–‰ã˜ã‚‹" name="close_btn" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="MemLeak" title="メモリリークã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆ"> + <spinner label="リークスピード(1フレームã”ã¨ã®ãƒã‚¤ãƒˆæ•°):" label_width="244" name="leak_speed"/> + <spinner label="リークã—ãŸæœ€å¤§ãƒ¡ãƒ¢ãƒªæ•°(MB):" label_width="244" name="max_leak"/> + <text name="total_leaked_label"> + ç¾åœ¨ã®ãƒªãƒ¼ã‚¯ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºï¼š [SIZE] KB + </text> + <text name="note_label_1"> + [NOTE1] + </text> + <text name="note_label_2"> + [NOTE2] + </text> + <button label="開始" name="start_btn"/> + <button label="åœæ¢" name="stop_btn"/> + <button label="解放" name="release_btn"/> + <button label="é–‰ã˜ã‚‹" name="close_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_moveview.xml b/indra/newview/skins/default/xui/ja/floater_moveview.xml index df6ae7bb61b..e6aeccc5175 100644 --- a/indra/newview/skins/default/xui/ja/floater_moveview.xml +++ b/indra/newview/skins/default/xui/ja/floater_moveview.xml @@ -1,17 +1,35 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="move_floater"> -<panel name="panel_actions"> - <button label="" label_selected="" name="turn left btn" tool_tip="å·¦ã«æ›²ãŒã‚‹" /> - <button label="" label_selected="" name="turn right btn" tool_tip="å³ã«æ›²ãŒã‚‹" /> - <button label="" label_selected="" name="move up btn" - tool_tip="ジャンプã¾ãŸã¯ä¸Šæ˜‡" /> - <button label="" label_selected="" name="move down btn" - tool_tip="ã—ゃãŒã‚€ã¾ãŸã¯ä¸‹é™" /> - <button label="飛行" label_selected="飛行" name="fly btn" - tool_tip="飛行を開始ã¾ãŸã¯åœæ¢" /> - <joystick_slide name="slide left btn" tool_tip="å·¦ã«ç§»å‹•" /> - <joystick_slide name="slide right btn" tool_tip="å³ã«ç§»å‹•" /> - <joystick_turn name="forward btn" tool_tip="å‰ã«ç§»å‹•" /> - <joystick_turn name="backward btn" tool_tip="後ã‚ã«ç§»å‹•" /> -</panel> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="move_floater"> + <string name="walk_forward_tooltip"> + å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰ + </string> + <string name="walk_back_tooltip"> + 後ã‚ã«æ©ã(下矢å°ã‹ S を押ã™ï¼‰ + </string> + <string name="run_forward_tooltip"> + å‰ã«èµ°ã‚‹ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰ + </string> + <string name="run_back_tooltip"> + 後ã‚ã«èµ°ã‚‹ï¼ˆä¸‹çŸ¢å°ã‹ S を押ã™ï¼‰ + </string> + <string name="fly_forward_tooltip"> + å‰ã«é£›ã¶ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰ + </string> + <string name="fly_back_tooltip"> + 後ã‚ã«é£›ã¶ï¼ˆä¸‹çŸ¢å°ã‹ S を押ã™ï¼‰ + </string> + <panel name="panel_actions"> + <button label="" label_selected="" name="turn left btn" tool_tip="左をå‘ã(左矢å°ã‹ A を押ã™ï¼‰"/> + <button label="" label_selected="" name="turn right btn" tool_tip="å³ã‚’å‘ã(å³çŸ¢å°ã‹ D を押ã™ï¼‰"/> + <button label="" label_selected="" name="move up btn" tool_tip="飛ã¶ãƒ»E を押ã™"/> + <button label="" label_selected="" name="move down btn" tool_tip="ç€åœ°ãƒ»C を押ã™"/> + <joystick_turn name="forward btn" tool_tip="å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰"/> + <joystick_turn name="backward btn" tool_tip="後ã‚ã«æ©ã(下矢å°ã‹ S を押ã™ï¼‰"/> + </panel> + <panel name="panel_modes"> + <button label="" name="mode_walk_btn" tool_tip="æ©è¡Œãƒ¢ãƒ¼ãƒ‰"/> + <button label="" name="mode_run_btn" tool_tip="走行モード"/> + <button label="" name="mode_fly_btn" tool_tip="飛行モード"/> + <button label="飛行åœæ¢" name="stop_fly_btn" tool_tip="飛行åœæ¢"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml index 8702ab1e74f..d175009ef31 100644 --- a/indra/newview/skins/default/xui/ja/floater_pay.xml +++ b/indra/newview/skins/default/xui/ja/floater_pay.xml @@ -1,21 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Give Money" title=""> - <button label="L$1" label_selected="L$1" name="fastpay 1" /> - <button label="L$5" label_selected="L$5" name="fastpay 5" /> - <button label="L$10" label_selected="L$10" name="fastpay 10" /> - <button label="L$20" label_selected="L$20" name="fastpay 20" /> - <button label="支払ã„" label_selected="支払ã„" name="pay btn" /> - <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel btn" /> - <text name="payee_label"> - 支払ã„先: - </text> - <text name="payee_name"> - [FIRST] [LAST] - </text> - <text name="fastpay text"> - 一括払ã„: - </text> - <text name="amount text"> - 金é¡ï¼š - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Give Money" title=""> + <text name="payee_label"> + 支払ã„: + </text> + <icon name="icon_person" tool_tip="ä½äºº"/> + <text name="payee_name"> + [FIRST] [LAST] + </text> + <button label="L$1" label_selected="L$1" name="fastpay 1"/> + <button label="L$5" label_selected="L$5" name="fastpay 5"/> + <button label="L$10" label_selected="L$10" name="fastpay 10"/> + <button label="L$20" label_selected="L$20" name="fastpay 20"/> + <text name="amount text"> + 金é¡ã®æŒ‡å®šï¼š + </text> + <button label="支払ã„" label_selected="支払ã„" name="pay btn"/> + <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_pay_object.xml b/indra/newview/skins/default/xui/ja/floater_pay_object.xml index 5f280ca5fae..5a3edb29086 100644 --- a/indra/newview/skins/default/xui/ja/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/ja/floater_pay_object.xml @@ -1,30 +1,29 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="Give Money" title=""> - <text name="payee_group"> - グループã¸ã®æ”¯æ‰•ã„: - </text> - <text name="payee_resident"> - ä½äººã¸ã®æ”¯æ‰•ã„: - </text> - <text name="payee_name"> - [FIRST] [LAST] - </text> - <text name="object_name_label"> - オブジェクトを介ã—ã¦ï¼š - </text> - <text name="object_name_text"> - ... - </text> - <text name="fastpay text"> - 一括払ã„: - </text> - <text name="amount text"> - 金é¡ï¼š - </text> - <button label="L$1" label_selected="L$1" name="fastpay 1" /> - <button label="L$5" label_selected="L$5" name="fastpay 5" /> - <button label="L$10" label_selected="L$10" name="fastpay 10" /> - <button label="L$20" label_selected="L$20" name="fastpay 20" /> - <button label="支払ã„" label_selected="支払ã„" name="pay btn" /> - <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel btn" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Give Money" title=""> + <string name="payee_group"> + グループã¸ã®æ”¯æ‰•ã„: + </string> + <string name="payee_resident"> + ä½äººã¸ã®æ”¯æ‰•ã„: + </string> + <icon name="icon_person" tool_tip="ä½äºº"/> + <text name="payee_name"> + [FIRST] [LAST] + </text> + <text name="object_name_label"> + オブジェクトを介ã—ã¦ï¼š + </text> + <icon name="icon_object" tool_tip="オブジェクト"/> + <text name="object_name_text"> + ... + </text> + <button label="L$1" label_selected="L$1" name="fastpay 1"/> + <button label="L$5" label_selected="L$5" name="fastpay 5"/> + <button label="L$10" label_selected="L$10" name="fastpay 10"/> + <button label="L$20" label_selected="L$20" name="fastpay 20"/> + <text name="amount text"> + 金é¡ã‚’指定: + </text> + <button label="支払ã„" label_selected="支払ã„" name="pay btn"/> + <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml index 653674129cf..95cffd33f2c 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml @@ -1,10 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview_anim"> - <text name="desc txt"> - 説明: - </text> - <button label="世界ã§å†ç”Ÿ" label_selected="åœæ¢" name="Anim play btn" - tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ä»–ã®äººã‚‚見るã“ã¨ãŒã§ãるよã†ã«å†ç”Ÿã—ã¾ã™ã€‚" /> - <button label="ãƒãƒ¼ã‚«ãƒ«ã«å†ç”Ÿ" label_selected="åœæ¢" name="Anim audition btn" - tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’自分専用ã«å†ç”Ÿã—ã¾ã™ã€‚" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_anim"> + <floater.string name="Title"> + アニメーション: [NAME] + </floater.string> + <text name="desc txt"> + 説明: + </text> + <button label="世界ã§å†ç”Ÿ" label_selected="åœæ¢" name="Anim play btn" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ä»–ã®äººã‚‚見るã“ã¨ãŒã§ãるよã†ã«å†ç”Ÿã—ã¾ã™ã€‚"/> + <button label="ãƒãƒ¼ã‚«ãƒ«ã«å†ç”Ÿ" label_selected="åœæ¢" name="Anim audition btn" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’自分専用ã«å†ç”Ÿã—ã¾ã™ã€‚"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_classified.xml b/indra/newview/skins/default/xui/ja/floater_preview_classified.xml index f0770b2ed5d..48a64e28a6e 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_classified.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_classified.xml @@ -1,2 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="classified_preview" title="ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šæƒ…å ±" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="classified_preview" title="ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šæƒ…å ±"> + <floater.string name="Title"> + クラシファイド広告: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_event.xml b/indra/newview/skins/default/xui/ja/floater_preview_event.xml index 9ecabfabb0d..61c17e2d3c9 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_event.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_event.xml @@ -1,2 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="event_preview" title="ã‚¤ãƒ™ãƒ³ãƒˆæƒ…å ±" /> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="event_preview" title="ã‚¤ãƒ™ãƒ³ãƒˆæƒ…å ±"> + <floater.string name="Title"> + イベント: [NAME] + </floater.string> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml new file mode 100644 index 00000000000..c996ed8591c --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="ジェスãƒãƒ£ãƒ¼ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ"/> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml new file mode 100644 index 00000000000..c996ed8591c --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Gesture" title="ジェスãƒãƒ£ãƒ¼ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ"/> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml index e7dd4d2c098..ba272bdffd0 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml @@ -1,16 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview notecard" title="メモ:"> - <button label="ä¿å˜" label_selected="ä¿å˜" name="Save" /> - <text name="desc txt"> - 説明: - </text> - <text_editor name="Notecard Editor"> - ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼Žï¼Žï¼Ž - </text_editor> - <text name="no_object"> - ã“ã®ãƒŽãƒ¼ãƒˆã‚’å«ã‚“ã オブジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </text> - <text name="not_allowed"> - ã‚ãªãŸã¯ã“ã®ãƒŽãƒ¼ãƒˆã‚’見るã“ã¨ãŒã§ãã¾ã›ã‚“。 - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview notecard" title="メモ:"> + <floater.string name="no_object"> + ã“ã®ãƒŽãƒ¼ãƒˆã‚’å«ã‚“ã オブジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </floater.string> + <floater.string name="not_allowed"> + ã“ã®ãƒŽãƒ¼ãƒˆã‚’見る権é™ãŒã‚ã‚Šã¾ã›ã‚“。 + </floater.string> + <floater.string name="Title"> + ノートカード: [NAME] + </floater.string> + <floater.string label="ä¿å˜" label_selected="ä¿å˜" name="Save"> + ä¿å˜ + </floater.string> + <text name="desc txt"> + 説明: + </text> + <text_editor name="Notecard Editor"> + ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼Žï¼Žï¼Ž + </text_editor> + <button label="ä¿å˜" label_selected="ä¿å˜" name="Save"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml index 244ef13d139..e52a3a4e924 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml @@ -1,11 +1,11 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview_sound"> - <text name="desc txt"> - 説明: - </text> - <button label="世界ã§å†ç”Ÿ" label_selected="世界ã§å†ç”Ÿ" name="Sound play btn" - tool_tip="ã“ã®ã‚µã‚¦ãƒ³ãƒ‰ã‚’ä»–ã®äººã‚‚èžãã“ã¨ãŒã§ãるよã†ã«å†ç”Ÿã—ã¾ã™ã€‚" /> - <button label="ãƒãƒ¼ã‚«ãƒ«ã«å†ç”Ÿ" label_selected="ãƒãƒ¼ã‚«ãƒ«ã«å†ç”Ÿ" - name="Sound audition btn" - tool_tip="ã“ã®ã‚µã‚¦ãƒ³ãƒ‰ã‚’自分専用ã«å†ç”Ÿã—ã¾ã™ã€‚" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_sound"> + <floater.string name="Title"> + サウンド: [NAME] + </floater.string> + <text name="desc txt"> + 説明: + </text> + <button label="世界ã§å†ç”Ÿ" label_selected="世界ã§å†ç”Ÿ" name="Sound play btn" tool_tip="ã“ã®ã‚µã‚¦ãƒ³ãƒ‰ã‚’ä»–ã®äººã‚‚èžãã“ã¨ãŒã§ãるよã†ã«å†ç”Ÿã—ã¾ã™ã€‚"/> + <button label="ãƒãƒ¼ã‚«ãƒ«ã«å†ç”Ÿ" label_selected="ãƒãƒ¼ã‚«ãƒ«ã«å†ç”Ÿ" name="Sound audition btn" tool_tip="ã“ã®ã‚µã‚¦ãƒ³ãƒ‰ã‚’自分専用ã«å†ç”Ÿã—ã¾ã™ã€‚"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml index ffd9e3bfbef..c83130f3bb0 100644 --- a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml @@ -1,9 +1,17 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview_texture"> - <text name="desc txt"> - 説明: - </text> - <text name="dimensions"> - 寸法:[HEIGHT]x[WIDTH] - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview_texture"> + <floater.string name="Title"> + テクスãƒãƒ£ï¼š [NAME] + </floater.string> + <floater.string name="Copy"> + æŒã¡ç‰©ã«ã‚³ãƒ”ー + </floater.string> + <text name="desc txt"> + 説明: + </text> + <button label="ä¿å˜" name="Keep"/> + <button label="削除" name="Discard"/> + <text name="dimensions"> + [WIDTH]px x [HEIGHT]px + </text> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml index 6eae7613b34..2b07deb1032 100644 --- a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml @@ -1,143 +1,103 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_report_abuse" title="å«ŒãŒã‚‰ã›ã®å ±å‘Š"> - <texture_picker label="" name="screenshot"/> - <check_box label="スクリーï¾ï½¼ï½®ï½¯ï¾„ã‚’å«ã‚ã‚‹" name="screen_check"/> - <text name="reporter_title"> - å ±å‘Šè€…ï¼š - </text> - <text name="reporter_field"> - Loremipsum Dolorsitamut - </text> - <text name="sim_title"> - 地域: - </text> - <text name="sim_field"> - 地域å - </text> - <text name="pos_title"> - ä½ç½®ï¼š - </text> - <text name="pos_field"> - {128.1, 128.1, 15.4} - </text> - <text name="select_object_label"> - ボタンを使ã£ã¦ã‚ªãƒ–ジェクトをé¸æŠžï¼š - </text> - <button label="" label_selected="" name="pick_btn" tool_tip="オブジェクト・ピッカー - ã“ã®å ±å‘Šã®ä¸»é¡Œã¨ãªã‚‹ã‚ªãƒ–ジェクトを特定"/> - <text name="object_name_label"> - åå‰ï¼š - </text> - <text name="object_name"> - Consetetur Sadipscing - </text> - <text name="owner_name_label"> - オーナー: - </text> - <text name="owner_name"> - Hendrerit Vulputate - </text> - <combo_box name="category_combo" tool_tip="カテゴリー -- ã“ã®å ±å‘Šã«æœ€ã‚‚é©ã—ãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„"> - <combo_box.item name="Select_category" label="カテゴリーをé¸æŠž" - /> - <combo_box.item name="Age__Age_play" label="年齢>年齢å½è¨¼" - /> - <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="年齢>æˆäººã®ä½äººãŒTeen Second Life上ã«ã„ã‚‹" - /> - <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="年齢>未æˆå¹´ãªä½äººãŒTeen Second Lifeã®å¤–ã«ã„ã‚‹" - /> - <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="攻撃>コンãƒãƒƒãƒˆãƒ»ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹/å±é™ºãªã‚¨ãƒªã‚¢" - /> - <combo_box.item name="Assault__Safe_area" label="攻撃>安全ãªã‚¨ãƒªã‚¢" - /> - <combo_box.item name="Assault__Weapons_testing_sandbox" label="攻撃>æ¦å™¨ãƒ†ã‚¹ãƒˆç”¨ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹" - /> - <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="商å–引>製å“ã¾ãŸã¯ã‚µãƒ¼ãƒ“スã®æä¾›ãŒè¡Œã‚ã‚Œãªã„" - /> - <combo_box.item name="Disclosure__Real_world_information" label="開示>リアルワールドã®æƒ…å ±" - /> - <combo_box.item name="Disclosure__Remotely_monitoring chat" label="開示>離れãŸã¨ã“ã‚ã‹ã‚‰ãƒãƒ£ãƒƒãƒˆã‚’モニターã—ã¦ã„ã‚‹" - /> - <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="開示>Second Lifeã®æƒ…å ±/ãƒãƒ£ãƒƒãƒˆ/IM" - /> - <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žåœ°åŸŸãƒªã‚½ãƒ¼ã‚¹ã®ä½¿ç”¨ãŒä¸å…¬å¹³" - /> - <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトã®ä¹±ç”¨" - /> - <combo_box.item name="Disturbing_the_peace__Object_littering" label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žã‚ªãƒ–ジェクトã®æ¨ã¦ç½®ã" - /> - <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žç¹°ã‚Šè¿”ã—スパム" - /> - <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žä¸è¦ãªåºƒå‘Šã‚¹ãƒ‘ム" - /> - <combo_box.item name="Fraud__L$" label="è©æ¬ºï¼ž L$" - /> - <combo_box.item name="Fraud__Land" label="è©æ¬ºï¼žåœŸåœ°" - /> - <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="è©æ¬ºï¼žãƒžãƒ«ãƒå•†æ³•ã¾ãŸã¯ãƒã‚§ãƒ¼ãƒ³ãƒ»ãƒ¡ãƒ¼ãƒ«" - /> - <combo_box.item name="Fraud__US$" label="è©æ¬ºï¼ž US$" - /> - <combo_box.item name="Harassment__Advert_farms___visual_spam" label="å«ŒãŒã‚‰ã›ï¼žåºƒå‘Šå§”託/視覚的ãªã‚¹ãƒ‘ム" - /> - <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="å«ŒãŒã‚‰ã›ï¼žå€‹äººã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¸å‚·" - /> - <combo_box.item name="Harassment__Impeding_movement" label="å«ŒãŒã‚‰ã›ï¼žç§»å‹•ã®å¦¨å®³" - /> - <combo_box.item name="Harassment__Sexual_harassment" label="å«ŒãŒã‚‰ã›ï¼žæ€§çš„ãªå«ŒãŒã‚‰ã›" - /> - <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="å«ŒãŒã‚‰ã›ï¼žåˆ©ç”¨è¦ç´„(ToS)ã«é•åã™ã‚‹è¡Œç‚ºã‚’è¡Œã†ã‚ˆã†ä»–者を勧誘/扇動" - /> - <combo_box.item name="Harassment__Verbal_abuse" label="å«ŒãŒã‚‰ã›ï¼žæš´è¨€" - /> - <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="ã‚ã„ã›ã¤ï¼žè‘—ã—ãä¸å¿«ã§ã‚ã‚‹ã¨è¦‹ãªã•ã‚Œã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" - /> - <combo_box.item name="Indecency__Inappropriate_avatar_name" label="ã‚ã„ã›ã¤ï¼žä¸é©åˆ‡ãªã‚¢ãƒã‚¿ãƒ¼å" - /> - <combo_box.item name="Indecency__Mature_content_in_PG_region" label="ã‚ã„ã›ã¤ï¼žPG地域ã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" - /> - <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="ã‚ã„ã›ã¤ï¼žMature地域ã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" - /> - <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="知的財産ã®ä¾µå®³ï¼žã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»" - /> - <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="知的財産ã®ä¾µå®³ï¼žã‚³ãƒ”ーBotåŠã³æ¨©é™ã®æ‚ªç”¨" - /> - <combo_box.item name="Intolerance" label="ä¸å¯›å®¹" - /> - <combo_box.item name="Land__Abuse_of_sandbox_resources" label="土地>サンドボックス・リソースã®ä¹±ç”¨" - /> - <combo_box.item name="Land__Encroachment__Objects_textures" label="土地>ä¸æ³•ä¾µå…¥ï¼žã‚ªãƒ–ジェクト/テクスãƒãƒ£ãƒ¼" - /> - <combo_box.item name="Land__Encroachment__Particles" label="土地>ä¸æ³•ä¾µå…¥ï¼žãƒ‘ーティクル" - /> - <combo_box.item name="Land__Encroachment__Trees_plants" label="土地>ä¸æ³•ä¾µå…¥ï¼žæ¨¹æœ¨/æ¤ç‰©" - /> - <combo_box.item name="Wagering_gambling" label="è³ã‘/ギャンブル" - /> - <combo_box.item name="Other" label="ãã®ä»–" - /> - </combo_box> - <text name="abuser_name_title"> - 迷惑ユーザーã®åå‰ï¼š - </text> - <button label="ä½äººã‚’é¸æŠž" label_selected="" name="select_abuser" tool_tip="å«ŒãŒã‚‰ã›ã‚’ã—ãŸäººã®åå‰ã‚’リストã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„。"/> - <check_box label="å«ŒãŒã‚‰ã›ã‚’ã—ãŸäººã®åå‰ãŒä¸æ˜Ž" name="omit_abuser_name" tool_tip="å«ŒãŒã‚‰ã›ã‚’ã—ãŸäººã®åå‰ã‚’æä¾›ã§ããªã„ã‹ã«ã¤ã„ã¦ã€ã“れを確èª"/> - <text name="abuser_name_title2"> - å«ŒãŒã‚‰ã›ã®èµ·ããŸå ´æ‰€ï¼š - </text> - <text name="sum_title"> - 概è¦ï¼š - </text> - <text name="dscr_title"> - 詳細: - </text> - <text name="bug_aviso"> - 日付ã€å ´æ‰€ã€å«ŒãŒã‚‰ã›ã®ç‰¹å¾´ã€é–¢é€£ã™ã‚‹ä¼šè©±ï¼IMテã‚ス -トã«é–¢ã—明確ã«è¨˜å…¥ã—ã€å¯èƒ½ã§ã‚ã‚Œã°ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸ -択ã—ã¦ãã ã•ã„。 - </text> - <text name="incomplete_title"> - 注æ„:ä¸å®Œå…¨ãªãƒ¬ãƒãƒ¼ãƒˆã¯èª¿æŸ»ã•ã‚Œã¾ã›ã‚“。 - </text> - <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/> - <button label="å«ŒãŒã‚‰ã›ã®å ±å‘Š" label_selected="å«ŒãŒã‚‰ã›ã®å ±å‘Š" name="send_btn"/> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_report_abuse" title="å«ŒãŒã‚‰ã›ã®å ±å‘Š"> + <floater.string name="Screenshot"> + スクリーンショット + </floater.string> + <check_box label="ã“ã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’使用" name="screen_check"/> + <text name="reporter_title"> + å ±å‘Šè€…ï¼š + </text> + <text name="reporter_field"> + Loremipsum Dolorsitamut + </text> + <text name="sim_title"> + 地域: + </text> + <text name="sim_field"> + 地域å + </text> + <text name="pos_title"> + ä½ç½®ï¼š + </text> + <text name="pos_field"> + {128.1, 128.1, 15.4} + </text> + <text name="select_object_label"> + ボタンをクリック。悪æ„ã®ã‚るオブジェクト: + </text> + <button label="" label_selected="" name="pick_btn" tool_tip="オブジェクト・ピッカー - ã“ã®å ±å‘Šã®ä¸»é¡Œã¨ãªã‚‹ã‚ªãƒ–ジェクトを特定"/> + <text name="object_name_label"> + オブジェクト: + </text> + <text name="object_name"> + Consetetur Sadipscing + </text> + <text name="owner_name_label"> + オーナー: + </text> + <text name="owner_name"> + Hendrerit Vulputate + </text> + <combo_box name="category_combo" tool_tip="カテゴリー -- ã“ã®å ±å‘Šã«æœ€ã‚‚é©ã—ãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„"> + <combo_box.item label="カテゴリーをé¸æŠž" name="Select_category"/> + <combo_box.item label="年齢>年齢å½è¨¼" name="Age__Age_play"/> + <combo_box.item label="年齢>æˆäººã®ä½äººãŒTeen Second Life上ã«ã„ã‚‹" name="Age__Adult_resident_on_Teen_Second_Life"/> + <combo_box.item label="年齢>未æˆå¹´ãªä½äººãŒTeen Second Lifeã®å¤–ã«ã„ã‚‹" name="Age__Underage_resident_outside_of_Teen_Second_Life"/> + <combo_box.item label="攻撃>コンãƒãƒƒãƒˆãƒ»ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹/å±é™ºãªã‚¨ãƒªã‚¢" name="Assault__Combat_sandbox___unsafe_area"/> + <combo_box.item label="攻撃>安全ãªã‚¨ãƒªã‚¢" name="Assault__Safe_area"/> + <combo_box.item label="攻撃>æ¦å™¨ãƒ†ã‚¹ãƒˆç”¨ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹" name="Assault__Weapons_testing_sandbox"/> + <combo_box.item label="商å–引>製å“ã¾ãŸã¯ã‚µãƒ¼ãƒ“スã®æä¾›ãŒè¡Œã‚ã‚Œãªã„" name="Commerce__Failure_to_deliver_product_or_service"/> + <combo_box.item label="開示>リアルワールドã®æƒ…å ±" name="Disclosure__Real_world_information"/> + <combo_box.item label="開示>離れãŸã¨ã“ã‚ã‹ã‚‰ãƒãƒ£ãƒƒãƒˆã‚’モニターã—ã¦ã„ã‚‹" name="Disclosure__Remotely_monitoring chat"/> + <combo_box.item label="開示>Second Lifeã®æƒ…å ±/ãƒãƒ£ãƒƒãƒˆ/IM" name="Disclosure__Second_Life_information_chat_IMs"/> + <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žåœ°åŸŸãƒªã‚½ãƒ¼ã‚¹ã®ä½¿ç”¨ãŒä¸å…¬å¹³" name="Disturbing_the_peace__Unfair_use_of_region_resources"/> + <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトã®ä¹±ç”¨" name="Disturbing_the_peace__Excessive_scripted_objects"/> + <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žã‚ªãƒ–ジェクトã®æ¨ã¦ç½®ã" name="Disturbing_the_peace__Object_littering"/> + <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žç¹°ã‚Šè¿”ã—スパム" name="Disturbing_the_peace__Repetitive_spam"/> + <combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žä¸è¦ãªåºƒå‘Šã‚¹ãƒ‘ム" name="Disturbing_the_peace__Unwanted_advert_spam"/> + <combo_box.item label="è©æ¬ºï¼ž L$" name="Fraud__L$"/> + <combo_box.item label="è©æ¬ºï¼žåœŸåœ°" name="Fraud__Land"/> + <combo_box.item label="è©æ¬ºï¼žãƒžãƒ«ãƒå•†æ³•ã¾ãŸã¯ãƒã‚§ãƒ¼ãƒ³ãƒ»ãƒ¡ãƒ¼ãƒ«" name="Fraud__Pyramid_scheme_or_chain_letter"/> + <combo_box.item label="è©æ¬ºï¼ž US$" name="Fraud__US$"/> + <combo_box.item label="å«ŒãŒã‚‰ã›ï¼žåºƒå‘Šå§”託/視覚的ãªã‚¹ãƒ‘ム" name="Harassment__Advert_farms___visual_spam"/> + <combo_box.item label="å«ŒãŒã‚‰ã›ï¼žå€‹äººã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¸å‚·" name="Harassment__Defaming_individuals_or_groups"/> + <combo_box.item label="å«ŒãŒã‚‰ã›ï¼žç§»å‹•ã®å¦¨å®³" name="Harassment__Impeding_movement"/> + <combo_box.item label="å«ŒãŒã‚‰ã›ï¼žæ€§çš„ãªå«ŒãŒã‚‰ã›" name="Harassment__Sexual_harassment"/> + <combo_box.item label="å«ŒãŒã‚‰ã›ï¼žåˆ©ç”¨è¦ç´„(ToS)ã«é•åã™ã‚‹è¡Œç‚ºã‚’è¡Œã†ã‚ˆã†ä»–者を勧誘/扇動" name="Harassment__Solicting_inciting_others_to_violate_ToS"/> + <combo_box.item label="å«ŒãŒã‚‰ã›ï¼žæš´è¨€" name="Harassment__Verbal_abuse"/> + <combo_box.item label="ã‚ã„ã›ã¤ï¼žè‘—ã—ãä¸å¿«ã§ã‚ã‚‹ã¨è¦‹ãªã•ã‚Œã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" name="Indecency__Broadly_offensive_content_or_conduct"/> + <combo_box.item label="ã‚ã„ã›ã¤ï¼žä¸é©åˆ‡ãªã‚¢ãƒã‚¿ãƒ¼å" name="Indecency__Inappropriate_avatar_name"/> + <combo_box.item label="ã‚ã„ã›ã¤ï¼žPG地域ã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" name="Indecency__Mature_content_in_PG_region"/> + <combo_box.item label="ã‚ã„ã›ã¤ï¼žMature地域ã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" name="Indecency__Inappropriate_content_in_Mature_region"/> + <combo_box.item label="知的財産ã®ä¾µå®³ï¼žã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»" name="Intellectual_property_infringement_Content_Removal"/> + <combo_box.item label="知的財産ã®ä¾µå®³ï¼žã‚³ãƒ”ーBotåŠã³æ¨©é™ã®æ‚ªç”¨" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/> + <combo_box.item label="ä¸å¯›å®¹" name="Intolerance"/> + <combo_box.item label="土地>サンドボックス・リソースã®ä¹±ç”¨" name="Land__Abuse_of_sandbox_resources"/> + <combo_box.item label="土地>ä¸æ³•ä¾µå…¥ï¼žã‚ªãƒ–ジェクト/テクスãƒãƒ£ãƒ¼" name="Land__Encroachment__Objects_textures"/> + <combo_box.item label="土地>ä¸æ³•ä¾µå…¥ï¼žãƒ‘ーティクル" name="Land__Encroachment__Particles"/> + <combo_box.item label="土地>ä¸æ³•ä¾µå…¥ï¼žæ¨¹æœ¨/æ¤ç‰©" name="Land__Encroachment__Trees_plants"/> + <combo_box.item label="è³ã‘/ギャンブル" name="Wagering_gambling"/> + <combo_box.item label="ãã®ä»–" name="Other"/> + </combo_box> + <text name="abuser_name_title"> + 迷惑ユーザーã®åå‰ï¼š + </text> + <button label="é¸æŠž" label_selected="" name="select_abuser" tool_tip="å«ŒãŒã‚‰ã›ã‚’ã—ãŸäººã®åå‰ã‚’リストã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„。"/> + <text name="abuser_name_title2"> + å«ŒãŒã‚‰ã›ã®èµ·ããŸå ´æ‰€ï¼š + </text> + <text name="sum_title"> + 概è¦ï¼š + </text> + <text name="dscr_title"> + 詳細: + </text> + <text name="bug_aviso"> + ã§ãã‚‹ã ã‘具体的ã«ãŠé¡˜ã„ã—ã¾ã™ã€‚ + </text> + <text name="incomplete_title"> + 注æ„:ä¸å®Œå…¨ãªãƒ¬ãƒãƒ¼ãƒˆã¯èª¿æŸ»ã•ã‚Œã¾ã›ã‚“。 + </text> + <button label="å«ŒãŒã‚‰ã›ã®å ±å‘Š" label_selected="å«ŒãŒã‚‰ã›ã®å ±å‘Š" name="send_btn"/> + <button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml new file mode 100644 index 00000000000..fc805e879b8 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script" short_title="[All scripts]" title="[All scripts]"/> diff --git a/indra/newview/skins/default/xui/ja/floater_script_preview.xml b/indra/newview/skins/default/xui/ja/floater_script_preview.xml index ef729e0f6fd..583a2f8b91a 100644 --- a/indra/newview/skins/default/xui/ja/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/ja/floater_script_preview.xml @@ -1,6 +1,9 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="preview lsl text" title="スクリプト:回転スクリプト"> - <text name="desc txt"> - 説明: - </text> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="preview lsl text" title="スクリプト:回転スクリプト"> + <floater.string name="Title"> + スクリプト: [NAME] + </floater.string> + <text name="desc txt"> + 説明: + </text> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_script_queue.xml b/indra/newview/skins/default/xui/ja/floater_script_queue.xml index 7c4979a0336..5e059b91caa 100644 --- a/indra/newview/skins/default/xui/ja/floater_script_queue.xml +++ b/indra/newview/skins/default/xui/ja/floater_script_queue.xml @@ -1,4 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="queue" title="進æ—ã®ãƒªã‚»ãƒƒãƒˆ"> - <button label="é–‰ã˜ã‚‹" label_selected="é–‰ã˜ã‚‹" name="close" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="queue" title="進æ—ã®ãƒªã‚»ãƒƒãƒˆ"> + <floater.string name="Starting"> + [COUNT] アイテム㮠[START] を開始ã—ã¾ã™ã€‚ + </floater.string> + <floater.string name="Done"> + 完了。 + </floater.string> + <floater.string name="Resetting"> + ãƒªã‚»ãƒƒãƒˆä¸ + </floater.string> + <floater.string name="Running"> + å®Ÿè¡Œä¸ + </floater.string> + <floater.string name="NotRunning"> + 実行ã•ã‚Œã¦ã„ã¾ã›ã‚“ + </floater.string> + <button label="é–‰ã˜ã‚‹" label_selected="é–‰ã˜ã‚‹" name="close"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_sell_land.xml b/indra/newview/skins/default/xui/ja/floater_sell_land.xml index 5193e5bba18..f373a7215e0 100644 --- a/indra/newview/skins/default/xui/ja/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_sell_land.xml @@ -1,70 +1,70 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="sell land" title="土地を販売" height="496" min_height="496" > - <scroll_container name="profile_scroll"> - <panel name="scroll_content_panel"> - <text name="info_parcel_label"> - 区画: - </text> - <text name="info_parcel"> - 区画å - </text> - <text name="info_size_label"> - サイズ: - </text> - <text name="info_size"> - [AREA]平方メートル - </text> - <text name="info_action" bottom_delta="-57"> - ã“ã®åŒºç”»ã‚’販売㙠-ã‚‹ã«ã¯: - </text> - <icon bottom_delta="-86" name="step_price" /> - <text name="price_label"> - ä¾¡æ ¼ã‚’è¨å®šï¼š - </text> - <text name="price_text"> - ã“ã®åœŸåœ°ã«å¯¾ã™ã‚‹é©åˆ‡ãªä¾¡æ ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„ - </text> - <text name="price_ld"> - L$ - </text> - <text name="price_per_m" width="230" left_delta="106"> - (1平方メートル当ãŸã‚ŠL$ [PER_METER]) - </text> - <text name="sell_to_label"> - 土地ã®è²©å£²å…ˆï¼š - </text> - <text name="sell_to_text" right="-6"> - 誰ã«ã§ã‚‚販売ã™ã‚‹ã‹ã€ç‰¹å®šã®äººã«ã®ã¿è²©å£²ã™ã‚‹ã‹ã‚’é¸æŠžã—ã¦ãã ã•ã„ - </text> - <combo_box name="sell_to"> - <combo_box.item name="--selectone--" label="1ã¤é¸æŠžï¼ï¼" /> - <combo_box.item name="Anyone" label="誰ã§ã‚‚" /> - <combo_box.item name="Specificuser:" label="特定ユーザー:" /> - </combo_box> - <button label="é¸æŠž..." name="sell_to_select_agent" /> - <text name="sell_objects_label"> - 土地ã¨å…±ã«ã‚ªãƒ–ジェクトを販売ã—ã¾ã™ã‹ï¼Ÿ - </text> - <text name="sell_objects_text"> - 区画上ã«ã‚ã‚‹è²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯æ‰€æœ‰æ¨©ãŒå¤‰æ›´ã•ã‚Œã¾ã™ - </text> - <radio_group name="sell_objects" height="72" bottom_delta="-76"> - <radio_item name="no"> - ã„ã„ãˆã€ã‚ªãƒ–ジェクト所有権 -ã‚’ä¿æŒã—ã¾ã™ - </radio_item> - <radio_item name="yes" bottom="-56"> - ã¯ã„ã€åœŸåœ°ã¨ä¸€ç·’ã«ã‚ªãƒ–ジェ -クトを売りã¾ã™ - </radio_item> - </radio_group> - <button label="オブジェクトを表示" name="show_objects" width="138"/> - <text name="nag_message_label"> - 注æ„:返å“や交æ›ã¯ã§ãã¾ã›ã‚“ - </text> - <button label="販売を決定" name="sell_btn" bottom="-489"/> - <button label="å–り消ã—" name="cancel_btn" /> - </panel> - </scroll_container> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater height="496" min_height="496" name="sell land" title="土地を販売"> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="info_parcel_label"> + 区画: + </text> + <text name="info_parcel"> + 区画å + </text> + <text name="info_size_label"> + サイズ: + </text> + <text name="info_size"> + [AREA]平方メートル + </text> + <text bottom_delta="-57" name="info_action"> + ã“ã®åŒºç”»ã‚’販売㙠+ã‚‹ã«ã¯: + </text> + <icon bottom_delta="-86" name="step_price"/> + <text name="price_label"> + ä¾¡æ ¼ã‚’è¨å®šï¼š + </text> + <text name="price_text"> + é©æ£ä¾¡æ ¼ã‚’é¸ã‚“ã§ãã ã•ã„。 + </text> + <text name="price_ld"> + L$ + </text> + <text left_delta="106" name="price_per_m" width="230"> + (1平方メートル当ãŸã‚ŠL$ [PER_METER]) + </text> + <text name="sell_to_label"> + 土地ã®è²©å£²å…ˆï¼š + </text> + <text name="sell_to_text" right="-6"> + 誰ã«ã§ã‚‚販売ã™ã‚‹ã‹ã€ç‰¹å®šã®äººã«ã®ã¿è²©å£²ã™ã‚‹ã‹ã‚’é¸æŠžã—ã¦ãã ã•ã„ + </text> + <combo_box name="sell_to"> + <combo_box.item label="1ã¤é¸æŠžï¼ï¼" name="--selectone--"/> + <combo_box.item label="誰ã§ã‚‚" name="Anyone"/> + <combo_box.item label="特定ã®äººï¼š" name="Specificuser:"/> + </combo_box> + <button label="é¸æŠž..." name="sell_to_select_agent"/> + <text name="sell_objects_label"> + 土地ã¨å…±ã«ã‚ªãƒ–ジェクトを販売ã—ã¾ã™ã‹ï¼Ÿ + </text> + <text name="sell_objects_text"> + 区画上ã«ã‚ã‚‹è²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯æ‰€æœ‰æ¨©ãŒå¤‰æ›´ã•ã‚Œã¾ã™ + </text> + <radio_group bottom_delta="-76" height="72" name="sell_objects"> + <radio_item name="no"> + ã„ã„ãˆã€ã‚ªãƒ–ジェクト所有権 +ã‚’ä¿æŒã—ã¾ã™ + </radio_item> + <radio_item bottom="-56" name="yes"> + ã¯ã„ã€åœŸåœ°ã¨ä¸€ç·’ã«ã‚ªãƒ–ジェ +クトを売りã¾ã™ + </radio_item> + </radio_group> + <button label="オブジェクトを表示" name="show_objects" width="138"/> + <text name="nag_message_label"> + 注æ„:返å“や交æ›ã¯ã§ãã¾ã›ã‚“ + </text> + <button bottom="-489" label="販売を決定" name="sell_btn"/> + <button label="å–り消ã—" name="cancel_btn"/> + </panel> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml index 133a8ce2cd3..6ad4976b1c3 100644 --- a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml @@ -1,13 +1,13 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater name="settings_debug" title="デãƒãƒƒã‚°è¨å®š"> - <combo_box name="boolean_combo"> - <combo_box.item name="TRUE" label="æ£" /> - <combo_box.item name="FALSE" label="誤" /> - </combo_box> - <color_swatch label="色" name="color_swatch" /> - <spinner label="x" name="val_spinner_1" /> - <spinner label="x" name="val_spinner_2" /> - <spinner label="x" name="val_spinner_3" /> - <spinner label="x" name="val_spinner_4" /> - <button label="デフォルトã«ãƒªã‚»ãƒƒãƒˆ" name="default_btn" /> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="settings_debug" title="デãƒãƒƒã‚°è¨å®š"> + <combo_box name="boolean_combo"> + <combo_box.item label="TRUE" name="TRUE"/> + <combo_box.item label="FALSE" name="FALSE"/> + </combo_box> + <color_swatch label="色" name="val_color_swatch"/> + <spinner label="x" name="val_spinner_1"/> + <spinner label="x" name="val_spinner_2"/> + <spinner label="x" name="val_spinner_3"/> + <spinner label="x" name="val_spinner_4"/> + <button label="デフォルトã«ãƒªã‚»ãƒƒãƒˆ" name="default_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_stats.xml b/indra/newview/skins/default/xui/ja/floater_stats.xml new file mode 100644 index 00000000000..698beccb071 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_stats.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Statistics" title="統計ãƒãƒ¼"> + <scroll_container name="statistics_scroll"> + <container_view name="statistics_view"> + <stat_view label="ベーシック" name="basic"> + <stat_bar label="FPS" name="fps"/> + <stat_bar label="帯域幅" name="bandwidth"/> + <stat_bar label="パケットãƒã‚¹" name="packet_loss"/> + <stat_bar label="シム㮠Ping" name="ping"/> + </stat_view> + <stat_view label="詳細" name="advanced"> + <stat_view label="レンダリング" name="render"> + <stat_bar label="KTris ã®æç”»" name="ktrisframe"/> + <stat_bar label="KTris ã®æç”»" name="ktrissec"/> + <stat_bar label="オブジェクトåˆè¨ˆ" name="objs"/> + <stat_bar label="æ–°ã—ã„オブジェクト" name="newobjs"/> + </stat_view> + <stat_view label="テクスãƒãƒ£" name="texture"> + <stat_bar label="カウント" name="numimagesstat"/> + <stat_bar label="未処ç†ã®ã‚«ã‚¦ãƒ³ãƒˆ" name="numrawimagesstat"/> + <stat_bar label="GL メモリ" name="gltexmemstat"/> + <stat_bar label="フォーマット済メモリ" name="formattedmemstat"/> + <stat_bar label="未処ç†ã®ãƒ¡ãƒ¢ãƒª" name="rawmemstat"/> + <stat_bar label="çµ±åˆãƒ¡ãƒ¢ãƒª" name="glboundmemstat"/> + </stat_view> + <stat_view label="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" name="network"> + <stat_bar label="パケットイン" name="packetsinstat"/> + <stat_bar label="パケットアウト" name="packetsoutstat"/> + <stat_bar label="オブジェクト" name="objectkbitstat"/> + <stat_bar label="テクスãƒãƒ£" name="texturekbitstat"/> + <stat_bar label="アセット" name="assetkbitstat"/> + <stat_bar label="レイヤー" name="layerskbitstat"/> + <stat_bar label="実際ã®å—ä¿¡" name="actualinkbitstat"/> + <stat_bar label="実際ã®é€ä¿¡" name="actualoutkbitstat"/> + <stat_bar label="VFS ä¿ç•™ä¸ã®æ“作" name="vfspendingoperations"/> + </stat_view> + </stat_view> + <stat_view label="シミュレーター" name="sim"> + <stat_bar label="時間ã®é…ã‚Œ" name="simtimedilation"/> + <stat_bar label="シムFPS" name="simfps"/> + <stat_bar label="物ç†çš„作用 FPS" name="simphysicsfps"/> + <stat_view label="物ç†çš„作用ã®è©³ç´°" name="physicsdetail"> + <stat_bar label="ピン留ã‚オブジェクト" name="physicspinnedtasks"/> + <stat_bar label="低 LOD オブジェクト" name="physicslodtasks"/> + <stat_bar label="メモリé…分" name="physicsmemoryallocated"/> + <stat_bar label="エージェントã®æ›´æ–°/秒" name="simagentups"/> + <stat_bar label="メインエージェント" name="simmainagents"/> + <stat_bar label="ãƒãƒ£ã‚¤ãƒ«ãƒ‰ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆ" name="simchildagents"/> + <stat_bar label="オブジェクト" name="simobjects"/> + <stat_bar label="アクティブãªã‚ªãƒ–ジェクト" name="simactiveobjects"/> + <stat_bar label="アクティブãªã‚¹ã‚¯ãƒªãƒ—ト" name="simactivescripts"/> + <stat_bar label="スクリプトイベント" name="simscripteps"/> + <stat_bar label="パケットイン" name="siminpps"/> + <stat_bar label="パケットアウト" name="simoutpps"/> + <stat_bar label="ä¿ç•™ä¸ã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰" name="simpendingdownloads"/> + <stat_bar label="ä¿ç•™ä¸ã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰" name="simpendinguploads"/> + <stat_bar label="未é€ä¿¡ãƒã‚¤ãƒˆåˆè¨ˆ" name="simtotalunackedbytes"/> + </stat_view> + <stat_view label="時間(ms)" name="simperf"> + <stat_bar label="フレーム時間åˆè¨ˆ" name="simframemsec"/> + <stat_bar label="ç·æ™‚é–“æ•°" name="simnetmsec"/> + <stat_bar label="物ç†çš„作用時間" name="simsimphysicsmsec"/> + <stat_bar label="シミュレーション時間" name="simsimothermsec"/> + <stat_bar label="エージェント時間" name="simagentmsec"/> + <stat_bar label="イメージ時間" name="simimagesmsec"/> + <stat_bar label="スクリプト時間" name="simscriptmsec"/> + </stat_view> + </stat_view> + </container_view> + </scroll_container> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index 5840773dbdd..880f42840cf 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -1,511 +1,477 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="制作"> - <button label="" label_selected="" name="button focus" tool_tip="フォーカス"/> - <button label="" label_selected="" name="button move" tool_tip="å‹•ã‹ã™"/> - <button label="" label_selected="" name="button edit" tool_tip="編集"/> - <button label="" label_selected="" name="button create" tool_tip="作æˆ"/> - <button label="" label_selected="" name="button land" tool_tip="土地"/> - <radio_group name="focus_radio_group"> - <radio_item label="ズーム" name="radio zoom"/> - <radio_item label="軌跡(Ctrl)" name="radio orbit"/> - <radio_item label="パン(Ctrl+Shift)" name="radio pan"/> - </radio_group> - <radio_group name="move_radio_group"> - <radio_item label="移動" name="radio move"/> - <radio_item label="æŒã¡ä¸Šã’る(Ctrl)" name="radio lift"/> - <radio_item label="スピン(Ctrl+Shift)" name="radio spin"/> - </radio_group> - <radio_group name="edit_radio_group"> - <radio_item label="ä½ç½®" name="radio position"/> - <radio_item label="回転(Ctrl)" name="radio rotate"/> - <radio_item label="引伸ã°ã™ï¼ˆCtrl+Shift)" name="radio stretch"/> - <radio_item label="テクスãƒãƒ£ãƒ¼ã‚’é¸æŠž" name="radio select face"/> - </radio_group> - <check_box label="リンク部ä½ã‚’編集" name="checkbox edit linked parts"/> - <text name="text ruler mode" width="88"> - ルーラー: - </text> - <combo_box left_delta="60" name="combobox grid mode" width="76"> - <combo_box.item name="World" label="世界"/> - <combo_box.item name="Local" label="ãƒãƒ¼ã‚«ãƒ«"/> - <combo_box.item name="Reference" label="リファレンス"/> - </combo_box> - <check_box label="両å´ã‚’引伸ã°ã™" left="116" name="checkbox uniform"/> - <check_box label="テクスãƒãƒ£ãƒ¼ã‚’引伸ã°ã™" name="checkbox stretch textures"/> - <check_box label="グリッド使用" left_delta="27" name="checkbox snap to grid"/> - <button label="オプション" label_selected="オプション" name="Options..."/> - <text name="text status"> - 移動ã™ã‚‹ã«ã¯ãƒ‰ãƒ©ãƒƒã‚°ã€ã‚³ãƒ”ーã™ã‚‹ã«ã¯Shiftã‚ーを押ã—ãªãŒã‚‰ãƒ‰ãƒ©ãƒƒã‚° - </text> - <button label="" label_selected="" name="ToolCube" tool_tip="ã‚ューブ"/> - <button label="" label_selected="" name="ToolPrism" tool_tip="プリズム"/> - <button label="" label_selected="" name="ToolPyramid" tool_tip="ピラミッド"/> - <button label="" label_selected="" name="ToolTetrahedron" tool_tip="4é¢ä½“"/> - <button label="" label_selected="" name="ToolCylinder" tool_tip="シリンダー"/> - <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="åŠå††æŸ±"/> - <button label="" label_selected="" name="ToolCone" tool_tip="円éŒ"/> - <button label="" label_selected="" name="ToolHemiCone" tool_tip="åŠå††éŒ"/> - <button label="" label_selected="" name="ToolSphere" tool_tip="çƒå½¢"/> - <button label="" label_selected="" name="ToolHemiSphere" tool_tip="åŠçƒ"/> - <button label="" label_selected="" name="ToolTorus" tool_tip="トーラス"/> - <button label="" label_selected="" name="ToolTube" tool_tip="ãƒãƒ¥ãƒ¼ãƒ–"/> - <button label="" label_selected="" name="ToolRing" tool_tip="リング"/> - <button label="" label_selected="" name="ToolTree" tool_tip="樹木"/> - <button label="" label_selected="" name="ToolGrass" tool_tip="è‰åœ°"/> - <check_box label="é¸æŠžã—ãŸã‚‚ã®ã‚’ä¿æŒ" name="checkbox sticky"/> - <check_box label="é¸æŠžã—ãŸã‚‚ã®ã‚’コピー" name="checkbox copy selection"/> - <check_box label="ä¸å¤®ã«ä½ç½®" name="checkbox copy centers"/> - <check_box label="回転" name="checkbox copy rotates"/> - <radio_group name="land_radio_group"> - <radio_item label="土地をé¸æŠž" name="radio select land"/> - <radio_item label="ãªã‚‰ã™" name="radio flatten"/> - <radio_item label="隆起" name="radio raise"/> - <radio_item label="低ãã™ã‚‹" name="radio lower"/> - <radio_item label="滑らã‹ã«ã™ã‚‹" name="radio smooth"/> - <radio_item label="凸凹ã«ã™ã‚‹" name="radio noise"/> - <radio_item label="å…ƒã«æˆ»ã™" name="radio revert"/> - </radio_group> - <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply to selection" tool_tip="é¸æŠžã—ãŸåœŸåœ°ã‚’ä¿®æ£"/> - <text name="Bulldozer:"> - ブルドーザー: - </text> - <text name="Dozer Size:"> - サイズ - </text> - <text name="Strength:"> - 強度 - </text> - <text name="obj_count"> - é¸æŠžæ¸ˆã‚ªãƒ–ジェクト:[COUNT] - </text> - <text name="prim_count"> - プリム:[COUNT] - </text> - <tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30"> - <panel label="一般" name="General"> - <text name="Name:"> - åå‰ï¼š - </text> - <text name="Description:"> - 説明: - </text> - <text name="Creator:"> - クリエーター - </text> - <text name="Creator Name"> - Thrax Linden - </text> - <button label="æƒ…å ±..." label_selected="æƒ…å ±..." name="button creator profile"/> - <text name="Owner:"> - オーナー: - </text> - <text name="Owner Name"> - Thrax Linden - </text> - <button label="æƒ…å ±..." label_selected="æƒ…å ±..." name="button owner profile"/> - <text name="Group:"> - グループ: - </text> - <text name="Group Name Proxy"> - Linden家 - </text> - <button label="è¨å®š..." label_selected="è¨å®š..." name="button set group"/> - <text name="Permissions:"> - æ¨©é™ - </text> - - <check_box label="グループã§å…±åŒç®¡ç†" name="checkbox share with group" tool_tip="è¨å®šã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã™ã‚‹ã™ã¹ã¦ã®ãƒ¡ãƒ³ãƒãƒ¼ã¨ã“ã®ã‚ªãƒ–ジェクトã®æ¨©é™ã‚’共有ã—ã¾ã™ã€‚ 役割制é™ã‚’有効ã«ã™ã‚‹ã«ã¯ã€è²æ¸¡ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"/> - <string name="text deed continued"> - è²æ¸¡... - </string> - <string name="text deed"> - è²æ¸¡ - </string> - <button label="è²æ¸¡..." label_selected="è²æ¸¡..." name="button deed" tool_tip="グループ共有ã®ã‚ªãƒ–ジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・オフィサーã«ã‚ˆã‚Šè²æ¸¡å¯èƒ½ã§ã™ã€‚"/> - <check_box label="誰ã«å¯¾ã—ã¦ã‚‚移動を許å¯" name="checkbox allow everyone move"/> - <check_box label="誰ã«å¯¾ã—ã¦ã‚‚コピーを許å¯" name="checkbox allow everyone copy"/> - <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="検索çµæžœã§ã€ã“ã®ã‚ªãƒ–ジェクトを人ã«è¦‹ã›ã‚‹"/> - <check_box label="売り出ã—ä¸" name="checkbox for sale"/> - <text name="Cost"> - ä¾¡æ ¼ï¼š L$ - </text> - <combo_box name="sale type"> - <combo_box.item label="コピー" name="Copy"/> - <combo_box.item label="コンテンツ" name="Contents"/> - <combo_box.item label="オリジナル" name="Original"/> - </combo_box> - - <text name="label click action"> - 左クリックã™ã‚‹ã¨ï¼š - </text> - <combo_box name="clickaction"> - <combo_box.item name="Touch/grab(default)" label="触るï¼ã¤ã‹ã‚€ (デフォルト)"/> - <combo_box.item name="Sitonobject" label="オブジェクトã«åº§ã‚‹"/> - <combo_box.item name="Buyobject" label="オブジェクトを購入"/> - <combo_box.item name="Payobject" label="オブジェクトã¸ã®æ”¯æ‰•ã„"/> - <combo_box.item name="Open" label="é–‹ã"/> - <combo_box.item name="Play" label="区画メディアをå†ç”Ÿ"/> - <combo_box.item name="Opemmedia" label="区画メディアを開ã"/> - </combo_box> - <panel name="perms_build"> - <text name="perm_modify"> - ã“ã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã™ã€‚ - </text> - <text name="B:"> - B: - </text> - <text name="O:"> - O: - </text> - <text name="G:"> - G: - </text> - <text name="E:"> - E: - </text> - <text name="N:"> - N: - </text> - <text name="F:"> - F: - </text> - <text name="Next owner can:"> - 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ãŒå®Ÿè¡Œã§ãã‚‹æ“作: - </text> - <check_box label="ä¿®æ£" name="checkbox next owner can modify"/> - <check_box label="コピー" name="checkbox next owner can copy"/> - <check_box name="checkbox next owner can transfer"/> - </panel> - <string name="text modify info 1"> - ã“ã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã™ã€‚ - </string> - <string name="text modify info 2"> - ã“れらã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã™ã€‚ - </string> - <string name="text modify info 3"> - ã“ã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã›ã‚“。 - </string> - <string name="text modify info 4"> - ã“れらã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã›ã‚“。 - </string> - <string name="text modify warning"> - 権é™ã‚’è¨å®šã™ã‚‹ã«ã¯ã€ã‚ªãƒ–ジェクト全体をé¸æŠžã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - </string> - <string name="Cost Default"> - ä¾¡æ ¼ï¼š L$ - </string> - <string name="Cost Total"> - åˆè¨ˆä¾¡æ ¼ï¼š L$ - </string> - <string name="Cost Per Unit"> - å˜ä¾¡ï¼š L$ - </string> - <string name="Cost Mixed"> - æ··åˆä¾¡æ ¼ - </string> - <string name="Sale Mixed"> - æ··åˆè²©å£² - </string> - </panel> - <panel label="形状" name="Object"> - <text name="select_single"> - プリムを1ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„ - </text> - <text name="edit_object"> - オブジェクトã®ãƒ‘ラメーターを編集: - </text> - <check_box label="ãƒãƒƒã‚¯æ¸ˆã¿" name="checkbox locked" tool_tip="オブジェクトã®ç§»å‹•ã¨å‰Šé™¤ã‚’ç¦æ¢ã—ã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€æ§‹ç¯‰ä¸ã«æ„図ã—ãªã„編集を防ãã“ã¨ãŒã§ãã¾ã™ã€‚"/> - <check_box label="物ç†" name="Physical Checkbox Ctrl" tool_tip="オブジェクトã«å¯¾ã™ã‚‹é‡åŠ›ã®ä½œç”¨ã¨å½±éŸ¿ã‚’有効ã«ã™ã‚‹"/> - <check_box label="臨時" name="Temporary Checkbox Ctrl" tool_tip="作æˆ1分後ã«ã‚ªãƒ–ジェクトを削除"/> - <check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクトåŒå£«ã®è¡çªã¾ãŸã¯ã‚ªãƒ–ジェクトã¨ã‚¢ãƒã‚¿ãƒ¼ã®è¡çªã‚’回é¿"/> - <text name="label position"> - ä½ç½®ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰ - </text> - <spinner label="X" name="Pos X"/> - <spinner label="Y" name="Pos Y"/> - <spinner label="Z" name="Pos Z"/> - <text name="label size"> - サイズ(メートル) - </text> - <spinner label="X" name="Scale X"/> - <spinner label="Y" name="Scale Y"/> - <spinner label="Z" name="Scale Z"/> - <text name="label rotation"> - 回転(度) - </text> - <spinner label="X" name="Rot X"/> - <spinner label="Y" name="Rot Y"/> - <spinner label="Z" name="Rot Z"/> - <text name="label material"> - ç´ æ - </text> - <combo_box name="material"> - <combo_box.item name="Stone" label="石æ"/> - <combo_box.item name="Metal" label="金属"/> - <combo_box.item name="Glass" label="ガラス"/> - <combo_box.item name="Wood" label="木æ"/> - <combo_box.item name="Flesh" label="è‚Œ"/> - <combo_box.item name="Plastic" label="プラスãƒãƒƒã‚¯"/> - <combo_box.item name="Rubber" label="ゴム"/> - </combo_box> - <text name="label basetype"> - å»ºé€ ç‰©ãƒ–ãƒãƒƒã‚¯ãƒ»ã‚¿ã‚¤ãƒ— - </text> - <combo_box name="comboBaseType"> - <combo_box.item name="Box" label="ボックス"/> - <combo_box.item name="Cylinder" label="シリンダー"/> - <combo_box.item name="Prism" label="プリズム"/> - <combo_box.item name="Sphere" label="çƒå½¢"/> - <combo_box.item name="Torus" label="トーラス"/> - <combo_box.item name="Tube" label="ãƒãƒ¥ãƒ¼ãƒ–"/> - <combo_box.item name="Ring" label="リング"/> - <combo_box.item name="Sculpted" label="スカルプト"/> - </combo_box> - <text name="text cut"> - パス・カットã®å§‹ç‚¹ã¨çµ‚点 - </text> - <spinner label="B" name="cut begin"/> - <spinner label="E" name="cut end"/> - <text name="text hollow"> - ä¸ç©ºï¼ˆç©ºæ´žï¼‰ - </text> - <text name="text skew"> - 傾斜 - </text> - <text name="Hollow Shape"> - ä¸ç©ºï¼ˆç©ºæ´žï¼‰ã®å½¢ - </text> - <combo_box name="hole"> - <combo_box.item name="Default" label="デフォルト"/> - <combo_box.item name="Circle" label="サークル"/> - <combo_box.item name="Square" label="æ£æ–¹å½¢"/> - <combo_box.item name="Triangle" label="三角形"/> - </combo_box> - <text name="text twist"> - ã²ãã‚Šã®å§‹ã¾ã‚Šã¨çµ‚ã‚ã‚Š - </text> - <spinner label="B" name="Twist Begin"/> - <spinner label="E" name="Twist End"/> - <text name="scale_taper"> - テーパー - </text> - <text name="scale_hole"> - 穴寸法 - </text> - <spinner label="X" name="Taper Scale X"/> - <spinner label="Y" name="Taper Scale Y"/> - <text name="text topshear"> - 上部層 - </text> - <spinner label="X" name="Shear X"/> - <spinner label="Y" name="Shear Y"/> - <text name="advanced_cut"> - プロフィール・カットã®å§‹ç‚¹ã¨çµ‚点 - </text> - <text name="advanced_dimple"> - ãã¼ã¿ã®å§‹ç‚¹ã¨çµ‚点 - </text> - <text name="advanced_slice"> - 切りå–ã‚Šã®å§‹ç‚¹ã¨çµ‚点 - </text> - <spinner label="B" name="Path Limit Begin"/> - <spinner label="E" name="Path Limit End"/> - <text name="text taper2"> - テーパー - </text> - <spinner label="X" name="Taper X"/> - <spinner label="Y" name="Taper Y"/> - <text name="text radius delta"> - åŠå¾„ - </text> - <text name="text revolutions"> - 回転体 - </text> - <texture_picker label="スカルプトテクスãƒãƒ£ãƒ¼" name="sculpt texture control" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> - <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトã•ã‚ŒãŸãƒ—リムをX軸上ã§å転"/> - <check_box label="è£è¿”ã—" name="sculpt invert control" tool_tip="スカルプトã•ã‚ŒãŸãƒ—リムã®ãƒŽãƒ¼ãƒžãƒ«ã‚’逆転ã•ã›ã€è£è¿”ã—ã«è¡¨ç¤º"/> - <text name="label sculpt type"> - 縫ã„ç›®ã®ã‚¿ã‚¤ãƒ— - </text> - <combo_box name="sculpt type control"> - <combo_box.item name="None" label="(ãªã—)"/> - <combo_box.item name="Sphere" label="çƒå½¢"/> - <combo_box.item name="Torus" label="トーラス"/> - <combo_box.item name="Plane" label="å¹³é¢"/> - <combo_box.item name="Cylinder" label="シリンダー"/> - </combo_box> - </panel> - <panel label="特徴" name="Features"> - <text name="select_single"> - プリムを1ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„ - </text> - <text name="edit_object"> - オブジェクトã®ç‰¹å¾´ã‚’編集: - </text> - <check_box label="フレã‚シブル・パス" name="Flexible1D Checkbox Ctrl" tool_tip="Z軸をä¸å¿ƒã¨ã™ã‚‹ã‚ªãƒ–ジェクトã®æŠ˜ã‚Œæ›²ãŒã‚Šã‚’有効ã«ã™ã‚‹ (クライアントå´ã®ã¿ï¼‰"/> - <spinner label="柔軟性" name="FlexNumSections" width="135" label_width="72"/> - <spinner label="é‡åŠ›" name="FlexGravity" width="135" label_width="72"/> - <spinner label="ドラッグ" name="FlexFriction" width="135" label_width="72"/> - <spinner label="風" name="FlexWind" width="135" label_width="72"/> - <spinner label="ç·Šå¼µ" name="FlexTension" width="135" label_width="72"/> - <spinner label="X軸方å‘ã®åŠ›" name="FlexForceX" width="135" label_width="72"/> - <spinner label="Y軸方å‘ã®åŠ›" name="FlexForceY" width="135" label_width="72"/> - <spinner label="Z軸方å‘ã®åŠ›" name="FlexForceZ" width="135" label_width="72"/> - <check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰"/> - <text name="label color"> - 色 - </text> - <color_swatch label="" name="colorswatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã" left_delta="74"/> - <spinner label="è¼åº¦" name="Light Intensity" width="135" label_width="72"/> - <spinner label="åŠå¾„" name="Light Radius" width="135" label_width="72"/> - <spinner label="å¼±ã¾ã‚‹" name="Light Falloff" width="135" label_width="72"/> - </panel> - <panel label="æ質" name="Texture"> - <texture_picker label="テクスãƒãƒ£ãƒ¼" name="texture control" tool_tip="写真をクリックã—ã¦é¸æŠž"/> - <color_swatch label="色" name="colorswatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/> - <text name="color trans"> - é€éŽåº¦ % - </text> - <text name="glow label"> - ã‚°ãƒãƒ¼ - </text> - <check_box label="明るã•å…¨é–‹" name="checkbox fullbright"/> - <text name="tex gen"> - マッピング - </text> - <combo_box name="combobox texgen"> - <combo_box.item name="Default" label="デフォルト"/> - <combo_box.item name="Planar" label="å¹³é¢"/> - </combo_box> - <text name="label shininess"> - è¼ã - </text> - <combo_box name="combobox shininess"> - <combo_box.item name="None" label="ãªã—"/> - <combo_box.item name="Low" label="低"/> - <combo_box.item name="Medium" label="ä¸"/> - <combo_box.item name="High" label="高"/> - </combo_box> - <text name="label bumpiness"> - 凹凸 - </text> - <combo_box name="combobox bumpiness"> - <combo_box.item name="None" label="ãªã—"/> - <combo_box.item name="Brightness" label="明るã•"/> - <combo_box.item name="Darkness" label="æš—ã•"/> - <combo_box.item name="woodgrain" label="木目調"/> - <combo_box.item name="bark" label="木ã®çš®"/> - <combo_box.item name="bricks" label="レンガ"/> - <combo_box.item name="checker" label="ãƒã‚§ãƒƒã‚«ãƒ¼"/> - <combo_box.item name="concrete" label="コンクリート"/> - <combo_box.item name="crustytile" label="クラスティ・タイル"/> - <combo_box.item name="cutstone" label="カットストーン"/> - <combo_box.item name="discs" label="ディスク"/> - <combo_box.item name="gravel" label="ç ‚åˆ©"/> - <combo_box.item name="petridish" label="ペトリ"/> - <combo_box.item name="siding" label="羽目æ¿"/> - <combo_box.item name="stonetile" label="ストーン・タイル"/> - <combo_box.item name="stucco" label="ã—ã£ãã„"/> - <combo_box.item name="suction" label="å¸ã„è¾¼ã¿"/> - <combo_box.item name="weave" label="織目"/> - </combo_box> - <text name="tex scale"> - é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™ - </text> - <spinner label="水平(U)" name="TexScaleU"/> - <check_box label="å転" name="checkbox flip s"/> - <spinner label="垂直(V)" name="TexScaleV"/> - <check_box label="å転" name="checkbox flip t"/> - <text name="tex rotate"> - 回転(度) - </text> - <string name="string repeats per meter"> - メートルã”ã¨ã«ç¹°è¿”ã™ - </string> - <string name="string repeats per face"> - é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™ - </string> - <text name="rpt"> - メートルã”ã¨ã«ç¹°è¿”ã™ - </text> - <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply"/> - <text name="tex offset"> - ãšã‚Œ - </text> - <spinner label="水平(U)" name="TexOffsetU"/> - <spinner label="垂直(V)" name="TexOffsetV"/> - <text name="textbox autofix" width="190"> - メディア・テクスãƒãƒ£ãƒ¼ã‚’æƒãˆã‚‹ -(最åˆã«ãƒãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ï¼‰ - </text> - <button bottom="-365" label="æƒãˆã‚‹" label_selected="æƒãˆã‚‹" left="155" name="button align"/> - </panel> - <panel label="ä¸èº«" name="Contents"> - <button label="æ–°ã—ã„スクリプト" label_selected="æ–°ã—ã„スクリプト" name="button new script" width="120"/> - <button label="権é™" name="button permissions" left_delta="130" width="80"/> - </panel> - </tab_container> - <panel name="land info panel"> - <text name="label_parcel_info"> - åŒºç”»æƒ…å ± - </text> - <text name="label_area_price" width="200"> - ä¾¡æ ¼ï¼š[AREA]平方メートルã‚ãŸã‚ŠL$[PRICE] - </text> - <text name="label_area" width="200"> - é¢ç©ï¼š[AREA]平方メートル - </text> - <button label="åœŸåœ°æƒ…å ±..." label_selected="åœŸåœ°æƒ…å ±..." name="button about land"/> - <check_box label="オーナーを表示" name="checkbox show owners" tool_tip="所有権別ã«åŒºç”»ã‚’色分ã‘ã—ã¾ã™ï¼š ç·‘ = ã‚ãªãŸã®åœŸåœ° アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 赤 = 他人ãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° 黄色 = 売り出ã—ä¸ ç´« = オークション グレー = パブリック"/> - <button label="?" label_selected="?" name="button show owners help" left_delta="114"/> - <text name="label_parcel_modify"> - 区画ã®ç·¨é›† - </text> - <button label="å†åˆ†å‰²" label_selected="å†åˆ†å‰²" name="button subdivide land"/> - <button label="çµ±åˆã™ã‚‹" label_selected="çµ±åˆã™ã‚‹" name="button join land"/> - <text name="label_parcel_trans"> - 土地å–引 - </text> - <button label="土地を購入" label_selected="土地を購入" name="button buy land"/> - <button label="土地を放棄" label_selected="土地を放棄" name="button abandon land"/> - </panel> - <floater.string name="status_rotate"> - 色ã®ä»˜ã„ãŸãƒãƒ³ãƒ‰ã‚’ドラッグã—ã¦ã‚ªãƒ–ジェクトを回転 - </floater.string> - <floater.string name="status_scale"> - é¸æŠžã—ãŸå´ã‚’クリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦å¼•ã伸ã°ã™ - </floater.string> - <floater.string name="status_move"> - 移動:ドラッグã€ã‚³ãƒ”ー:Shiftを押ã—ãªãŒã‚‰ï¾„゙ラッグ - </floater.string> - <floater.string name="status_modifyland"> - 土地をクリックã—ã€ãƒœã‚¿ãƒ³ã‚’押ã—ãŸã¾ã¾å…¥åŠ›ã—ã¦ä¿®æ£å¤‰æ›´ - </floater.string> - <floater.string name="status_camera"> - クリックã—ドラッグã—ã¦è¦–界を調整 - </floater.string> - <floater.string name="status_grab"> - 移動:ドラッグã€æŒã¡ä¸Šã’:Ctrlã€å›žè»¢ï¼šCtrl+Shift - </floater.string> - <floater.string name="status_place"> - インワールドã§ã‚¯ãƒªãƒƒã‚¯ã—ã¦ä½œæˆ - </floater.string> - <floater.string name="status_selectland"> - 土地をクリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦é¸æŠž - </floater.string> - <floater.string name="grid_screen_text"> - ç”»é¢ - </floater.string> - <floater.string name="grid_local_text"> - ãƒãƒ¼ã‚«ãƒ« - </floater.string> - <floater.string name="grid_world_text"> - 世界 - </floater.string> - <floater.string name="grid_reference_text"> - å‚ç…§ - </floater.string> - <floater.string name="grid_attachment_text"> - アタッãƒãƒ¡ãƒ³ãƒˆ - </floater.string> -</floater> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="toolbox floater" short_title="制作ツール" title=""> + <floater.string name="status_rotate"> + 色ã®ä»˜ã„ãŸãƒãƒ³ãƒ‰ã‚’ドラッグã—ã¦ã‚ªãƒ–ジェクトを回転 + </floater.string> + <floater.string name="status_scale"> + é¸æŠžã—ãŸå´ã‚’クリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦å¼•ã伸ã°ã™ + </floater.string> + <floater.string name="status_move"> + 移動:ドラッグã€ã‚³ãƒ”ー:Shiftを押ã—ãªãŒã‚‰ï¾„゙ラッグ + </floater.string> + <floater.string name="status_modifyland"> + 土地をクリックã—ã€ãƒœã‚¿ãƒ³ã‚’押ã—ãŸã¾ã¾å…¥åŠ›ã—ã¦ä¿®æ£å¤‰æ›´ + </floater.string> + <floater.string name="status_camera"> + クリック・ドラッグã§è¦–界を移動 + </floater.string> + <floater.string name="status_grab"> + 移動:ドラッグã€æŒã¡ä¸Šã’:Ctrlã€å›žè»¢ï¼šCtrl+Shift + </floater.string> + <floater.string name="status_place"> + インワールドã§ã‚¯ãƒªãƒƒã‚¯ã—ã¦ä½œæˆ + </floater.string> + <floater.string name="status_selectland"> + 土地をクリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦é¸æŠž + </floater.string> + <floater.string name="grid_screen_text"> + ç”»é¢ + </floater.string> + <floater.string name="grid_local_text"> + ãƒãƒ¼ã‚«ãƒ« + </floater.string> + <floater.string name="grid_world_text"> + 世界 + </floater.string> + <floater.string name="grid_reference_text"> + å‚ç…§ + </floater.string> + <floater.string name="grid_attachment_text"> + アタッãƒãƒ¡ãƒ³ãƒˆ + </floater.string> + <button label="" label_selected="" name="button focus" tool_tip="フォーカス"/> + <button label="" label_selected="" name="button move" tool_tip="å‹•ã‹ã™"/> + <button label="" label_selected="" name="button edit" tool_tip="編集"/> + <button label="" label_selected="" name="button create" tool_tip="作æˆ"/> + <button label="" label_selected="" name="button land" tool_tip="土地"/> + <text name="text status"> + 移動ã™ã‚‹ã«ã¯ãƒ‰ãƒ©ãƒƒã‚°ã€ã‚³ãƒ”ーã™ã‚‹ã«ã¯Shiftã‚ーを押ã—ãªãŒã‚‰ãƒ‰ãƒ©ãƒƒã‚° + </text> + <radio_group name="focus_radio_group"> + <radio_item label="ズーム" name="radio zoom"/> + <radio_item label="軌跡(Ctrl)" name="radio orbit"/> + <radio_item label="パン(Ctrl+Shift)" name="radio pan"/> + </radio_group> + <radio_group name="move_radio_group"> + <radio_item label="移動" name="radio move"/> + <radio_item label="æŒã¡ä¸Šã’る(Ctrl)" name="radio lift"/> + <radio_item label="スピン(Ctrl+Shift)" name="radio spin"/> + </radio_group> + <radio_group name="edit_radio_group"> + <radio_item label="移動" name="radio position"/> + <radio_item label="回転(Ctrl)" name="radio rotate"/> + <radio_item label="引伸ã°ã™ï¼ˆCtrl+Shift)" name="radio stretch"/> + <radio_item label="テクスãƒãƒ£ãƒ¼ã‚’é¸æŠž" name="radio select face"/> + </radio_group> + <check_box label="リンク部分を編集" name="checkbox edit linked parts"/> + <check_box label="両å´ã‚’引伸ã°ã™" left="116" name="checkbox uniform"/> + <check_box initial_value="true" label="テクスãƒãƒ£ãƒ¼ã‚’引伸ã°ã™" name="checkbox stretch textures"/> + <check_box initial_value="true" label="グリッドãƒã‚¤ãƒ³ãƒˆã«ã‚¹ãƒŠãƒƒãƒ—" left_delta="27" name="checkbox snap to grid"/> + <combo_box left_delta="60" name="combobox grid mode" width="76"> + <combo_box.item label="ワールドルーラ" name="World"/> + <combo_box.item label="ãƒãƒ¼ã‚«ãƒ«ãƒ«ãƒ¼ãƒ©" name="Local"/> + <combo_box.item label="レファレンスルーラ" name="Reference"/> + </combo_box> + <button label="オプション" label_selected="オプション" name="Options..." tool_tip="グリッドオプションをè¨å®š"/> + <button label="" label_selected="" name="ToolCube" tool_tip="ã‚ューブ"/> + <button label="" label_selected="" name="ToolPrism" tool_tip="プリズム"/> + <button label="" label_selected="" name="ToolPyramid" tool_tip="ピラミッド"/> + <button label="" label_selected="" name="ToolTetrahedron" tool_tip="4é¢ä½“"/> + <button label="" label_selected="" name="ToolCylinder" tool_tip="シリンダー"/> + <button label="" label_selected="" name="ToolHemiCylinder" tool_tip="åŠå††æŸ±"/> + <button label="" label_selected="" name="ToolCone" tool_tip="円éŒ"/> + <button label="" label_selected="" name="ToolHemiCone" tool_tip="åŠå††éŒ"/> + <button label="" label_selected="" name="ToolSphere" tool_tip="çƒå½¢"/> + <button label="" label_selected="" name="ToolHemiSphere" tool_tip="åŠçƒ"/> + <button label="" label_selected="" name="ToolTorus" tool_tip="トーラス"/> + <button label="" label_selected="" name="ToolTube" tool_tip="ãƒãƒ¥ãƒ¼ãƒ–"/> + <button label="" label_selected="" name="ToolRing" tool_tip="リング"/> + <button label="" label_selected="" name="ToolTree" tool_tip="樹木"/> + <button label="" label_selected="" name="ToolGrass" tool_tip="è‰åœ°"/> + <check_box label="é¸æŠžã—ãŸã‚‚ã®ã‚’ä¿æŒ" name="checkbox sticky"/> + <check_box label="é¸æŠžã—ãŸã‚‚ã®ã‚’コピー" name="checkbox copy selection"/> + <check_box initial_value="true" label="ä¸å¤®ã«ã‚³ãƒ”ー" name="checkbox copy centers"/> + <check_box label="回転ã•ã›ã¦ã‚³ãƒ”ー" name="checkbox copy rotates"/> + <radio_group name="land_radio_group"> + <radio_item label="土地をé¸æŠž" name="radio select land"/> + <radio_item label="ãªã‚‰ã™" name="radio flatten"/> + <radio_item label="隆起" name="radio raise"/> + <radio_item label="低ãã™ã‚‹" name="radio lower"/> + <radio_item label="滑らã‹ã«ã™ã‚‹" name="radio smooth"/> + <radio_item label="凸凹ã«ã™ã‚‹" name="radio noise"/> + <radio_item label="å…ƒã«æˆ»ã™" name="radio revert"/> + </radio_group> + <text name="Bulldozer:"> + ブルドーザー: + </text> + <text name="Dozer Size:"> + サイズ + </text> + <text name="Strength:"> + 強度 + </text> + <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply to selection" tool_tip="é¸æŠžã—ãŸåœŸåœ°ã‚’ä¿®æ£"/> + <text name="obj_count"> + オブジェクト: [COUNT] + </text> + <text name="prim_count"> + プリム: [COUNT] + </text> + <tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30"> + <panel label="一般" name="General"> + <panel.string name="text deed continued"> + è²æ¸¡ + </panel.string> + <panel.string name="text deed"> + è²æ¸¡ + </panel.string> + <panel.string name="text modify info 1"> + ã“ã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã™ã€‚ + </panel.string> + <panel.string name="text modify info 2"> + ã“れらã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã™ã€‚ + </panel.string> + <panel.string name="text modify info 3"> + ã“ã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã›ã‚“。 + </panel.string> + <panel.string name="text modify info 4"> + ã“れらã®ã‚ªãƒ–ジェクトã¯ä¿®æ£ã§ãã¾ã›ã‚“。 + </panel.string> + <panel.string name="text modify warning"> + オブジェクト全体をé¸æŠžã—ã¦æ¨©é™ã®è¨å®šã‚’è¡Œã£ã¦ãã ã•ã„。 + </panel.string> + <panel.string name="Cost Default"> + ä¾¡æ ¼ï¼š L$ + </panel.string> + <panel.string name="Cost Total"> + åˆè¨ˆä¾¡æ ¼ï¼š L$ + </panel.string> + <panel.string name="Cost Per Unit"> + å˜ä¾¡ï¼š L$ + </panel.string> + <panel.string name="Cost Mixed"> + æ··åˆä¾¡æ ¼ + </panel.string> + <panel.string name="Sale Mixed"> + æ··åˆè²©å£² + </panel.string> + <text name="Name:"> + åå‰ï¼š + </text> + <text name="Description:"> + 説明: + </text> + <text name="Creator:"> + クリエーター + </text> + <text name="Creator Name"> + Thrax Linden + </text> + <text name="Owner:"> + オーナー: + </text> + <text name="Owner Name"> + Thrax Linden + </text> + <text name="Group:"> + グループ: + </text> + <button label="è¨å®š..." label_selected="è¨å®š..." name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠž"/> + <name_box initial_value="ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°..." name="Group Name Proxy"/> + <button label="è²æ¸¡" label_selected="è²æ¸¡" name="button deed" tool_tip="ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’è²æ¸¡ã™ã‚‹ã¨æ¬¡ã®æ‰€æœ‰è€…ã®æ¨©é™ãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚ グループ共有オブジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ã‚£ã‚µãƒ¼ãŒè²æ¸¡ã§ãã¾ã™ã€‚"/> + <check_box label="共有" name="checkbox share with group" tool_tip="è¨å®šã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ£æ¨©é™ã‚’与ãˆã¾ã™ã€‚ 役割制é™ã‚’有効ã«ã™ã‚‹ã«ã¯ã€è²æ¸¡ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"/> + <text name="label click action"> + クリックã§ï¼š + </text> + <combo_box name="clickaction"> + <combo_box.item label="触れる(デフォルト)" name="Touch/grab(default)"/> + <combo_box.item label="オブジェクトã«åº§ã‚‹" name="Sitonobject"/> + <combo_box.item label="オブジェクトを購入" name="Buyobject"/> + <combo_box.item label="オブジェクトã¸ã®æ”¯æ‰•ã„" name="Payobject"/> + <combo_box.item label="é–‹ã" name="Open"/> + </combo_box> + <check_box label="販売ä¸ï¼š" name="checkbox for sale"/> + <combo_box name="sale type"> + <combo_box.item label="コピー" name="Copy"/> + <combo_box.item label="コンテンツ" name="Contents"/> + <combo_box.item label="オリジナル" name="Original"/> + </combo_box> + <spinner label="ä¾¡æ ¼ï¼š L$" name="Edit Cost"/> + <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="検索çµæžœã§ã€ã“ã®ã‚ªãƒ–ジェクトを人ã«è¦‹ã›ã‚‹"/> + <panel name="perms_build"> + <text name="perm_modify"> + ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™ + </text> + <text name="Anyone can:"> + 全員: + </text> + <check_box label="コピー" name="checkbox allow everyone copy"/> + <text name="Next owner can:"> + 次ã®æ‰€æœ‰è€…: + </text> + <check_box label="ä¿®æ£" name="checkbox next owner can modify"/> + <check_box label="コピー" name="checkbox next owner can copy"/> + <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> + </panel> + </panel> + <panel label="形状" name="Object"> + <check_box label="ãƒãƒƒã‚¯æ¸ˆã¿" name="checkbox locked" tool_tip="オブジェクトã®ç§»å‹•ã¨å‰Šé™¤ã‚’ç¦æ¢ã—ã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€æ§‹ç¯‰ä¸ã«æ„図ã—ãªã„編集を防ãã“ã¨ãŒã§ãã¾ã™ã€‚"/> + <check_box label="物ç†" name="Physical Checkbox Ctrl" tool_tip="オブジェクトã«å¯¾ã™ã‚‹é‡åŠ›ã®ä½œç”¨ã¨å½±éŸ¿ã‚’有効ã«ã™ã‚‹"/> + <check_box label="臨時" name="Temporary Checkbox Ctrl" tool_tip="作æˆ1分後ã«ã‚ªãƒ–ジェクトを削除"/> + <check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクトåŒå£«ã®è¡çªã¾ãŸã¯ã‚ªãƒ–ジェクトã¨ã‚¢ãƒã‚¿ãƒ¼ã®è¡çªã‚’回é¿"/> + <text name="label position"> + ä½ç½®ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰ + </text> + <spinner label="X" name="Pos X"/> + <spinner label="Y" name="Pos Y"/> + <spinner label="Z" name="Pos Z"/> + <text name="label size"> + サイズ(メートル) + </text> + <spinner label="X" name="Scale X"/> + <spinner label="Y" name="Scale Y"/> + <spinner label="Z" name="Scale Z"/> + <text name="label rotation"> + 回転(度) + </text> + <spinner label="X" name="Rot X"/> + <spinner label="Y" name="Rot Y"/> + <spinner label="Z" name="Rot Z"/> + <combo_box name="comboBaseType"> + <combo_box.item label="ボックス" name="Box"/> + <combo_box.item label="シリンダー" name="Cylinder"/> + <combo_box.item label="プリズム" name="Prism"/> + <combo_box.item label="çƒå½¢" name="Sphere"/> + <combo_box.item label="トーラス" name="Torus"/> + <combo_box.item label="ãƒãƒ¥ãƒ¼ãƒ–" name="Tube"/> + <combo_box.item label="リング" name="Ring"/> + <combo_box.item label="スカルプト" name="Sculpted"/> + </combo_box> + <combo_box name="material"> + <combo_box.item label="石æ" name="Stone"/> + <combo_box.item label="金属" name="Metal"/> + <combo_box.item label="ガラス" name="Glass"/> + <combo_box.item label="木æ" name="Wood"/> + <combo_box.item label="è‚Œ" name="Flesh"/> + <combo_box.item label="プラスãƒãƒƒã‚¯" name="Plastic"/> + <combo_box.item label="ゴム" name="Rubber"/> + </combo_box> + <text name="text cut"> + パスカット(始点/終点) + </text> + <spinner label="B" name="cut begin"/> + <spinner label="E" name="cut end"/> + <text name="text hollow"> + ä¸ç©ºï¼ˆç©ºæ´žï¼‰ + </text> + <text name="text skew"> + 傾斜 + </text> + <text name="Hollow Shape"> + ä¸ç©ºï¼ˆç©ºæ´žï¼‰ã®å½¢ + </text> + <combo_box name="hole"> + <combo_box.item label="デフォルト" name="Default"/> + <combo_box.item label="サークル" name="Circle"/> + <combo_box.item label="æ£æ–¹å½¢" name="Square"/> + <combo_box.item label="三角形" name="Triangle"/> + </combo_box> + <text name="text twist"> + ã²ãり(始点/終点) + </text> + <spinner label="B" name="Twist Begin"/> + <spinner label="E" name="Twist End"/> + <text name="scale_taper"> + テーパー + </text> + <text name="scale_hole"> + 穴寸法 + </text> + <spinner label="X" name="Taper Scale X"/> + <spinner label="Y" name="Taper Scale Y"/> + <text name="text topshear"> + 上部層 + </text> + <spinner label="X" name="Shear X"/> + <spinner label="Y" name="Shear Y"/> + <text name="advanced_cut"> + プãƒãƒ•ã‚£ãƒ¼ãƒ«ãƒ»ã‚«ãƒƒãƒˆï¼ˆå§‹ç‚¹/終点) + </text> + <text name="advanced_dimple"> + ãã¼ã¿ï¼ˆå§‹ç‚¹/終点) + </text> + <text name="advanced_slice"> + 切りå–り(始点/終点) + </text> + <spinner label="B" name="Path Limit Begin"/> + <spinner label="E" name="Path Limit End"/> + <text name="text taper2"> + テーパー + </text> + <spinner label="X" name="Taper X"/> + <spinner label="Y" name="Taper Y"/> + <text name="text radius delta"> + åŠå¾„ + </text> + <text name="text revolutions"> + 回転体 + </text> + <texture_picker label="スカルプトテクスãƒãƒ£ãƒ¼" name="sculpt texture control" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¦ãã ã•ã„。"/> + <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトã•ã‚ŒãŸãƒ—リムをX軸上ã§å転"/> + <check_box label="è£è¿”ã—" name="sculpt invert control" tool_tip="スカルプトã•ã‚ŒãŸãƒ—リムã®ãƒŽãƒ¼ãƒžãƒ«ã‚’逆転ã•ã›ã€è£è¿”ã—ã«è¡¨ç¤º"/> + <text name="label sculpt type"> + 縫ã„ç›®ã®ã‚¿ã‚¤ãƒ— + </text> + <combo_box name="sculpt type control"> + <combo_box.item label="(ãªã—)" name="None"/> + <combo_box.item label="çƒå½¢" name="Sphere"/> + <combo_box.item label="トーラス" name="Torus"/> + <combo_box.item label="å¹³é¢" name="Plane"/> + <combo_box.item label="シリンダー" name="Cylinder"/> + </combo_box> + </panel> + <panel label="特徴" name="Features"> + <text name="select_single"> + プリムを1ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„ + </text> + <text name="edit_object"> + オブジェクトã®ç‰¹å¾´ã‚’編集: + </text> + <check_box label="フレã‚シブル・パス" name="Flexible1D Checkbox Ctrl" tool_tip="Z軸をä¸å¿ƒã¨ã™ã‚‹ã‚ªãƒ–ジェクトã®æŠ˜ã‚Œæ›²ãŒã‚Šã‚’有効ã«ã™ã‚‹ (クライアントå´ã®ã¿ï¼‰"/> + <spinner label="柔軟性" label_width="72" name="FlexNumSections" width="135"/> + <spinner label="é‡åŠ›" label_width="72" name="FlexGravity" width="135"/> + <spinner label="ドラッグ" label_width="72" name="FlexFriction" width="135"/> + <spinner label="風" label_width="72" name="FlexWind" width="135"/> + <spinner label="ç·Šå¼µ" label_width="72" name="FlexTension" width="135"/> + <spinner label="X軸方å‘ã®åŠ›" label_width="72" name="FlexForceX" width="135"/> + <spinner label="Y軸方å‘ã®åŠ›" label_width="72" name="FlexForceY" width="135"/> + <spinner label="Z軸方å‘ã®åŠ›" label_width="72" name="FlexForceZ" width="135"/> + <check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰"/> + <color_swatch label="" left_delta="74" name="colorswatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/> + <spinner label="è¼åº¦" label_width="72" name="Light Intensity" width="135"/> + <spinner label="åŠå¾„" label_width="72" name="Light Radius" width="135"/> + <spinner label="å¼±ã¾ã‚‹" label_width="72" name="Light Falloff" width="135"/> + </panel> + <panel label="æ質" name="Texture"> + <panel.string name="string repeats per meter"> + メートルã”ã¨ã«ç¹°è¿”ã™ + </panel.string> + <panel.string name="string repeats per face"> + é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™ + </panel.string> + <texture_picker label="テクスãƒãƒ£ãƒ¼" name="texture control" tool_tip="写真をクリックã—ã¦é¸æŠž"/> + <color_swatch label="色" name="colorswatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/> + <text name="color trans"> + é€éŽåº¦ % + </text> + <text name="glow label"> + ã‚°ãƒãƒ¼ + </text> + <check_box label="明るã•å…¨é–‹" name="checkbox fullbright"/> + <text name="tex gen"> + マッピング + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="デフォルト" name="Default"/> + <combo_box.item label="å¹³é¢" name="Planar"/> + </combo_box> + <text name="label shininess"> + è¼ã + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="ãªã—" name="None"/> + <combo_box.item label="低" name="Low"/> + <combo_box.item label="ä¸" name="Medium"/> + <combo_box.item label="高" name="High"/> + </combo_box> + <text name="label bumpiness"> + 凹凸 + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="ãªã—" name="None"/> + <combo_box.item label="明るã•" name="Brightness"/> + <combo_box.item label="æš—ã•" name="Darkness"/> + <combo_box.item label="木目調" name="woodgrain"/> + <combo_box.item label="木ã®çš®" name="bark"/> + <combo_box.item label="レンガ" name="bricks"/> + <combo_box.item label="ãƒã‚§ãƒƒã‚«ãƒ¼" name="checker"/> + <combo_box.item label="コンクリート" name="concrete"/> + <combo_box.item label="クラスティ・タイル" name="crustytile"/> + <combo_box.item label="カットストーン" name="cutstone"/> + <combo_box.item label="ディスク" name="discs"/> + <combo_box.item label="ç ‚åˆ©" name="gravel"/> + <combo_box.item label="ペトリ" name="petridish"/> + <combo_box.item label="羽目æ¿" name="siding"/> + <combo_box.item label="ストーン・タイル" name="stonetile"/> + <combo_box.item label="ã—ã£ãã„" name="stucco"/> + <combo_box.item label="å¸ã„è¾¼ã¿" name="suction"/> + <combo_box.item label="織目" name="weave"/> + </combo_box> + <text name="tex scale"> + é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™ + </text> + <spinner label="水平(U)" name="TexScaleU"/> + <check_box label="å転" name="checkbox flip s"/> + <spinner label="垂直(V)" name="TexScaleV"/> + <check_box label="å転" name="checkbox flip t"/> + <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply"/> + <text name="tex offset"> + Texture Offset + </text> + <spinner label="水平(U)" name="TexOffsetU"/> + <spinner label="垂直(V)" name="TexOffsetV"/> + </panel> + <panel label="ä¸èº«" name="Contents"> + <button label="æ–°ã—ã„スクリプト" label_selected="æ–°ã—ã„スクリプト" name="button new script" width="120"/> + <button label="権é™" left_delta="130" name="button permissions" width="80"/> + </panel> + </tab_container> + <panel name="land info panel"> + <text name="label_parcel_info"> + åŒºç”»æƒ…å ± + </text> + <text name="label_area_price" width="200"> + ä¾¡æ ¼ï¼š[AREA]平方メートルã‚ãŸã‚ŠL$[PRICE] + </text> + <text name="label_area" width="200"> + é¢ç©ï¼š[AREA]平方メートル + </text> + <button label="åœŸåœ°æƒ…å ±..." label_selected="åœŸåœ°æƒ…å ±..." name="button about land"/> + <check_box label="オーナーを表示" name="checkbox show owners" tool_tip="所有権別ã«åŒºç”»ã‚’色分ã‘ã—ã¾ã™ï¼š + +ç·‘ = ã‚ãªãŸã®åœŸåœ° +アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 +赤 = 他人ãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° +黄色 = 売り出ã—ä¸ +ç´« = オークション +グレー = パブリック"/> + <text name="label_parcel_modify"> + 区画ã®ç·¨é›† + </text> + <button label="å†åˆ†å‰²" label_selected="å†åˆ†å‰²" name="button subdivide land"/> + <button label="çµ±åˆã™ã‚‹" label_selected="çµ±åˆã™ã‚‹" name="button join land"/> + <text name="label_parcel_trans"> + 土地å–引 + </text> + <button label="土地を購入" label_selected="土地を購入" name="button buy land"/> + <button label="土地を放棄" label_selected="土地を放棄" name="button abandon land"/> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/ja/inspect_avatar.xml b/indra/newview/skins/default/xui/ja/inspect_avatar.xml new file mode 100644 index 00000000000..c7d2cbee043 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/inspect_avatar.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- + Not can_close / no title to avoid window chrome + Single instance - only have one at a time, recycle it each spawn +--> +<floater name="inspect_avatar"> + <string name="Subtitle"> + [AGE] + </string> + <string name="Details"> + [ACCTTYPE]ã€[PAYMENTINFO] +プãƒãƒ•ã‚£ãƒ¼ãƒ«ï¼š [SL_PROFILE] + </string> + <slider name="volume_slider" tool_tip="ボイス音é‡" value="0.5"/> + <button label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="add_friend_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml new file mode 100644 index 00000000000..b3287a1a351 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Avatar Icon Menu"> + <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示..." name="Show Profile"/> + <menu_item_call label="IMã‚’é€ä¿¡..." name="Send IM"/> + <menu_item_call label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ ..." name="Add Friend"/> + <menu_item_call label="フレンドを削除..." name="Remove Friend"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_favorites.xml b/indra/newview/skins/default/xui/ja/menu_favorites.xml new file mode 100644 index 00000000000..fbaa33035fc --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_favorites.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Teleport To Landmark"/> + <menu_item_call label="ランドマークを表示・編集" name="Landmark Open"/> + <menu_item_call label="SLurl をコピー" name="Copy slurl"/> + <menu_item_call label="地図ã«è¡¨ç¤º" name="Show On Map"/> + <menu_item_call label="コピー" name="Landmark Copy"/> + <menu_item_call label="貼り付ã‘" name="Landmark Paste"/> + <menu_item_call label="削除" name="Delete"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_group_plus.xml b/indra/newview/skins/default/xui/ja/menu_group_plus.xml new file mode 100644 index 00000000000..762f9f616d9 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_group_plus.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="menu_group_plus"> + <menu_item_call label="グループã«å‚åŠ ..." name="item_join"/> + <menu_item_call label="æ–°ã—ã„グループ..." name="item_new"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml index 37c52f173cf..e3420c0c155 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml @@ -1,66 +1,76 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="Popup"> - <menu_item_call label="購入" name="Task Buy"/> - <menu_item_call label="é–‹ã" name="Task Open"/> - <menu_item_call label="å†ç”Ÿ" name="Task Play"/> - <menu_item_call label="プãƒãƒ‘ティ" name="Task Properties"/> - <menu_item_call label="åå‰ã®å¤‰æ›´" name="Task Rename"/> - <menu_item_call label="削除" name="Task Remove"/> - <menu_item_call label="ゴミ箱を空ã«ã™ã‚‹" name="Empty Trash"/> - <menu_item_call label="éºå¤±ç‰©ãƒ•ã‚©ãƒ«ãƒ€ã‚’空ã«ã™ã‚‹" name="Empty Lost And Found"/> - <menu_item_call label="æ–°ã—ã„フォルダ" name="New Folder"/> - <menu_item_call label="æ–°ã—ã„スクリプト" name="New Script"/> - <menu_item_call label="æ–°ã—ã„ノート" name="New Note"/> - <menu_item_call label="æ–°ã—ã„ジェスãƒãƒ£ãƒ¼" name="New Gesture"/> - <menu name="New Clothes"> - <menu_item_call label="æ–°ã—ã„シャツ" name="New Shirt"/> - <menu_item_call label="æ–°ã—ã„ズボン" name="New Pants"/> - <menu_item_call label="æ–°ã—ã„é´" name="New Shoes"/> - <menu_item_call label="æ–°ã—ã„é´ä¸‹" name="New Socks"/> - <menu_item_call label="æ–°ã—ã„ジャケット" name="New Jacket"/> - <menu_item_call label="æ–°ã—ã„スカート" name="New Skirt"/> - <menu_item_call label="æ–°ã—ã„手袋" name="New Gloves"/> - <menu_item_call label="æ–°ã—ã„下ç€" name="New Undershirt"/> - <menu_item_call label="æ–°ã—ã„パンツ" name="New Underpants"/> - </menu> - <menu name="New Body Parts"> - <menu_item_call label="æ–°ã—ã„シェイプ(体型)" name="New Shape"/> - <menu_item_call label="æ–°ã—ã„スã‚ン" name="New Skin"/> - <menu_item_call label="æ–°ã—ã„髪" name="New Hair"/> - <menu_item_call label="æ–°ã—ã„眼" name="New Eyes"/> - </menu> - <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Landmark Open"/> - <menu_item_call label="é–‹ã" name="Animation Open"/> - <menu_item_call label="é–‹ã" name="Sound Open"/> - <menu_item_call label="アイテムを除外" name="Purge Item"/> - <menu_item_call label="アイテムを復元" name="Restore Item"/> - <menu_item_call label="é–‹ã" name="Open"/> - <menu_item_call label="プãƒãƒ‘ティ" name="Properties"/> - <menu_item_call label="åå‰ã®å¤‰æ›´" name="Rename"/> - <menu_item_call label="UUIDをコピー" name="Copy Asset UUID"/> - <menu_item_call label="コピー" name="Copy"/> - <menu_item_call label="貼り付ã‘" name="Paste"/> - <menu_item_call label="削除" name="Delete"/> - <menu_item_call label="アイテムをå–り外ã™" name="Take Off Items"/> - <menu_item_call label="æœè£…ã«è¿½åŠ " name="Add To Outfit"/> - <menu_item_call label="æœè£…ã‚’ç½®æ›" name="Replace Outfit"/> - <menu_item_call label="会è°ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat Folder"/> - <menu_item_call label="å†ç”Ÿ" name="Sound Play"/> - <menu_item_call label="ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯æƒ…å ±" name="Teleport To Landmark"/> - <menu_item_call label="世界ã§å†ç”Ÿ" name="Animation Play"/> - <menu_item_call label="ãƒãƒ¼ã‚«ãƒ«ã«å†ç”Ÿ" name="Animation Audition"/> - <menu_item_call label="インスタント・メッセージをé€ä¿¡" name="Send Instant Message"/> - <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’贈る..." name="Offer Teleport..."/> - <menu_item_call label="会è°ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat"/> - <menu_item_call label="アクティブ" name="Activate"/> - <menu_item_call label="éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–" name="Deactivate"/> - <menu_item_call label="自分ã‹ã‚‰å–り外ã™" name="Detach From Yourself"/> - <menu_item_call label="å‰å›žã‚ã£ãŸä½ç½®ã«æˆ»ã™" name="Restore to Last Position"/> - <menu_item_call label="装ç€" name="Object Wear"/> - <menu label="装ç€å…ˆ" name="Attach To"/> - <menu label="HUD装ç€å…ˆ" name="Attach To HUD"/> - <menu_item_call label="編集" name="Wearable Edit"/> - <menu_item_call label="装ç€" name="Wearable Wear"/> - <menu_item_call label="å–り外ã™" name="Take Off"/> - <menu_item_call label="ï¼ï¼ã‚ªãƒ—ションãªã—ï¼ï¼" name="--no options--"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="購入" name="Task Buy"/> + <menu_item_call label="é–‹ã" name="Task Open"/> + <menu_item_call label="å†ç”Ÿ" name="Task Play"/> + <menu_item_call label="プãƒãƒ‘ティ" name="Task Properties"/> + <menu_item_call label="åå‰ã®å¤‰æ›´" name="Task Rename"/> + <menu_item_call label="削除" name="Task Remove"/> + <menu_item_call label="ゴミ箱を空ã«ã™ã‚‹" name="Empty Trash"/> + <menu_item_call label="éºå¤±ç‰©ãƒ•ã‚©ãƒ«ãƒ€ã‚’空ã«ã™ã‚‹" name="Empty Lost And Found"/> + <menu_item_call label="æ–°ã—ã„フォルダ" name="New Folder"/> + <menu_item_call label="æ–°ã—ã„スクリプト" name="New Script"/> + <menu_item_call label="æ–°ã—ã„ノート" name="New Note"/> + <menu_item_call label="æ–°ã—ã„ジェスãƒãƒ£ãƒ¼" name="New Gesture"/> + <menu label="æ–°è¦è¡£é¡ž" name="New Clothes"> + <menu_item_call label="æ–°ã—ã„シャツ" name="New Shirt"/> + <menu_item_call label="æ–°ã—ã„ズボン" name="New Pants"/> + <menu_item_call label="æ–°ã—ã„é´" name="New Shoes"/> + <menu_item_call label="æ–°ã—ã„é´ä¸‹" name="New Socks"/> + <menu_item_call label="æ–°ã—ã„ジャケット" name="New Jacket"/> + <menu_item_call label="æ–°ã—ã„スカート" name="New Skirt"/> + <menu_item_call label="æ–°ã—ã„手袋" name="New Gloves"/> + <menu_item_call label="æ–°ã—ã„下ç€" name="New Undershirt"/> + <menu_item_call label="æ–°ã—ã„パンツ" name="New Underpants"/> + </menu> + <menu label="æ–°è¦èº«ä½“部ä½" name="New Body Parts"> + <menu_item_call label="æ–°ã—ã„シェイプ(体型)" name="New Shape"/> + <menu_item_call label="æ–°ã—ã„スã‚ン" name="New Skin"/> + <menu_item_call label="æ–°ã—ã„髪" name="New Hair"/> + <menu_item_call label="æ–°ã—ã„眼" name="New Eyes"/> + </menu> + <menu label="種類を変更" name="Change Type"> + <menu_item_call label="デフォルト" name="Default"/> + <menu_item_call label="手袋" name="Gloves"/> + <menu_item_call label="ジャケット" name="Jacket"/> + <menu_item_call label="パンツ" name="Pants"/> + <menu_item_call label="シェイプ" name="Shape"/> + <menu_item_call label="é´" name="Shoes"/> + <menu_item_call label="シャツ" name="Shirt"/> + <menu_item_call label="スカート" name="Skirt"/> + <menu_item_call label="下ç€ãƒ‘ンツ" name="Underpants"/> + <menu_item_call label="下ç€ã‚·ãƒ£ãƒ„" name="Undershirt"/> + </menu> + <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="Landmark Open"/> + <menu_item_call label="é–‹ã" name="Animation Open"/> + <menu_item_call label="é–‹ã" name="Sound Open"/> + <menu_item_call label="アイテムを除外" name="Purge Item"/> + <menu_item_call label="アイテムを復元" name="Restore Item"/> + <menu_item_call label="é–‹ã" name="Open"/> + <menu_item_call label="プãƒãƒ‘ティ" name="Properties"/> + <menu_item_call label="åå‰ã®å¤‰æ›´" name="Rename"/> + <menu_item_call label="UUIDをコピー" name="Copy Asset UUID"/> + <menu_item_call label="コピー" name="Copy"/> + <menu_item_call label="貼り付ã‘" name="Paste"/> + <menu_item_call label="削除" name="Delete"/> + <menu_item_call label="アイテムをå–り外ã™" name="Take Off Items"/> + <menu_item_call label="æœè£…ã«è¿½åŠ " name="Add To Outfit"/> + <menu_item_call label="æœè£…ã‚’ç½®æ›" name="Replace Outfit"/> + <menu_item_call label="会è°ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat Folder"/> + <menu_item_call label="å†ç”Ÿ" name="Sound Play"/> + <menu_item_call label="世界ã§å†ç”Ÿ" name="Animation Play"/> + <menu_item_call label="ãƒãƒ¼ã‚«ãƒ«ã«å†ç”Ÿ" name="Animation Audition"/> + <menu_item_call label="インスタント・メッセージをé€ä¿¡" name="Send Instant Message"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’贈る..." name="Offer Teleport..."/> + <menu_item_call label="会è°ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat"/> + <menu_item_call label="アクティブ" name="Activate"/> + <menu_item_call label="éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–" name="Deactivate"/> + <menu_item_call label="自分ã‹ã‚‰å–り外ã™" name="Detach From Yourself"/> + <menu_item_call label="装ç€" name="Object Wear"/> + <menu label="装ç€å…ˆ" name="Attach To"/> + <menu label="HUD装ç€å…ˆ" name="Attach To HUD"/> + <menu_item_call label="編集" name="Wearable Edit"/> + <menu_item_call label="装ç€" name="Wearable Wear"/> + <menu_item_call label="å–り外ã™" name="Take Off"/> + <menu_item_call label="ï¼ï¼ã‚ªãƒ—ションãªã—ï¼ï¼" name="--no options--"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_landmark.xml b/indra/newview/skins/default/xui/ja/menu_landmark.xml new file mode 100644 index 00000000000..778eb72e701 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_landmark.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="landmark_overflow_menu"> + <menu_item_call label="SLurl をコピー" name="copy"/> + <menu_item_call label="削除" name="delete"/> + <menu_item_call label="ピックを作æˆ" name="pick"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_mini_map.xml b/indra/newview/skins/default/xui/ja/menu_mini_map.xml index c8828a50bef..f080647be27 100644 --- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="popup"> - <menu_item_call label="ズーム(近)" name="Zoom Close"/> - <menu_item_call label="ズーム(ä¸ï¼‰" name="Zoom Medium"/> - <menu_item_call label="ズーム(é )" name="Zoom Far"/> - <menu_item_call label="追跡をやã‚ã‚‹" name="Stop Tracking"/> - <menu_item_call label="プãƒãƒ•ã‚£ãƒ¼ãƒ«..." name="Profile"/> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="popup"> + <menu_item_call label="ズーム(近)" name="Zoom Close"/> + <menu_item_call label="ズーム(ä¸ï¼‰" name="Zoom Medium"/> + <menu_item_call label="ズーム(é )" name="Zoom Far"/> + <menu_item_call label="追跡をやã‚ã‚‹" name="Stop Tracking"/> + <menu_item_call label="世界地図" name="World Map"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_navbar.xml b/indra/newview/skins/default/xui/ja/menu_navbar.xml new file mode 100644 index 00000000000..e10c436208d --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_navbar.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Navbar Menu"> + <menu_item_check label="座標を表示" name="Show Coordinates"/> + <menu_item_call label="ランドマーク" name="Landmark"/> + <menu_item_call label="切りå–ã‚Š" name="Cut"/> + <menu_item_call label="コピー" name="Copy"/> + <menu_item_call label="貼り付ã‘" name="Paste"/> + <menu_item_call label="削除" name="Delete"/> + <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_picks.xml b/indra/newview/skins/default/xui/ja/menu_picks.xml new file mode 100644 index 00000000000..a0880bd555a --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_picks.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Picks"> + <menu_item_call label="æƒ…å ±" name="pick_info"/> + <menu_item_call label="編集" name="pick_edit"/> + <menu_item_call label="テレãƒãƒ¼ãƒˆ" name="pick_teleport"/> + <menu_item_call label="地図" name="pick_map"/> + <menu_item_call label="削除" name="pick_delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_place.xml b/indra/newview/skins/default/xui/ja/menu_place.xml new file mode 100644 index 00000000000..01095387b4c --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_place.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<toggleable_menu name="place_overflow_menu"> + <menu_item_call label="ランドマークを作æˆ" name="landmark"/> + <menu_item_call label="ピックを作æˆ" name="pick"/> + <menu_item_call label="å…¥å ´è¨±å¯ã‚’購入" name="pass"/> + <menu_item_call label="編集" name="edit"/> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml index 6d155633826..1be2954f3fe 100644 --- a/indra/newview/skins/default/xui/ja/menu_slurl.xml +++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu name="Popup"> - <menu_item_call label="URLã«ã¤ã„ã¦" name="about_url" /> - <menu_item_call label="URLã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url" /> - <menu_item_call label="地図上ã«è¡¨ç¤º" name="show_on_map" /> -</menu> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Popup"> + <menu_item_call label="URLã«ã¤ã„ã¦" name="about_url"/> + <menu_item_call label="URLã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/> + <menu_item_call label="地図" name="show_on_map"/> +</menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml new file mode 100644 index 00000000000..57e7931ce60 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="ä½äººã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’表示" name="show_agent"/> + <menu_item_call label="åå‰ã‚’クリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> + <menu_item_call label="SLurlをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_group.xml b/indra/newview/skins/default/xui/ja/menu_url_group.xml new file mode 100644 index 00000000000..2970256cfe1 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_url_group.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±ã‚’è¡¨ç¤º" name="show_group"/> + <menu_item_call label="グループをクリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> + <menu_item_call label="SLurlをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_http.xml b/indra/newview/skins/default/xui/ja/menu_url_http.xml new file mode 100644 index 00000000000..8abb5cead66 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_url_http.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="Web ページを開ã" name="url_open"/> + <menu_item_call label="インターãƒãƒƒãƒˆãƒ–ラウザã§é–‹ã" name="url_open_internal"/> + <menu_item_call label="外部ブラウザã§é–‹ã" name="url_open_external"/> + <menu_item_call label="URLをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml new file mode 100644 index 00000000000..1746e163b6b --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="オブジェクトã®æƒ…å ±ã‚’è¡¨ç¤º" name="show_object"/> + <menu_item_call label="オブジェクトã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_object"/> + <menu_item_call label="オブジェクトåをクリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> + <menu_item_call label="SLurlをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml new file mode 100644 index 00000000000..05639f086e8 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="åŒºç”»æƒ…å ±ã‚’è¡¨ç¤º" name="show_parcel"/> + <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml new file mode 100644 index 00000000000..e66da8e9b93 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="å ´æ‰€ã®æƒ…å ±ã‚’è¡¨ç¤º" name="show_place"/> + <menu_item_call label="ç¾åœ°ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_location"/> + <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml new file mode 100644 index 00000000000..0239e0e0e67 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Url Popup"> + <menu_item_call label="ã“ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport"/> + <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 4d067d28230..ce50a33f1cd 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -1,3264 +1,2685 @@ -<?xml version="1.0" encoding="utf-8"?> -<notifications> - <global name="skipnexttime"> - 今後ã¯è¡¨ç¤ºã—ãªã„ - </global> - <global name="alwayschoose"> - 常ã«ã“ã®ã‚ªãƒ—ションをé¸æŠž - </global> - <global name="implicitclosebutton"> - é–‰ã˜ã‚‹ - </global> - <template name="okbutton"> - <form> - <button - name="OK" - text="$yestext"/> - </form> - </template> - - <template name="okignore"> - <form> - <button - name="OK" - text="$yestext"/> - <ignore text="$ignoretext"/> - </form> - </template> - - <template name="okcancelbuttons"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Cancel" - text="$notext"/> - </form> - </template> - - <template name="okcancelignore"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Cancel" - text="$notext"/> - <ignore text="$ignoretext"/> - </form> - </template> - - <template name="okhelpbuttons"> - <form> - <button - name="OK" - text="$yestext"/> - <button - name="Help" - text="$helptext"/> - </form> - </template> - - <template name="yesnocancelbuttons"> - <form> - <button - name="Yes" - text="$yestext"/> - <button - name="No" - text="$notext"/> - <button - name="Cancel" - text="$canceltext"/> - </form> - </template> - <notification functor="GenericAcknowledge" label="ä¸æ˜Žãªè¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸" name="MissingAlert"> - ã‚ãªãŸã® [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€ -今å—ã‘å–ã£ãŸè¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - -エラー詳細: 「[_NAME]ã€ã¨ã„ã†è¦å‘Šã¯ notifications.xml ã«ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="FloaterNotFound"> - フãƒãƒ¼ã‚¿ãƒ»ã‚¨ãƒ©ãƒ¼ï¼šä¸‹è¨˜ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸï¼š -[CONTROLS] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="TutorialNotFound"> - ç¾åœ¨åˆ©ç”¨å¯èƒ½ãªãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã¯ã‚ã‚Šã¾ã›ã‚“。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="GenericAlert"> - [MESSAGE] - </notification> - <notification name="GenericAlertYesCancel"> - [MESSAGE] - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="ã¯ã„"/> - </notification> - <notification name="BadInstallation"> - [APP_NAME] をアップデートä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LoginFailedNoNetwork"> - ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ï¼š 接続ãŒç¢ºç«‹ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -「[DIAGNOSTIC]〠-ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’確èªã—ã¦ãã ã•ã„。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MessageTemplateNotFound"> - メッセージテンプレート [PATH] ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="WearableSave"> - ç¾åœ¨ã®è¡£æœ/ボディーパーツã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> - </notification> - <notification name="CompileQueueSaveText"> - 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—ト用テã‚ストã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON] 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CompileQueueSaveBytecode"> - 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON]後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="WriteAnimationFail"> - アニメーションデータã®æ›¸ãè¾¼ã¿ã«å•é¡ŒãŒã‚ã‚Šã¾ã™ã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="UploadAuctionSnapshotFail"> - 次ã®ç†ç”±ã§ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON] - </notification> - <notification name="UnableToViewContentsMoreThanOne"> - 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è¡¨ç¤ºã§ãã¾ã›ã‚“。 -é¸æŠžã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="SaveClothingBodyChanges"> - è¡£æœï¼èº«ä½“部ä½ã«å¯¾ã™ã‚‹å¤‰æ›´ã‚’ã™ã¹ã¦ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ã™ã¹ã¦ä¿å˜"/> - </notification> - <notification name="GrantModifyRights"> - ä»–ã®ä½äººã«å¤‰æ›´æ¨©é™ã‚’与ãˆã‚‹ã¨ã€ãã®äººã¯ã‚ãªãŸãŒæ‰€æœ‰ã—ã¦ã„ã‚‹ -ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€ã¾ãŸã¯å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®è¨±å¯ã‚’与ãˆã‚‹ã¨ãã¯ç´°å¿ƒã®æ³¨æ„を払ã£ã¦ãã ã•ã„。 -[FIRST_NAME] [LAST_NAME]ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="GrantModifyRightsMultiple"> - 変更権é™ã‚’与ãˆã‚‹ã¨ã€ãã®äººã¯ã‚ãªãŸãŒä½œæˆã—ãŸå…¨ã¦ã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -ã“ã®è¨±å¯ã‚’与ãˆã‚‹ã¨ãã«ã¯ç´°å¿ƒã®æ³¨æ„を払ã£ã¦ãã ã•ã„。 -é¸æŠžã—ãŸä½äººã«å¤‰æ›´æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="RevokeModifyRights"> - [FIRST_NAME] [LAST_NAME]ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’å–り消ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="RevokeModifyRightsMultiple"> - é¸æŠžã—ãŸä½äººã‹ã‚‰å¤‰æ›´æ¨©é™ã‚’å–り下ã’ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="UnableToCreateGroup"> - グループを作æˆã§ãã¾ã›ã‚“。 -[MESSAGE] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PanelGroupApply"> - [NEEDS_APPLY_MESSAGE] -[WANT_APPLY_MESSAGE] - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="変更を無視" yestext="変更をé©ç”¨"/> - </notification> - <notification name="MustSpecifyGroupNoticeSubject"> - グループ通知ã®é€ä¿¡ã«ã¯ã€ä»¶åã®è¨˜å…¥ãŒå¿…è¦ã§ã™ã€‚ - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AddGroupOwnerWarning"> - ã‚ãªãŸã¯ [ROLE_NAME]ã®å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -任命ã•ã‚ŒãŸãƒ¡ãƒ³ãƒãƒ¼ãŒè‡ªã‚‰é€€ä»»ã—ãªã„é™ã‚Šã€ -彼らを役柄ã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“。 -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="オーナーã®å½¹å‰²ã«ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã‚’åŠ ãˆã‚‹ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="AssignDangerousActionWarning"> - ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’ -与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ - - *è¦å‘Š* -ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ -自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ç¾åœ¨ã‚ˆã‚Šå¼·åŠ›ãªæ¨©é™ã‚’割り当ã¦ã€ -自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã« -任命ã™ã‚‹ã“ã¨ã‚‚ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ ã“ã®è¡Œç‚ºã®æ„味をよãç†è§£ã—ã¦ã‹ã‚‰ -実行ã—ã¦ãã ã•ã„。 - -ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="AssignDangerousAbilityWarning"> - ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’ -与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ - - *è¦å‘Š* -ã“ã®èƒ½åŠ›ã‚’ã‚‚ã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ -自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã™ã¹ã¦ã®èƒ½åŠ›ã‚’割り当ã¦ã€ -自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«ä»»å‘½ã§ãã¾ã™ã€‚ - -ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="ClickPublishHelpLand"> - 「検索ã§å…¬é–‹ã€ã‚’é¸æŠž -ã“ã®ãƒœãƒƒã‚¯ã‚¹ã«ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨è¡¨ç¤ºï¼š -- 検索çµæžœã«ãŠã‘ã‚‹ã“ã®åŒºç”» -- ã“ã®åŒºç”»ã®ãƒ‘ブリック・オブジェクト -- ウェブ検索ã«ãŠã‘ã‚‹ã“ã®åŒºç”» - </notification> - <notification name="ClickSoundHelpLand"> - メディアã¨éŸ³æ¥½ã¯ã“ã®åŒºç”»å†…ã§ã®ã¿ãŠæ¥½ã—ã¿ã„ãŸã ã‘ã¾ã™ã€‚ サウンドã¨ãƒœã‚¤ã‚¹ã¯åŒºç”»å†…é™å®šã‹ã€å„自ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã£ã¦ã¯åŒºç”»å¤–ã§ã‚‚èžãã“ã¨ãŒã§ãã¾ã™ã€‚ ナレッジベースを開ã„ã¦è¨å®šã®ä»•æ–¹ã‚’å¦ã³ã¾ã™ã‹ï¼Ÿ - <url name="url"> - http://wiki.secondlife.com/wiki/区画上ã®ãƒ¡ãƒ‡ã‚£ã‚¢_(KB) - </url> - <usetemplate name="okcancelbuttons" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> - </notification> - <notification name="ClickSearchHelpAll"> - 検索çµæžœã¯ä»Šè¦‹ã¦ã„るタブã€ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã€é¸æŠžã—ãŸã‚«ãƒ†ã‚´ãƒªãã®ä»–ã‚’å…ƒã«ç·¨æˆã•ã‚Œã¦ã„ã¾ã™ã€‚ 詳細ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。 - <url name="url"> - http://wiki.secondlife.com/wiki/検索ã«é–¢ã™ã‚‹ã‚ˆãã‚る質å•é›†_(KB) - </url> - <usetemplate name="okcancelbuttons" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> - </notification> - <notification name="ClickPublishHelpLandDisabled"> - ã“ã®åŒºç”»ã¯æ¤œç´¢ã‚’ç¦ãšã‚‹åœ°åŸŸã«ã‚ã‚‹ãŸã‚〠-ã“ã®åŒºç”»ã‚’検索ã«è¡¨ç¤ºã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="ClickPublishHelpAvatar"> - 「検索ã«è¡¨ç¤ºã€ã‚’é¸æŠžã™ã‚‹ã¨è¡¨ç¤ºï¼š -- 検索çµæžœã«ãŠã‘る自分ã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ« -- 公開グループ・ページã«ãŠã‘る自分ã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«ã¸ã®ãƒªãƒ³ã‚¯ - </notification> - <notification name="ClickPartnerHelpAvatar"> - [SECOND_LIFE]ã®ã‚¦ã‚§ãƒ–・サイトã‹ã‚‰ã€ -ä»–ã®ä½äººã¸ã®ãƒ—ãƒãƒãƒ¼ã‚ºã€ãƒ‘ートナー解消手続ããŒã§ãã¾ã™ã€‚ - -ウェブ・サイトã«è¡Œã£ã¦ パートナーã«é–¢ã™ã‚‹æƒ…å ±ã‚’å–å¾—ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> - </notification> - <notification name="ClickUploadHelpPermissions"> - ã‚ãªãŸã®æŒã¤ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ¨©é™ã¯å¤ã„地域ã§ã¯ä½¿ãˆã¾ã›ã‚“。 - </notification> - <notification name="ClickWebProfileHelpAvatar"> - ã“ã®ä½äººãŒã‚¦ã‚§ãƒ–・プãƒãƒ•ã‚£ãƒ¼ãƒ«URLã‚’è¨å®šã—ã¦ã„ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ - * 「ãƒãƒ¼ãƒ‰ã€ã‚’クリックã—ã€ã“ã®ã‚¦ã‚§ãƒ–・タブ内ã§ãƒšãƒ¼ã‚¸ã‚’表示 - * 「ãƒãƒ¼ãƒ‰ã€ï¼žã€Œå¤–部ブラウザ〠をクリックã—ã€ãƒ‡ã‚£ãƒ•ã‚©ãƒ«ãƒˆã®ã‚¦ã‚§ãƒ–・ブラウザã§ãƒšãƒ¼ã‚¸ã‚’表示 - * 「ãƒãƒ¼ãƒ‰ã€ï¼žã€Œãƒ›ãƒ¼ãƒ URL〠をクリックã—ã€ä»–ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ã“ã®ä½äººã®ã‚¦ã‚§ãƒ–・プãƒãƒ•ã‚£ãƒ¼ãƒ«ã«æˆ»ã‚‹ - -自分ã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«ã«ä»»æ„ã®URLを入力ã—OKをクリックã—ã¦ã€ã‚¦ã‚§ãƒ–・プãƒãƒ•ã‚£ãƒ¼ãƒ«ã¨ã—ã¦è¨å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -ãれを見ãŸä»–ã®ä½äººãŒãã®ã‚µã‚¤ãƒˆã‚’訪れるã“ã¨ãŒã§ãã¾ã™ã€‚ - </notification> - <notification name="JoinGroupCanAfford"> - ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã«ã¯ã€L$[COST]ã‹ã‹ã‚Šã¾ã™ã€‚ -続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="å‚åŠ "/> - </notification> - <notification name="JoinGroupCannotAfford"> - ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ã«ã¯ã€L$[COST]å¿…è¦ã§ã™ã€‚ -L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="LandBuyPass"> - L$[COST]㧠[TIME]時間ã“ã®åœŸåœ°[PARCEL_NAME]ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -å…¥å ´è¨±å¯ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="SalePriceRestriction"> - ä¸ç‰¹å®šã®äººã«å£²å´ã™ã‚‹å ´åˆã«ã¯ã€ -売å´ä¾¡æ ¼ã¯L$0以上ã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ -売å´ä¾¡æ ¼ã‚’L$0ã«è¨å®šã™ã‚‹å ´åˆã¯ã€ -売å´ã™ã‚‹å€‹äººã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="ConfirmLandSaleChange"> - é¸æŠžã•ã‚ŒãŸ[LAND_SIZE]平方メートルã®åœŸåœ°ã¯ã€å£²ã‚Šå‡ºã—ä¸ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ -売å´ä¾¡æ ¼L$[SALE_PRICE]ã§ã€[NAME]ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ConfirmLandSaleToAnyoneChange"> - 注:「誰ã«ã§ã‚‚売å´ã™ã‚‹ã€ã‚’クリックã™ã‚‹ã¨ã€ -ã‚ãªãŸã®åœŸåœ°ã¯[SECOND_LIFE] ã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã®ã©ã“ã‹ã‚‰ã§ã‚‚ -(ã“ã®åœ°åŸŸã«ãªã„コミュニティをå«ã‚€ï¼‰è³¼å…¥ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ - -é¸æŠžã•ã‚ŒãŸ[LAND_SIZE]平方メートルã®åœŸåœ°ã¯ã€ -売り出ã—ä¸ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ -売å´ä¾¡æ ¼L$[SALE_PRICE]ã§ã€[NAME]ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ReturnObjectsDeededToGroup"> - ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ—[NAME]共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - -*è¦å‘Š* ã“ã‚Œã«ã‚ˆã‚Šã€ -グループã«è²æ¸¡ã•ã‚ŒãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•ã‚Œã¾ã™ï¼ -オブジェクト: [N] - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedByUser"> - ã“ã®åŒºç”»ã§ã€ -ä½äºº[NAME]ãŒæ‰€æœ‰ã™ã‚‹å…¨ã¦ã®ã‚ªãƒ–ジェクトを -彼らã®æŒã¡ç‰©ã«æœ¬å½“ã«è¿”å´ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ - -オブジェクト: [N] - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ReturnObjectsOwnedBySelf"> - ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを〠-ã‚ãªãŸã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - -オブジェクト: [N] - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedBySelf"> - ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸä»¥å¤–ãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを〠-ãã‚Œãžã‚Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ -グループã«è²æ¸¡ã•ã‚ŒãŸè²æ¸¡å¯èƒ½ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•ã‚Œã¾ã™ã€‚ - -*è¦å‘Š* ã“ã‚Œã«ã‚ˆã‚Šã€ -グループã«è²æ¸¡ã•ã‚ŒãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•ã‚Œã¾ã™ï¼ -オブジェクト: [N] - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByUser"> - ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚る〠-[NAME]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãã‚Œãžã‚Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•ã‚ŒãŸè²æ¸¡å¯èƒ½ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•ã‚Œã¾ã™ã€‚ - -*è¦å‘Š* ã“ã‚Œã«ã‚ˆã‚Šã€ -グループã«è²æ¸¡ã•ã‚ŒãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•ã‚Œã¾ã™ï¼ -オブジェクト: [N] - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ReturnAllTopObjects"> - å…¨ã¦ã®ãƒªã‚¹ãƒˆã•ã‚ŒãŸã‚ªãƒ–ジェクトを所有者ã«æœ¬å½“ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="DisableAllTopObjects"> - ã“ã®åœ°åŸŸå†…ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを無効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ReturnObjectsNotOwnedByGroup"> - ã“ã®åœŸåœ°ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—[NAME] -ã¨ã®é–“ã§å…±æœ‰ã—ã¦ã„ãªã„オブジェクトをオーナーã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ - -オブジェクト: [N] - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="UnableToDisableOutsideScripts"> - スクリプトを無効ã«ã§ãã¾ã›ã‚“。 -ã“ã®åœ°åŸŸå…¨ä½“ãŒã€Œãƒ€ãƒ¡ãƒ¼ã‚¸æœ‰åŠ¹ã€ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ -æ¦å™¨ã‚’使用ã™ã‚‹ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - </notification> - <notification name="MustBeInParcel"> - ç€åœ°ç‚¹ã‚’è¨å®šã™ã‚‹ã«ã¯ã€ã“ã®åŒºç”»ã®å†…å´ã« -ç«‹ã£ã¦ãã ã•ã„。 - </notification> - <notification name="PromptRecipientEmail"> - å—信者ã®æœ‰åŠ¹ãªEメールアドレスを入力ã—ã¦ãã ã•ã„。 - </notification> - <notification name="PromptSelfEmail"> - ã‚ãªãŸã®Eメール・アドレスを入力ã—ã¦ãã ã•ã„。 - </notification> - <notification name="PromptMissingSubjMsg"> - デフォルトã®ä»¶åã¾ãŸã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’付ã‘ã¦ã€ã‚¹ãƒŠãƒƒãƒ—ショットをé€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ErrorProcessingSnapshot"> - スナップショット・データã®å‡¦ç†ã‚¨ãƒ©ãƒ¼ - </notification> - <notification name="ErrorEncodingSnapshot"> - スナップショットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰åŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸï¼ - </notification> - <notification name="ErrorUploadingPostcard"> - 次ã®ç†ç”±ã§ã€ã‚¹ãƒŠãƒƒãƒ—ショットã®é€ä¿¡æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸï¼š [REASON] - </notification> - <notification name="ErrorUploadingReportScreenshot"> - 次ã®ç†ç”±ã§ã€ãƒ¬ãƒãƒ¼ãƒˆã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON] - </notification> - <notification name="MustAgreeToLogIn"> - [SECOND_LIFE] ã¸ã®ãƒã‚°ã‚¤ãƒ³ã‚’続ã‘ã‚‹ã«ã¯ã€åˆ©ç”¨è¦ç´„ã«åŒæ„ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CouldNotPutOnOutfit"> - æœè£…を装ç€ã§ãã¾ã›ã‚“。 -æœè£…フォルダã«è¡£æœã€èº«ä½“部ä½ã€ä»˜å±žå“ãŒã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="CannotWearTrash"> - ゴミ箱ã«ã‚ã‚‹æœã‚„ボディーパーツã®ç€ç”¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotWearInfoNotComplete"> - ã¾ã èªã¿è¾¼ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ を装ç€ã§ãã¾ã›ã‚“。後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 - </notification> - <notification name="MustHaveAccountToLogIn"> - ãŠã£ã¨! 記入æ¼ã‚ŒãŒã‚ã‚Šã¾ã™ã‚ˆã€‚ -ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ã‚¡ãƒ¼ã‚¹ãƒˆãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ ã®ä¸¡æ–¹ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - -[SECOND_LIFE]ã«å…¥ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚ アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚‚ã†ä¸€åº¦è©¦ã™" yestext="æ–°ã—ã„アカウントを作æˆ"/> - </notification> - <notification name="AddClassified"> - 検索ディレクトリã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ã€ -クラシファイド広告ãŒ1週間掲載ã•ã‚Œã¾ã™ã€‚ -広告を記入後ã€ã€Œå…¬é–‹ã€ã‚’クリックã—ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã« -è¿½åŠ ã—ã¾ã™ã€‚ -「公開ã€ã‚’クリックã™ã‚‹ã¨ã€æ”¯æ‰•é‡‘é¡ã‚’å°‹ãられã¾ã™ã€‚ -多ã払ã†ã»ã©ã€åºƒå‘ŠãŒã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰ãƒ»ãƒªã‚¹ãƒˆã¨ã‚ーワード検索 -ã®ä¸Šä½ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ - <usetemplate ignoretext="æ–°ã—ã„ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã‚’åŠ ãˆã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="DeleteClassified"> - クラシファイド広告[NAME]ã®å‰Šé™¤ã‚’ã—ã¾ã™ã‹ï¼Ÿ -支払ã„済ã¿ã®æ–™é‡‘ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。 - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ClassifiedSave"> - クラシファイド広告[NAME]ã¸ã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> - </notification> - <notification name="DeleteAvatarPick"> - ピック[PICK]を削除ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="PromptGoToEventsPage"> - [SECOND_LIFE]イベント・ウェブ・ページã«ç§»å‹•ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="SelectProposalToView"> - 表示ã™ã‚‹æ案をé¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="SelectHistoryItemToView"> - 表示ã™ã‚‹å±¥æ´ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="ResetShowNextTimeDialogs"> - ã“れらã®ãƒãƒƒãƒ—アップ全ã¦ã‚’å†åº¦æœ‰åŠ¹åŒ–ã—ã¾ã™ã‹ï¼Ÿï¼ˆä»¥å‰ã€Œä»Šå¾Œã¯è¡¨ç¤ºã—ãªã„ã€ã¨æŒ‡å®šã—ã¦ã„ã¾ã™ï¼‰ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="SkipShowNextTimeDialogs"> - スã‚ップå¯èƒ½ãªãƒãƒƒãƒ—アップ全ã¦ã‚’無効化ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="CacheWillClear"> - [APP_NAME]ã®å†èµ·å‹•å¾Œã«ã‚ャッシュãŒã‚¯ãƒªã‚¢ã•ã‚Œã¾ã™ã€‚ - </notification> - <notification name="CacheWillBeMoved"> - [APP_NAME]ã®å†èµ·å‹•å¾Œã«ã‚ャッシュãŒç§»å‹•ã•ã‚Œã¾ã™ã€‚ -注æ„:ã“ã‚Œã«ã‚ˆã‚Šã‚ャッシュãŒã‚¯ãƒªã‚¢ã•ã‚Œã¾ã™ã€‚ - </notification> - <notification name="ChangeConnectionPort"> - ãƒãƒ¼ãƒˆã®è¨å®šã¯ã€[APP_NAME]ã®å†èµ·å‹•å¾Œã«æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ - </notification> - <notification name="ChangeSkin"> - æ–°ã—ã„スã‚ンã¯[APP_NAME]ã‚’å†èµ·å‹•ã™ã‚‹ã¨ç¾ã‚Œã¾ã™ - </notification> - <notification name="GoToAuctionPage"> - [SECOND_LIFE]ウェブ・ページã«ç§»å‹•ã—〠入æœã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="SaveChanges"> - 変更をä¿å˜ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> - </notification> - <notification name="GestureSaveFailedTooManySteps"> - ジェスãƒãƒ£ãƒ¼ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ -ステップãŒå¤šã™ãŽã¾ã™ã€‚ -ステップをã„ãã¤ã‹å‰Šé™¤ã—ã¦ã‹ã‚‰å†ä¿å˜ã—ã¦ãã ã•ã„ - </notification> - <notification name="GestureSaveFailedTryAgain"> - ジェスãƒãƒ£ãƒ¼ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚å°‘ã—å¾…ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="GestureSaveFailedObjectNotFound"> - ジェスãƒãƒ£ãƒ¼ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトæŒã¡ç‰©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 -オブジェクトãŒç¯„囲内ã«å˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ - </notification> - <notification name="GestureSaveFailedReason"> - 次ã®ç†ç”±ã§ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã®ä¿å˜æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="SaveNotecardFailObjectNotFound"> - ノートカードã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトæŒã¡ç‰©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 -オブジェクトãŒç¯„囲内ã«å˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ - </notification> - <notification name="SaveNotecardFailReason"> - 次ã®ç†ç”±ã§ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ä¿å˜æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="ScriptCannotUndo"> - ã‚ãªãŸã®ã‚¹ã‚¯ãƒªãƒ—トã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€å¤‰æ›´ã‚’å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -サーãƒãƒ¼ã®æœ€æ–°ä¿å˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ -(**è¦å‘Š**:ã“ã®æ“作後元ã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“) - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="SaveScriptFailReason"> - 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—トã®ä¿å˜ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="SaveScriptFailObjectNotFound"> - スクリプトã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚スクリプトãŒå…¥ã£ãŸã‚ªãƒ–ジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 -オブジェクトã¯ç¯„囲外ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•ã‚Œã¦ã„ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 - </notification> - <notification name="SaveBytecodeFailReason"> - 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ä¿å˜æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CouldNotStartStopScript"> - スクリプトã®èµ·å‹•ã¾ãŸã¯åœæ¢ã«å¤±æ•—ã—ã¾ã—ãŸã€‚スクリプトãŒæ ¼ç´ã•ã‚Œã¦ã„るオブジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 -オブジェクトãŒç¯„囲内ã«å˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ - </notification> - <notification name="CannotDownloadFile"> - ファイルをダウンãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotWriteFile"> - ファイル[[FILE]]を書ãè¾¼ã‚ã¾ã›ã‚“。 - </notification> - <notification name="UnsupportedHardware"> - è¦å‘Šï¼š ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ 㯠[APP_NAME] を使用ã™ã‚‹ãŸã‚ã«å¿…è¦ãªå¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 -[APP_NAME] ã‚’ã“ã®ã¾ã¾ã”使用ã«ãªã‚‹ã¨ã€ä¸å分ãªãƒ‘フォーマンスã—ã‹å¾—られãªã„ãŠãã‚ŒãŒã‚ã‚Šã¾ã™ã€‚ -ã¾ãŸã€ã‚µãƒãƒ¼ãƒˆå¤–ã®ã‚·ã‚¹ãƒ†ãƒ 構æˆã§ã”使用ã®å ´åˆã€ãƒ†ã‚¯ãƒ‹ã‚«ãƒ«ã‚µãƒãƒ¼ãƒˆã‚’ã”利用ã„ãŸã ãã“ã¨ãŒã§ãã¾ã›ã‚“。 - - å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ -[_URL] ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€ã•ã‚‰ã«è©³ã—ã„æƒ…å ±ã‚’ã”覧ã«ãªã‚Šã¾ã™ã‹ï¼Ÿ - <url name="url" option="0"> - http://secondlife.com/support/sysreqs.php?lang=ja - </url> - <usetemplate ignoretext="サãƒãƒ¼ãƒˆå¤–ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®æ¤œå‡ºæ™‚" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="UnknownGPU"> - ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€ç¾æ™‚点ã§ã¯ä¸æ˜Žãªã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚«ãƒ¼ãƒ‰ãŒæ載ã•ã‚Œã¦ã„ã¾ã™ã€‚ -ã“ã‚Œã¯ã€å½“社ã«ã‚ˆã‚‹å‹•ä½œãƒ†ã‚¹ãƒˆãŒè¡Œã‚ã‚Œã¦ã„ãªã„æ–°ã—ã„ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹å ´åˆãŒã»ã¨ã‚“ã©ã§ã™ã€‚ -[APP_NAME] ã¯ã»ã¼é–“é•ã„ãªãæ£å¸¸ã«å‹•ä½œã—ã¾ã™ãŒã€ -å¿…è¦ã«å¿œã˜ãŸã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯è¨å®šã®èª¿æ•´ãŒå¿…è¦ã«ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ -(「編集ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œè¡¨ç¤ºã€ï¼‰ - <form name="form"> - <ignore name="ignore" text="ä¸æ˜Žãªã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚«ãƒ¼ãƒ‰ã®æ¤œå‡ºæ™‚"/> - </form> - </notification> - <notification name="DisplaySettingsNoShaders"> - [APP_NAME] ã¯ã€ -グラフィック・ドライãƒã®åˆæœŸåŒ–ä¸ã«ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ã¾ã—ãŸã€‚ -一般的ãªãƒ‰ãƒ©ã‚¤ãƒãƒ»ã‚¨ãƒ©ãƒ¼ã‚’回é¿ã™ã‚‹ãŸã‚ã€ã€Œå“質ãŠã‚ˆã³ãƒ‘フォーマンスã€ã¯ã€Œä½Žã€ã«è¨å®šã•ã‚Œã¾ã™ã€‚ -ã“ã‚Œã«ã‚ˆã‚Šã€ã„ãã¤ã‹ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚¹æ©Ÿèƒ½ã¯ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚ -グラフィックカード・ドライãƒã®ã‚¢ãƒƒãƒ—デートをãŠå‹§ã‚ã—ã¾ã™ã€‚ -「グラフィックã®å“質ã€ã¯ã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œè¡¨ç¤ºã€ã‹ã‚‰ä¸Šã’ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - </notification> - <notification name="RegionNoTerraforming"> - ã“ã®åœ°åŸŸ[REGION] ã¯ã€ãƒ†ãƒ©ãƒ•ã‚©ãƒ¼ãƒŸãƒ³ã‚°ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotCopyWarning"> - ã‚ãªãŸã¯ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーを -許ã•ã‚Œã¦ã„ãªã„ã®ã§ã€äººã«ã‚ã’る㨠-æŒã¡ç‰©ã‹ã‚‰å¤±ã‚ã‚Œã¾ã™ã€‚ 本当㫠-ã“れをã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="CannotGiveItem"> - æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ を渡ã›ã¾ã›ã‚“。 - </notification> - <notification name="TransactionCancelled"> - å–引ãŒã‚ャンセルã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="TooManyItems"> - 一度ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªäº¤æ›ã§ã€42以上ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯é€ã‚Œã¾ã›ã‚“。 - </notification> - <notification name="NoItems"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’è²æ¸¡ã§ãる権é™ãŒã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="CannotCopyCountItems"> - ã‚ãªãŸã¯é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®[COUNT]ã®ã‚³ãƒ”ーを -許ã•ã‚Œã¦ã„ã¾ã›ã‚“。 -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰å¤±ã‚ã‚Œã¾ã™ã€‚ -本当ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="CannotGiveCategory"> - é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€ã‚’è²æ¸¡ã§ãる権é™ãŒã‚ã‚Šã¾ã›ã‚“ - </notification> - <notification name="FreezeAvatar"> - ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ -ã‚¢ãƒã‚¿ãƒ¼ã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ -ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–ç•Œã«å¯¾ã™ã‚‹é–¢ã‚ã‚Šã‚’æŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="解å‡" yestext="フリーズ"/> - </notification> - <notification name="FreezeAvatarFullname"> - [AVATAR_NAME]をフリーズã—ã¾ã™ã‹ï¼Ÿ -フリーズã•ã‚ŒãŸäººã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–ç•Œã«å¯¾ã™ã‚‹é–¢ã‚ã‚Šã‚’æŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="解å‡" yestext="フリーズ"/> - </notification> - <notification name="EjectAvatarFullname"> - ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰[AVATAR_NAME]を追放ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="追放ã¨ç¦æ¢" yestext="追放"/> - </notification> - <notification name="EjectAvatarNoBan"> - ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰è¿½æ”¾ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="追放"/> - </notification> - <notification name="EjectAvatarFullnameNoBan"> - [AVATAR_NAME] ã‚’ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰è¿½æ”¾ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="追放"/> - </notification> - <notification name="AcquireErrorTooManyObjects"> - å–得エラー:é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®æ•°ãŒå¤šã™ãŽã¾ã™ã€‚ - </notification> - <notification name="AcquireErrorObjectSpan"> - å–得エラー: -オブジェクトãŒè¤‡æ•°ã®åœ°åŸŸã«ã¾ãŸãŒã£ã¦å˜åœ¨ã—ã¦ã„ã¾ã™ã€‚ -å–å¾—ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ -ã™ã¹ã¦åŒã˜åœ°åŸŸå†…ã«ç§»å‹•ã•ã›ã¦ãã ã•ã„。 - </notification> - <notification name="PromptGoToCurrencyPage"> - [EXTRA] - -[_URL]ã«ç§»å‹•ã—ã¦è²¨å¹£è³¼å…¥ã«é–¢ã™ã‚‹æƒ…å ±ã‚’ç¢ºèªã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="UnableToLinkObjects"> - ã“れらã®[COUNT]オブジェクトをリンクã§ãã¾ã›ã‚“。 -最大[MAX]オブジェクトをリンクã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - </notification> - <notification name="CannotLinkIncompleteSet"> - セットã¨ã—ã¦æƒã£ã¦ã„るオブジェクトã®ã¿ãƒªãƒ³ã‚¯ã§ãã¾ã™ã€‚複数㮠-オブジェクトをé¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotLinkModify"> - ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ä¿®æ£è¨±å¯ãŒã‚ãªãŸã«ãªã„ãŸã‚〠-リンクã§ãã¾ã›ã‚“。 - -オブジェクトãŒã™ã¹ã¦ãƒãƒƒã‚¯ã•ã‚Œã¦ãŠã‚‰ãšã€ã‚ãªãŸã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotLinkDifferentOwners"> - 所有者ãŒç•°ãªã‚‹ãŸã‚ã€ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを -リンクã§ãã¾ã›ã‚“。 - -自分ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトã ã‘ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="NoFileExtension"> - ファイル「[FILE]ã€ã®æ‹¡å¼µåãŒç„¡åŠ¹ã§ã™ã€‚ - -ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µåãŒæ£ã—ã„ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„。 - </notification> - <notification name="InvalidFileExtension"> - ファイル拡張å[EXTENSION]ã¯ç„¡åŠ¹ã§ã™ -æ£ã—ã„æ‹¡å¼µå:[VALIDS] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotUploadSoundFile"> - èªã¿è¾¼ã¿ã®ãŸã‚ã«ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•ã‚ŒãŸã‚µã‚¦ãƒ³ãƒ‰ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã‘ã¾ã›ã‚“: -[FILE] - </notification> - <notification name="SoundFileNotRIFF"> - ファイルãŒRIFF WAVEファイルã¨ã—ã¦èªè˜ã•ã‚Œã¾ã›ã‚“: -[FILE] - </notification> - <notification name="SoundFileNotPCM"> - ファイルãŒPCM WAVEオーディオ・ファイルã¨ã—ã¦èªè˜ã•ã‚Œã¾ã›ã‚“: -[FILE] - </notification> - <notification name="SoundFileInvalidChannelCount"> - ファイルã®ãƒãƒ£ãƒ³ãƒãƒ«æ•°ãŒç„¡åŠ¹ã§ã™ï¼ˆãƒ¢ãƒŽãƒ©ãƒ«ã¾ãŸã¯ã‚¹ãƒ†ãƒ¬ã‚ªã‚’使用ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼‰ï¼š -[FILE] - </notification> - <notification name="SoundFileInvalidSampleRate"> - ファイルã®ã‚µãƒ³ãƒ—ル・レートãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ44.1kを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼‰ï¼š -[FILE] - </notification> - <notification name="SoundFileInvalidWordSize"> - ファイルã®ãƒ¯ãƒ¼ãƒ‰ãƒ»ã‚µã‚¤ã‚ºãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ8ã¾ãŸã¯16ビットを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼‰ï¼š -[FILE] - </notification> - <notification name="SoundFileInvalidHeader"> - WAVヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒ»ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: -[FILE] - </notification> - <notification name="SoundFileInvalidTooLong"> - オーディオ・ファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大10秒): -[FILE] - </notification> - <notification name="ProblemWithFile"> - ファイル[FILE]ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã™ã€‚ - -[ERROR] - </notification> - <notification name="CannotOpenTemporarySoundFile"> - 書ãè¾¼ã¿ç”¨ã®ä¸€æ™‚圧縮サウンド・ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“:[FILE] - </notification> - <notification name="UnknownVorbisEncodeFailure"> - 未知ã®Vorbis æš—å·åŒ–ã«å¤±æ•—: [FILE] - </notification> - <notification name="CannotEncodeFile"> - 次ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“: [FILE] - </notification> - <notification name="CorruptResourceFile"> - ç ´æã—ãŸãƒªã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ï¼š [FILE] - </notification> - <notification name="UnknownResourceFileVersion"> - 未知ã®lindenリソースファイルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [FILE] - </notification> - <notification name="UnableToCreateOutputFile"> - æœè£…ファイルを作æˆã§ãã¾ã›ã‚“: [FILE] - </notification> - <notification name="DoNotSupportBulkAnimationUpload"> - アニメーションファイルã®ãƒãƒ«ã‚¯ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã¯ç¾åœ¨ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotUploadReason"> - 次ã®ç†ç”±ã§ã€[FILE] をアップãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“: [REASON] -ã‚ã¨ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotCreateLandmarkNotOwner"> - 土地ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚〠-ランドマークを作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotRecompileSelectObjectsNoScripts"> - å†ç·¨é›†ã¯ä¸å¯èƒ½ã§ã™ã€‚ -スクリプト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotRecompileSelectObjectsNoPermission"> - 「å†ç·¨é›†ã€ã¯ä¸å¯èƒ½ã§ã™ã€‚ - -変更修æ£æ¨©é™ã®ã‚ã‚‹ -スクリプト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotResetSelectObjectsNoScripts"> - 「å†è¨å®šã€ã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã›ã‚“。 - -スクリプト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotResetSelectObjectsNoPermission"> - 「å†è¨å®šã€ã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã›ã‚“。 - -変更修æ£æ¨©é™ã®ã‚ã‚‹ -スクリプト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotSetRunningSelectObjectsNoScripts"> - スクリプトã®ã€Œå®Ÿè¡Œã€ã®è¨å®šãŒã§ãã¾ã›ã‚“。 - -スクリプト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotSetRunningNotSelectObjectsNoScripts"> - スクリプトを「実行ã—ãªã„ã€ã«è¨å®šã§ãã¾ã›ã‚“。 - -スクリプト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="NoFrontmostFloater"> - ä¿å˜ã™ã¹ãfrontmostフãƒãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="SeachFilteredOnShortWords"> - 指定ã—ãŸæ¤œç´¢ã‚¯ã‚¨ãƒªã¯å¤‰æ›´ã•ã‚Œã€çŸã™ãŽã‚‹èªžå¥ã¯å–り除ã‹ã‚Œã¦ã„ã¾ã™ã€‚ - -検索語å¥ï¼š [FINALQUERY] - </notification> - <notification name="SeachFilteredOnShortWordsEmpty"> - 指定ã—ãŸæ¤œç´¢èªžå¥ãŒçŸã™ãŽãŸãŸã‚ã€æ¤œç´¢ã¯è¡Œã‚ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="CouldNotTeleportReason"> - テレãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ -[REASON] - </notification> - <notification name="invalid_tport"> - テレãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®å‡¦ç†ä¸ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚テレãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ -ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¼•ã続ã表示ã•ã‚Œã‚‹å ´åˆã¯ã€æŠ€è¡“サãƒãƒ¼ãƒˆFAQ(www.secondlife.com/support)をå‚ç…§ã—ã¦ãã ã•ã„。 - </notification> - <notification name="invalid_region_handoff"> - 地域間ã®ç§»å‹•ã®å‡¦ç†ä¸ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚地域間を移動ã™ã‚‹ã«ã¯ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ -ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¼•ã続ã表示ã•ã‚Œã‚‹å ´åˆã¯ã€æŠ€è¡“サãƒãƒ¼ãƒˆFAQ(www.secondlife.com/support)をå‚ç…§ã—ã¦ãã ã•ã„。 - </notification> - <notification name="blocked_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 -ã‚„ã‚Šç›´ã—ã¦ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦å•é¡Œã‚’解決ã—ã¦ãã ã•ã„。 - </notification> - <notification name="nolandmark_tport"> - 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="timeout_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -ã‚‚ã†å°‘ã—後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 - </notification> - <notification name="noaccess_tport"> - 残念ãªãŒã‚‰ã€ãã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="missing_attach_tport"> - 添付物ã¯ã€ã¾ã 到ç€ã—ã¦ã„ã¾ã›ã‚“。ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’ã‚„ã‚Šç›´ã—ã¦ã ã•ã„。 - </notification> - <notification name="too_many_uploads_tport"> - ã“ã®åœ°åŸŸã®è³‡ç”£ã‚ューãŒç¾åœ¨è¾¼ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間通りã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚ -数分後ã«ã‚„ã‚Šç›´ã™ã‹ã€ã¾ãŸã¯æ··é›‘ã—ã¦ã„ãªã„ä»–ã®åœ°åŸŸã‚’ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="expired_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 - </notification> - <notification name="expired_region_handoff"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯åœ°åŸŸé–“ã®ç§»å‹•ã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 - </notification> - <notification name="no_host"> - テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã¾ãŸã¯ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 - </notification> - <notification name="no_inventory_host"> - æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotSetLandOwnerNothingSelected"> - 土地所有者è¨å®šãŒã§ãã¾ã›ã‚“: -区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotSetLandOwnerMultipleRegions"> - 複数ã®åœ°åŸŸãŒé¸æŠžã•ã‚ŒãŸãŸã‚〠-土地ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã§ãã¾ã›ã‚“。 -é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="ForceOwnerAuctionWarning"> - ã“ã®åŒºç”»ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‡ºå“ã•ã‚Œã¦ã„ã¾ã™ã€‚ -区画ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã™ã‚‹ã¨ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ãŒç„¡åŠ¹ã«ãªã‚Šã€ -å…¥æœãŒé–‹å§‹ã—ã¦ã„ãŸã‚‰ä¸æº€ã«æ€ã†ä½äººãŒå‡ºã¦ãã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 -所有権をå–å¾—ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="CannotContentifyNothingSelected"> - コンテンツ化ã¯ä¸å¯èƒ½ã§ã™ï¼š -区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotContentifyNoRegion"> - コンテンツ化ã¯ä¸å¯èƒ½ã§ã™ï¼š -土地ãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotReleaseLandNothingSelected"> - åœŸåœ°ã‚’ç ´æ£„ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: -区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotReleaseLandNoRegion"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="CannotBuyLandNothingSelected"> - 土地を購入ã§ãã¾ã›ã‚“: -区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotBuyLandNoRegion"> - 土地を購入ã§ãã¾ã›ã‚“: -ã“ã®åœŸåœ°ãŒã‚る地域を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ - </notification> - <notification name="CannotCloseFloaterBuyLand"> - [APP_NAME]ã«ã‚ˆã‚‹ã€ -ã“ã®å–引ã®è¦‹ç©ã‚ŠãŒå®Œäº†ã™ã‚‹ã¾ã§ã€ŒåœŸåœ°ã‚’購入ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotDeedLandNothingSelected"> - 土地をè²æ¸¡ã§ãã¾ã›ã‚“: -区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotDeedLandNoGroup"> - 土地をè²æ¸¡ã§ãã¾ã›ã‚“: -グループãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotDeedLandNoRegion"> - 土地をè²æ¸¡ã§ãã¾ã›ã‚“: -ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="CannotDeedLandMultipleSelected"> - 土地をè²æ¸¡ã§ãã¾ã›ã‚“: -複数ã®åŒºç”»ãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã™ã€‚ - -ã“れより1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="ParcelCanPlayMedia"> - ã“ã“ã§ã¯ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ»ãƒ¡ãƒ‡ã‚£ã‚¢å†ç”ŸãŒå¯èƒ½ã§ã™ã€‚ -メディアã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã«ã¯ã€é«˜é€Ÿãªã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šç’°å¢ƒãŒå¿…è¦ã§ã™ã€‚ - -利用å¯èƒ½ã«ãªã£ãŸã‚‰å†ç”Ÿã—ã¾ã™ã‹ï¼Ÿ -(ã“ã®ã‚ªãƒ—ションã¯ã€ã€Œç’°å¢ƒè¨å®šã€ï¼žã€ŒéŸ³å£°ã¨ãƒ“デオã€ã§å¾Œã‹ã‚‰ã§ã‚‚変更ã§ãã¾ã™ï¼‰ - <usetemplate name="okcancelbuttons" notext="無効化" yestext="メディアをå†ç”Ÿ"/> - </notification> - <notification name="CannotDeedLandWaitingForServer"> - 土地をè²æ¸¡ã§ãã¾ã›ã‚“: -サーãƒãƒ¼ã‹ã‚‰ã®æ‰€æœ‰æ¨©æƒ…å ±ã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚ - -å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。 - </notification> - <notification name="CannotDeedLandNoTransfer"> - 土地をè²æ¸¡ã§ãã¾ã›ã‚“: -ã“ã®åœ°åŸŸ [REGION] ã§ã¯åœŸåœ°ã®è²æ¸¡ãŒè¨±ã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotReleaseLandWatingForServer"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -サーãƒãƒ¼ãŒåŒºç”»æƒ…å ±ã‚’æ›´æ–°ã™ã‚‹ã®ã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚ - -ã‚‚ã†å°‘ã—後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotReleaseLandSelected"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -ã‚ãªãŸã¯ã€é¸æŠžã—ãŸã™ã¹ã¦ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã›ã‚“。 - -1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotReleaseLandDontOwn"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -ã‚ãªãŸã¯ã“ã®åœŸåœ°ã‚’手放ã™ã“ã¨ã‚’許å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。 -ã‚ãªãŸã®åŒºç”»ã¯ç·‘色ã§è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="CannotReleaseLandRegionNotFound"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="CannotReleaseLandNoTransfer"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -ã“ã® [REGION] ã§ã¯åœŸåœ°ã®è²æ¸¡ãŒè¨±ã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotReleaseLandPartialSelection"> - åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: -区画全体をé¸æŠžã—ã¦ç ´æ£„ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - -区画全体をé¸æŠžã™ã‚‹ã‹ã€ã¾ãŸã¯ã€ã¾ãšæœ€åˆã«åŒºç”»ã‚’分割ã—ã¦ãã ã•ã„。 - </notification> - <notification name="ReleaseLandWarning"> - ã‚ãªãŸã¯ã€[AREA]平方メートルã®åœŸåœ°ã‚’ç ´æ£„ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -ã“ã®åŒºç”»ã‚’ç ´æ£„ã™ã‚‹ã¨ã‚ãªãŸã®åœŸåœ°ã§ã¯ãªããªã‚Šã¾ã™ãŒã€ -L$ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。 - -åœŸåœ°ã‚’ç ´æ£„ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNothingSelected"> - 土地を分割ã§ãã¾ã›ã‚“: - -区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotDivideLandPartialSelection"> - 土地を分割ã§ãã¾ã›ã‚“: - -区画全体ãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã™ã€‚ -区画ã®ä¸€éƒ¨ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="LandDivideWarning"> - ã“ã®åœŸåœ°ã‚’分割ã™ã‚‹ã¨ã€2ã¤ã®åŒºç”»ã«åˆ¥ã‚Œã¾ã™ã€‚ -区画ã”ã¨ã®è¨å®šãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ ã“ã®æ“作を行ã†ã¨ã€ä¸€éƒ¨ã®è¨å®šãŒãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã«ãƒªã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚ - -土地ã®åˆ†å‰²æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="CannotDivideLandNoRegion"> - 土地を分割ã§ãã¾ã›ã‚“: -ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="CannotJoinLandNoRegion"> - 土地を統åˆã§ãã¾ã›ã‚“: -ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="CannotJoinLandNothingSelected"> - 土地を統åˆã§ãã¾ã›ã‚“ã§ã—ãŸï¼š -区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </notification> - <notification name="CannotJoinLandEntireParcelSelected"> - 土地を統åˆã§ãã¾ã›ã‚“: -1ã¤ã®åŒºç”»ã—ã‹é¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“。 - -両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotJoinLandSelection"> - 土地を統åˆã§ãã¾ã›ã‚“: -1ã¤ä»¥ä¸Šã®åŒºç”»ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - -両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="JoinLandWarning"> - ã“ã®åœŸåœ°ã‚’çµ±åˆã™ã‚‹ã¨ã€é¸æŠžã•ã‚ŒãŸé•·æ–¹å½¢ã«äº¤å·®ã™ã‚‹ -å…¨ã¦ã®åŒºç”»ã‚’基ã«ã—ã¦1ã¤ã®å¤§ããªåŒºç”»ãŒä½œæˆã•ã‚Œã¾ã™ã€‚ -æ–°ã—ã„区画ã®åå‰ã¨ã‚ªãƒ—ションをå†è¨å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - -土地を統åˆã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ShowOwnersHelp"> - オーナーを表示: -区画ã«è‰²ã‚’付ã‘ã¦ã‚ªãƒ¼ãƒŠãƒ¼ã®ç¨®é¡žã‚’表示 - -ç·‘ = ã‚ãªãŸã®åœŸåœ° -アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 -赤 = 他人ãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° -黄色 = 売り出ã—ä¸ -ç´« = オークション -グレー = パブリック - </notification> - <notification name="ConfirmNotecardSave"> - ã“ã®ã‚¢ã‚¤ãƒ†ãƒ をコピーã€è¡¨ç¤ºã™ã‚‹å‰ã«ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ä¿å˜ãŒå¿…è¦ã§ã™ã€‚ ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ConfirmItemCopy"> - ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="コピー"/> - </notification> - <notification name="ResolutionSwitchFail"> - 解åƒåº¦ã‚’ [RESX]x[RESY]ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="ErrorUndefinedGrasses"> - エラー:未定義ã®æ¤ç‰©ï¼š[SPECIES] - </notification> - <notification name="ErrorUndefinedTrees"> - エラー:未定義ã®æ¨¹æœ¨ï¼š[SPECIES] - </notification> - <notification name="CannotSaveWearableOutOfSpace"> - 「[NAME]ã€ã‚’æœã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ä¿å˜ã§ãã¾ã›ã‚“。 コンピューター㮠-ディスクスペースを少ã—増やã—ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦ -ä¿å˜ã—ã¦ã¿ã¦ãã ã•ã„。 - </notification> - <notification name="CannotSaveToAssetStore"> - [NAME]ã‚’ä¸å¤®è³‡ç”£æ ¼ç´åº«ã«ä¿å˜ã§ãã¾ã›ã‚“。 -ã“ã‚Œã¯ä¸€æ™‚çš„ãªä¸å…·åˆã§ã™ã€‚ -æœé£¾å“ãªã©ã‚’カスタマイズã—ã€æ•°åˆ†å¾Œã«ã‚‚ã†ä¸€åº¦ä¿å˜ã—ã¦ãã ã•ã„。 - </notification> - <notification name="YouHaveBeenLoggedOut"> - ã‚ãªãŸã¯[SECOND_LIFE]ã‹ã‚‰ãƒã‚°ã‚¢ã‚¦ãƒˆã•ã‚Œã¾ã—ãŸã€‚ - [MESSAGE] -「IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示ã€ã‚’クリックã™ã‚‹ã¨ã€ -ç¾åœ¨ã‚ã‚‹IMã¨ãƒãƒ£ãƒƒãƒˆã‚’確èªã§ãã¾ã™ã€‚ -確èªã—ãªã„å ´åˆã¯ã€Œçµ‚了ã€ã‚’クリックã—〠-ã™ãã«[APP_NAME]を終了ã—ã¦ãã ã•ã„。 - <usetemplate name="okcancelbuttons" notext="終了" yestext="IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示"/> - </notification> - <notification name="OnlyOfficerCanBuyLand"> - グループ用ã®åœŸåœ°ã®è³¼å…¥ãŒã§ãã¾ã›ã‚“: -ã‚ãªãŸã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—ã®ãŸã‚ã«åœŸåœ°ã‚’購入ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="AddFriend"> - フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - -[NAME] ã«ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚·ãƒƒãƒ—ã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="AddFriendWithMessage"> - フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - -[NAME] ã«ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚·ãƒƒãƒ—ã®ã‚ªãƒ•ã‚¡ãƒ¼ã‚’ã—ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - フレンドã¨ã—ã¦ç™»éŒ²ã—ã¦ãã‚Œã¾ã™ã‹ï¼Ÿ - </input> - <button name="Offer" text="OK"/> - <button name="Cancel" text="ã‚ャンセル"/> - </form> - </notification> - <notification name="RemoveFromFriends"> - [FIRST_NAME] [LAST_NAME]をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="RemoveMultipleFromFriends"> - フレンドリストã‹ã‚‰è¤‡æ•°ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="GodDeleteAllScriptedPublicObjectsByUser"> - **[AVATAR_NAME]** -所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã“ã®ã‚·ãƒ 内ã®ä»–ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="GodDeleteAllScriptedObjectsByUser"> - **[AVATAR_NAME]** -所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã“ã®ã‚·ãƒ 内ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="GodDeleteAllObjectsByUser"> - **[AVATAR_NAME]** -所有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクト(スクリプト・オブジェクトã¨éžã‚¹ã‚¯ãƒªãƒ—ト・オブジェクト)を -ã“ã®ã‚·ãƒ 内ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BlankClassifiedName"> - クラシファイドã«åå‰ã‚’指定ã—ã¦ãã ã•ã„。 - </notification> - <notification name="MinClassifiedPrice"> - 広告料ã®æ”¯æ‰•ã„金é¡ã¯ã€Lã¨[MIN_PRICE]ãŒä¸‹é™ã§ã™ã€‚ - -金é¡ã‚’増やã—ã¦ãã ã•ã„。 - </notification> - <notification name="ConfirmObjectDeleteLock"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopy"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoOwn"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸Šã‚’ã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopy"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ -一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoOwn"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ -1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ -一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 - -本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLock"> - 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ - -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–得を続ã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeNoOwn"> - å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ -ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•ã‚Œã¾ã™ã€‚ -ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ - -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–得を続ã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmObjectTakeLockNoOwn"> - 1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ -å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ -ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•ã‚Œã¾ã™ã€‚ -ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ -ã“ã®é¸æŠžå†…容ã®ã¾ã¾ã§ç¶šè¡Œã™ã‚‹ã“ã¨ã¯å¯èƒ½ã§ã™ãŒã€ - -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–得を続ã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="CantBuyLandAcrossMultipleRegions"> - 複数ã®åœ°åŸŸãŒé¸æŠžã•ã‚ŒãŸãŸã‚ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“。 - -é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="DeedLandToGroup"> - ã“ã®åŒºç”»ã®è²æ¸¡ã«éš›ã—ã¦ã¯ã€ -ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚ -土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•ã‚Œã¾ã›ã‚“。è²æ¸¡ã•ã‚ŒãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²ä¾¡æ ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç‰ã«åˆ†é…ã•ã‚Œã¾ã™ã€‚ - -ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ— -「[GROUP_NAME]ã€ã«è²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="DeedLandToGroupWithContribution"> - ã“ã®åŒºç”»ã®è²æ¸¡ã«éš›ã—ã¦ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—㌠-å分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚ -ã“ã®è²æ¸¡ã«ã‚ˆã‚Šã€ -「[FIRST_NAME] [LAST_NAME]ã€ã‹ã‚‰ -グループã«å¯¾ã—ã¦åœŸåœ°ãŒåŒæ™‚ã«æä¾›ã•ã‚Œã¾ã™ã€‚ -土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•ã‚Œã¾ã›ã‚“。 -è²æ¸¡ã•ã‚ŒãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²æ–™é‡‘ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç‰ã«åˆ†é…ã•ã‚Œã¾ã™ã€‚ - -ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ—「[GROUP_NAME]ã€ã«è²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="DisplaySetToSafe"> - -safeオプションを指定ã—ãŸã®ã§ã€ -表示è¨å®šã¯ã‚»ãƒ¼ãƒ•ãƒ»ãƒ¬ãƒ™ãƒ«ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="DisplaySetToRecommended"> - 表示è¨å®šã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ 構æˆã« -基ã¥ã„ã¦æŽ¨å¥¨ã•ã‚ŒãŸãƒ¬ãƒ™ãƒ«ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="ErrorMessage"> - [ERROR_MESSAGE] - </notification> - <notification name="AvatarMoved"> - ã‚ãªãŸãŒè¨ªã‚ŒãŸã„[TYPE]ã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¯ç¾åœ¨ã”利用ã§ãã¾ã›ã‚“。 [HELP] -è¿‘ãã®åœ°åŸŸã«ç§»å‹•ã—ã¾ã—ãŸã€‚ - </notification> - <notification name="ClothingLoading"> - ã‚ãªãŸã®æœã‚’ダウンãƒãƒ¼ãƒ‰ä¸ã§ã™ã€‚ -通常ã©ãŠã‚Šã«[SECOND_LIFE]を使ãˆã€ -ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚‚ã‚ãªãŸã‚’æ£å¸¸ã«è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - <form name="form"> - <ignore name="ignore" text="æœã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã«é•·ã„時間ãŒã‹ã‹ã‚‹å ´åˆ"/> - </form> - </notification> - <notification name="FirstRun"> - [APP_NAME]ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå®Œäº†ã—ã¾ã—ãŸã€‚ - -[SECOND_LIFE] ã®ä½¿ç”¨ãŒåˆã‚ã¦ã®æ–¹ã¯ã€ -ãƒã‚°ã‚¤ãƒ³å‰ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆãŒå¿…è¦ã§ã™ã€‚ -www.secondlife.comã«ç§»å‹•ã—ã€æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’è¡Œã„ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="続行" yestext="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..."/> - </notification> - <notification name="LoginPacketNeverReceived"> - 接続ã«å•é¡ŒãŒç”Ÿã˜ã¦ã„ã¾ã™ã€‚ ã‚ãªãŸã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã€ã¾ãŸã¯[SECOND_LIFE] サーãƒãƒ¼ã«å•é¡ŒãŒã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ - -インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã¦æ•°åˆ†å¾Œã«ã‚‚ã†ä¸€åº¦è©¦ã¿ã‚‹ã‹ã€ã€Œãƒ˜ãƒ«ãƒ—ã€ã‚’クリックã—ã¦å½“社ã®ã‚µãƒãƒ¼ãƒˆã‚µã‚¤ãƒˆã«æŽ¥ç¶šã—ã¦ãã ã•ã„。ã¾ãŸã¯ã€ã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¦ã¿ã¦ãã ã•ã„。 - <form name="form"> - <button name="OK" text="OK"/> - <button name="Help" text="ヘルプ"/> - <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> - </form> - </notification> - <notification name="WelcomeChooseSex"> - ã¾ã‚‚ãªãã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ - -矢å°ã‚ーを使用ã—ã¦æ©ãã¾ã™ã€‚ -ヘルプãŒå¿…è¦ãªã¨ãã‚„[SECOND_LIFE]ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€ -F1ã‚ーを押ã—ã¦ãã ã•ã„。 -男性ã‚ã‚‹ã„ã¯å¥³æ€§ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。 -ã‚ãªãŸã®æ±ºå®šã¯å¾Œã§å¤‰æ›´ã§ãã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/> - </notification> - <notification name="NotEnoughCurrency"> - [NAME] L$[PRICE] 残高ä¸è¶³ã®ãŸã‚実行ä¸å¯ã§ã™ã€‚ - </notification> - <notification name="GrantedModifyRights"> - ã‚ãªãŸã«ã¯ã€ -[FIRST_NAME] [LAST_NAME] -ã®ã‚ªãƒ–ジェクトを修æ£ã™ã‚‹æ¨©é™ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="RevokedModifyRights"> - [FIRST_NAME] [LAST_NAME] -ã®ã‚ªãƒ–ジェクトを修æ£ã™ã‚‹æ¨©é™ãŒå–り消ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="FlushMapVisibilityCaches"> - ã“ã®æ‰‹é †ã¯ã€ã“ã®åœ°åŸŸã®åœ°å›³ã®ã‚ャッシュを消去ã—ã¾ã™ã€‚ -ã“ã‚ŒãŒä¾¿åˆ©ãªã®ã¯ãƒ‡ãƒãƒƒã‚°æ™‚ã®ã¿ã§ã™ã€‚ -(作æˆä¸ã¯5分間経ã¤ã¨ã€å…¨å“¡ã®åœ°å›³ãŒå†åº¦ãƒã‚°ã‚¤ãƒ³å¾Œã« -æ›´æ–°ã•ã‚Œã¾ã™ï¼‰ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BuyOneObjectOnly"> - 一度ã«ä¸€ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã¨è²·ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オブジェクトを一ã¤ã ã‘é¸ã‚“ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="OnlyCopyContentsOfSingleItem"> - 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="KickUsersFromRegion"> - ã“ã®åœ°åŸŸã®å…¨ã¦ã®ä½äººã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="EstateObjectReturn"> - [USER_NAME]ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトを返å´ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="InvalidTerrainBitDepth"> - 地域テクスãƒãƒ£ã‚’è¨å®šã§ãã¾ã›ã‚“ã§ã—ãŸï¼š -地形テクスãƒãƒ£[TEXTURE_NUM]ã¯ã€ç„¡åŠ¹ã®ãƒ“ット深度[TEXTURE_BIT_DEPTH]ã§ã™ã€‚ - -テクスãƒãƒ£[TEXTURE_NUM]ã‚’24ビット512x512ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。 - </notification> - <notification name="InvalidTerrainSize"> - 地域テクスãƒãƒ£ã‚’è¨å®šã§ãã¾ã›ã‚“ã§ã—ãŸï¼š -地形テクスãƒãƒ£[TEXTURE_NUM]ã¯ã€[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]ã§ã¯å¤§ãã™ãŽã¾ã™ã€‚ - -テクスãƒãƒ£[TEXTURE_NUM]ã‚’24ビット512x512ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。 - </notification> - <notification name="RawUploadStarted"> - アップãƒãƒ¼ãƒ‰é–‹å§‹ã€‚ 接続速度ã«ã‚ˆã£ã¦ã¯ã€ -最大2分間ã‹ã‹ã‚Šã¾ã™ã€‚ - </notification> - <notification name="ConfirmBakeTerrain"> - ç¾åœ¨ã®åœ°å½¢ã‚’構築ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -ã“ã®æ“作を行ã†ã¨ã€ç¾åœ¨ã®åœ°å½¢ãŒä¸Šæ˜‡ï¼ä¸‹é™ã®åˆ¶é™ç¯„囲ã®ä¸å¿ƒã«ãªã‚Šã€ã€Œå¾©å¸°ã€ãƒ„ールã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã«ãªã‚Šã¾ã™ã€‚ -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="MaxAllowedAgentOnRegion"> - 許å¯ä½äººã¯ [MAX_AGENTS] 人ã¾ã§ã§ã™ã€‚ - </notification> - <notification name="MaxBannedAgentsOnRegion"> - ç¦æ¢ä½äººã¯[MAX_BANNED]人ã¾ã§ã§ã™ã€‚ - </notification> - <notification name="MaxAgentOnRegionBatch"> - [NUM_ADDED] 個ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿½åŠ ã—よã†ã¨ã—ã¦å¤±æ•—ã—ã¾ã—ãŸï¼š [MAX_AGENTS] [LIST_TYPE] 制é™ã‚’ [NUM_EXCESS] 個超éŽã—ã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="MaxAllowedGroupsOnRegion"> - 許å¯ã‚°ãƒ«ãƒ¼ãƒ—ã¯[MAX_GROUPS]グループã¾ã§ã§ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="構築ã™ã‚‹"/> - </notification> - <notification name="MaxManagersOnRegion"> - ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯[MAX_MANAGER]人ã¾ã§ã§ã™ã€‚ - </notification> - <notification name="OwnerCanNotBeDenied"> - ä¸å‹•ç”£ã‚ªãƒ¼ãƒŠãƒ¼ã‚’ä¸å‹•ç”£ã€Œç¦æ¢ä½äººã€ãƒªã‚¹ãƒˆã«è¿½åŠ ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CanNotChangeAppearanceUntilLoaded"> - æœãŠã‚ˆã³å½¢ãŒãƒãƒ¼ãƒ‰ã•ã‚Œã‚‹ã¾ã§ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="ClassifiedMustBeAlphanumeric"> - クラシファイド広告ã®åå‰ã¯ã€ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆã‹ -æ•°å—ã§å§‹ã‚ã¾ã™ã€‚ å¥èªç‚¹ã§ã¯å§‹ã‚られã¾ã›ã‚“。 - </notification> - <notification name="CantSetBuyObject"> - オブジェクトãŒè²©å£²å¯¾è±¡ã§ã¯ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ãŒè¨å®šã§ãã¾ã›ã‚“。 -販売対象ã®ã‚ªãƒ–ジェクトをè¨å®šã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="FinishedRawDownload"> - æœªåŠ å·¥ã®åœ°å½¢ãƒ•ã‚¡ã‚¤ãƒ«ã‚’次ã¸ã¨ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã—ãŸï¼š -[DOWNLOAD_PATH]。 - </notification> - <notification name="DownloadWindowsMandatory"> - [APP_NAME]ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -[APP_NAME]を使用ã™ã‚‹ãŸã‚ã«ã¯ã€ -ã“ã®ã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadWindows"> - [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadWindowsReleaseForDownload"> - [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadMacMandatory"> - [APP_NAME]ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -[APP_NAME]を使用ã™ã‚‹ãŸã‚ã«ã€ -ã“ã®ã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - -アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadMac"> - [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ - -アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DownloadMacReleaseForDownload"> - [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ -[MESSAGE] -ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ - -アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> - </notification> - <notification name="DeedObjectToGroup"> - ã“ã®ã‚ªãƒ–ジェクトをè²æ¸¡ã™ã‚‹ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã¯ä»¥ä¸‹ã®ã“ã¨ãŒå¯èƒ½ã§ã™ï¼š -* オブジェクトã«æ”¯æ‰•ã‚ã‚ŒãŸL$ã‚’å—é ˜ã—ã¾ã™ã€‚ - <usetemplate ignoretext="オブジェクトをグループã«è²æ¸¡ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="è²æ¸¡"/> - </notification> - <notification name="WebLaunchExternalTarget"> - ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã®ã‚¦ã‚§ãƒ–・ブラウザを開ã„ã¦ã€ã“ã®å†…容を表示ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã®ãƒ–ラウザを開ã„ã¦ã‚¦ã‚§ãƒ–・ページを表示ã—よã†ã¨ã—ãŸã¨ã" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="WebLaunchJoinNow"> - www.secondlife.comã«ç§»å‹•ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="アカウントを管ç†ã™ã‚‹ãŸã‚ã€ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="WebLaunchSecurityIssues"> - [SECOND_LIFE] Wikiã§ã€ -ã‚»ã‚ュリティå•é¡Œã‚’å ±å‘Šã™ã‚‹æ–¹æ³•ã‚’ã”覧ãã ã•ã„。 - <usetemplate ignoretext="ã‚»ã‚ュリティå•é¡ŒWikiを閲覧ã™ã‚‹ãŸã‚ã«ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã«ã‚ãŸã£ã¦" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="WebLaunchQAWiki"> - [SECOND_LIFE] å“質ä¿è¨¼é–¢é€£Wikiã‚’ã”覧ãã ã•ã„。 - <usetemplate ignoretext="å“質ä¿è¨¼é–¢é€£Wikiを閲覧ã™ã‚‹ãŸã‚ã«ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã«ã‚ãŸã£ã¦" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="WebLaunchPublicIssue"> - [SECOND_LIFE]ã®ãƒ‘ブリックå•é¡Œãƒˆãƒ©ãƒƒã‚«ãƒ¼ã§ã€ -ãƒã‚°ã‚„ãã®ä»–ã®å•é¡Œã‚’å ±å‘Šã§ãã¾ã™ã€‚ - <usetemplate ignoretext="パブリックå•é¡Œãƒˆãƒ©ãƒƒã‚«ãƒ¼ã‚’閲覧ã™ã‚‹ãŸã‚ã«ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã«ã‚ãŸã£ã¦" name="okcancelignore" notext="ã‚ャンセル" yestext="ページã¸è¡Œã"/> - </notification> - <notification name="WebLaunchPublicIssueHelp"> - [SECOND_LIFE] Wikiã§ã€ -パブリックå•é¡Œãƒˆãƒ©ãƒƒã‚«ãƒ¼ã®ä½¿ç”¨æ–¹æ³•ã‚’ã”覧ãã ã•ã„。 - <usetemplate ignoretext="パブリックå•é¡Œãƒˆãƒ©ãƒƒã‚«ãƒ¼Wikiを閲覧ã™ã‚‹ãŸã‚ã«ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã«ã‚ãŸã£ã¦" name="okcancelignore" notext="ã‚ャンセル" yestext="ページã¸è¡Œã"/> - </notification> - <notification name="WebLaunchSupportWiki"> - Lindenå…¬å¼ãƒ–ãƒã‚°ã§ã€æœ€æ–°ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚„æƒ…å ±ã‚’å…¥æ‰‹ã—ã¦ãã ã•ã„。 - <usetemplate ignoretext="ブãƒã‚°ã‚’表示ã™ã‚‹ãŸã‚ã€ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="WebLaunchLSLGuide"> - スクリプトガイドを開ã„ã¦ã€ã‚¹ã‚¯ãƒªãƒ—トã®ãƒ˜ãƒ«ãƒ—ã‚’å‚ç…§ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="LSLガイドを表示ã™ã‚‹ãŸã‚ã€ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="WebLaunchLSLWiki"> - LSLãƒãƒ¼ã‚¿ãƒ«ã‚’é–‹ã„ã¦ã‚¹ã‚¯ãƒªãƒ—トã®ãƒ˜ãƒ«ãƒ—ã‚’å‚ç…§ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="LSLãƒãƒ¼ã‚¿ãƒ«ã‚’表示ã™ã‚‹ãŸã‚ã«ã€ã‚¦ã‚§ãƒ–・ブラウザを起動ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> - </notification> - <notification name="ReturnToOwner"> - é¸æŠžã—ãŸã‚ªãƒ–ジェクトをã€æ‰€æœ‰è€…ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ -è²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクト㯠-以å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•ã‚Œã¾ã™ã€‚ - -*è¦å‘Š* 移転ãŒä¸å¯èƒ½ã®è²æ¸¡ã•ã‚ŒãŸã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•ã‚Œã¾ã™ï¼ - <usetemplate ignoretext="オブジェクトをæŒã¡ä¸»ã«è¿”å´ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="GroupLeaveConfirmMember"> - ç¾åœ¨ã‚ãªãŸã¯ [GROUP]ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚ -ã“ã“ã‹ã‚‰æŠœã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ConfirmKick"> - ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’グリッド外ã«ã‚ックã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ã‚’追ã„出ã™"/> - </notification> - <notification name="MuteLinden"> - 残念ãªãŒã‚‰Lindenを無視è¨å®šã«å…¥ã‚Œã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CannotStartAuctionAlreadyForSale"> - æ—¢ã«å£²ã‚Šå‡ºã—ä¸ã®åŒºç”»ãªã®ã§ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«ã‹ã‘ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オークションã«ã‹ã‘ãŸã„å ´åˆã¯å£²ã‚Šå‡ºã—è¨å®šã‚’解除ã—ã¦ã‹ã‚‰è¡Œã£ã¦ãã ã•ã„。 - </notification> - <notification label="オブジェクトをåå‰ã§ãƒŸãƒ¥ãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ" name="MuteByNameFailed"> - ã‚ãªãŸã¯ã™ã§ã«ã“ã®åå‰ã‚’ミュートã—ã¦ã„ã¾ã™ã€‚ - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RemoveItemWarn"> - コンテンツを削除ã™ã‚‹ã¨ã€è¨±å¯ãŒã‚ã£ã¦ã‚‚ã€ã‚ªãƒ–ジェクトã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ -ãã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="CantOfferCallingCard"> - ç¾åœ¨ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="CantOfferFriendship"> - ç¾åœ¨ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚·ãƒƒãƒ—ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«è©¦ã—ã¦ãã ã•ã„。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="BusyModeSet"> - å–ã‚Šè¾¼ã¿ä¸ã«è¨å®šã•ã‚Œã¾ã—ãŸã€‚ -ãƒãƒ£ãƒƒãƒˆã¨ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ»ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼ˆIM)ãŒéš ã‚Œã¾ã™ã€‚ -相手ã¯ã€Œå–ã‚Šè¾¼ã¿ä¸å¿œç”メッセージã€ã‚’IMã§å—ã‘å–ã‚Šã¾ã™ã€‚ -テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ã‚¡ãƒ¼ã¯å…¨ã¦æ‹’å¦ã•ã‚Œã€æŒã¡ç‰©ã®ã‚ªãƒ•ã‚¡ãƒ¼ã¯å…¨ã¦ã‚´ãƒŸç®±ã«é€ã‚‰ã‚Œã¾ã™ã€‚ - <usetemplate ignoretext="å–ã‚Šè¾¼ã¿ä¸ã®è¨å®šã‚’ã™ã‚‹ã¨ã" name="okignore" yestext="OK"/> - </notification> - <notification name="JoinedTooManyGroupsMember"> - ã‚ãªãŸã¯ç¾åœ¨ãƒ¡ãƒ³ãƒãƒ¼ã«ãªã£ã¦ã„るグループãŒå¤šã™ãŽã‚‹ãŸã‚〠-ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã§ãã¾ã›ã‚“。少ãªãã¨ã‚‚1ã¤ã®ã‚°ãƒ«ãƒ¼ãƒ—を脱退ã—ã¦ã‹ã‚‰ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã‹ã€ã“ã®æ‹›å¾…ã‚’æ–ã£ã¦ãã ã•ã„。 -グループを抜ã‘ã‚‹ã«ã¯ã€ç·¨é›†ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€Œã‚°ãƒ«ãƒ¼ãƒ—...ã€ã‚ªãƒ—ションををé¸æŠžã—ã¾ã™ã€‚ -[NAME]ã¯ã€ã‚ãªãŸã‚’メンãƒãƒ¼ã¨ã—ã¦ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚ -[INVITE] - <usetemplate name="okcancelbuttons" notext="辞退" yestext="å‚åŠ "/> - </notification> - <notification name="KickUser"> - ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã—ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒã‚°ã‚ªãƒ•ã•ã‚Œã¾ã—ãŸã€‚ - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="KickAllUsers"> - ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã‚°ãƒªãƒƒãƒ‰ã«ã„る全員を追ã„出ã—ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒã‚°ã‚ªãƒ•ã•ã‚Œã¾ã—ãŸã€‚ - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="FreezeUser"> - ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - ã‚ãªãŸã¯ãƒ•ãƒªãƒ¼ã‚ºã•ã‚Œã¦ã„ã¾ã™ã€‚ å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 管ç†è€…ãŒIMを通ã˜ã¦ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚ - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="UnFreezeUser"> - ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ•ãƒªãƒ¼ã‚ºã‚’解除ã—ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - ã‚‚ã†ãƒ•ãƒªãƒ¼ã‚ºã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="OfferTeleport"> - 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã‚ãªãŸãŒä»Šã„ã‚‹å ´æ‰€ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="OfferTeleportFromGod"> - ユーザーをゴッド・コールã§å‘¼ã³å¯„ã›ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <input name="message"> - [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="TeleportFromLandmark"> - 本当ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="æŒã¡ç‰©ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹æ™‚" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> - </notification> - <notification label="ã‚ãªãŸã®ä¸å‹•ç”£å†…ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageEstate"> - 今ã‚ãªãŸã®ä¸å‹•ç”£ã«ã„る人全員ã«é€ã‚‹ -çŸã„メッセージを入力ã—ã¦ãã ã•ã„。 - <form name="form"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification label="Lindenã®ä¸å‹•ç”£ã‚’変更" name="ChangeLindenEstate"> - ã‚ãªãŸã¯Linden所有ã®ä¸å‹•ç”£ï¼ˆãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ - -ã“ã‚Œã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®çµŒé¨“ã‚’æ ¹æœ¬ã‹ã‚‰æºã‚‹ãŒã—ã‹ããªã„「éžå¸¸ã«å±é™ºãªè¡Œç‚ºã€ã§ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€ãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã§å¤šæ•°ã®åœ°åŸŸãŒå¤‰æ›´ã•ã‚Œã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚ - -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification label="Lindenã®ä¸å‹•ç”£ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’変更" name="ChangeLindenAccess"> - ã‚ãªãŸã¯Linden所有ã®ä¸å‹•ç”£ï¼ˆãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ - -ã“ã®è¡Œç‚ºã¯ã€Œå±é™ºã€ã§ã‚ã‚Šã€ã‚°ãƒªãƒƒãƒ‰ã‹ã‚‰ã‚ªãƒ–ジェクトやãŠé‡‘ã®è»¢é€ã‚’ã‚‚ãŸã‚‰ã™ãƒãƒƒã‚ングを引ãèµ·ã“ã™å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€å®Œå…¨ã«ãれをæ„図ã—ãŸå ´åˆã®ã¿è¡Œã†ã¹ãã‚‚ã®ã§ã™ã€‚ -ã“ã‚Œã«ã‚ˆã‚Šå¤šæ•°ã®åœ°åŸŸãŒå¤‰æ›´ã•ã‚Œã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentAdd"> - ã“ã®ä¸å‹•ç”£ã®è¨±å¯ãƒªã‚¹ãƒˆã ã‘ã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãã‚Œã¨ã‚‚[ALL_ESTATES]ã®ã™ã¹ã¦ã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentRemove"> - 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•ç”£ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãã‚Œã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupAdd"> - ã“ã®ä¸å‹•ç”£ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã ã‘ã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãã‚Œã¨ã‚‚[ALL_ESTATES]ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupRemove"> - 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•ç”£ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãã‚Œã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentAdd"> - ã“ã®ä¸å‹•ç”£ã«ã¤ã„ã¦ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ ãã‚Œã¨ã‚‚[ALL_ESTATE]ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentRemove"> - ã“ã®ä½äººã‚’ã€ã“ã®ä¸å‹•ç”£ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã¸ã¨ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€ç¦æ¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerAdd"> - ã“ã®ä¸å‹•ç”£ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã«å¯¾ã—ã¦ã€ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> - </notification> - <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerRemove"> - ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’ã€ã“ã®ä¸å‹•ç”£ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã‹ã‚‰ã€å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> - </notification> - <notification label="ã‚ックを確èª" name="EstateKickUser"> - ã“ã®ä¸å‹•ç”£ã‹ã‚‰[EVIL_USER]を追ã„出ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="EstateChangeCovenant"> - ä¸å‹•ç”£ç´„款を変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="RegionEntryAccessBlocked"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ - -最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="RegionEntryAccessBlocked_KB"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - -ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å¦ã³ã¾ã™ã‹ï¼Ÿ - <url name="url"> - http://wiki.secondlife.com/wiki/レーティング区分概è¦_(KB) - </url> - <usetemplate ignoretext="レーティング区分ã«ã‚ˆã£ã¦åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«å…¥ã‚Œãªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> - </notification> - <notification name="RegionEntryAccessBlocked_Notify"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="RegionEntryAccessBlocked_Change"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - -「è¨å®šã‚’変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] コンテンツã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ -ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。 - <form name="form"> - <button - name="OK" - text="è¨å®šã®å¤‰æ›´"/> - <button - default="true" - name="Cancel" - text="é–‰ã˜ã‚‹"/> - <ignore name="ignore" text="レーティング区分è¨å®šã«ã‚ˆã£ã¦åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«å…¥ã‚Œãªã„ã¨ã"/> - </form> - </notification> - <notification name="LandClaimAccessBlocked"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ - -最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandClaimAccessBlocked_KB"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - -ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å¦ã³ã¾ã™ã‹ï¼Ÿ - <url name="url"> - http://wiki.secondlife.com/wiki/レーティング区分概è¦_(KB) - </url> - <usetemplate ignoretext="レーティング区分ã«ã‚ˆã£ã¦åœŸåœ°ã‚’å–å¾—ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> - </notification> - <notification name="LandClaimAccessBlocked_Notify"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="LandClaimAccessBlocked_Change"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - -「è¨å®šã‚’変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] コンテンツã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ -ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。 - <usetemplate ignoretext="レーティング区分è¨å®šã«ã‚ˆã£ã¦åœŸåœ°ã‚’å–å¾—ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="è¨å®šã®å¤‰æ›´"/> - </notification> - <notification name="LandBuyAccessBlocked"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ - -最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="LandBuyAccessBlocked_KB"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - -ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å¦ã³ã¾ã™ã‹ï¼Ÿ - <url name="url"> - http://wiki.secondlife.com/wiki/レーティング区分概è¦_(KB) - </url> - <usetemplate ignoretext="レーティング区分ã«ã‚ˆã£ã¦åœŸåœ°ã‚’購入ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> - </notification> - <notification name="LandBuyAccessBlocked_Notify"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="LandBuyAccessBlocked_Change"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - -「è¨å®šã‚’変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] コンテンツã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ -ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。 - <usetemplate ignoretext="レーティング区分è¨å®šã«ã‚ˆã£ã¦åœŸåœ°ã‚’購入ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="è¨å®šã®å¤‰æ›´"/> - </notification> - <notification name="TooManyPrimsSelected"> - é¸æŠžã—ãŸãƒ—リムãŒå¤šã™ãŽã¾ã™ã€‚ -[MAX_PRIM_COUNT] ã‚’é¸æŠžã™ã‚‹ã‹ã€ -プリム数を減らã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="ProblemImportingEstateCovenant"> - ä¸å‹•ç”£ç´„款ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«å•é¡Œç™ºç”Ÿã€‚ - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ProblemAddingEstateManager"> - æ–°ã—ã„ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã®è¿½åŠ ã«é–¢ã™ã‚‹å•é¡Œï¼š -1ã¤ä»¥ä¸Šã®ä¸å‹•ç”£ã§ã€ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="ProblemAddingEstateGeneric"> - ä¸å‹•ç”£ãƒªã‚¹ãƒˆã®è¿½åŠ ã«é–¢ã™ã‚‹å•é¡Œï¼š -1ã¤ä»¥ä¸Šã®ä¸å‹•ç”£ã§ã€ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="UnableToLoadNotecardAsset"> - ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®è³‡ç”£IDã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="NotAllowedToViewNotecard"> - è¦æ±‚ã•ã‚ŒãŸè³‡ç”£IDã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ã€‚ - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MissingNotecardAssetID"> - ノートカード用資産IDãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="PublishClassified"> - 注æ„:クラシファイド広告ã®æ–™é‡‘ã¯æ‰•ã„戻ã—ã•ã‚Œã¾ã›ã‚“。 - -L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã‚’今ã™ã公開ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="SetClassifiedMature"> - ã“ã®åºƒå‘Šã«Matureコンテンツã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="SetGroupMature"> - ã“ã®åºƒå‘Šã«Matureコンテンツã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ - <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification label="å†èµ·å‹•ã‚’確èª" name="ConfirmRestart"> - ã“ã®åœ°åŸŸã‚’2分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ -æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification label="ã“ã®åœ°åŸŸå†…ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageRegion"> - ã“ã®åœ°åŸŸã«ã„る人全員ã«é€ã‚‹ -çŸã„メッセージを入力ã—ã¦ãã ã•ã„。 - <form name="form"> - <input name="message"/> - <button name="OK" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification label="土地整備をブãƒãƒƒã‚¯" name="HelpRegionBlockTerraform"> - ã“ã®ãƒœãƒƒã‚¯ã‚¹ãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ -区画ã”ã¨ã®ã€Œé ˜åŸŸã‚’編集ã€ã®è¨å®šã«ã‹ã‹ã‚らãšã€åœŸåœ°ã‚ªãƒ¼ãƒŠãƒ¼ã¯åœŸåœ°æ•´å‚™ãŒã§ãã¾ã›ã‚“。 - -デフォルト:オフ - </notification> - <notification label="飛行をブãƒãƒƒã‚¯" name="HelpRegionBlockFly"> - ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€åŒºç”»ã”ã¨ã®ã€Œé£›è¡Œã€è¨å®šã«é–¢ã‚らãšé£›è¡ŒãŒã§ããªããªã‚Šã¾ã™ã€‚ - -デフォルト:オフ - </notification> - <notification label="コンテンツ権é™ã®ä¸€æ‹¬å¤‰æ›´" name="HelpBulkPermission"> - 権é™ã®ä¸€æ‹¬å¤‰æ›´ãƒ„ールã§ã¯ã€é¸æŠžã—ãŸè¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®æ¨©é™ã‚’ç´ æ—©ã変更ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ -ã—ã‹ã—é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ä¸èº«ã®æ¨©é™è¨å®šã‚’ã™ã‚‹ã ã‘ã§ã€ã‚ªãƒ–ジェクトãã®ã‚‚ã®ã§ã¯ãªã„ã“ã¨ã«ã”注æ„ãã ã•ã„。 - -ã¾ãŸã€æ¨©é™ã¯ä¸ã«ã‚るアイテムã®ãã®ä¸èº«ã«ã¯é©ç”¨ã•ã‚Œãªã„ã“ã¨ã‚‚ã”注æ„ãã ã•ã„。 1段階層ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã¿ã¸ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¨ãªã‚Šã¾ã™ã€‚ - -「コンテンツã®ç¨®é¡žã€ã«ã‚ã‚‹ãƒã‚§ãƒƒã‚¯ãƒªã‚¹ãƒˆã‚’使ã£ã¦ã€ä¿®æ£ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã®ç¨®é¡žã‚’é¸æŠžã—ã¾ã™ã€‚ テクスãƒãƒ£ãƒ¼ã‚’é¸æŠžã™ã‚‹ã¨ã€ã‚¹ãƒŠãƒƒãƒ—ショットもå«ã¾ã‚Œã¾ã™ã€‚ - -* ã“ã®ãƒ„ールã®ä½¿ç”¨ã¯ã€ -ã‚ãªãŸãŒå¤‰æ›´ã™ã‚‹ã“ã¨ã®ã§ãるアイテムã«ã®ã¿æœ‰åŠ¹ã§ã™ã€‚ -* 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒã‚ãªãŸã«ãªã„å ´åˆã¯ã€é©ç”¨ã•ã‚Œã¾ã›ã‚“。 -* 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ã¯å˜ã«ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã™ãŽã¾ã›ã‚“。 ã©ã‚Œã‹ä¸€ã¤ã®ã‚¢ã‚¤ãƒ†ãƒ ã§ã‚‚æ–°ã—ã„権é™ã®è¨å®šã‚’å—ã‘付ã‘ãªã„å ´åˆã€ã™ã¹ã¦ã®æ¨©é™ã®è¨å®šã¯ãã®ã¾ã¾ç¶æŒã•ã‚Œã¾ã™ã€‚ - -一括変更ã®æº–å‚™ãŒã§ããŸã‚‰ã€ã€Œé©ç”¨ã€ã‚’クリックã—ã¦çµæžœãŒè¡¨ç¤ºã•ã‚Œã‚‹ã®ã‚’ãŠå¾…ã¡ãã ã•ã„。 - -権é™å¤‰æ›´ä¸ã«æ¨©é™ã®ä¸€æ‹¬å¤‰æ›´ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ãŸå ´åˆã€å‡¦ç†ã¯åœæ¢ã•ã‚Œã¾ã™ã€‚ - </notification> - <notification label="ダメージ許å¯" name="HelpRegionAllowDamage"> - ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ -å„区画ã®å€‹åˆ¥ã®è¨å®šã«ã‹ã‹ã‚らãšã€å…¨ã¦ã®åŒºç”»ã«ãŠã‘るヘルスシステムを有効ã«ã—ã¾ã™ã€‚ -ã“ã®ãƒœãƒƒã‚¯ã‚¹ãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ãªã„å ´åˆã§ã‚‚〠-個別ã®åŒºç”»ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€è‡ªåˆ†ã®åŒºç”»ã«å¯¾ã™ã‚‹ãƒ˜ãƒ«ã‚¹ã‚·ã‚¹ãƒ†ãƒ を有効ã«ã§ãã¾ã™ã€‚ - -デフォルト: オフ - </notification> - <notification label="人物ã®åˆ¶é™" name="HelpRegionAgentLimit"> - ã“ã®åœ°åŸŸã«è¨±å¯ã•ã‚Œã‚‹ã‚¢ãƒã‚¿ãƒ¼ã®æœ€å¤§æ•°ã‚’è¨å®šã—ã¾ã™ã€‚ -1ã¤ã®åœ°åŸŸã«ã‚¢ãƒã‚¿ãƒ¼ãŒå¤šã„ã¨ãƒ‘フォーマンス㌠-低下ã™ã‚‹åŽŸå› ã«ãªã‚‹ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。 - -デフォルト: 40 - </notification> - <notification label="物体ボーナス" name="HelpRegionObjectBonus"> - オブジェクトボーナスã¯ã€åŒºç”»ã«ãŠã„ã¦è¨±å¯ã•ã‚Œã¦ã„るプリムã®å€çŽ‡æ•°ã‚’æ„味ã—ã¾ã™ã€‚ -èªå¯ã•ã‚Œã¦ã„る範囲ã¯1ã‹ã‚‰10ã§ã™ã€‚ -ã—ãŸãŒã£ã¦ã€ã€Œ1ã€ã«è¨å®šã™ã‚‹ã¨ã€512 m²ã®åœŸåœ°ã«ã¯ã€117ã®ã‚ªãƒ–ジェクトãŒè¨±å¯ã•ã‚Œã¾ã™ã€‚ -「2ã€ã«è¨å®šã™ã‚‹ã¨ã€åŒã˜512 m²ã®åœŸåœ°ã«ã¯ã€1ã®ã¨ãã®2å€ã«ã‚ãŸã‚‹234ã®ã‚ªãƒ–ジェクトãŒè¨±å¯ã•ã‚Œã€3以é™ã‚‚åŒæ§˜ã«å¢—ãˆã¦ã„ãã¾ã™ã€‚ -全地域ã®æœ€é«˜ã‚ªãƒ–ジェクト数ã¯ã€ã‚ªãƒ–ジェクトボーナスã®å€¤ã«å½±éŸ¿ã•ã‚Œãšã€ -15,000ã®ã¾ã¾å¤‰ã‚ã‚Šã¾ã›ã‚“。 -ã„ã£ãŸã‚“決定ã—ãŸå¾Œã§ã‚ªãƒ–ジェクトボーナスã®å€¤ã‚’下ã’ã‚‹ã¨ã€ã‚ªãƒ–ジェクトãŒè¿”å´ã¾ãŸã¯å‰Šé™¤ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã®ã§ã”注æ„ãã ã•ã„。 -ディフォルト: 1.0 - </notification> - <notification label="レーティング区分" name="HelpRegionMaturity"> - ä½äººã®ãƒ“ューワ上部ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãƒãƒ¼ã«è¡¨ç¤ºã•ã‚Œã‚‹ã€åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’è¨å®šã—ã¾ã™ã€‚ -世界地図上ã§ã‚«ãƒ¼ã‚½ãƒ«ã‚’ã“ã®åœ°åŸŸã«ä¹—ã›ã‚‹ã¨ãƒ„ールãƒãƒƒãƒ—ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ -ã“ã®è¨å®šã¯ã“ã®åœ°åŸŸå…¨ä½“ã¨æ¤œç´¢çµæžœã«åæ˜ ã•ã‚Œã¾ã™ã€‚ -ä»–ã®ä½äººã¯ç’°å¢ƒè¨å®šã§é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«åˆã£ãŸåœ°åŸŸã«å…¥ã‚‹ã“ã¨ãŒã§ãã€æ¤œç´¢çµæžœã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚ - -地図ã«ã“ã®å¤‰æ›´ãŒåæ˜ ã™ã‚‹ã«ã¯æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ - </notification> - <notification label="プッシュを制é™" name="HelpRegionRestrictPushObject"> - ã“ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã¯ã€åˆ¶é™ã•ã‚ŒãŸãƒ—ッシュ権é™ã‚’全地域ã«é©ç”¨ã—ã¾ã™ã€‚ -有効ã«ãªã£ã¦ã„ã‚‹å ´åˆã€ä½äººã¯è‡ªåˆ†è‡ªèº«ã§ã®ãƒ—ッシュ〠-ã‚ã‚‹ã„ã¯åŒºç”»ã®æ‰€æœ‰è€…ã«ã‚ˆã‚‹ãƒ—ッシュã ã‘ã«åˆ¶é™ã§ãã¾ã™ã€‚ -(プッシュã¯ã€LSLã® llPushObject() 機能をå‚ç…§ã—ã¾ã™ã€‚) - -デフォルト: オフ - </notification> - <notification label="区画統åˆï¼å†åˆ†å‰²" name="HelpParcelChanges"> - ã“ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã¯ã€ä¸å‹•ç”£ã‚ªãƒ¼ãƒŠãƒ¼ãŒæ‰€æœ‰ã—ã¦ã„ãªã„区画を統åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã‚‹ã‹ã©ã†ã‹ã‚’è¨å®šã—ã¾ã™ã€‚ -本オプションãŒç„¡åŠ¹ãªå ´åˆï¼š -*ä¸å‹•ç”£ã‚ªãƒ¼ãƒŠãƒ¼ã€ã¾ãŸã¯ç®¡ç†è€…ã®ã¿ãŒã€çµ±åˆï¼å†åˆ†å‰²ã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚ -*オーナーã€ã¾ãŸã¯ã€é©åˆ‡ãªæ¨©é™ã‚’æŒã¤ã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã™ã‚‹åŒºç”»ã®ã¿ã‚’ -çµ±åˆï¼å†åˆ†å‰²ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -本オプションãŒæœ‰åŠ¹ãªå ´åˆï¼š -*å…¨ã¦ã®åŒºç”»ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€æ‰€æœ‰ã™ã‚‹åŒºç”»ã®çµ±åˆï¼å†åˆ†å‰²ãŒã§ãã¾ã™ã€‚ -*グループ所有ã®åŒºç”»ã¯ã€é©åˆ‡ãªæ¨©é™ã‚’æŒã¤ã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã™ã‚‹åŒºç”»ã‚’çµ±åˆï¼å†åˆ†å‰²ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - -デフォルト:ãƒã‚§ãƒƒã‚¯ã‚ã‚Š - </notification> - <notification label="検索ã§è¡¨ç¤ºã—ãªã„" name="HelpRegionSearch"> - ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€åŒºç”»ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€è‡ªåˆ†ã®åŒºç”»ãŒæ¤œç´¢çµæžœã«ãƒªã‚¹ãƒˆã•ã‚Œã‚‹ã“ã¨ã‚’阻æ¢ã§ãã¾ã™ã€‚ -デフォルト:オフ - </notification> - <notification label="地域ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šå¤‰æ›´æ¸ˆã¿" name="RegionMaturityChange"> - ã“ã®åœ°åŸŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šãŒã‚¢ãƒƒãƒ—デートã•ã‚Œã¾ã—ãŸã€‚ -ã“ã®å¤‰æ›´ãŒåœ°å›³ã«åæ˜ ã•ã‚Œã‚‹ã¾ã§ã«ã¯ã—ã°ã‚‰ã時間ãŒã‹ã‹ã‚Šã¾ã™ã€‚ - </notification> - <notification label="土地ã®å†è²©" name="HelpRegionLandResell"> - ä¸å‹•ç”£ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¨ç®¡ç†è€…ã¯ã€ä¸å‹•ç”£ã‚ªãƒ¼ãƒŠãƒ¼ã®åœŸåœ°ã‚’販売ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã—ãªã„å ´åˆã€è³¼å…¥è€…ãŒæœ¬åœ°åŸŸã«ãŠã‘る土地をå†è²©ã™ã‚‹ã“ã¨ã¯ã§ããªããªã‚Šã¾ã™ã€‚ -ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã—ãŸå ´åˆã€è³¼å…¥è€…ã¯æœ¬åœ°åŸŸã«ãŠã‘る土地をå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - -デフォルト:許å¯ã—ãªã„ - </notification> - <notification label="スクリプトを無効化" name="HelpRegionDisableScripts"> - スクリプトãŒåŽŸå› ã§ã‚·ãƒ ã®çŠ¶æ³ãŒæ‚ªããªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ -統計グラフをã ã—ã¦ï¼ˆCtrl+Shift+1)〠-シミュレーターフィジックスFPSを見ã¦ãã ã•ã„。 -45より数ãŒä½Žã‘ã‚Œã°ã€ä¸€ç•ªä¸‹ã«ä½ç½®ã—ã¦ã„るタイムパãƒãƒ«ã‚’é–‹ã„ã¦ãã ã•ã„。 -スクリプト時間ãŒ25ms以上ã§ã‚ã‚Œã°ã€ -「トップスクリプトをå–å¾—ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚ -悪影響をåŠã¼ã—ã¦ã„るスクリプトã®åå‰ã¨ä½ç½®ãŒç¾ã‚Œã¾ã™ã€‚ - -「スクリプトを無効ã«ã™ã‚‹ã€ã‚’ãƒã‚§ãƒƒã‚¯ã—「é©ç”¨ã€ã‚’クリックã™ã‚‹ã¨ã€åœ°åŸŸå†…ã®å…¨ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トãŒä¸€æ™‚çš„ã«ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚ -トップスクリプトã§æ¤œç´¢ã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ä½ç½®ã¾ã§åˆ°é”ã™ã‚‹ã«ã¯ã€ -ã“ã®ã‚¹ãƒ†ãƒƒãƒ—ãŒå¿…è¦ã«ãªã‚‹å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚ -スクリプトä½ç½®ã«åˆ°ç€å¾Œã€ã‚¹ã‚¯ãƒªãƒ—トを見ã¦æ‚ªå½±éŸ¿ã‚’与ãˆã¦ã„ã‚‹ã‹èª¿æŸ»ã—ã¦ãã ã•ã„。 -スクリプトã®æ‰€æœ‰è€…ã«é€£çµ¡ã™ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯ã‚ªãƒ–ジェクトã®å‰Šé™¤ã¾ãŸã¯è¿”å´ã‚‚考ãˆã‚‰ã‚Œã¾ã™ã€‚ -「スクリプトを無効ã«ã™ã‚‹ã€ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã€ã€Œé©ç”¨ã€ã‚’クリックã—ã¦åœ°åŸŸå…¨ä½“ã®ã‚¹ã‚¯ãƒªãƒ—トを有効ã«æˆ»ã—ã¦ãã ã•ã„。 - -デフォルト:オフ - </notification> - <notification label="è¡çªã‚’無効化" name="HelpRegionDisableCollisions"> - 物ç†çš„オブジェクトãŒåŽŸå› ã§ã€ -シムã®å‡¦ç†ãŒé‡ããªã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ -統計グラフを開ã„ã¦ï¼ˆCtrl+Shift+1)〠-シミュレーターフィジックスFPSを見ã¦ãã ã•ã„。 -数値ãŒ45より低ã‘ã‚Œã°ã€çµ±è¨ˆãƒãƒ¼ã®ä¸‹ã«ä½ç½®ã—ã¦ã„るタイムパãƒãƒ«ã‚’é–‹ã„ã¦ãã ã•ã„。 -ã‚‚ã—シムタイム(物ç†çš„作用)ãŒ20 msより長ã„å ´åˆã¯ã€ -「トップ・コライダーをå–å¾—ã€ã‚’クリックã—ã¦ãã ã•ã„。 -悪影響をåŠã¼ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚る物ç†ã‚ªãƒ–ジェクトã®åå‰ã¨ä½ç½®ãŒç¾ã‚Œã¾ã™ã€‚ - -「è¡çªã‚’無効ã«ã™ã‚‹ã€ã‚’ãƒã‚§ãƒƒã‚¯ã—「é©ç”¨ã€ã‚’クリックã™ã‚‹ã¨ã€ -オブジェクトåŒå£«ã®è¡çªãŒä¸€æ™‚çš„ã«ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚ -当該ã®ãƒˆãƒƒãƒ—・コライダーã®ä½ç½®ã¾ã§åˆ°é”ã™ã‚‹ã«ã¯ -上記ã®ã‚¹ãƒ†ãƒƒãƒ—ãŒå¿…è¦ã«ãªã‚‹å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚ -到ç€å¾Œã€ã‚ªãƒ–ジェクトを見ã¦å¸¸æ™‚ä»–ã®ã‚ªãƒ–ジェクトã¨è¡çªã—ã¦ã„ã‚‹ã‹èª¿æŸ»ã—ã¦ãã ã•ã„。 -オブジェクトã®æ‰€æœ‰è€…ã«é€£çµ¡ã™ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯ã‚ªãƒ–ジェクトã®å‰Šé™¤ã¾ãŸã¯è¿”å´ã‚’考慮ã™ã¹ãã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 -「è¡çªã‚’無効ã«ã™ã‚‹ã€ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã€ã€Œé©ç”¨ã€ã‚’クリックã—㦠-地域全体ã®è¡çªã‚’有効ã«æˆ»ã—ã¦ãã ã•ã„。 - -デフォルト:オフ - </notification> - <notification label="物ç†ä½œç”¨ã‚’無効化" name="HelpRegionDisablePhysics"> - 物ç†çš„作用を無効ã«ã™ã‚‹ã“ã¨ã¯ã€ç‰©ç†çš„シミュレーション全ã¦ã®ç„¡åŠ¹ã‚’除ã„ã¦ã€è¡çªã‚’無効ã«ã™ã‚‹ã“ã¨ã¨ä¼¼ã¦ã„ã¾ã™ã€‚ -ã“ã‚Œã¯ã€ã‚ªãƒ–ジェクトã®è¡çªã‚’æ¢ã‚ã‚‹ã®ã¿ãªã‚‰ãšã€ã‚¢ãƒã‚¿ãƒ¼ã®ç§»å‹•ãŒã§ããªããªã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ - -ã“ã®æ©Ÿèƒ½ã¯ã€ç‰©ç†çš„ãªå•é¡Œãªã®ã‹ã€ã¾ãŸã¯ãƒˆãƒƒãƒ—・コライダーãªã®ã‹ã‚’調査ã™ã‚‹ã«ã‚ãŸã‚Šã€è¡çªã®ç„¡åŠ¹ãŒåœ°åŸŸã«å¯¾ã—ã¦å分ãªãƒ‘フォーマンスを発æ®ã—ãªã„å ´åˆã«ã®ã¿ä½¿ç”¨ã—ã¦ãã ã•ã„。 - -終了ã™ã‚‹æ™‚ã«ã¯ã€ç‰©ç†çš„作用をå†åº¦å¯èƒ½ã«è¨å®šã—ã¦ãã ã•ã„。 -ãã®ã¾ã¾ã ã¨ã€ã‚¢ãƒã‚¿ãƒ¼ã¯ãšã£ã¨å‹•ã‘ã¾ã›ã‚“。 - -デフォルト:オフ - </notification> - <notification label="トップ・コライダー" name="HelpRegionTopColliders"> - オブジェクトåŒå£«ã®è¡çªãŒæœ€ã‚‚多ã„å¯èƒ½æ€§ã®ã‚ã‚‹ -オブジェクトã®ãƒªã‚¹ãƒˆã‚’表示ã—ã¾ã™ã€‚ã“れらã®ã‚ªãƒ–ジェクトã¯ã€ -パフォーマンスを低下ã•ã›ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ -ビューã‹ã‚‰çµ±è¨ˆãƒãƒ¼ã‚’é¸æŠžã—〠-シミュレータ>時間>シム時間 (物ç†çš„作用) ã§ã€ -物ç†çš„作用ã«20 ms以上を費ã—ã¦ã„ã‚‹ã‹ã‚’確èªã—ã¦ãã ã•ã„。 - </notification> - <notification label="トップ・スクリプト" name="HelpRegionTopScripts"> - LSLスクリプトã®å®Ÿè¡Œã«ä¸€ç•ªæ™‚間を費やã—ã¦ã„るオブジェクトã®ãƒªã‚¹ãƒˆã‚’入手ã—ã¾ã™ã€‚ -ã“れらã®ã‚ªãƒ–ジェクトã¯ã€ãƒ‘フォーマンスを低下ã•ã›ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ -ビューã‹ã‚‰çµ±è¨ˆãƒãƒ¼ã‚’é¸æŠžã—〠-ミュレータ>時間>スクリプト時間ã§ã€ -スクリプトã«25 ms以上を費ã—ã¦ã„ã‚‹ã‹ã‚’確èªã—ã¦ãã ã•ã„。 - </notification> - <notification label="地域をå†èµ·å‹•" name="HelpRegionRestart"> - 2分後ã«ã‚µãƒ¼ãƒãƒ¼ãŒå†èµ·å‹•ã•ã‚Œã‚‹ã¨ã„ã†è¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¾Œã«ã€ -ã“ã®åœ°åŸŸã®ã‚µãƒ¼ãƒãƒ¼ãƒ—ãƒã‚»ã‚¹ã‚’å†èµ·å‹•ã—ã¾ã™ã€‚ -ã“ã®åœ°åŸŸã®ã™ã¹ã¦ã®ä½äººã®æŽ¥ç¶šãŒåˆ‡æ–ã•ã‚Œã¾ã™ã€‚ -地域ã®ãƒ‡ãƒ¼ã‚¿ã¯ä¿å˜ã•ã‚Œã€90秒以内ã«å›žå¾©ã—ã¾ã™ã€‚ - -ã“ã®åœ°åŸŸã‚’å†èµ·å‹•ã—ã¦ã‚‚ã€ã»ã¨ã‚“ã©ã®ãƒ‘フォーマンスã®å•é¡Œã«å¤‰åŒ–ã¯ã‚ã‚Šã¾ã›ã‚“。 -指示ã•ã‚ŒãŸæ™‚ã ã‘利用ã—ã¦ãã ã•ã„。 - </notification> - <notification label="æ°´é¢ã®é«˜ã•" name="HelpRegionWaterHeight"> - ã“ã‚Œã¯ã€æ°´ãŒç¾ã‚Œã‚‹é«˜ã•ï¼ˆå˜ä½ï¼šãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰ã§ã™ã€‚ -ã“ã®è¨å®šãŒ20以外ã§ã€æ°´ãŒä¸–界㮠-端やã€ã€Œç©ºã®ã€æ°´ã«è¿‘ã‘ã‚Œã°ã€ -æºãŒè¦‹ãˆã‚‹ã§ã—ょã†ã€‚ - -デフォルト: 20 - </notification> - <notification label="地形ã®ä¸Šæ˜‡" name="HelpRegionTerrainRaise"> - ã“ã®æ•°å€¤ã¯ã€ã€Œãƒ™ãƒ¼ã‚¯ã€åœ°å½¢ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®é«˜ã•ä»¥ä¸Šã«ã€ -区画所有者ãŒåœŸåœ°ã‚’上ã’ã‚‹ã“ã¨ã®ã§ãるメートル値ã§ã™ã€‚ - -デフォルト: 4 - </notification> - <notification label="地形ã®ä¸‹é™" name="HelpRegionTerrainLower"> - ã“ã®æ•°å€¤ã¯ã€ã€Œãƒ™ãƒ¼ã‚¯ã€åœ°å½¢ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®é«˜ã•ä»¥ä¸‹ã«ã€ -区画所有者ãŒåœŸåœ°ã‚’下ã’られるメートル値ã§ã™ã€‚ - -デフォルト: -4 - </notification> - <notification label="RAW地形をアップãƒãƒ¼ãƒ‰" name="HelpRegionUploadRaw"> - ã“ã®ãƒœã‚¿ãƒ³ã‚’使ã£ã¦ã€.RAW ファイルを -ç¾åœ¨ã‚ãªãŸãŒå±…る地域ã«ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã—ã¾ã™ã€‚ -ファイルãŒå¿…ãšæ£ã—ã„サイズã®256x256ã€RGB〠-ã¾ãŸã€ãƒãƒ£ãƒ³ãƒãƒ«æ•°ãŒ13ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 -地形(Terrain) ファイルを作æˆã™ã‚‹æœ€è‰¯ã®æ–¹æ³•ã¯ã€ -æ—¢å˜ã®RAWファイルをダウンãƒãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ã§ã™ã€‚ -ã¾ãšæœ€åˆã®ãƒãƒ£ãƒ³ãƒãƒ«ï¼ˆåœŸåœ°ã®é«˜ã•ï¼‰ã‚’変更ã—〠-アップãƒãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ã‹ã‚‰å§‹ã‚られã¾ã™ã€‚ - -アップãƒãƒ¼ãƒ‰ã«ã¯45秒ã»ã©ã‹ã‹ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ -ã“ã“ã§æ³¨æ„ã™ã‚‹ã“ã¨ã¯ã€åœ°å½¢ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã«ã‚ˆã£ã¦ã€åœŸåœ°ã«é…ç½®ã•ã‚Œã¦ã„るオブジェクトã¯ã€Œå‹•ã‹ãªã„ã€ã¨ã„ã†ã“ã¨ã§ã™ã€‚ -影響ãŒã‚ã‚‹ã®ã¯ã€åœ°å½¢è‡ªä½“ã¨ã€åœŸåœ°ã«é–¢ä¿‚ã™ã‚‹è¨±å¯ã®ã¿ã§ã™ã€‚ -よã£ã¦ã€ã‚ªãƒ–ジェクトãŒåœ°ä¸‹ã«åŸ‹ã¾ã£ã¦ã—ã¾ã†ã“ã¨ãŒã‚ã‚‹ã®ã§ã”注æ„ãã ã•ã„。 - -地形è¨å®šç·¨é›†ã®æƒ…å ±ã¨è©³ç´°ã«ã¤ã„ã¦ã¯ã€F1ヘルプをã”覧ãã ã•ã„。 - </notification> - <notification label="RAW地形をダウンãƒãƒ¼ãƒ‰" name="HelpRegionDownloadRaw"> - ã“ã®ãƒœã‚¿ãƒ³ã‚’押ã™ã¨ã€æ¨™é«˜ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ãƒ‡ãƒ¼ã‚¿ã€ -区画寸法ã€å£²ã‚Šå‡ºã—区画ステータスã€ã“ã®åœ°åŸŸã«ãŠã‘る許å¯ã‚’ -å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¾ã™ã€‚フォトショップã®ã‚ˆã†ãªãƒ—ãƒã‚°ãƒ©ãƒ ã§ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ãã«ã¯ã€ -以下ã®ã‚ˆã†ãªãƒ‰ã‚ュメントã®ã‚µã‚¤ã‚ºã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼š -RGBã€256x256ã§ã€ãƒãƒ£ãƒ³ãƒãƒ«æ•°ãŒ13 -ã“ã®åœ°å½¢ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ä»–ã®æ–¹æ³•ã§ã¯é–‹ãã“ã¨ã¯ã§ãã¾ã›ã‚“。 - -地形ã«ãŠã‘る標高フィールドã®ç·¨é›†ã«é–¢ã™ã‚‹è©³ç´°ã«ã¤ã„ã¦ã¯ã€F1ヘルプをã”覧ãã ã•ã„。 - </notification> - <notification label="ä¸å‹•ç”£ã®å¤ªé™½ã‚’使用" name="HelpRegionUseEstateSun"> - ã“ã®ãƒœãƒƒã‚¯ã‚¹ãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹ã¨ã€ã“ã®åœ°åŸŸã®å¤ªé™½ã¯ -ä¸å‹•ç”£ã®ä»–ã®å ´æ‰€ã«ãŠã‘る太陽ã¨ä½ç½®ãŒåŒã˜ã«ãªã‚Šã¾ã™ã€‚ - -デフォルト: オン - </notification> - <notification label="太陽固定" name="HelpRegionFixedSun"> - ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€å¤ªé™½ã®ä½ç½®ã¯æ®µéšŽã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼å†…ã« -è¨å®šã•ã‚Œã€å‹•ã‹ãªããªã‚Šã¾ã™ã€‚ -デフォルト: オフ - </notification> - <notification label="地形を構築ã™ã‚‹" name="HelpRegionBakeTerrain"> - ã“ã®ãƒœã‚¿ãƒ³ã«ã‚ˆã‚Šã€ç¾åœ¨ã®åœ°å½¢ã®å½¢çŠ¶ã‚’æ–°ãŸãªãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã¨ã—ã¦ä¿å˜ã—ã¾ã™ã€‚ -一度ベークã•ã‚Œã‚‹ã¨ã€ã‚ãªãŸã‚„ä»–ã®äººãŒåœ°å½¢ç·¨é›†ã®ã€Œå¾©å¸°ã€ã‚ªãƒ—ションï¼ãƒ„ールを使用ã—ãŸéš›ã«ã€ä¿å˜ã•ã‚ŒãŸå½¢çŠ¶ã«å›žå¾©ã§ãã¾ã™ã€‚ -ベークã•ã‚ŒãŸåœ°å½¢ã¯ã€åœ°å½¢ä¸Šæ˜‡ãŠã‚ˆã³ä¸‹é™å¢ƒç•Œã®ä¸é–“点ã§ã‚‚ã‚ã‚Šã¾ã™ã€‚ - </notification> - <notification label="ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼" name="HelpEstateEstateManager"> - ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¨ã¯ã€åœ°åŸŸã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã¨ -ä¸å‹•ç”£è¨å®šãŒå§”ä»»ã•ã‚ŒãŸä½äººã‚’ã•ã—ã¾ã™ã€‚ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯ã€ -アップãƒãƒ¼ãƒ‰ã€ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã€ãŠã‚ˆã³åœ°å½¢æ§‹ç¯‰ã‚’除ã„ãŸãƒ‘ãƒãƒ«å†…ã® -è¨å®šã‚’変更ã§ãã¾ã™ã€‚特ç†ã™ã¹ãã¯ã€ -ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹è¨±å¯ã¾ãŸã¯ç¦æ¢ã®è¨å®šãŒã§ãã‚‹ã“ã¨ã§ã™ã€‚ - -ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã®è¿½åŠ ã¨å‰Šé™¤ã¯ã€ä¸å‹•ç”£ã‚ªãƒ¼ãƒŠãƒ¼ã®ã¿ãŒè¡Œã†ã“ã¨ãŒã§ãã€ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼åŒå£«ã§ã¯ä¸å¯èƒ½ã§ã™ã€‚ -ä¿¡é ¼ã§ãã‚‹ä½äººã®ã¿ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã«ä»»å‘½ã—ã¦ãã ã•ã„。 -彼らã®è¡Œå‹•ã®å…¨è²¬ä»»ã¯ã€æœ€çµ‚çš„ã«ã¯ã‚ãªãŸã«ã‚ã‚Šã¾ã™ã€‚ - </notification> - <notification label="ã‚°ãƒãƒ¼ãƒãƒ«ãƒ»ã‚¿ã‚¤ãƒ を使用" name="HelpEstateUseGlobalTime"> - ã“ã®ãƒœãƒƒã‚¯ã‚¹ãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹ã¨ã€ -ã‚ãªãŸã®æ‰€æœ‰åœ°ã®å¤ªé™½ã¯Linden社所有ã®ãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã®ä¸å‹•ç”£ã§ã®å¤ªé™½ã®ä½ç½®ã«æº–ã˜ã¾ã™ã€‚ - -デフォルト: オン - </notification> - <notification label="太陽固定" name="HelpEstateFixedSun"> - ã“ã®ãƒœãƒƒã‚¯ã‚¹ãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹ã¨ã€ -太陽ã®ä½ç½®ã¯æ®µéšŽã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼å†…ã«è¨å®šã•ã‚Œã€å‹•ã‹ãªããªã‚Šã¾ã™ã€‚ - </notification> - <notification label="パブリック・アクセス" name="HelpEstateExternallyVisible"> - ã“ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã¯ã€ -ä»–ã®ä¸å‹•ç”£ã«ã„ã‚‹ä½äººãŒã€ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã«ç™»éŒ²ã•ã‚Œã¦ã„ãªãã¦ã‚‚ã“ã®ä¸å‹•ç”£ã«ç«‹ã¡å…¥ã‚‹ã“ã¨ãŒã§ãã‚‹ã‹ã©ã†ã‹ã‚’è¨å®šã—ã¾ã™ã€‚ - -デフォルト: オン - </notification> - <notification label="直接テレãƒãƒ¼ãƒˆã‚’許å¯" name="HelpEstateAllowDirectTeleport"> - ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹ã¨ã€ä¸å‹•ç”£ã®ã©ã“ã«ã§ã‚‚直接テレãƒãƒ¼ãƒˆãŒ -å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ãªã„ã¨ã€æœ€ã‚‚è¿‘ã„テレãƒãƒ–ã« -テレãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ - -デフォルト: オフ - </notification> - <notification label="アクセスを許å¯" name="HelpEstateAllowResident"> - ã“ã®ä¸å‹•ç”£ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ã“ã“ã«ç™»éŒ²ã•ã‚Œã¦ã„ã‚‹ä½äººã¨ -下記ã§ç‰¹åˆ¥ã«ç™»éŒ²ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿ã«è¨±å¯ã•ã‚Œã¾ã™ã€‚ -ã“ã®è¨å®šã¯ã€Œãƒ‘ブリック・アクセスã€ãŒã‚ªãƒ•ã«ãªã£ã¦ã‚‹ã¨ãã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™ã€‚ - </notification> - <notification label="グループ・アクセスを許å¯" name="HelpEstateAllowGroup"> - ã“ã®ä¸å‹•ç”£ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ã“ã“ã«ç™»éŒ²ã•ã‚Œã¦ã„るグループ㨠-下記ã§ç‰¹åˆ¥ã«ç™»éŒ²ã•ã‚ŒãŸä½äººã®ã¿ã«è¨±å¯ã•ã‚Œã¾ã™ã€‚ -ã“ã®è¨å®šã¯ã€Œãƒ‘ブリック・アクセスã€ãŒã‚ªãƒ•ã«ãªã£ã¦ã‚‹ã¨ãã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™ã€‚ - </notification> - <notification label="å«ŒãŒã‚‰ã›ã«é–¢ã™ã‚‹ãƒ¡ãƒ¼ãƒ«å…ˆ" name="HelpEstateAbuseEmailAddress"> - ã“れを有効ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«è¨å®šã™ã‚‹ã¨ã€ãã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã“ã®ä¸å‹•ç”£ã«ãŠã„ã¦è¡Œã‚れ㟠-å«ŒãŒã‚‰ã›ã®å ±å‘ŠãŒé€ä¿¡ã•ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ -è¨å®šã‚’è¡Œã‚ãªã„å ´åˆï¼ˆç©ºç™½ï¼‰ã€å«ŒãŒã‚‰ã›å ±å‘Šã¯ Linden Lab ã«ã®ã¿ -é€ä¿¡ã•ã‚Œã¾ã™ã€‚ - </notification> - <notification label="アクセス拒å¦" name="HelpEstateBanResident"> - ã“ã®ãƒªã‚¹ãƒˆã®ä½äººã¯ã€ä»–ã®è¨å®šã«ã‹ã‹ã‚らãšã€ã‚ãªãŸã®ä¸å‹•ç”£ã¸ã® -アクセスãŒç¦æ¢ã•ã‚Œã¦ã„ã¾ã™ã€‚ - </notification> - <notification label="ボイスãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="HelpEstateVoiceChat"> - ã“ã®ä¸å‹•ç”£ã®åŒºç”»ã¯ã€ä½äººãŒè¿‘所ã®äººã¨å¯¾è©±ã§ãã‚‹ -独自ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™ã€‚ - -デフォルト: オフ - </notification> - <notification label="ボイスãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´" name="VoiceVersionMismatch"> - ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® [APP_NAME] ã¯ã€ -ã“ã®åœ°åŸŸã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆæ©Ÿèƒ½ã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“。 -ボイスãƒãƒ£ãƒƒãƒˆã‚’æ£ã—ã使用ã™ã‚‹ã«ã¯ã€ -[APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚ - </notification> - <notification label="ä¸å‹•ç”£ç´„款" name="HelpEstateCovenant"> - ä¸å‹•ç”£ç´„款を定ã‚ã‚‹ã¨ã€è‡ªåˆ†ã®ä¸å‹•ç”£å†…ã®åŒºç”»ã‚’販売ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ -約款を定ã‚ã¦ã„ãªã„ã¨åœŸåœ°ã¯å£²ã‚Œã¾ã›ã‚“。 -土地ã«é–¢ã™ã‚‹è¦å‰‡ã‚’é©ç”¨ã—ãŸããªã‹ã£ãŸã‚Šã€è³¼å…¥å‰ã«åœŸåœ°ã«é–¢ã™ã‚‹æƒ…å ±ã‚’è³¼å…¥è€…ã«çŸ¥ã‚‰ã›ãŸããªã„å ´åˆã€ã‚ãªãŸã®ç´„款ã®ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã¯ç™½ç´™ã§ã‹ã¾ã„ã¾ã›ã‚“。 - -約款ã¯è³¼å…¥ã‚’考ãˆã¦ã„る人ã«ã€è¦å‰‡ã€ã‚¬ã‚¤ãƒ‰ãƒ©ã‚¤ãƒ³ã€æ–‡åŒ–çš„æƒ…å ±ã‚„ -å˜ã«ã‚ãªãŸãŒæœŸå¾…ã™ã‚‹ã“ã¨ã‚’ä¼ãˆã‚‹ãŸã‚ã«ã‚‚使ãˆã¾ã™ã€‚ -ã“ã“ã«ã¯ã€åŒºç”»è¦åˆ¶ã€å»ºé€ 物è¦åˆ¶ã€æ”¯æ‰•ã„オプションã€ãã‚Œã‹ã‚‰è³¼å…¥è€…ãŒäº‹å‰ã«ç›®ã‚’通ã—ã¦åŒæ„ã—ã¦ãŠãã¹ãã ã¨ã‚ãªãŸãŒæ€ã†é‡è¦ãªæƒ…å ±ã‚’ã™ã¹ã¦å…¥ã‚Œã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - -購入者ãŒãƒœãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ç´„款ã«åŒæ„ã—ãªã„ã‹ãŽã‚Šã€è³¼å…¥ã®æ‰‹ç¶šãã¯å®Œäº†ã—ã¾ã›ã‚“。 -ä¸å‹•ç”£ç´„款ãŒå®šã‚られã¦ã„る区画ã§ã‚ã‚Œã°ã€ã€ŒåœŸåœ°æƒ…å ±ã€ã‹ã‚‰ç´„款をã„ã¤ã§ã‚‚閲覧ã§ãã¾ã™ã€‚ - </notification> - <notification label="オブジェクトを購入ã§ãã¾ã›ã‚“" name="BuyObjectOneOwner"> - 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 -å˜ä¸€ã®ã‚ªãƒ–ジェクトをé¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOnly"> - 一度ã«è¤‡æ•°ã®ã‚ªãƒ–ジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è³¼å…¥ã§ãã¾ã›ã‚“。 -é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOwner"> - 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 -å˜ä¸€ã®ã‚ªãƒ–ジェクトをé¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="BuyOriginal"> - オリジナルã®ã‚ªãƒ–ジェクトを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ -ã“ã‚Œã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚ -å¯èƒ½ãªæ“作ã¯ã€ -変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BuyOriginalNoOwner"> - L$[PRICE]ã§ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ã‚ªãƒ–ジェクトを購入ã—ã¾ã™ã‹ï¼Ÿ -ã“ã‚Œã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚ -å¯èƒ½ãªæ“作ã¯ã€ -変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BuyCopy"> - コピーを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ -購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ -å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BuyCopyNoOwner"> - L$[PRICE]ã§ã‚³ãƒ”ーを購入ã—ã¾ã™ã‹ï¼Ÿ -購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ -å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BuyContents"> - コンテンツを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ -購入ã—ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="BuyContentsNoOwner"> - L$[PRICE]ã§ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を購入ã—ã¾ã™ã‹ï¼Ÿ -購入ã—ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ConfirmPurchase"> - ã“ã®å–引ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šè¡Œã‚ã‚Œã¾ã™ï¼š -[ACTION] - -ã“ã®è³¼å…¥ã‚’続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> - </notification> - <notification name="ConfirmPurchasePassword"> - ã“ã®å–引ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šè¡Œã‚ã‚Œã¾ã™ï¼š -[ACTION] - -ã“ã®è³¼å…¥ã‚’続行ã—ã¾ã™ã‹ï¼Ÿ -パスワードをå†å…¥åŠ›ã—ã€ã€ŒOKã€ã‚’クリックã—ã¦ãã ã•ã„。 - <form name="form"> - <input name="message"/> - <button name="ConfirmPurchase" text="OK"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="SetPickLocation"> - メモ: -本ピックã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’æ›´æ–°ã—ã¾ã—ãŸãŒã€ -ä»–ã®è©³ç´°ã¯å…ƒã®å€¤ã®ã¾ã¾ã«ãªã‚Šã¾ã™ã€‚ - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromObject"> - 「コピーç¦æ¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•ã‚Œã¾ã—ãŸã€‚ -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•ã‚Œãªã„ã¾ã¾ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•ã‚Œã¾ã™ã€‚ - - -アイテムを動ã‹ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="コピーç¦æ¢ã®æŒã¡ç‰©ã‚’オブジェクトã‹ã‚‰ç§»å‹•ã•ã›ã‚‹ã¨ã" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="MoveInventoryFromScriptedObject"> - 「コピーç¦æ¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•ã‚Œã¾ã—ãŸã€‚ -ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•ã‚Œã‚‹ã®ã§ã¯ãªãã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•ã‚Œã¾ã™ã€‚ -ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€æŒã¡ç‰©ã«ç§»å‹•ã•ã›ã‚‹ã¨ -スクリプトã«èª¤å‹•ä½œãŒèµ·ãã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ - -æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ を移動ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="コピーç¦æ¢ã®æŒã¡ç‰©ã‚’スクリプト付ãオブジェクトã‹ã‚‰ç§»å‹•ã•ã›ã‚‹ã¨ã" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ClickActionNotPayable"> - è¦å‘Šï¼šã€Œã‚¯ãƒªãƒƒã‚¯ã§ã‚ªãƒ–ジェクトã«æ”¯æ‰•ã„ã€ã®è¨å®šãŒã•ã‚Œã¾ã—ãŸã€‚ -ãŸã ã—ã€ã“ã‚Œã¯ã‚¹ã‚¯ãƒªãƒ—トãŒé‡‘éŠmoney() イベントã«è¿½åŠ ã•ã‚ŒãŸå ´åˆã«ã®ã¿ä½œå‹•ã—ã¾ã™ã€‚ - <form name="form"> - <ignore name="ignore" text="money()イベントãªã—ã«ã€Œã‚ªãƒ–ジェクトã«æ”¯æ‰•ã†ã€ã‚’è¨å®šã™ã‚‹ã¨ã"/> - </form> - </notification> - <notification name="OpenObjectCannotCopy"> - ã“ã®ã‚ªãƒ–ジェクトã«ã¯ã€ã‚ãªãŸãŒã‚³ãƒ”ーã§ãるアイテムã¯ã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="WebLaunchAccountHistory"> - [SECOND_LIFE] ウェブ・ページを開ã„㦠-アカウント履æ´ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="アカウント履æ´ã®ã‚¦ã‚§ãƒ–・ページをãƒãƒ¼ãƒ‰ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> - </notification> - <notification name="ClickOpenF1Help"> - [SECOND_LIFE] ã®ã‚µãƒãƒ¼ãƒˆã‚¦ã‚§ãƒ–サイトを利用ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="[SECOND_LIFE] ã®ã‚µãƒãƒ¼ãƒˆã‚¦ã‚§ãƒ–サイトを閲覧ã™ã‚‹ã«ã‚ãŸã£ã¦ã€‚" name="okcancelignore" notext="ã‚ャンセル" yestext="è¡Œã"/> - </notification> - <notification name="ConfirmQuit"> - 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="[APP_NAME] ã®çµ‚了ã«ã‚ãŸã£ã¦ã€‚" name="okcancelignore" notext="継続" yestext="終了"/> - </notification> - <notification name="HelpReportAbuseEmailLL"> - 利用è¦ç´„é•åã¨ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰é•åã®å ±å‘Šã«ã“ã®ãƒ„ールをã”使用ãã ã•ã„。 å‚照: - -http://secondlife.com/corporate/tos.php -http://secondlife.com/corporate/cs.php - -利用è¦ç´„é•åã¨ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰é•åã«é–¢ã™ã‚‹å…¨ã¦ã®ãƒ¬ãƒãƒ¼ãƒˆã¯ã€èª¿æŸ»ã•ã‚Œã€è§£æ±ºã•ã‚Œã¾ã™ã€‚ -以下ã®ãƒªãƒ³ã‚¯å…ˆã®è¢«å®³å ±å‘Šã«ã¦ãã®ç¢ºèªã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - -http://secondlife.com/support/incidentreport.php - </notification> - <notification name="HelpReportAbuseEmailEO"> - é‡è¦ï¼š ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã¯Linden Lab 社ã§ã¯ãªã〠-ã‚ãªãŸãŒç¾åœ¨ã„る地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«é€ã‚‰ã‚Œã¾ã™ã€‚ -- -ã‚ãªãŸãŒä»Šã„る地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€ -ä½äººã¨è¨ªå•è€…ã¸ã®ã‚µãƒ¼ãƒ“スã®ä¸€ç’°ã¨ã—ã¦ã€ã“ã®åœ°åŸŸã‹ã‚‰ã®ãƒ¬ãƒãƒ¼ãƒˆã‚’ã™ã¹ã¦å—ã‘付ã‘ã€è§£æ±ºã™ã‚‹ã“ã¨ã«åŒæ„ã—ã¦ã„ã¾ã™ã€‚ -よã£ã¦Linden Lab 社ãŒã€ -ã‚ãªãŸãŒã“ã“ã‹ã‚‰æ出ã™ã‚‹ãƒ¬ãƒãƒ¼ãƒˆã‚’調査ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。 -地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€ä¸å‹•ç”£ç´„款ã§æŒ‡å®šã—ã¦ã„る地元ã®è¦å‰‡ã‚’基ã«ã€å ±å‘Šã•ã‚ŒãŸå•é¡Œã‚’解決ã—ã¾ã™ã€‚ -(「世界ã€ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€ŒåœŸåœ°æƒ…å ±ã€ã‚’é¸ã¶ã¨ã€ç´„款を閲覧ã§ãã¾ã™ï¼‰ -- -ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã«é–¢ã™ã‚‹è§£æ±ºç–ã¯ã€ã“ã®åœ°åŸŸã«ã ã‘当ã¦ã¯ã¾ã‚Šã¾ã™ã€‚ -ä½äººãŒ[SECOND_LIFE] ã®ä»–ã®åœ°åŸŸã¸ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹éš›ã€ -ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã®çµæžœã«å½±éŸ¿ã•ã‚Œã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。 -Linden Lab 社ã ã‘ãŒ[SECOND_LIFE] 全域ã«ãŠã‘ã‚‹ -アクセス制é™æ¨©ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="HelpReportAbuseSelectCategory"> - å«ŒãŒã‚‰ã›å ±å‘Šã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。 -カテゴリをé¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ - </notification> - <notification name="HelpReportAbuseAbuserNameEmpty"> - å«ŒãŒã‚‰ã›è¡Œç‚ºã‚’ã—ãŸäººã®åå‰ã‚’入力ã—ã¦ãã ã•ã„。 -æ£ç¢ºãªæƒ…å ±ã®å…¥åŠ›ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ - </notification> - <notification name="HelpReportAbuseAbuserLocationEmpty"> - å«ŒãŒã‚‰ã›ãŒã‚ã£ãŸå ´æ‰€ã‚’入力ã—ã¦ãã ã•ã„。 -æ£ç¢ºãªæƒ…å ±ã®å…¥åŠ›ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ - </notification> - <notification name="HelpReportAbuseSummaryEmpty"> - å«ŒãŒã‚‰ã›ã®æ¦‚è¦ã‚’入力ã—ã¦ãã ã•ã„。 -æ£ç¢ºãªæ¦‚è¦ã®å…¥åŠ›ã«ã‚ˆã‚Šã€ -å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ - </notification> - <notification name="HelpReportAbuseDetailsEmpty"> - å«ŒãŒã‚‰ã›ã®è©³ç´°ãªèª¬æ˜Žã‚’入力ã—ã¦ãã ã•ã„。 -åå‰ã‚„å«ŒãŒã‚‰ã›ã®è©³ç´°ã‚’ã€ã§ãã‚‹ã ã‘具体的ã«å…¥åŠ›ã—ã¦ãã ã•ã„。 - -æ£ç¢ºãªèª¬æ˜Žã®å…¥åŠ›ã«ã‚ˆã‚Šã€ -å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ - </notification> - <notification name="HelpReportAbuseContainsCopyright"> - ä½äººã®çš†æ§˜ã¸ã€ - -知的財産ã®ä¾µå®³ã«é–¢ã™ã‚‹å ±å‘Šã‚’è¡Œã†éš›ã«ã¯ã€ä»¥ä¸‹ã®ç‚¹ã«æ³¨æ„ã—ã¦ãã ã•ã„。 - -(1) å«ŒãŒã‚‰ã›ã®å ±å‘Šã®ãƒ—ãƒã‚»ã‚¹ -[SECOND_LIFE] ã®æ¨©é™ã‚·ã‚¹ãƒ†ãƒ を悪用ã—ã¦ã„ã‚‹ä½äººã‚’見ã¤ã‘ãŸã‚‰ã€ -å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’è¡Œã£ã¦ãã ã•ã„。 -例ãˆã°ã‚³ãƒ”ーBotã®ä½¿ç”¨ã€ãã‚Œã«ä¼¼ãŸãƒ„ールã®ä½¿ç”¨ã«ã‚ˆã‚‹çŸ¥çš„財産権ã®ä¾µå®³ãŒã‚ã‚Šã¾ã™ã€‚ -アビューズãƒãƒ¼ãƒ ã¯èª¿æŸ»ã«åŸºã¥ã〠-[SECOND_LIFE] ã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ã‚„ -利用è¦ç´„ã«é•åã™ã‚‹è¡Œç‚ºã¨åˆ¤æ–ã•ã‚ŒãŸå ´åˆã«ã¯é©åˆ‡ãªå‡¦ç½®ã‚’è¡Œã£ã¦ã„ã¾ã™ã€‚ -ãŸã ã—ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’[SECOND_LIFE] ã‹ã‚‰æ’¤åŽ»ã—ã¦ã»ã—ã„〠-ã¨ã„ã£ãŸè¦æœ›ã«ã¯ã‚¢ãƒ“ューズãƒãƒ¼ãƒ ã¯å¿œãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - -(2) DMCA(デジタルミレニアム著作権法)åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„撤去プãƒã‚»ã‚¹ -[SECOND_LIFE] ã‹ã‚‰ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»ã‚’リクエストã™ã‚‹ã«ã¯ã€ -著作権侵害通知ã®æ出を行ã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ -å‚照: http://secondlife.com/corporate/dmca.php - -ã“ã®ä»¶ã«é–¢ã™ã‚‹å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’続ã‘ã‚‹éš›ã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦ãã ã•ã„。é¸æŠžã™ã¹ãカテゴリã¯ã€ŒçŸ¥çš„財産ã®ä¾µå®³ï¼žã‚³ãƒ”ーBotåŠã³æ¨©é™ã®æ‚ªç”¨ã€ã®ã»ã†ãŒé©ã—ã¦ã„ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ã®ã§ã”確èªãã ã•ã„。 - -よã‚ã—ããŠé¡˜ã„ã—ã¾ã™ã€‚ - -Linden Lab - </notification> - <notification name="FailedRequirementsCheck"> - 以下ã®å¿…è¦ãªã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒã€[FLOATER]ã‹ã‚‰æŠœã‘è½ã¡ã¦ã„ã¾ã™ -[COMPONENTS] - </notification> - <notification label="æ—¢å˜ã®ä»˜å±žå“ã‚’ç½®æ›" name="ReplaceAttachment"> - 体ã®ã“ã®éƒ¨ä½ã«ã¯ã‚ªãƒ–ジェクトãŒè£…ç€ã•ã‚Œã¦ã„ã¾ã™ã€‚ -é¸æŠžã•ã‚ŒãŸã‚ªãƒ–ジェクトã¨ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ - <form name="form"> - <ignore name="ignore" save_option="true" text="ç¾åœ¨ã€è£…ç€ã—ã¦ã„ã‚‹ã‚‚ã®ã‚’ç½®æ›ã™ã‚‹ã¨ã"/> - <button ignore="自動的ã«äº¤æ›" name="Yes" text="OK"/> - <button ignore="交æ›ã—ãªã„" name="No" text="ã‚ャンセル"/> - </form> - </notification> - <notification label="å–ã‚Šè¾¼ã¿ä¸ã®è¦å‘Š" name="BusyModePay"> - ç¾åœ¨ã€å–ã‚Šè¾¼ã¿ä¸ã®ãŸã‚ã€ã“ã®æ”¯æ‰•ã„㨠-引ãæ›ãˆã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒ -ã§ãã¾ã›ã‚“。 - -ã“ã®å–引を完了ã™ã‚‹å‰ã«ã€å–ã‚Šè¾¼ã¿ä¸ã®è¨å®šã‚’解除ã—ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <ignore name="ignore" save_option="true" text="å–ã‚Šè¾¼ã¿ä¸ã®äººã¾ãŸã¯ã‚ªãƒ–ジェクトã«æ”¯æ‰•ã†ã¨ã"/> - <button ignore="常ã«å–ã‚Šè¾¼ã¿ä¸ã®è¨å®š" name="Yes" text="OK"/> - <button ignore="å–ã‚Šè¾¼ã¿ä¸ã®è¨å®šã«ã—ãªã„" name="No" text="ã‚ャンセル"/> - </form> - </notification> - <notification name="ConfirmEmptyTrash"> - ゴミ箱フォルダã®ä¸èº«ã‚’完全ã«å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="æŒã¡ç‰©å†…ã®ã€Œã”ã¿ç®±ã€ãƒ•ã‚©ãƒ«ãƒ€ã‚’空ã«ã™ã‚‹ã¨ã" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> - </notification> - <notification name="ConfirmClearBrowserCache"> - 本当ã«ãƒ–ラウザã®ã‚ャッシュをクリアã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> - </notification> - <notification name="ConfirmClearCookies"> - 本当ã«ã‚¯ãƒƒã‚ーをクリアã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> - </notification> - <notification name="ConfirmClearMediaUrlList"> - ä¿å˜ã•ã‚ŒãŸ URL ã®ãƒªã‚¹ãƒˆã‚’消去ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> - </notification> - <notification name="ConfirmEmptyLostAndFound"> - éºå¤±ç‰©ãƒ•ã‚©ãƒ«ãƒ€ã®ä¸èº«ã‚’完全ã«å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="æŒã¡ç‰©å†…ã®ã€Œéºå¤±ç‰©ã€ãƒ•ã‚©ãƒ«ãƒ€ã‚’空ã«ã™ã‚‹ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="CopySLURL"> - 以下ã®SLurlãŒã‚¯ãƒªãƒƒãƒ—ボードã«ã‚³ãƒ”ーã•ã‚Œã¾ã—ãŸã€‚ - [SLURL] - -ä»–ã®äººãŒã‚¢ã‚¯ã‚»ã‚¹ã—ã‚„ã™ã„よã†ã«ã‚¦ã‚§ãƒ–・ページã«è¼‰ã›ãŸã‚Šã€ -ブラウザã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒ»ãƒãƒ¼ã«è²¼ã‚Šä»˜ã‘ã¦ã€è‡ªåˆ†ã§ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã¿ã¾ã—ょã†ã€‚ - <form name="form"> - <ignore name="ignore" text="SLurlをクリップボードã«ã‚³ãƒ”ーã™ã‚‹ã¨ã"/> - </form> - </notification> - <notification name="GraphicsPreferencesHelp"> - ã“ã®ãƒ‘ãƒãƒ«ã§ã¯ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ã‚µã‚¤ã‚ºã¨è§£åƒåº¦ã€ãŠã‚ˆã³ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®å“質をè¨å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚「環境è¨å®šã€ï¼žã€Œè¡¨ç¤ºã€ã®ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ã§ã¯ã€ä½Žã€ä¸ã€é«˜ã€è¶…高ã®4ã¤ã®ä¸ã‹ã‚‰ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ãƒ¬ãƒ™ãƒ«ã‚’é¸æŠžã§ãã¾ã™ã€‚ã¾ãŸã€ã€Œã‚«ã‚¹ã‚¿ãƒ ã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’クリックã—ã€ä»¥ä¸‹ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚¹ã®è¨å®šã‚’カスタマイズã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ - -シェーダー:ピクセル・シェーダーã®ã•ã¾ã–ã¾ãªç¨®é¡žã‚’有効ã¾ãŸã¯ç„¡åŠ¹ã«ã—ã¾ã™ã€‚ - -å射詳細:水ãŒåå°„ã™ã‚‹ã‚ªãƒ–ジェクトã®ç¨®é¡žã‚’è¨å®šã—ã¾ã™ã€‚ - -ã‚¢ãƒã‚¿ãƒ¼ãƒ»ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ï¼šã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã‚‹ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°æ–¹æ³•ã«å½±éŸ¿ã™ã‚‹ã‚ªãƒ—ションをè¨å®šã—ã¾ã™ã€‚ - -æç”»è·é›¢ï¼šã‚ãªãŸã®è¦–点ã‹ã‚‰è¦–ç•Œã®ã©ã®ãらã„ã®è·é›¢ã¾ã§ã€ã‚ªãƒ–ジェクトãŒãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•ã‚Œã‚‹ã‹ã«å½±éŸ¿ã—ã¾ã™ã€‚ - -最大パーティクル数:画é¢ã«ä¸€åº¦ã«è¦‹ã‚‹ã“ã¨ãŒã§ãるパーティクルã®æœ€å¤§æ•°ã‚’è¨å®šã—ã¾ã™ã€‚ - -ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹å“質:グãƒãƒ¼åŠ¹æžœï¼ˆè¼ã)ãŒãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•ã‚Œã‚‹éš›ã®è§£åƒåº¦ã‚’è¨å®šã—ã¾ã™ã€‚ - -メッシュ詳細: 特定ã®ã‚ªãƒ–ジェクトã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°æ™‚ã®ç´°éƒ¨è¡¨ç¾ã€ã¾ãŸã¯ä¸‰è§’å½¢ã®æ•°ã‚’è¨å®šã—ã¾ã™ã€‚ 値を大ããã™ã‚‹ã»ã©ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã«æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™ãŒã€ã‚ªãƒ–ジェクトãŒã‚ˆã‚Šè©³ç´°ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ - -ライティング詳細:レンダリングã™ã‚‹å…‰æºã®ç¨®é¡žã‚’é¸æŠžã—ã¾ã™ã€‚ - -地形詳細: 地形テクスãƒãƒ£ã®ç´°éƒ¨è¡¨ç¾ã‚’è¨å®šã—ã¾ã™ã€‚ - </notification> - <notification name="WLSavePresetAlert"> - ä¿å˜ã•ã‚ŒãŸäº‹å‰è¨å®šã‚’上書ãã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="WLDeletePresetAlert"> - [SKY] を削除ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="WLNoEditDefault"> - デフォルトã®è¨å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="WLMissingSky"> - ã“ã®ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®å˜åœ¨ã—ãªã„「空ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ï¼š [SKY]。 - </notification> - <notification name="PPSaveEffectAlert"> - ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹åŠ¹æžœãŒå˜åœ¨ã—ã¾ã™ã€‚ 上書ãã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="HelpEditSky"> - ウィンドライトã®å„種スライダーを編集ã—ã¦ç©ºã‚’作æˆãŠã‚ˆã³ä¿å˜ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpEditDayCycle"> - 1 日を通ã—ã¦å¤‰åŒ–ã™ã‚‹ç©ºã®æ§˜åã‚’è¨å®šã—ã¾ã™ã€‚ - </notification> - <notification name="EnvSettingsHelpButton"> - 次ã®å„è¨å®šã¯ã‚³ãƒ³ãƒ”ュータ上ã§ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ç’°å¢ƒãŒã©ã®ã‚ˆã†ã«è¡¨ç¤ºã•ã‚Œã‚‹ã‹ã‚’調整ã—ã¾ã™ã€‚ è¨å®šã®ã™ã¹ã¦ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚«ãƒ¼ãƒ‰ãŒå‘¨å›²ï¼ˆå¤§æ°—)シェーダー (atmospheric shaders) をサãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - -「時間帯ã€ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã‚’調整ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šãƒ“ューワã§å®Ÿéš›ã«ä½¿ç”¨ã™ã‚‹æ™‚間帯を変更ã§ãã¾ã™ã€‚ - -「雲ã®é‡ã€ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã‚’調整ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šç©ºã‚’ãŠãŠã†é›²ã®é‡ã‚’制御ã§ãã¾ã™ã€‚ - -「水ã®è‰²ã€ã‚«ãƒ©ãƒ¼ãƒ»ãƒ”ッカーã§è‰²ã‚’é¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šæ°´ã®è‰²ã‚’変更ã§ãã¾ã™ã€‚ - -「水ä¸ã®ãƒ•ã‚©ã‚°åŠ¹æžœã€ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã‚’調整ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šæ°´ã®é€æ˜Žåº¦ã‚’制御ã§ãã¾ã™ã€‚ - -「ä¸å‹•ç”£ã®æ™‚刻を使用ã€ã‚’クリックã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šæ™‚刻ã¯ãƒªã‚»ãƒƒãƒˆã•ã‚Œåœ°åŸŸã®ç¾åœ¨æ™‚刻ã«é€£å‹•ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - -「空ã®é«˜åº¦ãªè¨å®šã€ã‚’クリックã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šç©ºã®ã‚ˆã‚Šé«˜åº¦ãªè¨å®šã‚’è¡Œã†ãŸã‚ã®ç·¨é›†ãƒ—ãƒã‚°ãƒ©ãƒ ã‚’èµ·å‹•ã§ãã¾ã™ã€‚ - -「水ã®é«˜åº¦ãªè¨å®šã€ã‚’クリックã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šæ°´ã®ã‚ˆã‚Šé«˜åº¦ãªè¨å®šã‚’è¡Œã†ãŸã‚ã®ç·¨é›†ãƒ—ãƒã‚°ãƒ©ãƒ ã‚’èµ·å‹•ã§ãã¾ã™ã€‚ - </notification> - <notification name="HelpDayCycle"> - 「デイ・サイクル編集ã€ã§ã¯ã€ -[SECOND_LIFE] ã§ã®æ˜¼ã¨å¤œã®ç©ºã®å¤‰åŒ–を制御ã§ãã¾ã™ã€‚ -ã“ã‚Œã¯ã€ŒåŸºæœ¬ç’°å¢ƒç·¨é›†ã€ã®ã€Œæ™‚間帯ã€ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã§ä½¿ç”¨ã•ã‚Œã‚‹ã‚µã‚¤ã‚¯ãƒ«ã§ã™ã€‚ - -「デイ・サイクル編集ã€ã¯ã‚ーフレームをè¨å®šã™ã‚‹ã“ã¨ã§æ©Ÿèƒ½ã—ã¾ã™ã€‚ -å„ã‚ーフレームã«ã¯ãƒ—リセットã•ã‚ŒãŸç©ºã®è¨å®šãŒé–¢é€£ä»˜ã‘られã¦ã„ã¾ã™ã€‚(時間グラフã«ç°è‰²ã®ç¯€ã¨ã—ã¦è¡¨ç¤ºã•ã‚Œã¾ã™ï¼‰ -ウィンドライト( WindLight )ã¯ã‚ーフレーム間をデータ補間ã—〠-時間ã®çµŒéŽã¨ã¨ã‚‚ã«ç©ºã®è‡ªç„¶ãªã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’作り出ã—ã¾ã™ã€‚ - -時間グラフã®ä¸Šã«è¡¨ç¤ºã•ã‚Œã‚‹é»„色ã®çŸ¢å°ã¯ã€æ™‚刻をもã¨ã«ã—ãŸç¾åœ¨ã®çœºã‚を表ã—ã¦ã„ã¾ã™ã€‚ -黄色ã®çŸ¢å°ã‚’クリック&ドラッグã™ã‚‹ã“ã¨ã§ã€ -1 æ—¥ã®ç§»ã‚Šå¤‰ã‚りを見るã“ã¨ãŒã§ãã¾ã™ã€‚ -「ã‚ーã®è¿½åŠ ã€ãƒœã‚¿ãƒ³ã¾ãŸã¯ã€Œã‚ーã®å‰Šé™¤ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€ -時間グラフã®å³å´ã«ã‚ãƒ¼ãƒ•ãƒ¬ãƒ¼ãƒ ã‚’è¿½åŠ ã‚ã‚‹ã„ã¯å‰Šé™¤ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - -ã‚ーフレームã®æ™‚刻を指定ã™ã‚‹ã«ã¯ã€ -時間グラフã«æ²¿ã£ã¦ãƒ‰ãƒ©ãƒƒã‚°ã™ã‚‹ã‹ã€Œã‚ーフレームã®è¨å®šã€ã®ãƒ•ãƒ¬ãƒ¼ãƒ 内ã§å€¤ã‚’直接入力ã—ã¾ã™ã€‚ -「ã‚ーフレームã®è¨å®šã€ã®ãƒ•ãƒ¬ãƒ¼ãƒ 内ã§ã¯ã‚ーフレームã«ã‚¦ã‚£ãƒ³ãƒ‰ãƒ©ã‚¤ãƒˆï¼ˆ WindLight )ã®äº‹å‰è¨å®šã‚’関連付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - -「サイクルã®é•·ã•ã€ã§ã¯1 日全体ã®æ™‚間を指定ã§ãã¾ã™ã€‚ -ã“ã®å€¤ã‚’低ãè¨å®šã™ã‚‹ã¨ï¼ˆä¾‹ãˆã°2分)ã€24 時間ã®æ™‚間グラフ㯠-実時間㮠2 分間ã«ç›¸å½“ã™ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ -時間グラフã¨ã‚ーフレーム・サイクルã®è¨å®šãŒå®Œäº†ã—ãŸã‚‰ã€ -「å†ç”Ÿã€ãƒœã‚¿ãƒ³ã¨ã€Œåœæ¢ã€ãƒœã‚¿ãƒ³ã‚’使用ã—ã¦çµæžœã‚’プレビューã—ã¦ã¿ã¾ã—ょã†ã€‚ -ã¾ãŸã€æ™‚間グラフ上ã®é»„色ã„時刻表示矢å°ã‚’移動ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ã‚‚サイクルã®å¤‰åŒ–をインタラクティブã«ç¢ºèªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 「ä¸å‹•ç”£ã®æ™‚刻を使用ã€ãƒœã‚¿ãƒ³ã‚’使用ã™ã‚‹ã“ã¨ã§æ—¥ã®é•·ã•ã¨æ™‚刻ãŒä¸å‹•ç”£ã®ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã«åŒæœŸã•ã‚Œã¾ã™ã€‚ - -デイ・サイクルã®è¨å®šãŒå®Œäº†ã—ãŸã‚‰ã€ã€Œãƒ‡ã‚¤ãƒ»ãƒ†ã‚¹ãƒˆã‚’ä¿å˜ã€ãƒœã‚¿ãƒ³ãŠã‚ˆã³ã€Œãƒ‡ã‚¤ãƒ»ãƒ†ã‚¹ãƒˆã‚’ãƒãƒ¼ãƒ‰ã€ãƒœã‚¿ãƒ³ã‚’使用ã—ã¦ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã‚’ä¿å˜ãŠã‚ˆã³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã€‚ -å°šã€ç¾åœ¨ã®ä»•æ§˜ã§ã¯ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã§æŒ‡å®šã§ãã‚‹ã®ã¯ -1 日分ã ã‘ã§ã™ã€‚ - </notification> - <notification name="HelpBlueHorizon"> - 空ã®è‰²ã‚’調整ã™ã‚‹ã«ã¯ 「R〠(赤)ã€ã€ŒG〠(緑)ã€ã€ŒB〠(é’) ã®å„スライダーを使用ã—ã¾ã™ã€‚  「I〠スライダーを使用ã™ã‚‹ã¨ã€3 ã¤ã® RGB スライダーを一斉ã«å‹•ã‹ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ - </notification> - <notification name="HelpHazeHorizon"> - 「空ã¨é 景ã®éœ²å…‰ã€ã¯é¢¨æ™¯ã®éœ²å…‰é‡å…¨ä½“を調整ã™ã‚‹ä¸Šã§æœ€ã‚‚便利ãªãƒ‘ラメーター㮠1 ã¤ã§ã™ã€‚ 太陽光ã«ã‚ˆã‚‹ãƒ›ãƒ¯ã‚¤ãƒˆã‚¢ã‚¦ãƒˆç¾è±¡ã‚„æš—ã絞り込んã è¨å®šãªã©ã€ã•ã¾ã–ã¾ãªéœ²å‡ºè¨å®šã‚’シミュレーションã§ãã¾ã™ã€‚ - </notification> - <notification name="HelpBlueDensity"> - 「空ã®é…色ã¨æ¿ƒåº¦ã€ã¯ç©ºã¨éœ§ã®å½©åº¦å…¨ä½“ã«å½±éŸ¿ã—ã¾ã™ã€‚ 「I〠スライダーをå³ã«ç§»å‹•ã™ã‚‹ã¨è‰²ã¯æ˜Žã‚‹ããã£ãã‚Šã¨ãªã‚Šã¾ã™ã€‚ -ã“ã®ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã‚’左端ã«ç§»å‹•ã™ã‚‹ã¨ã€è‰²ã¯å½©ã‚Šã‚’失ã„ã€ç™½é»’ã«é€€è‰²ã—ã¾ã™ã€‚ 空ã®è‰²ã‚’微調整ã™ã‚‹å ´åˆã¯ã€ -「R〠(赤)〠「G〠(緑)〠「B〠(é’) -ã®å„スライダーを使用ã—ã¦å½©åº¦ã‚’個別ã«åˆ¶å¾¡ã§ãã¾ã™ã€‚ - </notification> - <notification name="HelpHazeDensity"> - 「大気ã®ä¸é€æ˜Žåº¦ã€ã¯å¤§æ°—ä¸ã®ã©ã‚“よりã¨ã—ãŸç©ºã®é›°å›²æ°—ã€ã‚°ãƒ¬ãƒ¼ãŒã‹ã£ãŸéœ§ã®ãƒ¬ãƒ™ãƒ«ã‚’制御ã—ã¾ã™ã€‚ 濃ã„煙や大気汚染ãªã© -を表ç¾ã™ã‚‹ã®ã«é©ã—ã¦ã„ã¾ã™ã€‚ 霧やもやãªã©ã®è¡¨ç¾æ‰‹æ®µã¨ã—ã¦ã‚‚効果的ã§ã™ã€‚ - </notification> - <notification name="HelpDensityMult"> - 「大気ã®ä¸é€æ˜Žåº¦ã®å¢—å¹…ã€ã¯ç©ºæ°—ã®æ¿ƒåº¦å…¨ä½“を制御ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã§ãã¾ã™ã€‚ ã“ã®å€¤ã‚’低ãè¨å®šã™ã‚‹ã¨ã€Œå¤§æ°—ã®è–„ã„状態ã€ã‚’演出ã—ã€é«˜ã„数値ã«è¨å®šã™ã‚‹ã¨ã¨ã¦ã‚‚ã©ã‚“よりã¨ã—ãŸã‚¹ãƒ¢ãƒƒã‚°ã®ã‹ã‹ã£ãŸé›°å›²æ°—を表ç¾ã§ãã¾ã™ã€‚ - </notification> - <notification name="HelpDistanceMult"> - ウィンドライトã®è¦–覚的è·é›¢ã‚’調整ã—ã¾ã™ã€‚ 値ã¨ã—ã¦ã‚¼ãƒã‚’è¨å®šã™ã‚‹ã¨ã€åœ°å½¢ãŠã‚ˆã³ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ -ウィンドライトã®å½±éŸ¿ã‚’効果的ã«å–り消ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ 1 より大ããªå€¤ã‚’è¨å®šã™ã‚‹å ´åˆã€å€¤ãŒå¤§ãããªã‚‹ã«ã¤ã‚Œã¦ -大気ãŒæ¬¡ç¬¬ã«æ¿ƒããªã‚‹ã‚ˆã†ãªåŠ¹æžœãŒå¾—られã¾ã™ã€‚ - </notification> - <notification name="HelpMaxAltitude"> - 「最大高度ã€ã§ã¯å¤§æ°—ä¸ã®å…‰ã®é‡ã‚’算出ã™ã‚‹ã¨ãã« -ウィンドライトãŒç®—出ã—ãŸé«˜åº¦ã‚’調整ã—ã¾ã™ã€‚ -1æ—¥ã®çµ‚ã‚ã‚Šã«å¤•ç„¼ã‘ã®åº¦åˆã„を調整ã™ã‚‹ã¨ãã«å½¹ç«‹ã¡ã¾ã™ã€‚ - </notification> - <notification name="HelpSunlightColor"> - 風景ã®ä¸ã§ç›´å°„日光ã®è‰²ã‚„å¼·ã•ã‚’調整ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpSunAmbient"> - 風景ã®ä¸ã§å‘¨å›²ã‚’ã¨ã‚Šã¾ã大気ä¸ã®ã‚¢ãƒ³ãƒ“エント光ã®è‰²ã‚„å¼·ã•ã‚’調整ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpSunGlow"> - 「サイズã€ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã¯å¤ªé™½ã®å¤§ãã•ã‚’制御ã—ã¾ã™ã€‚ -「フォーカスã€ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã¯ç©ºã‚’背ã«ã—ãŸå¤ªé™½ã®ã‹ã™ã¿å…·åˆã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpSceneGamma"> - 風景ã®ä¸ã§æ˜Žæš—ã®é…分を調整ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpStarBrightness"> - 空ã®æ˜Ÿã®è¼ãを調整ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpTimeOfDay"> - 空ã®å¤ªé™½ã®å ´æ‰€ã‚’調整ã—ã¾ã™ã€‚ -標高ã«ä¼¼ã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="HelpEastAngle"> - 空ã®å¤ªé™½ã®å ´æ‰€ã‚’調整ã—ã¾ã™ã€‚ -æ–¹ä½è§’ã«ä¼¼ã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="HelpCloudColor"> - 雲ã®è‰²ã‚’編集ã—ã¾ã™ã€‚ 通常ã¯ç™½ã£ã½ã„色をãŠå‹§ã‚ã—ã¾ã™ãŒã€ã‚‚ã¡ã‚ã‚“ -ãŠå¥½ã¿ã®è‰²ã‚’è¨å®šã—ã¦ãã ã•ã„。 - </notification> - <notification name="HelpCloudDetail"> - 主è¦ãªé›²ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã®ä¸Šã«ãƒ¬ã‚¤ãƒ¤ãƒ¼ã•ã‚ŒãŸè©³ç´°ãªã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’制御ã—ã¾ã™ã€‚ X 㨠Y ã§ãã®ä½ç½®ã‚’制御ã—ã¾ã™ã€‚ -「Dã€ï¼ˆæ¿ƒåº¦ï¼‰ã¯çœŸç¶¿ã®ã‚ˆã†ãªæ§˜åや〠-雲ã®å‰²ã‚Œç›®ã®æ§˜åãªã©é›²ã®å¤–観を制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpCloudDensity"> - 「X〠㨠「Y〠ã®ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã§é›²ã®ä½ç½®ã‚’〠-「Dã€ã®ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã§ãã®å¯†åº¦ã‚’制御ã§ãã¾ã™ã€‚ - </notification> - <notification name="HelpCloudCoverage"> - 空を覆ã†é›²ã®é‡ã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpCloudScale"> - 空ã«æµ®ã‹ã¶é›²ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã®ç¸®å°ºã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpCloudScrollX"> - 「X〠ã®æ–¹å‘ã«é›²ãŒç§»å‹•ã™ã‚‹éš›ã®é€Ÿåº¦ã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpCloudScrollY"> - 「Y〠ã®æ–¹å‘ã«é›²ãŒç§»å‹•ã™ã‚‹éš›ã®é€Ÿåº¦ã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpClassicClouds"> - ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’有効ã«ã™ã‚‹ã¨ã€WindLight ã®é›²ã«åŠ ãˆã¦ã€[SECOND_LIFE] ã®å¾“æ¥ã®é›²ã‚‚レンダリングã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ - </notification> - <notification name="HelpWaterFogColor"> - æ°´ä¸ã®ãƒ•ã‚©ã‚°åŠ¹æžœã«è‰²ã‚’ã¤ã‘ã¾ã™ã€‚ - </notification> - <notification name="HelpWaterFogDensity"> - æ°´ä¸ã®ãƒ•ã‚©ã‚°åŠ¹æžœã®å¼·å¼±ã€æ°´ä¸ã§ã©ã®ãらã„ã®è·é›¢ã¾ã§è¦‹æ¸¡ã›ã‚‹ã‹ã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpUnderWaterFogMod"> - 「水ä¸ã®ãƒ•ã‚©ã‚°æ¿ƒåº¦æŒ‡æ•°ã€ã®åŠ¹æžœã‚’åŠ æ¸›ã—ã¦ã€ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ãŒæ°´ä¸ã«ã„ã‚‹ã¨ãã€ã©ã®ãらã„é ãã¾ã§è¦‹ã‚‹ã“ã¨ãŒã§ãã‚‹ã‹ã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpWaterGlow"> - æ°´é¢ã®è¼ãã®åº¦åˆã„を制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpWaterNormalScale"> - æ°´é¢ã‚’表ç¾ã™ã‚‹ 3 種類ã®ã•ã–æ³¢ã®ç¸®å°ºã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpWaterFresnelScale"> - ã•ã¾ã–ã¾ãªè§’度ã§ã€åå°„ã™ã‚‹å…‰ã®é‡ã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpWaterFresnelOffset"> - åå°„ã™ã‚‹å…‰åº¦ã®é‡ã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpWaterScaleAbove"> - 上ã‹ã‚‰æ°´ä¸ã‚’見ãŸã¨ãã®å…‰ã®å±ˆæŠ˜å…·åˆã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpWaterScaleBelow"> - æ°´ä¸ã‹ã‚‰è¦‹ãŸã¨ãã®å…‰ã®å±ˆæŠ˜å…·åˆã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpWaterBlurMultiplier"> - æ³¢ã¨åå°„ã®æ··ã–ã‚Šå…·åˆã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpWaterNormalMap"> - å射や屈折を決定ã™ã‚‹ãŸã‚ã«æ°´ã«é‡ãられるノーマル・マップを制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpWaterWave1"> - 拡大ã•ã‚ŒãŸãƒŽãƒ¼ãƒžãƒ«ãƒ»ãƒžãƒƒãƒ—ãŒç§»å‹•ã™ã‚‹æ–¹å‘(X 軸㨠Y 軸ã§è¡¨ç¾ï¼‰ã¨é€Ÿåº¦ã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="HelpWaterWave2"> - 縮å°ã•ã‚ŒãŸãƒŽãƒ¼ãƒžãƒ«ãƒ»ãƒžãƒƒãƒ—ãŒç§»å‹•ã™ã‚‹æ–¹å‘(X 軸㨠Y 軸ã§è¡¨ç¾ï¼‰ã¨é€Ÿåº¦ã‚’制御ã—ã¾ã™ã€‚ - </notification> - <notification name="NewSkyPreset"> - æ–°ã—ã„空ã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。 - <form name="form"> - <input name="message"> - æ–°ã—ã„事å‰è¨å®š - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="ã‚ャンセル"/> - </form> - </notification> - <notification name="ExistsSkyPresetAlert"> - 事å‰è¨å®šãŒã™ã§ã«å˜åœ¨ã—ã¾ã™ï¼ - </notification> - <notification name="NewWaterPreset"> - æ–°ã—ã„æ°´ã®äº‹å‰è¨å®šã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。 - <form name="form"> - <input name="message"> - æ–°ã—ã„事å‰è¨å®š - </input> - <button name="OK" text="OK"/> - <button name="Cancel" text="ã‚ャンセル"/> - </form> - </notification> - <notification name="ExistsWaterPresetAlert"> - 事å‰è¨å®šãŒã™ã§ã«å˜åœ¨ã—ã¾ã™ï¼ - </notification> - <notification name="WaterNoEditDefault"> - デフォルトã®è¨å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="ChatterBoxSessionStartError"> - [RECIPIENT]ã¨ã®æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆã‚’開始ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ChatterBoxSessionEventError"> - [EVENT] -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="ForceCloseChatterBoxSession"> - [NAME]ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é–‰ã˜ã¾ã™ã€‚ -[REASON] - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="Cannot_Purchase_an_Attachment"> - アイテムãŒæ·»ä»˜ç‰©ã®ä¸€éƒ¨ã§ã‚ã‚‹é–“ã¯ã€ -アイテムを購入ã§ãã¾ã›ã‚“。 - </notification> - <notification label="デビット許å¯ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¤ã„ã¦" name="DebitPermissionDetails"> - ã“ã®è¦æ±‚を許å¯ã™ã‚‹ã¨ã€ã‚¹ã‚¯ãƒªãƒ—トã‹ã‚‰ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’課金ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ -ã“ã®è¨±å¯ã‚’å–り消ã™ã«ã¯ã€ã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã‚ªãƒ–ジェクトを削除ã™ã‚‹ã‹ã€ã‚ªãƒ–ジェクトã®ã‚¹ã‚¯ãƒªãƒ—トをリセットã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 - <usetemplate name="okbutton" yestext="OK"/> - </notification> - <notification name="AutoWearNewClothing"> - ã‚ãªãŸãŒä½œæˆã—ãŸæœã‚¢ã‚¤ãƒ†ãƒ を自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate ignoretext="æ–°ã—ã„æœã‚’自動的ã«è£…ç€ã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="NotAgeVerified"> - ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã«ã¯ã€ -年齢確èªã‚’è¡Œã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ -[SECOND_LIFE] ã®ã‚¦ã‚§ãƒ–サイトã«ã‚¢ã‚¯ã‚»ã‚¹ã—〠-年齢確èªã‚’è¡Œã„ã¾ã™ã‹ï¼Ÿ - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/verification.php?lang=ja - </url> - <usetemplate ignoretext="å¹´é½¢ã®æœªç¢ºèªã«ã¤ã„ã¦è¦å‘Šã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="Cannot enter parcel: no payment info on file"> - ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€æ”¯æ‰•ã„æƒ…å ±ãŒäº‹å‰ã«ç™»éŒ²ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ -[SECOND_LIFE] ã®ã‚¦ã‚§ãƒ–サイトã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€è¨å®šã—ã¾ã™ã‹ï¼Ÿ - -[_URL] - <url name="url" option="0"> - https://secondlife.com/account/index.php?lang=ja - </url> - <usetemplate ignoretext="支払ã„æƒ…å ±ã®æœªç™»éŒ²ã«ã¤ã„ã¦è¦å‘Šã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> - </notification> - <notification name="MissingString"> - æ–‡å—列[STRING_NAME]ãŒstrings.xmlã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ - </notification> - <notification name="SystemMessageTip"> - [MESSAGE] - </notification> - <notification name="Cancelled"> - å–り消ã•ã‚Œã¾ã—㟠- </notification> - <notification name="CancelledSit"> - 座るã®ã‚’å–り消ã•ã‚Œã¾ã—㟠- </notification> - <notification name="CancelledAttach"> - 添付ã¯å–り消ã•ã‚Œã¾ã—㟠- </notification> - <notification name="ReplacedMissingWearable"> - æ¬ è½ã—ã¦ã„ã‚‹æœï¼èº«ä½“部ä½ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚ - </notification> - <notification name="GroupNotice"> - 件å: [SUBJECT], メッセージ: [MESSAGE] - </notification> - <notification name="FriendOnline"> - [FIRST] [LAST] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ã€‚ - </notification> - <notification name="FriendOffline"> - [FIRST] [LAST] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ã€‚ - </notification> - <notification name="AddSelfFriend"> - 自分自身をフレンドã«ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="UploadingAuctionSnapshot"> - インワールドã¨ã‚¦ã‚§ãƒ–・サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップãƒãƒ¼ãƒ‰ä¸ã§ã™... -(所è¦æ™‚間:約5分) - </notification> - <notification name="UploadPayment"> - アップãƒãƒ¼ãƒ‰ã« L$[AMOUNT] 支払ã„ã¾ã—ãŸã€‚ - </notification> - <notification name="UploadWebSnapshotDone"> - Webサイトã®ã‚¹ãƒŠãƒƒãƒ—ショットãŒã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="UploadSnapshotDone"> - インワールドã§ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ãŒå®Œäº†ã—ã¾ã—ãŸã€‚ - </notification> - <notification name="TerrainDownloaded"> - raw地形ãŒãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•ã‚Œã¾ã—㟠- </notification> - <notification name="GestureMissing"> - ジェスãƒãƒ£ãƒ¼[NAME] ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="UnableToLoadGesture"> - ジェスãƒãƒ£ãƒ¼[NAME] ã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 -å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。 - </notification> - <notification name="LandmarkMissing"> - データベースã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ãŒã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="UnableToLoadLandmark"> - ランドマークをãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CapsKeyOn"> - コンピューター㮠Caps Lockã‚ー㌠-有効ã«ãªã£ã¦ã„ã¾ã™ã€‚パスワード入力㫠-影響ã™ã‚‹ã®ã§è§£é™¤ã—ã¾ã—ょã†ã€‚ - </notification> - <notification name="NotecardMissing"> - ノートカードãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="NotecardNoPermissions"> - ノートカードを閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ - </notification> - <notification name="RezItemNoPermissions"> - オブジェクトをrezã™ã‚‹ã«ã¯ãƒ‘ーミッション(承èªï¼‰ãŒä¸è¶³ã—ã¦ã¾ã™ã€‚ - </notification> - <notification name="UnableToLoadNotecard"> - ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®è³‡ç”£ã‚’ãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 - </notification> - <notification name="ScriptMissing"> - データベースã«ã‚¹ã‚¯ãƒªãƒ—トãŒã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="ScriptNoPermissions"> - スクリプトを閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ã€‚ - </notification> - <notification name="UnableToLoadScript"> - スクリプトをãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="IncompleteInventory"> - ã‚ãªãŸã®æä¾›ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã“ã®å ´æ‰€ã§ã¯ã¾ã 全部æƒã„ã¾ã›ã‚“。 -å°‘ã—ã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotModifyProtectedCategories"> - ä¿è·ã•ã‚ŒãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯ä¿®æ£ã§ãã¾ã›ã‚“。 - </notification> - <notification name="CannotRemoveProtectedCategories"> - ä¿è·ã•ã‚ŒãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。 - </notification> - <notification name="OfferedCard"> - ã‚ãªãŸã¯[FIRST] [LAST] ã« -コーリング・カードをé€ã‚Šã¾ã—ãŸã€‚ - </notification> - <notification name="UnableToBuyWhileDownloading"> - オブジェクトデータã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ä¸ã¯è³¼å…¥ã§ãã¾ã›ã‚“。 -ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="UnableToLinkWhileDownloading"> - オブジェクトデータã®ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ä¸ã¯ãƒªãƒ³ã‚¯ã§ãã¾ã›ã‚“。 -ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CannotBuyObjectsFromDifferentOwners"> - 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 -å˜ä¸€ã®ã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="ObjectNotForSale"> - オブジェクトã¯è²©å£²å¯¾è±¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="EnteringGodMode"> - レベル[LEVEL]ã®ã‚´ãƒƒãƒ‰ãƒ»ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™ - </notification> - <notification name="LeavingGodMode"> - レベル[LEVEL]ã®ã‚´ãƒƒãƒ‰ãƒ»ãƒ¢ãƒ¼ãƒ‰ã‚’解除 - </notification> - <notification name="CopyFailed"> - コピー権é™ãŒãªã„ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—㟠- </notification> - <notification name="InventoryAccepted"> - [NAME]ã¯ã€æŒã¡ç‰©ã®æ供をå—ã‘入れã¾ã—ãŸã€‚ - </notification> - <notification name="InventoryDeclined"> - [NAME]ã¯ã€æŒã¡ç‰©ã®æ供をæ–ã‚Šã¾ã—ãŸã€‚ - </notification> - <notification name="ObjectMessage"> - [NAME]: [MESSAGE] - </notification> - <notification name="CallingCardAccepted"> - コーリング・カードãŒå—ç†ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="CallingCardDeclined"> - コーリング・カードãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="TeleportToLandmark"> - 本土ã«åˆ°é”ã—ã¾ã—ãŸã€‚ -[NAME]ãªã©ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ç”»é¢å³ä¸‹ã«ã‚る「æŒã¡ç‰©ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ï¼ˆLandmarks)フォルダをé¸æŠžã—ã¦ãã ã•ã„。 -ランドマークをダブルクリックã—ãŸå¾Œã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’クリックã™ã‚‹ã¨ãã®å ´æ‰€ã¸ç§»å‹•ã—ã¾ã™ã€‚ - </notification> - <notification name="TeleportToPerson"> - 本土ã«åˆ°é”ã—ã¾ã—ãŸã€‚ -ä½äººã®[NAME]ã¨æŽ¥è§¦ã™ã‚‹ã«ã¯ã€ç”»é¢å³ä¸‹ã«ã‚る「æŒã¡ç‰©ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ï¼ˆCalling Cards)フォルダをé¸æŠžã—ã¦ãã ã•ã„。 -カードをダブルクリックã—ã€ã€ŒIMã‚’é€ã‚‹ã€ã‚’クリックã—ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¦ãã ã•ã„。 - </notification> - <notification name="CantSelectLandFromMultipleRegions"> - サーãƒãƒ¼ã®å¢ƒç•Œã‚’越ãˆã¦åœŸåœ°ã‚’é¸æŠžã™ã‚‹ã“ã¨ã§ãã¾ã›ã‚“。 -ã‚‚ã£ã¨å°ã•ãªåœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 - </notification> - <notification name="SearchWordBanned"> - コミュニティスタンダードã«æ˜Žè¨˜ã•ã‚Œã¦ã„るコンテンツ制é™ã«ã‚ˆã‚Šã€ã‚ãªãŸã®æ¤œç´¢èªžã®ä¸€éƒ¨ãŒé™¤å¤–ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="NoContentToSearch"> - å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’è¡Œã£ã¦ãã ã•ã„。(PG, Mature, Adult) - </notification> - <notification name="GroupVote"> - [NAME] ã¯æŠ•ç¥¨ã®ç”³è«‹ã‚’ã—ã¦ã„ã¾ã™ï¼š -[MESSAGE] - <form name="form"> - <button name="VoteNow" text="今ã™ã投票ã™ã‚‹"/> - <button name="Later" text="ã‚ã¨ã§"/> - </form> - </notification> - <notification name="SystemMessage"> - [MESSAGE] - </notification> - <notification name="EventNotification"> - イベント通知: - -[NAME] -[DATE] - <form name="form"> - <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> - <button name="Description" text="説明"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="TransferObjectsHighlighted"> - ã“ã®åŒºç”»ä¸Šã«å˜åœ¨ã™ã‚‹ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã“ã®åŒºç”»ã®è³¼å…¥è€…ã«è²æ¸¡ã•ã‚Œã‚‹ã‚ªãƒ–ジェクトãŒã™ã¹ã¦å¼·èª¿è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ - - -*è²æ¸¡ã•ã‚Œã‚‹æ¨¹æœ¨ã‚„æ¤ç‰©ã¯ã€å¼·èª¿è¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。 - <form name="form"> - <button name="Done" text="完了"/> - </form> - </notification> - <notification name="DeactivatedGesturesTrigger"> - åŒã˜ãƒˆãƒªã‚¬ãƒ¼ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ã—ãªã„ジェスãƒãƒ£ãƒ¼ï¼š -[NAMES] - </notification> - <notification name="NoQuickTime"> - Apple社ã®QuickTimeãŒã‚·ã‚¹ãƒ†ãƒ ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ãªã„ã¨æ€ã‚ã‚Œã¾ã™ã€‚ -ストリーミング・メディアã®å†ç”Ÿã‚’è¡Œã„ãŸã„å ´åˆã¯ã€QuickTimeã®ã‚µã‚¤ãƒˆï¼ˆhttp://www.apple.com/quicktime)ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€QuickTime Player をインストールã—ã¦ãã ã•ã„。 - </notification> - <notification name="OwnedObjectsReturned"> - é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="OtherObjectsReturned"> - é¸æŠžã•ã‚Œã¦ã„る土地ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ - [FIRST] [LAST] - ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="OtherObjectsReturned2"> - é¸æŠžã•ã‚ŒãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚り〠-ä½äººã®[NAME]ã®æ‰€æœ‰ã ã£ãŸã‚ªãƒ–ジェクトã¯ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="GroupObjectsReturned"> - é¸æŠžã•ã‚Œã¦ã„る区画上ã«ã‚ã‚Šã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã ã£ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ -è²æ¸¡ã•ã‚Œã¦ã„ãŸè²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ -グループã«è²æ¸¡ã•ã‚Œã¦ã„ãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="UnOwnedObjectsReturned"> - é¸æŠžã•ã‚ŒãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã‚Šã€ã‚ãªãŸã®æ‰€æœ‰ã§ã€Œãªã‹ã£ãŸã€ã‚ªãƒ–ジェクトã¯ã€æœ¬æ¥ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="NotSafe"> - ã“ã®åœŸåœ°ã¯ãƒ€ãƒ¡ãƒ¼ã‚¸ãŒæœ‰åŠ¹ï¼ˆã€Œå®‰å…¨ã§ã¯ãªã„ã€ï¼‰ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ -ケガをã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 命をè½ã¨ã—ãŸå ´åˆã¯ã€ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¾ã™ã€‚ - </notification> - <notification name="NoFly"> - ã“ã®åœŸåœ°ã¯é£›è¡ŒãŒç„¡åŠ¹ï¼ˆã€Œé£›è¡Œç¦æ¢ã€ï¼‰ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ -ã“ã“ã§é£›ã¶ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="PushRestricted"> - ã“ã®åœŸåœ°ã§ã¯ã€Œãƒ—ッシングç¦æ¢ã€ã§ã™ã€‚ -土地所有者以外ã¯ã“ã“ã§ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="NoVoice"> - ã“ã®åœŸåœ°ã¯ãƒœã‚¤ã‚¹ãŒç„¡åŠ¹ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="NoBuild"> - ã“ã®åœŸåœ°ã¯ã‚ªãƒ–ジェクトã®ä½œæˆç¦æ¢ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ -ã“ã“ã§ã‚ªãƒ–ジェクトを作るã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </notification> - <notification name="ScriptsStopped"> - 管ç†è€…ãŒã“ã®åœ°åŸŸå†…ã®ã‚¹ã‚¯ãƒªãƒ—トを一時åœæ¢ã•ã›ã¾ã—ãŸã€‚ - </notification> - <notification name="ScriptsNotRunning"> - ã“ã®åœ°åŸŸã§ã¯ã‚¹ã‚¯ãƒªãƒ—トã®ä½¿ç”¨ãŒç¦æ¢ã•ã‚Œã¦ã„ã¾ã™ - </notification> - <notification name="NoOutsideScripts"> - ã“ã®åœŸåœ°ã§ã¯å¤–部スクリプトãŒç„¡åŠ¹ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ -(「外部スクリプトç¦æ¢ã€ï¼‰ -土地所有者以外ã®ã‚¹ã‚¯ãƒªãƒ—トã¯èµ·å‹•ã§ãã¾ã›ã‚“ - </notification> - <notification name="ClaimPublicLand"> - 自分ãŒã„る地域ã§ã®ã¿å…¬å…±ã®åœŸåœ°ã‚’ç²å¾—ã§ãã¾ã™ã€‚ - </notification> - <notification name="RegionTPAccessBlocked"> - ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢確èªã‚’è¡Œã†ã‹ã€æœ€æ–°ãƒ“ューワをインストールã—ã¦ãã ã•ã„。 - -ç¾åœ¨ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãªã‚¨ãƒªã‚¢ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 - </notification> - <notification name="URBannedFromRegion"> - ã‚ãªãŸã¯åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã®ç«‹å…¥ãŒç¦æ¢ã•ã‚Œã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="NoTeenGridAccess"> - ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã¯ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。 - </notification> - <notification name="NoHelpIslandTP"> - Help Islandã«ã¯æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 -「Help Island Publicã€ã«è¡Œã〠-å†åº¦ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’è¡Œã£ã¦ãã ã•ã„。 - </notification> - <notification name="ImproperPaymentStatus"> - ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«å…¥ã‚‹ãŸã‚ã«é©ã—ãŸæ”¯æ‰•ã„ステータスãŒã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="MustGetAgeRegion"> - ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«å…¥ã‚‹ã«ã¯å¹´é½¢ç¢ºèªæ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - </notification> - <notification name="MustGetAgeParcel"> - ã“ã®åŒºç”»ã«å…¥ã‚‹ã«ã¯å¹´é½¢ç¢ºèªæ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - </notification> - <notification name="NoDestRegion"> - 目的地ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="NotAllowedInDest"> - 目的地ã«å…¥ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="RegionParcelBan"> - ç«‹å…¥ç¦æ¢ã•ã‚ŒãŸåŒºç”»ã‚’横æ–ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 別ã®æ–¹æ³•ã‚’ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="TelehubRedirect"> - テレãƒãƒ–ã«è»¢é€ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="CouldntTPCloser"> - ã“れ以上目的地ã«è¿‘ã„å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="TPCancelled"> - テレãƒãƒ¼ãƒˆãŒã‚ャンセルã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="FullRegionTryAgain"> - å…¥ã‚ã†ã¨ã—ã¦ã„る地域(リージョン)ã¯ç¾åœ¨æº€å“¡ã§ã™ã€‚ -ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="GeneralFailure"> - よãã‚る失敗 - </notification> - <notification name="RoutedWrongRegion"> - ç•°ãªã‚‹åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«è¿‚回ã•ã‚Œã¾ã—ãŸã€‚ ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="NoValidAgentID"> - エージェントIDãŒç„¡åŠ¹ã§ã™ã€‚ - </notification> - <notification name="NoValidSession"> - セッションIDãŒç„¡åŠ¹ã§ã™ã€‚ - </notification> - <notification name="NoValidCircuit"> - 回路コードãŒç„¡åŠ¹ã§ã™ã€‚ - </notification> - <notification name="NoValidTimestamp"> - タイムスタンプãŒç„¡åŠ¹ã§ã™ã€‚ - </notification> - <notification name="NoPendingConnection"> - 接続を生æˆã§ãã¾ã›ã‚“。 - </notification> - <notification name="InternalUsherError"> - 内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ - </notification> - <notification name="NoGoodTPDestination"> - ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã§ã¯é©åˆ‡ãªãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="InternalErrorRegionResolver"> - 内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ - </notification> - <notification name="NoValidLanding"> - 有効ãªç€åœ°ç‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="NoValidParcel"> - 有効ãªåŒºç”»ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="ObjectGiveItem"> - [FIRST] [LAST]所有ã®ã€ -[OBJECTFROMNAME]ã‹ã‚‰ã€ -[OBJECTNAME]ã¨ã„ã†[OBJECTTYPE]ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚ - <form name="form"> - <button name="Keep" text="å—ã‘å–ã‚‹"/> - <button name="Discard" text="ç ´æ£„"/> - <button name="Mute" text="無視リストã¸"/> - </form> - </notification> - <notification name="ObjectGiveItemUnknownUser"> - (未知ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼‰ 所有ã®[OBJECTFROMNAME]ã‹ã‚‰ã€ -ã‚ãªãŸã«[OBJECTNAME]ã¨ã„ã†[OBJECTTYPE]ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚ - <form name="form"> - <button name="Keep" text="å—ã‘å–ã‚‹"/> - <button name="Discard" text="ç ´æ£„"/> - <button name="Mute" text="無視リストã¸"/> - </form> - </notification> - <notification name="UserGiveItem"> - [NAME]ã¯ã€ã‚ãªãŸã«[OBJECTNAME]ã¨ã„ã†åå‰ã®[OBJECTTYPE]を渡ã—ã¾ã—ãŸã€‚ - <form name="form"> - <button name="Keep" text="å—ã‘å–ã‚‹"/> - <button name="Discard" text="ç ´æ£„"/> - <button name="Mute" text="無視リストã¸"/> - </form> - </notification> - <notification name="GodMessage"> - [NAME] -[MESSAGE] - </notification> - <notification name="JoinGroup"> - [MESSAGE] - <form name="form"> - <button name="Join" text="å‚åŠ "/> - <button name="Decline" text="辞退"/> - <button name="Info" text="æƒ…å ±"/> - </form> - </notification> - <notification name="TeleportOffered"> - [NAME]ã¯ã‚ãªãŸã‚’テレãƒãƒ¼ãƒˆã§å‘¼ã³å¯„ã›ã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ï¼š - -[MESSAGE] - <form name="form"> - <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="GotoURL"> - [MESSAGE] -[URL] - <form name="form"> - <button name="Later" text="ã‚ã¨ã§"/> - <button name="GoNow..." text="今ã™ãè¡Œã"/> - </form> - </notification> - <notification name="OfferFriendship"> - [NAME]ã¯ã€ -フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚ - -[MESSAGE] - -(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚) - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="辞退"/> - </form> - </notification> - <notification name="OfferFriendshipNoMessage"> - [NAME]ã¯ã€ -フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚ - -(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚) - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="æ‹’å¦"/> - </form> - </notification> - <notification name="FriendshipAccepted"> - [NAME]ã¯ã€ãƒ•ãƒ¬ãƒ³ãƒ‰ 登録をå—ã‘入れã¾ã—ãŸã€‚ - </notification> - <notification name="FriendshipDeclined"> - [NAME]ã¯ã€ãƒ•ãƒ¬ãƒ³ãƒ‰ 登録をæ–ã‚Šã¾ã—ãŸã€‚ - </notification> - <notification name="OfferCallingCard"> - [FIRST] [LAST]㌠-ã‚ãªãŸã«ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã£ã¦ãã¾ã—ãŸã€‚ -ã“ã‚Œã«ã‚ˆã‚Šã€ã‚ãªãŸã®æŒã¡ç‰©ã«ãƒ–ックマークãŒè¿½åŠ ã•ã‚Œã€ã“ã®ä½äººã«ã™ã°ã‚„ãIMã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="辞退"/> - </form> - </notification> - <notification name="RegionRestartMinutes"> - ã“ã®åœ°åŸŸã¯[MINUTES]分後ã«å†èµ·å‹•ã•ã‚Œã¾ã™ã€‚ -強制ãƒã‚°ã‚¢ã‚¦ãƒˆã¨ãªã‚Šã¾ã™ã®ã§ã€ã“ã®åœ°åŸŸã®å¤–ã«å‡ºã¦ãã ã•ã„。 - </notification> - <notification name="RegionRestartSeconds"> - ã“ã®åœ°åŸŸã¯[SECONDS]秒後ã«å†èµ·å‹•ã•ã‚Œã¾ã™ã€‚ -強制ãƒã‚°ã‚¢ã‚¦ãƒˆã¨ãªã‚Šã¾ã™ã®ã§ã€ã“ã®åœ°åŸŸã®å¤–ã«å‡ºã¦ãã ã•ã„。 - </notification> - <notification name="LoadWebPage"> - ウェブ・ページ[URL]ã‚’ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ - -[MESSAGE] - -ãƒãƒ¼ãƒ‰å…ƒã®ã‚ªãƒ–ジェクト:[OBJECTNAME]ã€ã‚ªãƒ¼ãƒŠãƒ¼ï¼š[NAME]? - <form name="form"> - <button name="Gotopage" text="移動"/> - <button name="Cancel" text="å–り消ã—"/> - </form> - </notification> - <notification name="FailedToFindWearableUnnamed"> - データベースã«[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠- </notification> - <notification name="FailedToFindWearable"> - データベースã«[DESC]ã¨ã„ã†åå‰ã®[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </notification> - <notification name="InvalidWearable"> - ç€ç”¨ã—よã†ã¨ã—ã¦ã„るアイテムã¯ã‚ãªãŸã®ãƒ“ューワã§ã¯èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 [APP_NAME]ビューワを最新ã®ã‚‚ã®ã«ã‚¢ãƒƒãƒ—グレードã—ã¦ã‹ã‚‰ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨ã—ã¦ãã ã•ã„。 - </notification> - <notification name="ScriptQuestion"> - 「[NAME]ã€ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「[OBJECTNAME]ã€ã‚’: - -[QUESTIONS] -よã‚ã—ã„ã§ã™ã‹ï¼Ÿ - <form name="form"> - <button name="Yes" text="ã¯ã„"/> - <button name="No" text="ã„ã„ãˆ"/> - <button name="Mute" text="無視リストã«è¿½åŠ "/> - </form> - </notification> - <notification name="ScriptQuestionCaution"> - 「[OBJECTNAME]ã€ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「[NAME]ã€ã¯ã€æ¬¡ã®ã“ã¨ã‚’求ã‚ã¦ã„ã¾ã™ï¼š - -[QUESTIONS] -ã“ã®ã‚ªãƒ–ジェクトã¨åˆ¶ä½œè€…ãŒä¿¡ç”¨ã§ããªã„å ´åˆã¯ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‹’å¦ã—ã¦ãã ã•ã„ã€‚è¿½åŠ æƒ…å ±ã¯ã€è©³ç´°ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„。 - -ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’許å¯ã—ã¾ã™ã‹ï¼Ÿ - <form name="form"> - <button name="Grant" text="許å¯"/> - <button name="Deny" text="æ‹’å¦"/> - <button name="Details" text="詳細..."/> - </form> - </notification> - <notification name="ScriptDialog"> - [FIRST] [LAST]ã®ã€Œ[TITLE]〠-[MESSAGE] - <form name="form"> - <button name="Ignore" text="無視ã™ã‚‹"/> - </form> - </notification> - <notification name="ScriptDialogGroup"> - [GROUPNAME]ã®ã€Œ[TITLE]〠-[MESSAGE] - <form name="form"> - <button name="Ignore" text="無視ã™ã‚‹"/> - </form> - </notification> - <notification name="FirstBalanceIncrease"> - L$[AMOUNT]ã‚’å—ã‘å–ã‚Šã¾ã—ãŸã€‚ -オブジェクトãŠã‚ˆã³ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚ãªãŸã«ãŠé‡‘を支払ã£ãŸã‚ˆã†ã§ã™ã€‚ -ã‚ãªãŸã®æ®‹é«˜ã¯ç”»é¢ã®å³ä¸Šã«è¡¨ç¤ºã•ã‚Œã¦ ã„ã¾ã™ã€‚ - </notification> - <notification name="FirstBalanceDecrease"> - L$[AMOUNT]を支払ã„ã¾ã—ãŸã€‚ -ã‚ãªãŸã®æ®‹é«˜ã¯ç”»é¢ã®å³ä¸Šã«è¡¨ç¤ºã•ã‚Œã¦ ã„ã¾ã™ã€‚ - </notification> - <notification name="FirstSit"> - ã‚ãªãŸã¯åº§ã£ã¦ã„ã¾ã™ã€‚ -矢å°ï¼ˆã¾ãŸã¯ AWSD)ã®ã‚ーを使ã£ã¦ -視点を変ãˆã¾ã™ã€‚ -ç«‹ã¡ä¸ŠãŒã‚‹ã«ã¯ã€Œç«‹ã¡ä¸ŠãŒã‚‹ã€ã‚’クリックã—ã¾ã™ã€‚ - </notification> - <notification name="FirstMap"> - 地図をスクãƒãƒ¼ãƒ«ã™ã‚‹ã«ã¯ã€ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãƒ‰ãƒ©ãƒƒã‚°ã—ã¾ã™ã€‚ -テレãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ãƒ€ãƒ–ルクリックã—ã¾ã™ã€‚ -å³å´ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’使用ã™ã‚‹ã¨ã€ç‰©ã‚’見ã¤ã‘ãŸã‚Šã€åˆ¥ã®èƒŒæ™¯ã‚’表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - </notification> - <notification name="FirstBuild"> - [SECOND_LIFE] ã«ã¯ã€ -æ–°ã—ã„オブジェクトを作るã“ã¨ãŒã§ãる地域ãŒã‚ã‚Šã¾ã™ã€‚ -作æˆã«ã¯ç”»é¢ä¸Šéƒ¨å·¦ã®ãƒ„ールãŒä½¿ãˆã€ -Ctrlã‚ーやAltã‚ーを押ã—ãŸã¾ã¾ã«ã™ã‚Œã° -ç´ æ—©ãツールを切り替ãˆã‚‰ã‚Œã¾ã™ã€‚ -Escã‚ーを押ã™ã¨ã€ä½œæˆã¯çµ‚了ã—ã¾ã™ã€‚ - </notification> - <notification name="FirstLeftClickNoHit"> - 左クリックã§ç‰¹åˆ¥ãªã‚ªãƒ–ジェクトをæ“作ã§ãã¾ã™ã€‚ -マウス・ãƒã‚¤ãƒ³ã‚¿ãŒæ‰‹ã®ãƒžãƒ¼ã‚¯ã«å¤‰ã‚ã‚‹ã¨ã€ãƒã‚¤ãƒ³ãƒˆã—ã¦ã„るオブジェクトをæ“作ã§ãã¾ã™ã€‚ -å³ã‚¯ãƒªãƒƒã‚¯ã§å®Ÿè¡Œå¯èƒ½ãªæ“作ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ - </notification> - <notification name="FirstTeleport"> - ã“ã®åœ°åŸŸã§ã¯ã€ãƒã‚¤ãƒ³ãƒˆé–“ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãŒèªã‚られã¦ã„ã¾ã›ã‚“ã®ã§ã€æœ€ã‚‚è¿‘ã„テレãƒãƒ–周辺ã«ç§»å‹•ã—ã¾ã—ãŸã€‚ -ã‚ãªãŸã®ç›®çš„地ã¯ã€å¤§ããªæ¨™è˜ï¼ˆãƒ“ーコン)ã§è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚赤ã„矢å°ã«å‘ã‹ã£ã¦é€²ã‚€ã¨æ¨™è˜ï¼ˆãƒ“ーコン)ã¸è¾¿ã‚Šç€ãã¾ã™ã€‚ -矢å°ã‚’クリックã™ã‚‹ã¨æ¨™è˜ï¼ˆãƒ“ーコン)を消ã›ã¾ã™ - </notification> - <notification name="FirstOverrideKeys"> - ã‚ãªãŸã®ç§»å‹•ã‚ーをオブジェクトãŒæ“作ã—ã¦ã„ã¾ã™ã€‚ -矢å°ã‹AWSDã®ã‚ーã§å‹•ä½œã‚’確èªã—ã¦ãã ã•ã„。 -銃ãªã©ã®ã‚ªãƒ–ジェクトã ã¨ã€ä¸€äººç§°è¦–点(マウスルック)ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ -Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ - </notification> - <notification name="FirstAppearance"> - ã‚ãªãŸã¯å®¹å§¿ã‚’編集ä¸ã§ã™ã€‚ -回転ã€ã‚ºãƒ¼ãƒ ã™ã‚‹ã«ã¯çŸ¢å°ã‚ーを使ã„ã¾ã™ã€‚ -編集ãŒçµ‚ã‚ã£ãŸã‚‰ã€Œã™ã¹ã¦ä¿å˜ã€ã‚’クリックã—ã¦å®¹å§¿ã‚’ä¿å˜ã—ã€çµ‚了ã—ã¾ã™ã€‚ -容姿ã®ç·¨é›†ã¯ä½•åº¦ã§ã‚‚è¡Œãˆã¾ã™ã€‚ - </notification> - <notification name="FirstInventory"> - ã“ã‚Œã¯ã€ã‚ªãƒ–ジェクトã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã€æœã€ãã®ä»–ã‚ãªãŸã®æ‰€æœ‰ç‰©ãŒã™ã¹ã¦å…¥ã£ãŸã€ŒæŒã¡ç‰©ã€ã§ã™ã€‚ -*マウスã§ã‚¢ãƒã‚¿ãƒ¼ã«ã‚ªãƒ–ジェクトやæœè£…フォルダをドラッグã—ã¦è£…ç€ã—ã¾ã™ã€‚ -*オブジェクトを地é¢ã®ä¸Šã«ãƒ‰ãƒ©ãƒƒã‚°ã™ã‚‹ã¨ã€å‘¨å›²ã®ä¸–ç•Œã«è¡¨ç¤ºã•ã›ã¾ã™ã€‚(Rez) -*ノートカードをèªã‚€ã«ã¯ã€ãƒ€ãƒ–ルクリックã—ã¾ã™ã€‚ - </notification> - <notification name="FirstSandbox"> - ã“ã“ã¯ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹ã§ã™ã€‚ -ã‚ãªãŸãŒã“ã“ã§ä½œã£ãŸã‚ªãƒ–ジェクトã¯ã‚ãªãŸãŒç«‹ã¡åŽ»ã£ãŸå¾Œã€å‰Šé™¤ã•ã‚Œã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。サンドボックスã¯å®šæœŸçš„ã«æ¸…掃ã•ã‚Œã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ã€ç”»é¢ä¸Šéƒ¨ã€åœ°åŸŸåã®éš£ã®æƒ…å ±ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 - -サンドボックスã¯ç‰¹åˆ¥ãªã‚¨ãƒªã‚¢ã§ã€ç›®å°ã®ã‚µã‚¤ãƒ³ãŒã¤ã„ã¦ã„ã¾ã™ã€‚ - </notification> - <notification name="FirstFlexible"> - ã“ã®ã‚ªãƒ–ジェクト㯠フレã‚シブルã§ã™ã€‚ -フレã‚シブル・ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã®ãƒã‚§ãƒƒã‚¯ãŒå¤–ã•ã‚Œã‚‹ã¾ã§ã¯ã€ã‚ªãƒ–ジェクトã¯ç‰©ç†çš„ã§ãªãファントムã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 - </notification> - <notification name="FirstDebugMenus"> - 高度ãªè¨å®šã‚’有効ã«ã—ã¾ã—ãŸã€‚ -ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«ã¯ã€ -[SECOND_LIFE] をデãƒãƒƒã‚°ã™ã‚‹ãƒ‡ãƒ™ãƒãƒƒãƒ‘ーã«ã¨ã£ã¦ -有用ãªæ©Ÿèƒ½ãŒã‚ã‚Šã¾ã™ã€‚ -ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’切り替ãˆã‚‹ã«ã¯ã€ -Windowsã§ã¯Ctrl+Alt+Dを押ã—ã¾ã™ã€‚ -Macã®å ´åˆã¯ã€⌥⌘Dを押ã—ã¦ãã ã•ã„。 - </notification> - <notification name="FirstSculptedPrim"> - スカルプトプリムを編集ã—ã¦ã„ã¾ã™ã€‚ -スカルプトプリムã¯ã€å½¢çŠ¶ã‚’指定ã™ã‚‹ãŸã‚ã®ç‰¹åˆ¥ãªãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ãŒå¿…è¦ã§ã™ã€‚ -æŒã¡ç‰©ãƒ©ã‚¤ãƒ–ラリã§ã€ã‚¹ã‚«ãƒ«ãƒ—トテクスãƒãƒ£ãƒ¼ã®ã‚µãƒ³ãƒ—ルをå‚ç…§ã§ãã¾ã™ã€‚ - </notification> - <notification name="FirstMedia"> - メディアã®å†ç”Ÿã‚’開始ã—ã¾ã—ãŸã€‚ -オーディオ/ビデオã®ç’°å¢ƒè¨å®šã§ã€è‡ªå‹•çš„ã«ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’å†ç”Ÿã™ã‚‹ã‚ˆã†ã«è¨å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -注: ã“ã®è¨å®šã«ã‚ˆã‚Šã€ä¿¡é ¼ã—ãªã„メディア・サイトã«æŽ¥ç¶šã•ã‚Œã‚‹ã‚»ã‚ュリティ・リスクãŒä¼´ã„ã¾ã™ã€‚ - </notification> - <notification name="MaxListSelectMessage"> - ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰[MAX_SELECT]個ã¾ã§ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚ - </notification> - <notification name="VoiceInviteP2P"> - [NAME]ãŒã€ã‚ãªãŸã‚’ボイスãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚ -コールã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ã‚³ãƒ¼ãƒ«ã‚’ã—ã¦ã„る人をミュートã«ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="æ‹’å¦"/> - <button name="Mute" text="ミュート"/> - </form> - </notification> - <notification name="AutoUnmuteByIM"> - [FIRST] [LAST]ã« -インスタント・メッセージãŒé€ä¿¡ã•ã‚Œã€ç„¡è¦–è¨å®šã¯è‡ªå‹•çš„ã«è§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST]ã«ãŠé‡‘を渡ã—ãŸãŸã‚〠無視è¨å®šãŒè‡ªå‹•çš„ã«è§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST]ã«æŒã¡ç‰©ã‚’渡ã—ãŸãŸã‚〠無視è¨å®šãŒè‡ªå‹•çš„ã«è§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ - </notification> - <notification name="VoiceInviteGroup"> - [NAME]ãŒã€ グループ[GROUP]ã¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚åŠ ã—ã¾ã—ãŸã€‚ -コールã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ã‚³ãƒ¼ãƒ«ã‚’ã—ã¦ã„る人をミュートã«ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="æ‹’å¦"/> - <button name="Mute" text="ミュート"/> - </form> - </notification> - <notification name="VoiceInviteAdHoc"> - [NAME]ãŒã€ 会è°ãƒãƒ£ãƒƒãƒˆã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚åŠ ã—ã¾ã—ãŸã€‚ -コールã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。 ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ミュート(消声)ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="æ‹’å¦"/> - <button name="Mute" text="ミュート"/> - </form> - </notification> - <notification name="InviteAdHoc"> - [NAME]ãŒã€ ã‚ãªãŸã‚’会è°ãƒãƒ£ãƒƒãƒˆã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚ -ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ミュート(消声)ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 - <form name="form"> - <button name="Accept" text="å—ã‘入れる"/> - <button name="Decline" text="æ‹’å¦"/> - <button name="Mute" text="ミュート"/> - </form> - </notification> - <notification name="VoiceChannelFull"> - ã‚ãªãŸãŒå‚åŠ ã—よã†ã¨ã—ã¦ã„るボイスコール[VOICE_CHANNEL_NAME]ã¯ã€å‚åŠ è€…ãŒæœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="ProximalVoiceChannelFull"> - ã“ã®ã‚¨ãƒªã‚¢ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã¯ã€æ··é›‘ã®ãŸã‚容é‡ã‚’超ãˆã¦ã—ã¾ã£ã¦ã„ã¾ã™ã€‚申ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã€ä»–ã®ã‚¨ãƒªã‚¢ã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="VoiceChannelDisconnected"> - [VOICE_CHANNEL_NAME]ã¸ã®æŽ¥ç¶šãŒåˆ‡æ–ã•ã‚Œã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚ - </notification> - <notification name="VoiceChannelDisconnectedP2P"> - [VOICE_CHANNEL_NAME]ã¯ã€ã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚ - </notification> - <notification name="P2PCallDeclined"> - [VOICE_CHANNEL_NAME]ã¯ã€ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚ - </notification> - <notification name="P2PCallNoAnswer"> - [VOICE_CHANNEL_NAME]ã¯ã€ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’å—ã‘å–ã‚Œã¾ã›ã‚“。空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚ - </notification> - <notification name="VoiceChannelJoinFailed"> - [VOICE_CHANNEL_NAME]ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚時間をãŠã„ã¦ã€å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚ - </notification> - <notification name="VoiceLoginRetry"> - ã‚ãªãŸç”¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’作æˆã—ã¦ã„ã¾ã™ã€‚1分ã»ã©ã‹ã‹ã‚Šã¾ã™ã€‚ - </notification> - <notification name="Cannot enter parcel: not a group member"> - é©åˆ‡ãªã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã¯ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="Cannot enter parcel: banned"> - ç«‹å…¥ç¦æ¢ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="Cannot enter parcel: not on access list"> - アクセス・リストã«å«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 - </notification> - <notification name="VoiceNotAllowed"> - ã‚ãªãŸã«ã¯[VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。 - </notification> - <notification name="VoiceCallGenericError"> - [VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸ã«ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 - </notification> - <notification name="ServerVersionChanged"> - 到ç€ã—ãŸåœ°åŸŸã¯ç•°ãªã‚‹ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚¿ãƒ¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§å®Ÿè¡Œã•ã‚Œã¦ã„ã¾ã™ã€‚ 詳細ã«ã¤ã„ã¦ã¯ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’クリックã—ã¦ãã ã•ã„。 - </notification> - <notification name="UnableToOpenCommandURL"> - クリックã—ãŸURLã¯ã“ã®ã‚¦ã‚§ãƒ–ブラウザã§ã¯é–‹ã‘ã¾ã›ã‚“ - </notification> - <global name="UnsupportedCPU"> - - ã‚ãªãŸã® CPU ã®é€Ÿåº¦ã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 - </global> - <global name="UnsupportedGLRequirements"> - [APP_NAME] ã®ä½¿ç”¨ã«å¿…è¦ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ç’°å¢ƒãŒæº€ãŸã•ã‚Œã¦ã„ãªã„よã†ã§ã™ã€‚ [APP_NAME] ã§ã¯ãƒžãƒ«ãƒãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã«å¯¾å¿œã—ãŸOpenGLグラフィック・カードãŒå¿…è¦ã§ã™ã€‚ ã“ã®å ´åˆã€ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚«ãƒ¼ãƒ‰ã®æœ€æ–°ãƒ‰ãƒ©ã‚¤ãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã€ãŠã‚ˆã³ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ãƒ»ã‚·ã‚¹ãƒ†ãƒ ã«ã‚µãƒ¼ãƒ“ス・パックã¨ä¿®æ£ãƒ—ãƒã‚°ãƒ©ãƒ ãŒé©ç”¨ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’ã”確èªãã ã•ã„。 - -å•é¡ŒãŒè§£æ±ºã•ã‚Œãªã„å ´åˆã«ã¯ã€æ¬¡ã®ã‚µã‚¤ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ãã ã•ã„。 http://www.secondlife.com/support - </global> - <global name="UnsupportedCPUAmount"> - 796 - </global> - <global name="UnsupportedRAMAmount"> - 510 - </global> - <global name="UnsupportedGPU"> - - ã‚ãªãŸã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚«ãƒ¼ãƒ‰ã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 - </global> - <global name="UnsupportedRAM"> - - ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ・メモリã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 - </global> - <global name="PermYes"> - ã¯ã„ - </global> - <global name="PermNo"> - ã„ã„㈠- </global> -</notifications> +<?xml version="1.0" encoding="utf-8"?> +<notifications> + <global name="skipnexttime"> + 今後ã¯è¡¨ç¤ºã—ãªã„ + </global> + <global name="alwayschoose"> + 常ã«ã“ã®ã‚ªãƒ—ションをé¸æŠž + </global> + <global name="implicitclosebutton"> + é–‰ã˜ã‚‹ + </global> + <template name="okbutton"> + <form> + <button name="OK" text="$yestext"/> + </form> + </template> + <template name="okignore"/> + <template name="okcancelbuttons"> + <form> + <button name="Cancel" text="$notext"/> + </form> + </template> + <template name="okcancelignore"/> + <template name="okhelpbuttons"> + <form> + <button name="Help" text="$helptext"/> + </form> + </template> + <template name="yesnocancelbuttons"> + <form> + <button name="Yes" text="$yestext"/> + <button name="No" text="$notext"/> + </form> + </template> + <notification functor="GenericAcknowledge" label="ä¸æ˜Žãªè¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸" name="MissingAlert"> + ã‚ãªãŸã® [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ä»Šå—ã‘å–ã£ãŸè¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。 + +エラー詳細: 「[_NAME]ã€ã¨ã„ã†è¦å‘Šã¯ notifications.xml ã«ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="FloaterNotFound"> + フãƒãƒ¼ã‚¿ãƒ»ã‚¨ãƒ©ãƒ¼ï¼šä¸‹è¨˜ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸï¼š +[CONTROLS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="TutorialNotFound"> + ç¾åœ¨åˆ©ç”¨å¯èƒ½ãªãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã¯ã‚ã‚Šã¾ã›ã‚“。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="GenericAlert"> + [MESSAGE] + </notification> + <notification name="GenericAlertYesCancel"> + [MESSAGE] + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="ã¯ã„"/> + </notification> + <notification name="BadInstallation"> + [APP_NAME] をアップデートä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ 最新ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。 http://get.secondlife.com + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LoginFailedNoNetwork"> + [SECOND_LIFE_GRID] ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +「[DIAGNOSTIC]〠+インターãƒãƒƒãƒˆæŽ¥ç¶šãŒæ£å¸¸ã‹ã”確èªãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MessageTemplateNotFound"> + メッセージテンプレート [PATH] ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="WearableSave"> + ç¾åœ¨ã®è¡£æœ/ボディーパーツã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> + </notification> + <notification name="CompileQueueSaveText"> + 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—ト用テã‚ストã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON] 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CompileQueueSaveBytecode"> + 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON]後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="WriteAnimationFail"> + アニメーションデータã®æ›¸ãè¾¼ã¿ã«å•é¡ŒãŒã‚ã‚Šã¾ã™ã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="UploadAuctionSnapshotFail"> + 次ã®ç†ç”±ã§ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON] + </notification> + <notification name="UnableToViewContentsMoreThanOne"> + 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è¡¨ç¤ºã§ãã¾ã›ã‚“。 +é¸æŠžã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="SaveClothingBodyChanges"> + è¡£æœï¼èº«ä½“部ä½ã«å¯¾ã™ã‚‹å¤‰æ›´ã‚’ã™ã¹ã¦ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ã™ã¹ã¦ä¿å˜"/> + </notification> + <notification name="GrantModifyRights"> + ä»–ã®ä½äººã«å¤‰æ›´æ¨©é™ã‚’与ãˆã‚‹ã¨ã€ãã®äººã¯ã‚ãªãŸãŒæ‰€æœ‰ã—ã¦ã„ã‚‹ +ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€ã¾ãŸã¯å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®è¨±å¯ã‚’与ãˆã‚‹ã¨ãã¯ç´°å¿ƒã®æ³¨æ„を払ã£ã¦ãã ã•ã„。 +[FIRST_NAME] [LAST_NAME]ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="GrantModifyRightsMultiple"> + 変更権é™ã‚’与ãˆã‚‹ã¨ã€ãã®äººã¯ã‚ãªãŸãŒä½œæˆã—ãŸå…¨ã¦ã®ã‚ªãƒ–ジェクトを変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +ã“ã®è¨±å¯ã‚’与ãˆã‚‹ã¨ãã«ã¯ç´°å¿ƒã®æ³¨æ„を払ã£ã¦ãã ã•ã„。 +é¸æŠžã—ãŸä½äººã«å¤‰æ›´æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="RevokeModifyRights"> + [FIRST_NAME] [LAST_NAME]ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’å–り消ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="RevokeModifyRightsMultiple"> + é¸æŠžã—ãŸä½äººã‹ã‚‰å¤‰æ›´æ¨©é™ã‚’å–り下ã’ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="UnableToCreateGroup"> + グループを作æˆã§ãã¾ã›ã‚“。 +[MESSAGE] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PanelGroupApply"> + [NEEDS_APPLY_MESSAGE] +[WANT_APPLY_MESSAGE] + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="変更を無視" yestext="変更をé©ç”¨"/> + </notification> + <notification name="MustSpecifyGroupNoticeSubject"> + グループ通知ã®é€ä¿¡ã«ã¯ã€ä»¶åã®è¨˜å…¥ãŒå¿…è¦ã§ã™ã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AddGroupOwnerWarning"> + ã‚ãªãŸã¯ [ROLE_NAME]ã®å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +任命ã•ã‚ŒãŸãƒ¡ãƒ³ãƒãƒ¼ãŒè‡ªã‚‰é€€ä»»ã—ãªã„é™ã‚Šã€ +彼らを役柄ã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“。 +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="グループオーナーを新ã—ãè¿½åŠ ã™ã‚‹å‰ã«ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="AssignDangerousActionWarning"> + ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’ +与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + + *è¦å‘Š* +ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ +自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ç¾åœ¨ã‚ˆã‚Šå¼·åŠ›ãªæ¨©é™ã‚’割り当ã¦ã€ +自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã« +任命ã™ã‚‹ã“ã¨ã‚‚ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ ã“ã®è¡Œç‚ºã®æ„味をよãç†è§£ã—ã¦ã‹ã‚‰ +実行ã—ã¦ãã ã•ã„。 + +ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="AssignDangerousAbilityWarning"> + ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’ +与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + + *è¦å‘Š* +ã“ã®èƒ½åŠ›ã‚’ã‚‚ã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ +自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã™ã¹ã¦ã®èƒ½åŠ›ã‚’割り当ã¦ã€ +自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«ä»»å‘½ã§ãã¾ã™ã€‚ + +ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="JoinGroupCanAfford"> + ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã«ã¯ã€L$[COST]ã‹ã‹ã‚Šã¾ã™ã€‚ +続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="å‚åŠ "/> + </notification> + <notification name="JoinGroupCannotAfford"> + ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ã«ã¯ã€L$[COST]å¿…è¦ã§ã™ã€‚ +L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CreateGroupCost"> + ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を作るã«ã¯ L$100 ã‹ã‹ã‚Šã¾ã™ã€‚ +一人ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«ãªã‚‰ãªã„ã®ã§ã€æ°¸ä¹…ã«å‰Šé™¤ã•ã‚Œã¦ã—ã¾ã„ã¾ã™ã€‚ +48時間以内ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’勧誘ã—入会ã—ã¦ã‚‚らã£ã¦ãã ã•ã„。 + <usetemplate canceltext="ã‚ャンセル" name="okcancelbuttons" notext="ã‚ャンセル" yestext="L$100 ã§ã‚°ãƒ«ãƒ¼ãƒ—を作æˆ"/> + </notification> + <notification name="LandBuyPass"> + L$[COST]㧠[TIME]時間ã“ã®åœŸåœ°[PARCEL_NAME]ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +å…¥å ´è¨±å¯ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="SalePriceRestriction"> + ä¸ç‰¹å®šã®äººã«å£²å´ã™ã‚‹å ´åˆã«ã¯ã€ +売å´ä¾¡æ ¼ã¯L$0以上ã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ +売å´ä¾¡æ ¼ã‚’L$0ã«è¨å®šã™ã‚‹å ´åˆã¯ã€ +売å´ã™ã‚‹å€‹äººã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="ConfirmLandSaleChange"> + é¸æŠžã•ã‚ŒãŸ[LAND_SIZE]平方メートルã®åœŸåœ°ã¯ã€å£²ã‚Šå‡ºã—ä¸ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ +売å´ä¾¡æ ¼L$[SALE_PRICE]ã§ã€[NAME]ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ConfirmLandSaleToAnyoneChange"> + 注:「誰ã«ã§ã‚‚売å´ã™ã‚‹ã€ã‚’クリックã™ã‚‹ã¨ã€ +ã‚ãªãŸã®åœŸåœ°ã¯[SECOND_LIFE] ã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã®ã©ã“ã‹ã‚‰ã§ã‚‚ +(ã“ã®åœ°åŸŸã«ãªã„コミュニティをå«ã‚€ï¼‰è³¼å…¥ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ + +é¸æŠžã•ã‚ŒãŸ[LAND_SIZE]平方メートルã®åœŸåœ°ã¯ã€ +売り出ã—ä¸ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ +売å´ä¾¡æ ¼L$[SALE_PRICE]ã§ã€[NAME]ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ReturnObjectsDeededToGroup"> + ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ—[NAME]共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + +*è¦å‘Š* ã“ã‚Œã«ã‚ˆã‚Šã€ +グループã«è²æ¸¡ã•ã‚ŒãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•ã‚Œã¾ã™ï¼ +オブジェクト: [N] + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedByUser"> + ã“ã®åŒºç”»ã§ã€ +ä½äºº[NAME]ãŒæ‰€æœ‰ã™ã‚‹å…¨ã¦ã®ã‚ªãƒ–ジェクトを +彼らã®æŒã¡ç‰©ã«æœ¬å½“ã«è¿”å´ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ + +オブジェクト: [N] + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ReturnObjectsOwnedBySelf"> + ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを〠+ã‚ãªãŸã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + +オブジェクト: [N] + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedBySelf"> + ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸä»¥å¤–ãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを〠+ãã‚Œãžã‚Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ +グループã«è²æ¸¡ã•ã‚ŒãŸè²æ¸¡å¯èƒ½ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•ã‚Œã¾ã™ã€‚ + +*è¦å‘Š* ã“ã‚Œã«ã‚ˆã‚Šã€ +グループã«è²æ¸¡ã•ã‚ŒãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•ã‚Œã¾ã™ï¼ +オブジェクト: [N] + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByUser"> + ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚る〠+[NAME]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãã‚Œãžã‚Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿã‚°ãƒ«ãƒ¼ãƒ—ã«è²æ¸¡ã•ã‚ŒãŸè²æ¸¡å¯èƒ½ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•ã‚Œã¾ã™ã€‚ + +*è¦å‘Š* ã“ã‚Œã«ã‚ˆã‚Šã€ +グループã«è²æ¸¡ã•ã‚ŒãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•ã‚Œã¾ã™ï¼ +オブジェクト: [N] + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ReturnAllTopObjects"> + å…¨ã¦ã®ãƒªã‚¹ãƒˆã•ã‚ŒãŸã‚ªãƒ–ジェクトを所有者ã«æœ¬å½“ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="DisableAllTopObjects"> + ã“ã®åœ°åŸŸå†…ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを無効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ReturnObjectsNotOwnedByGroup"> + ã“ã®åœŸåœ°ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—[NAME] +ã¨ã®é–“ã§å…±æœ‰ã—ã¦ã„ãªã„オブジェクトをオーナーã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ + +オブジェクト: [N] + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="UnableToDisableOutsideScripts"> + スクリプトを無効ã«ã§ãã¾ã›ã‚“。 +ã“ã®åœ°åŸŸå…¨ä½“ãŒã€Œãƒ€ãƒ¡ãƒ¼ã‚¸æœ‰åŠ¹ã€ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ +æ¦å™¨ã‚’使用ã™ã‚‹ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + </notification> + <notification name="MustBeInParcel"> + ç€åœ°ç‚¹ã‚’è¨å®šã™ã‚‹ã«ã¯ã€ã“ã®åŒºç”»ã®å†…å´ã« +ç«‹ã£ã¦ãã ã•ã„。 + </notification> + <notification name="PromptRecipientEmail"> + å—信者ã®æœ‰åŠ¹ãªEメールアドレスを入力ã—ã¦ãã ã•ã„。 + </notification> + <notification name="PromptSelfEmail"> + ã‚ãªãŸã®Eメール・アドレスを入力ã—ã¦ãã ã•ã„。 + </notification> + <notification name="PromptMissingSubjMsg"> + デフォルトã®ä»¶åã¾ãŸã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’付ã‘ã¦ã€ã‚¹ãƒŠãƒƒãƒ—ショットをé€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ErrorProcessingSnapshot"> + スナップショット・データã®å‡¦ç†ã‚¨ãƒ©ãƒ¼ + </notification> + <notification name="ErrorEncodingSnapshot"> + スナップショットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰åŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸï¼ + </notification> + <notification name="ErrorUploadingPostcard"> + 次ã®ç†ç”±ã§ã€ã‚¹ãƒŠãƒƒãƒ—ショットã®é€ä¿¡æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸï¼š [REASON] + </notification> + <notification name="ErrorUploadingReportScreenshot"> + 次ã®ç†ç”±ã§ã€ãƒ¬ãƒãƒ¼ãƒˆã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON] + </notification> + <notification name="MustAgreeToLogIn"> + [SECOND_LIFE] ã¸ã®ãƒã‚°ã‚¤ãƒ³ã‚’続ã‘ã‚‹ã«ã¯ã€åˆ©ç”¨è¦ç´„ã«åŒæ„ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CouldNotPutOnOutfit"> + æœè£…を装ç€ã§ãã¾ã›ã‚“。 +æœè£…フォルダã«è¡£æœã€èº«ä½“部ä½ã€ä»˜å±žå“ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CannotWearTrash"> + ゴミ箱ã«ã‚ã‚‹æœã‚„ボディーパーツã®ç€ç”¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotWearInfoNotComplete"> + ã¾ã èªã¿è¾¼ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ を装ç€ã§ãã¾ã›ã‚“。後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 + </notification> + <notification name="MustHaveAccountToLogIn"> + ãŠã£ã¨! 記入æ¼ã‚ŒãŒã‚ã‚Šã¾ã™ã‚ˆã€‚ +ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ã‚¡ãƒ¼ã‚¹ãƒˆãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ ã®ä¸¡æ–¹ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + +[SECOND_LIFE]ã«å…¥ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚ アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ + <url name="url"> + https://join.secondlife.com/index.php?lang=ja-JP + </url> + <usetemplate name="okcancelbuttons" notext="ã‚‚ã†ä¸€åº¦è©¦ã™" yestext="æ–°ã—ã„アカウントを作æˆ"/> + </notification> + <notification name="AddClassified"> + 検索ディレクトリã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ã€ +クラシファイド広告ãŒ1週間掲載ã•ã‚Œã¾ã™ã€‚ +広告を記入後ã€ã€Œå…¬é–‹ã€ã‚’クリックã—ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã« +è¿½åŠ ã—ã¾ã™ã€‚ +「公開ã€ã‚’クリックã™ã‚‹ã¨ã€æ”¯æ‰•é‡‘é¡ã‚’å°‹ãられã¾ã™ã€‚ +多ã払ã†ã»ã©ã€åºƒå‘ŠãŒã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰ãƒ»ãƒªã‚¹ãƒˆã¨ã‚ーワード検索 +ã®ä¸Šä½ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ + <usetemplate ignoretext="æ–°è¦ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šä½œæˆæ–¹æ³•" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="DeleteClassified"> + クラシファイド広告[NAME]ã®å‰Šé™¤ã‚’ã—ã¾ã™ã‹ï¼Ÿ +支払ã„済ã¿ã®æ–™é‡‘ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。 + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ClassifiedSave"> + クラシファイド広告[NAME]ã¸ã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> + </notification> + <notification name="DeleteAvatarPick"> + ピック[PICK]を削除ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="PromptGoToEventsPage"> + [SECOND_LIFE]イベント・ウェブ・ページã«ç§»å‹•ã—ã¾ã™ã‹ï¼Ÿ + <url name="url"> + http://jp.secondlife.com/events/ + </url> + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="SelectProposalToView"> + 表示ã™ã‚‹æ案をé¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="SelectHistoryItemToView"> + 表示ã™ã‚‹å±¥æ´ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="ResetShowNextTimeDialogs"> + ã“れらã®ãƒãƒƒãƒ—アップ全ã¦ã‚’å†åº¦æœ‰åŠ¹åŒ–ã—ã¾ã™ã‹ï¼Ÿï¼ˆä»¥å‰ã€Œä»Šå¾Œã¯è¡¨ç¤ºã—ãªã„ã€ã¨æŒ‡å®šã—ã¦ã„ã¾ã™ï¼‰ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="SkipShowNextTimeDialogs"> + スã‚ップå¯èƒ½ãªãƒãƒƒãƒ—アップ全ã¦ã‚’無効化ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="CacheWillClear"> + [APP_NAME]ã®å†èµ·å‹•å¾Œã«ã‚ャッシュãŒã‚¯ãƒªã‚¢ã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="CacheWillBeMoved"> + [APP_NAME]ã®å†èµ·å‹•å¾Œã«ã‚ャッシュãŒç§»å‹•ã•ã‚Œã¾ã™ã€‚ +注æ„:ã“ã‚Œã«ã‚ˆã‚Šã‚ャッシュãŒã‚¯ãƒªã‚¢ã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="ChangeConnectionPort"> + ãƒãƒ¼ãƒˆã®è¨å®šã¯ã€[APP_NAME]ã®å†èµ·å‹•å¾Œã«æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ + </notification> + <notification name="ChangeSkin"> + æ–°ã—ã„スã‚ンã¯[APP_NAME]ã‚’å†èµ·å‹•ã™ã‚‹ã¨ç¾ã‚Œã¾ã™ + </notification> + <notification name="GoToAuctionPage"> + [SECOND_LIFE]ウェブ・ページã«ç§»å‹•ã—〠入æœã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ + <url name="url"> + http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] + </url> + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="SaveChanges"> + 変更をä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ä¿å˜"/> + </notification> + <notification name="GestureSaveFailedTooManySteps"> + ジェスãƒãƒ£ãƒ¼ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ +ステップãŒå¤šã™ãŽã¾ã™ã€‚ +ステップをã„ãã¤ã‹å‰Šé™¤ã—ã¦ã‹ã‚‰å†ä¿å˜ã—ã¦ãã ã•ã„ + </notification> + <notification name="GestureSaveFailedTryAgain"> + ジェスãƒãƒ£ãƒ¼ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚å°‘ã—å¾…ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="GestureSaveFailedObjectNotFound"> + ジェスãƒãƒ£ãƒ¼ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトæŒã¡ç‰©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 +オブジェクトãŒç¯„囲内ã«å˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + </notification> + <notification name="GestureSaveFailedReason"> + 次ã®ç†ç”±ã§ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã®ä¿å˜æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="SaveNotecardFailObjectNotFound"> + ノートカードã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚オブジェクトã€ã¾ãŸã¯é–¢é€£ã™ã‚‹ã‚ªãƒ–ジェクトæŒã¡ç‰©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 +オブジェクトãŒç¯„囲内ã«å˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + </notification> + <notification name="SaveNotecardFailReason"> + 次ã®ç†ç”±ã§ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ä¿å˜æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="ScriptCannotUndo"> + ã‚ãªãŸã®ã‚¹ã‚¯ãƒªãƒ—トã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€å¤‰æ›´ã‚’å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +サーãƒãƒ¼ã®æœ€æ–°ä¿å˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ +(**è¦å‘Š**:ã“ã®æ“作後元ã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“) + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="SaveScriptFailReason"> + 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—トã®ä¿å˜ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="SaveScriptFailObjectNotFound"> + スクリプトã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚スクリプトãŒå…¥ã£ãŸã‚ªãƒ–ジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 +オブジェクトã¯ç¯„囲外ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•ã‚Œã¦ã„ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 + </notification> + <notification name="SaveBytecodeFailReason"> + 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ä¿å˜æ™‚ã«å•é¡ŒãŒèµ·ã“ã‚Šã¾ã—ãŸã€‚ [REASON]。 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="StartRegionEmpty"> + ãƒã‚°ã‚¤ãƒ³ä½ç½®ãŒä¸æ˜Žã§ã™ã€‚ +ãƒã‚°ã‚¤ãƒ³ä½ç½®ã®æ¬„ã«ãƒªãƒ¼ã‚¸ãƒ§ãƒ³åを入力ã™ã‚‹ã‹ã€ã€Œæœ€å¾Œã«ãƒã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€ã€ã‹ã€Œè‡ªå®…(ホーム)ã€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CouldNotStartStopScript"> + スクリプトã®èµ·å‹•ã¾ãŸã¯åœæ¢ã«å¤±æ•—ã—ã¾ã—ãŸã€‚スクリプトãŒæ ¼ç´ã•ã‚Œã¦ã„るオブジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 +オブジェクトãŒç¯„囲内ã«å˜åœ¨ã—ãªã„ã‹ã€ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + </notification> + <notification name="CannotDownloadFile"> + ファイルをダウンãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotWriteFile"> + ファイル[[FILE]]を書ãè¾¼ã‚ã¾ã›ã‚“。 + </notification> + <notification name="UnsupportedHardware"> + è¦å‘Šï¼š ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ 㯠[APP_NAME] ã®å¿…è¦æœ€ä½Žé™ã®å‹•ä½œç’°å¢ƒã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 ã“ã®ã¾ã¾ [APP_NAME] を使用ã™ã‚‹ã¨ã€ãƒ‘フォーマンスã®ä½Žä¸‹ã‚’æ„Ÿã˜ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 æれ入りã¾ã™ãŒ [SUPPORT_SITE] ã§ã¯ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ã‚·ã‚¹ãƒ†ãƒ ã«é–¢ã™ã‚‹æŠ€è¡“的サãƒãƒ¼ãƒˆã¯è¡Œã£ã¦ãŠã‚Šã¾ã›ã‚“。 + +最低動作環境 +[_URL] ã§è©³ã—ã„æƒ…å ±ã‚’ç¢ºèªã—ã¾ã™ã‹ï¼Ÿ + <url name="url" option="0"> + http://secondlife.com/support/sysreqs.php?lang=ja + </url> + <usetemplate ignoretext="使用ã—ã¦ã„るコンピューターã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="UnknownGPU"> + ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€ç¾åœ¨ [APP_NAME] ãŒèªè˜ã§ããªã„グラフィックカードãŒæ載ã•ã‚Œã¦ã„ã¾ã™ã€‚ +[APP_NAME] ã§ã¾ã テストã•ã‚Œã¦ã„ãªã„最新ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ãŸã‚ã ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ [APP_NAME] ã¯æ£å¸¸ã«å®Ÿè¡Œã•ã‚Œã‚‹å¯èƒ½æ€§ãŒé«˜ã„ã§ã™ãŒã€è¡¨ç¤ºè¨å®šã‚’調整ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 +(環境è¨å®š > 表示) + <form name="form"> + <ignore name="ignore" text="使用ä¸ã®ã‚°ãƒ©ãƒ•ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ãŒèªè˜ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ"/> + </form> + </notification> + <notification name="DisplaySettingsNoShaders"> + [APP_NAME] ã¯ã€ +グラフィック・ドライãƒã®åˆæœŸåŒ–ä¸ã«ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ã¾ã—ãŸã€‚ +一般的ãªãƒ‰ãƒ©ã‚¤ãƒãƒ»ã‚¨ãƒ©ãƒ¼ã‚’回é¿ã™ã‚‹ãŸã‚ã€ã€Œå“質ãŠã‚ˆã³ãƒ‘フォーマンスã€ã¯ã€Œä½Žã€ã«è¨å®šã•ã‚Œã¾ã™ã€‚ +ã“ã‚Œã«ã‚ˆã‚Šã€ã„ãã¤ã‹ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚¹æ©Ÿèƒ½ã¯ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚ +グラフィックカード・ドライãƒã®ã‚¢ãƒƒãƒ—デートをãŠå‹§ã‚ã—ã¾ã™ã€‚ +「グラフィックã®å“質ã€ã¯ã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œè¡¨ç¤ºã€ã‹ã‚‰ä¸Šã’ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + </notification> + <notification name="RegionNoTerraforming"> + ã“ã®åœ°åŸŸ[REGION] ã¯ã€ãƒ†ãƒ©ãƒ•ã‚©ãƒ¼ãƒŸãƒ³ã‚°ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotCopyWarning"> + ã‚ãªãŸã¯ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーを +許ã•ã‚Œã¦ã„ãªã„ã®ã§ã€äººã«ã‚ã’る㨠+æŒã¡ç‰©ã‹ã‚‰å¤±ã‚ã‚Œã¾ã™ã€‚ 本当㫠+ã“れをã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="CannotGiveItem"> + æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ を渡ã›ã¾ã›ã‚“。 + </notification> + <notification name="TransactionCancelled"> + å–引ãŒã‚ャンセルã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="TooManyItems"> + 一度ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªäº¤æ›ã§ã€42以上ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯é€ã‚Œã¾ã›ã‚“。 + </notification> + <notification name="NoItems"> + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’è²æ¸¡ã§ãる権é™ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CannotCopyCountItems"> + ã‚ãªãŸã¯é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®[COUNT]ã®ã‚³ãƒ”ーを +許ã•ã‚Œã¦ã„ã¾ã›ã‚“。 +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰å¤±ã‚ã‚Œã¾ã™ã€‚ +本当ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="CannotGiveCategory"> + é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€ã‚’è²æ¸¡ã§ãる権é™ãŒã‚ã‚Šã¾ã›ã‚“ + </notification> + <notification name="FreezeAvatar"> + ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ +ã‚¢ãƒã‚¿ãƒ¼ã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ +ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–ç•Œã«å¯¾ã™ã‚‹é–¢ã‚ã‚Šã‚’æŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="解å‡" yestext="フリーズ"/> + </notification> + <notification name="FreezeAvatarFullname"> + [AVATAR_NAME]をフリーズã—ã¾ã™ã‹ï¼Ÿ +フリーズã•ã‚ŒãŸäººã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–ç•Œã«å¯¾ã™ã‚‹é–¢ã‚ã‚Šã‚’æŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="解å‡" yestext="フリーズ"/> + </notification> + <notification name="EjectAvatarFullname"> + ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰[AVATAR_NAME]を追放ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="追放ã¨ç¦æ¢" yestext="追放"/> + </notification> + <notification name="EjectAvatarNoBan"> + ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰è¿½æ”¾ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="追放"/> + </notification> + <notification name="EjectAvatarFullnameNoBan"> + [AVATAR_NAME] ã‚’ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰è¿½æ”¾ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="追放"/> + </notification> + <notification name="AcquireErrorTooManyObjects"> + å–得エラー:é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®æ•°ãŒå¤šã™ãŽã¾ã™ã€‚ + </notification> + <notification name="AcquireErrorObjectSpan"> + å–得エラー: +オブジェクトãŒè¤‡æ•°ã®åœ°åŸŸã«ã¾ãŸãŒã£ã¦å˜åœ¨ã—ã¦ã„ã¾ã™ã€‚ +å–å¾—ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ +ã™ã¹ã¦åŒã˜åœ°åŸŸå†…ã«ç§»å‹•ã•ã›ã¦ãã ã•ã„。 + </notification> + <notification name="PromptGoToCurrencyPage"> + [EXTRA] + +[_URL] ã§ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«è³¼å…¥ã«é–¢ã™ã‚‹æƒ…å ±ã‚’ç¢ºèªã—ã¾ã™ã‹ï¼Ÿ + <url name="url"> + http://jp.secondlife.com/currency/ + </url> + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="UnableToLinkObjects"> + ã“れらã®[COUNT]オブジェクトをリンクã§ãã¾ã›ã‚“。 +最大[MAX]オブジェクトをリンクã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + </notification> + <notification name="CannotLinkIncompleteSet"> + セットã¨ã—ã¦æƒã£ã¦ã„るオブジェクトã®ã¿ãƒªãƒ³ã‚¯ã§ãã¾ã™ã€‚複数㮠+オブジェクトをé¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotLinkModify"> + ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ä¿®æ£è¨±å¯ãŒã‚ãªãŸã«ãªã„ãŸã‚〠+リンクã§ãã¾ã›ã‚“。 + +オブジェクトãŒã™ã¹ã¦ãƒãƒƒã‚¯ã•ã‚Œã¦ãŠã‚‰ãšã€ã‚ãªãŸã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotLinkDifferentOwners"> + 所有者ãŒç•°ãªã‚‹ãŸã‚ã€ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを +リンクã§ãã¾ã›ã‚“。 + +自分ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトã ã‘ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="NoFileExtension"> + ファイル「[FILE]ã€ã®æ‹¡å¼µåãŒç„¡åŠ¹ã§ã™ã€‚ + +ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µåãŒæ£ã—ã„ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„。 + </notification> + <notification name="InvalidFileExtension"> + ファイル拡張å[EXTENSION]ã¯ç„¡åŠ¹ã§ã™ +æ£ã—ã„æ‹¡å¼µå:[VALIDS] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotUploadSoundFile"> + èªã¿è¾¼ã¿ã®ãŸã‚ã«ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•ã‚ŒãŸã‚µã‚¦ãƒ³ãƒ‰ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã‘ã¾ã›ã‚“: +[FILE] + </notification> + <notification name="SoundFileNotRIFF"> + ファイルãŒRIFF WAVEファイルã¨ã—ã¦èªè˜ã•ã‚Œã¾ã›ã‚“: +[FILE] + </notification> + <notification name="SoundFileNotPCM"> + ファイルãŒPCM WAVEオーディオ・ファイルã¨ã—ã¦èªè˜ã•ã‚Œã¾ã›ã‚“: +[FILE] + </notification> + <notification name="SoundFileInvalidChannelCount"> + ファイルã®ãƒãƒ£ãƒ³ãƒãƒ«æ•°ãŒç„¡åŠ¹ã§ã™ï¼ˆãƒ¢ãƒŽãƒ©ãƒ«ã¾ãŸã¯ã‚¹ãƒ†ãƒ¬ã‚ªã‚’使用ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼‰ï¼š +[FILE] + </notification> + <notification name="SoundFileInvalidSampleRate"> + ファイルã®ã‚µãƒ³ãƒ—ル・レートãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ44.1kを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼‰ï¼š +[FILE] + </notification> + <notification name="SoundFileInvalidWordSize"> + ファイルã®ãƒ¯ãƒ¼ãƒ‰ãƒ»ã‚µã‚¤ã‚ºãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ8ã¾ãŸã¯16ビットを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼‰ï¼š +[FILE] + </notification> + <notification name="SoundFileInvalidHeader"> + WAVヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒ»ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: +[FILE] + </notification> + <notification name="SoundFileInvalidTooLong"> + オーディオ・ファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大10秒): +[FILE] + </notification> + <notification name="ProblemWithFile"> + ファイル[FILE]ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã™ã€‚ + +[ERROR] + </notification> + <notification name="CannotOpenTemporarySoundFile"> + 書ãè¾¼ã¿ç”¨ã®ä¸€æ™‚圧縮サウンド・ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“:[FILE] + </notification> + <notification name="UnknownVorbisEncodeFailure"> + 未知ã®Vorbis æš—å·åŒ–ã«å¤±æ•—: [FILE] + </notification> + <notification name="CannotEncodeFile"> + 次ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“: [FILE] + </notification> + <notification name="CorruptResourceFile"> + ç ´æã—ãŸãƒªã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ï¼š [FILE] + </notification> + <notification name="UnknownResourceFileVersion"> + 未知ã®lindenリソースファイルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [FILE] + </notification> + <notification name="UnableToCreateOutputFile"> + æœè£…ファイルを作æˆã§ãã¾ã›ã‚“: [FILE] + </notification> + <notification name="DoNotSupportBulkAnimationUpload"> + ç¾åœ¨ [APP_NAME] ã§ã¯ã€ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ä¸€æ‹¬ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotUploadReason"> + 次ã®ç†ç”±ã§ã€[FILE] をアップãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“: [REASON] +ã‚ã¨ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="LandmarkCreated"> + 「 [LANDMARK_NAME] ã€ã‚’「 [FOLDER_NAME] ã€ãƒ•ã‚©ãƒ«ãƒ€ã«è¿½åŠ ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="CannotCreateLandmarkNotOwner"> + 土地ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚〠+ランドマークを作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotRecompileSelectObjectsNoScripts"> + å†ç·¨é›†ã¯ä¸å¯èƒ½ã§ã™ã€‚ +スクリプト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotRecompileSelectObjectsNoPermission"> + 「å†ç·¨é›†ã€ã¯ä¸å¯èƒ½ã§ã™ã€‚ + +変更修æ£æ¨©é™ã®ã‚ã‚‹ +スクリプト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotResetSelectObjectsNoScripts"> + 「å†è¨å®šã€ã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã›ã‚“。 + +スクリプト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotResetSelectObjectsNoPermission"> + 「å†è¨å®šã€ã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã›ã‚“。 + +変更修æ£æ¨©é™ã®ã‚ã‚‹ +スクリプト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotSetRunningSelectObjectsNoScripts"> + スクリプトã®ã€Œå®Ÿè¡Œã€ã®è¨å®šãŒã§ãã¾ã›ã‚“。 + +スクリプト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotSetRunningNotSelectObjectsNoScripts"> + スクリプトを「実行ã—ãªã„ã€ã«è¨å®šã§ãã¾ã›ã‚“。 + +スクリプト化ã•ã‚ŒãŸã‚ªãƒ–ジェクトをé¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="NoFrontmostFloater"> + ä¿å˜ã™ã¹ãfrontmostフãƒãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="SeachFilteredOnShortWords"> + 指定ã—ãŸæ¤œç´¢ã‚¯ã‚¨ãƒªã¯å¤‰æ›´ã•ã‚Œã€çŸã™ãŽã‚‹èªžå¥ã¯å–り除ã‹ã‚Œã¦ã„ã¾ã™ã€‚ + +検索語å¥ï¼š [FINALQUERY] + </notification> + <notification name="SeachFilteredOnShortWordsEmpty"> + 指定ã—ãŸæ¤œç´¢èªžå¥ãŒçŸã™ãŽãŸãŸã‚ã€æ¤œç´¢ã¯è¡Œã‚ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="CouldNotTeleportReason"> + テレãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ +[REASON] + </notification> + <notification name="invalid_tport"> + テレãƒãƒ¼ãƒˆå‡¦ç†ä¸ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </notification> + <notification name="invalid_region_handoff"> + リージョン間ã®ç§»å‹•ä¸ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </notification> + <notification name="blocked_tport"> + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 +ã‚„ã‚Šç›´ã—ã¦ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦å•é¡Œã‚’解決ã—ã¦ãã ã•ã„。 + </notification> + <notification name="nolandmark_tport"> + 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="timeout_tport"> + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +ã‚‚ã†å°‘ã—後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 + </notification> + <notification name="noaccess_tport"> + 残念ãªãŒã‚‰ã€ãã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="missing_attach_tport"> + 添付物ã¯ã€ã¾ã 到ç€ã—ã¦ã„ã¾ã›ã‚“。ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’ã‚„ã‚Šç›´ã—ã¦ã ã•ã„。 + </notification> + <notification name="too_many_uploads_tport"> + ã“ã®åœ°åŸŸã®è³‡ç”£ã‚ューãŒç¾åœ¨è¾¼ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間通りã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚ +数分後ã«ã‚„ã‚Šç›´ã™ã‹ã€ã¾ãŸã¯æ··é›‘ã—ã¦ã„ãªã„ä»–ã®åœ°åŸŸã‚’ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="expired_tport"> + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 + </notification> + <notification name="expired_region_handoff"> + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯åœ°åŸŸé–“ã®ç§»å‹•ã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 + </notification> + <notification name="no_host"> + テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã¾ãŸã¯ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 + </notification> + <notification name="no_inventory_host"> + æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotSetLandOwnerNothingSelected"> + 土地所有者è¨å®šãŒã§ãã¾ã›ã‚“: +区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotSetLandOwnerMultipleRegions"> + 複数ã®åœ°åŸŸãŒé¸æŠžã•ã‚ŒãŸãŸã‚〠+土地ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã§ãã¾ã›ã‚“。 +é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="ForceOwnerAuctionWarning"> + ã“ã®åŒºç”»ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‡ºå“ã•ã‚Œã¦ã„ã¾ã™ã€‚ +区画ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã™ã‚‹ã¨ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ãŒç„¡åŠ¹ã«ãªã‚Šã€ +å…¥æœãŒé–‹å§‹ã—ã¦ã„ãŸã‚‰ä¸æº€ã«æ€ã†ä½äººãŒå‡ºã¦ãã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 +所有権をå–å¾—ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="CannotContentifyNothingSelected"> + コンテンツ化ã¯ä¸å¯èƒ½ã§ã™ï¼š +区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotContentifyNoRegion"> + コンテンツ化ã¯ä¸å¯èƒ½ã§ã™ï¼š +土地ãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotReleaseLandNothingSelected"> + åœŸåœ°ã‚’ç ´æ£„ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: +区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotReleaseLandNoRegion"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CannotBuyLandNothingSelected"> + 土地を購入ã§ãã¾ã›ã‚“: +区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotBuyLandNoRegion"> + 土地を購入ã§ãã¾ã›ã‚“: +ã“ã®åœŸåœ°ãŒã‚る地域を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ + </notification> + <notification name="CannotCloseFloaterBuyLand"> + [APP_NAME]ã«ã‚ˆã‚‹ã€ +ã“ã®å–引ã®è¦‹ç©ã‚ŠãŒå®Œäº†ã™ã‚‹ã¾ã§ã€ŒåœŸåœ°ã‚’購入ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotDeedLandNothingSelected"> + 土地をè²æ¸¡ã§ãã¾ã›ã‚“: +区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotDeedLandNoGroup"> + 土地をè²æ¸¡ã§ãã¾ã›ã‚“: +グループãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotDeedLandNoRegion"> + 土地をè²æ¸¡ã§ãã¾ã›ã‚“: +ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CannotDeedLandMultipleSelected"> + 土地をè²æ¸¡ã§ãã¾ã›ã‚“: +複数ã®åŒºç”»ãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã™ã€‚ + +ã“れより1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="ParcelCanPlayMedia"> + ã“ã“ã§ã¯ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ»ãƒ¡ãƒ‡ã‚£ã‚¢å†ç”ŸãŒå¯èƒ½ã§ã™ã€‚ +メディアã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã«ã¯ã€é«˜é€Ÿãªã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šç’°å¢ƒãŒå¿…è¦ã§ã™ã€‚ + +利用å¯èƒ½ã«ãªã£ãŸã‚‰å†ç”Ÿã—ã¾ã™ã‹ï¼Ÿ +(ã“ã®ã‚ªãƒ—ションã¯ã€ã€Œç’°å¢ƒè¨å®šã€ï¼žã€ŒéŸ³å£°ã¨ãƒ“デオã€ã§å¾Œã‹ã‚‰ã§ã‚‚変更ã§ãã¾ã™ï¼‰ + <usetemplate name="okcancelbuttons" notext="無効化" yestext="メディアをå†ç”Ÿ"/> + </notification> + <notification name="CannotDeedLandWaitingForServer"> + 土地をè²æ¸¡ã§ãã¾ã›ã‚“: +サーãƒãƒ¼ã‹ã‚‰ã®æ‰€æœ‰æ¨©æƒ…å ±ã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚ + +å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。 + </notification> + <notification name="CannotDeedLandNoTransfer"> + 土地をè²æ¸¡ã§ãã¾ã›ã‚“: +ã“ã®åœ°åŸŸ [REGION] ã§ã¯åœŸåœ°ã®è²æ¸¡ãŒè¨±ã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotReleaseLandWatingForServer"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +サーãƒãƒ¼ãŒåŒºç”»æƒ…å ±ã‚’æ›´æ–°ã™ã‚‹ã®ã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚ + +ã‚‚ã†å°‘ã—後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotReleaseLandSelected"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +ã‚ãªãŸã¯ã€é¸æŠžã—ãŸã™ã¹ã¦ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã›ã‚“。 + +1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotReleaseLandDontOwn"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +ã‚ãªãŸã¯ã“ã®åœŸåœ°ã‚’手放ã™ã“ã¨ã‚’許å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。 +ã‚ãªãŸã®åŒºç”»ã¯ç·‘色ã§è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="CannotReleaseLandRegionNotFound"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CannotReleaseLandNoTransfer"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +ã“ã® [REGION] ã§ã¯åœŸåœ°ã®è²æ¸¡ãŒè¨±ã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotReleaseLandPartialSelection"> + åœŸåœ°ã‚’ç ´æ£„ã§ãã¾ã›ã‚“: +区画全体をé¸æŠžã—ã¦ç ´æ£„ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + +区画全体をé¸æŠžã™ã‚‹ã‹ã€ã¾ãŸã¯ã€ã¾ãšæœ€åˆã«åŒºç”»ã‚’分割ã—ã¦ãã ã•ã„。 + </notification> + <notification name="ReleaseLandWarning"> + ã‚ãªãŸã¯ã€[AREA]平方メートルã®åœŸåœ°ã‚’ç ´æ£„ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +ã“ã®åŒºç”»ã‚’ç ´æ£„ã™ã‚‹ã¨ã‚ãªãŸã®åœŸåœ°ã§ã¯ãªããªã‚Šã¾ã™ãŒã€ +L$ã¯è¿”金ã•ã‚Œã¾ã›ã‚“。 + +åœŸåœ°ã‚’ç ´æ£„ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNothingSelected"> + 土地を分割ã§ãã¾ã›ã‚“: + +区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotDivideLandPartialSelection"> + 土地を分割ã§ãã¾ã›ã‚“: + +区画全体ãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã™ã€‚ +区画ã®ä¸€éƒ¨ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="LandDivideWarning"> + ã“ã®åœŸåœ°ã‚’分割ã™ã‚‹ã¨ã€2ã¤ã®åŒºç”»ã«åˆ¥ã‚Œã¾ã™ã€‚ +区画ã”ã¨ã®è¨å®šãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ ã“ã®æ“作を行ã†ã¨ã€ä¸€éƒ¨ã®è¨å®šãŒãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã«ãƒªã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚ + +土地ã®åˆ†å‰²æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="CannotDivideLandNoRegion"> + 土地を分割ã§ãã¾ã›ã‚“: +ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CannotJoinLandNoRegion"> + 土地を統åˆã§ãã¾ã›ã‚“: +ã“ã®åœŸåœ°ãŒã‚る地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="CannotJoinLandNothingSelected"> + 土地を統åˆã§ãã¾ã›ã‚“ã§ã—ãŸï¼š +区画ãŒé¸å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="CannotJoinLandEntireParcelSelected"> + 土地を統åˆã§ãã¾ã›ã‚“: +1ã¤ã®åŒºç”»ã—ã‹é¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“。 + +両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotJoinLandSelection"> + 土地を統åˆã§ãã¾ã›ã‚“: +1ã¤ä»¥ä¸Šã®åŒºç”»ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + +両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="JoinLandWarning"> + ã“ã®åœŸåœ°ã‚’çµ±åˆã™ã‚‹ã¨ã€é¸æŠžã•ã‚ŒãŸé•·æ–¹å½¢ã«äº¤å·®ã™ã‚‹ +å…¨ã¦ã®åŒºç”»ã‚’基ã«ã—ã¦1ã¤ã®å¤§ããªåŒºç”»ãŒä½œæˆã•ã‚Œã¾ã™ã€‚ +æ–°ã—ã„区画ã®åå‰ã¨ã‚ªãƒ—ションをå†è¨å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + +土地を統åˆã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ConfirmNotecardSave"> + ã“ã®ã‚¢ã‚¤ãƒ†ãƒ をコピーã€è¡¨ç¤ºã™ã‚‹å‰ã«ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ä¿å˜ãŒå¿…è¦ã§ã™ã€‚ ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ConfirmItemCopy"> + ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="コピー"/> + </notification> + <notification name="ResolutionSwitchFail"> + 解åƒåº¦ã‚’ [RESX]x[RESY]ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="ErrorUndefinedGrasses"> + エラー:未定義ã®æ¤ç‰©ï¼š[SPECIES] + </notification> + <notification name="ErrorUndefinedTrees"> + エラー:未定義ã®æ¨¹æœ¨ï¼š[SPECIES] + </notification> + <notification name="CannotSaveWearableOutOfSpace"> + 「[NAME]ã€ã‚’æœã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ä¿å˜ã§ãã¾ã›ã‚“。 コンピューター㮠+ディスクスペースを少ã—増やã—ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦ +ä¿å˜ã—ã¦ã¿ã¦ãã ã•ã„。 + </notification> + <notification name="CannotSaveToAssetStore"> + [NAME]ã‚’ä¸å¤®è³‡ç”£æ ¼ç´åº«ã«ä¿å˜ã§ãã¾ã›ã‚“。 +ã“ã‚Œã¯ä¸€æ™‚çš„ãªä¸å…·åˆã§ã™ã€‚ +æœé£¾å“ãªã©ã‚’カスタマイズã—ã€æ•°åˆ†å¾Œã«ã‚‚ã†ä¸€åº¦ä¿å˜ã—ã¦ãã ã•ã„。 + </notification> + <notification name="YouHaveBeenLoggedOut"> + ã‚ãªãŸã¯[SECOND_LIFE]ã‹ã‚‰ãƒã‚°ã‚¢ã‚¦ãƒˆã•ã‚Œã¾ã—ãŸã€‚ + [MESSAGE] +「IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示ã€ã‚’クリックã™ã‚‹ã¨ã€ +ç¾åœ¨ã‚ã‚‹IMã¨ãƒãƒ£ãƒƒãƒˆã‚’確èªã§ãã¾ã™ã€‚ +確èªã—ãªã„å ´åˆã¯ã€Œçµ‚了ã€ã‚’クリックã—〠+ã™ãã«[APP_NAME]を終了ã—ã¦ãã ã•ã„。 + <usetemplate name="okcancelbuttons" notext="終了" yestext="IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示"/> + </notification> + <notification name="OnlyOfficerCanBuyLand"> + グループ用ã®åœŸåœ°ã®è³¼å…¥ãŒã§ãã¾ã›ã‚“: +ã‚ãªãŸã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—ã®ãŸã‚ã«åœŸåœ°ã‚’購入ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="AddFriend"> + フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + +[NAME] ã«ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚·ãƒƒãƒ—ã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="AddFriendWithMessage"> + フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + +[NAME] ã«ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚·ãƒƒãƒ—ã®ã‚ªãƒ•ã‚¡ãƒ¼ã‚’ã—ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + フレンドã¨ã—ã¦ç™»éŒ²ã—ã¦ãã‚Œã¾ã™ã‹ï¼Ÿ + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="ã‚ャンセル"/> + </form> + </notification> + <notification name="RemoveFromFriends"> + [FIRST_NAME] [LAST_NAME]をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="RemoveMultipleFromFriends"> + フレンドリストã‹ã‚‰è¤‡æ•°ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedPublicObjectsByUser"> + **[AVATAR_NAME]** +所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã“ã®ã‚·ãƒ 内ã®ä»–ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="GodDeleteAllScriptedObjectsByUser"> + **[AVATAR_NAME]** +所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã“ã®ã‚·ãƒ 内ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="GodDeleteAllObjectsByUser"> + **[AVATAR_NAME]** +所有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクト(スクリプト・オブジェクトã¨éžã‚¹ã‚¯ãƒªãƒ—ト・オブジェクト)を +ã“ã®ã‚·ãƒ 内ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BlankClassifiedName"> + クラシファイドã«åå‰ã‚’指定ã—ã¦ãã ã•ã„。 + </notification> + <notification name="MinClassifiedPrice"> + 広告料ã®æ”¯æ‰•ã„金é¡ã¯ã€Lã¨[MIN_PRICE]ãŒä¸‹é™ã§ã™ã€‚ + +金é¡ã‚’増やã—ã¦ãã ã•ã„。 + </notification> + <notification name="ConfirmObjectDeleteLock"> + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopy"> + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoOwn"> + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸Šã‚’ã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopy"> + 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ +一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoOwn"> + 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ +1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteNoCopyNoOwn"> + 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 +1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> + 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ +一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 +1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。 + +本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLock"> + 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ + +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–得を続ã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeNoOwn"> + å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ +ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•ã‚Œã¾ã™ã€‚ +ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–得を続ã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmObjectTakeLockNoOwn"> + 1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ +å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ +ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•ã‚Œã¾ã™ã€‚ +ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ +ã“ã®é¸æŠžå†…容ã®ã¾ã¾ã§ç¶šè¡Œã™ã‚‹ã“ã¨ã¯å¯èƒ½ã§ã™ãŒã€ + +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–得を続ã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="CantBuyLandAcrossMultipleRegions"> + 複数ã®åœ°åŸŸãŒé¸æŠžã•ã‚ŒãŸãŸã‚ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“。 + +é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="DeedLandToGroup"> + ã“ã®åŒºç”»ã®è²æ¸¡ã«éš›ã—ã¦ã¯ã€ +ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚ +土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•ã‚Œã¾ã›ã‚“。è²æ¸¡ã•ã‚ŒãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²ä¾¡æ ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç‰ã«åˆ†é…ã•ã‚Œã¾ã™ã€‚ + +ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ— +「[GROUP_NAME]ã€ã«è²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="DeedLandToGroupWithContribution"> + ã“ã®åŒºç”»ã®è²æ¸¡ã«éš›ã—ã¦ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—㌠+å分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚ +ã“ã®è²æ¸¡ã«ã‚ˆã‚Šã€ +「[FIRST_NAME] [LAST_NAME]ã€ã‹ã‚‰ +グループã«å¯¾ã—ã¦åœŸåœ°ãŒåŒæ™‚ã«æä¾›ã•ã‚Œã¾ã™ã€‚ +土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•ã‚Œã¾ã›ã‚“。 +è²æ¸¡ã•ã‚ŒãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²æ–™é‡‘ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç‰ã«åˆ†é…ã•ã‚Œã¾ã™ã€‚ + +ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ—「[GROUP_NAME]ã€ã«è²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="DisplaySetToSafe"> + -safeオプションを指定ã—ãŸã®ã§ã€ +表示è¨å®šã¯ã‚»ãƒ¼ãƒ•ãƒ»ãƒ¬ãƒ™ãƒ«ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="DisplaySetToRecommended"> + 表示è¨å®šã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ 構æˆã« +基ã¥ã„ã¦æŽ¨å¥¨ã•ã‚ŒãŸãƒ¬ãƒ™ãƒ«ã«è¨å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="ErrorMessage"> + [ERROR_MESSAGE] + </notification> + <notification name="AvatarMovedDesired"> + 目的地ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 +è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarMovedLast"> + å‰å›žã„ãŸå ´æ‰€ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 +è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="AvatarMovedHome"> + ホームãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 +è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚ +æ–°ãŸã«ãƒ›ãƒ¼ãƒ ã‚’è¨å®šã—ãªãŠã™ã¨ã„ã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 + </notification> + <notification name="ClothingLoading"> + ç¾åœ¨è¡£é¡žã‚’ダウンãƒãƒ¼ãƒ‰ä¸ã§ã™ã€‚ +ã“ã®ã¾ã¾ [SECOND_LIFE] を通常通りã”使用ã„ãŸã ã‘ã¾ã™ã€‚他人ã‹ã‚‰ã¯ã‚ãªãŸã¯æ£ã—ã表示ã•ã‚Œã¾ã™ã€‚ + <form name="form"> + <ignore name="ignore" text="衣類ãŒãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•ã‚Œã‚‹ã¾ã§æ™‚é–“ãŒã‹ã‹ã£ã¦ã„ã¾ã™"/> + </form> + </notification> + <notification name="FirstRun"> + [APP_NAME]ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå®Œäº†ã—ã¾ã—ãŸã€‚ + +[SECOND_LIFE] ã®ä½¿ç”¨ãŒåˆã‚ã¦ã®æ–¹ã¯ã€ +ãƒã‚°ã‚¤ãƒ³å‰ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆãŒå¿…è¦ã§ã™ã€‚ +www.secondlife.comã«ç§»å‹•ã—ã€æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’è¡Œã„ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="続行" yestext="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..."/> + </notification> + <notification name="LoginPacketNeverReceived"> + 接続ãŒãªã‹ãªã‹ã§ãã¾ã›ã‚“。 ãŠä½¿ã„ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‹ã€[SECOND_LIFE_GRID] ã®å•é¡Œã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ + +インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã¦ã‹ã‚‰æ•°åˆ†å¾Œã«å†æŽ¥ç¶šã™ã‚‹ã‹ã€ãƒ˜ãƒ«ãƒ—をクリックã—㦠[SUPPORT_SITE] ã‚’ã”覧ã«ãªã‚‹ã‹ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’クリックã—ã¦ãƒ›ãƒ¼ãƒ ã«ç§»å‹•ã—ã¦ã¿ã¦ãã ã•ã„。 + <url name="url"> + http://jp.secondlife.com/support/ + </url> + <form name="form"> + <button name="OK" text="OK"/> + <button name="Help" text="ヘルプ"/> + <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> + </form> + </notification> + <notification name="WelcomeChooseSex"> + ã¾ã‚‚ãªãã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ + +矢å°ã‚ーを使用ã—ã¦æ©ãã¾ã™ã€‚ +ヘルプãŒå¿…è¦ãªã¨ãã‚„[SECOND_LIFE]ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€ +F1ã‚ーを押ã—ã¦ãã ã•ã„。 +男性ã‚ã‚‹ã„ã¯å¥³æ€§ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。 +ã‚ãªãŸã®æ±ºå®šã¯å¾Œã§å¤‰æ›´ã§ãã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/> + </notification> + <notification name="NotEnoughCurrency"> + [NAME] L$[PRICE] 残高ä¸è¶³ã®ãŸã‚実行ä¸å¯ã§ã™ã€‚ + </notification> + <notification name="GrantedModifyRights"> + [FIRST_NAME] [LAST_NAME] ã®ã‚ªãƒ–ジェクトã®ç·¨é›†æ¨©é™ã‚’å¾—ã¾ã—ãŸã€‚ + </notification> + <notification name="RevokedModifyRights"> + [FIRST_NAME] [LAST_NAME] +ã®ã‚ªãƒ–ジェクトを修æ£ã™ã‚‹æ¨©é™ãŒå–り消ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="FlushMapVisibilityCaches"> + ã“ã®æ‰‹é †ã¯ã€ã“ã®åœ°åŸŸã®åœ°å›³ã®ã‚ャッシュを消去ã—ã¾ã™ã€‚ +ã“ã‚ŒãŒä¾¿åˆ©ãªã®ã¯ãƒ‡ãƒãƒƒã‚°æ™‚ã®ã¿ã§ã™ã€‚ +(作æˆä¸ã¯5分間経ã¤ã¨ã€å…¨å“¡ã®åœ°å›³ãŒå†åº¦ãƒã‚°ã‚¤ãƒ³å¾Œã« +æ›´æ–°ã•ã‚Œã¾ã™ï¼‰ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BuyOneObjectOnly"> + 一度ã«ä¸€ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã¨è²·ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オブジェクトを一ã¤ã ã‘é¸ã‚“ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="OnlyCopyContentsOfSingleItem"> + 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã‚³ãƒ”ーã§ãã¾ã›ã‚“。 +é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="KickUsersFromRegion"> + ã“ã®åœ°åŸŸã®å…¨ã¦ã®ä½äººã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="EstateObjectReturn"> + [USER_NAME]ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトを返å´ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="InvalidTerrainBitDepth"> + 地域テクスãƒãƒ£ã‚’è¨å®šã§ãã¾ã›ã‚“ã§ã—ãŸï¼š +地形テクスãƒãƒ£[TEXTURE_NUM]ã¯ã€ç„¡åŠ¹ã®ãƒ“ット深度[TEXTURE_BIT_DEPTH]ã§ã™ã€‚ + +テクスãƒãƒ£[TEXTURE_NUM]ã‚’24ビット512x512ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。 + </notification> + <notification name="InvalidTerrainSize"> + 地域テクスãƒãƒ£ã‚’è¨å®šã§ãã¾ã›ã‚“ã§ã—ãŸï¼š +地形テクスãƒãƒ£[TEXTURE_NUM]ã¯ã€[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]ã§ã¯å¤§ãã™ãŽã¾ã™ã€‚ + +テクスãƒãƒ£[TEXTURE_NUM]ã‚’24ビット512x512ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。 + </notification> + <notification name="RawUploadStarted"> + アップãƒãƒ¼ãƒ‰é–‹å§‹ã€‚ 接続速度ã«ã‚ˆã£ã¦ã¯ã€ +最大2分間ã‹ã‹ã‚Šã¾ã™ã€‚ + </notification> + <notification name="ConfirmBakeTerrain"> + ç¾åœ¨ã®åœ°å½¢ã‚’構築ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +ã“ã®æ“作を行ã†ã¨ã€ç¾åœ¨ã®åœ°å½¢ãŒä¸Šæ˜‡ï¼ä¸‹é™ã®åˆ¶é™ç¯„囲ã®ä¸å¿ƒã«ãªã‚Šã€ã€Œå¾©å¸°ã€ãƒ„ールã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã«ãªã‚Šã¾ã™ã€‚ +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="MaxAllowedAgentOnRegion"> + 許å¯ä½äººã¯ [MAX_AGENTS] 人ã¾ã§ã§ã™ã€‚ + </notification> + <notification name="MaxBannedAgentsOnRegion"> + ç¦æ¢ä½äººã¯[MAX_BANNED]人ã¾ã§ã§ã™ã€‚ + </notification> + <notification name="MaxAgentOnRegionBatch"> + [NUM_ADDED] 個ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿½åŠ ã—よã†ã¨ã—ã¦å¤±æ•—ã—ã¾ã—ãŸï¼š [MAX_AGENTS] [LIST_TYPE] 制é™ã‚’ [NUM_EXCESS] 個超éŽã—ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="MaxAllowedGroupsOnRegion"> + 許å¯ã‚°ãƒ«ãƒ¼ãƒ—ã¯[MAX_GROUPS]グループã¾ã§ã§ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="構築ã™ã‚‹"/> + </notification> + <notification name="MaxManagersOnRegion"> + ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯[MAX_MANAGER]人ã¾ã§ã§ã™ã€‚ + </notification> + <notification name="OwnerCanNotBeDenied"> + ä¸å‹•ç”£ã‚ªãƒ¼ãƒŠãƒ¼ã‚’ä¸å‹•ç”£ã€Œç¦æ¢ä½äººã€ãƒªã‚¹ãƒˆã«è¿½åŠ ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CanNotChangeAppearanceUntilLoaded"> + æœãŠã‚ˆã³å½¢ãŒãƒãƒ¼ãƒ‰ã•ã‚Œã‚‹ã¾ã§ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="ClassifiedMustBeAlphanumeric"> + クラシファイド広告ã®åå‰ã¯ã€ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆã‹ +æ•°å—ã§å§‹ã‚ã¾ã™ã€‚ å¥èªç‚¹ã§ã¯å§‹ã‚られã¾ã›ã‚“。 + </notification> + <notification name="CantSetBuyObject"> + オブジェクトãŒè²©å£²å¯¾è±¡ã§ã¯ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ãŒè¨å®šã§ãã¾ã›ã‚“。 +販売対象ã®ã‚ªãƒ–ジェクトをè¨å®šã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="FinishedRawDownload"> + æœªåŠ å·¥ã®åœ°å½¢ãƒ•ã‚¡ã‚¤ãƒ«ã‚’次ã¸ã¨ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã—ãŸï¼š +[DOWNLOAD_PATH]。 + </notification> + <notification name="DownloadWindowsMandatory"> + [APP_NAME]ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +[APP_NAME]を使用ã™ã‚‹ãŸã‚ã«ã¯ã€ +ã“ã®ã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadWindows"> + [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadWindowsReleaseForDownload"> + [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadLinuxMandatory"> + [APP_NAME] ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +[APP_NAME] ã‚’ã”利用ã«ãªã‚‹ã«ã¯ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadLinux"> + [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="続ã‘ã‚‹" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadLinuxReleaseForDownload"> + [APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスå‘上ã®ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="続ã‘ã‚‹" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadMacMandatory"> + [APP_NAME]ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +[APP_NAME]を使用ã™ã‚‹ãŸã‚ã«ã€ +ã“ã®ã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + +アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadMac"> + [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ + +アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DownloadMacReleaseForDownload"> + [APP_NAME]ã®ã‚¢ãƒƒãƒ—デート・ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™ã€‚ +[MESSAGE] +ã“ã®ã‚¢ãƒƒãƒ—デートã¯å¿…é ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ãƒ‘フォーマンスã¨å®‰å®šæ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ + +アプリケーションãŒã‚るフォルダã«ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンãƒãƒ¼ãƒ‰"/> + </notification> + <notification name="DeedObjectToGroup"> + ã“ã®ã‚ªãƒ–ジェクトをè²æ¸¡ã™ã‚‹ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã¯ä»¥ä¸‹ã®ã“ã¨ãŒå¯èƒ½ã§ã™ï¼š +* オブジェクトã«æ”¯æ‰•ã‚ã‚ŒãŸL$ã‚’å—é ˜ã—ã¾ã™ã€‚ + <usetemplate ignoretext="オブジェクトをグループã«è²æ¸¡ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="è²æ¸¡"/> + </notification> + <notification name="WebLaunchExternalTarget"> + Web ブラウザを開ã„ã¦ã“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を表示ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ブラウザを起動ã—㦠Web ページを見る" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="WebLaunchJoinNow"> + secondlife.com ã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ç®¡ç†ã‚’ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="WebLaunchSecurityIssues"> + [SECOND_LIFE] Wikiã§ã€ +ã‚»ã‚ュリティå•é¡Œã‚’å ±å‘Šã™ã‚‹æ–¹æ³•ã‚’ã”覧ãã ã•ã„。 + <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚»ã‚ュリティå•é¡Œã®å ±å‘Šã®ä»•æ–¹ã‚’確èªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="WebLaunchQAWiki"> + [SECOND_LIFE] å“質ä¿è¨¼é–¢é€£Wikiã‚’ã”覧ãã ã•ã„。 + <usetemplate ignoretext="ブラウザを起動ã—㦠QA Wiki を見る" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="WebLaunchPublicIssue"> + [SECOND_LIFE]ã®ãƒ‘ブリックå•é¡Œãƒˆãƒ©ãƒƒã‚«ãƒ¼ã§ã€ +ãƒã‚°ã‚„ãã®ä»–ã®å•é¡Œã‚’å ±å‘Šã§ãã¾ã™ã€‚ + <usetemplate ignoretext="ブラウザを確èªã—ã¦ãƒ‘ブリックå•é¡Œãƒˆãƒ©ãƒƒã‚«ãƒ¼ã‚’使用ã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="ページã¸è¡Œã"/> + </notification> + <notification name="WebLaunchSupportWiki"> + Lindenå…¬å¼ãƒ–ãƒã‚°ã§ã€æœ€æ–°ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚„æƒ…å ±ã‚’å…¥æ‰‹ã—ã¦ãã ã•ã„。 + <usetemplate ignoretext="ブラウザを起動ã—ã¦å…¬å¼ãƒ–ãƒã‚°ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLGuide"> + スクリプトガイドを開ãã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¹ã‚¯ãƒªãƒ—トガイドを見る" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="WebLaunchLSLWiki"> + LSL ãƒãƒ¼ã‚¿ãƒ«ã§ã‚¹ã‚¯ãƒªãƒ—トã«é–¢ã™ã‚‹æƒ…å ±ã‚’ç¢ºèªã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ブラウザを起動ã—㦠LSL ãƒãƒ¼ã‚¿ãƒ«ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> + </notification> + <notification name="ReturnToOwner"> + é¸æŠžã—ãŸã‚ªãƒ–ジェクトをã€æ‰€æœ‰è€…ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ +è²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクト㯠+以å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•ã‚Œã¾ã™ã€‚ + +*è¦å‘Š* 移転ãŒä¸å¯èƒ½ã®è²æ¸¡ã•ã‚ŒãŸã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•ã‚Œã¾ã™ï¼ + <usetemplate ignoretext="オブジェクトを所有者ã«è¿”å´ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="GroupLeaveConfirmMember"> + ç¾åœ¨ã‚ãªãŸã¯ [GROUP]ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚ +ã“ã“ã‹ã‚‰æŠœã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ConfirmKick"> + ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’グリッド外ã«ã‚ックã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ã‚’追ã„出ã™"/> + </notification> + <notification name="MuteLinden"> + 残念ãªãŒã‚‰Lindenを無視è¨å®šã«å…¥ã‚Œã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CannotStartAuctionAlreadyForSale"> + æ—¢ã«å£²ã‚Šå‡ºã—ä¸ã®åŒºç”»ãªã®ã§ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«ã‹ã‘ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オークションã«ã‹ã‘ãŸã„å ´åˆã¯å£²ã‚Šå‡ºã—è¨å®šã‚’解除ã—ã¦ã‹ã‚‰è¡Œã£ã¦ãã ã•ã„。 + </notification> + <notification label="オブジェクトをåå‰ã§ãƒŸãƒ¥ãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ" name="MuteByNameFailed"> + ã‚ãªãŸã¯ã™ã§ã«ã“ã®åå‰ã‚’ミュートã—ã¦ã„ã¾ã™ã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RemoveItemWarn"> + コンテンツを削除ã™ã‚‹ã¨ã€è¨±å¯ãŒã‚ã£ã¦ã‚‚ã€ã‚ªãƒ–ジェクトã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ +ãã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’続ã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="CantOfferCallingCard"> + ç¾åœ¨ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="CantOfferFriendship"> + ç¾åœ¨ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚·ãƒƒãƒ—ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«è©¦ã—ã¦ãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="BusyModeSet"> + å–ã‚Šè¾¼ã¿ä¸ãƒ¢ãƒ¼ãƒ‰ã«ãªã‚Šã¾ã—ãŸã€‚ +ãƒãƒ£ãƒƒãƒˆã¨ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯è¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。 å—ä¿¡ã™ã‚‹ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯å–ã‚Šè¾¼ã¿ä¸è¿”ç”メッセージãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ã‚¡ãƒ¼ã¯å—ã‘å–ã‚Šæ‹’å¦ã¨ãªã‚Šã¾ã™ã€‚ アイテムã®ã‚ªãƒ•ã‚¡ãƒ¼ã¯ã™ã¹ã¦ã‚´ãƒŸç®±ã«å…¥ã‚Šã¾ã™ã€‚ + <usetemplate ignoretext="ãƒã‚°ã‚¤ãƒ³çŠ¶æ…‹ã‚’å–ã‚Šè¾¼ã¿ä¸ãƒ¢ãƒ¼ãƒ‰ã«å¤‰æ›´ã™ã‚‹" name="okignore" yestext="OK"/> + </notification> + <notification name="JoinedTooManyGroupsMember"> + åŠ å…¥ã§ãるグループã®æœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ãŸã‚ã«ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—を脱退ã™ã‚‹ã‹ã€ã“ã®ç”³ã—入れをæ–ã£ã¦ãã ã•ã„。 +[NAME] ãŒã‚ãªãŸã‚’グループã®ãƒ¡ãƒ³ãƒãƒ¼ã¨ã—ã¦å‹§èª˜ã—ã¦ã„ã¾ã™ã€‚ +[INVITE] + <usetemplate name="okcancelbuttons" notext="辞退" yestext="å‚åŠ "/> + </notification> + <notification name="KickUser"> + ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã—ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒã‚°ã‚ªãƒ•ã•ã‚Œã¾ã—ãŸã€‚ + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="KickAllUsers"> + ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã‚°ãƒªãƒƒãƒ‰ã«ã„る全員を追ã„出ã—ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒã‚°ã‚ªãƒ•ã•ã‚Œã¾ã—ãŸã€‚ + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="FreezeUser"> + ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + ã‚ãªãŸã¯ãƒ•ãƒªãƒ¼ã‚ºã•ã‚Œã¦ã„ã¾ã™ã€‚ å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 管ç†è€…ãŒIMを通ã˜ã¦ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚ + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="UnFreezeUser"> + ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ•ãƒªãƒ¼ã‚ºã‚’解除ã—ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + ã‚‚ã†ãƒ•ãƒªãƒ¼ã‚ºã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="OfferTeleport"> + 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã‚ãªãŸãŒä»Šã„ã‚‹å ´æ‰€ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="OfferTeleportFromGod"> + ユーザーをゴッド・コールã§å‘¼ã³å¯„ã›ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <input name="message"> + [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="TeleportFromLandmark"> + 本当ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ランドマークã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> + </notification> + <notification name="TeleportToPick"> + [PICK] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ピックã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="テレãƒãƒ¼ãƒˆ"/> + </notification> + <notification label="ã‚ãªãŸã®ä¸å‹•ç”£å†…ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageEstate"> + 今ã‚ãªãŸã®ä¸å‹•ç”£ã«ã„る人全員ã«é€ã‚‹ +çŸã„メッセージを入力ã—ã¦ãã ã•ã„。 + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification label="Lindenã®ä¸å‹•ç”£ã‚’変更" name="ChangeLindenEstate"> + ã‚ãªãŸã¯Linden所有ã®ä¸å‹•ç”£ï¼ˆãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + +ã“ã‚Œã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®çµŒé¨“ã‚’æ ¹æœ¬ã‹ã‚‰æºã‚‹ãŒã—ã‹ããªã„「éžå¸¸ã«å±é™ºãªè¡Œç‚ºã€ã§ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€ãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã§å¤šæ•°ã®åœ°åŸŸãŒå¤‰æ›´ã•ã‚Œã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚ + +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification label="Lindenã®ä¸å‹•ç”£ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’変更" name="ChangeLindenAccess"> + ã‚ãªãŸã¯Linden所有ã®ä¸å‹•ç”£ï¼ˆãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + +ã“ã®è¡Œç‚ºã¯ã€Œå±é™ºã€ã§ã‚ã‚Šã€ã‚°ãƒªãƒƒãƒ‰ã‹ã‚‰ã‚ªãƒ–ジェクトやãŠé‡‘ã®è»¢é€ã‚’ã‚‚ãŸã‚‰ã™ãƒãƒƒã‚ングを引ãèµ·ã“ã™å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€å®Œå…¨ã«ãれをæ„図ã—ãŸå ´åˆã®ã¿è¡Œã†ã¹ãã‚‚ã®ã§ã™ã€‚ +ã“ã‚Œã«ã‚ˆã‚Šå¤šæ•°ã®åœ°åŸŸãŒå¤‰æ›´ã•ã‚Œã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentAdd"> + ã“ã®ä¸å‹•ç”£ã®è¨±å¯ãƒªã‚¹ãƒˆã ã‘ã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãã‚Œã¨ã‚‚[ALL_ESTATES]ã®ã™ã¹ã¦ã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentRemove"> + 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•ç”£ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãã‚Œã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupAdd"> + ã“ã®ä¸å‹•ç”£ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã ã‘ã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãã‚Œã¨ã‚‚[ALL_ESTATES]ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupRemove"> + 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•ç”£ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãã‚Œã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentAdd"> + ã“ã®ä¸å‹•ç”£ã«ã¤ã„ã¦ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ ãã‚Œã¨ã‚‚[ALL_ESTATE]ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentRemove"> + ã“ã®ä½äººã‚’ã€ã“ã®ä¸å‹•ç”£ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã¸ã¨ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€ç¦æ¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerAdd"> + ã“ã®ä¸å‹•ç”£ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã«å¯¾ã—ã¦ã€ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> + </notification> + <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerRemove"> + ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’ã€ã“ã®ä¸å‹•ç”£ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã‹ã‚‰ã€å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> + </notification> + <notification label="ã‚ックを確èª" name="EstateKickUser"> + ã“ã®ä¸å‹•ç”£ã‹ã‚‰[EVIL_USER]を追ã„出ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="EstateChangeCovenant"> + ä¸å‹•ç”£ç´„款を変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ + +最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="RegionEntryAccessBlocked_KB"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + +ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å¦ã³ã¾ã™ã‹ï¼Ÿ + <url name="url"> + http://wiki.secondlife.com/wiki/レーティング区分概è¦_(KB) + </url> + <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> + </notification> + <notification name="RegionEntryAccessBlocked_Notify"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="RegionEntryAccessBlocked_Change"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + +「è¨å®šã‚’変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] コンテンツã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ +ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。 + <form name="form"> + <button name="OK" text="è¨å®šã®å¤‰æ›´"/> + <button default="true" name="Cancel" text="é–‰ã˜ã‚‹"/> + <ignore name="ignore" text="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"/> + </form> + </notification> + <notification name="LandClaimAccessBlocked"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ + +最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandClaimAccessBlocked_KB"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + +ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å¦ã³ã¾ã™ã‹ï¼Ÿ + <url name="url"> + http://wiki.secondlife.com/wiki/レーティング区分概è¦_(KB) + </url> + <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®åœŸåœ°ã‚’å–å¾—ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> + </notification> + <notification name="LandClaimAccessBlocked_Notify"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="LandClaimAccessBlocked_Change"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + +「è¨å®šã‚’変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] コンテンツã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ +ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。 + <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’å–å¾—ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="è¨å®šã®å¤‰æ›´"/> + </notification> + <notification name="LandBuyAccessBlocked"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ + +最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="LandBuyAccessBlocked_KB"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + +ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å¦ã³ã¾ã™ã‹ï¼Ÿ + <url name="url"> + http://wiki.secondlife.com/wiki/レーティング区分概è¦_(KB) + </url> + <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/> + </notification> + <notification name="LandBuyAccessBlocked_Notify"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="LandBuyAccessBlocked_Change"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + +「è¨å®šã‚’変更ã€ã‚’クリックã™ã‚‹ã¨ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒä¸ŠãŒã‚Šã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] コンテンツã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ +ã‚ã¨ã§è¨å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨å®šã€ï¼žã€Œä¸€èˆ¬ã€ã‚’ã”覧ãã ã•ã„。 + <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="è¨å®šã®å¤‰æ›´"/> + </notification> + <notification name="TooManyPrimsSelected"> + é¸æŠžã—ãŸãƒ—リムãŒå¤šã™ãŽã¾ã™ã€‚ +[MAX_PRIM_COUNT] ã‚’é¸æŠžã™ã‚‹ã‹ã€ +プリム数を減らã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ProblemImportingEstateCovenant"> + ä¸å‹•ç”£ç´„款ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«å•é¡Œç™ºç”Ÿã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ProblemAddingEstateManager"> + æ–°ã—ã„ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã®è¿½åŠ ã«é–¢ã™ã‚‹å•é¡Œï¼š +1ã¤ä»¥ä¸Šã®ä¸å‹•ç”£ã§ã€ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="ProblemAddingEstateGeneric"> + ä¸å‹•ç”£ãƒªã‚¹ãƒˆã®è¿½åŠ ã«é–¢ã™ã‚‹å•é¡Œï¼š +1ã¤ä»¥ä¸Šã®ä¸å‹•ç”£ã§ã€ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="UnableToLoadNotecardAsset"> + ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®è³‡ç”£IDã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="NotAllowedToViewNotecard"> + è¦æ±‚ã•ã‚ŒãŸè³‡ç”£IDã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MissingNotecardAssetID"> + ノートカード用資産IDãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PublishClassified"> + 注æ„:クラシファイド広告ã®æ–™é‡‘ã¯æ‰•ã„戻ã—ã•ã‚Œã¾ã›ã‚“。 + +L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã‚’今ã™ã公開ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="SetClassifiedMature"> + ã“ã®åºƒå‘Šã«Matureコンテンツã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="SetGroupMature"> + ã“ã®åºƒå‘Šã«Matureコンテンツã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="ã‚ャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification label="å†èµ·å‹•ã‚’確èª" name="ConfirmRestart"> + ã“ã®åœ°åŸŸã‚’2分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification label="ã“ã®åœ°åŸŸå†…ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageRegion"> + ã“ã®åœ°åŸŸã«ã„る人全員ã«é€ã‚‹ +çŸã„メッセージを入力ã—ã¦ãã ã•ã„。 + <form name="form"> + <input name="message"/> + <button name="OK" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification label="地域ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šå¤‰æ›´æ¸ˆã¿" name="RegionMaturityChange"> + ã“ã®åœ°åŸŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šãŒã‚¢ãƒƒãƒ—デートã•ã‚Œã¾ã—ãŸã€‚ +ã“ã®å¤‰æ›´ãŒåœ°å›³ã«åæ˜ ã•ã‚Œã‚‹ã¾ã§ã«ã¯ã—ã°ã‚‰ã時間ãŒã‹ã‹ã‚Šã¾ã™ã€‚ + </notification> + <notification label="ボイスãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´" name="VoiceVersionMismatch"> + ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® [APP_NAME] ã¯ã€ +ã“ã®åœ°åŸŸã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆæ©Ÿèƒ½ã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“。 +ボイスãƒãƒ£ãƒƒãƒˆã‚’æ£ã—ã使用ã™ã‚‹ã«ã¯ã€ +[APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚ + </notification> + <notification label="オブジェクトを購入ã§ãã¾ã›ã‚“" name="BuyObjectOneOwner"> + 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 +å˜ä¸€ã®ã‚ªãƒ–ジェクトをé¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOnly"> + 一度ã«è¤‡æ•°ã®ã‚ªãƒ–ジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è³¼å…¥ã§ãã¾ã›ã‚“。 +é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOwner"> + 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 +å˜ä¸€ã®ã‚ªãƒ–ジェクトをé¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="BuyOriginal"> + オリジナルã®ã‚ªãƒ–ジェクトを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ +ã“ã‚Œã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚ +å¯èƒ½ãªæ“作ã¯ã€ +変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠+å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BuyOriginalNoOwner"> + L$[PRICE]ã§ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ã‚ªãƒ–ジェクトを購入ã—ã¾ã™ã‹ï¼Ÿ +ã“ã‚Œã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚ +å¯èƒ½ãªæ“作ã¯ã€ +変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠+å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BuyCopy"> + コピーを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ +購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ +å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠+å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BuyCopyNoOwner"> + L$[PRICE]ã§ã‚³ãƒ”ーを購入ã—ã¾ã™ã‹ï¼Ÿ +購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ +å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]〠+å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BuyContents"> + コンテンツを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ +購入ã—ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="BuyContentsNoOwner"> + L$[PRICE]ã§ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を購入ã—ã¾ã™ã‹ï¼Ÿ +購入ã—ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ConfirmPurchase"> + ã“ã®å–引ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šè¡Œã‚ã‚Œã¾ã™ï¼š +[ACTION] + +ã“ã®è³¼å…¥ã‚’続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> + </notification> + <notification name="ConfirmPurchasePassword"> + ã“ã®å–引ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šè¡Œã‚ã‚Œã¾ã™ï¼š +[ACTION] + +ã“ã®è³¼å…¥ã‚’続行ã—ã¾ã™ã‹ï¼Ÿ +パスワードをå†å…¥åŠ›ã—ã€ã€ŒOKã€ã‚’クリックã—ã¦ãã ã•ã„。 + <form name="form"> + <input name="message"/> + <button name="ConfirmPurchase" text="OK"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="SetPickLocation"> + メモ: +本ピックã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’æ›´æ–°ã—ã¾ã—ãŸãŒã€ +ä»–ã®è©³ç´°ã¯å…ƒã®å€¤ã®ã¾ã¾ã«ãªã‚Šã¾ã™ã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromObject"> + 「コピーç¦æ¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•ã‚Œã¾ã—ãŸã€‚ +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•ã‚Œãªã„ã¾ã¾ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•ã‚Œã¾ã™ã€‚ + + +アイテムを動ã‹ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ をオブジェクトã‹ã‚‰å‹•ã‹ã™å‰ã«è¦å‘Šã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="MoveInventoryFromScriptedObject"> + 「コピーç¦æ¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•ã‚Œã¾ã—ãŸã€‚ +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•ã‚Œã‚‹ã®ã§ã¯ãªãã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•ã‚Œã¾ã™ã€‚ +ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€æŒã¡ç‰©ã«ç§»å‹•ã•ã›ã‚‹ã¨ +スクリプトã«èª¤å‹•ä½œãŒèµ·ãã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + +æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ を移動ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="スクリプト入りã®ã‚ªãƒ–ジェクトを壊ã™æã‚Œã®ã‚る「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å‹•ã‹ã™å‰ã«è¦å‘Šã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ClickActionNotPayable"> + è¦å‘Šï¼š クリックã§ã€Œã‚ªãƒ–ジェクトã«æ”¯æ‰•ã†ã€è¨å®šã‚’ã—ã¾ã—ãŸã€‚スクリプト㫠money()イベントãŒè¿½åŠ ã•ã‚Œã‚‹ã¨å‹•ä½œã—ã¾ã™ã€‚ + <form name="form"> + <ignore name="ignore" text="money() スクリプトを入れãšã«ã‚ªãƒ–ジェクトを制作ä¸ã«ã€ã€Œã‚ªãƒ–ジェクトã«æ”¯æ‰•ã†ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’è¨å®š"/> + </form> + </notification> + <notification name="OpenObjectCannotCopy"> + ã“ã®ã‚ªãƒ–ジェクトã«ã¯ã€ã‚ãªãŸãŒã‚³ãƒ”ーã§ãるアイテムã¯ã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="WebLaunchAccountHistory"> + secondlife.com ã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ´ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/> + </notification> + <notification name="ConfirmQuit"> + 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="終了時ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/> + </notification> + <notification name="HelpReportAbuseEmailLL"> + 利用è¦ç´„é•åã¨ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰é•åã®å ±å‘Šã«ã“ã®ãƒ„ールをã”使用ãã ã•ã„。 å‚照: + +http://secondlife.com/corporate/tos.php +http://secondlife.com/corporate/cs.php + +利用è¦ç´„é•åã¨ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰é•åã«é–¢ã™ã‚‹å…¨ã¦ã®ãƒ¬ãƒãƒ¼ãƒˆã¯ã€èª¿æŸ»ã•ã‚Œã€è§£æ±ºã•ã‚Œã¾ã™ã€‚ +以下ã®ãƒªãƒ³ã‚¯å…ˆã®è¢«å®³å ±å‘Šã«ã¦ãã®ç¢ºèªã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + +http://secondlife.com/support/incidentreport.php + </notification> + <notification name="HelpReportAbuseEmailEO"> + é‡è¦ï¼š ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã¯Linden Lab 社ã§ã¯ãªã〠+ã‚ãªãŸãŒç¾åœ¨ã„る地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«é€ã‚‰ã‚Œã¾ã™ã€‚ +- +ã‚ãªãŸãŒä»Šã„る地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€ +ä½äººã¨è¨ªå•è€…ã¸ã®ã‚µãƒ¼ãƒ“スã®ä¸€ç’°ã¨ã—ã¦ã€ã“ã®åœ°åŸŸã‹ã‚‰ã®ãƒ¬ãƒãƒ¼ãƒˆã‚’ã™ã¹ã¦å—ã‘付ã‘ã€è§£æ±ºã™ã‚‹ã“ã¨ã«åŒæ„ã—ã¦ã„ã¾ã™ã€‚ +よã£ã¦Linden Lab 社ãŒã€ +ã‚ãªãŸãŒã“ã“ã‹ã‚‰æ出ã™ã‚‹ãƒ¬ãƒãƒ¼ãƒˆã‚’調査ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。 +地域ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã€ä¸å‹•ç”£ç´„款ã§æŒ‡å®šã—ã¦ã„る地元ã®è¦å‰‡ã‚’基ã«ã€å ±å‘Šã•ã‚ŒãŸå•é¡Œã‚’解決ã—ã¾ã™ã€‚ +(「世界ã€ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€ŒåœŸåœ°æƒ…å ±ã€ã‚’é¸ã¶ã¨ã€ç´„款を閲覧ã§ãã¾ã™ï¼‰ +- +ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã«é–¢ã™ã‚‹è§£æ±ºç–ã¯ã€ã“ã®åœ°åŸŸã«ã ã‘当ã¦ã¯ã¾ã‚Šã¾ã™ã€‚ +ä½äººãŒ[SECOND_LIFE] ã®ä»–ã®åœ°åŸŸã¸ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹éš›ã€ +ã“ã®ãƒ¬ãƒãƒ¼ãƒˆã®çµæžœã«å½±éŸ¿ã•ã‚Œã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。 +Linden Lab 社ã ã‘ãŒ[SECOND_LIFE] 全域ã«ãŠã‘ã‚‹ +アクセス制é™æ¨©ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="HelpReportAbuseSelectCategory"> + å«ŒãŒã‚‰ã›å ±å‘Šã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。 +カテゴリをé¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ + </notification> + <notification name="HelpReportAbuseAbuserNameEmpty"> + å«ŒãŒã‚‰ã›è¡Œç‚ºã‚’ã—ãŸäººã®åå‰ã‚’入力ã—ã¦ãã ã•ã„。 +æ£ç¢ºãªæƒ…å ±ã®å…¥åŠ›ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ + </notification> + <notification name="HelpReportAbuseAbuserLocationEmpty"> + å«ŒãŒã‚‰ã›ãŒã‚ã£ãŸå ´æ‰€ã‚’入力ã—ã¦ãã ã•ã„。 +æ£ç¢ºãªæƒ…å ±ã®å…¥åŠ›ã«ã‚ˆã‚Šã€å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ + </notification> + <notification name="HelpReportAbuseSummaryEmpty"> + å«ŒãŒã‚‰ã›ã®æ¦‚è¦ã‚’入力ã—ã¦ãã ã•ã„。 +æ£ç¢ºãªæ¦‚è¦ã®å…¥åŠ›ã«ã‚ˆã‚Šã€ +å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ + </notification> + <notification name="HelpReportAbuseDetailsEmpty"> + å«ŒãŒã‚‰ã›ã®è©³ç´°ãªèª¬æ˜Žã‚’入力ã—ã¦ãã ã•ã„。 +åå‰ã‚„å«ŒãŒã‚‰ã›ã®è©³ç´°ã‚’ã€ã§ãã‚‹ã ã‘具体的ã«å…¥åŠ›ã—ã¦ãã ã•ã„。 + +æ£ç¢ºãªèª¬æ˜Žã®å…¥åŠ›ã«ã‚ˆã‚Šã€ +å«ŒãŒã‚‰ã›å ±å‘Šã®å‡¦ç†ã‚„ä¿ç®¡ã«å¤§å¤‰å½¹ç«‹ã¡ã¾ã™ã€‚ + </notification> + <notification name="HelpReportAbuseContainsCopyright"> + ä½äººã®çš†æ§˜ã¸ã€ + +知的財産ã®ä¾µå®³ã«é–¢ã™ã‚‹å ±å‘Šã‚’è¡Œã†éš›ã«ã¯ã€ä»¥ä¸‹ã®ç‚¹ã«æ³¨æ„ã—ã¦ãã ã•ã„。 + +(1) å«ŒãŒã‚‰ã›ã®å ±å‘Šã®ãƒ—ãƒã‚»ã‚¹ +[SECOND_LIFE] ã®æ¨©é™ã‚·ã‚¹ãƒ†ãƒ を悪用ã—ã¦ã„ã‚‹ä½äººã‚’見ã¤ã‘ãŸã‚‰ã€ +å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’è¡Œã£ã¦ãã ã•ã„。 +例ãˆã°ã‚³ãƒ”ーBotã®ä½¿ç”¨ã€ãã‚Œã«ä¼¼ãŸãƒ„ールã®ä½¿ç”¨ã«ã‚ˆã‚‹çŸ¥çš„財産権ã®ä¾µå®³ãŒã‚ã‚Šã¾ã™ã€‚ +アビューズãƒãƒ¼ãƒ ã¯èª¿æŸ»ã«åŸºã¥ã〠+[SECOND_LIFE] ã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãƒ¼ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ã‚„ +利用è¦ç´„ã«é•åã™ã‚‹è¡Œç‚ºã¨åˆ¤æ–ã•ã‚ŒãŸå ´åˆã«ã¯é©åˆ‡ãªå‡¦ç½®ã‚’è¡Œã£ã¦ã„ã¾ã™ã€‚ +ãŸã ã—ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’[SECOND_LIFE] ã‹ã‚‰æ’¤åŽ»ã—ã¦ã»ã—ã„〠+ã¨ã„ã£ãŸè¦æœ›ã«ã¯ã‚¢ãƒ“ューズãƒãƒ¼ãƒ ã¯å¿œãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + +(2) DMCA(デジタルミレニアム著作権法)åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„撤去プãƒã‚»ã‚¹ +[SECOND_LIFE] ã‹ã‚‰ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»ã‚’リクエストã™ã‚‹ã«ã¯ã€ +著作権侵害通知ã®æ出を行ã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ +å‚照: http://secondlife.com/corporate/dmca.php + +ã“ã®ä»¶ã«é–¢ã™ã‚‹å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’続ã‘ã‚‹éš›ã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦ãã ã•ã„。é¸æŠžã™ã¹ãカテゴリã¯ã€ŒçŸ¥çš„財産ã®ä¾µå®³ï¼žã‚³ãƒ”ーBotåŠã³æ¨©é™ã®æ‚ªç”¨ã€ã®ã»ã†ãŒé©ã—ã¦ã„ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ã®ã§ã”確èªãã ã•ã„。 + +よã‚ã—ããŠé¡˜ã„ã—ã¾ã™ã€‚ + +Linden Lab + </notification> + <notification name="FailedRequirementsCheck"> + 以下ã®å¿…è¦ãªã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒã€[FLOATER]ã‹ã‚‰æŠœã‘è½ã¡ã¦ã„ã¾ã™ +[COMPONENTS] + </notification> + <notification label="æ—¢å˜ã®ä»˜å±žå“ã‚’ç½®æ›" name="ReplaceAttachment"> + 体ã®ã“ã®éƒ¨ä½ã«ã¯ã‚ªãƒ–ジェクトãŒè£…ç€ã•ã‚Œã¦ã„ã¾ã™ã€‚ +é¸æŠžã•ã‚ŒãŸã‚ªãƒ–ジェクトã¨ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ + <form name="form"> + <ignore name="ignore" save_option="true" text="装ç€ã—ã¦ã„るアイテムã¨é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ を入れ替ãˆã‚‹"/> + <button ignore="自動的ã«äº¤æ›" name="Yes" text="OK"/> + <button ignore="交æ›ã—ãªã„" name="No" text="ã‚ャンセル"/> + </form> + </notification> + <notification label="å–ã‚Šè¾¼ã¿ä¸ã®è¦å‘Š" name="BusyModePay"> + ç¾åœ¨ã€å–ã‚Šè¾¼ã¿ä¸ã®ãŸã‚ã€ã“ã®æ”¯æ‰•ã„㨠+引ãæ›ãˆã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒ +ã§ãã¾ã›ã‚“。 + +ã“ã®å–引を完了ã™ã‚‹å‰ã«ã€å–ã‚Šè¾¼ã¿ä¸ã®è¨å®šã‚’解除ã—ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <ignore name="ignore" save_option="true" text="å–ã‚Šè¾¼ã¿ä¸ãƒ¢ãƒ¼ãƒ‰ã®æ™‚ã«æ”¯æ‰•ã‚’ã™ã‚‹"/> + <button ignore="常ã«å–ã‚Šè¾¼ã¿ä¸ã®è¨å®š" name="Yes" text="OK"/> + <button ignore="å–ã‚Šè¾¼ã¿ä¸ã®è¨å®šã«ã—ãªã„" name="No" text="ã‚ャンセル"/> + </form> + </notification> + <notification name="ConfirmEmptyTrash"> + ゴミ箱ã®é …目をã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="æŒã¡ç‰©ã®ã‚´ãƒŸç®±ãƒ•ã‚©ãƒ«ãƒ€ã‚’空ã«ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã‚ャンセル" yestext="OK"/> + </notification> + <notification name="ConfirmClearBrowserCache"> + トラベルã€Webã€æ¤œç´¢ã®å±¥æ´ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> + </notification> + <notification name="ConfirmClearCookies"> + 本当ã«ã‚¯ãƒƒã‚ーをクリアã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> + </notification> + <notification name="ConfirmClearMediaUrlList"> + ä¿å˜ã•ã‚ŒãŸ URL ã®ãƒªã‚¹ãƒˆã‚’消去ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ã¯ã„"/> + </notification> + <notification name="ConfirmEmptyLostAndFound"> + 紛失物ã®é …目をã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="紛失物フォルダを空ã«ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="CopySLURL"> + 次㮠SLurl ãŒã‚¯ãƒªãƒƒãƒ—ボードã«ã‚³ãƒ”ーã•ã‚Œã¾ã—ãŸï¼š + [SLURL] + +Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚Webブラウザã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒãƒ¼ã«è²¼ã‚Šä»˜ã‘ã¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。 + <form name="form"> + <ignore name="ignore" text="クリップボード㫠SLurl ãŒã‚³ãƒ”ーã•ã‚Œã‚‹"/> + </form> + </notification> + <notification name="WLSavePresetAlert"> + ä¿å˜ã•ã‚ŒãŸäº‹å‰è¨å®šã‚’上書ãã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="WLDeletePresetAlert"> + [SKY] を削除ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="WLNoEditDefault"> + デフォルトã®è¨å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="WLMissingSky"> + ã“ã®ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®å˜åœ¨ã—ãªã„「空ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ï¼š [SKY]。 + </notification> + <notification name="PPSaveEffectAlert"> + ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹åŠ¹æžœãŒå˜åœ¨ã—ã¾ã™ã€‚ 上書ãã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="NewSkyPreset"> + æ–°ã—ã„空ã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。 + <form name="form"> + <input name="message"> + æ–°ã—ã„事å‰è¨å®š + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="ã‚ャンセル"/> + </form> + </notification> + <notification name="ExistsSkyPresetAlert"> + 事å‰è¨å®šãŒã™ã§ã«å˜åœ¨ã—ã¾ã™ï¼ + </notification> + <notification name="NewWaterPreset"> + æ–°ã—ã„æ°´ã®äº‹å‰è¨å®šã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。 + <form name="form"> + <input name="message"> + æ–°ã—ã„事å‰è¨å®š + </input> + <button name="OK" text="OK"/> + <button name="Cancel" text="ã‚ャンセル"/> + </form> + </notification> + <notification name="ExistsWaterPresetAlert"> + 事å‰è¨å®šãŒã™ã§ã«å˜åœ¨ã—ã¾ã™ï¼ + </notification> + <notification name="WaterNoEditDefault"> + デフォルトã®è¨å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="ChatterBoxSessionStartError"> + [RECIPIENT]ã¨ã®æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆã‚’開始ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ChatterBoxSessionEventError"> + [EVENT] +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="ForceCloseChatterBoxSession"> + [NAME]ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é–‰ã˜ã¾ã™ã€‚ +[REASON] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="Cannot_Purchase_an_Attachment"> + オブジェクトãŒå–り付ã‘られã¦ã„ã‚‹ã¨ãã¯è³¼å…¥ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification label="デビット許å¯ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¤ã„ã¦" name="DebitPermissionDetails"> + ã“ã®è¦æ±‚を許å¯ã™ã‚‹ã¨ã€ã‚¹ã‚¯ãƒªãƒ—トã‹ã‚‰ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’課金ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ +ã“ã®è¨±å¯ã‚’å–り消ã™ã«ã¯ã€ã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã‚ªãƒ–ジェクトを削除ã™ã‚‹ã‹ã€ã‚ªãƒ–ジェクトã®ã‚¹ã‚¯ãƒªãƒ—トをリセットã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="AutoWearNewClothing"> + 作æˆã—よã†ã¨ã—ã¦ã„る衣類を自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate ignoretext="容姿編集画é¢ã§ä½œæˆã™ã‚‹è¡£é¡žã‚’装ç€ã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="NotAgeVerified"> + 年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã“ã®åŒºç”»ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§å¹´é½¢ã®ç¢ºèªã‚’è¡Œã„ã¾ã™ã‹ï¼Ÿ + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/verification.php?lang=ja + </url> + <usetemplate ignoretext="å¹´é½¢ã®ç¢ºèªã‚’済ã¾ã›ã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="Cannot enter parcel: no payment info on file"> + æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•ã‚Œã¦ã„ãªã„ã¨ã“ã®ã‚¨ãƒªã‚¢ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§ç™»éŒ²ã‚’è¡Œã„ã¾ã™ã‹ï¼Ÿ + +[_URL] + <url name="url" option="0"> + https://secondlife.com/account/index.php?lang=ja + </url> + <usetemplate ignoretext="æ”¯æ‰•æƒ…å ±ãŒç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> + </notification> + <notification name="MissingString"> + æ–‡å—列[STRING_NAME]ãŒstrings.xmlã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ + </notification> + <notification name="SystemMessageTip"> + [MESSAGE] + </notification> + <notification name="Cancelled"> + å–り消ã•ã‚Œã¾ã—㟠+ </notification> + <notification name="CancelledSit"> + 座るã®ã‚’å–り消ã•ã‚Œã¾ã—㟠+ </notification> + <notification name="CancelledAttach"> + 添付ã¯å–り消ã•ã‚Œã¾ã—㟠+ </notification> + <notification name="ReplacedMissingWearable"> + æ¬ è½ã—ã¦ã„ã‚‹æœï¼èº«ä½“部ä½ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚ + </notification> + <notification name="GroupNotice"> + 件å: [SUBJECT], メッセージ: [MESSAGE] + </notification> + <notification name="FriendOnline"> + [FIRST] [LAST] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ã€‚ + </notification> + <notification name="FriendOffline"> + [FIRST] [LAST] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ã€‚ + </notification> + <notification name="AddSelfFriend"> + 残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンドã«è¿½åŠ ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="UploadingAuctionSnapshot"> + インワールドã¨ã‚¦ã‚§ãƒ–・サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップãƒãƒ¼ãƒ‰ä¸ã§ã™... +(所è¦æ™‚間:約5分) + </notification> + <notification name="UploadPayment"> + アップãƒãƒ¼ãƒ‰ã« L$[AMOUNT] 支払ã„ã¾ã—ãŸã€‚ + </notification> + <notification name="UploadWebSnapshotDone"> + Webサイトã®ã‚¹ãƒŠãƒƒãƒ—ショットãŒã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="UploadSnapshotDone"> + インワールドã§ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ãŒå®Œäº†ã—ã¾ã—ãŸã€‚ + </notification> + <notification name="TerrainDownloaded"> + raw地形ãŒãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã•ã‚Œã¾ã—㟠+ </notification> + <notification name="GestureMissing"> + ジェスãƒãƒ£ãƒ¼[NAME] ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="UnableToLoadGesture"> + ジェスãƒãƒ£ãƒ¼[NAME] ã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 +å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。 + </notification> + <notification name="LandmarkMissing"> + データベースã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="UnableToLoadLandmark"> + ランドマークをãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CapsKeyOn"> + CapsLock ã‚ーãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ +パスワードã«å½±éŸ¿ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 + </notification> + <notification name="NotecardMissing"> + ノートカードãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="NotecardNoPermissions"> + ã“ã®ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’見る権é™ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="RezItemNoPermissions"> + オブジェクトをrezã™ã‚‹ã«ã¯ãƒ‘ーミッション(承èªï¼‰ãŒä¸è¶³ã—ã¦ã¾ã™ã€‚ + </notification> + <notification name="UnableToLoadNotecard"> + ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®è³‡ç”£ã‚’ãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 + </notification> + <notification name="ScriptMissing"> + データベースã«ã‚¹ã‚¯ãƒªãƒ—トãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="ScriptNoPermissions"> + スクリプトを閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ã€‚ + </notification> + <notification name="UnableToLoadScript"> + スクリプトをãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="IncompleteInventory"> + ã‚ãªãŸã®æä¾›ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã“ã®å ´æ‰€ã§ã¯ã¾ã 全部æƒã„ã¾ã›ã‚“。 +å°‘ã—ã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotModifyProtectedCategories"> + ä¿è·ã•ã‚ŒãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯ä¿®æ£ã§ãã¾ã›ã‚“。 + </notification> + <notification name="CannotRemoveProtectedCategories"> + ä¿è·ã•ã‚ŒãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。 + </notification> + <notification name="OfferedCard"> + ã‚ãªãŸã¯[FIRST] [LAST] ã« +コーリング・カードをé€ã‚Šã¾ã—ãŸã€‚ + </notification> + <notification name="UnableToBuyWhileDownloading"> + オブジェクトデータã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ä¸ã¯è³¼å…¥ã§ãã¾ã›ã‚“。 +ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="UnableToLinkWhileDownloading"> + オブジェクトデータã®ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ä¸ã¯ãƒªãƒ³ã‚¯ã§ãã¾ã›ã‚“。 +ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CannotBuyObjectsFromDifferentOwners"> + オブジェクトã¯ä¸€åº¦ã«ã¤ã一人ã®æ‰€æœ‰è€…ã‹ã‚‰è³¼å…¥ã§ãã¾ã™ã€‚ +オブジェクトを 1 ã¤ã ã‘é¸ã‚“ã§ãã ã•ã„。 + </notification> + <notification name="ObjectNotForSale"> + ã“ã®ã‚ªãƒ–ジェクトã¯è²©å£²å¯¾è±¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="EnteringGodMode"> + レベル[LEVEL]ã®ã‚´ãƒƒãƒ‰ãƒ»ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™ + </notification> + <notification name="LeavingGodMode"> + レベル [LEVEL] ã®ã‚´ãƒƒãƒ‰ãƒ¢ãƒ¼ãƒ‰ã‚’解除ã—ã¾ã™ + </notification> + <notification name="CopyFailed"> + ã“れをコピーã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="InventoryAccepted"> + [NAME]ã¯ã€æŒã¡ç‰©ã®æ供をå—ã‘入れã¾ã—ãŸã€‚ + </notification> + <notification name="InventoryDeclined"> + [NAME]ã¯ã€æŒã¡ç‰©ã®æ供をæ–ã‚Šã¾ã—ãŸã€‚ + </notification> + <notification name="ObjectMessage"> + [NAME]: [MESSAGE] + </notification> + <notification name="CallingCardAccepted"> + コーリング・カードãŒå—ç†ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="CallingCardDeclined"> + コーリング・カードãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="TeleportToLandmark"> + 本土ã«åˆ°é”ã—ã¾ã—ãŸã€‚ +[NAME]ãªã©ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ç”»é¢å³ä¸‹ã«ã‚る「æŒã¡ç‰©ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ï¼ˆLandmarks)フォルダをé¸æŠžã—ã¦ãã ã•ã„。 +ランドマークをダブルクリックã—ãŸå¾Œã€Œãƒ†ãƒ¬ãƒãƒ¼ãƒˆã€ã‚’クリックã™ã‚‹ã¨ãã®å ´æ‰€ã¸ç§»å‹•ã—ã¾ã™ã€‚ + </notification> + <notification name="TeleportToPerson"> + 本土ã«åˆ°é”ã—ã¾ã—ãŸã€‚ +ä½äººã®[NAME]ã¨æŽ¥è§¦ã™ã‚‹ã«ã¯ã€ç”»é¢å³ä¸‹ã«ã‚る「æŒã¡ç‰©ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ï¼ˆCalling Cards)フォルダをé¸æŠžã—ã¦ãã ã•ã„。 +カードをダブルクリックã—ã€ã€ŒIMã‚’é€ã‚‹ã€ã‚’クリックã—ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¦ãã ã•ã„。 + </notification> + <notification name="CantSelectLandFromMultipleRegions"> + サーãƒãƒ¼ã®å¢ƒç•Œã‚’越ãˆã¦åœŸåœ°ã‚’é¸æŠžã™ã‚‹ã“ã¨ã§ãã¾ã›ã‚“。 +ã‚‚ã£ã¨å°ã•ãªåœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。 + </notification> + <notification name="SearchWordBanned"> + コミュニティスタンダードã«æ˜Žè¨˜ã•ã‚Œã¦ã„るコンテンツ制é™ã«ã‚ˆã‚Šã€ã‚ãªãŸã®æ¤œç´¢èªžã®ä¸€éƒ¨ãŒé™¤å¤–ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="NoContentToSearch"> + å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’è¡Œã£ã¦ãã ã•ã„。(PG, Mature, Adult) + </notification> + <notification name="GroupVote"> + [NAME] ã¯æŠ•ç¥¨ã®ç”³è«‹ã‚’ã—ã¦ã„ã¾ã™ï¼š +[MESSAGE] + <form name="form"> + <button name="VoteNow" text="今ã™ã投票ã™ã‚‹"/> + <button name="Later" text="ã‚ã¨ã§"/> + </form> + </notification> + <notification name="SystemMessage"> + [MESSAGE] + </notification> + <notification name="EventNotification"> + イベント通知: + +[NAME] +[DATE] + <form name="form"> + <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> + <button name="Description" text="説明"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="TransferObjectsHighlighted"> + ã“ã®åŒºç”»ä¸Šã«å˜åœ¨ã™ã‚‹ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã“ã®åŒºç”»ã®è³¼å…¥è€…ã«è²æ¸¡ã•ã‚Œã‚‹ã‚ªãƒ–ジェクトãŒã™ã¹ã¦å¼·èª¿è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ + + +*è²æ¸¡ã•ã‚Œã‚‹æ¨¹æœ¨ã‚„æ¤ç‰©ã¯ã€å¼·èª¿è¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。 + <form name="form"> + <button name="Done" text="完了"/> + </form> + </notification> + <notification name="DeactivatedGesturesTrigger"> + åŒã˜ãƒˆãƒªã‚¬ãƒ¼ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ã—ãªã„ジェスãƒãƒ£ãƒ¼ï¼š +[NAMES] + </notification> + <notification name="NoQuickTime"> + Apple社ã®QuickTimeãŒã‚·ã‚¹ãƒ†ãƒ ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ãªã„ã¨æ€ã‚ã‚Œã¾ã™ã€‚ +ストリーミング・メディアã®å†ç”Ÿã‚’è¡Œã„ãŸã„å ´åˆã¯ã€QuickTimeã®ã‚µã‚¤ãƒˆï¼ˆhttp://www.apple.com/quicktime)ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€QuickTime Player をインストールã—ã¦ãã ã•ã„。 + </notification> + <notification name="NoPlugin"> + 「 [MIME_TYPE] ã€ã® MIME タイプを扱ã†ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ—ラグインãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã¯ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。 + </notification> + <notification name="MediaPluginFailed"> + 次ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ—ラグインãŒå®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸï¼š + [PLUGIN] + +プラグインをインストールã—ãªãŠã™ã‹ã€å•é¡ŒãŒè§£æ±ºã—ãªã„å ´åˆã¯ãƒ¡ãƒ¼ã‚«ãƒ¼ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 + <form name="form"> + <ignore name="ignore" text="メディアプラグインã®å®Ÿè¡Œã«å¤±æ•—"/> + </form> + </notification> + <notification name="OwnedObjectsReturned"> + é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="OtherObjectsReturned"> + é¸æŠžã•ã‚Œã¦ã„る土地ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ + [FIRST] [LAST] + ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="OtherObjectsReturned2"> + é¸æŠžã•ã‚ŒãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚り〠+ä½äººã®[NAME]ã®æ‰€æœ‰ã ã£ãŸã‚ªãƒ–ジェクトã¯ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="GroupObjectsReturned"> + é¸æŠžã•ã‚Œã¦ã„る区画上ã«ã‚ã‚Šã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã ã£ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ +è²æ¸¡ã•ã‚Œã¦ã„ãŸè²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ +グループã«è²æ¸¡ã•ã‚Œã¦ã„ãŸè²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="UnOwnedObjectsReturned"> + é¸æŠžã•ã‚ŒãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã‚Šã€ã‚ãªãŸã®æ‰€æœ‰ã§ã€Œãªã‹ã£ãŸã€ã‚ªãƒ–ジェクトã¯ã€æœ¬æ¥ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="NotSafe"> + ã“ã®åœŸåœ°ã§ã¯ãƒ€ãƒ¡ãƒ¼ã‚¸ãŒæœ‰åŠ¹ã§ã™ã€‚ +ケガをã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 æ»ã‚“ã§ã—ã¾ã£ãŸå ´åˆã¯ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="NoFly"> + ã“ã®ã‚¨ãƒªã‚¢ã§ã¯é£›è¡ŒãŒç¦æ¢ã•ã‚Œã¦ã„ã¾ã™ã€‚ +ã“ã“ã§ã¯é£›ã¹ã¾ã›ã‚“。 + </notification> + <notification name="PushRestricted"> + ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒ—ッシュãŒåˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ã€‚ +土地所有者以外ã¯ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoVoice"> + ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆãŒç„¡åŠ¹ã§ã™ã€‚ 誰ã‹ãŒè©±ã—ã¦ã„ã‚‹ã®ã‚’èžãã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="NoBuild"> + ã“ã®ã‚¨ãƒªã‚¢ã§ã¯åˆ¶ä½œãŒç¦æ¢ã•ã‚Œã¦ã„ã¾ã™ã€‚ オブジェクトを制作ã—ãŸã‚Š Rez ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="ScriptsStopped"> + 管ç†è€…ãŒã“ã®åœ°åŸŸå†…ã®ã‚¹ã‚¯ãƒªãƒ—トを一時åœæ¢ã•ã›ã¾ã—ãŸã€‚ + </notification> + <notification name="ScriptsNotRunning"> + ã“ã®åœ°åŸŸã§ã¯ã‚¹ã‚¯ãƒªãƒ—トã®ä½¿ç”¨ãŒç¦æ¢ã•ã‚Œã¦ã„ã¾ã™ + </notification> + <notification name="NoOutsideScripts"> + ã“ã®åœŸåœ°ã§ã¯ã€å¤–部ã®ã‚¹ã‚¯ãƒªãƒ—トãŒç¦æ¢ã•ã‚Œã¦ã„ã¾ã™ã€‚ + +土地所有者ã®ã‚‚ã®ä»¥å¤–ã¯ã‚¹ã‚¯ãƒªãƒ—トã¯å®Ÿè¡Œã•ã‚Œã¾ã›ã‚“。 + </notification> + <notification name="ClaimPublicLand"> + ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„ãªã„ã¨å…¬å…±ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + </notification> + <notification name="RegionTPAccessBlocked"> + ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢確èªã‚’è¡Œã†ã‹ã€æœ€æ–°ãƒ“ューワをインストールã—ã¦ãã ã•ã„。 + +ç¾åœ¨ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãªã‚¨ãƒªã‚¢ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + </notification> + <notification name="URBannedFromRegion"> + ã‚ãªãŸã¯åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã®ç«‹å…¥ãŒç¦æ¢ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="NoTeenGridAccess"> + ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã¯ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。 + </notification> + <notification name="ImproperPaymentStatus"> + ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«å…¥ã‚‹ãŸã‚ã«é©ã—ãŸæ”¯æ‰•ã„ステータスãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="MustGetAgeParcel"> + ã“ã®åŒºç”»ã«å…¥ã‚‹ã«ã¯å¹´é½¢ç¢ºèªæ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + </notification> + <notification name="NoDestRegion"> + 目的地ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="NotAllowedInDest"> + 目的地ã«å…¥ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="RegionParcelBan"> + ç«‹å…¥ç¦æ¢ã•ã‚ŒãŸåŒºç”»ã‚’横æ–ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 別ã®æ–¹æ³•ã‚’ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="TelehubRedirect"> + テレãƒãƒ–ã«è»¢é€ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="CouldntTPCloser"> + ã“れ以上目的地ã«è¿‘ã„å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="TPCancelled"> + テレãƒãƒ¼ãƒˆãŒã‚ャンセルã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="FullRegionTryAgain"> + å…¥ã‚ã†ã¨ã—ã¦ã„る地域(リージョン)ã¯ç¾åœ¨æº€å“¡ã§ã™ã€‚ +ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="GeneralFailure"> + よãã‚る失敗 + </notification> + <notification name="RoutedWrongRegion"> + ç•°ãªã‚‹åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«è¿‚回ã•ã‚Œã¾ã—ãŸã€‚ ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="NoValidAgentID"> + エージェントIDãŒç„¡åŠ¹ã§ã™ã€‚ + </notification> + <notification name="NoValidSession"> + セッションIDãŒç„¡åŠ¹ã§ã™ã€‚ + </notification> + <notification name="NoValidCircuit"> + 回路コードãŒç„¡åŠ¹ã§ã™ã€‚ + </notification> + <notification name="NoValidTimestamp"> + タイムスタンプãŒç„¡åŠ¹ã§ã™ã€‚ + </notification> + <notification name="NoPendingConnection"> + 接続を生æˆã§ãã¾ã›ã‚“。 + </notification> + <notification name="InternalUsherError"> + 内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ + </notification> + <notification name="NoGoodTPDestination"> + ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã§ã¯é©åˆ‡ãªãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="InternalErrorRegionResolver"> + 内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ + </notification> + <notification name="NoValidLanding"> + 有効ãªç€åœ°ç‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="NoValidParcel"> + 有効ãªåŒºç”»ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="ObjectGiveItem"> + [FIRST] [LAST]所有ã®ã€ +[OBJECTFROMNAME]ã‹ã‚‰ã€ +[OBJECTNAME]ã¨ã„ã†[OBJECTTYPE]ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚ + <form name="form"> + <button name="Keep" text="å—ã‘å–ã‚‹"/> + <button name="Discard" text="ç ´æ£„"/> + <button name="Mute" text="無視リストã¸"/> + </form> + </notification> + <notification name="ObjectGiveItemUnknownUser"> + (未知ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼‰ 所有ã®[OBJECTFROMNAME]ã‹ã‚‰ã€ +ã‚ãªãŸã«[OBJECTNAME]ã¨ã„ã†[OBJECTTYPE]ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸã€‚ + <form name="form"> + <button name="Keep" text="å—ã‘å–ã‚‹"/> + <button name="Discard" text="ç ´æ£„"/> + <button name="Mute" text="無視リストã¸"/> + </form> + </notification> + <notification name="UserGiveItem"> + [NAME]ã¯ã€ã‚ãªãŸã«[OBJECTNAME]ã¨ã„ã†åå‰ã®[OBJECTTYPE]を渡ã—ã¾ã—ãŸã€‚ + <form name="form"> + <button name="Keep" text="å—ã‘å–ã‚‹"/> + <button name="Discard" text="ç ´æ£„"/> + </form> + </notification> + <notification name="GodMessage"> + [NAME] +[MESSAGE] + </notification> + <notification name="JoinGroup"> + [MESSAGE] + <form name="form"> + <button name="Join" text="å‚åŠ "/> + <button name="Decline" text="辞退"/> + <button name="Info" text="æƒ…å ±"/> + </form> + </notification> + <notification name="TeleportOffered"> + [NAME]ã¯ã‚ãªãŸã‚’テレãƒãƒ¼ãƒˆã§å‘¼ã³å¯„ã›ã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ï¼š + +[MESSAGE] + <form name="form"> + <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="GotoURL"> + [MESSAGE] +[URL] + <form name="form"> + <button name="Later" text="ã‚ã¨ã§"/> + <button name="GoNow..." text="今ã™ãè¡Œã"/> + </form> + </notification> + <notification name="OfferFriendship"> + [NAME]ã¯ã€ +フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚ + +[MESSAGE] + +(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚) + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="辞退"/> + </form> + </notification> + <notification name="OfferFriendshipNoMessage"> + [NAME]ã¯ã€ +フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚ + +(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚) + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="æ‹’å¦"/> + </form> + </notification> + <notification name="FriendshipAccepted"> + [NAME]ã¯ã€ãƒ•ãƒ¬ãƒ³ãƒ‰ 登録をå—ã‘入れã¾ã—ãŸã€‚ + </notification> + <notification name="FriendshipDeclined"> + [NAME]ã¯ã€ãƒ•ãƒ¬ãƒ³ãƒ‰ 登録をæ–ã‚Šã¾ã—ãŸã€‚ + </notification> + <notification name="OfferCallingCard"> + [FIRST] [LAST]㌠+ã‚ãªãŸã«ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã£ã¦ãã¾ã—ãŸã€‚ +ã“ã‚Œã«ã‚ˆã‚Šã€ã‚ãªãŸã®æŒã¡ç‰©ã«ãƒ–ックマークãŒè¿½åŠ ã•ã‚Œã€ã“ã®ä½äººã«ã™ã°ã‚„ãIMã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="辞退"/> + </form> + </notification> + <notification name="RegionRestartMinutes"> + ã“ã®åœ°åŸŸã¯[MINUTES]分後ã«å†èµ·å‹•ã•ã‚Œã¾ã™ã€‚ +強制ãƒã‚°ã‚¢ã‚¦ãƒˆã¨ãªã‚Šã¾ã™ã®ã§ã€ã“ã®åœ°åŸŸã®å¤–ã«å‡ºã¦ãã ã•ã„。 + </notification> + <notification name="RegionRestartSeconds"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¯ [SECONDS] 秒後ã«å†èµ·å‹•ã•ã‚Œã¾ã™ã€‚. +ã“ã®ã¾ã¾ã“ã“ã«ã„ã‚‹ã¨ãƒã‚°ã‚¢ã‚¦ãƒˆã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="LoadWebPage"> + ウェブ・ページ[URL]ã‚’ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ + +[MESSAGE] + +ãƒãƒ¼ãƒ‰å…ƒã®ã‚ªãƒ–ジェクト:[OBJECTNAME]ã€ã‚ªãƒ¼ãƒŠãƒ¼ï¼š[NAME]? + <form name="form"> + <button name="Gotopage" text="移動"/> + <button name="Cancel" text="å–り消ã—"/> + </form> + </notification> + <notification name="FailedToFindWearableUnnamed"> + データベースã«[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠+ </notification> + <notification name="FailedToFindWearable"> + データベースã«[DESC]ã¨ã„ã†åå‰ã®[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <notification name="InvalidWearable"> + ç€ç”¨ã—よã†ã¨ã—ã¦ã„るアイテムã¯ã‚ãªãŸã®ãƒ“ューワã§ã¯èªã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 [APP_NAME]ビューワを最新ã®ã‚‚ã®ã«ã‚¢ãƒƒãƒ—グレードã—ã¦ã‹ã‚‰ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨ã—ã¦ãã ã•ã„。 + </notification> + <notification name="ScriptQuestion"> + 「[NAME]ã€ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「[OBJECTNAME]ã€ã‚’: + +[QUESTIONS] +よã‚ã—ã„ã§ã™ã‹ï¼Ÿ + <form name="form"> + <button name="Yes" text="ã¯ã„"/> + <button name="No" text="ã„ã„ãˆ"/> + <button name="Mute" text="無視リストã«è¿½åŠ "/> + </form> + </notification> + <notification name="ScriptQuestionCaution"> + [NAME] 所有ã®ã€Œ [OBJECTNAME] 〠ã¨ã„ã†ã‚ªãƒ–ジェクトãŒæ¬¡ã®ã“ã¨ã‚’ã—よã†ã¨ã—ã¦ã„ã¾ã™ï¼š + +[QUESTIONS] +ã“ã®ã‚ªãƒ–ジェクトや制作者を信用ã§ããªã„å ´åˆã¯ã€ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’æ‹’å¦ã—ã¦ãã ã•ã„。 + +リクエストをå—ã‘ã¾ã™ã‹ï¼Ÿ + <form name="form"> + <button name="Grant" text="許å¯"/> + <button name="Deny" text="æ‹’å¦"/> + <button name="Details" text="詳細..."/> + </form> + </notification> + <notification name="ScriptDialog"> + [FIRST] [LAST]ã®ã€Œ[TITLE]〠+[MESSAGE] + <form name="form"> + <button name="Ignore" text="無視ã™ã‚‹"/> + </form> + </notification> + <notification name="ScriptDialogGroup"> + [GROUPNAME]ã®ã€Œ[TITLE]〠+[MESSAGE] + <form name="form"> + <button name="Ignore" text="無視ã™ã‚‹"/> + </form> + </notification> + <notification name="FirstBalanceIncrease"> + L$[AMOUNT] ã‚’å—ã‘å–ã‚Šã¾ã—ãŸã€‚ +ã‚ãªãŸã® L$ 残高ã¯ç”»é¢å³ä¸Šã«è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="FirstBalanceDecrease"> + L$[AMOUNT] を支払ã„ã¾ã—ãŸã€‚ +ã‚ãªãŸã® L$ 残高ã¯ç”»é¢å³ä¸Šã«è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="FirstSit"> + ç€å¸ä¸ã§ã™ã€‚ +周囲を見るã«ã¯çŸ¢å°ã‚ー㋠AWSD ã‚ーを使ã£ã¦ãã ã•ã„。 +ç«‹ã¤ã¨ãã«ã¯ã€Œç«‹ã¡ä¸ŠãŒã‚‹ã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¦ãã ã•ã„。 + </notification> + <notification name="FirstMap"> + 地図をクリック・ドラッグã—ã¦å‘¨å›²ã‚’見ã¦ãã ã•ã„。 +ダブルクリックã™ã‚‹ã¨ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ +å³å´ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã§å ´æ‰€ã‚’探ã—ãŸã‚ŠèƒŒæ™¯ã‚’変更ã—ã¦ãã ã•ã„。 + </notification> + <notification name="FirstBuild"> + 制作ツールを開ãã¾ã—ãŸã€‚ 見るもã®ã™ã¹ã¦ãŒã“ã®ãƒ„ールã§ä½œæˆã•ã‚ŒãŸã‚‚ã®ã§ã™ã€‚ + </notification> + <notification name="FirstTeleport"> + ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ç‰¹å®šã®ã‚¨ãƒªã‚¢ã«ã®ã¿ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚ 矢å°ãŒç›®çš„地を指ã—ã¦ã„ã¾ã™ã€‚ 矢å°ã‚’クリックã™ã‚‹ã¨æ¶ˆãˆã¾ã™ã€‚ + </notification> + <notification name="FirstOverrideKeys"> + ã‚ãªãŸã®ç§»å‹•ã‚ーをオブジェクトãŒæ“作ã—ã¦ã„ã¾ã™ã€‚ +矢å°ã‹AWSDã®ã‚ーã§å‹•ä½œã‚’確èªã—ã¦ãã ã•ã„。 +銃ãªã©ã®ã‚ªãƒ–ジェクトã ã¨ã€ä¸€äººç§°è¦–点(マウスルック)ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ +Mã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ + </notification> + <notification name="FirstAppearance"> + 容姿を編集ä¸ã§ã™ã€‚ +周囲を見るã«ã¯çŸ¢å°ã‚ーを使ã£ã¦ãã ã•ã„。 +終ã‚ã£ãŸã‚‰ã€Œã™ã¹ã¦ä¿å˜ã€ã‚’押ã—ã¦ãã ã•ã„。 + </notification> + <notification name="FirstInventory"> + ã“ã‚Œã¯ã‚ãªãŸã®æŒã¡ç‰©ã§ã™ã€‚所有ã—ã¦ã„るアイテムãŒå…¥ã£ã¦ã„ã¾ã™ã€‚ + +* アイテムを自分ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦è£…ç€ã—ã¦ãã ã•ã„。 +* アイテムを地é¢ã«ãƒ‰ãƒ©ãƒƒã‚°ã—㦠Rez ã—ã¦ãã ã•ã„。 +* ノートカードをダブルクリックã—ã¦é–‹ã„ã¦ãã ã•ã„。 + </notification> + <notification name="FirstSandbox"> + ã“ã“ã¯ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹ã‚¨ãƒªã‚¢ã§ã™ã€‚ä½äººãŒåˆ¶ä½œã‚’å¦ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚ + +ã“ã“ã§åˆ¶ä½œã•ã‚ŒãŸã‚‚ã®ã¯æ™‚é–“ãŒçµŒã¤ã¨å‰Šé™¤ã•ã‚Œã¾ã™ã€‚制作ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œå–ã‚‹ã€ã‚’é¸ã³ã€æŒã¡ç‰©ã«å…¥ã‚Œã¦ãŠæŒã¡å¸°ã‚Šã™ã‚‹ã®ã‚’ãŠå¿˜ã‚Œãªã。 + </notification> + <notification name="FirstFlexible"> + ã“ã®ã‚ªãƒ–ジェクトã¯ãƒ•ãƒ¬ã‚シブルã§ã™ã€‚ フレã‚シブルオブジェクトã¯ã€ã€Œç‰©ç†ã€ã§ã¯ãªã「ファントムã€ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + </notification> + <notification name="FirstDebugMenus"> + アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’é–‹ãã¾ã—ãŸã€‚ + +ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã®æœ‰åŠ¹ãƒ»ç„¡åŠ¹è¨å®šï¼š + Windows: Ctrl+Alt+D + Mac: ⌘-Opt+D + </notification> + <notification name="FirstSculptedPrim"> + スカルプトプリムを編集ä¸ã§ã™ã€‚ スカルプトプリムã«ã¯å½¢çŠ¶ã®è¼ªéƒã‚’指定ã™ã‚‹ãŸã‚ã®ç‰¹åˆ¥ãªãƒ†ã‚¯ã‚¹ãƒãƒ£ãŒå¿…è¦ã§ã™ã€‚ + </notification> + <notification name="MaxListSelectMessage"> + ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰[MAX_SELECT]個ã¾ã§ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚ + </notification> + <notification name="VoiceInviteP2P"> + [NAME]ãŒã€ã‚ãªãŸã‚’ボイスãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚ +コールã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ã‚³ãƒ¼ãƒ«ã‚’ã—ã¦ã„る人をミュートã«ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="æ‹’å¦"/> + <button name="Mute" text="ミュート"/> + </form> + </notification> + <notification name="AutoUnmuteByIM"> + [FIRST] [LAST]ã« +インスタント・メッセージãŒé€ä¿¡ã•ã‚Œã€ç„¡è¦–è¨å®šã¯è‡ªå‹•çš„ã«è§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AutoUnmuteByMoney"> + [FIRST] [LAST]ã«ãŠé‡‘を渡ã—ãŸãŸã‚〠無視è¨å®šãŒè‡ªå‹•çš„ã«è§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AutoUnmuteByInventory"> + [FIRST] [LAST]ã«æŒã¡ç‰©ã‚’渡ã—ãŸãŸã‚〠無視è¨å®šãŒè‡ªå‹•çš„ã«è§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="VoiceInviteGroup"> + [NAME]ãŒã€ グループ[GROUP]ã¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚åŠ ã—ã¾ã—ãŸã€‚ +コールã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ã‚³ãƒ¼ãƒ«ã‚’ã—ã¦ã„る人をミュートã«ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="æ‹’å¦"/> + <button name="Mute" text="ミュート"/> + </form> + </notification> + <notification name="VoiceInviteAdHoc"> + [NAME]ãŒã€ 会è°ãƒãƒ£ãƒƒãƒˆã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚åŠ ã—ã¾ã—ãŸã€‚ +コールã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。 ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ミュート(消声)ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="æ‹’å¦"/> + <button name="Mute" text="ミュート"/> + </form> + </notification> + <notification name="InviteAdHoc"> + [NAME]ãŒã€ ã‚ãªãŸã‚’会è°ãƒãƒ£ãƒƒãƒˆã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚ +ãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã™ã‚‹ã«ã¯ã€Œå—ã‘入れるã€ã‚’クリックã—ã€æ‹›å¾…ã‚’æ–ã‚‹ã¨ãã¯ã€Œæ‹’å¦ã€ã‚’クリックã—ã¦ãã ã•ã„。ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ミュート(消声)ã™ã‚‹å ´åˆã¯ã€ŒãƒŸãƒ¥ãƒ¼ãƒˆã€ã‚’クリックã—ã¦ãã ã•ã„。 + <form name="form"> + <button name="Accept" text="å—ã‘入れる"/> + <button name="Decline" text="æ‹’å¦"/> + <button name="Mute" text="ミュート"/> + </form> + </notification> + <notification name="VoiceChannelFull"> + ã‚ãªãŸãŒå‚åŠ ã—よã†ã¨ã—ã¦ã„るボイスコール[VOICE_CHANNEL_NAME]ã¯ã€å‚åŠ è€…ãŒæœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="ProximalVoiceChannelFull"> + ã“ã®ã‚¨ãƒªã‚¢ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã¯ã€æ··é›‘ã®ãŸã‚容é‡ã‚’超ãˆã¦ã—ã¾ã£ã¦ã„ã¾ã™ã€‚申ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã€ä»–ã®ã‚¨ãƒªã‚¢ã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="VoiceChannelDisconnected"> + [VOICE_CHANNEL_NAME]ã¸ã®æŽ¥ç¶šãŒåˆ‡æ–ã•ã‚Œã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="VoiceChannelDisconnectedP2P"> + [VOICE_CHANNEL_NAME]ã¯ã€ã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="P2PCallDeclined"> + [VOICE_CHANNEL_NAME]ã¯ã€ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="P2PCallNoAnswer"> + [VOICE_CHANNEL_NAME]ã¯ã€ã‚ãªãŸã®ã‚³ãƒ¼ãƒ«ã‚’å—ã‘å–ã‚Œã¾ã›ã‚“。空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="VoiceChannelJoinFailed"> + [VOICE_CHANNEL_NAME]ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚時間をãŠã„ã¦ã€å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚ + </notification> + <notification name="VoiceLoginRetry"> + ã‚ãªãŸç”¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’作æˆã—ã¦ã„ã¾ã™ã€‚1分ã»ã©ã‹ã‹ã‚Šã¾ã™ã€‚ + </notification> + <notification name="Cannot enter parcel: not a group member"> + 特定ã®ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã®ã¿ã“ã®ã‚¨ãƒªã‚¢ã‚’訪å•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + </notification> + <notification name="Cannot enter parcel: banned"> + ç«‹å…¥ç¦æ¢ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="Cannot enter parcel: not on access list"> + アクセス・リストã«å«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 + </notification> + <notification name="VoiceNotAllowed"> + ã‚ãªãŸã«ã¯[VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。 + </notification> + <notification name="VoiceCallGenericError"> + [VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸ã«ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 + </notification> + <notification name="ServerVersionChanged"> + ç•°ãªã‚‹ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æ¥ã¾ã—ãŸã€‚パフォーマンスã«å½±éŸ¿ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 クリックã—ã¦ãƒªãƒªãƒ¼ã‚¹ãƒŽãƒ¼ãƒˆã‚’確èªã—ã¦ã¿ã¦ãã ã•ã„。 + </notification> + <notification name="UnsupportedCommandSLURL"> + クリックã—㟠SLurl ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </notification> + <notification name="IMToast"> + <form name="form"> + <button name="respondbutton" text="è¿”ç”"/> + </form> + </notification> + <notification name="AttachmentSaved"> + 付属物(アタッãƒãƒ¡ãƒ³ãƒˆï¼‰ãŒä¿å˜ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="UnableToFindHelpTopic"> + ヘルプトピックãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </notification> + <global name="UnsupportedCPU"> + - ã‚ãªãŸã® CPU ã®é€Ÿåº¦ã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 + </global> + <global name="UnsupportedGLRequirements"> + [APP_NAME] ã«å¿…è¦ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒãªã„よã†ã§ã™ã€‚ [APP_NAME] ã«ã¯ãƒžãƒ«ãƒãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ OpenGL グラフィックカードãŒå¿…è¦ã§ã™ã€‚ ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ã®æœ€æ–°ãƒ‰ãƒ©ã‚¤ãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®ã‚µãƒ¼ãƒ“スパックã¨ãƒ‘ッãƒãŒå…¥ã£ã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。 + +ã“ã®å•é¡ŒãŒä½•åº¦ã‚‚èµ·ãã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </global> + <global name="UnsupportedCPUAmount"> + 796 + </global> + <global name="UnsupportedRAMAmount"> + 510 + </global> + <global name="UnsupportedGPU"> + - ã‚ãªãŸã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚«ãƒ¼ãƒ‰ã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 + </global> + <global name="UnsupportedRAM"> + - ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ・メモリã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。 + </global> + <global name="PermYes"> + ã¯ã„ + </global> + <global name="PermNo"> + ã„ã„㈠+ </global> + <global name="You can only set your 'Home Location' on your land or at a mainland Infohub."> + 自分ã®åœŸåœ°ã‚’ãŠæŒã¡ã®å ´åˆã€ãƒ›ãƒ¼ãƒ ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«è¨å®šã§ãã¾ã™ã€‚ +ãŠæŒã¡ã§ãªã„å ´åˆã¯ã€åœ°å›³ã§ã€Œã‚¤ãƒ³ãƒ•ã‚©ãƒãƒ–ã€ã‚’探ã—ã¦ãã ã•ã„。 + </global> +</notifications> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml index 2cf8456187f..75bf6ac7b67 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml @@ -1,45 +1,38 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="edit_profile_panel"> - <string name="CaptionTextAcctInfo"> - [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] - </string> - <string name="AcctTypeResident" - value="ä½äºº" /> - <string name="AcctTypeTrial" - value="トライアル" /> - <string name="AcctTypeCharterMember" - value="特権メンãƒãƒ¼" /> - <string name="AcctTypeEmployee" - value="Linden Lab従æ¥å“¡" /> - <string name="PaymentInfoUsed" - value="支払ã„æƒ…å ±ç™»éŒ²æ¸ˆ" /> - <string name="PaymentInfoOnFile" - value="支払ã„æƒ…å ±ç™»éŒ²æ¸ˆã¿" /> - <string name="NoPaymentInfoOnFile" - value="支払ã„æƒ…å ±æœªç™»éŒ²" /> - <string name="AgeVerified" - value="年齢確èªæ¸ˆã¿" /> - <string name="NotAgeVerified" - value="年齢未確èª" /> - <string name="partner_edit_link_url"> - http://www.secondlife.com/account/partners.php?lang=ja - </string> - <panel name="scroll_content_panel"> - <panel name="data_panel" > - <panel name="lifes_images_panel"> - <panel name="second_life_image_panel"> - <text name="second_life_photo_title_text"> - [SECOND_LIFE]: - </text> - </panel> - </panel> - <text name="title_partner_text" value="パートナー:"/> - <panel name="partner_data_panel"> - <text name="partner_text" value="[FIRST] [LAST]"/> - </panel> - <text name="text_box3"> - å–ã‚Šè¾¼ã¿ä¸å¿œç”メッセージ: - </text> - </panel> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Profile Edit" name="edit_profile_panel"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="AcctTypeResident" value="ä½äºº"/> + <string name="AcctTypeTrial" value="トライアル"/> + <string name="AcctTypeCharterMember" value="特権メンãƒãƒ¼"/> + <string name="AcctTypeEmployee" value="Linden Lab従æ¥å“¡"/> + <string name="PaymentInfoUsed" value="支払ã„æƒ…å ±ç™»éŒ²æ¸ˆ"/> + <string name="PaymentInfoOnFile" value="支払ã„æƒ…å ±ç™»éŒ²æ¸ˆã¿"/> + <string name="NoPaymentInfoOnFile" value="支払ã„æƒ…å ±æœªç™»éŒ²"/> + <string name="AgeVerified" value="年齢確èªæ¸ˆã¿"/> + <string name="NotAgeVerified" value="年齢未確èª"/> + <string name="partner_edit_link_url"> + http://www.secondlife.com/account/partners.php?lang=ja + </string> + <string name="no_partner_text" value="ãªã—"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="data_panel"> + <panel name="lifes_images_panel"> + <icon label="" name="2nd_life_edit_icon" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/> + </panel> + <icon label="" name="real_world_edit_icon" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/> + <text name="title_homepage_text"> + Web サイト: + </text> + <check_box label="検索çµæžœã«è¡¨ç¤º" name="show_in_search_checkbox"/> + <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/> + </panel> + </panel> + </scroll_container> + <panel name="profile_me_buttons_panel"> + <button label="変更をä¿å˜" name="save_btn"/> + <button label="ã‚ャンセル" name="cancel_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_invite.xml b/indra/newview/skins/default/xui/ja/panel_group_invite.xml index 14009f29722..586eb4e6cca 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_invite.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_invite.xml @@ -1,30 +1,30 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="メンãƒãƒ¼ã‚’招待" name="invite_panel"> - <text name="help_text" font="SansSerifSmall" height="72" bottom_delta="-96"> - ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ä¸€åº¦ã«è¤‡æ•°ã® -ä½äººã‚’招待ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ -「リストã‹ã‚‰ä½äººã‚’é¸æŠžã€ -をクリックã—ã¦ãã ã•ã„。 - </text> - <button bottom_delta="-10" label="リストã‹ã‚‰ä½äººã‚’é¸æŠž" name="add_button" tool_tip=""/> - <name_list name="invitee_list" height="156" bottom_delta="-160" - tool_tip="複数ã®ä½äººã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Ctrlã‚ーを押ã—ãªãŒã‚‰ä½äººåをクリックã—ã¾ã™ã€‚" /> - <button label="リストã‹ã‚‰é¸æŠžã—ãŸã‚‚ã®ã‚’削除" name="remove_button" - tool_tip="上ã§é¸æŠžã—ãŸå±…ä½è€…を招待リストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã€‚" /> - <text> - 割り当ã¦å…ˆã®å½¹å‰²ã‚’é¸æŠžï¼š - </text> - <text name="role_text"> - 割り当ã¦å…ˆã®å½¹å‰²ã‚’é¸æŠžï¼š - </text> - <combo_box name="role_name" - tool_tip="メンãƒãƒ¼ã«å‰²ã‚Šå½“ã¦å¯èƒ½ãªå½¹å‰²ã‚’リストã‹ã‚‰é¸æŠžã€‚" /> - <button label="招待をé€ä¿¡" name="ok_button" /> - <button label="å–り消ã—" name="cancel_button" /> - <string name="confirm_invite_owner_str"> - 本当ã«æ–°ã—ã„所有者を招待ã—ã¾ã™ã‹?ã“ã®æ“作ã¯å–り消ã—ã§ãã¾ã›ã‚“。 - </string> - <text name="loading"> - (ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼Žï¼Žï¼Ž) - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="メンãƒãƒ¼ã‚’招待" name="invite_panel"> + <panel.string name="confirm_invite_owner_str"> + 本当ã«æ–°ã—ã„所有者を招待ã—ã¾ã™ã‹?ã“ã®æ“作ã¯å–り消ã—ã§ãã¾ã›ã‚“。 + </panel.string> + <panel.string name="loading"> + (ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼Žï¼Žï¼Ž) + </panel.string> + <panel.string name="already_in_group"> + 何人ã‹ã®ã‚¢ãƒã‚¿ãƒ¼ã¯æ—¢ã«ã‚°ãƒ«ãƒ¼ãƒ—ã«å…¥ã£ã¦ã„ã‚‹ãŸã‚招待ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚ + </panel.string> + <text bottom_delta="-96" font="SansSerifSmall" height="72" name="help_text"> + ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ä¸€åº¦ã«è¤‡æ•°ã® +ä½äººã‚’招待ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +「リストã‹ã‚‰ä½äººã‚’é¸æŠžã€ +をクリックã—ã¦ãã ã•ã„。 + </text> + <button bottom_delta="-10" label="リストã‹ã‚‰ä½äººã‚’é¸æŠž" name="add_button" tool_tip=""/> + <name_list bottom_delta="-160" height="156" name="invitee_list" tool_tip="複数ã®ä½äººã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Ctrlã‚ーを押ã—ãªãŒã‚‰ä½äººåをクリックã—ã¾ã™ã€‚"/> + <button label="リストã‹ã‚‰é¸æŠžã—ãŸã‚‚ã®ã‚’削除" name="remove_button" tool_tip="上ã§é¸æŠžã—ãŸå±…ä½è€…を招待リストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã€‚"/> + <text name="role_text"> + 割り当ã¦å…ˆã®å½¹å‰²ã‚’é¸æŠžï¼š + </text> + <combo_box name="role_name" tool_tip="メンãƒãƒ¼ã«å‰²ã‚Šå½“ã¦å¯èƒ½ãªå½¹å‰²ã‚’リストã‹ã‚‰é¸æŠžã€‚"/> + <button label="招待をé€ä¿¡" name="ok_button"/> + <button label="å–り消ã—" name="cancel_button"/> + <string name="GroupInvitation"> + グループã¸ã®æ‹›å¾… + </string> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml index 595d315cf9c..66662ec87a4 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml @@ -1,85 +1,85 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="土地ã¨L$" name="land_money_tab"> - <string name="help_text"> - グループ所有地一覧ã¯ã€å¯„付ã«é–¢ã™ã‚‹è©³ç´°ã¨ä¸€ç·’ã«è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚ 「土地利用ã®åˆè¨ˆã€ãŒã€Œå¯„付ç·é¡ã€ä»¥ä¸‹ã€ã¾ãŸã¯åŒã˜ã«ãªã‚‹ã¾ã§è¦å‘ŠãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ 「計画ã€ã€ã€Œè©³ç´°ã€ã€ã€Œè²©å£²ã€ã‚¿ãƒ–ã«ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®è³‡é‡‘ã«é–¢ã™ã‚‹æƒ…å ±ãŒæŽ²è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚ - </string> - <button label="?" name="help_button"/> - <string name="cant_view_group_land_text"> - ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°è¡¨ç¤ºã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </string> - <string name="cant_view_group_accounting_text"> - ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¼šè¨ˆæƒ…å ±ã®è¡¨ç¤ºã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。 - </string> - <string name="loading_txt"> - ãƒãƒ¼ãƒ‰ä¸ï¼Žï¼Žï¼Ž - </string> - <text name="group_land_heading"> - グループã®ä¿æœ‰åœ° - </text> - <scroll_list name="group_parcel_list"> - <column label="区画å" name="name"/> - <column label="地域(リージョン)" name="location"/> - <column label="種類" name="type"/> - <column label="é¢ç©" name="area"/> - <column label="" name="hidden"/> - </scroll_list> - <button label="地図上ã«è¡¨ç¤º" label_selected="地図上ã«è¡¨ç¤º" name="map_button"/> - <text name="total_contributed_land_label"> - 寄付ç·é¡ï¼š - </text> - <text name="total_contributed_land_value" width="150"> - [AREA]平方メートル - </text> - <text name="total_land_in_use_label"> - 土地利用ã®åˆè¨ˆï¼š - </text> - <text name="total_land_in_use_value" width="150"> - [AREA]平方メートル - </text> - <text name="land_available_label"> - 利用å¯ã®åœŸåœ°ï¼š - </text> - <text name="land_available_value" width="150"> - [AREA]平方メートル - </text> - <text name="your_contribution_label"> - ã‚ãªãŸã®è²¢çŒ®ï¼š - </text> - <string name="land_contrib_error"> - 土地ã®å‡ºè³‡è¨å®šã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ - </string> - <text name="your_contribution_units"> - (平方メートル) - </text> - <text name="your_contribution_max_value"> - ([AMOUNT]最大) - </text> - <text name="group_over_limit_text"> - 使用ä¸ã®åœŸåœ°ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ãŒã•ã‚‰ã«å¤š -ãã®åœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’æä¾›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - </text> - <text name="group_money_heading"> - グループL$ - </text> - <tab_container name="group_money_tab_container"> - <panel label="計画" name="group_money_planning_tab"> - <text_editor name="group_money_planning_text"> - 計算ä¸... - </text_editor> - </panel> - <panel label="詳細" name="group_money_details_tab"> - <text_editor name="group_money_details_text"> - 計算ä¸â€¦ - </text_editor> - <button label="å‰ã®é€±" label_selected="å‰ã®é€±" name="earlier_details_button" tool_tip="å‰ã®é€±ã®å±¥æ´"/> - <button label="次ã®é€±" label_selected="次ã®é€±" name="later_details_button" tool_tip="次ã®é€±ã®å±¥æ´"/> - </panel> - <panel label="販売" name="group_money_sales_tab"> - <text_editor name="group_money_sales_text"> - 計算ä¸â€¦ - </text_editor> - <button label="å‰ã®é€±" label_selected="å‰ã®é€±" name="earlier_sales_button" tool_tip="å‰ã®é€±ã®å±¥æ´"/> - <button label="次ã®é€±" label_selected="次ã®é€±" name="later_sales_button" tool_tip="次ã®é€±ã®å±¥æ´"/> - </panel> - </tab_container> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="土地ã¨L$" name="land_money_tab"> + <string name="help_text"> + グループ所有地一覧ã¯ã€å¯„付ã«é–¢ã™ã‚‹è©³ç´°ã¨ä¸€ç·’ã«è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚ 「土地利用ã®åˆè¨ˆã€ãŒã€Œå¯„付ç·é¡ã€ä»¥ä¸‹ã€ã¾ãŸã¯åŒã˜ã«ãªã‚‹ã¾ã§è¦å‘ŠãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ 「計画ã€ã€ã€Œè©³ç´°ã€ã€ã€Œè²©å£²ã€ã‚¿ãƒ–ã«ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®è³‡é‡‘ã«é–¢ã™ã‚‹æƒ…å ±ãŒæŽ²è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </string> + <button label="?" name="help_button"/> + <string name="cant_view_group_land_text"> + ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°è¡¨ç¤ºã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </string> + <string name="cant_view_group_accounting_text"> + ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¼šè¨ˆæƒ…å ±ã®è¡¨ç¤ºã‚’許ã•ã‚Œã¦ã„ã¾ã›ã‚“。 + </string> + <string name="loading_txt"> + ãƒãƒ¼ãƒ‰ä¸ï¼Žï¼Žï¼Ž + </string> + <text name="group_land_heading"> + グループã®ä¿æœ‰åœ° + </text> + <scroll_list name="group_parcel_list"> + <column label="区画" name="name"/> + <column label="地域(リージョン)" name="location"/> + <column label="種類" name="type"/> + <column label="é¢ç©" name="area"/> + <column label="" name="hidden"/> + </scroll_list> + <button label="地図" label_selected="地図" name="map_button"/> + <text name="total_contributed_land_label"> + 寄付ç·é¡ï¼š + </text> + <text name="total_contributed_land_value" width="150"> + [AREA]平方メートル + </text> + <text name="total_land_in_use_label"> + 土地利用ã®åˆè¨ˆï¼š + </text> + <text name="total_land_in_use_value" width="150"> + [AREA]平方メートル + </text> + <text name="land_available_label"> + 利用å¯ã®åœŸåœ°ï¼š + </text> + <text name="land_available_value" width="150"> + [AREA]平方メートル + </text> + <text name="your_contribution_label"> + ã‚ãªãŸã®è²¢çŒ®ï¼š + </text> + <string name="land_contrib_error"> + 土地ã®å‡ºè³‡è¨å®šã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + </string> + <text name="your_contribution_units"> + (平方メートル) + </text> + <text name="your_contribution_max_value"> + ([AMOUNT]最大) + </text> + <text name="group_over_limit_text"> + 使用ä¸ã®åœŸåœ°ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ãŒã•ã‚‰ã«å¤š +ãã®åœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’æä¾›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + </text> + <text name="group_money_heading"> + グループL$ + </text> + <tab_container name="group_money_tab_container"> + <panel label="計画" name="group_money_planning_tab"> + <text_editor name="group_money_planning_text"> + 計算ä¸... + </text_editor> + </panel> + <panel label="詳細" name="group_money_details_tab"> + <text_editor name="group_money_details_text"> + 計算ä¸â€¦ + </text_editor> + <button label="å‰ã®é€±" label_selected="å‰ã®é€±" name="earlier_details_button" tool_tip="å‰ã®é€±ã®å±¥æ´"/> + <button label="次ã®é€±" label_selected="次ã®é€±" name="later_details_button" tool_tip="次ã®é€±ã®å±¥æ´"/> + </panel> + <panel label="販売" name="group_money_sales_tab"> + <text_editor name="group_money_sales_text"> + 計算ä¸â€¦ + </text_editor> + <button label="å‰ã®é€±" label_selected="å‰ã®é€±" name="earlier_sales_button" tool_tip="å‰ã®é€±ã®å±¥æ´"/> + <button label="次ã®é€±" label_selected="次ã®é€±" name="later_sales_button" tool_tip="次ã®é€±ã®å±¥æ´"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_list_item.xml b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml new file mode 100644 index 00000000000..02ada7e6e58 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="group_list_item"> + <text name="group_name" value="ä¸æ˜Ž"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_notices.xml b/indra/newview/skins/default/xui/ja/panel_group_notices.xml index afca4c4dfd2..382fd02d5fd 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml @@ -1,66 +1,66 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="通知" name="notices_tab"> - <string name="help_text"> - 通知機能を使ã†ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã§ã™ã°ã‚„ãæƒ…å ±ã‚’ä¼é”ã§ãã¾ã™ã€‚ -複数ã®ã‚ã¦å…ˆã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã§ãã‚‹ã»ã‹ã€ -å¿…è¦ã«å¿œã˜ã¦ã‚¢ã‚¤ãƒ†ãƒ をメッセージã«æ·»ä»˜ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ -通知ã¯ã€å—信アビリティãŒã‚る役割ã®ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«ã®ã¿é…ä¿¡ã•ã‚Œã¾ã™ã€‚ -通知をオフã«ã™ã‚‹ã«ã¯ã€ä¸€èˆ¬ã‚¿ãƒ–を使ã„ã¾ã™ã€‚ - </string> - <string name="no_notices_text"> - éŽåŽ»ã®é€šçŸ¥ã¯ã‚ã‚Šã¾ã›ã‚“。 - </string> - <button label="?" label_selected="?" name="help_button"/> - <text name="lbl"> - グループ通知アーカイブ - </text> - <text name="lbl2"> - 通知ã¯14日間ä¿å˜ã•ã‚Œã¾ã™ã€‚ãŸã ã—ã€å„グループã®é€šçŸ¥ãƒªã‚¹ãƒˆã¯1æ—¥ã‚ãŸã‚Š200通ã«åˆ¶é™ã•ã‚Œã¾ã™ã€‚ - </text> - <scroll_list name="notice_list"> - <column label="" name="icon"/> - <column label="件å" name="subject"/> - <column label="é€ã‚Šä¸»" name="from"/> - <column label="日付" name="date"/> - </scroll_list> - <text name="notice_list_none_found"> - 何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ - </text> - <button label="æ–°ã—ã„通知を作æˆ" label_selected="æ–°ã—ã„通知を作æˆ" name="create_new_notice"/> - <button label="æ›´æ–°" label_selected="リスト更新" name="refresh_notices"/> - <panel label="æ–°ã—ã„通知を作æˆ" name="panel_create_new_notice"> - <text name="lbl"> - é€šçŸ¥ã‚’ä½œæˆ - </text> - <text name="lbl2"> - æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’1ã¤ã“ã®ãƒ‘ãƒãƒ«ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€é€šçŸ¥ã«æ·»ä»˜ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 添付ã§ãã‚‹ã®ã¯ã‚³ãƒ”ーã€è²æ¸¡ãŒå¯èƒ½ãªã‚¢ã‚¤ãƒ†ãƒ ã§ã€ãƒ•ã‚©ãƒ«ãƒ€ã‚’é€ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 - </text> - <text name="lbl3"> - 件å: - </text> - <text name="lbl4"> - メッセージ: - </text> - <text name="lbl5"> - 添付: - </text> - <button label="添付物を削除" label_selected="添付物を削除" name="remove_attachment"/> - <button label="通知をé€ä¿¡" label_selected="通知をé€ä¿¡" name="send_notice"/> - <panel name="drop_target" tool_tip="æŒã¡ç‰©ã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ をメッセージ欄ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ãã ã•ã„。通知ã¨ä¸€ç·’ã«é€ä¿¡ã•ã‚Œã¾ã™ã€‚é€ä¿¡ã™ã‚‹ã«ã¯ã‚³ãƒ”ーã€è²æ¸¡ãŒå¯èƒ½ãªã‚ªãƒ–ジェクトã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"/> - </panel> - <panel label="éŽåŽ»ã®é€šçŸ¥ã‚’表示" name="panel_view_past_notice"> - <text name="lbl"> - アーカイブ通知 - </text> - <text name="lbl2"> - æ–°ã—ã„通知ã®é€ä¿¡ã¯ã€ä¸Šã®[æ–°ã—ã„通知を作æˆã™ã‚‹]をクリックã—ã¦ãã ã•ã„。 - </text> - <text name="lbl3"> - 件å: - </text> - <text name="lbl4"> - メッセージ: - </text> - <button label="添付物を開ã" label_selected="添付物を開ã" name="open_attachment"/> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="通知" name="notices_tab"> + <string name="help_text"> + 通知機能を使ã†ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã§ã™ã°ã‚„ãæƒ…å ±ã‚’ä¼é”ã§ãã¾ã™ã€‚ +複数ã®ã‚ã¦å…ˆã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã§ãã‚‹ã»ã‹ã€ +å¿…è¦ã«å¿œã˜ã¦ã‚¢ã‚¤ãƒ†ãƒ をメッセージã«æ·»ä»˜ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ +通知ã¯ã€å—信アビリティãŒã‚る役割ã®ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«ã®ã¿é…ä¿¡ã•ã‚Œã¾ã™ã€‚ +通知をオフã«ã™ã‚‹ã«ã¯ã€ä¸€èˆ¬ã‚¿ãƒ–を使ã„ã¾ã™ã€‚ + </string> + <string name="no_notices_text"> + éŽåŽ»ã®é€šçŸ¥ã¯ã‚ã‚Šã¾ã›ã‚“。 + </string> + <button label="?" label_selected="?" name="help_button"/> + <text name="lbl"> + グループ通知アーカイブ + </text> + <text name="lbl2"> + 通知㯠14 日間ä¿å˜ã•ã‚Œã¾ã™ã€‚ 通知リスト㯠1 ã¤ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã¤ãã€1 日最大 200件 ã«åˆ¶é™ã•ã‚Œã¾ã™ã€‚ + </text> + <scroll_list name="notice_list"> + <column label="" name="icon"/> + <column label="件å" name="subject"/> + <column label="é€ã‚Šä¸»" name="from"/> + <column label="日付" name="date"/> + </scroll_list> + <text name="notice_list_none_found"> + 何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + </text> + <button label="æ–°ã—ã„通知" label_selected="æ–°ã—ã„通知を作æˆ" name="create_new_notice"/> + <button label="æ›´æ–°" label_selected="リスト更新" name="refresh_notices"/> + <panel label="æ–°ã—ã„通知を作æˆ" name="panel_create_new_notice"> + <text name="lbl"> + é€šçŸ¥ã‚’ä½œæˆ + </text> + <text name="lbl2"> + æŒã¡ç‰©ã‹ã‚‰ã“ã®ãƒ‘ãƒãƒ«ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦æ·»ä»˜ã§ãã¾ã™ã€‚ 添付ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã¨å†è²©ãƒ»ãƒ—レゼントãŒå¯èƒ½ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ã¾ãŸã€ãƒ•ã‚©ãƒ«ãƒ€ã¯é€ã‚Œã¾ã›ã‚“。 + </text> + <text name="lbl3"> + 件å: + </text> + <text name="lbl4"> + メッセージ: + </text> + <text name="lbl5"> + 添付: + </text> + <button label="添付物を削除" label_selected="添付物を削除" name="remove_attachment"/> + <button label="é€ä¿¡" label_selected="通知をé€ä¿¡" name="send_notice"/> + <panel name="drop_target" tool_tip="æŒã¡ç‰©ã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ をメッセージ欄ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ãã ã•ã„。通知ã¨ä¸€ç·’ã«é€ä¿¡ã•ã‚Œã¾ã™ã€‚é€ä¿¡ã™ã‚‹ã«ã¯ã‚³ãƒ”ーã€è²æ¸¡ãŒå¯èƒ½ãªã‚ªãƒ–ジェクトã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"/> + </panel> + <panel label="éŽåŽ»ã®é€šçŸ¥ã‚’表示" name="panel_view_past_notice"> + <text name="lbl"> + アーカイブ通知 + </text> + <text name="lbl2"> + æ–°ã—ã„通知ã®é€ä¿¡ã¯ã€ä¸Šã®[æ–°ã—ã„通知を作æˆã™ã‚‹]をクリックã—ã¦ãã ã•ã„。 + </text> + <text name="lbl3"> + 件å: + </text> + <text name="lbl4"> + メッセージ: + </text> + <button label="添付物を開ã" label_selected="添付物を開ã" name="open_attachment"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml index 2d39938b530..c7e62635e46 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml @@ -1,157 +1,118 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="メンãƒãƒ¼ã¨å½¹å‰²" name="roles_tab"> - <string name="default_needs_apply_text"> - ç¾åœ¨ã®ã‚µãƒ–タブã«ã€æœªé©ç”¨ã®å¤‰æ›´ãŒã‚ã‚Šã¾ã™ã€‚ - </string> - <string name="want_apply_text"> - ã“れらã®å¤‰æ›´ã‚’é©ç”¨ã—ã¾ã™ã‹ï¼Ÿ - </string> - <button label="?" name="help_button"/> - <panel name="members_header"> - <text name="static"> - メンãƒãƒ¼ã¨å½¹å‰² - </text> - <text name="static2"> - グループ・メンãƒãƒ¼ã«ã¯ã€å½¹å‰²ã¨èƒ½åŠ›ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¾ã™ã€‚ ã“ã®è¨å®šã¯ã€ -組織ã®è¦æ¨¡ã«å¿œã˜ã¦æŸ”軟ã‹ã¤å®¹æ˜“ã«ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã§ãã¾ã™ã€‚ - </text> - </panel> - <panel name="roles_header"> - <text name="static"> - 役割 - </text> - <text name="role_properties_modifiable"> - 下ã«ã‚る役割をé¸æŠžã—ã¦ãã ã•ã„。 役割ã®åå‰ã€èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼ãƒ»ã‚¿ã‚¤ãƒˆãƒ«ã‚’ä¿®æ£ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - </text> - <text name="role_properties_not_modifiable"> - 役割åã‚’é¸æŠžã™ã‚‹ã¨ï½¤èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼ã€èƒ½åŠ›ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - </text> - <text name="role_actions_modifiable"> - ã‚ãªãŸã¯å½¹å‰²ã«èƒ½åŠ›ã‚’割り当ã¦ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ - </text> - <text name="role_actions_not_modifiable"> - 能力ã®è¡¨ç¤ºã¯ã§ãã¾ã™ãŒï½¤ä¿®æ£ã‚„割り当ã¦ãªã©ã¯ã§ãã¾ã›ã‚“。 - </text> - </panel> - <panel name="actions_header"> - <text name="static"> - 能力 - </text> - <text name="static2"> - 能力ã®èª¬æ˜Žã€ã©ã®å½¹å‰²ã¨ãƒ¡ãƒ³ãƒãƒ¼ãŒãã®èƒ½åŠ›ã‚’実行ã§ãã‚‹ã‹ã‚’ -表示ã§ãã¾ã™ã€‚ - </text> - </panel> - <tab_container name="roles_tab_container"> - <panel label="メンãƒãƒ¼" name="members_sub_tab" tool_tip="メンãƒãƒ¼"> - <button label="検索" name="search_button"/> - <button label="å…¨ã¦ã‚’表示" name="show_all_button"/> - <name_list name="member_list"> - <column label="メンãƒãƒ¼å" name="name"/> - <column label="寄付ã•ã‚ŒãŸTier" name="donated"/> - <column label="最終ãƒã‚°ã‚¤ãƒ³" name="online"/> - </name_list> - <button label="æ–°ã—ã„メンãƒãƒ¼ã‚’招待" name="member_invite"/> - <button label="グループã‹ã‚‰è¿½æ”¾" name="member_eject"/> - <string name="help_text"> - ã‚ãªãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã‚’ä»˜åŠ ã€å‰Šé™¤ã§ãã¾ã™ã€‚ -Ctrl ã‚ーを押ã—ãªãŒã‚‰ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã¨ -複数ã®äººã‚’é¸æŠžã§ãã¾ã™ã€‚ - </string> - </panel> - <panel label="役割" name="roles_sub_tab"> - <button label="検索" name="search_button"/> - <button label="ã™ã¹ã¦ã‚’表示" name="show_all_button"/> - <scroll_list name="role_list"> - <column label="役割å" name="name"/> - <column label="肩書ã" name="title"/> - <column label="メンãƒãƒ¼" name="members"/> - </scroll_list> - <button label="æ–°ã—ã„役割を作æˆ..." name="role_create"/> - <button label="役割を削除" name="role_delete"/> - <string name="help_text"> - 役割ã«ã¯ã‚¿ã‚¤ãƒˆãƒ«ãŒã‚ã‚Šã€ãƒ¡ãƒ³ãƒãƒ¼ãŒè¡Œä½¿å¯èƒ½ãª -能力ã®ãƒªã‚¹ãƒˆãŒå®šç¾©ã•ã‚Œã¾ã™ã€‚ メンãƒãƒ¼ã¯ã€ -1ã¤ã¾ãŸã¯è¤‡æ•°ã®å½¹å‰²ã«å±žã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 1ã¤ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å¯¾ã—〠-「全員ã€ã¨ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã®å½¹å‰²ã‚’å«ã‚ã¦æœ€é«˜ã§10ã®å½¹å‰²ã‚’æŒãŸã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - </string> - <string name="cant_delete_role"> - 「全員ã€ã¨ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã¯ç‰¹åˆ¥ãªå½¹å‰²ãªã®ã§ã€å‰Šé™¤ã§ãã¾ã›ã‚“。 - </string> - </panel> - <panel label="能力" name="actions_sub_tab"> - <button label="検索" name="search_button"/> - <button label="ã™ã¹ã¦ã‚’表示" name="show_all_button"/> - <scroll_list name="action_list" tool_tip="能力をé¸æŠžã—ã¦è©³ç´°ã‚’表示ã—ã¾ã™ã€‚"> - <column label="" name="icon"/> - <column label="" name="action"/> - </scroll_list> - <string name="help_text"> - ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã§å½¹å‰²ã‚’与ãˆã‚‰ã‚Œã¦ã„るメンãƒãƒ¼ãŒå®Ÿè¡Œã§ãã‚‹æ“作ã¯ã€ -能力ã«ã‚ˆã£ã¦æ±ºã¾ã‚Šã¾ã™ã€‚ ã•ã¾ã–ã¾ãªèƒ½åŠ›ãŒç”¨æ„ã•ã‚Œã¦ã„ã¾ã™ã€‚ - </string> - </panel> - </tab_container> - <panel name="members_footer"> - <text name="static"> - 割当られãŸå½¹å‰² - </text> - <text name="static2"> - 許å¯ã•ã‚ŒãŸèƒ½åŠ› - </text> - <scroll_list name="member_assigned_roles"> - <column label="" name="checkbox"/> - <column label="" name="role"/> - </scroll_list> - <scroll_list name="member_allowed_actions" tool_tip="許å¯ã•ã‚ŒãŸèƒ½åŠ›ã®è©³ç´°ã¯ã€Œèƒ½åŠ›ã€ã‚¿ãƒ–ã‚’ã”覧ãã ã•ã„。"> - <column label="" name="icon"/> - <column label="" name="action"/> - </scroll_list> - </panel> - <panel name="roles_footer"> - <text name="static"> - åå‰ - </text> - <text name="static2"> - 説明 - </text> - <line_editor name="role_name"> - 従æ¥å“¡ - </line_editor> - <text name="static3"> - 肩書ã - </text> - <line_editor name="role_title"> - (待機ä¸ï¼‰ - </line_editor> - <text_editor name="role_description"> - (待機ä¸ï¼‰ - </text_editor> - <text name="static4"> - 割当られãŸãƒ¡ãƒ³ãƒãƒ¼ - </text> - <text name="static5" tool_tip="ç¾åœ¨é¸æŠžã•ã‚Œã¦ã„る役割ã§å®Ÿè¡Œã§ãる能力ã®ãƒªã‚¹ãƒˆ"> - 許å¯ã•ã‚ŒãŸèƒ½åŠ› - </text> - <check_box label="メンãƒãƒ¼ãŒå…¬é–‹çŠ¶æ…‹" name="role_visible_in_list" tool_tip="ã“ã®å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’グループ外ã®äººã®ä¸€èˆ¬ã‚¿ãƒ–ã«è¡¨ç¤ºã™ã‚‹ã‹ã©ã†ã‹ã‚’è¨å®šã—ã¾ã™ã€‚"/> - <scroll_list name="role_allowed_actions" tool_tip="許å¯ã•ã‚ŒãŸèƒ½åŠ›ã®è©³ç´°ã¯ã€Œèƒ½åŠ›ã€ã‚¿ãƒ–ã‚’ã”覧ãã ã•ã„。"> - <column label="" name="icon"/> - <column label="" name="checkbox"/> - <column label="" name="action"/> - </scroll_list> - </panel> - <panel name="actions_footer"> - <text name="static"> - 説明 - </text> - <text_editor name="action_description"> - ã“ã‚Œã¯ã€Œã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’追放ã™ã‚‹ã€èƒ½åŠ›ã§ã™ã€‚ オーナーを追放ã§ãã‚‹ã®ã¯ã€åˆ¥ã®ã‚ªãƒ¼ãƒŠãƒ¼ã ã‘ã§ã™ã€‚ - </text_editor> - <text name="static2"> - 役割ã¨èƒ½åŠ› - </text> - <text name="static3"> - 能力ã®ã‚るメンãƒãƒ¼ - </text> - </panel> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="メンãƒãƒ¼ã¨å½¹å‰²" name="roles_tab"> + <panel.string name="default_needs_apply_text"> + ç¾åœ¨ã®ã‚µãƒ–タブã«ã€æœªé©ç”¨ã®å¤‰æ›´ãŒã‚ã‚Šã¾ã™ã€‚ + </panel.string> + <panel.string name="want_apply_text"> + ã“れらã®å¤‰æ›´ã‚’é©ç”¨ã—ã¾ã™ã‹ï¼Ÿ + </panel.string> + <tab_container name="roles_tab_container"> + <panel label="メンãƒãƒ¼" name="members_sub_tab" tool_tip="メンãƒãƒ¼"> + <panel.string name="help_text"> + ã‚ãªãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã‚’ä»˜åŠ ã€å‰Šé™¤ã§ãã¾ã™ã€‚ +Ctrl ã‚ーを押ã—ãªãŒã‚‰ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã¨ +複数ã®äººã‚’é¸æŠžã§ãã¾ã™ã€‚ + </panel.string> + <filter_editor label="メンãƒãƒ¼ã‚’é¸åˆ¥" name="filter_input"/> + <name_list name="member_list"> + <name_list.columns label="メンãƒãƒ¼" name="name"/> + <name_list.columns label="寄付" name="donated"/> + <name_list.columns label="オンライン" name="online"/> + </name_list> + <button label="招待" name="member_invite"/> + <button label="追放" name="member_eject"/> + </panel> + <panel label="役割" name="roles_sub_tab"> + <panel.string name="help_text"> + 役割ã«ã¯ã‚¿ã‚¤ãƒˆãƒ«ãŒã‚ã‚Šã€ãƒ¡ãƒ³ãƒãƒ¼ãŒè¡Œä½¿å¯èƒ½ãª +能力ã®ãƒªã‚¹ãƒˆãŒå®šç¾©ã•ã‚Œã¾ã™ã€‚ メンãƒãƒ¼ã¯ã€ +1ã¤ã¾ãŸã¯è¤‡æ•°ã®å½¹å‰²ã«å±žã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 1ã¤ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å¯¾ã—〠+「全員ã€ã¨ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã®å½¹å‰²ã‚’å«ã‚ã¦æœ€é«˜ã§10ã®å½¹å‰²ã‚’æŒãŸã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + </panel.string> + <panel.string name="cant_delete_role"> + 「全員ã€ã¨ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã¯ç‰¹åˆ¥ãªå½¹å‰²ãªã®ã§ã€å‰Šé™¤ã§ãã¾ã›ã‚“。 + </panel.string> + <filter_editor label="役割をé¸åˆ¥" name="filter_input"/> + <scroll_list name="role_list"> + <scroll_list.columns label="役割" name="name"/> + <scroll_list.columns label="肩書ã" name="title"/> + <scroll_list.columns label="メンãƒãƒ¼" name="members"/> + </scroll_list> + <button label="å½¹å‰²ã‚’è¿½åŠ " name="role_create"/> + <button label="役割を削除" name="role_delete"/> + </panel> + <panel label="能力" name="actions_sub_tab" tool_tip="能力ã®èª¬æ˜Žæ–‡ã«ã¯ã€ã©ã®å½¹å‰²ãƒ»ãƒ¡ãƒ³ãƒãƒ¼ãŒãã®èƒ½åŠ›ã‚’æŒã¤ã‹ãŒæ›¸ã‹ã‚Œã¦ã„ã¾ã™ã€‚"> + <panel.string name="help_text"> + ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã§å½¹å‰²ã‚’与ãˆã‚‰ã‚Œã¦ã„るメンãƒãƒ¼ãŒå®Ÿè¡Œã§ãã‚‹æ“作ã¯ã€ +能力ã«ã‚ˆã£ã¦æ±ºã¾ã‚Šã¾ã™ã€‚ ã•ã¾ã–ã¾ãªèƒ½åŠ›ãŒç”¨æ„ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </panel.string> + <filter_editor label="能力をé¸åˆ¥" name="filter_input"/> + <scroll_list name="action_list" tool_tip="能力をé¸æŠžã—ã¦è©³ç´°ã‚’表示ã—ã¾ã™ã€‚"> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + </tab_container> + <panel name="members_footer"> + <text name="static"> + 割当られãŸå½¹å‰² + </text> + <scroll_list name="member_assigned_roles"> + <scroll_list.columns label="" name="checkbox"/> + <scroll_list.columns label="" name="role"/> + </scroll_list> + <text name="static2"> + 許å¯ã•ã‚ŒãŸèƒ½åŠ› + </text> + <scroll_list name="member_allowed_actions" tool_tip="許å¯ã•ã‚ŒãŸèƒ½åŠ›ã®è©³ç´°ã¯ã€Œèƒ½åŠ›ã€ã‚¿ãƒ–ã‚’ã”覧ãã ã•ã„。"> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + <panel name="roles_footer"> + <text name="static"> + åå‰ + </text> + <line_editor name="role_name"> + 従æ¥å“¡ + </line_editor> + <text name="static3"> + 肩書ã + </text> + <line_editor name="role_title"> + (待機ä¸ï¼‰ + </line_editor> + <text name="static2"> + 説明 + </text> + <text_editor name="role_description"> + (待機ä¸ï¼‰ + </text_editor> + <text name="static4"> + 割当られãŸãƒ¡ãƒ³ãƒãƒ¼ + </text> + <check_box label="メンãƒãƒ¼ãŒå…¬é–‹çŠ¶æ…‹" name="role_visible_in_list" tool_tip="ã“ã®å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’グループ外ã®äººã®ä¸€èˆ¬ã‚¿ãƒ–ã«è¡¨ç¤ºã™ã‚‹ã‹ã©ã†ã‹ã‚’è¨å®šã—ã¾ã™ã€‚"/> + <text name="static5" tool_tip="ç¾åœ¨é¸æŠžã•ã‚Œã¦ã„る役割ã§å®Ÿè¡Œã§ãる能力ã®ãƒªã‚¹ãƒˆ"> + 許å¯ã•ã‚ŒãŸèƒ½åŠ› + </text> + <scroll_list name="role_allowed_actions" tool_tip="許å¯ã•ã‚ŒãŸèƒ½åŠ›ã®è©³ç´°ã¯ã€Œèƒ½åŠ›ã€ã‚¿ãƒ–ã‚’ã”覧ãã ã•ã„。"> + <scroll_list.columns label="" name="icon"/> + <scroll_list.columns label="" name="checkbox"/> + <scroll_list.columns label="" name="action"/> + </scroll_list> + </panel> + <panel name="actions_footer"> + <text name="static"> + 説明 + </text> + <text_editor name="action_description"> + ã“ã‚Œã¯ã€Œã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’追放ã™ã‚‹ã€èƒ½åŠ›ã§ã™ã€‚ オーナーを追放ã§ãã‚‹ã®ã¯ã€åˆ¥ã®ã‚ªãƒ¼ãƒŠãƒ¼ã ã‘ã§ã™ã€‚ + </text_editor> + <text name="static2"> + 役割ã¨èƒ½åŠ› + </text> + <text name="static3"> + 能力ã®ã‚るメンãƒãƒ¼ + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml new file mode 100644 index 00000000000..4182ca506fb --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_im_control_panel"> + <button label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã®è¡¨ç¤º" name="view_profile_btn"/> + <button label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ " name="add_friend_btn"/> + <button label="共有" name="share_btn"/> + <panel name="panel_call_buttons"> + <button label="コール" name="call_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml index 0f270beb2c5..d55a78297c8 100644 --- a/indra/newview/skins/default/xui/ja/panel_login.xml +++ b/indra/newview/skins/default/xui/ja/panel_login.xml @@ -1,45 +1,19 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="panel_login"> - <text name="first_name_text" left="20"> - ファーストãƒãƒ¼ãƒ : - </text> - <line_editor left="20" name="first_name_edit" width="126" /> - <text name="last_name_text" left="158"> - ラストãƒãƒ¼ãƒ : - </text> - <line_editor left="158" name="last_name_edit" width="126" /> - <text name="password_text"> - パスワード: - </text> - <text name="start_location_text" left="20" > - ãƒã‚°ã‚¤ãƒ³ä½ç½®ï¼š - </text> - <combo_box name="start_location_combo" left_delta="92" width="172"> - <combo_box.item name="MyHome" label="自宅(ホーム)" /> - <combo_box.item name="MyLastLocation" label="最後ã«ãƒã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€" /> - <combo_box.item name="Typeregionname" label="< 地域ã®åå‰å…¥åŠ› >" /> - </combo_box> - <check_box label="パスワードを記憶" name="remember_check" left_delta="180"/> - <text name="full_screen_text"> - ãƒã‚°ã‚¤ãƒ³æ™‚ã«ã¯ãƒ•ãƒ«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³è¡¨ç¤ºã«ãªã‚Šã¾ã™ - </text> - <button label="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..." label_selected="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..." name="new_account_btn"/> - <button label="環境è¨å®š..." label_selected="環境è¨å®š..." name="preferences_btn"/> - <button label="ãƒã‚°ã‚¤ãƒ³" label_selected="ãƒã‚°ã‚¤ãƒ³" name="connect_btn"/> - <button label="終了" label_selected="終了" name="quit_btn"/> - <text name="version_text"> - 1.23.4 (5) - </text> - <text name="create_new_account_text"> - アカウントを申ã—込む - </text> - <text name="channel_text"> - [VERSION] - </text> - <text name="forgot_password_text" left="-230" width="220"> - åå‰ã¾ãŸã¯ãƒ‘スワードをãŠå¿˜ã‚Œã§ã™ã‹ï¼Ÿ - </text> - <text name="forgot_password_url"> - http://secondlife.com/account/request.php - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_login"> + <panel.string name="create_account_url"> + http://jp.secondlife.com/registration/ + </panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php + </panel.string> + <panel name="login_widgets"> + <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] ファーストãƒãƒ¼ãƒ "/> + <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] ラストãƒãƒ¼ãƒ "/> + <text name="start_location_text"> + 開始ä½ç½®ï¼š + </text> + <text name="create_new_account_text"> + æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’ä½œæˆ + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml new file mode 100644 index 00000000000..159a63cd408 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="chat_bar"> + <line_editor label="ã“ã“をクリックã—ã¦ãƒãƒ£ãƒƒãƒˆã‚’開始ã—ã¾ã™ã€‚" name="chat_box" tool_tip="エンターを押ã—ã¦ç™ºè¨€ã€Ctrl+エンターã§å«ã¶ã€‚"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_pick_info.xml b/indra/newview/skins/default/xui/ja/panel_pick_info.xml new file mode 100644 index 00000000000..711a4cf47a3 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_pick_info.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_pick_info"> + <text name="title" value="ピックã®æƒ…å ±"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <text name="pick_name" value="[name]"/> + <text name="pick_location" value="[loading...]"/> + <text name="pick_desc" value="[description]"/> + </panel> + </scroll_container> + <panel name="buttons"> + <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/> + <button label="地図" name="show_on_map_btn"/> + <button label="編集" name="edit_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_picks.xml b/indra/newview/skins/default/xui/ja/panel_picks.xml new file mode 100644 index 00000000000..6a391957e99 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_picks.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ピック" name="panel_picks"> + <panel label="bottom_panel" name="edit_panel"> + <button name="new_btn" tool_tip="ç¾åœ¨åœ°ã‚’æ–°è¦ãƒ”ックã«è¿½åŠ "/> + </panel> + <panel name="buttons_cucks"> + <button label="地図" name="show_on_map_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index 3bf303eaa30..88e10aa832e 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -1,57 +1,42 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"> - <text name="text_box"> - ãƒãƒ£ãƒƒãƒˆã®ãƒ•ã‚©ãƒ³ãƒˆï¼š - </text> - <radio_group name="chat_font_size"> - <radio_item name="radio" label="å°" /> - <radio_item name="radio2" label="ä¸" /> - <radio_item name="radio3" label="大" /> - </radio_group> - <color_swatch label="自分" name="user"/> - <text name="text_box1"> - 自分 - </text> - <color_swatch label="ãã®ä»–" name="agent"/> - <text name="text_box2"> - ãã®ä»– - </text> - <color_swatch label="IM" name="im"/> - <text name="text_box3"> - IM - </text> - <color_swatch label="システム" name="system"/> - <text name="text_box4"> - システム - </text> - <color_swatch label="エラー" name="script_error"/> - <text name="text_box5"> - エラー - </text> - <color_swatch label="オブジェクト" name="objects"/> - <text name="text_box6"> - オブジェクト - </text> - <color_swatch label="所有者" name="owner"/> - <text name="text_box7"> - 所有者 - </text> - <color_swatch label="å¹å‡ºã—" name="background"/> - <text name="text_box8"> - å¹å‡ºã— - </text> - <color_swatch label="URL" name="links"/> - <text name="text_box9"> - URL - </text> - <spinner label="フェード" name="fade_chat_time"/> - <slider label="ä¸é€æ˜Žåº¦" name="console_opacity"/> - <check_box label="全画é¢å¹…を使用 (å†èµ·å‹•ãŒå¿…è¦)" name="chat_full_width_check"/> - <check_box label="Enterã‚ーを押ã—ãŸå¾Œãƒãƒ£ãƒƒãƒˆ ãƒãƒ¼ã‚’é–‰ã˜ã‚‹" name="close_chat_on_return_check"/> - <check_box label="ãƒãƒ£ãƒƒãƒˆä¸ã¯ã€ã„ã¤ã§ã‚‚矢å°ã‚ーã§ã‚¢ãƒã‚¿ãƒ¼ã‚’移動å¯èƒ½" name="arrow_keys_move_avatar_check"/> - <check_box label="ãƒãƒ¼ã‚«ãƒ«ãƒãƒ£ãƒƒãƒˆã«ã‚¿ã‚¤ãƒ スタンプを表示" name="show_timestamps_check"/> - <check_box label="ãƒãƒ£ãƒƒãƒˆä¸ã¯ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/> - <check_box label="ãƒãƒ£ãƒƒãƒˆã®å¹ã出ã—を表示" name="bubble_text_chat"/> - <slider label="ä¸é€æ˜Žåº¦" name="bubble_chat_opacity"/> - <check_box label="スクリプト・エラーã¨è¦å‘Šã‚’ãƒãƒ£ãƒƒãƒˆåŒæ§˜ã«è¡¨ç¤º" name="script_errors_as_chat"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"> + <radio_group name="chat_font_size"> + <radio_item label="å°" name="radio"/> + <radio_item label="ä¸" name="radio2"/> + <radio_item label="大" name="radio3"/> + </radio_group> + <color_swatch label="自分" name="user"/> + <text name="text_box1"> + ミー + </text> + <color_swatch label="ãã®ä»–" name="agent"/> + <text name="text_box2"> + ãã®ä»– + </text> + <color_swatch label="IM" name="im"/> + <text name="text_box3"> + IM + </text> + <color_swatch label="システム" name="system"/> + <text name="text_box4"> + システム + </text> + <color_swatch label="エラー" name="script_error"/> + <text name="text_box5"> + エラー + </text> + <color_swatch label="オブジェクト" name="objects"/> + <text name="text_box6"> + オブジェクト + </text> + <color_swatch label="所有者" name="owner"/> + <text name="text_box7"> + 所有者 + </text> + <color_swatch label="URL" name="links"/> + <text name="text_box9"> + URL + </text> + <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸ã¯ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/> + <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§é€ä¿¡" name="send_im_to_email"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml index 636c137b4b6..7c02baedc0a 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml @@ -1,171 +1,116 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="表示" name="Display panel"> - <text name="text"> - 表示解åƒåº¦ï¼š - </text> - <button label="?" name="GraphicsPreferencesHelpButton" /> - <check_box label="ウィンドウ内㧠Second Life ã‚’èµ·å‹•" name="windowed mode" /> - <text_editor name="voice_chat_description"> - ãƒã‚§ãƒƒã‚¯ç„¡ã—ã®å ´åˆã¯ã€ãƒã‚°ã‚¤ãƒ³æ™‚ã«ãƒ•ãƒ«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³è¡¨ç¤º - </text_editor> - <text name="Fullscreen Aspect Ratio:"> - 全画é¢ã®ç¸¦æ¨ªæ¯”: - </text> - <text name="(width / height)"> - (幅ï¼é«˜ã•ï¼‰ - </text> - <text_editor bottom="-56" height="40" name="FullScreenInfo" width="480"> - ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€ãƒã‚°ã‚¤ãƒ³ã™ã‚‹ã¨ãƒ“ューワãŒãƒ•ãƒ«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã§è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ - </text_editor> - <text name="WindowSizeLabel"> - ウィンドウ・サイズ: - </text> - <combo_box name="windowsize combo"> - <combo_box.item name="640x480" label="640x480" /> - <combo_box.item name="800x600" label="800x600" /> - <combo_box.item name="720x480" label="720x480 (NTSC)" /> - <combo_box.item name="768x576" label="768x576 (PAL)" /> - <combo_box.item name="1024x768" label="1024x768" /> - </combo_box> - <text name="DisplayResLabel"> - 表示解åƒåº¦ï¼š - </text> - <text name="AspectRatioLabel1" tool_tip="(幅/高ã•ï¼‰"> - 縦横比: - </text> - <combo_box name="aspect_ratio" tool_tip="(幅/高ã•ï¼‰"> - <combo_box.item name="4:3(StandardCRT)" label="4:3(標準CRT)" /> - <combo_box.item name="5:4(1280x1024LCD)" label="5:4(1280x1024 LCD)" /> - <combo_box.item name="8:5(Widescreen)" label="8:5(ワイドスクリï¼ãƒ³ï¼‰" /> - <combo_box.item name="16:9(Widescreen)" label="16:9(ワイドスクリï¼ãƒ³ï¼‰" /> - </combo_box> - <check_box label="自動検出率" name="aspect_auto_detect" /> - <text name="UI Size:"> - UIサイズ: - </text> - <text name="(meters, lower is faster)"> - (メートルã€ä½Žã„ã»ã©é€Ÿã„) - </text> - <text name="text2"> - 表示オプション: - </text> - <check_box label="解åƒåº¦å˜ç‹¬ã‚¹ã‚±ãƒ¼ãƒ«ã‚’使用" name="ui_auto_scale" /> - <spinner label="æç”»è·é›¢ï¼š" name="draw_distance" /> - <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã‚’一人称視点(マウスルック)ã§è¡¨ç¤º" name="avfp" /> - <text name="HigherText"> - å“質ãŠã‚ˆã³ - </text> - <text name="QualityText"> - パフォーマンス: - </text> - <text name="FasterText"> - 速ㄠ- </text> - <text name="ShadersPrefText"> - 低 - </text> - <text name="ShadersPrefText2"> - ä¸ - </text> - <text name="ShadersPrefText3"> - 高 - </text> - <text name="ShadersPrefText4"> - 超高 - </text> - <text name="HigherText2"> - 高ㄠ- </text> - <text name="QualityText2"> - å“質 - </text> - <check_box label="カスタム" name="CustomSettings" /> - <panel name="CustomGraphics Panel"> - <text name="ShadersText"> - シェーダー: - </text> - <check_box label="ãƒãƒ³ãƒ—・マッピングã¨å…‰æ²¢" name="BumpShiny" /> - <check_box label="基本シェーダー" name="BasicShaders" - tool_tip="ã“ã®ã‚ªãƒ—ションを無効ã«ã™ã‚‹ã¨ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚«ãƒ¼ãƒ‰ãƒ»ãƒ‰ãƒ©ã‚¤ãƒã®ç¨®é¡žã«ã‚ˆã£ã¦ã¯ã‚¯ãƒ©ãƒƒã‚·ãƒ¥é˜²æ¢ã«ãªã‚Šã¾ã™ã€‚" /> - <check_box label="周囲(大気)シェーダー" name="WindLightUseAtmosShaders" /> - <check_box label="æ°´ã®åå°„" name="Reflections" /> - <text name="ReflectionDetailText"> - å射詳細: - </text> - <radio_group name="ReflectionDetailRadio"> - <radio_item name="0" label="地形ã¨æ¨¹æœ¨" /> - <radio_item name="1" label="ã™ã¹ã¦ã®é™çš„オブジェクト" /> - <radio_item name="2" label="ã™ã¹ã¦ã®ã‚¢ãƒã‚¿ãƒ¼ã¨ã‚ªãƒ–ジェクト" /> - <radio_item name="3" label="ã™ã¹ã¦" /> - </radio_group> - <text name="AvatarRenderingText"> - ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š - </text> - <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã®ç²¾åº¦ã‚’下ã’ã‚‹" name="AvatarImpostors" /> - <check_box label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ»ã‚¹ã‚ニング" name="AvatarVertexProgram" /> - <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã®æœ" name="AvatarCloth" /> - <text name="DrawDistanceMeterText1"> - m - </text> - <text name="DrawDistanceMeterText2"> - m - </text> - <slider label="æç”»è·é›¢ï¼š" name="DrawDistance" /> - <slider label="最大パーティクル数:" name="MaxParticleCount" /> - <slider label="ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹å“質:" name="RenderPostProcess" /> - <text name="MeshDetailText"> - メッシュ詳細: - </text> - <slider label=" オブジェクト:" name="ObjectMeshDetail" /> - <slider label=" フレã‚シプリム:" name="FlexibleMeshDetail" /> - <slider label=" 樹木:" name="TreeMeshDetail" /> - <slider label=" ã‚¢ãƒã‚¿ãƒ¼ï¼š" name="AvatarMeshDetail" /> - <slider label=" 地形:" name="TerrainMeshDetail" /> - <slider label=" 空:" name="SkyMeshDetail" /> - <text name="PostProcessText"> - 低 - </text> - <text name="ObjectMeshDetailText"> - 低 - </text> - <text name="FlexibleMeshDetailText"> - 低 - </text> - <text name="TreeMeshDetailText"> - 低 - </text> - <text name="AvatarMeshDetailText"> - 低 - </text> - <text name="TerrainMeshDetailText"> - 低 - </text> - <text name="SkyMeshDetailText"> - 低 - </text> - <text name="LightingDetailText"> - ライティング詳細: - </text> - <radio_group name="LightingDetailRadio"> - <radio_item name="SunMoon" label="太陽ã¨æœˆã®ã¿" /> - <radio_item name="LocalLights" label="近隣ã®ãƒãƒ¼ã‚«ãƒ«ãƒ»ãƒ©ã‚¤ãƒˆ" /> - </radio_group> - <text name="TerrainDetailText"> - 地形詳細: - </text> - <radio_group name="TerrainDetailRadio"> - <radio_item name="0" label="低" /> - <radio_item name="2" label="高" /> - </radio_group> - </panel> - <button label="推奨ã•ã‚ŒãŸè¨å®š" name="Defaults" /> - <button label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ»ã‚ªãƒ—ション" - label_selected="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ»ã‚ªãƒ—ション" - name="GraphicsHardwareButton" /> - <panel.string name="resolution_format"> - [RES_X] x [RES_Y] - </panel.string> - <panel.string name="aspect_ratio_text"> - [NUM]:[DEN] - </panel.string> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="表示" name="Display panel"> + <text name="WindowSizeLabel"> + ウィンドウ・サイズ: + </text> + <check_box label="全画é¢" name="windowed mode"/> + <combo_box name="windowsize combo"> + <combo_box.item label="640x480" name="640x480"/> + <combo_box.item label="800x600" name="800x600"/> + <combo_box.item label="720x480 (NTSC)" name="720x480"/> + <combo_box.item label="768x576 (PAL)" name="768x576"/> + <combo_box.item label="1024x768" name="1024x768"/> + </combo_box> + <text name="UI Size:"> + UIサイズ: + </text> + <text name="QualitySpeed"> + クオリティã¨ã‚¹ãƒ”ード: + </text> + <text name="FasterText"> + 速ㄠ+ </text> + <text name="BetterText"> + 速 + </text> + <text name="ShadersPrefText"> + 低 + </text> + <text name="ShadersPrefText2"> + ä¸ + </text> + <text name="ShadersPrefText3"> + 高 + </text> + <text name="ShadersPrefText4"> + 超高 + </text> + <panel label="CustomGraphics" name="CustomGraphics Panel"> + <text name="ShadersText"> + シェーダー: + </text> + <check_box initial_value="true" label="ãƒãƒ³ãƒ—・マッピングã¨å…‰æ²¢" name="BumpShiny"/> + <check_box initial_value="true" label="基本シェーダー" name="BasicShaders" tool_tip="ã“ã®ã‚ªãƒ—ションを無効ã«ã™ã‚‹ã¨ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚«ãƒ¼ãƒ‰ãƒ»ãƒ‰ãƒ©ã‚¤ãƒã®ç¨®é¡žã«ã‚ˆã£ã¦ã¯ã‚¯ãƒ©ãƒƒã‚·ãƒ¥é˜²æ¢ã«ãªã‚Šã¾ã™ã€‚"/> + <check_box initial_value="true" label="周囲(大気)シェーダー" name="WindLightUseAtmosShaders"/> + <check_box initial_value="true" label="æ°´ã®åå°„" name="Reflections"/> + <text name="ReflectionDetailText"> + å射詳細: + </text> + <radio_group name="ReflectionDetailRadio"> + <radio_item label="地形ã¨æ¨¹æœ¨" name="0"/> + <radio_item label="ã™ã¹ã¦ã®é™çš„オブジェクト" name="1"/> + <radio_item label="ã™ã¹ã¦ã®ã‚¢ãƒã‚¿ãƒ¼ã¨ã‚ªãƒ–ジェクト" name="2"/> + <radio_item label="ã™ã¹ã¦" name="3"/> + </radio_group> + <text name="AvatarRenderingText"> + ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š + </text> + <check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®ç²¾åº¦ã‚’下ã’ã‚‹" name="AvatarImpostors"/> + <check_box initial_value="true" label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ»ã‚¹ã‚ニング" name="AvatarVertexProgram"/> + <check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®æœ" name="AvatarCloth"/> + <slider label="æç”»è·é›¢ï¼š" name="DrawDistance"/> + <text name="DrawDistanceMeterText2"> + m + </text> + <slider label="最大パーティクル数:" name="MaxParticleCount"/> + <slider label="ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹å“質:" name="RenderPostProcess"/> + <text name="MeshDetailText"> + メッシュ詳細: + </text> + <slider label=" オブジェクト:" name="ObjectMeshDetail"/> + <slider label=" フレã‚シプリム:" name="FlexibleMeshDetail"/> + <slider label=" 樹木:" name="TreeMeshDetail"/> + <slider label=" ã‚¢ãƒã‚¿ãƒ¼ï¼š" name="AvatarMeshDetail"/> + <slider label=" 地形:" name="TerrainMeshDetail"/> + <slider label=" 空:" name="SkyMeshDetail"/> + <text name="PostProcessText"> + 低 + </text> + <text name="ObjectMeshDetailText"> + 低 + </text> + <text name="FlexibleMeshDetailText"> + 低 + </text> + <text name="TreeMeshDetailText"> + 低 + </text> + <text name="AvatarMeshDetailText"> + 低 + </text> + <text name="TerrainMeshDetailText"> + 低 + </text> + <text name="SkyMeshDetailText"> + 低 + </text> + <text name="LightingDetailText"> + ライティング詳細: + </text> + <radio_group name="LightingDetailRadio"> + <radio_item label="太陽ã¨æœˆã®ã¿" name="SunMoon"/> + <radio_item label="近隣ã®ãƒãƒ¼ã‚«ãƒ«ãƒ»ãƒ©ã‚¤ãƒˆ" name="LocalLights"/> + </radio_group> + <text name="TerrainDetailText"> + 地形詳細: + </text> + <radio_group name="TerrainDetailRadio"> + <radio_item label="低" name="0"/> + <radio_item label="高" name="2"/> + </radio_group> + </panel> + <button label="é©ç”¨" label_selected="é©ç”¨" name="Apply"/> + <button label="リセット" name="Defaults"/> + <button label="詳ã—ã„è¨å®š" name="Advanced"/> + <button label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢" label_selected="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢" name="GraphicsHardwareButton"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml index 20299542fb1..f7b727de6c8 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml @@ -1,32 +1,20 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="ãƒãƒ£ãƒƒãƒˆè¨å®š" name="im"> - <text name="text_box"> - オンライン通知: - </text> - <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿è‡ªåˆ†ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚’確èªå¯èƒ½ã«" name="online_visibility"/> - <text name="text_box2"> - IMオプション: - </text> - <text name="log_in_to_change"> - ãƒã‚°ã‚¤ãƒ³ã—ã¦å¤‰æ›´ã—ã¦ãã ã•ã„ - </text> - <check_box label="IMã‚’é›»åメール([EMAIL])ã¸é€ä¿¡" name="send_im_to_email"/> - <check_box label="ãƒãƒ£ãƒƒãƒˆã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã«IMを表示ã™ã‚‹" name="include_im_in_chat_console"/> - <check_box label="IMã«ã‚¿ã‚¤ãƒ スタンプを表示" name="show_timestamps_check"/> - <check_box label="オンライン・フレンド通知を表示" name="friends_online_notify_checkbox"/> - <text name="text_box4"> - 記録オプション: - </text> - <check_box label="IMãƒã‚°ã‚’自分ã®ã‚³ãƒ³ãƒ”ュータã«ä¿å˜" name="log_instant_messages"/> - <check_box label="IMãƒã‚°ã«ã‚¿ã‚¤ãƒ スタンプを表示" name="log_instant_messages_timestamp"/> - <check_box label="ãƒãƒ¼ã‚«ãƒ«ãƒãƒ£ãƒƒãƒˆã®ãƒã‚°ã‚’自分ã®ã‚³ãƒ³ãƒ”ュータã«ä¿å˜" name="log_chat"/> - <check_box label="最後ã®IMãƒãƒ£ãƒƒãƒˆã®æœ«å°¾ã‚’表示" name="log_show_history"/> - <check_box label="ãƒãƒ¼ã‚«ãƒ«ãƒãƒ£ãƒƒãƒˆã®ãƒã‚°ã«ã‚¿ã‚¤ãƒ スタンプを表示" name="log_chat_timestamp"/> - <check_box label="ãƒãƒ¼ã‚«ãƒ«ãƒãƒ£ãƒƒãƒˆã®ãƒã‚°ã«å—ä¿¡IMを表示" name="log_chat_IM"/> - <check_box label="タイムスタンプã«æ—¥ä»˜ã‚’åŠ ãˆã‚‹" name="log_date_timestamp"/> - <button label="パス変更" label_selected="パス変更" name="log_path_button"/> - <text name="text_box3"> - å–ã‚Šè¾¼ã¿ä¸ -å¿œç”メッセージ: - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ãƒãƒ£ãƒƒãƒˆè¨å®š" name="im"> + <panel.string name="log_in_to_change"> + ãƒã‚°ã‚¤ãƒ³ã—ã¦å¤‰æ›´ã—ã¦ãã ã•ã„ + </panel.string> + <button label="å±¥æ´ã®æ¶ˆåŽ»" name="clear_cache"/> + <text name="cache_size_label_l"> + (ä½ç½®ã€ç”»åƒã€webã€æ¤œç´¢å±¥æ´ï¼‰ + </text> + <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ³ã®ç¢ºèªå¯èƒ½" name="online_visibility"/> + <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿ã‚³ãƒ¼ãƒ«ã¨IMã®å—ä¿¡å¯èƒ½" name="voice_call_friends_only_check"/> + <check_box label="コールãŒçµ‚了ã—ãŸã‚‰ãƒžã‚¤ã‚¯ã®ã‚¹ã‚¤ãƒƒãƒã‚’切る" name="auto_disengage_mic_check"/> + <check_box label="Cookieã‚’å—ã‘入れる" name="cookies_enabled"/> + <check_box label="コンピューターã«ãƒã‚°ã‚’ä¿å˜" name="log_instant_messages"/> + <radio_group name="ChatIMLogs"> + <radio_item label="ãƒãƒ£ãƒƒãƒˆ" name="radio1"/> + <radio_item label="IM" name="radio2"/> + </radio_group> + <button label="ブラウズ" label_selected="ブラウズ" name="log_path_button"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml index ded6f9df38e..59357a366e1 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml @@ -1,31 +1,46 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="æ“作ã¨ã‚«ãƒ¡ãƒ©" name="Input panel"> - <text name=" Mouselook Options:"> - 一人称視点 -(マウスルック): - </text> - <text name=" Mouse Sensitivity:"> - 感度: - </text> - <check_box label="上下をå転" name="invert_mouse"/> - <text name=" Auto Fly Options:"> - 自動飛行オプション: - </text> - <check_box label="上下矢å°ã‚ーã®é•·æŠ¼ã—ã§é£›è¡Œï¼ç€åœ°" name="automatic_fly"/> - <text name=" Camera Options:"> - カメラ・オプション: - </text> - <text name="camera_fov_label"> - カメラ視野角: - </text> - <text name="Camera Follow Distance:"> - カメラ追従è·é›¢ï¼š - </text> - <check_box label="編集カメラã®è‡ªå‹•ç§»å‹•" name="edit_camera_movement" tool_tip="編集モードã®é–‹å§‹ã€çµ‚了時ã¯ã‚«ãƒ¡ãƒ©è‡ªå‹•ä½ç½®èª¿æ•´ã‚’使用"/> - <check_box label="容姿カメラã®è‡ªå‹•ç§»å‹•" name="appearance_camera_movement" tool_tip="編集モードã§ã¯ã€ã‚«ãƒ¡ãƒ©è‡ªå‹•ä½ç½®èª¿æ•´ã‚’使用"/> - <text name="text2"> - ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š - </text> - <check_box label="ã‚¢ãƒã‚¿ãƒ¼ã‚’一人称視点(マウスルック)ã§è¡¨ç¤º" name="first_person_avatar_visible"/> - <button label="ジョイスティックè¨å®š" name="joystick_setup_button"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="æ“作ã¨ã‚«ãƒ¡ãƒ©" name="Input panel"> + <button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/> + <text name="Mouselook:"> + 一人称視点: + </text> + <text name=" Mouse Sensitivity"> + マウスã®ç²¾åº¦ + </text> + <check_box label="切り替ãˆ" name="invert_mouse"/> + <text name="Network:"> + ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ï¼š + </text> + <text name="Maximum bandwidth"> + 最大帯域幅 + </text> + <text name="text_box2"> + kbps + </text> + <check_box label="カスタムãƒãƒ¼ãƒˆ" name="connection_port_enabled"/> + <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="web_proxy_port"/> + <text name="cache_size_label_l"> + ã‚ャッシュサイズ + </text> + <text name="text_box5"> + MB + </text> + <button label="ブラウズ" label_selected="ブラウズ" name="set_cache"/> + <button label="リセット" label_selected="è¨å®š" name="reset_cache"/> + <text name="Cache location"> + ã‚ャッシュã®å ´æ‰€ + </text> + <text name="Web:"> + Web: + </text> + <radio_group name="use_external_browser"> + <radio_item label="内蔵ブラウザを使用" name="internal" tool_tip="内蔵ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„Webリンクãªã©ã‚’見ã¾ã™ã€‚[APP_NAME] 内ã«æ–°ã—ã„ウィンドウã§ã“ã®ãƒ–ラウザãŒé–‹ãã¾ã™ã€‚"/> + <radio_item label="外部ブラウザ(IEã‚„Firefox)を使用" name="external" tool_tip="デフォルトã®ã‚·ã‚¹ãƒ†ãƒ Webブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„Webリンク先ãªã©ã‚’見ã¾ã™ã€‚全画é¢ã§èµ·å‹•ä¸ã«ã¯ãŠã™ã™ã‚ã—ã¾ã›ã‚“。"/> + </radio_group> + <check_box initial_value="false" label="Webプãƒã‚ã‚·" name="web_proxy_enabled"/> + <line_editor name="web_proxy_editor" tool_tip="使用ã™ã‚‹ãƒ—ãƒã‚ã‚·åã¾ãŸã¯IPアドレス"/> + <button label="ブラウズ" label_selected="ブラウズ" name="set_proxy"/> + <text name="Proxy location"> + プãƒã‚ã‚· + </text> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml index d8763193ae0..c4bd21a5baf 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml @@ -1,77 +1,72 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel label="音声ã¨ãƒ“デオ" name="Preference Media panel"> - <slider label="マスター" name="System Volume"/> - <slider label="風ã®éŸ³é‡" name="Wind Volume"/> - <slider label="サウンド" name="SFX Volume"/> - <slider label="メディア" name="Media Volume"/> - <slider label="UI" name="UI Volume"/> - <slider label="ミュージック" name="Music Volume"/> - <slider label="ボイス" name="Voice Volume"/> - <text_editor name="voice_unavailable"> - ボイスãƒãƒ£ãƒƒãƒˆã‚’利用ã§ãã¾ã›ã‚“ - </text_editor> - <check_box label="ボイスãƒãƒ£ãƒƒãƒˆã‚’有効ã«ã™ã‚‹" name="enable_voice_check"/> - <radio_group name="ear_location"> - <radio_item name="0" label="カメラã®ä½ç½®ã‹ã‚‰ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’èžã。" /> - <radio_item name="1" label="ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‹ã‚‰ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’èžã。" /> - </radio_group> - <button label="機器ã®è¨å®š" name="device_settings_btn"/> - <text name="muting_text"> - ボリューム: - </text> - <check_box label="オーディオをミュート" name="disable audio" /> - <text name="streaming_prefs_text"> - ストリーム環境è¨å®šï¼š - </text> - <text name="audio_prefs_text"> - オーディオ環境è¨å®šï¼š - </text> - <panel label="ボリューム" name="Volume Panel" /> - <check_box label="メディアを自動å†ç”Ÿ" name="auto_streaming_video" /> - <check_box - label="ウィンドウãŒæœ€å°åŒ–ã•ã‚ŒãŸã¨ãã«ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã‚’ミュート" - name="mute_when_minimized" /> - <text name="streaming_text"> - ストリーミング: - </text> - <check_box label="音楽ãŒã‚ã‚‹å ´åˆå†ç”Ÿã™ã‚‹" - name="streaming_music" /> - <check_box - label="ストリーミング・メディア使用å¯æ™‚ã«å†ç”Ÿ" - name="streaming_video" /> - <text name="system_volume_text"> - サウンド効果: - </text> - <text name="wind_volume_text"> - 風ã®éŸ³é‡ï¼š - </text> - <text name="footsteps_volume_text"> - 足音: - </text> - <text name="ui_volume_text"> - UI音é‡ï¼š - </text> - <slider label="ドップラー効果" name="Doppler Effect" /> - <slider label="é éš”è¦å› " name="Distance Factor" /> - <slider label="ãƒãƒ¼ãƒ«ã‚ªãƒ•ä¿‚æ•°" name="Rolloff Factor" /> - <spinner label="L$変更基準点" name="L$ Change Threshold" /> - <spinner label="ヘルス変化基準点" name="Health Change Threshold" /> - <text name="doppler_effect_text"> - オーディオ環境è¨å®šï¼š - </text> - <text name="distance_factor_text"> - è·é›¢ä¿‚数: - </text> - <text name="rolloff_factor_text"> - ãƒãƒ¼ãƒ«ã‚ªãƒ•ï¼š - </text> - <text name="default_upload_bitrate_text"> - デフォルトUL速度: - </text> - <radio_group name="bitrate"> - <radio_item name="32kbps" label="32kbps" /> - <radio_item name="64kbps" label="64kbps" /> - <radio_item name="96kbps" label="96kbps" /> - <radio_item name="128kbps" label="128kbps" /> - </radio_group> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="音声ã¨ãƒ“デオ" name="Preference Media panel"> + <slider label="音é‡" name="System Volume"/> + <slider label="風ã®éŸ³é‡" name="Wind Volume"/> + <slider label="サウンド" name="SFX Volume"/> + <slider label="メディア" name="Media Volume"/> + <slider label="UI" name="UI Volume"/> + <slider label="ミュージック" name="Music Volume"/> + <slider label="ボイス" name="Voice Volume"/> + <text_editor name="voice_unavailable"> + ボイスãƒãƒ£ãƒƒãƒˆã‚’利用ã§ãã¾ã›ã‚“ + </text_editor> + <check_box label="ボイスãƒãƒ£ãƒƒãƒˆ" name="enable_voice_check"/> + <radio_group name="ear_location"> + <radio_item label="カメラã®ä½ç½®ã‹ã‚‰èžã" name="0"/> + <radio_item label="ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‹ã‚‰èžã" name="1"/> + </radio_group> + <button label="機器ã®è¨å®š" name="device_settings_btn"/> + <text name="muting_text"> + ボリューム: + </text> + <check_box label="オーディオをミュート" name="disable audio"/> + <text name="streaming_prefs_text"> + ストリーム環境è¨å®šï¼š + </text> + <text name="audio_prefs_text"> + オーディオ環境è¨å®šï¼š + </text> + <panel label="ボリューム" name="Volume Panel"/> + <check_box label="メディアを自動å†ç”Ÿ" name="auto_streaming_video"/> + <check_box label="最å°åŒ–ã§ãƒŸãƒ¥ãƒ¼ãƒˆ" name="mute_when_minimized"/> + <text name="streaming_text"> + ストリーミング: + </text> + <check_box label="音楽ãŒã‚ã‚‹å ´åˆå†ç”Ÿã™ã‚‹" name="streaming_music"/> + <check_box label="ストリーミング・メディア使用å¯æ™‚ã«å†ç”Ÿ" name="streaming_video"/> + <text name="system_volume_text"> + サウンド効果: + </text> + <text name="wind_volume_text"> + 風ã®éŸ³é‡ï¼š + </text> + <text name="footsteps_volume_text"> + 足音: + </text> + <text name="ui_volume_text"> + UI音é‡ï¼š + </text> + <slider label="ドップラー効果" name="Doppler Effect"/> + <slider label="é éš”è¦å› " name="Distance Factor"/> + <slider label="ãƒãƒ¼ãƒ«ã‚ªãƒ•ä¿‚æ•°" name="Rolloff Factor"/> + <spinner label="L$変更基準点" name="L$ Change Threshold"/> + <spinner label="ヘルス変化基準点" name="Health Change Threshold"/> + <text name="doppler_effect_text"> + オーディオ環境è¨å®šï¼š + </text> + <text name="distance_factor_text"> + è·é›¢ä¿‚数: + </text> + <text name="rolloff_factor_text"> + ãƒãƒ¼ãƒ«ã‚ªãƒ•ï¼š + </text> + <text name="default_upload_bitrate_text"> + デフォルトUL速度: + </text> + <radio_group name="bitrate"> + <radio_item label="32kbps" name="32kbps"/> + <radio_item label="64kbps" name="64kbps"/> + <radio_item label="96kbps" name="96kbps"/> + <radio_item label="128kbps" name="128kbps"/> + </radio_group> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml new file mode 100644 index 00000000000..ff82043a0d9 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_profile.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="プãƒãƒ•ã‚£ãƒ¼ãƒ«" name="panel_profile"> + <string name="CaptionTextAcctInfo"> + [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION] + </string> + <string name="payment_update_link_url"> + http://www.secondlife.com/account/billing.php?lang=ja + </string> + <string name="my_account_link_url" value="http://secondlife.com/account"/> + <string name="no_partner_text" value="ãªã—"/> + <scroll_container name="profile_scroll"> + <panel name="scroll_content_panel"> + <panel name="second_life_image_panel"> + <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/> + </panel> + <panel name="first_life_image_panel"> + <text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/> + </panel> + <text name="me_homepage_text"> + Webサイト: + </text> + <text name="title_member_text" value="メンãƒãƒ¼ç™»éŒ²ï¼š"/> + <text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/> + <text name="title_partner_text" value="パートナー:"/> + <panel name="partner_data_panel"> + <text name="partner_text" value="[FIRST] [LAST]"/> + </panel> + <text name="title_groups_text" value="グループ:"/> + </panel> + </scroll_container> + <panel name="profile_buttons_panel"> + <button label="フレンド登録" name="add_friend"/> + <button label="IM" name="im"/> + <button label="コール" name="call"/> + <button label="テレãƒãƒ¼ãƒˆ" name="teleport"/> + </panel> + <panel name="profile_me_buttons_panel"> + <button label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ã®ç·¨é›†" name="edit_profile_btn"/> + <button label="容姿ã®ç·¨é›†" name="edit_appearance_btn"/> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_profile_view.xml b/indra/newview/skins/default/xui/ja/panel_profile_view.xml new file mode 100644 index 00000000000..7663851f61a --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_profile_view.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_target_profile"> + <string name="status_online"> + オンライン + </string> + <string name="status_offline"> + オフライン + </string> + <text name="user_name" value="(ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°...)"/> + <text name="status" value="オンライン"/> + <tab_container name="tabs"> + <panel label="プãƒãƒ•ã‚£ãƒ¼ãƒ«" name="panel_profile"/> + <panel label="ピック" name="panel_picks"/> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_script_ed.xml b/indra/newview/skins/default/xui/ja/panel_script_ed.xml new file mode 100644 index 00000000000..596d59b5777 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_script_ed.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="script panel"> + <panel.string name="loading"> + ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... + </panel.string> + <panel.string name="can_not_view"> + ã“ã®ã‚¹ã‚¯ãƒªãƒ—トã¯ã€Œã‚³ãƒ”ーä¸å¯ã€ã®ãŸã‚ã€è¡¨ç¤ºãƒ»ç·¨é›†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 オブジェクト内ã®ã‚¹ã‚¯ãƒªãƒ—トã®è¡¨ç¤ºãƒ»ç·¨é›†ã«ã¯ã€å…¨æ¨©é™ãŒå¿…è¦ã§ã™ã€‚ + </panel.string> + <panel.string name="public_objects_can_not_run"> + 公共ã®ã‚ªãƒ–ジェクトã§ã¯ã‚¹ã‚¯ãƒªãƒ—トを実行ã§ãã¾ã›ã‚“ + </panel.string> + <panel.string name="script_running"> + å®Ÿè¡Œä¸ + </panel.string> + <panel.string name="Title"> + スクリプト: [NAME] + </panel.string> + <text_editor name="Script Editor"> + ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... + </text_editor> + <button label="ä¿å˜" label_selected="ä¿å˜" name="Save_btn"/> + <combo_box label="挿入..." name="Insert..."/> + <menu_bar name="script_menu"> + <menu label="ファイル" name="File"> + <menu_item_call label="ä¿å˜" name="Save"/> + <menu_item_call label="変更を元ã«æˆ»ã™" name="Revert All Changes"/> + </menu> + <menu label="編集" name="Edit"> + <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/> + <menu_item_call label="ã‚„ã‚Šç›´ã—" name="Redo"/> + <menu_item_call label="切りå–ã‚Š" name="Cut"/> + <menu_item_call label="コピー" name="Copy"/> + <menu_item_call label="貼り付ã‘" name="Paste"/> + <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/> + <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/> + <menu_item_call label="検索 / å†é…ç½®..." name="Search / Replace..."/> + </menu> + <menu label="ヘルプ" name="Help"> + <menu_item_call label="ヘルプ..." name="Help..."/> + <menu_item_call label="ã‚ーワードヘルプ..." name="Keyword Help..."/> + </menu> + </menu_bar> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml new file mode 100644 index 00000000000..aea057657eb --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml--> +<panel name="panel_stand_stop_flying"> + <button label="ç«‹ã¡ä¸ŠãŒã‚‹" name="stand_btn" tool_tip="ã“ã“をクリックã—ã¦ç«‹ã¡ä¸ŠãŒã‚Šã¾ã™ã€‚"/> + <button label="飛行åœæ¢" name="stop_fly_btn" tool_tip="飛行åœæ¢"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml index 9c5fe981b8d..05f29b75908 100644 --- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml @@ -1,42 +1,22 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="status"> - <text name="ParcelNameText" tool_tip="ã‚ãªãŸãŒç«‹ã£ã¦ã„る土地区画ã®å å‰ã€‚クリックã™ã‚‹ã¨ã€ŒåœŸåœ°æƒ…å ±ã€ãŒé–‹ãã¾ã™ã€‚"> - 区画åã¯ã“ã“ã§ã™ - </text> - <text name="BalanceText" tool_tip="å£åº§æ®‹é«˜"> - ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ï¼Žï¼Žï¼Ž - </text> - <button label="" label_selected="" name="buycurrency" tool_tip="貨幣ã®è³¼å…¥"/> - <text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋時)"> - 12:00 AM - </text> - <text name="StatBarDaysOfWeek"> - 日曜日:月曜日:ç«æ›œæ—¥:水曜日:木曜日:金曜日:土曜日 - </text> - <text name="StatBarMonthsOfYear"> - 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月 - </text> - <button label="" label_selected="" name="scriptout" tool_tip="スクリプトè¦å‘ŠãŠã‚ˆã³ã‚¨ãƒ©ãƒ¼"/> - <button label="" label_selected="" name="health" tool_tip="å¥åº·çŠ¶æ…‹"/> - <text name="HealthText" tool_tip="å¥åº·çŠ¶æ…‹"> - 100% - </text> - <button label="" label_selected="" name="fly" tool_tip="飛行ç¦æ¢"/> - <button label="" label_selected="" name="build" tool_tip="作æˆç¦æ¢"/> - <button label="" label_selected="" name="scripts" tool_tip="スクリプトãªã—"/> - <button name="no_fly" tool_tip="飛行ç¦æ¢"/> - <button name="no_build" tool_tip="制作ï¼Rezç¦æ¢"/> - <button name="no_scripts" tool_tip="スクリプトç¦æ¢"/> - <button label="" label_selected="" name="restrictpush" tool_tip="プッシングを制é™"/> - <button name="status_voice" tool_tip="ボイス有効"/> - <button name="status_no_voice" tool_tip="ã“ã“ã§ã¯ãƒœã‚¤ã‚¹ã‚’使用ã§ãã¾ã›ã‚“。"/> - <button label="" label_selected="" name="buyland" tool_tip="ã“ã®åŒºç”»ã‚’購入"/> - <text name="packet_loss_tooltip"> - パケットæ失 - </text> - <text name="bandwidth_tooltip"> - 帯域幅 - </text> - <line_editor label="検索" name="search_editor" tool_tip="[SECOND_LIFE]を検索"/> - <button name="search_btn" tool_tip="[SECOND_LIFE]を検索"/> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="status"> + <panel.string name="StatBarDaysOfWeek"> + 日曜日:月曜日:ç«æ›œæ—¥:水曜日:木曜日:金曜日:土曜日 + </panel.string> + <panel.string name="StatBarMonthsOfYear"> + 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月 + </panel.string> + <panel.string name="packet_loss_tooltip"> + パケットæ失 + </panel.string> + <panel.string name="bandwidth_tooltip"> + 帯域幅 + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <button label="" label_selected="" name="buycurrency" tool_tip="ç§ã®æ®‹é«˜ï¼š ã“ã“をクリックã—㦠L$ を購入"/> + <text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋時)"> + 12:00 AM + </text> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_world_map.xml b/indra/newview/skins/default/xui/ja/panel_world_map.xml index 391379b0720..6cf008c5149 100644 --- a/indra/newview/skins/default/xui/ja/panel_world_map.xml +++ b/indra/newview/skins/default/xui/ja/panel_world_map.xml @@ -1,51 +1,57 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="world_map"> - <panel.string name="world_map_north"> - 北 - </panel.string> - <panel.string name="world_map_east"> - æ± - </panel.string> - <panel.string name="world_map_west"> - 西 - </panel.string> - <panel.string name="world_map_south"> - å— - </panel.string> - <panel.string name="world_map_southeast"> - å—æ± - </panel.string> - <panel.string name="world_map_northeast"> - åŒ—æ± - </panel.string> - <panel.string name="world_map_southwest"> - å—西 - </panel.string> - <panel.string name="world_map_northwest"> - 北西 - </panel.string> - <text label="北" name="floater_map_north" text="北"> - 北 - </text> - <text label="æ±" name="floater_map_east" text="æ±"> - æ± - </text> - <text label="西" name="floater_map_west" text="西"> - 西 - </text> - <text label="å—" name="floater_map_south" text="å—"> - å— - </text> - <text label="å—æ±" name="floater_map_southeast" text="å—æ±"> - å—æ± - </text> - <text label="北æ±" name="floater_map_northeast" text="北æ±"> - åŒ—æ± - </text> - <text label="å—西" name="floater_map_southwest" text="å—西"> - å—西 - </text> - <text label="北西" name="floater_map_northwest" text="北西"> - 北西 - </text> -</panel> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="world_map"> + <panel.string name="Loading"> + ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... + </panel.string> + <panel.string name="InvalidLocation"> + 無効ãªä½ç½® + </panel.string> + <panel.string name="world_map_north"> + 北 + </panel.string> + <panel.string name="world_map_east"> + æ± + </panel.string> + <panel.string name="world_map_west"> + 西 + </panel.string> + <panel.string name="world_map_south"> + å— + </panel.string> + <panel.string name="world_map_southeast"> + å—æ± + </panel.string> + <panel.string name="world_map_northeast"> + åŒ—æ± + </panel.string> + <panel.string name="world_map_southwest"> + å—西 + </panel.string> + <panel.string name="world_map_northwest"> + 北西 + </panel.string> + <text label="北" name="floater_map_north" text="北"> + 北 + </text> + <text label="æ±" name="floater_map_east" text="æ±"> + æ± + </text> + <text label="西" name="floater_map_west" text="西"> + 西 + </text> + <text label="å—" name="floater_map_south" text="å—"> + å— + </text> + <text label="å—æ±" name="floater_map_southeast" text="å—æ±"> + å—æ± + </text> + <text label="北æ±" name="floater_map_northeast" text="北æ±"> + åŒ—æ± + </text> + <text label="å—西" name="floater_map_southwest" text="å—西"> + å—西 + </text> + <text label="北西" name="floater_map_northwest" text="北西"> + 北西 + </text> +</panel> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 0eb26754cfe..ad630ab5dcd 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -1,654 +1,3149 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- This file contains strings that used to be hardcoded in the source. - It is only for those strings which do not belong in a floater. - For example, the strings used in avatar chat bubbles, and strings - that are returned from one component and may appear in many places--> -<strings> - <string name="LoginInProgress"> - ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™ã€‚[APP_NAME]ã®è¡¨ç¤ºãŒãƒ•ãƒªãƒ¼ã‚ºã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。 - </string> - <string name="LoginAuthenticating"> - èªè¨¼ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginMaintenance"> - アカウント・メンテナンスを実行ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginAttempt"> - å‰å›žã®ãƒã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™([NUMBER]回目) - </string> - <string name="LoginPrecaching"> - ワールドをãƒãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginInitializingBrowser"> - 埋ã‚è¾¼ã¿WebブラウザをåˆæœŸåŒ–ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginInitializingMultimedia"> - マルãƒãƒ¡ãƒ‡ã‚£ã‚¢ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginVerifyingCache"> - ã‚ャッシュ・ファイルを検証ã—ã¦ã„ã¾ã™(所è¦æ™‚é–“ã¯60~90秒)... - </string> - <string name="LoginProcessingResponse"> - å¿œç”を処ç†ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginInitializingWorld"> - ワールドをåˆæœŸåŒ–ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginDecodingImages"> - ç”»åƒã‚’デコードã—ã¦ã„ã¾ã™... - </string> - <string name="LoginInitializingQuicktime"> - QuickTimeã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... - </string> - <string name="LoginQuicktimeNotFound"> - QuickTimeãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ - </string> - <string name="LoginQuicktimeOK"> - QuickTimeãŒæ£å¸¸ã«åˆæœŸåŒ–ã•ã‚Œã¾ã—ãŸã€‚ - </string> - <string name="LoginWaitingForRegionHandshake"> - 地域ã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å¾…ã£ã¦ã„ã¾ã™... - </string> - <string name="LoginConnectingToRegion"> - 地域ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™... - </string> - <string name="LoginDownloadingClothing"> - æœã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™... - </string> - <string name="AgentLostConnection"> - ã“ã®åœ°åŸŸã«ã¯ã€å•é¡ŒãŒç™ºç”Ÿã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã¦ãã ã•ã„。 - </string> - <string name="TooltipPerson"> - 人 - </string> - <string name="TooltipNoName"> - (åå‰ãªã—) - </string> - <string name="TooltipOwner"> - オーナー: - </string> - <string name="TooltipPublic"> - 公共 - </string> - <string name="TooltipIsGroup"> - (グループ) - </string> - <string name="TooltipFlagScript"> - スクリプト - </string> - <string name="TooltipFlagPhysics"> - 物ç†ä½œç”¨ - </string> - <string name="TooltipFlagTouch"> - 触る - </string> - <string name="TooltipFlagL$"> - L$ - </string> - <string name="TooltipFlagDropInventory"> - æŒã¡ç‰©ã‚’ドãƒãƒƒãƒ—ã™ã‚‹ - </string> - <string name="TooltipFlagPhantom"> - ファントム- </string> - <string name="TooltipFlagTemporary"> - 一時的 - </string> - <string name="TooltipFlagRightClickMenu"> - (å³ã‚¯ãƒªãƒƒã‚¯ã§ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示) - </string> - <string name="TooltipFreeToCopy"> - コピーå¯èƒ½ - </string> - <string name="TooltipForSaleL$"> - 売り出ã—ä¸:L$[AMOUNT] - </string> - <string name="TooltipForSaleMsg"> - 売り出ã—ä¸: [MESSAGE] - </string> - <string name="TooltipFlagGroupBuild"> - ã‚°ãƒ«ãƒ¼ãƒ—ä½œæˆ - </string> - <string name="TooltipFlagNoBuild"> - 作æˆç¦æ¢ - </string> - <string name="TooltipFlagNoEdit"> - ã‚°ãƒ«ãƒ¼ãƒ—ä½œæˆ - </string> - <string name="TooltipFlagNotSafe"> - å±é™º - </string> - <string name="TooltipFlagNoFly"> - 飛行ç¦æ¢ - </string> - <string name="TooltipFlagGroupScripts"> - グループ・スクリプト - </string> - <string name="TooltipFlagNoScripts"> - スクリプトãªã— - </string> - <string name="TooltipLand"> - 土地: - </string> - <string name="TooltipMustSingleDrop"> - 1ã¤ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã¿ã‚’ã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã§ãã¾ã™ - </string> - <string name="RetrievingData"> - 検索ä¸... - </string> - <string name="ReleaseNotes"> - リリースノート - </string> - <string name="LoadingData"> - ãƒãƒ¼ãƒ‰ä¸... - </string> - <string name="AvatarNameNobody"> - (無人) - </string> - <string name="AvatarNameWaiting"> - (å¾…æ©Ÿä¸) - </string> - <string name="AvatarNameHippos"> - (ã‚«ãƒ) - </string> - <string name="GroupNameNone"> - (ãªã—) - </string> - <string name="AssetErrorNone"> - エラーãªã— - </string> - <string name="AssetErrorRequestFailed"> - 資産ã®è¦æ±‚: 失敗 - </string> - <string name="AssetErrorNonexistentFile"> - 資産ã®è¦æ±‚: å˜åœ¨ã—ãªã„ファイル - </string> - <string name="AssetErrorNotInDatabase"> - 資産ã®è¦æ±‚: データベースã§ã¯è¦‹ã¤ã‹ã‚‰ãªã„資産 - </string> - <string name="AssetErrorEOF"> - ファイルã®çµ‚ã‚ã‚Š - </string> - <string name="AssetErrorCannotOpenFile"> - ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“ - </string> - <string name="AssetErrorFileNotFound"> - ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ - </string> - <string name="AssetErrorTCPTimeout"> - ファイル転é€ã‚¿ã‚¤ãƒ アウトã§ã™ - </string> - <string name="AssetErrorCircuitGone"> - 接続ãŒè§£é™¤ã•ã‚Œã¾ã—㟠- </string> - <string name="AssetErrorPriceMismatch"> - ビューワã¨ã‚µãƒ¼ãƒãƒ¼ã®ä¾¡æ ¼ãŒä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“ - </string> - <string name="AssetErrorUnknownStatus"> - ステータスãŒä¸æ˜Žã§ã™ - </string> - <string name="AvatarEditingApparance"> - (容姿ã®ç·¨é›†) - </string> - <string name="AvatarAway"> - 退å¸ä¸ - </string> - <string name="AvatarBusy"> - å–ã‚Šè¾¼ã¿ä¸ - </string> - <string name="AvatarMuted"> - ミュート - </string> - <string name="anim_express_afraid"> - 怖れ - </string> - <string name="anim_express_anger"> - 怒り - </string> - <string name="anim_away"> - 退å¸ä¸ - </string> - <string name="anim_backflip"> - 後ã‚宙返り - </string> - <string name="anim_express_laugh"> - 大笑ㄠ- </string> - <string name="anim_express_toothsmile"> - 満é¢ã®ç¬‘é¡” - </string> - <string name="anim_blowkiss"> - 投ã’ã‚ッス - </string> - <string name="anim_express_bored"> - 退屈 - </string> - <string name="anim_bow"> - ãŠã˜ãŽ - </string> - <string name="anim_clap"> - æ‹æ‰‹ - </string> - <string name="anim_courtbow"> - æ·±ã„ãŠã˜ãŽ - </string> - <string name="anim_express_cry"> - æ³£ã - </string> - <string name="anim_dance1"> - ダンス1 - </string> - <string name="anim_dance2"> - ダンス2 - </string> - <string name="anim_dance3"> - ダンス3 - </string> - <string name="anim_dance4"> - ダンス4 - </string> - <string name="anim_dance5"> - ダンス5 - </string> - <string name="anim_dance6"> - ダンス6 - </string> - <string name="anim_dance7"> - ダンス7 - </string> - <string name="anim_dance8"> - ダンス8 - </string> - <string name="anim_express_disdain"> - 侮蔑 - </string> - <string name="anim_drink"> - é…”ã£ã±ã‚‰ã† - </string> - <string name="anim_express_embarrased"> - 困惑 - </string> - <string name="anim_angry_fingerwag"> - 指を振る - </string> - <string name="anim_fist_pump"> - ガッツãƒãƒ¼ã‚º - </string> - <string name="anim_yoga_float"> - ãƒ¨ã‚¬æµ®éŠ - </string> - <string name="anim_express_frown"> - ã—ã‹ã‚ã£é¢ - </string> - <string name="anim_impatient"> - ã„らã„らã™ã‚‹ - </string> - <string name="anim_jumpforjoy"> - 飛ã³ä¸ŠãŒã£ã¦å–œã¶ - </string> - <string name="anim_kissmybutt"> - 挑発ãƒãƒ¼ã‚º - </string> - <string name="anim_express_kiss"> - ã‚ス - </string> - <string name="anim_laugh_short"> - 笑ㆠ- </string> - <string name="anim_musclebeach"> - 力ã“ã¶ã‚’見ã›ã‚‹ - </string> - <string name="anim_no_unhappy"> - ä¸æº€ã’ã«å¦å®šã™ã‚‹ - </string> - <string name="anim_no_head"> - å¦å®šã™ã‚‹ - </string> - <string name="anim_nyanya"> - 冷やã‹ã™ - </string> - <string name="anim_punch_onetwo"> - ワンツー・パンム- </string> - <string name="anim_express_open_mouth"> - å£ã‚’é–‹ã‘ã¦é©šã - </string> - <string name="anim_peace"> - ピース・サイン - </string> - <string name="anim_point_you"> - 他人を指差㙠- </string> - <string name="anim_point_me"> - 自分を指差㙠- </string> - <string name="anim_punch_l"> - 左パンム- </string> - <string name="anim_punch_r"> - å³ãƒ‘ンム- </string> - <string name="anim_rps_countdown"> - ã˜ã‚ƒã‚“ã‘ã‚“ãƒãƒ¼ã‚º - </string> - <string name="anim_rps_paper"> - パー - </string> - <string name="anim_rps_rock"> - グー - </string> - <string name="anim_rps_scissors"> - ãƒãƒ§ã‚ - </string> - <string name="anim_express_repulsed"> - 嫌悪感 - </string> - <string name="anim_kick_roundhouse_r"> - ã¾ã‚ã—è¹´ã‚Š - </string> - <string name="anim_express_sad"> - 悲ã—ã‚€ - </string> - <string name="anim_salute"> - 敬礼ã™ã‚‹ - </string> - <string name="anim_shout"> - å«ã¶ - </string> - <string name="anim_express_shrug"> - è‚©ã‚’ã™ãã‚ã‚‹ - </string> - <string name="anim_express_smile"> - 微笑む - </string> - <string name="anim_smoke_idle"> - ãŸã°ã“ã‚’ãゆら㙠- </string> - <string name="anim_smoke_inhale"> - ãŸã°ã“ã‚’å¸ã† - </string> - <string name="anim_smoke_throw_down"> - ãŸã°ã“ã‚’æ¨ã¦ã‚‹ - </string> - <string name="anim_express_surprise"> - é©šã - </string> - <string name="anim_sword_strike_r"> - 剣ã§æ–¬ã‚Šã¤ã‘ã‚‹ - </string> - <string name="anim_angry_tantrum"> - ã˜ã ã‚“ã ã‚’è¸ã‚€ - </string> - <string name="anim_express_tongue_out"> - 舌を出㙠- </string> - <string name="anim_hello"> - 手を振る - </string> - <string name="anim_whisper"> - å°å£°ã§è©±ã™ - </string> - <string name="anim_whistle"> - å£ç¬›ã‚’å¹ã - </string> - <string name="anim_express_wink"> - ウィンク - </string> - <string name="anim_wink_hollywood"> - ウィンク(ãƒãƒªã‚¦ãƒƒãƒ‰) - </string> - <string name="anim_express_worry"> - 心é…ã™ã‚‹ - </string> - <string name="anim_yes_happy"> - 笑顔ã§é ·ã - </string> - <string name="anim_yes_head"> - é ·ã - </string> - <string name="texture_loading"> - ãƒãƒ¼ãƒ‰ä¸... - </string> - <string name="worldmap_offline"> - オフライン - </string> - <string name="whisper"> - ã®ã•ã•ã‚„ã: - </string> - <string name="shout"> - ã®å«ã³: - </string> - <string name="SIM_ACCESS_PG"> - PG - </string> - <string name="SIM_ACCESS_MATURE"> - Mature - </string> - <string name="SIM_ACCESS_ADULT"> - Adult - </string> - <string name="SIM_ACCESS_DOWN"> - オフライン - </string> - <string name="SIM_ACCESS_MIN"> - ä¸æ˜Ž - </string> - <string name="land_type_unknown"> - (ä¸æ˜Žï¼‰ - </string> - <string name="covenant_never_modified"> - 最終修æ£ï¼š (無) - </string> - <string name="covenant_modified"> - 最終修æ£ï¼š - </string> - <string name="all_files"> - å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ« - </string> - <string name="sound_files"> - サウンド - </string> - <string name="animation_files"> - アニメーション - </string> - <string name="image_files"> - ç”»åƒ - </string> - <string name="save_file_verb"> - ä¿å˜ - </string> - <string name="load_file_verb"> - ãƒãƒ¼ãƒ‰ - </string> - <string name="targa_image_files"> - Targaç”»åƒ - </string> - <string name="bitmap_image_files"> - ãƒ“ãƒƒãƒˆãƒžãƒƒãƒ—ç”»åƒ - </string> - <string name="avi_movie_file"> - AVIムービーファイル - </string> - <string name="xaf_animation_file"> - XAFアニメーションファイル - </string> - <string name="xml_file"> - XMLファイル - </string> - <string name="dot_raw_file"> - RAWファイル - </string> - <string name="compressed_image_files"> - åœ§ç¸®ç”»åƒ - </string> - <string name="load_files"> - ファイルã®ãƒãƒ¼ãƒ‰ - </string> - <string name="choose_the_directory"> - å‚ç…§ - </string> - <string name="accel-mac-control"> - ⌃ - </string> - <string name="accel-mac-command"> - ⌘ - </string> - <string name="accel-mac-option"> - ⌥ - </string> - <string name="accel-mac-shift"> - ⇧ - </string> - <string name="accel-win-control"> - Ctrl+ - </string> - <string name="accel-win-alt"> - Alt+ - </string> - <string name="accel-win-shift"> - Shift+ - </string> - <string name="GraphicsQualityLow"> - 低 - </string> - <string name="GraphicsQualityMid"> - ä¸ - </string> - <string name="GraphicsQualityHigh"> - 高 - </string> - - <!-- PARCEL_CATEGORY_UI_STRING --> - <string name="Linden Location">Linden所在地</string> - <string name="Adult">Adult</string> - <string name="Arts&Culture">アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼</string> - <string name="Business">ビジãƒã‚¹</string> - <string name="Educational">教育的</string> - <string name="Gaming">ゲーム</string> - <string name="Hangout">ãŸã¾ã‚Šå ´</string> - <string name="Newcomer Friendly">æ–°ä½äººã«å¥½æ„çš„</string> - <string name="Parks&Nature">公園ã¨è‡ªç„¶</string> - <string name="Residential">ä½å®…用</string> - <string name="Shopping">ショッピング</string> - <string name="Other">ãã®ä»–</string> - <string name="ringing"> - インワールドボイスãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸... - </string> - <string name="connected"> - 接続ã—ã¾ã—㟠- </string> - <string name="unavailable"> - ã‚ãªãŸã®ç¾åœ¨ã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。 - </string> - <string name="hang_up"> - インワールドボイスãƒãƒ£ãƒƒãƒˆã®é€šè©±ãŒåˆ‡æ–ã•ã‚Œã¾ã—㟠- </string> - <string name="ScriptQuestionCautionChatGranted"> - [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’許å¯ã—ã¾ã—ãŸï¼š [PERMISSIONS] - </string> - <string name="ScriptQuestionCautionChatDenied"> - [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’æ‹’å¦ã—ã¾ã—ãŸï¼š [PERMISSIONS] - </string> - <string name="ScriptTakeMoney"> - リンデンドル(L$)を支払ㆠ- </string> - <string name="ActOnControlInputs"> - 制御入力ã«åŸºã¥ã„ã¦è¡Œå‹• - </string> - <string name="RemapControlInputs"> - 制御入力ã®ãƒªãƒžãƒƒãƒ— - </string> - <string name="AnimateYourAvatar"> - ã‚¢ãƒã‚¿ãƒ¼ã¸ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å‹•ä½œ - </string> - <string name="AttachToYourAvatar"> - ã‚¢ãƒã‚¿ãƒ¼ã«è£…ç€ - </string> - <string name="ReleaseOwnership"> - 所有権を解放ã—å…¬ã®ã‚‚ã®ã¨ã™ã‚‹ - </string> - <string name="LinkAndDelink"> - ä»–ã®ã‚ªãƒ–ジェクトã®ãƒªãƒ³ã‚¯ã¨ãƒªãƒ³ã‚¯è§£é™¤ - </string> - <string name="AddAndRemoveJoints"> - ä»–ã®ã‚ªãƒ–ジェクトã¨ã®ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®è¿½åŠ ã¨å‰Šé™¤ - </string> - <string name="ChangePermissions"> - 権é™ã®å¤‰æ›´ - </string> - <string name="TrackYourCamera"> - カメラ追従 - </string> - <string name="ControlYourCamera"> - カメラã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ« - </string> - <string name="only_user_message"> - ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚ - </string> - <string name="offline_message"> - [FIRST] [LAST]ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ã€‚ - </string> - <string name="invite_message"> - ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç”/接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME]をクリックã—ã¦ãã ã•ã„。 - </string> - <string name="generic_request_error"> - è¦æ±‚ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </string> - <string name="insufficient_perms_error"> - ã‚ãªãŸã«ã¯å……分ãªæ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。 - </string> - <string name="session_does_not_exist_error"> - ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯æ—¢ã«åˆ‡æ–ã•ã‚Œã¦ã„ã¾ã™ã€‚ - </string> - <string name="no_ability_error"> - ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚ã‚Šã¾ã›ã‚“。 - </string> - <string name="no_ability"> - ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚ã‚Šã¾ã›ã‚“。 - </string> - <string name="not_a_mod_error"> - ã‚ãªãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ»ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 - </string> - <string name="muted_error"> - グループモデレータãŒã‚ãªãŸã®ãƒ†ã‚ストãƒãƒ£ãƒƒãƒˆã‚’無効化ã—ã¾ã—㟠- </string> - <string name="add_session_event"> - [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ - </string> - <string name="message_session_event"> - [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ - </string> - <string name="removed_from_group"> - ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚ - </string> - <string name="close_on_no_ability"> - ã“ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’継続ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ - </string> - <string name="AcctTypeResident"> - ä½äºº - </string> - <string name="AcctTypeTrial"> - トライアル - </string> - <string name="AcctTypeCharterMember"> - 特権メンãƒãƒ¼ - </string> - <string name="AcctTypeEmployee"> - Linden Lab従æ¥å“¡ - </string> - <string name="PaymentInfoUsed"> - 支払ã„æƒ…å ±ç™»éŒ²æ¸ˆ - </string> - <string name="PaymentInfoOnFile"> - 支払ã„æƒ…å ±ç™»éŒ²æ¸ˆã¿ - </string> - <string name="NoPaymentInfoOnFile"> - 支払ã„æƒ…å ±æœªç™»éŒ² - </string> - <string name="AgeVerified"> - 年齢確èªæ¸ˆã¿ - </string> - <string name="NotAgeVerified"> - å¹´é½¢æœªç¢ºèª - </string> -</strings> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- This file contains strings that used to be hardcoded in the source. + It is only for those strings which do not belong in a floater. + For example, the strings used in avatar chat bubbles, and strings + that are returned from one component and may appear in many places--> +<strings> + <string name="SECOND_LIFE"> + Second Life + </string> + <string name="APP_NAME"> + Second Life + </string> + <string name="SECOND_LIFE_GRID"> + Second Life Grid + </string> + <string name="SUPPORT_SITE"> + Second Lifeサãƒãƒ¼ãƒˆãƒãƒ¼ã‚¿ãƒ« + </string> + <string name="StartupDetectingHardware"> + ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®æ¤œå‡ºä¸ã§ã™... + </string> + <string name="StartupLoading"> + ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚° + </string> + <string name="Fullbright"> + 明るã•å…¨é–‹ï¼ˆãƒ¬ã‚¬ã‚·ãƒ¼ï¼‰ + </string> + <string name="LoginInProgress"> + ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™ã€‚[APP_NAME]ã®è¡¨ç¤ºãŒãƒ•ãƒªãƒ¼ã‚ºã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。 + </string> + <string name="LoginInProgressNoFrozen"> + ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™... + </string> + <string name="LoginAuthenticating"> + èªè¨¼ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginMaintenance"> + アカウント・メンテナンスを実行ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginAttempt"> + å‰å›žã®ãƒã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ä¸ã§ã™([NUMBER]回目) + </string> + <string name="LoginPrecaching"> + ワールドをãƒãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginInitializingBrowser"> + 埋ã‚è¾¼ã¿WebブラウザをåˆæœŸåŒ–ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginInitializingMultimedia"> + マルãƒãƒ¡ãƒ‡ã‚£ã‚¢ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginVerifyingCache"> + ã‚ャッシュ・ファイルを検証ã—ã¦ã„ã¾ã™(所è¦æ™‚é–“ã¯60~90秒)... + </string> + <string name="LoginProcessingResponse"> + å¿œç”を処ç†ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginInitializingWorld"> + ワールドをåˆæœŸåŒ–ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginDecodingImages"> + ç”»åƒã‚’デコードã—ã¦ã„ã¾ã™... + </string> + <string name="LoginInitializingQuicktime"> + QuickTimeã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™... + </string> + <string name="LoginQuicktimeNotFound"> + QuickTimeãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + </string> + <string name="LoginQuicktimeOK"> + QuickTimeãŒæ£å¸¸ã«åˆæœŸåŒ–ã•ã‚Œã¾ã—ãŸã€‚ + </string> + <string name="LoginWaitingForRegionHandshake"> + 地域ã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å¾…ã£ã¦ã„ã¾ã™... + </string> + <string name="LoginConnectingToRegion"> + 地域ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™... + </string> + <string name="LoginDownloadingClothing"> + æœã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™... + </string> + <string name="AgentLostConnection"> + ã“ã®åœ°åŸŸã«ã¯ã€å•é¡ŒãŒç™ºç”Ÿã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã¦ãã ã•ã„。 + </string> + <string name="TooltipPerson"> + 人 + </string> + <string name="TooltipNoName"> + (åå‰ãªã—) + </string> + <string name="TooltipOwner"> + オーナー: + </string> + <string name="TooltipPublic"> + 公共 + </string> + <string name="TooltipIsGroup"> + (グループ) + </string> + <string name="TooltipForSaleL$"> + 売り出ã—ä¸:L$[AMOUNT] + </string> + <string name="TooltipFlagGroupBuild"> + ã‚°ãƒ«ãƒ¼ãƒ—ä½œæˆ + </string> + <string name="TooltipFlagNoBuild"> + 作æˆç¦æ¢ + </string> + <string name="TooltipFlagNoEdit"> + ã‚°ãƒ«ãƒ¼ãƒ—ä½œæˆ + </string> + <string name="TooltipFlagNotSafe"> + å±é™º + </string> + <string name="TooltipFlagNoFly"> + 飛行ç¦æ¢ + </string> + <string name="TooltipFlagGroupScripts"> + グループ・スクリプト + </string> + <string name="TooltipFlagNoScripts"> + スクリプトãªã— + </string> + <string name="TooltipLand"> + 土地: + </string> + <string name="TooltipMustSingleDrop"> + 1ã¤ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã¿ã‚’ã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã§ãã¾ã™ + </string> + <string name="TooltipHttpUrl"> + クリックã—ã¦ã“ã®Webページを見る + </string> + <string name="TooltipSLURL"> + クリックã—ã¦ã“ã®å ´æ‰€ã®æƒ…å ±ã‚’è¦‹ã‚‹ + </string> + <string name="TooltipAgentUrl"> + クリックã—ã¦ã“ã®ä½äººã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«ã‚’見る + </string> + <string name="TooltipGroupUrl"> + クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見る + </string> + <string name="TooltipEventUrl"> + クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見る + </string> + <string name="TooltipClassifiedUrl"> + クリックã—ã¦ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã‚’見る + </string> + <string name="TooltipParcelUrl"> + クリックã—ã¦ã“ã®åŒºç”»ã®èª¬æ˜Žæ–‡ã‚’見る + </string> + <string name="TooltipTeleportUrl"> + クリックã—ã¦ã“ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ + </string> + <string name="TooltipObjectIMUrl"> + クリックã—ã¦ã“ã®ã‚ªãƒ–ジェクトã®èª¬æ˜Žæ–‡ã‚’見る + </string> + <string name="TooltipSLAPP"> + クリックã—㦠secondlife:// コマンドを出㙠+ </string> + <string name="BUTTON_CLOSE_DARWIN"> + é–‰ã˜ã‚‹ (⌘-W) + </string> + <string name="BUTTON_CLOSE_WIN"> + é–‰ã˜ã‚‹ (Ctrl+W) + </string> + <string name="BUTTON_RESTORE"> + 復元 + </string> + <string name="BUTTON_MINIMIZE"> + å…ƒã«æˆ»ã™ï¼ˆç¸®å°ï¼‰ + </string> + <string name="BUTTON_TEAR_OFF"> + 別ウィンドウã§é–‹ã + </string> + <string name="BUTTON_DOCK"> + ドッã‚ング + </string> + <string name="BUTTON_UNDOCK"> + 切り離㙠+ </string> + <string name="BUTTON_HELP"> + ヘルプを表示 + </string> + <string name="RetrievingData"> + 検索ä¸... + </string> + <string name="ReleaseNotes"> + リリースノート + </string> + <string name="LoadingData"> + ãƒãƒ¼ãƒ‰ä¸... + </string> + <string name="AvatarNameNobody"> + (無人) + </string> + <string name="AvatarNameWaiting"> + (å¾…æ©Ÿä¸) + </string> + <string name="AvatarNameHippos"> + (ã‚«ãƒ) + </string> + <string name="GroupNameNone"> + (ãªã—) + </string> + <string name="AssetErrorNone"> + エラーãªã— + </string> + <string name="AssetErrorRequestFailed"> + 資産ã®è¦æ±‚: 失敗 + </string> + <string name="AssetErrorNonexistentFile"> + 資産ã®è¦æ±‚: å˜åœ¨ã—ãªã„ファイル + </string> + <string name="AssetErrorNotInDatabase"> + 資産ã®è¦æ±‚: データベースã§ã¯è¦‹ã¤ã‹ã‚‰ãªã„資産 + </string> + <string name="AssetErrorEOF"> + ファイルã®çµ‚ã‚ã‚Š + </string> + <string name="AssetErrorCannotOpenFile"> + ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“ + </string> + <string name="AssetErrorFileNotFound"> + ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ + </string> + <string name="AssetErrorTCPTimeout"> + ファイル転é€ã‚¿ã‚¤ãƒ アウトã§ã™ + </string> + <string name="AssetErrorCircuitGone"> + 接続ãŒè§£é™¤ã•ã‚Œã¾ã—㟠+ </string> + <string name="AssetErrorPriceMismatch"> + ビューワã¨ã‚µãƒ¼ãƒãƒ¼ã®ä¾¡æ ¼ãŒä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“ + </string> + <string name="AssetErrorUnknownStatus"> + ステータスãŒä¸æ˜Žã§ã™ + </string> + <string name="texture"> + テクスãƒãƒ£ + </string> + <string name="sound"> + サウンド + </string> + <string name="calling card"> + コーリングカード + </string> + <string name="landmark"> + ランドマーク + </string> + <string name="legacy script"> + レガシースクリプト + </string> + <string name="clothing"> + 衣類 + </string> + <string name="object"> + オブジェクト + </string> + <string name="note card"> + ノートカード + </string> + <string name="folder"> + フォルダ + </string> + <string name="root"> + ルート + </string> + <string name="lsl2 script"> + lsl2 スクリプト + </string> + <string name="lsl bytecode"> + LSL ãƒã‚¤ãƒˆã‚³ãƒ¼ãƒ‰ + </string> + <string name="tga texture"> + tga テクスãƒãƒ£ + </string> + <string name="body part"> + èº«ä½“éƒ¨ä½ + </string> + <string name="snapshot"> + スナップショット + </string> + <string name="lost and found"> + 紛失物 + </string> + <string name="targa image"> + targa ç”»åƒ + </string> + <string name="trash"> + ゴミ箱 + </string> + <string name="jpeg image"> + jpeg ç”»åƒ + </string> + <string name="animation"> + アニメーション + </string> + <string name="gesture"> + ジェスãƒãƒ£ãƒ¼ + </string> + <string name="simstate"> + 統計 + </string> + <string name="favorite"> + ãŠæ°—ã«å…¥ã‚Š + </string> + <string name="symbolic link"> + リンク + </string> + <string name="AvatarAway"> + 退å¸ä¸ + </string> + <string name="AvatarBusy"> + å–ã‚Šè¾¼ã¿ä¸ + </string> + <string name="AvatarMuted"> + ミュート + </string> + <string name="anim_express_afraid"> + 怖れ + </string> + <string name="anim_express_anger"> + 怒り + </string> + <string name="anim_away"> + 退å¸ä¸ + </string> + <string name="anim_backflip"> + 後ã‚宙返り + </string> + <string name="anim_express_laugh"> + 大笑ㄠ+ </string> + <string name="anim_express_toothsmile"> + 満é¢ã®ç¬‘é¡” + </string> + <string name="anim_blowkiss"> + 投ã’ã‚ッス + </string> + <string name="anim_express_bored"> + 退屈 + </string> + <string name="anim_bow"> + ãŠã˜ãŽ + </string> + <string name="anim_clap"> + æ‹æ‰‹ + </string> + <string name="anim_courtbow"> + æ·±ã„ãŠã˜ãŽ + </string> + <string name="anim_express_cry"> + æ³£ã + </string> + <string name="anim_dance1"> + ダンス1 + </string> + <string name="anim_dance2"> + ダンス2 + </string> + <string name="anim_dance3"> + ダンス3 + </string> + <string name="anim_dance4"> + ダンス4 + </string> + <string name="anim_dance5"> + ダンス5 + </string> + <string name="anim_dance6"> + ダンス6 + </string> + <string name="anim_dance7"> + ダンス7 + </string> + <string name="anim_dance8"> + ダンス8 + </string> + <string name="anim_express_disdain"> + 侮蔑 + </string> + <string name="anim_drink"> + é…”ã£ã±ã‚‰ã† + </string> + <string name="anim_express_embarrased"> + 困惑 + </string> + <string name="anim_angry_fingerwag"> + 指を振る + </string> + <string name="anim_fist_pump"> + ガッツãƒãƒ¼ã‚º + </string> + <string name="anim_yoga_float"> + ãƒ¨ã‚¬æµ®éŠ + </string> + <string name="anim_express_frown"> + ã—ã‹ã‚ã£é¢ + </string> + <string name="anim_impatient"> + ã„らã„らã™ã‚‹ + </string> + <string name="anim_jumpforjoy"> + 飛ã³ä¸ŠãŒã£ã¦å–œã¶ + </string> + <string name="anim_kissmybutt"> + 挑発ãƒãƒ¼ã‚º + </string> + <string name="anim_express_kiss"> + ã‚ス + </string> + <string name="anim_laugh_short"> + 笑ㆠ+ </string> + <string name="anim_musclebeach"> + 力ã“ã¶ã‚’見ã›ã‚‹ + </string> + <string name="anim_no_unhappy"> + ä¸æº€ã’ã«å¦å®šã™ã‚‹ + </string> + <string name="anim_no_head"> + å¦å®šã™ã‚‹ + </string> + <string name="anim_nyanya"> + 冷やã‹ã™ + </string> + <string name="anim_punch_onetwo"> + ワンツー・パンム+ </string> + <string name="anim_express_open_mouth"> + å£ã‚’é–‹ã‘ã¦é©šã + </string> + <string name="anim_peace"> + ピース・サイン + </string> + <string name="anim_point_you"> + 他人を指差㙠+ </string> + <string name="anim_point_me"> + 自分を指差㙠+ </string> + <string name="anim_punch_l"> + 左パンム+ </string> + <string name="anim_punch_r"> + å³ãƒ‘ンム+ </string> + <string name="anim_rps_countdown"> + ã˜ã‚ƒã‚“ã‘ã‚“ãƒãƒ¼ã‚º + </string> + <string name="anim_rps_paper"> + パー + </string> + <string name="anim_rps_rock"> + グー + </string> + <string name="anim_rps_scissors"> + ãƒãƒ§ã‚ + </string> + <string name="anim_express_repulsed"> + 嫌悪感 + </string> + <string name="anim_kick_roundhouse_r"> + ã¾ã‚ã—è¹´ã‚Š + </string> + <string name="anim_express_sad"> + 悲ã—ã‚€ + </string> + <string name="anim_salute"> + 敬礼ã™ã‚‹ + </string> + <string name="anim_shout"> + å«ã¶ + </string> + <string name="anim_express_shrug"> + è‚©ã‚’ã™ãã‚ã‚‹ + </string> + <string name="anim_express_smile"> + 微笑む + </string> + <string name="anim_smoke_idle"> + ãŸã°ã“ã‚’ãゆら㙠+ </string> + <string name="anim_smoke_inhale"> + ãŸã°ã“ã‚’å¸ã† + </string> + <string name="anim_smoke_throw_down"> + ãŸã°ã“ã‚’æ¨ã¦ã‚‹ + </string> + <string name="anim_express_surprise"> + é©šã + </string> + <string name="anim_sword_strike_r"> + 剣ã§æ–¬ã‚Šã¤ã‘ã‚‹ + </string> + <string name="anim_angry_tantrum"> + ã˜ã ã‚“ã ã‚’è¸ã‚€ + </string> + <string name="anim_express_tongue_out"> + 舌を出㙠+ </string> + <string name="anim_hello"> + 手を振る + </string> + <string name="anim_whisper"> + å°å£°ã§è©±ã™ + </string> + <string name="anim_whistle"> + å£ç¬›ã‚’å¹ã + </string> + <string name="anim_express_wink"> + ウィンク + </string> + <string name="anim_wink_hollywood"> + ウィンク(ãƒãƒªã‚¦ãƒƒãƒ‰) + </string> + <string name="anim_express_worry"> + 心é…ã™ã‚‹ + </string> + <string name="anim_yes_happy"> + 笑顔ã§é ·ã + </string> + <string name="anim_yes_head"> + é ·ã + </string> + <string name="texture_loading"> + ãƒãƒ¼ãƒ‰ä¸... + </string> + <string name="worldmap_offline"> + オフライン + </string> + <string name="Ok"> + OK + </string> + <string name="Premature end of file"> + ä¸å®Œå…¨ãªãƒ•ã‚¡ã‚¤ãƒ« + </string> + <string name="ST_NO_JOINT"> + ROOT ã¾ãŸã¯ JOINT ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ + </string> + <string name="whisper"> + ã®ã•ã•ã‚„ã: + </string> + <string name="shout"> + ã®å«ã³: + </string> + <string name="ringing"> + インワールドボイスãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸... + </string> + <string name="connected"> + 接続ã—ã¾ã—㟠+ </string> + <string name="unavailable"> + ã‚ãªãŸã®ç¾åœ¨ã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。 + </string> + <string name="hang_up"> + インワールドボイスãƒãƒ£ãƒƒãƒˆã®é€šè©±ãŒåˆ‡æ–ã•ã‚Œã¾ã—㟠+ </string> + <string name="ScriptQuestionCautionChatGranted"> + [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’許å¯ã—ã¾ã—ãŸï¼š [PERMISSIONS] + </string> + <string name="ScriptQuestionCautionChatDenied"> + [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’æ‹’å¦ã—ã¾ã—ãŸï¼š [PERMISSIONS] + </string> + <string name="ScriptTakeMoney"> + リンデンドル(L$)を支払ㆠ+ </string> + <string name="ActOnControlInputs"> + 制御入力ã«åŸºã¥ã„ã¦è¡Œå‹• + </string> + <string name="RemapControlInputs"> + 制御入力ã®ãƒªãƒžãƒƒãƒ— + </string> + <string name="AnimateYourAvatar"> + ã‚¢ãƒã‚¿ãƒ¼ã¸ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å‹•ä½œ + </string> + <string name="AttachToYourAvatar"> + ã‚¢ãƒã‚¿ãƒ¼ã«è£…ç€ + </string> + <string name="ReleaseOwnership"> + 所有権を解放ã—å…¬ã®ã‚‚ã®ã¨ã™ã‚‹ + </string> + <string name="LinkAndDelink"> + ä»–ã®ã‚ªãƒ–ジェクトã®ãƒªãƒ³ã‚¯ã¨ãƒªãƒ³ã‚¯è§£é™¤ + </string> + <string name="AddAndRemoveJoints"> + ä»–ã®ã‚ªãƒ–ジェクトã¨ã®ã‚¸ãƒ§ã‚¤ãƒ³ãƒˆã®è¿½åŠ ã¨å‰Šé™¤ + </string> + <string name="ChangePermissions"> + 権é™ã®å¤‰æ›´ + </string> + <string name="TrackYourCamera"> + カメラ追従 + </string> + <string name="ControlYourCamera"> + カメラã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ« + </string> + <string name="SIM_ACCESS_PG"> + PG + </string> + <string name="SIM_ACCESS_MATURE"> + Mature + </string> + <string name="SIM_ACCESS_ADULT"> + Adult + </string> + <string name="SIM_ACCESS_DOWN"> + オフライン + </string> + <string name="SIM_ACCESS_MIN"> + ä¸æ˜Ž + </string> + <string name="land_type_unknown"> + (ä¸æ˜Žï¼‰ + </string> + <string name="all_files"> + å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ« + </string> + <string name="sound_files"> + サウンド + </string> + <string name="animation_files"> + アニメーション + </string> + <string name="image_files"> + ç”»åƒ + </string> + <string name="save_file_verb"> + ä¿å˜ + </string> + <string name="load_file_verb"> + ãƒãƒ¼ãƒ‰ + </string> + <string name="targa_image_files"> + Targaç”»åƒ + </string> + <string name="bitmap_image_files"> + ãƒ“ãƒƒãƒˆãƒžãƒƒãƒ—ç”»åƒ + </string> + <string name="avi_movie_file"> + AVIムービーファイル + </string> + <string name="xaf_animation_file"> + XAFアニメーションファイル + </string> + <string name="xml_file"> + XMLファイル + </string> + <string name="dot_raw_file"> + RAWファイル + </string> + <string name="compressed_image_files"> + åœ§ç¸®ç”»åƒ + </string> + <string name="load_files"> + ファイルã®ãƒãƒ¼ãƒ‰ + </string> + <string name="choose_the_directory"> + å‚ç…§ + </string> + <string name="AvatarSetNotAway"> + 一時退å¸ä¸ã‚’解除 + </string> + <string name="AvatarSetAway"> + 一時退å¸ä¸ + </string> + <string name="AvatarSetNotBusy"> + å–ã‚Šè¾¼ã¿ä¸ã‚’解除 + </string> + <string name="AvatarSetBusy"> + å–ã‚Šè¾¼ã¿ä¸ + </string> + <string name="shape"> + シェイプ + </string> + <string name="skin"> + スã‚ン + </string> + <string name="hair"> + 髪型 + </string> + <string name="eyes"> + ç›® + </string> + <string name="shirt"> + シャツ + </string> + <string name="pants"> + ズボン + </string> + <string name="shoes"> + é´ + </string> + <string name="socks"> + é´ä¸‹ + </string> + <string name="jacket"> + ä¸Šç€ + </string> + <string name="gloves"> + 手袋 + </string> + <string name="undershirt"> + 下ç€ã‚·ãƒ£ãƒ„ + </string> + <string name="underpants"> + 下ç€ãƒ‘ンツ + </string> + <string name="skirt"> + スカート + </string> + <string name="invalid"> + 無効 + </string> + <string name="BodyPartsRightArm"> + å³è…• + </string> + <string name="BodyPartsHead"> + é + </string> + <string name="BodyPartsLeftArm"> + 左腕 + </string> + <string name="BodyPartsLeftLeg"> + 左脚 + </string> + <string name="BodyPartsTorso"> + é + </string> + <string name="BodyPartsRightLeg"> + å³è„š + </string> + <string name="GraphicsQualityLow"> + 低 + </string> + <string name="GraphicsQualityMid"> + ä¸ + </string> + <string name="GraphicsQualityHigh"> + 高 + </string> + <string name="LeaveMouselook"> + ESC ã‚ーを押ã—ã¦ãƒ¯ãƒ¼ãƒ«ãƒ‰ãƒ“ューã«æˆ»ã‚‹ + </string> + <string name="InventoryNoMatchingItems"> + 一致ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ãŒæŒã¡ç‰©ã«ã‚ã‚Šã¾ã›ã‚“ã§ã—㟠+ </string> + <string name="InventoryNoTexture"> + æŒã¡ç‰©å†…ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚ã‚Šã¾ã›ã‚“ + </string> + <string name="LoadingContents"> + コンテンツをãƒãƒ¼ãƒ‰ä¸ã§ã™... + </string> + <string name="NoContents"> + コンテンツãªã— + </string> + <string name="InvFolder My Inventory"> + ç§ã®æŒã¡ç‰© + </string> + <string name="InvFolder My Favorites"> + ãŠæ°—ã«å…¥ã‚Š + </string> + <string name="InvFolder Library"> + ライブラリ + </string> + <string name="InvFolder Textures"> + テクスãƒãƒ£ + </string> + <string name="InvFolder Sounds"> + サウンド + </string> + <string name="InvFolder Calling Cards"> + コーリングカード + </string> + <string name="InvFolder Landmarks"> + ランドマーク + </string> + <string name="InvFolder Scripts"> + スクリプト + </string> + <string name="InvFolder Clothing"> + 衣類 + </string> + <string name="InvFolder Objects"> + オブジェクト + </string> + <string name="InvFolder Notecards"> + ノートカード + </string> + <string name="InvFolder New Folder"> + æ–°è¦ãƒ•ã‚©ãƒ«ãƒ€ + </string> + <string name="InvFolder Inventory"> + æŒã¡ç‰© + </string> + <string name="InvFolder Uncompressed Images"> + 圧縮ã•ã‚Œã¦ã„ãªã„ç”»åƒ + </string> + <string name="InvFolder Body Parts"> + èº«ä½“éƒ¨ä½ + </string> + <string name="InvFolder Trash"> + ゴミ箱 + </string> + <string name="InvFolder Photo Album"> + フォトアルãƒãƒ + </string> + <string name="InvFolder Lost And Found"> + 紛失物 + </string> + <string name="InvFolder Uncompressed Sounds"> + 圧縮ã•ã‚Œã¦ã„ãªã„サウンド + </string> + <string name="InvFolder Animations"> + アニメーション + </string> + <string name="InvFolder Gestures"> + ジェスãƒãƒ£ãƒ¼ + </string> + <string name="InvFolder favorite"> + ãŠæ°—ã«å…¥ã‚Š + </string> + <string name="InvFolder Current Outfit"> + ç€ç”¨ä¸ã®ã‚¢ã‚¦ãƒˆãƒ•ã‚£ãƒƒãƒˆ + </string> + <string name="InvFolder My Outfits"> + ç§ã®ã‚¢ã‚¦ãƒˆãƒ•ã‚£ãƒƒãƒˆ + </string> + <string name="InvFolder Friends"> + フレンド + </string> + <string name="InvFolder All"> + 全員 + </string> + <string name="Buy"> + 買ㆠ+ </string> + <string name="BuyforL$"> + Buy for L$ + </string> + <string name="Stone"> + 石 + </string> + <string name="Metal"> + 金属 + </string> + <string name="Glass"> + ガラス + </string> + <string name="Wood"> + 木 + </string> + <string name="Flesh"> + è‚Œ + </string> + <string name="Plastic"> + プラスãƒãƒƒã‚¯ + </string> + <string name="Rubber"> + ゴム+ </string> + <string name="Light"> + ライト + </string> + <string name="KBShift"> + Shift + </string> + <string name="KBCtrl"> + Ctrl + </string> + <string name="Chest"> + 胸部 + </string> + <string name="Skull"> + é è“‹ + </string> + <string name="Left Shoulder"> + 左肩 + </string> + <string name="Right Shoulder"> + å³è‚© + </string> + <string name="Left Hand"> + 左手 + </string> + <string name="Right Hand"> + å³æ‰‹ + </string> + <string name="Left Foot"> + 左足 + </string> + <string name="Right Foot"> + å³è¶³ + </string> + <string name="Spine"> + 背骨 + </string> + <string name="Pelvis"> + 骨盤 + </string> + <string name="Mouth"> + å£ + </string> + <string name="Chin"> + ã‚ã” + </string> + <string name="Left Ear"> + 左耳 + </string> + <string name="Right Ear"> + å³è€³ + </string> + <string name="Left Eyeball"> + å·¦ç›®çœ¼çƒ + </string> + <string name="Right Eyeball"> + å³ç›®çœ¼çƒ + </string> + <string name="Nose"> + é¼» + </string> + <string name="R Upper Arm"> + å³ä¸Šè…• + </string> + <string name="R Forearm"> + å³å‰è…• + </string> + <string name="L Upper Arm"> + 左上腕 + </string> + <string name="L Forearm"> + å·¦å‰è…• + </string> + <string name="Right Hip"> + å³è…° + </string> + <string name="R Upper Leg"> + å³ä¸Šè„š + </string> + <string name="R Lower Leg"> + å³ä¸‹è„š + </string> + <string name="Left Hip"> + 左腰 + </string> + <string name="L Upper Leg"> + 左上脚 + </string> + <string name="L Lower Leg"> + 左下脚 + </string> + <string name="Stomach"> + è…¹ + </string> + <string name="Left Pec"> + å·¦èƒ¸ç‹ + </string> + <string name="Right Pec"> + å³èƒ¸ç‹ + </string> + <string name="YearsMonthsOld"> + [AGEYEARS] [AGEMONTHS] + </string> + <string name="YearsOld"> + [AGEYEARS] + </string> + <string name="MonthsOld"> + [AGEMONTHS] + </string> + <string name="WeeksOld"> + [AGEWEEKS] + </string> + <string name="DaysOld"> + [AGEDAYS] + </string> + <string name="TodayOld"> + 今日å‚åŠ + </string> + <string name="AgeYearsA"> + [COUNT] å¹´ + </string> + <string name="AgeYearsB"> + [COUNT] å¹´ + </string> + <string name="AgeYearsC"> + [COUNT] å¹´ + </string> + <string name="AgeMonthsA"> + [COUNT] ヶ月 + </string> + <string name="AgeMonthsB"> + [COUNT] ヶ月 + </string> + <string name="AgeMonthsC"> + [COUNT] ヶ月 + </string> + <string name="AgeWeeksA"> + [COUNT] 週間 + </string> + <string name="AgeWeeksB"> + [COUNT] 週間 + </string> + <string name="AgeWeeksC"> + [COUNT] 週間 + </string> + <string name="AgeDaysA"> + [COUNT] 日間 + </string> + <string name="AgeDaysB"> + [COUNT] 日間 + </string> + <string name="AgeDaysC"> + [COUNT] 日間 + </string> + <string name="AcctTypeResident"> + ä½äºº + </string> + <string name="AcctTypeTrial"> + トライアル + </string> + <string name="AcctTypeCharterMember"> + 特権メンãƒãƒ¼ + </string> + <string name="AcctTypeEmployee"> + Linden Lab従æ¥å“¡ + </string> + <string name="PaymentInfoUsed"> + 支払ã„æƒ…å ±ç™»éŒ²æ¸ˆ + </string> + <string name="PaymentInfoOnFile"> + 支払ã„æƒ…å ±ç™»éŒ²æ¸ˆã¿ + </string> + <string name="NoPaymentInfoOnFile"> + 支払ã„æƒ…å ±æœªç™»éŒ² + </string> + <string name="AgeVerified"> + 年齢確èªæ¸ˆã¿ + </string> + <string name="NotAgeVerified"> + å¹´é½¢æœªç¢ºèª + </string> + <string name="Center 2"> + ä¸å¿ƒ 2 + </string> + <string name="Top Right"> + å³ä¸Š + </string> + <string name="Top"> + 上部 + </string> + <string name="Top Left"> + 左上 + </string> + <string name="Center"> + ä¸å¿ƒ + </string> + <string name="Bottom Left"> + Bottom Left + </string> + <string name="Bottom"> + Bottom + </string> + <string name="Bottom Right"> + Bottom Right + </string> + <string name="CompileQueueDownloadedCompiling"> + ダウンãƒãƒ¼ãƒ‰å®Œäº†ã€ã‚³ãƒ³ãƒ‘ã‚¤ãƒ«ä¸ + </string> + <string name="CompileQueueScriptNotFound"> + サーãƒãƒ¼ä¸Šã«ã‚¹ã‚¯ãƒªãƒ—トãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + </string> + <string name="CompileQueueProblemDownloading"> + ダウンãƒãƒ¼ãƒ‰ã«å•é¡ŒãŒã‚ã‚Šã¾ã™ + </string> + <string name="CompileQueueInsufficientPermDownload"> + 権é™ä¸è¶³ã®ãŸã‚スクリプトをダウンãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。 + </string> + <string name="CompileQueueInsufficientPermFor"> + 権é™ä¸è¶³ï¼š + </string> + <string name="CompileQueueUnknownFailure"> + åŽŸå› ä¸æ˜Žã®å¤±æ•—ã«ã‚ˆã‚Šãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“ + </string> + <string name="CompileQueueTitle"> + リコンパイル進行 + </string> + <string name="CompileQueueStart"> + リコンパイル + </string> + <string name="ResetQueueTitle"> + 進行をリセット + </string> + <string name="ResetQueueStart"> + リセット + </string> + <string name="RunQueueTitle"> + 実行を続ã‘るよã†è¨å®š + </string> + <string name="RunQueueStart"> + 実行ä¸ã«è¨å®š + </string> + <string name="NotRunQueueTitle"> + 実行をåœæ¢ã™ã‚‹ã‚ˆã†è¨å®š + </string> + <string name="NotRunQueueStart"> + 実行åœæ¢ã«è¨å®š + </string> + <string name="CompileSuccessful"> + コンパイルãŒå®Œäº†ã—ã¾ã—ãŸï¼ + </string> + <string name="CompileSuccessfulSaving"> + コンパイル完了ã€ä¿å˜ä¸ã§ã™... + </string> + <string name="SaveComplete"> + ä¿å˜å®Œäº†ã€‚ + </string> + <string name="ObjectOutOfRange"> + スクリプト(オブジェクトãŒç¯„囲外ã«ã‚ã‚Šã¾ã™ï¼‰ + </string> + <string name="GodToolsObjectOwnedBy"> + [OWNER] 所有ã®ã‚ªãƒ–ジェクト「[OBJECT]〠+ </string> + <string name="GroupsNone"> + ãªã— + </string> + <string name="Unknown"> + (ä¸æ˜Žï¼‰ + </string> + <string name="Balance"> + 残高 + </string> + <string name="Credits"> + åŽå…¥ + </string> + <string name="Debits"> + 支出 + </string> + <string name="Total"> + åˆè¨ˆ + </string> + <string name="NoGroupDataFound"> + グループã®ãƒ‡ãƒ¼ã‚¿ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠+ </string> + <string name="IMParentEstate"> + parent estate + </string> + <string name="IMMainland"> + メインランド + </string> + <string name="IMTeen"> + ティーン + </string> + <string name="RegionInfoError"> + エラー + </string> + <string name="RegionInfoAllEstatesOwnedBy"> + [OWNER] ãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•ç”£ + </string> + <string name="RegionInfoAllEstatesYouOwn"> + ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•ç”£ + </string> + <string name="RegionInfoAllEstatesYouManage"> + ã‚ãªãŸãŒ [OWNER] ã®ãŸã‚ã«ç®¡ç†ã™ã‚‹ã™ã¹ã¦ã®ä¸å‹•ç”£ + </string> + <string name="RegionInfoAllowedResidents"> + 許å¯ã•ã‚ŒãŸä½äººï¼š ([ALLOWEDAGENTS] 人ã€æœ€å¤§ [MAXACCESS] 人) + </string> + <string name="RegionInfoAllowedGroups"> + 許å¯ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—: ([ALLOWEDGROUPS]ã€æœ€å¤§ [MAXACCESS] グループ) + </string> + <string name="CursorPos"> + [LINE] 行目ã€[COLUMN] 列目 + </string> + <string name="PanelDirCountFound"> + [COUNT] 件見ã¤ã‹ã‚Šã¾ã—㟠+ </string> + <string name="PanelContentsNewScript"> + æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト + </string> + <string name="MuteByName"> + (å称別) + </string> + <string name="MuteAgent"> + (ä½äººï¼‰ + </string> + <string name="MuteObject"> + (オブジェクト) + </string> + <string name="MuteGroup"> + (グループ) + </string> + <string name="RegionNoCovenant"> + ã“ã®ä¸å‹•ç”£ã«ã¯ç´„款ãŒã‚ã‚Šã¾ã›ã‚“。 + </string> + <string name="RegionNoCovenantOtherOwner"> + ã“ã®ä¸å‹•ç”£ã«ã¯ç´„款ãŒã‚ã‚Šã¾ã›ã‚“。 ã“ã®ä¸å‹•ç”£ä¸Šã®åœŸåœ°ã¯ä¸å‹•ç”£æ‰€æœ‰è€…ã«ã‚ˆã‚Šè²©å£²ã•ã‚Œã€Linden Lab ã§ã¯è²©å£²ã—ã¦ã„ã¾ã›ã‚“。 販売ã«é–¢ã™ã‚‹ãŠå•ã„åˆã‚ã›ã¯ã€ä¸å‹•ç”£æ‰€æœ‰è€…ã¾ã§ãŠé¡˜ã„致ã—ã¾ã™ã€‚ + </string> + <string name="covenant_last_modified"> + 最終修æ£æ—¥ï¼š + </string> + <string name="GroupOwned"> + グループ所有 + </string> + <string name="Public"> + パブリック + </string> + <string name="ClassifiedClicksTxt"> + クリック数: [TELEPORT] テレãƒãƒ¼ãƒˆã€ [MAP] 地図〠[PROFILE] プãƒãƒ•ã‚£ãƒ¼ãƒ« + </string> + <string name="ClassifiedUpdateAfterPublish"> + (掲載後更新) + </string> + <string name="GroupVoteYes"> + ã¯ã„ + </string> + <string name="GroupVoteNo"> + ã„ã„㈠+ </string> + <string name="GroupVoteNoActiveProposals"> + 継続ä¸ã®æ案ã¯ç¾åœ¨ã‚ã‚Šã¾ã›ã‚“ + </string> + <string name="GroupVoteNoArchivedProposals"> + æ案ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã¯ç¾åœ¨ã‚ã‚Šã¾ã›ã‚“ + </string> + <string name="GroupVoteRetrievingArchivedProposals"> + æ案ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã‚’å–å¾—ä¸ã§ã™ + </string> + <string name="GroupVoteRetrievingActiveProposals"> + 継続ä¸ã®æ案をå–å¾—ä¸ã§ã™ + </string> + <string name="MultiPreviewTitle"> + プレビュー + </string> + <string name="MultiPropertiesTitle"> + Properties + </string> + <string name="InvOfferAnObjectNamed"> + オブジェクトå + </string> + <string name="InvOfferOwnedByGroup"> + 所有グループ + </string> + <string name="InvOfferOwnedByUnknownGroup"> + ä¸æ˜Žãªã‚°ãƒ«ãƒ¼ãƒ—所有 + </string> + <string name="InvOfferOwnedBy"> + 所有者 + </string> + <string name="InvOfferOwnedByUnknownUser"> + ä¸æ˜Žãªãƒ¦ãƒ¼ã‚¶ãƒ¼æ‰€æœ‰ + </string> + <string name="InvOfferGaveYou"> + gave you + </string> + <string name="InvOfferYouDecline"> + You decline + </string> + <string name="InvOfferFrom"> + from + </string> + <string name="GroupMoneyTotal"> + åˆè¨ˆ + </string> + <string name="GroupMoneyBought"> + bought + </string> + <string name="GroupMoneyPaidYou"> + paid you + </string> + <string name="GroupMoneyPaidInto"> + paid into + </string> + <string name="GroupMoneyBoughtPassTo"> + bought pass to + </string> + <string name="GroupMoneyPaidFeeForEvent"> + paid fee for event + </string> + <string name="GroupMoneyPaidPrizeForEvent"> + paid prize for event + </string> + <string name="GroupMoneyBalance"> + 残高 + </string> + <string name="GroupMoneyCredits"> + åŽå…¥ + </string> + <string name="GroupMoneyDebits"> + 支出 + </string> + <string name="ViewerObjectContents"> + ä¸èº« + </string> + <string name="AcquiredItems"> + å–得アイテム+ </string> + <string name="Cancel"> + ã‚ャンセル + </string> + <string name="UploadingCosts"> + %s ã®ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ä»£é‡‘: + </string> + <string name="UnknownFileExtension"> + ä¸æ˜Žã®æ‹¡å¼µå: %s +使用å¯èƒ½ãªæ‹¡å¼µå: .wav, .tga, .bmp, .jpg, .jpeg, or .bvh + </string> + <string name="AddLandmarkNavBarMenu"> + ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’è¿½åŠ ... + </string> + <string name="EditLandmarkNavBarMenu"> + ランドマークを編集... + </string> + <string name="accel-mac-control"> + ⌃ + </string> + <string name="accel-mac-command"> + ⌘ + </string> + <string name="accel-mac-option"> + ⌥ + </string> + <string name="accel-mac-shift"> + ⇧ + </string> + <string name="accel-win-control"> + Ctrl+ + </string> + <string name="accel-win-alt"> + Alt+ + </string> + <string name="accel-win-shift"> + Shift+ + </string> + <string name="FileSaved"> + ファイルãŒä¿å˜ã•ã‚Œã¾ã—㟠+ </string> + <string name="Receiving"> + å–å¾—ä¸ + </string> + <string name="AM"> + AM + </string> + <string name="PM"> + PM + </string> + <string name="PST"> + 米国西部標準時 + </string> + <string name="PDT"> + 米国西部å¤æ™‚é–“ + </string> + <string name="Forward"> + å‰ + </string> + <string name="Left"> + å·¦ + </string> + <string name="Right"> + å³ + </string> + <string name="Back"> + 後゠+ </string> + <string name="North"> + 北 + </string> + <string name="South"> + å— + </string> + <string name="West"> + 西 + </string> + <string name="East"> + æ± + </string> + <string name="Up"> + 上 + </string> + <string name="Down"> + 下 + </string> + <string name="Any Category"> + 全カテゴリ + </string> + <string name="Shopping"> + ショッピング + </string> + <string name="Land Rental"> + 土地ã®ãƒ¬ãƒ³ã‚¿ãƒ« + </string> + <string name="Property Rental"> + 建物ã®ãƒ¬ãƒ³ã‚¿ãƒ« + </string> + <string name="Special Attraction"> + 特別アトラクション + </string> + <string name="New Products"> + æ–°è£½å“ + </string> + <string name="Employment"> + 雇用 + </string> + <string name="Wanted"> + 求む + </string> + <string name="Service"> + サービス + </string> + <string name="Personal"> + パーソナル + </string> + <string name="None"> + ãªã— + </string> + <string name="Linden Location"> + Linden所在地 + </string> + <string name="Adult"> + Adult + </string> + <string name="Arts&Culture"> + アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼ + </string> + <string name="Business"> + ビジãƒã‚¹ + </string> + <string name="Educational"> + 教育的 + </string> + <string name="Gaming"> + ゲーム+ </string> + <string name="Hangout"> + ãŸã¾ã‚Šå ´ + </string> + <string name="Newcomer Friendly"> + æ–°ä½äººã«å¥½æ„çš„ + </string> + <string name="Parks&Nature"> + 公園ã¨è‡ªç„¶ + </string> + <string name="Residential"> + ä½å®…用 + </string> + <string name="Stage"> + ステージ + </string> + <string name="Other"> + ãã®ä»– + </string> + <string name="Any"> + 全員 + </string> + <string name="You"> + ã‚ãªãŸ + </string> + <string name=":"> + : + </string> + <string name=","> + , + </string> + <string name="..."> + ... + </string> + <string name="***"> + *** + </string> + <string name="("> + ( + </string> + <string name=")"> + ) + </string> + <string name="."> + . + </string> + <string name="'"> + ' + </string> + <string name="---"> + --- + </string> + <string name="MBCmdLineError"> + コマンドラインã«ã‚¨ãƒ©ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚ +リンク先をå‚ç…§ã—ã¦ãã ã•ã„: http://wiki.secondlife.com/wiki/Client_parameters +エラー: + </string> + <string name="MBCmdLineUsg"> + [APP_NAME] コマンドライン使用: + </string> + <string name="MBUnableToAccessFile"> + [APP_NAME] ã¯å¿…è¦ãªãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。 + +複数ã®ã‚³ãƒ”ーを実行ä¸ã‹ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ—¢ã«é–‹ã„ã¦ã„ã‚‹ã¨ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ãŒèª¤èªè˜ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€ã‚³ãƒ³ãƒ”ューターをå†èµ·å‹•ã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 +ãã‚Œã§ã‚‚å•é¡ŒãŒç¶šãå ´åˆã€[APP_NAME] を完全ã«ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ã€å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ã—ã¦ãã ã•ã„。 + </string> + <string name="MBFatalError"> + 致命的ãªã‚¨ãƒ©ãƒ¼ + </string> + <string name="MBRequiresAltiVec"> + [APP_NAME] ã¯ã€AltiVecæ載ã®ãƒ—ãƒã‚»ãƒƒã‚µãŒå¿…è¦ã§ã™ã€‚(G4 以é™ï¼‰ + </string> + <string name="MBAlreadyRunning"> + [APP_NAME] ã¯ã™ã§ã«å®Ÿè¡Œä¸ã§ã™ã€‚ +最å°åŒ–ã•ã‚ŒãŸãƒ—ãƒã‚°ãƒ©ãƒ ã®ã‚³ãƒ”ーをタスクãƒãƒ¼ã§ç¢ºèªã—ã¦ãã ã•ã„。 +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã‚³ãƒ³ãƒ”ューターをå†èµ·å‹•ã—ã¦ãã ã•ã„。 + </string> + <string name="MBFrozenCrashed"> + [APP_NAME] ã¯å‰å›žã®å®Ÿè¡Œæ™‚ã«ãƒ•ãƒªãƒ¼ã‚ºã—ã¦ã„ã¾ã™ã€‚ +ã‚¯ãƒ©ãƒƒã‚·ãƒ¥å ±å‘Šã‚’é€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ + </string> + <string name="MBAlert"> + è¦å‘Š + </string> + <string name="MBNoDirectX"> + [APP_NAME] 㯠DirectX 9.0b åŠã³ãれ以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’検出ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +[APP_NAME] 㯠DirectX を使用ã—ã¦å®‰å®šæ€§ã®å•é¡Œã€ä½Žãƒ‘フォーマンスã€ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ç‰æ‚ªå½±éŸ¿ã‚’与ãˆã‚‹ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚„å¤ã„ドライãƒã‚’検出ã—ã¾ã™ã€‚ DirectX 9.0b ãŒãªãã¦ã‚‚ [APP_NAME] を実行ã§ãã¾ã™ãŒã€DirectX 9.0bã¨ã®ã”使用を強ã推奨ã—ã¾ã™ã€‚ + +続ã‘ã¾ã™ã‹ï¼Ÿ + </string> + <string name="MBWarning"> + è¦å‘Š + </string> + <string name="MBNoAutoUpdate"> + 自動更新ã¯ç¾åœ¨ Linux ã«ã¯å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“。 +www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。 + </string> + <string name="MBRegClassFailed"> + RegisterClass 失敗 + </string> + <string name="MBError"> + エラー + </string> + <string name="MBFullScreenErr"> + [WIDTH] x [HEIGHT] ã§ã¯å…¨ç”»é¢ã§å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 +ウィンドウモードã§å®Ÿè¡Œä¸ã§ã™ã€‚ + </string> + <string name="MBDestroyWinFailed"> + シャットダウンエラー(DestroyWindow() 失敗) + </string> + <string name="MBShutdownErr"> + シャットダウンエラー + </string> + <string name="MBDevContextErr"> + GL ディãƒã‚¤ã‚¹ã‚³ãƒ³ãƒ†ã‚ストãŒä½œã‚Œã¾ã›ã‚“ + </string> + <string name="MBPixelFmtErr"> + é©åˆ‡ãªãƒ”クセル形å¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ + </string> + <string name="MBPixelFmtDescErr"> + ピクセル形å¼æƒ…å ±ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ + </string> + <string name="MBTrueColorWindow"> + [APP_NAME] をウィンドウã§å®Ÿè¡Œã™ã‚‹ã«ã¯ã€True Color(32ビット)ãŒå¿…è¦ã§ã™ã€‚ +「コントãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨å®šã€ã«è¡Œãã€ã€Œæœ€é«˜ (32 ビット)ã€ã«è¨å®šã—ã¦ãã ã•ã„。 +全画é¢ã‚’é¸æŠžã—ãŸå ´åˆã€å®Ÿè¡Œæ™‚ã« [APP_NAME] ã¯è‡ªå‹•çš„ã«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚’調整ã—ã¾ã™ã€‚ + </string> + <string name="MBAlpha"> + [APP_NAME] 㯠8 ビットã®ã‚¢ãƒ«ãƒ•ã‚¡ãƒãƒ£ãƒ³ãƒãƒ«ã‚’å–å¾—ã§ããªã„ãŸã‚実行ã§ãã¾ã›ã‚“。 通常ビデオカードã®ãƒ‰ãƒ©ã‚¤ãƒã®å•é¡Œã§èµ·ã“ã‚Šã¾ã™ã€‚ +ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã«æœ€æ–°ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。 +ã¾ãŸã€ã€Œã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨å®šã€å†…ã§ã€ãƒ¢ãƒ‹ã‚¿ãƒ¼ãŒã€Œæœ€é«˜ (32ビット)ã€ã«è¨å®šã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚‚ã”確èªãã ã•ã„。 +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </string> + <string name="MBPixelFmtSetErr"> + ピクセル形å¼ãŒè¨å®šã§ãã¾ã›ã‚“ + </string> + <string name="MBGLContextErr"> + GL レンダーコンテã‚ストãŒä½œã‚Œã¾ã›ã‚“ + </string> + <string name="MBGLContextActErr"> + GL レンダーコンテã‚ストをアクティベートã§ãã¾ã›ã‚“ + </string> + <string name="MBVideoDrvErr"> + ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ãƒ“デオカードドライãƒãŒæ£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ããªã‹ã£ãŸã€ã¾ãŸã¯å¤ã„ã‹ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ãŸã‚ã€[APP_NAME] ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。 最新ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã®ã‚’確èªã—ã€ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠè©¦ã—ãã ã•ã„。 + +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </string> + <string name="5 O'Clock Shadow"> + ã†ã£ã™ã‚‰ã¨ã—ãŸãƒ’ゲ + </string> + <string name="All White"> + 真ã£ç™½ + </string> + <string name="Anime Eyes"> + アニメ風ã®ç›® + </string> + <string name="Arced"> + アーム+ </string> + <string name="Arm Length"> + è…•ã®é•·ã• + </string> + <string name="Attached"> + å° + </string> + <string name="Attached Earlobes"> + 耳ãŸã¶ + </string> + <string name="Back Bangs"> + 後ã‚ã«ã‹ã上ã’ãŸå‰é«ª + </string> + <string name="Back Bangs Down"> + 後ã‚ã«ã‹ã上ã’ã¦ä¸‹ã‚ã—ãŸå‰é«ª + </string> + <string name="Back Bangs Up"> + 後ã‚ã«ã‹ã上ã’ã¦æŒã¡ä¸Šã’ãŸå‰é«ª + </string> + <string name="Back Fringe"> + 後ã‚髪ã®æ¯›å…ˆ + </string> + <string name="Back Hair"> + 後ã‚髪 + </string> + <string name="Back Hair Down"> + 下ã‚ã—ãŸå¾Œã‚髪 + </string> + <string name="Back Hair Up"> + アップã«ã—ãŸå¾Œã‚髪 + </string> + <string name="Baggy"> + ãŸã‚‹ã‚“ã§ã„ã‚‹ + </string> + <string name="Bangs"> + å‰é«ª + </string> + <string name="Bangs Down"> + 下ã‚ã—ãŸå‰é«ª + </string> + <string name="Bangs Up"> + æŒã¡ä¸Šã’ãŸå‰é«ª + </string> + <string name="Beady Eyes"> + ビーズã®ã‚ˆã†ãªç›® + </string> + <string name="Belly Size"> + ãŠè…¹ã®å¤§ãã• + </string> + <string name="Big"> + 大 + </string> + <string name="Big Butt"> + 大 + </string> + <string name="Big Eyeball"> + 大ãã„çœ¼çƒ + </string> + <string name="Big Hair Back"> + 髪ã®å¤§éƒ¨åˆ†ï¼š 後゠+ </string> + <string name="Big Hair Front"> + 髪ã®å¤§éƒ¨åˆ†ï¼š å‰ + </string> + <string name="Big Hair Top"> + 髪ã®å¤§éƒ¨åˆ†ï¼š 上部 + </string> + <string name="Big Head"> + 大 + </string> + <string name="Big Pectorals"> + 大 + </string> + <string name="Big Spikes"> + ã¨ã’ã‚ã‚Š + </string> + <string name="Black"> + é»’ + </string> + <string name="Blonde"> + ブãƒãƒ³ãƒ‰ + </string> + <string name="Blonde Hair"> + ブãƒãƒ³ãƒ‰ã®é«ª + </string> + <string name="Blush"> + ãƒãƒ¼ã‚¯ + </string> + <string name="Blush Color"> + ãƒãƒ¼ã‚¯ã‚«ãƒ©ãƒ¼ + </string> + <string name="Blush Opacity"> + ãƒãƒ¼ã‚¯ã®æ¿ƒã• + </string> + <string name="Body Definition"> + 体ã®ç²¾ç´°åº¦ + </string> + <string name="Body Fat"> + 体脂肪 + </string> + <string name="Body Freckles"> + 体ã®ã—ã¿ãƒ»ãã°ã‹ã™ + </string> + <string name="Body Thick"> + 骨太 + </string> + <string name="Body Thickness"> + 体ã®åŽšã¿ + </string> + <string name="Body Thin"> + ç´°ã‚ + </string> + <string name="Bow Legged"> + 外股 + </string> + <string name="Breast Buoyancy"> + 胸ã®é‡åŠ› + </string> + <string name="Breast Cleavage"> + 胸ã®è°·é–“ + </string> + <string name="Breast Size"> + 胸ã®å¤§ãã• + </string> + <string name="Bridge Width"> + 両目ã®é–“ã®å¹… + </string> + <string name="Broad"> + 広 + </string> + <string name="Brow Size"> + 眉毛ã®å¤§ãã• + </string> + <string name="Bug Eyes"> + Bug Eyes + </string> + <string name="Bugged Eyes"> + çªã出ãŸç›® + </string> + <string name="Bulbous"> + ã ã‚“ã” + </string> + <string name="Bulbous Nose"> + ã ã‚“ã”é¼» + </string> + <string name="Bushy Eyebrows"> + 太 + </string> + <string name="Bushy Hair"> + ã¼ã•ã¼ã•ãƒ˜ã‚¢ + </string> + <string name="Butt Size"> + ãŠå°»ã®å¤§ãã• + </string> + <string name="bustle skirt"> + 後ã‚ã®è†¨ã‚‰ã¿ + </string> + <string name="no bustle"> + 膨らã¿ãªã— + </string> + <string name="more bustle"> + 膨らã¿å¤§ + </string> + <string name="Chaplin"> + Chaplin + </string> + <string name="Cheek Bones"> + ã»ãŠéª¨ + </string> + <string name="Chest Size"> + 胸部ã®å¤§ãã• + </string> + <string name="Chin Angle"> + ã‚ã”ã®è§’度 + </string> + <string name="Chin Cleft"> + ã‚ã”ã®å…ˆã®å‰²ã‚Œå…·åˆ + </string> + <string name="Chin Curtains"> + ã‚ã”ã«æ²¿ã£ãŸã²ã’ + </string> + <string name="Chin Depth"> + ã‚ã”ã®é•·ã• + </string> + <string name="Chin Heavy"> + ã‚ã”ã«é‡ç‚¹ + </string> + <string name="Chin In"> + ã²ã„ãŸã‚ã” + </string> + <string name="Chin Out"> + çªã出ãŸã‚ã” + </string> + <string name="Chin-Neck"> + ã‚ã”ã¨é¦– + </string> + <string name="Clear"> + クリア + </string> + <string name="Cleft"> + 割れ㟠+ </string> + <string name="Close Set Eyes"> + é¡”ã®ä¸å¿ƒå¯„ã‚Šã®ç›® + </string> + <string name="Closed"> + クãƒãƒ¼ã‚º + </string> + <string name="Closed Back"> + 後ã‚ã¨ã˜ + </string> + <string name="Closed Front"> + å‰ã¨ã˜ + </string> + <string name="Closed Left"> + å·¦ã¨ã˜ + </string> + <string name="Closed Right"> + å³ã¨ã˜ + </string> + <string name="Coin Purse"> + コイン入れ + </string> + <string name="Collar Back"> + 後ã‚ãˆã‚Š + </string> + <string name="Collar Front"> + å‰ãˆã‚Š + </string> + <string name="Corner Down"> + ダウン + </string> + <string name="Corner Normal"> + ノーマル + </string> + <string name="Corner Up"> + アップ + </string> + <string name="Creased"> + é‡ã„ã¾ã¶ãŸ + </string> + <string name="Crooked Nose"> + 曲ãŒã£ãŸé¼» + </string> + <string name="Cropped Hair"> + çŸã刈り込んã 髪 + </string> + <string name="Cuff Flare"> + 袖å£ã®ãƒ•ãƒ¬ã‚¢ + </string> + <string name="Dark"> + ダーク + </string> + <string name="Dark Green"> + ダークグリーン + </string> + <string name="Darker"> + ダーク + </string> + <string name="Deep"> + å°–ã£ãŸ + </string> + <string name="Default Heels"> + デフォルトã®ã‹ã‹ã¨ + </string> + <string name="Default Toe"> + デフォルトã®ã¤ã¾å…ˆ + </string> + <string name="Dense"> + 濃 + </string> + <string name="Dense hair"> + 密度ã®å¤šã„髪 + </string> + <string name="Double Chin"> + 二é‡ã‚ã” + </string> + <string name="Downturned"> + 下å‘ã + </string> + <string name="Duffle Bag"> + ダッフルãƒãƒƒã‚° + </string> + <string name="Ear Angle"> + 耳ã®è§’度 + </string> + <string name="Ear Size"> + 耳ã®å¤§ãã• + </string> + <string name="Ear Tips"> + 耳ã®å…ˆ + </string> + <string name="Egg Head"> + ãŸã¾ã”é + </string> + <string name="Eye Bags"> + 下ã¾ã¶ãŸ + </string> + <string name="Eye Color"> + çž³ã®è‰² + </string> + <string name="Eye Depth"> + ç›®ã®ãã¼ã¿ + </string> + <string name="Eye Lightness"> + çž³ã®æ˜Žã‚‹ã• + </string> + <string name="Eye Opening"> + 見開ãå…·åˆ + </string> + <string name="Eye Pop"> + 両目ã®å¤§ãã•ã®å¯¾ç§° + </string> + <string name="Eye Size"> + ç›®ã®å¤§ãã• + </string> + <string name="Eye Spacing"> + ç›®ã¨ç›®ã®ã‚ã„ã ã®å¹… + </string> + <string name="Eyeball Size"> + 眼çƒã®å¤§ãã• + </string> + <string name="Eyebrow Arc"> + 眉毛ã®ã‚¢ãƒ¼ãƒ + </string> + <string name="Eyebrow Density"> + 眉毛ã®å¯†é›†åº¦ + </string> + <string name="Eyebrow Height"> + 眉毛ã®é«˜ã• + </string> + <string name="Eyebrow Points"> + 眉毛ã®è§’ + </string> + <string name="Eyebrow Size"> + 眉毛ã®å¤§ãã• + </string> + <string name="Eyelash Length"> + ã¾ã¤ã’ã®é•·ã• + </string> + <string name="Eyeliner"> + アイライナー + </string> + <string name="Eyeliner Color"> + アイライナーã®è‰² + </string> + <string name="Eyes Back"> + 目・戻る + </string> + <string name="Eyes Bugged"> + 下ã¾ã¶ãŸãŒãŸã‚‹ã‚“ã ç›® + </string> + <string name="Eyes Forward"> + 目・次㸠+ </string> + <string name="Eyes Long Head"> + Eyes Long Head + </string> + <string name="Eyes Shear Left Up"> + Eyes Shear Left Up + </string> + <string name="Eyes Shear Right Up"> + Eyes Shear Right Up + </string> + <string name="Eyes Short Head"> + Eyes Short Head + </string> + <string name="Eyes Spread"> + 離れãŸç›® + </string> + <string name="Eyes Sunken"> + ãã¼ã‚“ã ç›® + </string> + <string name="Eyes Together"> + Eyes Together + </string> + <string name="Face Shear"> + é¡”ã®ã‚†ãŒã¿ + </string> + <string name="Facial Definition"> + é¡”ã®ç²¾ç´°åº¦ + </string> + <string name="Far Set Eyes"> + 離れãŸç›® + </string> + <string name="Fat"> + 太ã£ãŸ + </string> + <string name="Fat Head"> + 太ã‚ã®é + </string> + <string name="Fat Lips"> + 大 + </string> + <string name="Fat Lower"> + Fat Lower + </string> + <string name="Fat Lower Lip"> + 厚ã‚ã®ä¸‹å”‡ + </string> + <string name="Fat Torso"> + 太ã‚ã®é 部 + </string> + <string name="Fat Upper"> + Fat Upper + </string> + <string name="Fat Upper Lip"> + 厚ã‚ã®ä¸Šå”‡ + </string> + <string name="Female"> + 女性 + </string> + <string name="Fingerless"> + 指ãªã— + </string> + <string name="Fingers"> + 指ã‚ã‚Š + </string> + <string name="Flared Cuffs"> + 広ãŒã£ãŸè¢–å£ + </string> + <string name="Flat"> + 平ら + </string> + <string name="Flat Butt"> + å° + </string> + <string name="Flat Head"> + 絶å£é + </string> + <string name="Flat Toe"> + フラット + </string> + <string name="Foot Size"> + 足ã®å¤§ãã• + </string> + <string name="Forehead Angle"> + ã²ãŸã„ã®è§’度 + </string> + <string name="Forehead Heavy"> + ã²ãŸã„ã«é‡ç‚¹ + </string> + <string name="Freckles"> + ã—ã¿ãƒ»ãã°ã‹ã™ + </string> + <string name="Front Bangs Down"> + 下ã‚ã—ãŸå‰é«ª + </string> + <string name="Front Bangs Up"> + 上ã’ãŸå‰é«ª + </string> + <string name="Front Fringe"> + å‰é«ªã®æ¯›å…ˆ + </string> + <string name="Front Hair"> + å‰é«ª + </string> + <string name="Front Hair Down"> + 下ã‚ã—ãŸå‰é«ª + </string> + <string name="Front Hair Up"> + アップã«ã—ãŸå‰é«ª + </string> + <string name="Full Back"> + 刈られã¦ã„ãªã„髪 + </string> + <string name="Full Eyeliner"> + ã‚ã‚Š + </string> + <string name="Full Front"> + 刈られã¦ã„ãªã„髪 + </string> + <string name="Full Hair Sides"> + サイドã®é«ª + </string> + <string name="Full Sides"> + 生ãˆæƒã£ãŸã‚µã‚¤ãƒ‰ + </string> + <string name="Glossy"> + ã‚ã‚Š + </string> + <string name="Glove Fingers"> + 手袋ã®æŒ‡ + </string> + <string name="Glove Length"> + 手袋ã®é•·ã• + </string> + <string name="Hair"> + 髪 + </string> + <string name="Hair Back"> + 髪: 後゠+ </string> + <string name="Hair Front"> + 髪: å‰ + </string> + <string name="Hair Sides"> + 髪: サイド + </string> + <string name="Hair Sweep"> + æµã™ + </string> + <string name="Hair Thickess"> + 髪ã®é‡ + </string> + <string name="Hair Thickness"> + 髪ã®é‡ + </string> + <string name="Hair Tilt"> + 髪ã®å‘ã + </string> + <string name="Hair Tilted Left"> + å·¦å‘ã + </string> + <string name="Hair Tilted Right"> + å³å‘ã + </string> + <string name="Hair Volume"> + 髪: ボリューム+ </string> + <string name="Hand Size"> + 手ã®å¤§ãã• + </string> + <string name="Handlebars"> + ãƒãƒ³ãƒ‰ãƒ«ãƒãƒ¼ + </string> + <string name="Head Length"> + é ã®é•·ã• + </string> + <string name="Head Shape"> + é ã®å½¢ + </string> + <string name="Head Size"> + é ã®å¤§ãã• + </string> + <string name="Head Stretch"> + é ã®ä¼¸ã³å…·åˆ + </string> + <string name="Heel Height"> + ヒールã®é«˜ã• + </string> + <string name="Heel Shape"> + ヒールã®å½¢ + </string> + <string name="Height"> + 身長 + </string> + <string name="High"> + 高 + </string> + <string name="High Heels"> + ãƒã‚¤ãƒ’ール + </string> + <string name="High Jaw"> + 高 + </string> + <string name="High Platforms"> + 厚底 + </string> + <string name="High and Tight"> + 高ã‚ã§ã‚¿ã‚¤ãƒˆ + </string> + <string name="Higher"> + 高 + </string> + <string name="Hip Length"> + è…°ã®é•·ã• + </string> + <string name="Hip Width"> + è…°ã®å¹… + </string> + <string name="In"> + 内å‘ã + </string> + <string name="In Shdw Color"> + 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã‚«ãƒ©ãƒ¼ + </string> + <string name="In Shdw Opacity"> + 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã®æ¿ƒã• + </string> + <string name="Inner Eye Corner"> + ç›®é + </string> + <string name="Inner Eye Shadow"> + 内å´ã®ã‚¢ã‚¤ã‚·ãƒ£ãƒ‰ã‚¦ + </string> + <string name="Inner Shadow"> + 内å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ + </string> + <string name="Jacket Length"> + ジャケット丈 + </string> + <string name="Jacket Wrinkles"> + ジャケットã®ã—ã‚ + </string> + <string name="Jaw Angle"> + ã‚ã”ã®è§’度 + </string> + <string name="Jaw Jut"> + ã‚ã”ã®çªå‡º + </string> + <string name="Jaw Shape"> + ã‚ã”ã®å½¢ + </string> + <string name="Join"> + 寄ã›ãŸ + </string> + <string name="Jowls"> + ãˆã‚‰ + </string> + <string name="Knee Angle"> + è†ã®è§’度 + </string> + <string name="Knock Kneed"> + 内股 + </string> + <string name="Large"> + 大 + </string> + <string name="Large Hands"> + 大 + </string> + <string name="Left Part"> + 左分㑠+ </string> + <string name="Leg Length"> + è„šã®é•·ã• + </string> + <string name="Leg Muscles"> + è„šã®ç‹è‚‰ + </string> + <string name="Less"> + å° + </string> + <string name="Less Body Fat"> + å°‘ãªã‚ + </string> + <string name="Less Curtains"> + å°‘ãªã‚ + </string> + <string name="Less Freckles"> + å°‘ãªã‚ + </string> + <string name="Less Full"> + è–„ã„ + </string> + <string name="Less Gravity"> + å°‘ + </string> + <string name="Less Love"> + å°‘ + </string> + <string name="Less Muscles"> + å°‘ãªã‚ + </string> + <string name="Less Muscular"> + å°‘ãªã‚ + </string> + <string name="Less Rosy"> + å°‘ãªç›® + </string> + <string name="Less Round"> + 丸ã¿å°‘ãªç›® + </string> + <string name="Less Saddle"> + å° + </string> + <string name="Less Square"> + å° + </string> + <string name="Less Volume"> + ボリューム少ãªç›® + </string> + <string name="Less soul"> + å° + </string> + <string name="Lighter"> + ライト + </string> + <string name="Lip Cleft"> + 唇ã®å±± + </string> + <string name="Lip Cleft Depth"> + 唇ã®å±±ã®é«˜ã• + </string> + <string name="Lip Fullness"> + 唇ã®åŽšã¿ + </string> + <string name="Lip Pinkness"> + 唇ã®èµ¤ã¿ + </string> + <string name="Lip Ratio"> + 上下唇ã®å¤§ãã• + </string> + <string name="Lip Thickness"> + 唇ã®å‰å¾Œå¹… + </string> + <string name="Lip Width"> + å£ã®å¤§ãã• + </string> + <string name="Lipgloss"> + リップグãƒã‚¹ + </string> + <string name="Lipstick"> + å£ç´… + </string> + <string name="Lipstick Color"> + å£ç´…ã®è‰² + </string> + <string name="Long"> + é•· + </string> + <string name="Long Head"> + å‰å¾Œå¹…ãŒåºƒã„é + </string> + <string name="Long Hips"> + é•· + </string> + <string name="Long Legs"> + é•· + </string> + <string name="Long Neck"> + é•· + </string> + <string name="Long Pigtails"> + é•· + </string> + <string name="Long Ponytail"> + é•· + </string> + <string name="Long Torso"> + é•· + </string> + <string name="Long arms"> + é•· + </string> + <string name="Longcuffs"> + ãƒãƒ³ã‚°ã‚«ãƒ•ã‚¹ + </string> + <string name="Loose Pants"> + ゆã£ãŸã‚Š + </string> + <string name="Loose Shirt"> + ゆる゠+ </string> + <string name="Loose Sleeves"> + ゆる゠+ </string> + <string name="Love Handles"> + ウエスト周り + </string> + <string name="Low"> + 低 + </string> + <string name="Low Heels"> + ãƒãƒ¼ãƒ’ール + </string> + <string name="Low Jaw"> + 低 + </string> + <string name="Low Platforms"> + 低゠+ </string> + <string name="Low and Loose"> + 低ã‚ã§ã‚†ã£ãŸã‚Š + </string> + <string name="Lower"> + 低 + </string> + <string name="Lower Bridge"> + é¼»ç‹ + </string> + <string name="Lower Cheeks"> + ã»ãŠã®ä¸‹éƒ¨ + </string> + <string name="Male"> + 男性 + </string> + <string name="Middle Part"> + 真んä¸åˆ†ã‘ + </string> + <string name="More"> + 大 + </string> + <string name="More Blush"> + ãã¤ã‚ + </string> + <string name="More Body Fat"> + 多゠+ </string> + <string name="More Curtains"> + 多゠+ </string> + <string name="More Eyeshadow"> + ã‚ã‚Š + </string> + <string name="More Freckles"> + 多゠+ </string> + <string name="More Full"> + 厚ㄠ+ </string> + <string name="More Gravity"> + 大 + </string> + <string name="More Lipstick"> + ã‚ã‚Š + </string> + <string name="More Love"> + 大 + </string> + <string name="More Lower Lip"> + 大 + </string> + <string name="More Muscles"> + 多゠+ </string> + <string name="More Muscular"> + ç‹éª¨éš†ã€… + </string> + <string name="More Rosy"> + 多゠+ </string> + <string name="More Round"> + ã¾ã‚‹ + </string> + <string name="More Saddle"> + 大 + </string> + <string name="More Sloped"> + ãªã ら㋠+ </string> + <string name="More Square"> + 四角 + </string> + <string name="More Upper Lip"> + 大 + </string> + <string name="More Vertical"> + åž‚ç›´ + </string> + <string name="More Volume"> + 大 + </string> + <string name="More soul"> + 大 + </string> + <string name="Moustache"> + å£ã²ã’ + </string> + <string name="Mouth Corner"> + å£è§’ + </string> + <string name="Mouth Position"> + å£ã®ä½ç½® + </string> + <string name="Mowhawk"> + モヒカン + </string> + <string name="Muscular"> + ç‹éª¨ãŸãã¾ã—ã„ + </string> + <string name="Mutton Chops"> + マトンãƒãƒ§ãƒƒãƒ—ス + </string> + <string name="Nail Polish"> + マニã‚ュア + </string> + <string name="Nail Polish Color"> + マニã‚ュアã®è‰² + </string> + <string name="Narrow"> + ç‹ + </string> + <string name="Narrow Back"> + ç‹ + </string> + <string name="Narrow Front"> + ç‹ + </string> + <string name="Narrow Lips"> + ãŠã¡ã‚‡ã¼å£ + </string> + <string name="Natural"> + ナãƒãƒ¥ãƒ©ãƒ« + </string> + <string name="Neck Length"> + 首ã®é•·ã• + </string> + <string name="Neck Thickness"> + 首ã®å¤ªã• + </string> + <string name="No Blush"> + ãªã— + </string> + <string name="No Eyeliner"> + ãªã— + </string> + <string name="No Eyeshadow"> + ãªã— + </string> + <string name="No Heels"> + ãªã— + </string> + <string name="No Lipgloss"> + ãªã— + </string> + <string name="No Lipstick"> + ãªã— + </string> + <string name="No Part"> + ãªã— + </string> + <string name="No Polish"> + ãªã— + </string> + <string name="No Red"> + ãªã— + </string> + <string name="No Spikes"> + ãªã— + </string> + <string name="No White"> + ãªã— + </string> + <string name="No Wrinkles"> + ãªã— + </string> + <string name="Normal Lower"> + Normal Lower + </string> + <string name="Normal Upper"> + Normal Upper + </string> + <string name="Nose Left"> + 左曲ãŒã‚Š + </string> + <string name="Nose Right"> + å³æ›²ãŒã‚Š + </string> + <string name="Nose Size"> + é¼»ã®å¤§ãã• + </string> + <string name="Nose Thickness"> + é¼»ã®åŽšã¿ + </string> + <string name="Nose Tip Angle"> + 鼻先ã®è§’度 + </string> + <string name="Nose Tip Shape"> + 鼻先ã®å½¢ + </string> + <string name="Nose Width"> + é¼»ã®å¹… + </string> + <string name="Nostril Division"> + é¼»ã®ç©´ã®é«˜ã• + </string> + <string name="Nostril Width"> + é¼»ã®ç©´ã®å¹… + </string> + <string name="Old"> + Old + </string> + <string name="Opaque"> + 濃ã„ã‚ + </string> + <string name="Open"> + オープン + </string> + <string name="Open Back"> + 後ã‚ã‚ã + </string> + <string name="Open Front"> + å‰ã‚ã + </string> + <string name="Open Left"> + å·¦ã‚ã + </string> + <string name="Open Right"> + å³ã‚ã + </string> + <string name="Orange"> + オレンジ + </string> + <string name="Out"> + 外å‘ã + </string> + <string name="Out Shdw Color"> + 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã‚«ãƒ©ãƒ¼ + </string> + <string name="Out Shdw Opacity"> + 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ã®æ¿ƒã• + </string> + <string name="Outer Eye Corner"> + 目尻 + </string> + <string name="Outer Eye Shadow"> + 外å´ã®ã‚¢ã‚¤ã‚·ãƒ£ãƒ‰ã‚¦ + </string> + <string name="Outer Shadow"> + 外å´ã®ã‚·ãƒ£ãƒ‰ã‚¦ + </string> + <string name="Overbite"> + 出ã£æ¯ + </string> + <string name="Package"> + パッケージ + </string> + <string name="Painted Nails"> + ã‚ã‚Š + </string> + <string name="Pale"> + 悪ㄠ+ </string> + <string name="Pants Crotch"> + パンツã®è‚¡ + </string> + <string name="Pants Fit"> + パンツã®ãƒ•ã‚£ãƒƒãƒˆæ„Ÿ + </string> + <string name="Pants Length"> + パンツ丈 + </string> + <string name="Pants Waist"> + ウエスト + </string> + <string name="Pants Wrinkles"> + パンツã®ã—ã‚ + </string> + <string name="Part"> + ã‚ã‚Š + </string> + <string name="Part Bangs"> + 分ã‘ãŸå‰é«ª + </string> + <string name="Pectorals"> + èƒ¸ç‹ + </string> + <string name="Pigment"> + è‰²ç´ + </string> + <string name="Pigtails"> + 下ã’髪 + </string> + <string name="Pink"> + ピンク + </string> + <string name="Pinker"> + ピンク + </string> + <string name="Platform Height"> + é´åº•ã®é«˜ã• + </string> + <string name="Platform Width"> + é´åº•ã®å¹… + </string> + <string name="Pointy"> + å°–ã£ãŸ + </string> + <string name="Pointy Heels"> + å¹…ç‹ + </string> + <string name="Pointy Toe"> + å…ˆã®ç´°ã„ã¤ã¾å…ˆ + </string> + <string name="Ponytail"> + ãƒãƒ‹ãƒ¼ãƒ†ãƒ¼ãƒ« + </string> + <string name="Poofy Skirt"> + ãµã‚“ã‚ã‚Š + </string> + <string name="Pop Left Eye"> + 左目を大ãã + </string> + <string name="Pop Right Eye"> + å³ç›®ã‚’大ãã + </string> + <string name="Puffy"> + ãµã£ãら + </string> + <string name="Puffy Eyelids"> + ç›®ã®å‘¨ã‚Šã®è†¨ã‚‰ã¿ + </string> + <string name="Rainbow Color"> + 虹色 + </string> + <string name="Red Hair"> + 赤毛 + </string> + <string name="Red Skin"> + 赤ã„è‚Œ + </string> + <string name="Regular"> + å‡æ•´ã®ã¨ã‚ŒãŸ + </string> + <string name="Regular Muscles"> + å‡æ•´ã®ã¨ã‚ŒãŸç‹è‚‰ + </string> + <string name="Right Part"> + å³åˆ†ã‘ + </string> + <string name="Rosy Complexion"> + ã»ãŠã®èµ¤ã‚‰ã¿ + </string> + <string name="Round"> + ã¾ã‚‹ã£ã“ã„ + </string> + <string name="Round Forehead"> + 丸ã¿ã‚’帯ã³ãŸé¡ + </string> + <string name="Ruddiness"> + 血色 + </string> + <string name="Ruddy"> + 良ㄠ+ </string> + <string name="Rumpled Hair"> + ãã—ゃãã—ゃヘア + </string> + <string name="Saddle Bags"> + 腰回りã®è‚‰ä»˜ã + </string> + <string name="Saddlebags"> + 腰回りã®è‚‰ä»˜ã + </string> + <string name="Scrawny"> + 骨張ã£ãŸ + </string> + <string name="Scrawny Leg"> + 骨張ã£ãŸè„š + </string> + <string name="Separate"> + 離れ㟠+ </string> + <string name="Shading"> + Shading + </string> + <string name="Shadow hair"> + Shadow hair + </string> + <string name="Shallow"> + ãªã ら㋠+ </string> + <string name="Shear Back"> + 後方を刈る + </string> + <string name="Shear Face"> + é¡”ã®ã‚†ãŒã¿ + </string> + <string name="Shear Front"> + å‰æ–¹ã‚’刈る + </string> + <string name="Shear Left"> + å·¦å´ + </string> + <string name="Shear Left Up"> + å·¦åŠåˆ†ã‚’上㫠+ </string> + <string name="Shear Right"> + å³å´ + </string> + <string name="Shear Right Up"> + å³åŠåˆ†ã‚’上㫠+ </string> + <string name="Sheared Back"> + 後ã‚を刈られãŸé«ª + </string> + <string name="Sheared Front"> + å‰ã‚’刈られãŸé«ª + </string> + <string name="Shift Left"> + å·¦å‘ã + </string> + <string name="Shift Mouth"> + å£ã®å‘ã + </string> + <string name="Shift Right"> + å³å‘ã + </string> + <string name="Shirt Bottom"> + シャツã®è£¾ + </string> + <string name="Shirt Fit"> + シャツã®ãƒ•ã‚£ãƒƒãƒˆæ„Ÿ + </string> + <string name="Shirt Wrinkles"> + シャツã®ã—ã‚ + </string> + <string name="Shoe Height"> + é´ã®é•·ã• + </string> + <string name="Short"> + çŸ + </string> + <string name="Short Arms"> + çŸ + </string> + <string name="Short Legs"> + çŸ + </string> + <string name="Short Neck"> + çŸ + </string> + <string name="Short Pigtails"> + çŸ + </string> + <string name="Short Ponytail"> + çŸ + </string> + <string name="Short Sideburns"> + çŸã‚ + </string> + <string name="Short Torso"> + çŸ + </string> + <string name="Short hips"> + çŸ + </string> + <string name="Shoulders"> + è‚© + </string> + <string name="Side Bangs"> + サイドã«æµã—ãŸå‰é«ª + </string> + <string name="Side Bangs Down"> + ダウン + </string> + <string name="Side Bangs Up"> + アップ + </string> + <string name="Side Fringe"> + サイドã®æ¯›å…ˆ + </string> + <string name="Sideburns"> + ã‚‚ã¿ã‚ã’ + </string> + <string name="Sides Hair"> + サイドã®é«ª + </string> + <string name="Sides Hair Down"> + ダウン + </string> + <string name="Sides Hair Up"> + アップ + </string> + <string name="Skinny"> + 細身 + </string> + <string name="Skinny Neck"> + ç´° + </string> + <string name="Skirt Fit"> + スカートã®ãƒ•ã‚£ãƒƒãƒˆæ„Ÿ + </string> + <string name="Skirt Length"> + スカート丈 + </string> + <string name="Slanted Forehead"> + 傾斜ã—ãŸé¡ + </string> + <string name="Sleeve Length"> + 袖丈 + </string> + <string name="Sleeve Looseness"> + 袖ã®ãƒ•ã‚£ãƒƒãƒˆæ„Ÿ + </string> + <string name="Slit Back"> + スリット: 後゠+ </string> + <string name="Slit Front"> + スリット: å‰ + </string> + <string name="Slit Left"> + スリット: å·¦ + </string> + <string name="Slit Right"> + スリット: å³ + </string> + <string name="Small"> + å° + </string> + <string name="Small Hands"> + å° + </string> + <string name="Small Head"> + å° + </string> + <string name="Smooth"> + 滑ら㋠+ </string> + <string name="Smooth Hair"> + スムーズ + </string> + <string name="Socks Length"> + é´ä¸‹ä¸ˆ + </string> + <string name="Some"> + Some + </string> + <string name="Soulpatch"> + ソウルパッム+ </string> + <string name="Sparse"> + è–„ + </string> + <string name="Spiked Hair"> + ã¨ã’ã¨ã’ヘア + </string> + <string name="Square"> + 角張ã£ãŸ + </string> + <string name="Square Toe"> + スクエアトゥ + </string> + <string name="Squash Head"> + カボãƒãƒ£åž‹ + </string> + <string name="Squash/Stretch Head"> + カボãƒãƒ£/縦長é + </string> + <string name="Stretch Head"> + 縦長 + </string> + <string name="Sunken"> + ã“ã‘㟠+ </string> + <string name="Sunken Chest"> + å° + </string> + <string name="Sunken Eyes"> + ãã¼ã‚“ã ç›® + </string> + <string name="Sweep Back"> + 後ã‚㸠+ </string> + <string name="Sweep Forward"> + å‰ã¸ + </string> + <string name="Swept Back"> + オールãƒãƒƒã‚¯ + </string> + <string name="Swept Back Hair"> + オールãƒãƒƒã‚¯ãƒ˜ã‚¢ + </string> + <string name="Swept Forward"> + å‰ã¸ + </string> + <string name="Swept Forward Hair"> + 後ã‚㸠+ </string> + <string name="Tall"> + 高 + </string> + <string name="Taper Back"> + 後ã‚ã«å…ˆç´° + </string> + <string name="Taper Front"> + å‰ã«å…ˆç´° + </string> + <string name="Thick Heels"> + 幅広 + </string> + <string name="Thick Neck"> + 太 + </string> + <string name="Thick Toe"> + 厚゠+ </string> + <string name="Thickness"> + 厚㿠+ </string> + <string name="Thin"> + è–„ã„ + </string> + <string name="Thin Eyebrows"> + ç´° + </string> + <string name="Thin Lips"> + å° + </string> + <string name="Thin Nose"> + ç´°ã„é¼» + </string> + <string name="Tight Chin"> + ã²ãã—ã¾ã£ãŸã‚ã” + </string> + <string name="Tight Cuffs"> + タイト + </string> + <string name="Tight Pants"> + タイト + </string> + <string name="Tight Shirt"> + タイト + </string> + <string name="Tight Skirt"> + タイト + </string> + <string name="Tight Sleeves"> + タイト + </string> + <string name="Tilt Left"> + å·¦ã«å‚¾æ–œ + </string> + <string name="Tilt Right"> + å³ã«å‚¾æ–œ + </string> + <string name="Toe Shape"> + ã¤ã¾å…ˆã®å½¢ + </string> + <string name="Toe Thickness"> + ã¤ã¾å…ˆã®åŽšã¿ + </string> + <string name="Torso Length"> + 上åŠèº«ã®é•·ã• + </string> + <string name="Torso Muscles"> + 上åŠèº«ã®ç‹è‚‰ + </string> + <string name="Torso Scrawny"> + 上åŠèº«ã®éª¨å¼µã‚Š + </string> + <string name="Unattached"> + 大 + </string> + <string name="Uncreased"> + 軽ã„ã¾ã¶ãŸ + </string> + <string name="Underbite"> + å—ã‘å£ + </string> + <string name="Unnatural"> + ユニーク + </string> + <string name="Upper Bridge"> + 両目ã®ã‚ã„ã + </string> + <string name="Upper Cheeks"> + ã»ãŠã®ä¸Šéƒ¨ + </string> + <string name="Upper Chin Cleft"> + ã‚ã”上部ã®å‰²ã‚Œå…·åˆ + </string> + <string name="Upper Eyelid Fold"> + 二é‡ã®å¹… + </string> + <string name="Upturned"> + 上å‘ã + </string> + <string name="Very Red"> + 真ã£èµ¤ + </string> + <string name="Waist Height"> + ウエストã®é«˜ã• + </string> + <string name="Well-Fed"> + ã¤ã¾ã£ãŸ + </string> + <string name="White Hair"> + 白髪 + </string> + <string name="Wide"> + 広 + </string> + <string name="Wide Back"> + 広 + </string> + <string name="Wide Front"> + 広 + </string> + <string name="Wide Lips"> + 大ãã„å£ + </string> + <string name="Wild"> + ワイルド + </string> + <string name="Wrinkles"> + ã—ã‚ã‚ã‚Š + </string> + <string name="LocationCtrlAddLandmarkTooltip"> + マイ ランドマークã«è¿½åŠ + </string> + <string name="LocationCtrlEditLandmarkTooltip"> + マイ ランドマークを編集 + </string> + <string name="UpdaterWindowTitle"> + [APP_NAME] アップデート + </string> + <string name="UpdaterNowUpdating"> + åªä»Š [APP_NAME] をアップデートä¸ã§ã™... + </string> + <string name="UpdaterNowInstalling"> + [APP_NAME] をインストールä¸ã§ã™... + </string> + <string name="UpdaterUpdatingDescriptive"> + ãŠä½¿ã„ã® [APP_NAME] ビューワãŒæœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—デートã•ã‚Œã¦ã„ã¾ã™ã€‚ 数分ã‹ã‹ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã®ã§ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。 + </string> + <string name="UpdaterProgressBarTextWithEllipses"> + アップデートをダウンãƒãƒ¼ãƒ‰ä¸ã§ã™... + </string> + <string name="UpdaterProgressBarText"> + アップデートをダウンãƒãƒ¼ãƒ‰ä¸ + </string> + <string name="UpdaterFailDownloadTitle"> + アップデートã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—㟠+ </string> + <string name="UpdaterFailUpdateDescriptive"> + [APP_NAME] をアップデートä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。 + </string> + <string name="UpdaterFailInstallTitle"> + アップデートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å¤±æ•—ã—ã¾ã—㟠+ </string> + <string name="UpdaterFailStartTitle"> + ビューワã®èµ·å‹•ã«å¤±æ•—ã—ã¾ã—㟠+ </string> + <string name="only_user_message"> + ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚ + </string> + <string name="offline_message"> + [FIRST] [LAST]ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ã€‚ + </string> + <string name="invite_message"> + ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç”/接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME]をクリックã—ã¦ãã ã•ã„。 + </string> + <string name="generic_request_error"> + è¦æ±‚ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 + </string> + <string name="insufficient_perms_error"> + ã‚ãªãŸã«ã¯å……分ãªæ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。 + </string> + <string name="session_does_not_exist_error"> + ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯æ—¢ã«åˆ‡æ–ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </string> + <string name="no_ability_error"> + ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚ã‚Šã¾ã›ã‚“。 + </string> + <string name="no_ability"> + ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚ã‚Šã¾ã›ã‚“。 + </string> + <string name="not_a_mod_error"> + ã‚ãªãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ»ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 + </string> + <string name="muted_error"> + グループモデレータãŒã‚ãªãŸã®ãƒ†ã‚ストãƒãƒ£ãƒƒãƒˆã‚’無効化ã—ã¾ã—㟠+ </string> + <string name="add_session_event"> + [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ + </string> + <string name="message_session_event"> + [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ + </string> + <string name="removed_from_group"> + ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚ + </string> + <string name="close_on_no_ability"> + ã“ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’継続ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ + </string> +</strings> diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml index 7e99d2562ee..ef7571cac49 100644 --- a/indra/newview/skins/default/xui/ja/teleport_strings.xml +++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml @@ -1,79 +1,79 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<teleport_messages name=""> - <message_set name="errors"> - <message name="invalid_tport"> - テレãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®å‡¦ç†ä¸ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚テレãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ -ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¼•ã続ã表示ã•ã‚Œã‚‹å ´åˆã¯ã€æŠ€è¡“サãƒãƒ¼ãƒˆFAQ(www.secondlife.com/support)をå‚ç…§ã—ã¦ãã ã•ã„。 - </message> - <message name="invalid_region_handoff"> - 地域間ã®ç§»å‹•ã®å‡¦ç†ä¸ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚地域間を移動ã™ã‚‹ã«ã¯ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ -ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¼•ã続ã表示ã•ã‚Œã‚‹å ´åˆã¯ã€æŠ€è¡“サãƒãƒ¼ãƒˆFAQ(www.secondlife.com/support)をå‚ç…§ã—ã¦ãã ã•ã„。 - </message> - <message name="blocked_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 -ã‚„ã‚Šç›´ã—ã¦ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦å•é¡Œã‚’解決ã—ã¦ãã ã•ã„。 - </message> - <message name="nolandmark_tport"> - 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚ - </message> - <message name="timeout_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -ã‚‚ã†å°‘ã—後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 - </message> - <message name="noaccess_tport"> - 残念ãªãŒã‚‰ã€ãã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“。 - </message> - <message name="missing_attach_tport"> - 添付物ã¯ã€ã¾ã 到ç€ã—ã¦ã„ã¾ã›ã‚“。ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’ã‚„ã‚Šç›´ã—ã¦ã ã•ã„。 - </message> - <message name="too_many_uploads_tport"> - ã“ã®åœ°åŸŸã®è³‡ç”£ã‚ューãŒç¾åœ¨è¾¼ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間通りã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚ -数分後ã«ã‚„ã‚Šç›´ã™ã‹ã€ã¾ãŸã¯æ··é›‘ã—ã¦ã„ãªã„ä»–ã®åœ°åŸŸã‚’ãŠè©¦ã—ãã ã•ã„。 - </message> - <message name="expired_tport"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 - </message> - <message name="expired_region_handoff"> - 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯åœ°åŸŸé–“ã®ç§»å‹•ã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ -数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 - </message> - <message name="no_host"> - テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã¾ãŸã¯ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 - </message> - <message name="no_inventory_host"> - æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。 - </message> - </message_set> - <message_set name="progress"> - <message name="sending_dest"> - 目的地ã«é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ - </message> - <message name="redirecting"> - 別ã®ç›®çš„地ã«å†æ¡ˆå†…ã—ã¦ã„ã¾ã™ã€‚ - </message> - <message name="relaying"> - 目的地ã«ä¸ç¶™ã—ã¦ã„ã¾ã™ã€‚ - </message> - <message name="sending_home"> - ホームä½ç½®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ - </message> - <message name="sending_landmark"> - ランドマークä½ç½®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ - </message> - <message name="completing"> - テレãƒãƒ¼ãƒˆã‚’完了ã—ã¦ã„ã¾ã™ã€‚ - </message> - <message name="resolving"> - 目的地を解決ã—ã¦ã„ã¾ã™ã€‚ - </message> - <message name="contacting"> - æ–°ã—ã„地域ã«ã‚³ãƒ³ã‚¿ã‚¯ãƒˆã—ã¦ã„ã¾ã™ã€‚ - </message> - <message name="arriving"> - 到ç€... - </message> - <message name="requesting"> - テレãƒãƒ¼ãƒˆã‚’リクエスト... - </message> - </message_set> -</teleport_messages> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<teleport_messages name=""> + <message_set name="errors"> + <message name="invalid_tport"> + テレãƒãƒ¼ãƒˆå‡¦ç†ä¸ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </message> + <message name="invalid_region_handoff"> + リージョン間ã®ç§»å‹•ä¸ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ãƒã‚°ã‚¤ãƒ³ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 +ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。 + </message> + <message name="blocked_tport"> + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 +ã‚„ã‚Šç›´ã—ã¦ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦å•é¡Œã‚’解決ã—ã¦ãã ã•ã„。 + </message> + <message name="nolandmark_tport"> + 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚ + </message> + <message name="timeout_tport"> + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +ã‚‚ã†å°‘ã—後ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 + </message> + <message name="noaccess_tport"> + 残念ãªãŒã‚‰ã€ãã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“。 + </message> + <message name="missing_attach_tport"> + 添付物ã¯ã€ã¾ã 到ç€ã—ã¦ã„ã¾ã›ã‚“。ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ãƒã‚°ã‚¢ã‚¦ãƒˆã—ã€å†åº¦ãƒã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’ã‚„ã‚Šç›´ã—ã¦ã ã•ã„。 + </message> + <message name="too_many_uploads_tport"> + ã“ã®åœ°åŸŸã®è³‡ç”£ã‚ューãŒç¾åœ¨è¾¼ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間通りã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚ +数分後ã«ã‚„ã‚Šç›´ã™ã‹ã€ã¾ãŸã¯æ··é›‘ã—ã¦ã„ãªã„ä»–ã®åœ°åŸŸã‚’ãŠè©¦ã—ãã ã•ã„。 + </message> + <message name="expired_tport"> + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 + </message> + <message name="expired_region_handoff"> + 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯åœ°åŸŸé–“ã®ç§»å‹•ã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 + </message> + <message name="no_host"> + テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã¾ãŸã¯ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚数分後ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 + </message> + <message name="no_inventory_host"> + æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。 + </message> + </message_set> + <message_set name="progress"> + <message name="sending_dest"> + 目的地ã«é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ + </message> + <message name="redirecting"> + 別ã®ç›®çš„地ã«å†æ¡ˆå†…ã—ã¦ã„ã¾ã™ã€‚ + </message> + <message name="relaying"> + 目的地ã«ä¸ç¶™ã—ã¦ã„ã¾ã™ã€‚ + </message> + <message name="sending_home"> + ホームä½ç½®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ + </message> + <message name="sending_landmark"> + ランドマークä½ç½®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚ + </message> + <message name="completing"> + テレãƒãƒ¼ãƒˆã‚’完了ã—ã¦ã„ã¾ã™ã€‚ + </message> + <message name="resolving"> + 目的地を解決ã—ã¦ã„ã¾ã™ã€‚ + </message> + <message name="contacting"> + æ–°ã—ã„地域ã«ã‚³ãƒ³ã‚¿ã‚¯ãƒˆã—ã¦ã„ã¾ã™ã€‚ + </message> + <message name="arriving"> + 到ç€... + </message> + <message name="requesting"> + テレãƒãƒ¼ãƒˆã‚’リクエスト... + </message> + </message_set> +</teleport_messages> -- GitLab From def4a6aeea35fbced77894fb6577ad2889c877b3 Mon Sep 17 00:00:00 2001 From: "Justin C. Rounds (Chuck)" <chuck@lindenlab.com> Date: Tue, 10 Nov 2009 13:17:49 -0500 Subject: [PATCH 302/306] Changed value of "Unused?" to modify highlight color. http://jira.secondlife.com/browse/EXT-2312 --- indra/newview/skins/default/colors.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 572a4cf9e95..7e19a80c109 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -70,7 +70,7 @@ value="1 1 0 1" /> <color name="Unused?" - value="1 0 1 1" /> + value="1 0.5 0 1" /> <color name="Transparent" value="0 0 0 0" /> -- GitLab From f8f8b0502e3a94933109778c0fe9917700ad1119 Mon Sep 17 00:00:00 2001 From: Monroe Linden <monroe@lindenlab.com> Date: Tue, 10 Nov 2009 11:30:17 -0800 Subject: [PATCH 303/306] Added an explicit copy constructor to LLPluginMessage. --- indra/llplugin/llpluginmessage.cpp | 5 +++++ indra/llplugin/llpluginmessage.h | 1 + 2 files changed, 6 insertions(+) diff --git a/indra/llplugin/llpluginmessage.cpp b/indra/llplugin/llpluginmessage.cpp index e7412a1d8f8..32601b47dbb 100644 --- a/indra/llplugin/llpluginmessage.cpp +++ b/indra/llplugin/llpluginmessage.cpp @@ -39,6 +39,11 @@ LLPluginMessage::LLPluginMessage() { } +LLPluginMessage::LLPluginMessage(const LLPluginMessage &p) +{ + mMessage = p.mMessage; +} + LLPluginMessage::LLPluginMessage(const std::string &message_class, const std::string &message_name) { setMessage(message_class, message_name); diff --git a/indra/llplugin/llpluginmessage.h b/indra/llplugin/llpluginmessage.h index f1a0e7c6243..5e93d8b7a1c 100644 --- a/indra/llplugin/llpluginmessage.h +++ b/indra/llplugin/llpluginmessage.h @@ -40,6 +40,7 @@ class LLPluginMessage LOG_CLASS(LLPluginMessage); public: LLPluginMessage(); + LLPluginMessage(const LLPluginMessage &p); LLPluginMessage(const std::string &message_class, const std::string &message_name); ~LLPluginMessage(); -- GitLab From ecf8f5c5beda9f5fa743c4666717c4378f204023 Mon Sep 17 00:00:00 2001 From: Lis Pardi <lis@lindenlab.com> Date: Tue, 10 Nov 2009 15:01:29 -0500 Subject: [PATCH 304/306] EXT-1503 Cosmetic and Polish issues with Viewer 2.0 Internal Alphan -- Notifications with long headlines are overlapping with text --- indra/newview/skins/default/xui/en/panel_group_notify.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml index bd98996ae13..ef3120174e8 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notify.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml @@ -25,7 +25,7 @@ name="subject" text_color="GroupNotifyTextColor" font="SansSerifBig" - top="60" + top="40" use_ellipses="true" value="subject" width="300" -- GitLab From caa468a5f184a1c2dd2cd1f2c4a7aafc5acf05d0 Mon Sep 17 00:00:00 2001 From: Rick Pasetto <rick@lindenlab.com> Date: Tue, 10 Nov 2009 12:58:10 -0800 Subject: [PATCH 305/306] fix for gcc --- indra/llui/lluictrlfactory.cpp | 6 ++++++ indra/llui/lluictrlfactory.h | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp index c3c0daed0f4..8ab015f2bb8 100644 --- a/indra/llui/lluictrlfactory.cpp +++ b/indra/llui/lluictrlfactory.cpp @@ -449,3 +449,9 @@ const std::string* LLUICtrlFactory::getWidgetTag(const std::type_info* widget_ty { return LLWidgetNameRegistry::instance().getValue(widget_type); } + +// static +void LLUICtrlFactory::connect(LLView* parent, LLView* child) +{ + parent->addChild(child); +} \ No newline at end of file diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h index 0ccd3047f6c..8a9c9e23c1d 100644 --- a/indra/llui/lluictrlfactory.h +++ b/indra/llui/lluictrlfactory.h @@ -188,10 +188,15 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory> T* widget = new T(params); widget->initFromParams(params); if (parent) - parent->addChild(widget); + { + connect(parent, widget); + } return widget; } + // fix for gcc template instantiation annoyance + static void connect(LLView* parent, LLView* child); + LLView* createFromXML(LLXMLNodePtr node, LLView* parent, const std::string& filename, const widget_registry_t&, LLXMLNodePtr output_node ); template<typename T> -- GitLab From 25d8cf689aa04a1bd4ebb336714730d29040d05c Mon Sep 17 00:00:00 2001 From: Rick Pasetto <rick@lindenlab.com> Date: Tue, 10 Nov 2009 13:03:16 -0800 Subject: [PATCH 306/306] further fixes in gcc land --- indra/llui/lllayoutstack.cpp | 2 +- indra/llui/lllayoutstack.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 5999e1a29e0..9399ace1f79 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -792,7 +792,7 @@ void LLLayoutStack::calcMinExtents() //static void LLLayoutStack::updateClass() { - for (LLInstanceTracker::instance_iter it = beginInstances(); it != endInstances(); ++it) + for (LLInstanceTracker<LLLayoutStack>::instance_iter it = beginInstances(); it != endInstances(); ++it) { (*it)->updateLayout(); } diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index 8475079f5eb..3a073fa1b28 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -38,7 +38,7 @@ class LLPanel; -class LLLayoutStack : public LLView, LLInstanceTracker<LLLayoutStack> +class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack> { public: struct Params : public LLInitParam::Block<Params, LLView::Params> -- GitLab