diff options
95 files changed, 1607 insertions, 1067 deletions
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 2433c14315..f22b49f30f 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -50,14 +50,21 @@ LLFlatListView::Params::Params() allow_select("allow_select"), multi_select("multi_select"), keep_one_selected("keep_one_selected"), + keep_selection_visible_on_reshape("keep_selection_visible_on_reshape",false), no_items_text("no_items_text") {}; void LLFlatListView::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */) { + S32 delta = height - getRect().getHeight(); LLScrollContainer::reshape(width, height, called_from_parent); setItemsNoScrollWidth(width); rearrangeItems(); + + if(delta!= 0 && mKeepSelectionVisibleOnReshape) + { + ensureSelectedVisible(); + } } const LLRect& LLFlatListView::getItemsRect() const @@ -380,6 +387,7 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p) , mPrevNotifyParentRect(LLRect()) , mNoItemsCommentTextbox(NULL) , mIsConsecutiveSelection(false) + , mKeepSelectionVisibleOnReshape(p.keep_selection_visible_on_reshape) { mBorderThickness = getBorderWidth(); @@ -1218,6 +1226,8 @@ LLFlatListViewEx::LLFlatListViewEx(const Params& p) : LLFlatListView(p) , mNoFilteredItemsMsg(p.no_filtered_items_msg) , mNoItemsMsg(p.no_items_msg) +, mForceShowingUnmatchedItems(false) +, mLastFilterSucceded(false) { } @@ -1242,6 +1252,16 @@ void LLFlatListViewEx::updateNoItemsMessage(const std::string& filter_string) } +bool LLFlatListViewEx::getForceShowingUnmatchedItems() +{ + return mForceShowingUnmatchedItems; +} + +void LLFlatListViewEx::setForceShowingUnmatchedItems(bool show) +{ + mForceShowingUnmatchedItems = show; +} + void LLFlatListViewEx::setFilterSubString(const std::string& filter_str) { if (0 != LLStringUtil::compareInsensitive(filter_str, mFilterSubString)) @@ -1265,6 +1285,7 @@ void LLFlatListViewEx::filterItems() item_panel_list_t items; getItems(items); + mLastFilterSucceded = false; for (item_panel_list_t::iterator iter = items.begin(), iter_end = items.end(); @@ -1275,13 +1296,14 @@ void LLFlatListViewEx::filterItems() // i.e. we don't hide items that don't support 'match_filter' action, separators etc. if (0 == pItem->notify(action)) { + mLastFilterSucceded = true; pItem->setVisible(true); } else { // TODO: implement (re)storing of current selection. selectItem(pItem, false); - pItem->setVisible(false); + pItem->setVisible(mForceShowingUnmatchedItems); } } @@ -1289,4 +1311,9 @@ void LLFlatListViewEx::filterItems() notifyParentItemsRectChanged(); } +bool LLFlatListViewEx::wasLasFilterSuccessfull() +{ + return mLastFilterSucceded; +} + //EOF diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index f4e0426f15..caeddfc179 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -105,6 +105,9 @@ public: /** don't allow to deselect all selected items (for mouse events on items only) */ Optional<bool> keep_one_selected; + /** try to keep selection visible after reshape */ + Optional<bool> keep_selection_visible_on_reshape; + /** padding between items */ Optional<U32> item_pad; @@ -412,6 +415,8 @@ private: bool mIsConsecutiveSelection; + bool mKeepSelectionVisibleOnReshape; + /** All pairs of the list */ pairs_list_t mItemPairs; @@ -465,6 +470,10 @@ public: void setNoItemsMsg(const std::string& msg) { mNoItemsMsg = msg; } void setNoFilteredItemsMsg(const std::string& msg) { mNoFilteredItemsMsg = msg; } + bool getForceShowingUnmatchedItems(); + + void setForceShowingUnmatchedItems(bool show); + /** * Sets up new filter string and filters the list. */ @@ -476,6 +485,11 @@ public: */ void filterItems(); + /** + * Returns true if last call of filterItems() found at least one matching item + */ + bool wasLasFilterSuccessfull(); + protected: LLFlatListViewEx(const Params& p); @@ -491,6 +505,14 @@ private: std::string mNoFilteredItemsMsg; std::string mNoItemsMsg; std::string mFilterSubString; + /** + * Show list items that don't match current filter + */ + bool mForceShowingUnmatchedItems; + /** + * True if last call of filterItems() found at least one matching item + */ + bool mLastFilterSucceded; }; #endif diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index c1b2d680be..ce42cb6038 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -363,6 +363,7 @@ set(viewer_SOURCE_FILES llpaneltopinfobar.cpp llpanelvolume.cpp llpanelvolumepulldown.cpp + llpanelwearing.cpp llparcelselection.cpp llparticipantlist.cpp llpatchvertexarray.cpp @@ -830,6 +831,7 @@ set(viewer_HEADER_FILES lloutfitslist.h lloutfitobserver.h lloutputmonitorctrl.h + llpanelappearancetab.h llpanelavatar.h llpanelavatartag.h llpanelblockedlist.h @@ -883,6 +885,7 @@ set(viewer_HEADER_FILES llpaneltopinfobar.h llpanelvolume.h llpanelvolumepulldown.h + llpanelwearing.h llparcelselection.h llparticipantlist.h llpatchvertexarray.h diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 9cf0a659c1..e1a0162441 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -95,6 +95,8 @@ const F32 OBJECT_MIN_ZOOM = 0.02f; const F32 APPEARANCE_MIN_ZOOM = 0.39f; const F32 APPEARANCE_MAX_ZOOM = 8.f; +const F32 CUSTOMIZE_AVATAR_CAMERA_DEFAULT_DIST = 3.5f; + const F32 GROUND_TO_AIR_CAMERA_TRANSITION_TIME = 0.5f; const F32 GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME = 0.5f; @@ -156,7 +158,6 @@ LLAgentCamera::LLAgentCamera() : mFocusObjectOffset(), mFocusDotRadius( 0.1f ), // meters mTrackFocusObject(TRUE), - mUIOffset(0.f), mAtKey(0), // Either 1, 0, or -1... indicates that movement-key is pressed mWalkKey(0), // like AtKey, but causes less forward thrust @@ -1407,13 +1408,6 @@ void LLAgentCamera::updateCamera() // llinfos << "Current FOV Zoom: " << mCameraCurrentFOVZoomFactor << " Target FOV Zoom: " << mCameraFOVZoomFactor << " Object penetration: " << mFocusObjectDist << llendl; - F32 ui_offset = 0.f; - if( CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode ) - { - ui_offset = calcCustomizeAvatarUIOffset( camera_pos_global ); - } - - LLVector3 focus_agent = gAgent.getPosAgentFromGlobal(mFocusGlobal); mCameraPositionAgent = gAgent.getPosAgentFromGlobal(camera_pos_global); @@ -1424,9 +1418,6 @@ void LLAgentCamera::updateCamera() LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, mCameraUpVector, focus_agent); //LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, camera_skyward, focus_agent); //end Ventrella - - //RN: translate UI offset after camera is oriented properly - LLViewerCamera::getInstance()->translate(LLViewerCamera::getInstance()->getLeftAxis() * ui_offset); // Change FOV LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / (1.f + mCameraCurrentFOVZoomFactor)); @@ -1532,18 +1523,6 @@ void LLAgentCamera::validateFocusObject() } //----------------------------------------------------------------------------- -// calcCustomizeAvatarUIOffset() -//----------------------------------------------------------------------------- -F32 LLAgentCamera::calcCustomizeAvatarUIOffset(const LLVector3d& camera_pos_global) -{ - F32 ui_offset = 0.f; - - F32 range = (F32)dist_vec(camera_pos_global, getFocusGlobal()); - mUIOffset = lerp(mUIOffset, ui_offset, LLCriticalDamp::getInterpolant(0.05f)); - return mUIOffset * range; -} - -//----------------------------------------------------------------------------- // calcFocusPositionTargetGlobal() //----------------------------------------------------------------------------- LLVector3d LLAgentCamera::calcFocusPositionTargetGlobal() @@ -2332,14 +2311,24 @@ void LLAgentCamera::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL came LLVOAvatarSelf::onCustomizeStart(); } + + // default focus point for customize avatar + LLVector3 focus_target; + if (isAgentAvatarValid()) + { + focus_target = gAgentAvatarp->mHeadp->getWorldPosition(); + } + else + { + focus_target = gAgent.getPositionAgent(); + } + if (isAgentAvatarValid()) { if(avatar_animate) { - // slamming the avatar's axis to the camera so that when the rotation - // completes it correctly points to the front of the avatar // Remove any pitch or rotation from the avatar - LLVector3 at = LLViewerCamera::getInstance()->getAtAxis(); + LLVector3 at = gAgent.getAtAxis(); at.mV[VZ] = 0.f; at.normalize(); gAgent.resetAxes(at); @@ -2351,17 +2340,25 @@ void LLAgentCamera::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL came if (turn_motion) { - mAnimationDuration = turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP; + setAnimationDuration(turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP); } else { - mAnimationDuration = gSavedSettings.getF32("ZoomTime"); + setAnimationDuration(gSavedSettings.getF32("ZoomTime")); } } - // this is what sets the avatar as the mFocusTargetGlobal - setFocusGlobal(LLVector3d::zero); + LLVector3 agent_at = gAgent.getAtAxis(); + agent_at.mV[VZ] = 0.f; + agent_at.normalize(); + + LLVector3d camera_offset(agent_at * -1.0); + // push camera up and out from avatar + camera_offset.mdV[VZ] = 0.1f; + camera_offset *= CUSTOMIZE_AVATAR_CAMERA_DEFAULT_DIST; + LLVector3d focus_target_global = gAgent.getPosGlobalFromAgent(focus_target); + setCameraPosAndFocusGlobal(focus_target_global + camera_offset, focus_target_global, gAgent.getID()); gAgentAvatarp->updateMeshTextures(); } @@ -2391,6 +2388,20 @@ void LLAgentCamera::switchCameraPreset(ECameraPreset preset) // Focus point management // +void LLAgentCamera::setAnimationDuration(F32 duration) +{ + if (mCameraAnimating) + { + // do not cut any existing camera animation short + F32 animation_left = llmax(0.f, mAnimationDuration - mAnimationTimer.getElapsedTimeF32()); + mAnimationDuration = llmax(duration, animation_left); + } + else + { + mAnimationDuration = duration; + } +} + //----------------------------------------------------------------------------- // startCameraAnimation() //----------------------------------------------------------------------------- @@ -2398,9 +2409,9 @@ void LLAgentCamera::startCameraAnimation() { mAnimationCameraStartGlobal = getCameraPositionGlobal(); mAnimationFocusStartGlobal = mFocusGlobal; + setAnimationDuration(gSavedSettings.getF32("ZoomTime")); mAnimationTimer.reset(); mCameraAnimating = TRUE; - mAnimationDuration = gSavedSettings.getF32("ZoomTime"); } //----------------------------------------------------------------------------- @@ -2546,12 +2557,6 @@ void LLAgentCamera::setCameraPosAndFocusGlobal(const LLVector3d& camera_pos, con if (focus_delta_squared > ANIM_EPSILON_SQUARED) { startCameraAnimation(); - - if (CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode) - { - // Compensate for the fact that the camera has already been offset to make room for LLFloaterCustomize. - mAnimationCameraStartGlobal -= LLVector3d(LLViewerCamera::getInstance()->getLeftAxis() * calcCustomizeAvatarUIOffset( mAnimationCameraStartGlobal )); - } } //LLViewerCamera::getInstance()->setOrigin( gAgent.getPosAgentFromGlobal( camera_pos ) ); diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h index 7afb5c0ed9..3b8f88733a 100644 --- a/indra/newview/llagentcamera.h +++ b/indra/newview/llagentcamera.h @@ -137,7 +137,6 @@ public: F32 getCameraMinOffGround(); // Minimum height off ground for this mode, meters void setCameraCollidePlane(const LLVector4 &plane) { mCameraCollidePlane = plane; } BOOL calcCameraMinDistance(F32 &obj_min_distance); - F32 calcCustomizeAvatarUIOffset(const LLVector3d& camera_pos_global); F32 getCurrentCameraBuildOffset() { return (F32)mCameraFocusOffset.length(); } void clearCameraLag() { mCameraLag.clearVec(); } private: @@ -184,7 +183,7 @@ private: public: void setCameraAnimating(BOOL b) { mCameraAnimating = b; } BOOL getCameraAnimating() { return mCameraAnimating; } - void setAnimationDuration(F32 seconds) { mAnimationDuration = seconds; } + void setAnimationDuration(F32 seconds); void startCameraAnimation(); void stopCameraAnimation(); private: @@ -225,7 +224,6 @@ private: LLVector3 mFocusObjectOffset; F32 mFocusDotRadius; // Meters BOOL mTrackFocusObject; - F32 mUIOffset; //-------------------------------------------------------------------- // Lookat / Pointat diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 5728256dba..017fcf6e2b 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -48,7 +48,6 @@ #include "llmd5.h" #include "llnotificationsutil.h" #include "lloutfitobserver.h" -#include "llpaneloutfitsinventory.h" #include "llsidepanelappearance.h" #include "llsidetray.h" #include "lltexlayer.h" @@ -1232,45 +1231,6 @@ void LLAgentWearables::createStandardWearablesAllDone() gAgentAvatarp->onFirstTEMessageReceived(); } - -class LLShowCreatedOutfit: public LLInventoryCallback -{ -public: - LLShowCreatedOutfit(LLUUID& folder_id): - mFolderID(folder_id) - { - } - - virtual ~LLShowCreatedOutfit() - { - LLSD key; - LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); - LLPanelOutfitsInventory *outfit_panel = - dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); - // TODO: add handling "My Outfits" tab. - if (outfit_panel && outfit_panel->isCOFPanelActive()) - { - outfit_panel->getRootFolder()->clearSelection(); - outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE); - } - LLAccordionCtrlTab* tab_outfits = outfit_panel ? outfit_panel->findChild<LLAccordionCtrlTab>("tab_outfits") : 0; - if (tab_outfits && !tab_outfits->getDisplayChildren()) - { - tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren()); - } - - LLAppearanceMgr::instance().updateIsDirty(); - LLAppearanceMgr::instance().updatePanelOutfitName(""); - } - - virtual void fire(const LLUUID&) - { - } - -private: - LLUUID mFolderID; -}; - void LLAgentWearables::makeNewOutfitDone(S32 type, U32 index) { LLUUID first_item_id = getWearableItemID((LLWearableType::EType)type, index); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 3947be49bb..ce022ac840 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -45,7 +45,7 @@ #include "llinventoryobserver.h" #include "llnotificationsutil.h" #include "lloutfitobserver.h" -#include "llpaneloutfitsinventory.h" +#include "lloutfitslist.h" #include "llselectmgr.h" #include "llsidepanelappearance.h" #include "llsidetray.h" @@ -935,7 +935,9 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up // That means subscribers will be notified that loading is done after first item in a batch is worn. // (loading indicator disappears for example before all selected items are worn) // Have not fix this issue for 2.1 because of stability reason. EXT-7777. - gAgentWearables.notifyLoadingStarted(); + + // Disabled for now because it is *not* acceptable to call updateAppearanceFromCOF() multiple times +// gAgentWearables.notifyLoadingStarted(); LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear); if (!item_to_wear) return false; @@ -1697,9 +1699,10 @@ void LLAppearanceMgr::getUserDescendents(const LLUUID& category, void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append) { - gAgentWearables.notifyLoadingStarted(); if(!category) return; + gAgentWearables.notifyLoadingStarted(); + llinfos << "wearInventoryCategory( " << category->getName() << " )" << llendl; @@ -2305,18 +2308,11 @@ public: { LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); } - LLPanelOutfitsInventory *outfit_panel = - dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); - if (outfit_panel) - { - outfit_panel->getRootFolder()->clearSelection(); - outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE); - } - - LLAccordionCtrlTab* tab_outfits = outfit_panel ? outfit_panel->findChild<LLAccordionCtrlTab>("tab_outfits") : 0; - if (tab_outfits && !tab_outfits->getDisplayChildren()) + LLOutfitsList *outfits_list = + dynamic_cast<LLOutfitsList*>(LLSideTray::getInstance()->getPanel("outfitslist_tab")); + if (outfits_list) { - tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren()); + outfits_list->setSelectedOutfitByUUID(mFolderID); } LLAppearanceMgr::getInstance()->updateIsDirty(); @@ -2546,7 +2542,8 @@ void LLAppearanceMgr::registerAttachment(const LLUUID& item_id) { // we have to pass do_update = true to call LLAppearanceMgr::updateAppearanceFromCOF. // it will trigger gAgentWariables.notifyLoadingFinished() - LLAppearanceMgr::addCOFItemLink(item_id, true); // Add COF link for item. + // But it is not acceptable solution. See EXT-7777 + LLAppearanceMgr::addCOFItemLink(item_id, false); // Add COF link for item. } else { @@ -2576,7 +2573,7 @@ void LLAppearanceMgr::linkRegisteredAttachments() ++it) { LLUUID item_id = *it; - addCOFItemLink(item_id, true); + addCOFItemLink(item_id, false); } mRegisteredAttachments.clear(); } diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index ab4ff1bcfc..61779d5c0e 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -34,10 +34,12 @@ #define LL_LLAPPEARANCEMGR_H #include "llsingleton.h" + +#include "llagentwearables.h" +#include "llcallbacklist.h" #include "llinventorymodel.h" #include "llinventoryobserver.h" #include "llviewerinventory.h" -#include "llcallbacklist.h" class LLWearable; class LLWearableHoldingPattern; @@ -360,6 +362,9 @@ public: << llendl; //dec_busy_count(); gInventory.removeObserver(this); + + // lets notify observers that loading is finished. + gAgentWearables.notifyLoadingFinished(); delete this; return; } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index afaeddaaeb..a5f24c55fe 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -72,7 +72,6 @@ #include "llviewerwindow.h" #include "llvoavatarself.h" #include "llwearablelist.h" -#include "llpaneloutfitsinventory.h" typedef std::pair<LLUUID, LLUUID> two_uuids_t; typedef std::list<two_uuids_t> two_uuids_list_t; @@ -511,17 +510,6 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, { const LLInventoryObject *obj = getInventoryObject(); - bool is_sidepanel = isInOutfitsSidePanel(); - if (is_sidepanel) - { - // Sidepanel includes restricted menu. - if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID)) - { - items.push_back(std::string("Remove Link")); - } - return; - } - if (obj) { if (obj->getIsLinkType()) @@ -948,16 +936,6 @@ void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid) } } -BOOL LLInvFVBridge::isInOutfitsSidePanel() const -{ - LLInventoryPanel *my_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - LLPanelOutfitsInventory *outfit_panel = - dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); - if (!outfit_panel) - return FALSE; - return outfit_panel->isTabPanel(my_panel); -} - BOOL LLInvFVBridge::canShare() const { const LLInventoryModel* model = getInventoryModel(); @@ -2430,17 +2408,8 @@ void LLFolderBridge::folderOptionsMenu() const bool is_ensemble = (type == LLFolderType::FT_NONE || LLFolderType::lookupIsEnsembleType(type)); - // calling card related functionality for folders. - - const bool is_sidepanel = isInOutfitsSidePanel(); - if (is_sidepanel) - { - mItems.push_back("Rename"); - addDeleteContextMenuOptions(mItems, disabled_items); - } - // Only enable calling-card related options for non-system folders. - if (!is_sidepanel && !is_system_folder) + if (!is_system_folder) { LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD); if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard)) @@ -2469,10 +2438,7 @@ void LLFolderBridge::folderOptionsMenu() checkFolderForContentsOfType(model, is_object) || checkFolderForContentsOfType(model, is_gesture) ) { - if (!is_sidepanel) - { - mItems.push_back(std::string("Folder Wearables Separator")); - } + mItems.push_back(std::string("Folder Wearables Separator")); // Only enable add/replace outfit for non-system folders. if (!is_system_folder) @@ -3763,13 +3729,6 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { disabled_items.push_back(std::string("Share")); } - bool is_sidepanel = isInOutfitsSidePanel(); - - if (!is_sidepanel) - { - addOpenRightClickMenuOption(items); - items.push_back(std::string("Properties")); - } getClipboardEntries(true, items, disabled_items, flags); @@ -4071,12 +4030,8 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { disabled_items.push_back(std::string("Share")); } - bool is_sidepanel = isInOutfitsSidePanel(); - if (!is_sidepanel) - { - items.push_back(std::string("Properties")); - } + items.push_back(std::string("Properties")); getClipboardEntries(true, items, disabled_items, flags); @@ -4431,24 +4386,17 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { disabled_items.push_back(std::string("Share")); } - bool is_sidepanel = isInOutfitsSidePanel(); - if (can_open && !is_sidepanel) + if (can_open) { addOpenRightClickMenuOption(items); } - if (!is_sidepanel) - { - items.push_back(std::string("Properties")); - } + items.push_back(std::string("Properties")); getClipboardEntries(true, items, disabled_items, flags); - if (!is_sidepanel) - { - items.push_back(std::string("Wearable Separator")); - } + items.push_back(std::string("Wearable Separator")); items.push_back(std::string("Wearable Edit")); diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 64d0f8d254..97e87c2f3b 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -74,7 +74,6 @@ public: U32 flags = 0x00); virtual ~LLInvFVBridge() {} - BOOL isInOutfitsSidePanel() const; // allow context menus to be customized for side panel BOOL canShare() const; //-------------------------------------------------------------------- diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index 957e88960d..a43118755e 100644 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -435,12 +435,12 @@ void LLManip::renderXYZ(const LLVector3 &vec) S32 vertical_offset = window_center_y - VERTICAL_OFFSET; - glPushMatrix(); + gGL.pushMatrix(); { LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square"); gViewerWindow->setup2DRender(); const LLVector2& display_scale = gViewerWindow->getDisplayScale(); - glScalef(display_scale.mV[VX], display_scale.mV[VY], 1.f); + gGL.scalef(display_scale.mV[VX], display_scale.mV[VY], 1.f); gGL.color4f(0.f, 0.f, 0.f, 0.7f); imagep->draw( @@ -450,7 +450,7 @@ void LLManip::renderXYZ(const LLVector3 &vec) PAD * 2 + 10, LLColor4(0.f, 0.f, 0.f, 0.7f) ); } - glPopMatrix(); + gGL.popMatrix(); gViewerWindow->setup3DRender(); diff --git a/indra/newview/llmorphview.cpp b/indra/newview/llmorphview.cpp index 4c28e98e62..61fc932bab 100644 --- a/indra/newview/llmorphview.cpp +++ b/indra/newview/llmorphview.cpp @@ -75,7 +75,6 @@ LLMorphView::LLMorphView(const LLMorphView::Params& p) mOldCameraNearClip( 0.f ), mCameraPitch( 0.f ), mCameraYaw( 0.f ), - mCameraDist( -1.f ), mCameraDrivenByKeys( FALSE ) {} @@ -86,7 +85,6 @@ void LLMorphView::initialize() { mCameraPitch = 0.f; mCameraYaw = 0.f; - mCameraDist = -1.f; if (!isAgentAvatarValid() || gAgentAvatarp->isDead()) { diff --git a/indra/newview/llmorphview.h b/indra/newview/llmorphview.h index 493f906c6b..f0f04dfda3 100644 --- a/indra/newview/llmorphview.h +++ b/indra/newview/llmorphview.h @@ -53,7 +53,6 @@ public: }; LLMorphView(const LLMorphView::Params&); - void initialize(); void shutdown(); // inherited methods @@ -64,12 +63,13 @@ public: void setCameraOffset(const LLVector3d& camera_offset) {mCameraOffset = camera_offset;} void setCameraTargetOffset(const LLVector3d& camera_target_offset) {mCameraTargetOffset = camera_target_offset;} - void setCameraDistToDefault() { mCameraDist = -1.f; } void updateCamera(); void setCameraDrivenByKeys( BOOL b ); protected: + void initialize(); + LLJoint* mCameraTargetJoint; LLVector3d mCameraOffset; LLVector3d mCameraTargetOffset; @@ -82,9 +82,6 @@ protected: F32 mCameraPitch; F32 mCameraYaw; - // camera zoom - F32 mCameraDist; - BOOL mCameraDrivenByKeys; }; diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 6542afc366..67442dd573 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -70,7 +70,148 @@ bool LLOutfitTabNameComparator::compare(const LLAccordionCtrlTab* tab1, const LL ////////////////////////////////////////////////////////////////////////// -class OutfitContextMenu : public LLListContextMenu +class LLOutfitListGearMenu +{ +public: + LLOutfitListGearMenu(LLOutfitsList* olist) + : mOutfitList(olist), + mMenu(NULL) + { + llassert_always(mOutfitList); + + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + + registrar.add("Gear.Wear", boost::bind(&LLOutfitListGearMenu::onWear, this)); + registrar.add("Gear.TakeOff", boost::bind(&LLOutfitListGearMenu::onTakeOff, this)); + registrar.add("Gear.Rename", boost::bind(&LLOutfitListGearMenu::onRename, this)); + registrar.add("Gear.Delete", boost::bind(&LLOutfitListGearMenu::onDelete, this)); + registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenu::onCreate, this, _2)); + + enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitsList::isActionEnabled, mOutfitList, _2)); + enable_registrar.add("Gear.OnVisible", boost::bind(&LLOutfitListGearMenu::onVisible, this, _2)); + + mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>( + "menu_outfit_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + llassert(mMenu); + } + + void show(LLView* spawning_view) + { + if (!mMenu) return; + + updateItemsVisibility(); + mMenu->buildDrawLabels(); + mMenu->updateParent(LLMenuGL::sMenuContainer); + S32 menu_x = 0; + S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight(); + LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y); + } + + void updateItemsVisibility() + { + if (!mMenu) return; + + bool have_selection = getSelectedOutfitID().notNull(); + mMenu->setItemVisible("sepatator1", have_selection); + mMenu->setItemVisible("sepatator2", have_selection); + mMenu->arrangeAndClear(); // update menu height + } + +private: + const LLUUID& getSelectedOutfitID() + { + return mOutfitList->getSelectedOutfitUUID(); + } + + LLViewerInventoryCategory* getSelectedOutfit() + { + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + if (selected_outfit_id.isNull()) + { + return NULL; + } + + LLViewerInventoryCategory* cat = gInventory.getCategory(selected_outfit_id); + return cat; + } + + void onWear() + { + LLViewerInventoryCategory* selected_outfit = getSelectedOutfit(); + if (selected_outfit) + { + LLAppearanceMgr::instance().wearInventoryCategory( + selected_outfit, /*copy=*/ FALSE, /*append=*/ FALSE); + } + } + + void onTakeOff() + { + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + if (selected_outfit_id.notNull()) + { + LLAppearanceMgr::instance().takeOffOutfit(selected_outfit_id); + } + } + + void onRename() + { + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + if (selected_outfit_id.notNull()) + { + LLAppearanceMgr::instance().renameOutfit(selected_outfit_id); + } + } + + void onDelete() + { + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + if (selected_outfit_id.notNull()) + { + remove_category(&gInventory, selected_outfit_id); + } + } + + void onCreate(const LLSD& data) + { + LLWearableType::EType type = LLWearableType::typeNameToType(data.asString()); + if (type == LLWearableType::WT_NONE) + { + llwarns << "Invalid wearable type" << llendl; + return; + } + + LLAgentWearables::createWearable(type, true); + } + + bool onVisible(LLSD::String param) + { + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + if (selected_outfit_id.isNull()) // no selection or invalid outfit selected + { + return false; + } + + // *TODO This condition leads to menu item behavior inconsistent with + // "Wear" button behavior and should be modified or removed. + bool is_worn = LLAppearanceMgr::instance().getBaseOutfitUUID() == selected_outfit_id; + + if ("wear" == param) + { + return !is_worn; + } + + return true; + } + + LLOutfitsList* mOutfitList; + LLMenuGL* mMenu; +}; + +////////////////////////////////////////////////////////////////////////// + +class LLOutfitContextMenu : public LLListContextMenu { protected: /* virtual */ LLContextMenu* createMenu() @@ -89,8 +230,8 @@ protected: registrar.add("Outfit.Rename", boost::bind(renameOutfit, selected_id)); registrar.add("Outfit.Delete", boost::bind(deleteOutfit, selected_id)); - enable_registrar.add("Outfit.OnEnable", boost::bind(&OutfitContextMenu::onEnable, this, _2)); - enable_registrar.add("Outfit.OnVisible", boost::bind(&OutfitContextMenu::onVisible, this, _2)); + enable_registrar.add("Outfit.OnEnable", boost::bind(&LLOutfitContextMenu::onEnable, this, _2)); + enable_registrar.add("Outfit.OnVisible", boost::bind(&LLOutfitContextMenu::onVisible, this, _2)); return createFromFile("menu_outfit_tab.xml"); } @@ -103,8 +244,13 @@ protected: { return get_is_category_renameable(&gInventory, outfit_cat_id); } + else if ("wear_replace" == param) + { + return !gAgentWearables.isCOFChangeInProgress(); + } else if ("wear_add" == param) { + if (gAgentWearables.isCOFChangeInProgress()) return false; return LLAppearanceMgr::getCanAddToCOF(outfit_cat_id); } else if ("take_off" == param) @@ -157,7 +303,7 @@ protected: static LLRegisterPanelClassWrapper<LLOutfitsList> t_outfits_list("outfits_list"); LLOutfitsList::LLOutfitsList() - : LLPanel() + : LLPanelAppearanceTab() , mAccordion(NULL) , mListCommands(NULL) , mIsInitialized(false) @@ -165,11 +311,13 @@ LLOutfitsList::LLOutfitsList() { mCategoriesObserver = new LLInventoryCategoriesObserver(); - mOutfitMenu = new OutfitContextMenu(); + mGearMenu = new LLOutfitListGearMenu(this); + mOutfitMenu = new LLOutfitContextMenu(); } LLOutfitsList::~LLOutfitsList() { + delete mGearMenu; delete mOutfitMenu; if (gInventory.containsObserver(mCategoriesObserver)) @@ -291,6 +439,9 @@ void LLOutfitsList::refreshList(const LLUUID& category_id) // Setting callback to reset items selection inside outfit on accordion collapsing and expanding (EXT-7875) tab->setDropDownStateChangedCallback(boost::bind(&LLOutfitsList::resetItemSelection, this, list, cat_id)); + // force showing list items that don't match current filter(EXT-7158) + list->setForceShowingUnmatchedItems(true); + // Setting list commit callback to monitor currently selected wearable item. list->setCommitCallback(boost::bind(&LLOutfitsList::onSelectionChange, this, _1)); @@ -308,7 +459,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id) // If filter is currently applied we store the initial tab state and // open it to show matched items if any. - if (!mFilterSubString.empty()) + if (!sFilterSubString.empty()) { tab->notifyChildren(LLSD().with("action","store_state")); tab->setDisplayChildren(true); @@ -318,7 +469,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id) // filter to the newly added list. list->setForceRefresh(true); - list->setFilterSubString(mFilterSubString); + list->setFilterSubString(sFilterSubString); } } @@ -410,14 +561,84 @@ void LLOutfitsList::performAction(std::string action) } } +void LLOutfitsList::removeSelected() +{ + if (mSelectedOutfitUUID.notNull()) + { + remove_category(&gInventory, mSelectedOutfitUUID); + } +} + +void LLOutfitsList::setSelectedOutfitByUUID(const LLUUID& outfit_uuid) +{ + for (outfits_map_t::iterator iter = mOutfitsMap.begin(); + iter != mOutfitsMap.end(); + ++iter) + { + if (outfit_uuid == iter->first) + { + LLAccordionCtrlTab* tab = iter->second; + if (!tab) continue; + + LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); + if (!list) continue; + + tab->setFocus(TRUE); + changeOutfitSelection(list, outfit_uuid); + + tab->setDisplayChildren(true); + } + } +} + +// virtual void LLOutfitsList::setFilterSubString(const std::string& string) { applyFilter(string); - mFilterSubString = string; + sFilterSubString = string; } -boost::signals2::connection LLOutfitsList::addSelectionChangeCallback(selection_change_callback_t cb) +// virtual +bool LLOutfitsList::isActionEnabled(const LLSD& userdata) +{ + if (mSelectedOutfitUUID.isNull()) return false; + + const std::string command_name = userdata.asString(); + if (command_name == "delete") + { + return !mItemSelected && LLAppearanceMgr::instance().getCanRemoveOutfit(mSelectedOutfitUUID); + } + if (command_name == "rename") + { + return get_is_category_renameable(&gInventory, mSelectedOutfitUUID); + } + if (command_name == "save_outfit") + { + bool outfit_locked = LLAppearanceMgr::getInstance()->isOutfitLocked(); + bool outfit_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty(); + // allow save only if outfit isn't locked and is dirty + return !outfit_locked && outfit_dirty; + } + if (command_name == "wear") + { + return !gAgentWearables.isCOFChangeInProgress(); + } + if (command_name == "take_off") + { + return LLAppearanceMgr::getInstance()->getBaseOutfitUUID() == mSelectedOutfitUUID; + } + return false; +} + +// virtual +void LLOutfitsList::showGearMenu(LLView* spawning_view) +{ + if (!mGearMenu) return; + mGearMenu->show(spawning_view); +} + +boost::signals2::connection LLOutfitsList::setSelectionChangeCallback(selection_change_callback_t cb) { return mSelectionChangeSignal.connect(cb); } @@ -553,7 +774,7 @@ void LLOutfitsList::restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID void LLOutfitsList::onFilteredWearableItemsListRefresh(LLUICtrl* ctrl) { - if (!ctrl || mFilterSubString.empty()) + if (!ctrl || sFilterSubString.empty()) return; for (outfits_map_t::iterator @@ -567,7 +788,7 @@ void LLOutfitsList::onFilteredWearableItemsListRefresh(LLUICtrl* ctrl) LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView()); if (list != ctrl) continue; - applyFilterToTab(iter->first, tab, mFilterSubString); + applyFilterToTab(iter->first, tab, sFilterSubString); } } @@ -583,7 +804,7 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring) LLAccordionCtrlTab* tab = iter->second; if (!tab) continue; - bool more_restrictive = mFilterSubString.size() < new_filter_substring.size() && !new_filter_substring.substr(0, mFilterSubString.size()).compare(mFilterSubString); + bool more_restrictive = sFilterSubString.size() < new_filter_substring.size() && !new_filter_substring.substr(0, sFilterSubString.size()).compare(sFilterSubString); // Restore tab visibility in case of less restrictive filter // to compare it with updated string if it was previously hidden. @@ -598,7 +819,7 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring) list->setFilterSubString(new_filter_substring); } - if(mFilterSubString.empty() && !new_filter_substring.empty()) + if(sFilterSubString.empty() && !new_filter_substring.empty()) { //store accordion tab state when filter is not empty tab->notifyChildren(LLSD().with("action","store_state")); @@ -632,6 +853,8 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring) restoreOutfitSelection(tab, iter->first); } } + + mAccordion->arrange(); } void LLOutfitsList::applyFilterToTab( @@ -655,7 +878,7 @@ void LLOutfitsList::applyFilterToTab( { // hide tab if its title doesn't pass filter // and it has no visible items - tab->setVisible(list->size() > 0); + tab->setVisible(list->wasLasFilterSuccessfull()); // remove title highlighting because it might // have been previously highlighted by less restrictive filter @@ -696,7 +919,7 @@ void LLOutfitsList::onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y) uuid_vec_t selected_uuids; - // Collect seleted items from all selected lists. + // Collect selected items from all selected lists. for (wearables_lists_map_t::iterator iter = mSelectedListsMap.begin(); iter != mSelectedListsMap.end(); ++iter) diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index a6b9a66836..d207624792 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -37,12 +37,15 @@ // newview #include "llinventorymodel.h" -#include "llinventoryobserver.h" +#include "llpanelappearancetab.h" class LLAccordionCtrlTab; +class LLInventoryCategoriesObserver; +class LLOutfitListGearMenu; class LLWearableItemsList; class LLListContextMenu; + /** * @class LLOutfitTabNameComparator * @@ -66,9 +69,9 @@ public: * which displays each outfit in an accordion tab with a flat list * of items inside it. * - * Starts fetching nevessary inventory content on first openning. + * Starts fetching necessary inventory content on first opening. */ -class LLOutfitsList : public LLPanel +class LLOutfitsList : public LLPanelAppearanceTab { public: typedef boost::function<void (const LLUUID&)> selection_change_callback_t; @@ -88,11 +91,19 @@ public: void performAction(std::string action); - void setFilterSubString(const std::string& string); + void removeSelected(); + + void setSelectedOutfitByUUID(const LLUUID& outfit_uuid); + + /*virtual*/ void setFilterSubString(const std::string& string); + + /*virtual*/ bool isActionEnabled(const LLSD& userdata); + + /*virtual*/ void showGearMenu(LLView* spawning_view); const LLUUID& getSelectedOutfitUUID() const { return mSelectedOutfitUUID; } - boost::signals2::connection addSelectionChangeCallback(selection_change_callback_t cb); + boost::signals2::connection setSelectionChangeCallback(selection_change_callback_t cb); /** * Returns true if there is a selection inside currently selected outfit @@ -184,13 +195,12 @@ private: LLUUID mHighlightedOutfitUUID; selection_change_signal_t mSelectionChangeSignal; - std::string mFilterSubString; - typedef std::map<LLUUID, LLAccordionCtrlTab*> outfits_map_t; typedef outfits_map_t::value_type outfits_map_value_t; outfits_map_t mOutfitsMap; - LLListContextMenu* mOutfitMenu; + LLOutfitListGearMenu* mGearMenu; + LLListContextMenu* mOutfitMenu; bool mIsInitialized; /** diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h index c2f8dbd074..f1901a63a4 100644 --- a/indra/newview/llpanelappearancetab.h +++ b/indra/newview/llpanelappearancetab.h @@ -1,6 +1,6 @@ /** - * @file llpanelplacestab.h - * @brief Tabs interface for Side Bar "Places" panel + * @file llpanelappearancetab.h + * @brief Tabs interface for Side Bar "My Appearance" panel * * $LicenseInfo:firstyear=2009&license=viewergpl$ * @@ -34,28 +34,22 @@ #include "llpanel.h" -#include "llpanelappearance.h" - class LLPanelAppearanceTab : public LLPanel { public: - LLPanelAppearanceTab(LLPanelAppearance *parent) : - LLPanel(), - mParent(parent) - {} + LLPanelAppearanceTab() : LLPanel() {} virtual ~LLPanelAppearanceTab() {} - virtual void onSearchEdit(const std::string& string) = 0; - virtual void updateVerbs() = 0; // Updates buttons at the bottom of Appearance panel - virtual void onWear() = 0; - virtual void onEdit() = 0; - virtual void onNew() = 0; + virtual void setFilterSubString(const std::string& string) = 0; + + virtual bool isActionEnabled(const LLSD& userdata) = 0; - bool isTabVisible(); // Check if parent TabContainer is visible. + virtual void showGearMenu(LLView* spawning_view) = 0; + static const std::string& getFilterSubString() { return sFilterSubString; } protected: - LLPanelAppearance* mParent; + static std::string sFilterSubString; }; #endif //LL_LLPANELAPPEARANCETAB_H diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 71edd39348..ae54909945 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -1127,7 +1127,6 @@ void LLPanelEditWearable::changeCamera(U8 subpart) } // Update the camera - gMorphView->setCameraDistToDefault(); gMorphView->setCameraTargetJoint( gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ) ); gMorphView->setCameraTargetOffset( subpart_entry->mTargetOffset ); gMorphView->setCameraOffset( subpart_entry->mCameraOffset ); diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index aac020087b..ea7d233333 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -328,7 +328,8 @@ BOOL LLPanelOutfitEdit::postBuild() childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesListView, this), NULL); childSetCommitCallback("wearables_gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL); childSetCommitCallback("gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL); - childSetCommitCallback("shop_btn", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL); + childSetCommitCallback("shop_btn_1", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL); + childSetCommitCallback("shop_btn_2", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL); mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list"); mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::filterWearablesBySelectedItem, this)); diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index d382c77430..2f1cad8a75 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -33,216 +33,32 @@ #include "llpaneloutfitsinventory.h" -#include "llagent.h" -#include "llagentwearables.h" -#include "llappearancemgr.h" +#include "llnotificationsutil.h" +#include "lltabcontainer.h" -#include "llbutton.h" -#include "llfloaterreg.h" -#include "llfloaterworldmap.h" -#include "llfloaterinventory.h" -#include "llfoldervieweventlistener.h" -#include "llinventorybridge.h" #include "llinventoryfunctions.h" #include "llinventorymodelbackgroundfetch.h" -#include "llinventorypanel.h" -#include "lllandmark.h" -#include "lllineeditor.h" -#include "llmodaldialog.h" -#include "llnotificationsutil.h" +#include "llagentwearables.h" +#include "llappearancemgr.h" #include "lloutfitobserver.h" #include "lloutfitslist.h" +#include "llpanelwearing.h" #include "llsaveoutfitcombobtn.h" #include "llsidepanelappearance.h" #include "llsidetray.h" -#include "lltabcontainer.h" #include "llviewerfoldertype.h" -#include "llviewerjointattachment.h" -#include "llvoavatarself.h" - -// List Commands -#include "lldndbutton.h" -#include "llmenugl.h" -#include "llviewermenu.h" - -#include "llviewercontrol.h" static const std::string OUTFITS_TAB_NAME = "outfitslist_tab"; static const std::string COF_TAB_NAME = "cof_tab"; static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory"); -class LLOutfitListGearMenu -{ -public: - LLOutfitListGearMenu(LLOutfitsList* olist) - : mOutfitList(olist), - mMenu(NULL) - { - llassert_always(mOutfitList); - - LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; - LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; - - registrar.add("Gear.Wear", boost::bind(&LLOutfitListGearMenu::onWear, this)); - registrar.add("Gear.TakeOff", boost::bind(&LLOutfitListGearMenu::onTakeOff, this)); - registrar.add("Gear.Rename", boost::bind(&LLOutfitListGearMenu::onRename, this)); - registrar.add("Gear.Delete", boost::bind(&LLOutfitListGearMenu::onDelete, this)); - registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenu::onCreate, this, _2)); - - enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitListGearMenu::onEnable, this, _2)); - enable_registrar.add("Gear.OnVisible", boost::bind(&LLOutfitListGearMenu::onVisible, this, _2)); - - mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>( - "menu_outfit_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - llassert(mMenu); - } - - LLMenuGL* getMenu() { return mMenu; } - - void show(LLView* spawning_view) - { - if (!mMenu) return; - - updateItemsVisibility(); - mMenu->buildDrawLabels(); - mMenu->updateParent(LLMenuGL::sMenuContainer); - S32 menu_x = 0; - S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight(); - LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y); - } - - void updateItemsVisibility() - { - if (!mMenu) return; - - bool have_selection = getSelectedOutfitID().notNull(); - mMenu->setItemVisible("sepatator1", have_selection); - mMenu->setItemVisible("sepatator2", have_selection); - mMenu->arrangeAndClear(); // update menu height - } - -private: - const LLUUID& getSelectedOutfitID() - { - return mOutfitList->getSelectedOutfitUUID(); - } - - LLViewerInventoryCategory* getSelectedOutfit() - { - const LLUUID& selected_outfit_id = getSelectedOutfitID(); - if (selected_outfit_id.isNull()) - { - return NULL; - } - - LLViewerInventoryCategory* cat = gInventory.getCategory(selected_outfit_id); - return cat; - } - - void onWear() - { - LLViewerInventoryCategory* selected_outfit = getSelectedOutfit(); - if (selected_outfit) - { - LLAppearanceMgr::instance().wearInventoryCategory( - selected_outfit, /*copy=*/ FALSE, /*append=*/ FALSE); - } - } - - void onTakeOff() - { - const LLUUID& selected_outfit_id = getSelectedOutfitID(); - if (selected_outfit_id.notNull()) - { - LLAppearanceMgr::instance().takeOffOutfit(selected_outfit_id); - } - } - - void onRename() - { - const LLUUID& selected_outfit_id = getSelectedOutfitID(); - if (selected_outfit_id.notNull()) - { - LLAppearanceMgr::instance().renameOutfit(selected_outfit_id); - } - } - - void onDelete() - { - const LLUUID& selected_outfit_id = getSelectedOutfitID(); - if (selected_outfit_id.notNull()) - { - remove_category(&gInventory, selected_outfit_id); - } - } - - void onCreate(const LLSD& data) - { - LLWearableType::EType type = LLWearableType::typeNameToType(data.asString()); - if (type == LLWearableType::WT_NONE) - { - llwarns << "Invalid wearable type" << llendl; - return; - } - - LLAgentWearables::createWearable(type, true); - } - - bool onEnable(LLSD::String param) - { - const LLUUID& selected_outfit_id = getSelectedOutfitID(); - if (selected_outfit_id.isNull()) // no selection or invalid outfit selected - { - return false; - } - - if ("rename" == param) - { - return get_is_category_renameable(&gInventory, selected_outfit_id); - } - else if ("delete" == param) - { - return LLAppearanceMgr::instance().getCanRemoveOutfit(selected_outfit_id); - } - else if ("take_off" == param) - { - return LLAppearanceMgr::getCanRemoveFromCOF(selected_outfit_id); - } - - return true; - } - - bool onVisible(LLSD::String param) - { - const LLUUID& selected_outfit_id = getSelectedOutfitID(); - if (selected_outfit_id.isNull()) // no selection or invalid outfit selected - { - return false; - } - - bool is_worn = LLAppearanceMgr::instance().getBaseOutfitUUID() == selected_outfit_id; - - if ("wear" == param) - { - return !is_worn; - } - - return true; - } - - LLOutfitsList* mOutfitList; - LLMenuGL* mMenu; -}; - LLPanelOutfitsInventory::LLPanelOutfitsInventory() : mMyOutfitsPanel(NULL), mCurrentOutfitPanel(NULL), - mGearMenu(NULL), + mActivePanel(NULL), mInitialized(false) { - mSavedFolderState = new LLSaveFolderState(); - mSavedFolderState->setApply(FALSE); gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoaded, this)); gAgentWearables.addLoadingStartedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoading, this)); @@ -254,8 +70,6 @@ LLPanelOutfitsInventory::LLPanelOutfitsInventory() : LLPanelOutfitsInventory::~LLPanelOutfitsInventory() { - delete mGearMenu; - delete mSavedFolderState; } // virtual @@ -297,7 +111,8 @@ void LLPanelOutfitsInventory::onOpen(const LLSD& key) // and update verbs. onTabChange(); - // Auto open the first outfit newly created so new users can see sample outfit contents + // *TODO: Auto open the first outfit newly created so new users can see sample outfit contents + /* static bool should_open_outfit = true; if (should_open_outfit && gAgent.isFirstLogin()) { @@ -317,6 +132,7 @@ void LLPanelOutfitsInventory::onOpen(const LLSD& key) } } should_open_outfit = false; + */ } void LLPanelOutfitsInventory::updateVerbs() @@ -330,93 +146,30 @@ void LLPanelOutfitsInventory::updateVerbs() // virtual void LLPanelOutfitsInventory::onSearchEdit(const std::string& string) { - mFilterSubString = string; + if (!mActivePanel) return; - // TODO: add handling "My Outfits" tab. - if (!isCOFPanelActive()) - { - mMyOutfitsPanel->setFilterSubString(string); - return; - } + mFilterSubString = string; if (string == "") { - getActivePanel()->setFilterSubString(LLStringUtil::null); - - // re-open folders that were initially open - mSavedFolderState->setApply(TRUE); - getRootFolder()->applyFunctorRecursively(*mSavedFolderState); - LLOpenFoldersWithSelection opener; - getRootFolder()->applyFunctorRecursively(opener); - getRootFolder()->scrollToShowSelection(); + mActivePanel->setFilterSubString(LLStringUtil::null); } LLInventoryModelBackgroundFetch::instance().start(); - if (getActivePanel()->getFilterSubString().empty() && string.empty()) + if (mActivePanel->getFilterSubString().empty() && string.empty()) { // current filter and new filter empty, do nothing return; } - // save current folder open state if no filter currently applied - if (getRootFolder()->getFilterSubString().empty()) - { - mSavedFolderState->setApply(FALSE); - getRootFolder()->applyFunctorRecursively(*mSavedFolderState); - } - // set new filter string - getActivePanel()->setFilterSubString(string); + mActivePanel->setFilterSubString(string); } void LLPanelOutfitsInventory::onWearButtonClick() { - // TODO: Remove if/else, add common interface - // for "My Outfits" and "Wearing" tabs. - if (!isCOFPanelActive()) - { - mMyOutfitsPanel->performAction("replaceoutfit"); - } - else - { - LLFolderViewEventListener* listenerp = getCorrectListenerForAction(); - if (listenerp) - { - listenerp->performAction(NULL, "replaceoutfit"); - } - } -} - -void LLPanelOutfitsInventory::onAdd() -{ - // TODO: Remove if/else, add common interface - // for "My Outfits" and "Wearing" tabs. - if (!isCOFPanelActive()) - { - mMyOutfitsPanel->performAction("addtooutfit"); - } - else - { - LLFolderViewEventListener* listenerp = getCorrectListenerForAction(); - if (listenerp) - { - listenerp->performAction(NULL, "addtooutfit"); - } - } -} - -void LLPanelOutfitsInventory::onRemove() -{ - LLFolderViewEventListener* listenerp = getCorrectListenerForAction(); - if (listenerp) - { - listenerp->performAction(NULL, "removefromoutfit"); - } -} - -void LLPanelOutfitsInventory::onEdit() -{ + mMyOutfitsPanel->performAction("replaceoutfit"); } bool LLPanelOutfitsInventory::onSaveCommit(const LLSD& notification, const LLSD& response) @@ -446,8 +199,6 @@ bool LLPanelOutfitsInventory::onSaveCommit(const LLSD& notification, const LLSD& return false; } - - void LLPanelOutfitsInventory::onSave() { std::string outfit_name; @@ -475,57 +226,6 @@ void LLPanelOutfitsInventory::onSave() }*/ } -void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) -{ - updateVerbs(); - - // TODO: add handling "My Outfits" tab. - if (!isCOFPanelActive()) - return; - - if (getRootFolder()->needsAutoRename() && items.size()) - { - getRootFolder()->startRenamingSelectedItem(); - getRootFolder()->setNeedsAutoRename(FALSE); - } -} - -LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction() -{ - // TODO: add handling "My Outfits" tab. - if (!isCOFPanelActive()) - return NULL; - - LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem(); - if (!current_item) - return NULL; - - LLFolderViewEventListener* listenerp = current_item->getListener(); - if (getIsCorrectType(listenerp)) - { - return listenerp; - } - return NULL; -} - -bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener *listenerp) const -{ - if (listenerp->getInventoryType() == LLInventoryType::IT_CATEGORY) - { - LLViewerInventoryCategory *cat = gInventory.getCategory(listenerp->getUUID()); - if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT) - { - return true; - } - } - return false; -} - -LLFolderView *LLPanelOutfitsInventory::getRootFolder() -{ - return getActivePanel()->getRootFolder(); -} - //static LLPanelOutfitsInventory* LLPanelOutfitsInventory::findInstance() { @@ -542,21 +242,12 @@ void LLPanelOutfitsInventory::initListCommandsHandlers() mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::showGearMenu, this)); mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this)); mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this)); - - LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn"); - trash_btn->setDragAndDropHandler(boost::bind(&LLPanelOutfitsInventory::handleDragAndDropToTrash, this - , _4 // BOOL drop - , _5 // EDragAndDropType cargo_type - , _7 // EAcceptance* accept - )); - - mGearMenu = new LLOutfitListGearMenu(mMyOutfitsPanel); } void LLPanelOutfitsInventory::updateListCommands() { bool trash_enabled = isActionEnabled("delete"); - bool wear_enabled = !gAgentWearables.isCOFChangeInProgress() && isActionEnabled("wear"); + bool wear_enabled = isActionEnabled("wear"); bool wear_visible = !isCOFPanelActive(); bool make_outfit_enabled = isActionEnabled("save_outfit"); @@ -568,269 +259,58 @@ void LLPanelOutfitsInventory::updateListCommands() void LLPanelOutfitsInventory::showGearMenu() { - if (!mGearMenu) return; + if (!mActivePanel) return; LLView* spawning_view = getChild<LLView>("options_gear_btn"); - mGearMenu->show(spawning_view); + mActivePanel->showGearMenu(spawning_view); } void LLPanelOutfitsInventory::onTrashButtonClick() { - onClipboardAction("delete"); -} + mMyOutfitsPanel->removeSelected(); -void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata) -{ - std::string command_name = userdata.asString(); - if (isCOFPanelActive()) - { - getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); - } - else // "My Outfits" tab active - { - if (command_name == "delete") - { - const LLUUID& selected_outfit_id = mMyOutfitsPanel->getSelectedOutfitUUID(); - if (selected_outfit_id.notNull()) - { - remove_category(&gInventory, selected_outfit_id); - } - } - else - { - llwarns << "Unrecognized action" << llendl; - } - } - updateListCommands(); - updateVerbs(); + updateListCommands(); + updateVerbs(); } -void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata) +bool LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) { - if (!isActionEnabled(userdata)) - return; - - const std::string command_name = userdata.asString(); - if (command_name == "new") - { - onSave(); - } - if (command_name == "edit") - { - onEdit(); - } - if (command_name == "wear") - { - onWearButtonClick(); - } - // Note: This option has been removed from the gear menu. - if (command_name == "add") - { - onAdd(); - } - if (command_name == "remove") - { - onRemove(); - } - if (command_name == "rename") - { - onClipboardAction("rename"); - } - if (command_name == "remove_link") - { - onClipboardAction("delete"); - } - if (command_name == "delete") - { - onClipboardAction("delete"); - } - updateListCommands(); - updateVerbs(); + return mActivePanel && mActivePanel->isActionEnabled(userdata); } - -BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) -{ - const std::string command_name = userdata.asString(); - if (command_name == "delete" || command_name == "remove") - { - BOOL can_delete = FALSE; - - if (isCOFPanelActive()) - { - LLFolderView* root = getActivePanel()->getRootFolder(); - if (root) - { - std::set<LLUUID> selection_set = root->getSelectionList(); - can_delete = (selection_set.size() > 0); - for (std::set<LLUUID>::iterator iter = selection_set.begin(); - iter != selection_set.end(); - ++iter) - { - const LLUUID &item_id = (*iter); - LLFolderViewItem *item = root->getItemByID(item_id); - can_delete &= item->getListener()->isItemRemovable(); - } - } - } - else // "My Outfits" tab active - { - const LLUUID& selected_outfit = mMyOutfitsPanel->getSelectedOutfitUUID(); - // first condition prevents trash btn from enabling when items are selected inside outfit (EXT-7847) - can_delete = !mMyOutfitsPanel->hasItemSelected() && LLAppearanceMgr::instance().getCanRemoveOutfit(selected_outfit); - } - - return can_delete; - } - if (command_name == "remove_link") - { - BOOL can_delete = FALSE; - LLFolderView* root = getActivePanel()->getRootFolder(); - if (root) - { - std::set<LLUUID> selection_set = root->getSelectionList(); - can_delete = (selection_set.size() > 0); - for (std::set<LLUUID>::iterator iter = selection_set.begin(); - iter != selection_set.end(); - ++iter) - { - const LLUUID &item_id = (*iter); - LLViewerInventoryItem *item = gInventory.getItem(item_id); - if (!item || !item->getIsLinkType()) - return FALSE; - } - return can_delete; - } - return FALSE; - } - if (command_name == "rename" || - command_name == "delete_outfit") - { - return (getCorrectListenerForAction() != NULL) && hasItemsSelected(); - } - - if (command_name == "wear") - { - if (isCOFPanelActive()) - { - return FALSE; - } - return hasItemsSelected(); - } - if (command_name == "save_outfit") - { - bool outfit_locked = LLAppearanceMgr::getInstance()->isOutfitLocked(); - bool outfit_dirty =LLAppearanceMgr::getInstance()->isOutfitDirty(); - // allow save only if outfit isn't locked and is dirty - return !outfit_locked && outfit_dirty; - } - - if (command_name == "edit" || - command_name == "add" - ) - { - return (getCorrectListenerForAction() != NULL); - } - return TRUE; -} - -bool LLPanelOutfitsInventory::hasItemsSelected() -{ - bool has_items_selected = false; - - if (isCOFPanelActive()) - { - LLFolderView* root = getActivePanel()->getRootFolder(); - if (root) - { - std::set<LLUUID> selection_set = root->getSelectionList(); - has_items_selected = (selection_set.size() > 0); - } - } - else // My Outfits Tab is active - { - has_items_selected = mMyOutfitsPanel->getSelectedOutfitUUID().notNull(); - } - return has_items_selected; -} - -bool LLPanelOutfitsInventory::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; -} - -// List Commands // -//////////////////////////////////////////////////////////////////////////////// +// List Commands // +////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// -// Tab panels // +// Tab panels // void LLPanelOutfitsInventory::initTabPanels() { - mCurrentOutfitPanel = getChild<LLInventoryPanel>(COF_TAB_NAME); - mCurrentOutfitPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - mCurrentOutfitPanel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, mCurrentOutfitPanel, _1, _2)); + mCurrentOutfitPanel = getChild<LLPanelWearing>(COF_TAB_NAME); + mCurrentOutfitPanel->setSelectionChangeCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this)); mMyOutfitsPanel = getChild<LLOutfitsList>(OUTFITS_TAB_NAME); - mMyOutfitsPanel->addSelectionChangeCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this)); + mMyOutfitsPanel->setSelectionChangeCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this)); mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs"); mAppearanceTabs->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onTabChange, this)); } -void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action) -{ - if (user_action && items.size() > 0) - { - // TODO: add handling "My Outfits" tab. - if (isCOFPanelActive()) - { - onSelectionChange(items, user_action); - } - else - { - mCurrentOutfitPanel->getRootFolder()->clearSelection(); - } - } -} - void LLPanelOutfitsInventory::onTabChange() { - // TODO: add handling "My Outfits" tab. - if (isCOFPanelActive()) - { - mCurrentOutfitPanel->setFilterSubString(mFilterSubString); - } - else - { - mMyOutfitsPanel->setFilterSubString(mFilterSubString); - mMyOutfitsPanel->onOpen(LLSD()); - } + mActivePanel = dynamic_cast<LLPanelAppearanceTab*>(mAppearanceTabs->getCurrentPanel()); + if (!mActivePanel) return; + + mActivePanel->setFilterSubString(mFilterSubString); + mActivePanel->onOpen(LLSD()); updateVerbs(); } -BOOL LLPanelOutfitsInventory::isTabPanel(LLInventoryPanel *panel) const +bool LLPanelOutfitsInventory::isCOFPanelActive() const { - // TODO: add handling "My Outfits" tab. - if (mCurrentOutfitPanel == panel) - { - return TRUE; - } - return FALSE; -} + if (!mActivePanel) return false; -BOOL LLPanelOutfitsInventory::isCOFPanelActive() const -{ - return (childGetVisibleTab("appearance_tabs")->getName() == COF_TAB_NAME); + return mActivePanel->getName() == COF_TAB_NAME; } void LLPanelOutfitsInventory::setWearablesLoading(bool val) diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index eabfda7f8c..a50e047140 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -34,20 +34,15 @@ #define LL_LLPANELOUTFITSINVENTORY_H #include "llpanel.h" -#include "llinventoryobserver.h" -class LLFolderView; -class LLFolderViewItem; -class LLFolderViewEventListener; -class LLInventoryPanel; class LLOutfitsList; -class LLSaveFolderState; -class LLButton; +class LLOutfitListGearMenu; +class LLPanelAppearanceTab; +class LLPanelWearing; class LLMenuGL; class LLSidepanelAppearance; class LLTabContainer; class LLSaveOutfitComboBtn; -class LLOutfitListGearMenu; class LLPanelOutfitsInventory : public LLPanel { @@ -60,55 +55,36 @@ public: /*virtual*/ void onOpen(const LLSD& key); void onSearchEdit(const std::string& string); - void onAdd(); - void onRemove(); - void onEdit(); void onSave(); bool onSaveCommit(const LLSD& notification, const LLSD& response); - void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); - - // If a compatible listener type is selected, then return a pointer to that. - // Otherwise, return NULL. - LLFolderViewEventListener* getCorrectListenerForAction(); - - LLFolderView* getRootFolder(); static LLSidepanelAppearance* getAppearanceSP(); static LLPanelOutfitsInventory* findInstance(); protected: void updateVerbs(); - bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const; private: - LLSaveFolderState* mSavedFolderState; LLTabContainer* mAppearanceTabs; std::string mFilterSubString; std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn; -public: - ////////////////////////////////////////////////////////////////////////////////// - // tab panels - // TODO: change getActivePanel() to return the active tab instead of returning - // a pointer to "Wearing" inventory panel. - LLInventoryPanel* getActivePanel() { return mCurrentOutfitPanel; } - - BOOL isTabPanel(LLInventoryPanel *panel) const; - BOOL isCOFPanelActive() const; + ////////////////////////////////////////////////////////////////////////////////// + // tab panels // protected: void initTabPanels(); - void onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action); void onTabChange(); + bool isCOFPanelActive() const; private: + LLPanelAppearanceTab* mActivePanel; LLOutfitsList* mMyOutfitsPanel; - LLInventoryPanel* mCurrentOutfitPanel; + LLPanelWearing* mCurrentOutfitPanel; - // tab panels // - //////////////////////////////////////////////////////////////////////////////// - + // tab panels // + ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// // List Commands // @@ -118,21 +94,15 @@ protected: void onWearButtonClick(); void showGearMenu(); 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); - bool hasItemsSelected(); + bool isActionEnabled(const LLSD& userdata); void setWearablesLoading(bool val); void onWearablesLoaded(); void onWearablesLoading(); private: LLPanel* mListCommands; - LLOutfitListGearMenu* mGearMenu; LLMenuGL* mMenuAdd; - // List Commands // - //////////////////////////////////////////////////////////////////////////////// - /// + // List Commands // + ////////////////////////////////////////////////////////////////////////////////// bool mInitialized; }; diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp new file mode 100644 index 0000000000..b8852890ad --- /dev/null +++ b/indra/newview/llpanelwearing.cpp @@ -0,0 +1,214 @@ +/** + * @file llpanelwearing.cpp + * @brief List of agent's worn items. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpanelwearing.h" + +#include "llappearancemgr.h" +#include "llinventorymodel.h" +#include "llinventoryobserver.h" +#include "llsidetray.h" +#include "llviewermenu.h" +#include "llwearableitemslist.h" + +// Context menu and Gear menu helper. +static void edit_outfit() +{ + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit")); +} + +////////////////////////////////////////////////////////////////////////// + +class LLWearingGearMenu +{ +public: + LLWearingGearMenu() + : mMenu(NULL) + { + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + + registrar.add("Gear.Edit", boost::bind(&edit_outfit)); + + mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>( + "menu_wearing_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + llassert(mMenu); + } + + void show(LLView* spawning_view) + { + if (!mMenu) return; + + mMenu->buildDrawLabels(); + mMenu->updateParent(LLMenuGL::sMenuContainer); + S32 menu_x = 0; + S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight(); + LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y); + } + +private: + LLMenuGL* mMenu; +}; + +////////////////////////////////////////////////////////////////////////// + +class LLWearingContextMenu : public LLListContextMenu +{ +protected: + /* virtual */ LLContextMenu* createMenu() + { + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + + registrar.add("Wearing.Edit", boost::bind(&edit_outfit)); + + return createFromFile("menu_wearing_tab.xml"); + } +}; + +////////////////////////////////////////////////////////////////////////// + +std::string LLPanelAppearanceTab::sFilterSubString = LLStringUtil::null; + +static LLRegisterPanelClassWrapper<LLPanelWearing> t_panel_wearing("panel_wearing"); + +LLPanelWearing::LLPanelWearing() + : LLPanelAppearanceTab() + , mCOFItemsList(NULL) + , mIsInitialized(false) +{ + mCategoriesObserver = new LLInventoryCategoriesObserver(); + + mGearMenu = new LLWearingGearMenu(); + mContextMenu = new LLWearingContextMenu(); +} + +LLPanelWearing::~LLPanelWearing() +{ + delete mGearMenu; + delete mContextMenu; + + if (gInventory.containsObserver(mCategoriesObserver)) + { + gInventory.removeObserver(mCategoriesObserver); + delete mCategoriesObserver; + } +} + +BOOL LLPanelWearing::postBuild() +{ + mCOFItemsList = getChild<LLWearableItemsList>("cof_items_list"); + mCOFItemsList->setRightMouseDownCallback(boost::bind(&LLPanelWearing::onWearableItemsListRightClick, this, _1, _2, _3)); + + return TRUE; +} + +//virtual +void LLPanelWearing::onOpen(const LLSD& /*info*/) +{ + if (!mIsInitialized) + { + // *TODO: I'm not sure is this check necessary but it never match while developing. + if (!gInventory.isInventoryUsable()) + return; + + const LLUUID cof = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); + + // *TODO: I'm not sure is this check necessary but it never match while developing. + LLViewerInventoryCategory* category = gInventory.getCategory(cof); + if (!category) + return; + + gInventory.addObserver(mCategoriesObserver); + + // Start observing changes in Current Outfit category. + mCategoriesObserver->addCategory(cof, boost::bind(&LLWearableItemsList::updateList, mCOFItemsList, cof)); + + // Fetch Current Outfit contents and refresh the list to display + // initially fetched items. If not all items are fetched now + // the observer will refresh the list as soon as the new items + // arrive. + category->fetch(); + + mCOFItemsList->updateList(cof); + + mIsInitialized = true; + } +} + +// virtual +void LLPanelWearing::setFilterSubString(const std::string& string) +{ + sFilterSubString = string; + mCOFItemsList->setFilterSubString(sFilterSubString); +} + +// virtual +bool LLPanelWearing::isActionEnabled(const LLSD& userdata) +{ + const std::string command_name = userdata.asString(); + + if (command_name == "save_outfit") + { + bool outfit_locked = LLAppearanceMgr::getInstance()->isOutfitLocked(); + bool outfit_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty(); + // allow save only if outfit isn't locked and is dirty + return !outfit_locked && outfit_dirty; + } + return false; +} + +// virtual +void LLPanelWearing::showGearMenu(LLView* spawning_view) +{ + if (!mGearMenu) return; + mGearMenu->show(spawning_view); +} + +boost::signals2::connection LLPanelWearing::setSelectionChangeCallback(commit_callback_t cb) +{ + if (!mCOFItemsList) return boost::signals2::connection(); + + return mCOFItemsList->setCommitCallback(cb); +} + +void LLPanelWearing::onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y) +{ + LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(ctrl); + if (!list) return; + + uuid_vec_t selected_uuids; + + list->getSelectedUUIDs(selected_uuids); + + mContextMenu->show(ctrl, selected_uuids, x, y); +} + +// EOF diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h new file mode 100644 index 0000000000..1573990d13 --- /dev/null +++ b/indra/newview/llpanelwearing.h @@ -0,0 +1,81 @@ +/** + * @file llpanelwearing.h + * @brief List of agent's worn items. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELWEARING_H +#define LL_LLPANELWEARING_H + +#include "llpanel.h" + +// newview +#include "llpanelappearancetab.h" + +class LLInventoryCategoriesObserver; +class LLListContextMenu; +class LLWearableItemsList; +class LLWearingGearMenu; + +/** + * @class LLPanelWearing + * + * A list of agents's currently worn items represented by + * a flat list view. + * Starts fetching necessary inventory content on first opening. + */ +class LLPanelWearing : public LLPanelAppearanceTab +{ +public: + LLPanelWearing(); + virtual ~LLPanelWearing(); + + /*virtual*/ BOOL postBuild(); + + /*virtual*/ void onOpen(const LLSD& info); + + /*virtual*/ void setFilterSubString(const std::string& string); + + /*virtual*/ bool isActionEnabled(const LLSD& userdata); + + /*virtual*/ void showGearMenu(LLView* spawning_view); + + boost::signals2::connection setSelectionChangeCallback(commit_callback_t cb); + +private: + void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y); + + LLInventoryCategoriesObserver* mCategoriesObserver; + LLWearableItemsList* mCOFItemsList; + LLWearingGearMenu* mGearMenu; + LLListContextMenu* mContextMenu; + + bool mIsInitialized; +}; + +#endif //LL_LLPANELWEARING_H diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index ff315d3c53..a7b4873fed 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -876,6 +876,7 @@ void LLPreviewGesture::onLoadComplete(LLVFS *vfs, self->mDirty = FALSE; self->refresh(); + self->refreshFromItem(); // to update description and title } else { diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 0d1be91125..ea5796d766 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -390,8 +390,8 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name) return; } - std::string look_name = gAgentWearables.isCOFChangeInProgress() ? "" : getString("No Outfit"); - mCurrentLookName->setText(look_name); + std::string string_name = gAgentWearables.isCOFChangeInProgress() ? "Changing outfits" : "No Outfit"; + mCurrentLookName->setText(getString(string_name)); mOpenOutfitBtn->setEnabled(FALSE); } else @@ -475,6 +475,12 @@ void LLSidepanelAppearance::setWearablesLoading(bool val) { childSetVisible("wearables_loading_indicator", val); childSetVisible("edit_outfit_btn", !val); + + if (!val) + { + // refresh outfit name when COF is already changed. + refreshCurrentOutfitName(); + } } void LLSidepanelAppearance::showDefaultSubpart() diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index 032714cabf..b9875f465a 100644 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -236,7 +236,6 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info) gAgentCamera.setFocusOnAvatar(FALSE, FALSE); LLVector3d cam_pos = gAgentCamera.getCameraPositionGlobal(); - cam_pos -= LLVector3d(LLViewerCamera::getInstance()->getLeftAxis() * gAgentCamera.calcCustomizeAvatarUIOffset( cam_pos )); gAgentCamera.setCameraPosAndFocusGlobal( cam_pos, pick_info.mPosGlobal, pick_info.mObjectID); } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 4ef166fb71..3dce4ce0bc 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3201,7 +3201,10 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE; } - if (!visible) + // don't early out for your own avatar, as we rely on your animations playing reliably + // for example, the "turn around" animation when entering customize avatar needs to trigger + // even when your avatar is offscreen + if (!visible && !isSelf()) { updateMotions(LLCharacter::HIDDEN_UPDATE); return FALSE; diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 832d4a2fe6..da15b93697 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -95,19 +95,22 @@ LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item) ////////////////////////////////////////////////////////////////////////// // static -LLPanelWearableOutfitItem* LLPanelWearableOutfitItem::create(LLViewerInventoryItem* item) +LLPanelWearableOutfitItem* LLPanelWearableOutfitItem::create(LLViewerInventoryItem* item, + bool worn_indication_enabled) { LLPanelWearableOutfitItem* list_item = NULL; if (item) { - list_item = new LLPanelWearableOutfitItem(item); + list_item = new LLPanelWearableOutfitItem(item, worn_indication_enabled); list_item->init(); } return list_item; } -LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item) +LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item, + bool worn_indication_enabled) : LLPanelInventoryListItemBase(item) +, mWornIndicationEnabled(worn_indication_enabled) { } @@ -117,7 +120,7 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name, { std::string search_label = name; - if (get_is_item_worn(mInventoryItemUUID)) + if (mWornIndicationEnabled && get_is_item_worn(mInventoryItemUUID)) { search_label += LLTrans::getString("worn"); item_state = IS_WORN; @@ -444,6 +447,7 @@ static const LLDefaultChildRegistry::Register<LLWearableItemsList> r("wearable_i LLWearableItemsList::Params::Params() : standalone("standalone", true) +, worn_indication_enabled("worn_indication_enabled", true) {} LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p) @@ -456,6 +460,7 @@ LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p) // Use built-in context menu. setRightMouseDownCallback(boost::bind(&LLWearableItemsList::onRightClick, this, _2, _3)); } + mWornIndicationEnabled = p.worn_indication_enabled; } // virtual @@ -471,7 +476,7 @@ void LLWearableItemsList::addNewItem(LLViewerInventoryItem* item, bool rearrange llassert(item != NULL); } - LLPanelWearableOutfitItem *list_item = LLPanelWearableOutfitItem::create(item); + LLPanelWearableOutfitItem *list_item = LLPanelWearableOutfitItem::create(item, mWornIndicationEnabled); if (!list_item) return; @@ -657,7 +662,7 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu setMenuItemVisible(menu, "wear_add", mask == MASK_CLOTHING && n_worn == 0); setMenuItemEnabled(menu, "wear_add", n_items == 1 && canAddWearable(ids.front())); setMenuItemVisible(menu, "wear", n_worn == 0); - setMenuItemVisible(menu, "edit", !standalone && mask & (MASK_CLOTHING|MASK_BODYPART)); + setMenuItemVisible(menu, "edit", !standalone && mask & (MASK_CLOTHING|MASK_BODYPART) && n_worn == n_items); setMenuItemEnabled(menu, "edit", n_editable == 1 && n_worn == 1 && n_items == 1); setMenuItemVisible(menu, "create_new", mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1); setMenuItemVisible(menu, "show_original", !standalone); diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 2bfb90e3ec..eb82418454 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -82,7 +82,8 @@ class LLPanelWearableOutfitItem : public LLPanelInventoryListItemBase { LOG_CLASS(LLPanelWearableOutfitItem); public: - static LLPanelWearableOutfitItem* create(LLViewerInventoryItem* item); + static LLPanelWearableOutfitItem* create(LLViewerInventoryItem* item, + bool worn_indication_enabled); /** * Updates item name and (worn) suffix. @@ -91,7 +92,11 @@ public: EItemState item_state = IS_DEFAULT); protected: - LLPanelWearableOutfitItem(LLViewerInventoryItem* item); + LLPanelWearableOutfitItem(LLViewerInventoryItem* item, + bool worn_indication_enabled); + +private: + bool mWornIndicationEnabled; }; class LLPanelDeletableWearableListItem : public LLPanelWearableListItem @@ -352,6 +357,7 @@ public: struct Params : public LLInitParam::Block<Params, LLInventoryItemsList::Params> { Optional<bool> standalone; + Optional<bool> worn_indication_enabled; Params(); }; @@ -377,6 +383,7 @@ protected: void onRightClick(S32 x, S32 y); bool mIsStandalone; + bool mWornIndicationEnabled; }; #endif //LL_LLWEARABLEITEMSLIST_H diff --git a/indra/newview/skins/default/textures/icons/Shop.png b/indra/newview/skins/default/textures/icons/Shop.png Binary files differindex d7e0001dc6..9d091fed44 100644 --- a/indra/newview/skins/default/textures/icons/Shop.png +++ b/indra/newview/skins/default/textures/icons/Shop.png diff --git a/indra/newview/skins/default/xui/da/floater_camera.xml b/indra/newview/skins/default/xui/da/floater_camera.xml index 37e3307960..a1b98ec4ce 100644 --- a/indra/newview/skins/default/xui/da/floater_camera.xml +++ b/indra/newview/skins/default/xui/da/floater_camera.xml @@ -9,35 +9,28 @@ <floater.string name="move_tooltip"> Flyt kamera op og ned, til venstre og højre </floater.string> - <floater.string name="orbit_mode_title"> - Kredsløb + <floater.string name="camera_modes_title"> + Kamera valg </floater.string> <floater.string name="pan_mode_title"> - Panorér + Kredsløb zoom panorering </floater.string> - <floater.string name="avatar_view_mode_title"> + <floater.string name="presets_mode_title"> Forvalg </floater.string> <floater.string name="free_mode_title"> Se objekt </floater.string> <panel name="controls"> - <joystick_track name="cam_track_stick" tool_tip="Flyt kamera op og ned, til venstre og højre"/> <panel name="zoom" tool_tip="Zoom kamera mod fokus"> + <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera kredser rundt om fokus"/> <slider_bar name="zoom_slider" tool_tip="Zoom kamera mod fokus"/> - </panel> - <joystick_rotate name="cam_rotate_stick" tool_tip="Kreds kamera omkring fokus"/> - <panel name="camera_presets"> - <button name="rear_view" tool_tip="Se bagfra"/> - <button name="group_view" tool_tip="Se som gruppe"/> - <button name="front_view" tool_tip="Se forfra"/> - <button name="mouselook_view" tool_tip="Førsteperson"/> + <joystick_track name="cam_track_stick" tool_tip="Flyt kamera op og ned, venstre og højre"/> </panel> </panel> <panel name="buttons"> - <button label="" name="orbit_btn" tool_tip="Rotér kamera"/> - <button label="" name="pan_btn" tool_tip="Panorér kamera"/> - <button label="" name="avatarview_btn" tool_tip="Forvalg"/> - <button label="" name="freecamera_btn" tool_tip="Se objekt"/> + <button label="" name="presets_btn" tool_tip="Forvalg"/> + <button label="" name="pan_btn" tool_tip="Kredsløb zoom panorering"/> + <button label="" name="avatarview_btn" tool_tip="Kamera valg"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_incoming_call.xml b/indra/newview/skins/default/xui/da/floater_incoming_call.xml index 2349174db2..7a3c3e466a 100644 --- a/indra/newview/skins/default/xui/da/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/da/floater_incoming_call.xml @@ -16,7 +16,13 @@ har sluttet sig til stemme chat opkald med en konference chat. </floater.string> <floater.string name="VoiceInviteGroup"> - deltager nu i Stemme chat opkald med denne gruppe [GROUP]. + netop tilsuttet stemme kanal for '[GROUP]'. + </floater.string> + <floater.string name="VoiceInviteQuestionGroup"> + Ønsker du at forlade [CURRENT_CHAT] og tilsutte dig kald med '[GROUP]'? + </floater.string> + <floater.string name="VoiceInviteQuestionDefault"> + Ønsker du at forlade [CURRENT_CHAT] og tilslutte dig denne stemmechat? </floater.string> <text name="question"> Ønsker du at forlade [CURRENT_CHAT] og slutte dig til denne stemme chat? diff --git a/indra/newview/skins/default/xui/da/floater_snapshot.xml b/indra/newview/skins/default/xui/da/floater_snapshot.xml index 7f7fb8ddf0..a62bd60757 100644 --- a/indra/newview/skins/default/xui/da/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/da/floater_snapshot.xml @@ -5,12 +5,19 @@ </floater.string> <button label="Tag nyt foto" name="new_snapshot_btn"/> <line_editor label="Beskrivelse" name="description"/> - <button label="Del foto" name="share"/> - <button label="Del på internettet" name="share_to_web"/> - <button label="Gem til beholdning" name="save_to_inventory"/> - <button label="Gem foto" name="save"/> - <button label="Email foto" name="share_to_email"/> - <button label="Gem på computer" name="save_to_computer"/> - <button label="Sæt som profil billede" name="set_profile_pic"/> - <button label="Tilbage" name="cancel"/> + <panel name="panel_snapshot_main"> + <button label="Del foto" name="share"/> + <button label="Gem foto" name="save"/> + <button label="Sæt til profilbillede" name="set_profile_pic"/> + </panel> + <panel name="panel_snapshot_share"> + <button label="Del på internettet" name="share_to_web"/> + <button label="E-mail foto" name="share_to_email"/> + <button label="Tilbage" name="cancel_share"/> + </panel> + <panel name="panel_snapshot_save"> + <button label="Gem til min beholdning" name="save_to_inventory"/> + <button label="Gem til min computer" name="save_to_computer"/> + <button label="Tilbage" name="cancel_save"/> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_voice_controls.xml b/indra/newview/skins/default/xui/da/floater_voice_controls.xml index 05e9eb6cdd..2e59dfd649 100644 --- a/indra/newview/skins/default/xui/da/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/da/floater_voice_controls.xml @@ -19,8 +19,10 @@ <layout_panel name="my_panel"> <text name="user_text" value="Min avatar:"/> </layout_panel> - <layout_panel name="leave_call_btn_panel"> - <button label="Forlad opkald" name="leave_call_btn"/> - </layout_panel> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="Forlad opkald" name="leave_call_btn"/> + </layout_panel> + </layout_stack> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_voice_effect.xml b/indra/newview/skins/default/xui/da/floater_voice_effect.xml new file mode 100644 index 0000000000..543224c6f6 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_voice_effect.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Steder" name="voice_effects" title="SE STEMME "MORPH""> + <string name="no_voice_effect"> + (Ingen stemme "morph") + </string> + <string name="active_voice_effect"> + (Aktiv) + </string> + <string name="unsubscribed_voice_effect"> + (Ikke aktiveret) + </string> + <string name="new_voice_effect"> + (Ny!) + </string> + <text name="status_text"> + For at se stemme "morph" effekter, skal du klikke på "optag" kanppen for at optage en stump stemme, derefter klik på en stemme "morph" på listen for at høre hvordan det vil lyde. + +For at vende tilbage til lokal stemme-chat luk dette vindue. + </text> + <button label="Optage prøve" name="record_btn" tool_tip="Optag en stemmeprøve."/> + <button label="Stop" name="record_stop_btn"/> + <text name="voice_morphing_link"> + [[URL] Hent stemme "morph"] + </text> + <scroll_list name="voice_effect_list" tool_tip="Optag en prøve med din stemme og klik på en effekt for at teste."> + <scroll_list.columns label="Stemme "morph"" name="name"/> + <scroll_list.columns label="Udløber" name="expires"/> + </scroll_list> +</floater> diff --git a/indra/newview/skins/default/xui/da/inspect_object.xml b/indra/newview/skins/default/xui/da/inspect_object.xml index 8cbcf6cac8..78ccc5b869 100644 --- a/indra/newview/skins/default/xui/da/inspect_object.xml +++ b/indra/newview/skins/default/xui/da/inspect_object.xml @@ -8,8 +8,8 @@ Af [CREATOR] </string> <string name="CreatorAndOwner"> - af [CREATOR] -ejer [OWNER] + Af [CREATOR] +Owner [OWNER] </string> <string name="Price"> L$[AMOUNT] @@ -23,6 +23,13 @@ ejer [OWNER] <string name="Sit"> Sid </string> + <text name="object_name" value="Test objekt navn der reelt er to linier og meget lang"/> + <text name="price_text"> + L$30,000 + </text> + <text name="object_description"> + Dette er en meget lang beskrivelse af et objekt udformet så den fylder mindst 80 karakterer i længden eller endda nærmere 120 på dette sted. Man kan aldrig vide.... + </text> <button label="Køb" name="buy_btn"/> <button label="Betal" name="pay_btn"/> <button label="Tag kopi" name="take_free_copy_btn"/> diff --git a/indra/newview/skins/default/xui/da/menu_cof_attachment.xml b/indra/newview/skins/default/xui/da/menu_cof_attachment.xml new file mode 100644 index 0000000000..9d7fc0f223 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Tag af" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_cof_body_part.xml b/indra/newview/skins/default/xui/da/menu_cof_body_part.xml new file mode 100644 index 0000000000..0e90d5a3ae --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Erstat" name="replace"/> + <menu_item_call label="Redigér" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_cof_clothing.xml b/indra/newview/skins/default/xui/da/menu_cof_clothing.xml new file mode 100644 index 0000000000..73d97cd167 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_cof_clothing.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Tag af" name="take_off"/> + <menu_item_call label="Flyt et lag op" name="move_up"/> + <menu_item_call label="Flyt et lag ned" name="move_down"/> + <menu_item_call label="Redigér" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_cof_gear.xml b/indra/newview/skins/default/xui/da/menu_cof_gear.xml new file mode 100644 index 0000000000..f44369fd84 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Nyt tøj" name="COF.Gear.New_Clothes"/> + <menu label="Nye kropsdele" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/default/xui/da/menu_hide_navbar.xml b/indra/newview/skins/default/xui/da/menu_hide_navbar.xml index 45276adda4..d96a8a8a17 100644 --- a/indra/newview/skins/default/xui/da/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/da/menu_hide_navbar.xml @@ -2,4 +2,5 @@ <menu name="hide_navbar_menu"> <menu_item_check label="Vis navigationsbjælke" name="ShowNavbarNavigationPanel"/> <menu_item_check label="Vis favoritbjælke" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Vis min lokation bjælke" name="ShowMiniLocationPanel"/> </menu> diff --git a/indra/newview/skins/default/xui/da/menu_inventory.xml b/indra/newview/skins/default/xui/da/menu_inventory.xml index ff70ec7886..2eafeb3fcc 100644 --- a/indra/newview/skins/default/xui/da/menu_inventory.xml +++ b/indra/newview/skins/default/xui/da/menu_inventory.xml @@ -78,6 +78,7 @@ <menu label="Vedhæft til HUD" name="Attach To HUD"/> <menu_item_call label="Redigér" name="Wearable Edit"/> <menu_item_call label="Tag på" name="Wearable Wear"/> + <menu_item_call label="Tilføj" name="Wearable Add"/> <menu_item_call label="Tag af" name="Take Off"/> <menu_item_call label="--ingen valg--" name="--no options--"/> </menu> diff --git a/indra/newview/skins/default/xui/da/menu_outfit_gear.xml b/indra/newview/skins/default/xui/da/menu_outfit_gear.xml new file mode 100644 index 0000000000..3ed0df9041 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_outfit_gear.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Tag på - Erstat nuværende sæt" name="wear"/> + <menu_item_call label="Tag af - Fjern fra nuværende sæt" name="take_off"/> + <menu label="Nyt tøj" name="New Clothes"> + <menu_item_call label="Ny trøje" name="New Shirt"/> + <menu_item_call label="Nye bukser" name="New Pants"/> + <menu_item_call label="Nye sko" name="New Shoes"/> + <menu_item_call label="Nye strømper" name="New Socks"/> + <menu_item_call label="Ny jakke" name="New Jacket"/> + <menu_item_call label="Ny nederdel" name="New Skirt"/> + <menu_item_call label="Nye handsker" name="New Gloves"/> + <menu_item_call label="Ny undertrøje" name="New Undershirt"/> + <menu_item_call label="Nye underbukser" name="New Underpants"/> + <menu_item_call label="Ny alpha" name="New Alpha"/> + <menu_item_call label="Ny tatovering" name="New Tattoo"/> + </menu> + <menu label="Nye kropsdele" name="New Body Parts"> + <menu_item_call label="Ny figur" name="New Shape"/> + <menu_item_call label="Nyt hud" name="New Skin"/> + <menu_item_call label="Nyt hår" name="New Hair"/> + <menu_item_call label="Nye øjne" name="New Eyes"/> + </menu> + <menu_item_call label="Omdøb sæt" name="rename"/> + <menu_item_call label="Slet sæt" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/default/xui/da/menu_outfit_tab.xml b/indra/newview/skins/default/xui/da/menu_outfit_tab.xml new file mode 100644 index 0000000000..35bb1ae685 --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Tag på - Erstat nuværende sæt" name="wear_replace"/> + <menu_item_call label="Tag på - Tilføj til nuværende sæt" name="wear_add"/> + <menu_item_call label="Tag af - Fjern fra nuværende sæt" name="take_off"/> + <menu_item_call label="Redigér sæt" name="edit"/> + <menu_item_call label="Omdøb" name="rename"/> + <menu_item_call label="Slet sæt" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/da/menu_save_outfit.xml b/indra/newview/skins/default/xui/da/menu_save_outfit.xml index 3d89715ea8..188229b586 100644 --- a/indra/newview/skins/default/xui/da/menu_save_outfit.xml +++ b/indra/newview/skins/default/xui/da/menu_save_outfit.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="save_outfit_menu"> <menu_item_call label="Gem" name="save_outfit"/> - <menu_item_call label="Gem som ny" name="save_as_new_outfit"/> + <menu_item_call label="Gem som" name="save_as_new_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml index a061292eb0..6449a00f2f 100644 --- a/indra/newview/skins/default/xui/da/menu_viewer.xml +++ b/indra/newview/skins/default/xui/da/menu_viewer.xml @@ -9,6 +9,7 @@ <menu_item_check label="Beholdning" name="Inventory"/> <menu_item_check label="Min beholdning" name="ShowSidetrayInventory"/> <menu_item_check label="Mine bevægelser" name="Gestures"/> + <menu_item_check label="Min stemme" name="ShowVoice"/> <menu label="Min status" name="Status"> <menu_item_call label="Væk" name="Set Away"/> <menu_item_call label="Optaget" name="Set Busy"/> @@ -68,6 +69,12 @@ <menu_item_call label="Sammenkæd" name="Link"/> <menu_item_call label="Adskil" name="Unlink"/> <menu_item_check label="Redigér sammekædede objekter" name="Edit Linked Parts"/> + <menu label="Vis lænkede dele" name="Select Linked Parts"> + <menu_item_call label="Vælg næste del" name="Select Next Part"/> + <menu_item_call label="Vælg forrige del" name="Select Previous Part"/> + <menu_item_call label="Inkludér næste del" name="Include Next Part"/> + <menu_item_call label="Inkludér forrige del" name="Include Previous Part"/> + </menu> <menu_item_call label="Fokusér på valgte" name="Focus on Selection"/> <menu_item_call label="Zoom til valgte" name="Zoom to Selection"/> <menu label="Objekt" name="Object"> @@ -98,11 +105,11 @@ <menu_item_call label="Benyt valgte som grundlag for gitter" name="Use Selection for Grid"/> <menu_item_call label="Gitter indstillinger" name="Grid Options"/> </menu> - <menu label="Vis lænkede dele" name="Select Linked Parts"> - <menu_item_call label="Vælg næste del" name="Select Next Part"/> - <menu_item_call label="Vælg forrige del" name="Select Previous Part"/> - <menu_item_call label="Inkludér næste del" name="Include Next Part"/> - <menu_item_call label="Inkludér forrige del" name="Include Previous Part"/> + <menu label="Send" name="Upload"> + <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/> + <menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/> + <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/> + <menu_item_call label="Mange (L$[COST] pr. fil)..." name="Bulk Upload"/> </menu> </menu> <menu label="Hjælp" name="Help"> diff --git a/indra/newview/skins/default/xui/da/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/da/menu_wearable_list_item.xml new file mode 100644 index 0000000000..6ec5e50e5b --- /dev/null +++ b/indra/newview/skins/default/xui/da/menu_wearable_list_item.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Tag på" name="wear"/> + <menu_item_call label="Tilføj" name="wear_add"/> + <menu_item_call label="Tag af" name="take_off_or_detach"/> + <menu_item_call label="Tag af" name="detach"/> + <context_menu label="Vedhæft til ▶" name="wearable_attach_to"/> + <context_menu label="Vedhæft på HUD ▶" name="wearable_attach_to_hud"/> + <menu_item_call label="Tag af" name="take_off"/> + <menu_item_call label="Redigér" name="edit"/> + <menu_item_call label="Objekt profil" name="object_profile"/> + <menu_item_call label="Vis original" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml index 72a1ab6a29..76cf73e1e6 100644 --- a/indra/newview/skins/default/xui/da/notifications.xml +++ b/indra/newview/skins/default/xui/da/notifications.xml @@ -268,6 +268,11 @@ Grafik kvaliteten sættes til 'lav' for at undgå typiske problemer me Vi anbefaler at opdatere driverne til dit grafikkort. Grafik kvaliteten kan forbedres i indstillinger > Grafik. </notification> + <notification name="CannotCopyWarning"> + Du har ikke rettigheder til at kopiere følgende genstande: +[ITEMS] +og du vil miste dem fra din beholdning hvis du forærer dem væk. Er du sikker på at du vil tilbyde disse genstande? + </notification> <notification name="CannotGiveCategory"> Du har ikke tilladelse til at videreføre den valgte mappe. </notification> @@ -412,6 +417,26 @@ Tilbyd venskab til [NAME]? <button name="Cancel" text="Annullér"/> </form> </notification> + <notification label="Gem" name="SaveWearableAs"> + Gem genstand til beholdning som: + <form name="form"> + <input name="message"> + [DESC] (ny) + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Annullér"/> + </form> + </notification> + <notification label="Omdøb sæt" name="RenameOutfit"> + Nyt navn til sæt: + <form name="form"> + <input name="new_name"> + [NAME] + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Annullér"/> + </form> + </notification> <notification name="ConfirmItemDeleteHasLinks"> Mindst en af genstandene har lænkede genstande der peger på den. Hvis du sletter denne genstand, vil lænkninger ikke virke mere. Det anbefales kraftigt at fjerne lænkninger først. @@ -677,9 +702,9 @@ Gå til 'Knowledge Base' for mere information om indholdsratings. Du har ikke adgang til denne region på grund af din valgte indholdsrating. </notification> <notification name="RegionEntryAccessBlocked_Change"> - Du har ikke adgang til den region, da din indholdsrating ikke tillader dette. + Du har ikke adgang til denne region på grund af din opsætning af indholdsrating. -Klik på "Ændre præference" for at forhøje din indholdsrating for direkte adgang nu. Ved at gøre dette vil du få lov til at søge og få adgang til [REGIONMATURITY] indhold. Hvis du ønsker at ændre denne opsætning senere, kan du gøre dette fra Mig > Indstillinger > Generelt. +For at få adgang til den ønskede region skal du ændre din indholdsrating. Dette vil give dig ret til at søge og får tilgang til indhold af typen [REGIONMATURITY]. For at omgøre ændringer gå til Mig > Indstillinger > Generelt. <form name="form"> <button name="OK" text="Ændre indstillinger"/> <button name="Cancel" text="Luk"/> @@ -1460,6 +1485,21 @@ Klik på Acceptér for at deltage eller Afvis for at afvise invitationen. Klik p <notification name="VoiceLoginRetry"> Vi laver en stemmekanal til dig. Det kan tage op til et minut. </notification> + <notification name="VoiceEffectsExpired"> + En eller flere af dine stemme "morphs" er udløbet. +[[URL] Click here] for at forny dit abbonnement. + </notification> + <notification name="VoiceEffectsExpiredInUse"> + Den aktive stemme "morph" er udløbet og din normale stemme opsætning er genaktiveret. +[[URL] Click here] for at forny dit abbonnement. + </notification> + <notification name="VoiceEffectsWillExpire"> + En eller flere af dine stemme "morphs" vil udløbe om mindre end [INTERVAL] dage. +[[URL] Click here] for at forny dit abbonnement. + </notification> + <notification name="VoiceEffectsNew"> + Nye stemme "morphs" er tilgængelige! + </notification> <notification name="Cannot enter parcel: not a group member"> Kun medlemmer af en bestemt gruppe kan besøge dette område. </notification> @@ -1526,18 +1566,36 @@ De vil blive blokeret nogle få sekunder af sikkerhedsmæssige årsager. Knappen vil blive vist når der er nok plads til den. </notification> <notification name="ShareNotification"> - Træk genstande fra beholdning til en person i beboer vælgeren + Vælg beboere at dele med. + </notification> + <notification name="ShareItemsConfirmation"> + Er du sikker på at du vil dele følgende genstande: + +[ITEMS] + +Med følgende beboere: + +[RESIDENTS] + <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Ok"/> + </notification> + <notification name="ItemsShared"> + Genstande er nu delt. </notification> <notification name="DeedToGroupFail"> Dedikering til gruppe fejlede. </notification> <notification name="AvatarRezNotification"> ( [EXISTENCE] sekunder i live ) -Avatar '[NAME]' declouded in [TIME] seconds. +Avatar '[NAME]' var ikke sky mere, efter [TIME] sekunder. </notification> - <notification name="AvatarRezSelfNotification"> - ( [EXISTENCE] sekunder i live ) -Du afsluttede klargøring af dit sæt på [TIME] sekunder. + <notification name="AvatarRezSelfBakedDoneNotification"> + ( [EXISTENCE] seconds alive ) +Du blev færdig med at fremvise dit sæt efter [TIME] sekunder. + </notification> + <notification name="AvatarRezSelfBakedUpdateNotification"> + ( [EXISTENCE] seconds alive ) +Du sendte en opdatering af dit udseende efter [TIME] sekunder. +[STATUS] </notification> <notification name="AvatarRezCloudNotification"> ( [EXISTENCE] sekunder i live ) @@ -1559,10 +1617,32 @@ Avatar '[NAME]' skiftede til udseende modus. ( [EXISTENCE] sekunder i live ) Avatar '[NAME]' har forladt udseende modus. </notification> + <notification name="NoConnect"> + Vi har problemer med at oprette forbindelse via [PROTOCOL] [HOSTID]. +Check venligst din netværks- og firewallsetup. + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> + <notification name="NoVoiceConnect"> + Vi har problemer med at oprette forbindelse til din stemme server: + +[HOSTID] + +Stemme kommunikation vil ikke være tilgængelig. +Check venligst din netværks- og firewall setup. + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> <notification name="AvatarRezLeftNotification"> ( [EXISTENCE] sekunder i live ) Avatar '[NAME]' forsvandt helt "uploaded". </notification> + <notification name="AvatarRezSelfBakeNotification"> + ( [EXISTENCE] seconds alive ) +Du sendte en [RESOLUTION] tekstur til '[BODYREGION]' efter [TIME] sekunder. + </notification> <notification name="ConfirmLeaveCall"> Er du sikker på at du vil forlade dette opkald? <usetemplate ignoretext="Bekræft før jeg forlader opkald" name="okcancelignore" notext="Nej" yestext="Ja"/> @@ -1574,7 +1654,7 @@ vil have lyden slukket - selv efter de har forladt kaldet. Sluk for alles lyd? - <usetemplate ignoretext="Bekræft før jeg slukker for alle deltageres lyd i gruppe-kald" name="okcancelignore" notext="OK" yestext="Annullér"/> + <usetemplate ignoretext="Bekræft før jeg slukker for alle deltageres lyd i gruppe-kald" name="okcancelignore" notext="Annullér" yestext="Ok"/> </notification> <global name="UnsupportedGLRequirements"> Det ser ikke ud til at din hardware opfylder minimumskravene til [APP_NAME]. [APP_NAME] kræver et OpenGL grafikkort som understøter 'multitexture'. Check eventuelt om du har de nyeste drivere for grafikkortet, og de nyeste service-packs og patches til dit operativsystem. diff --git a/indra/newview/skins/default/xui/da/panel_edit_shape.xml b/indra/newview/skins/default/xui/da/panel_edit_shape.xml index 4360fe35f5..7c1ffe5cfa 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_shape.xml @@ -1,8 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shape_panel"> - <text name="avatar_height"> - [HEIGHT] meter høj - </text> + <string name="meters"> + Meter + </string> + <string name="feet"> + Fod + </string> + <string name="height"> + Højde: + </string> + <text name="avatar_height"/> <panel label="Trøje" name="accordion_panel"> <accordion name="wearable_accordion"> <accordion_tab name="shape_body_tab" title="Krop"/> diff --git a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml index 8e6990fe31..f927f918a1 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml @@ -72,7 +72,7 @@ <string name="jacket_desc_text"> Jakke: </string> - <string name="skirt_skirt_desc_text"> + <string name="skirt_desc_text"> Nederdel: </string> <string name="gloves_desc_text"> @@ -100,11 +100,6 @@ <icon name="male_icon" tool_tip="Mandlig"/> <icon name="female_icon" tool_tip="Kvindelig"/> </panel> - <panel label="gear_buttom_panel" name="gear_buttom_panel"> - <button name="friends_viewsort_btn" tool_tip="Valg"/> - <button name="add_btn" tool_tip="TODO"/> - <button name="del_btn" tool_tip="TODO"/> - </panel> <panel name="button_panel"> <button label="Gem som" name="save_as_button"/> <button label="Vend tilbage" name="revert_button"/> diff --git a/indra/newview/skins/default/xui/da/panel_outfit_edit.xml b/indra/newview/skins/default/xui/da/panel_outfit_edit.xml index 9aa9fd14cc..a02c9ba399 100644 --- a/indra/newview/skins/default/xui/da/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/da/panel_outfit_edit.xml @@ -13,7 +13,7 @@ <string name="Filter.All" value="Alle"/> <string name="Filter.Clothes/Body" value="Tøj/Krop"/> <string name="Filter.Objects" value="Objekter"/> - <button label="redigér" name="edit_wearable_btn"/> + <string name="Filter.Custom" value="Tilpasset filter"/> <text name="title" value="Redigér sæt"/> <panel label="bottom_panel" name="header_panel"> <panel label="bottom_panel" name="outfit_name_and_status"> @@ -23,20 +23,16 @@ </panel> <layout_stack name="im_panels"> <layout_panel label="IM kontrolpanel" name="outfit_wearables_panel"> - <panel label="bottom_panel" name="edit_panel"/> - </layout_panel> - <layout_panel name="add_wearables_panel"> - <text name="add_to_outfit_label" value="Tilføj til sæt:"/> <layout_stack name="filter_panels"> - <layout_panel label="IM kontrolpanel" name="filter_panel"> - <filter_editor label="Filter" name="look_item_filter"/> + <layout_panel name="add_button_and_combobox"> + <button label="Tilføj mere..." name="show_add_wearables_btn"/> + </layout_panel> + <layout_panel name="filter_panel"> + <filter_editor label="Filtrér tøj i beholdning" name="look_item_filter"/> </layout_panel> </layout_stack> - <panel label="add_wearables_button_bar" name="add_wearables_button_bar"> - <button label="F" name="folder_view_btn"/> - <button label="L" name="list_view_btn"/> - </panel> </layout_panel> + <layout_panel name="add_wearables_panel"/> </layout_stack> <panel name="save_revert_button_bar"> <button label="Gem" name="save_btn"/> diff --git a/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml index 681701aba2..4bc9ff99a9 100644 --- a/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml @@ -7,8 +7,7 @@ <panel name="bottom_panel"> <button name="options_gear_btn" tool_tip="Vis flere muligheder"/> <dnd_button name="trash_btn" tool_tip="Fjern valgte genstand"/> - <button label="Gem sæt" name="make_outfit_btn" tool_tip="Gem udseende som nyt sæt"/> + <button label="Gem som" name="save_btn"/> <button label="Tag på" name="wear_btn" tool_tip="Tag valgte sæt på"/> - <button label="Redigér sæt" name="edit_current_outfit_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_places.xml b/indra/newview/skins/default/xui/da/panel_places.xml index c06176f994..ac15da1717 100644 --- a/indra/newview/skins/default/xui/da/panel_places.xml +++ b/indra/newview/skins/default/xui/da/panel_places.xml @@ -5,12 +5,12 @@ <filter_editor label="Filtrér mine steder" name="Filter"/> <panel name="button_panel"> <button label="Teleportér" name="teleport_btn" tool_tip="Teleportér til det valgte område"/> - <button label="Kort" name="map_btn"/> + <button label="Kort" name="map_btn" tool_tip="Vis dette område på verdenskortet"/> <button label="Redigér" name="edit_btn" tool_tip="Redigér landemærke information"/> <button label="▼" name="overflow_btn" tool_tip="Vise flere valgmuligheder"/> <button label="Gem" name="save_btn"/> <button label="Annullér" name="cancel_btn"/> <button label="Luk" name="close_btn"/> - <button label="Profil" name="profile_btn"/> + <button label="Profil" name="profile_btn" tool_tip="Vis profil for stedet"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml index 807d7939b8..b267c75673 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml @@ -13,7 +13,7 @@ </text> <check_box label="Byg/Redigér" name="edit_camera_movement" tool_tip="Benyt automatisk kamera positionering ved start og slut af editerings modus"/> <check_box label="Udseende" name="appearance_camera_movement" tool_tip="Benyt automatisk kamera positionering ved redigering"/> - <check_box initial_value="1" label="Sidepanel" name="appearance_sidebar_positioning" tool_tip="Benyt automatisk positionering af kamera"/> + <check_box initial_value="sand" label="Sidepanel" name="appearance_sidebar_positioning" tool_tip="Benyt automatisk positionering af kamera"/> <check_box label="Vis avatar i førsteperson" name="first_person_avatar_visible"/> <check_box label="Piletaster bruges altid til bevægelse" name="arrow_keys_move_avatar_check"/> <check_box label="Tast-tast-hold for at løbe" name="tap_tap_hold_to_run"/> diff --git a/indra/newview/skins/default/xui/da/panel_status_bar.xml b/indra/newview/skins/default/xui/da/panel_status_bar.xml index 08ffafd5a6..8633f12d24 100644 --- a/indra/newview/skins/default/xui/da/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/da/panel_status_bar.xml @@ -21,8 +21,10 @@ <panel.string name="buycurrencylabel"> L$ [AMT] </panel.string> - <button label="" label_selected="" name="buycurrency" tool_tip="Min balance"/> - <button label="Køb L$" name="buyL" tool_tip="Klik for at købe flere L$"/> + <panel name="balance_bg"> + <text name="balance" tool_tip="Min status" value="L$20"/> + <button label="KØB L$" name="buyL" tool_tip="Klik for at købe flere L$"/> + </panel> <text name="TimeText" tool_tip="Nuværende tid (Pacific)"> 24:00 PST </text> diff --git a/indra/newview/skins/default/xui/da/panel_voice_effect.xml b/indra/newview/skins/default/xui/da/panel_voice_effect.xml new file mode 100644 index 0000000000..8800d2e12d --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_voice_effect.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_voice_effect"> + <string name="no_voice_effect"> + Ingen stemme "morph" + </string> + <string name="preview_voice_effects"> + Se stemme "morph" ▶ + </string> + <string name="get_voice_effects"> + Hente stemme "morph" ▶ + </string> + <combo_box name="voice_effect" tool_tip="Vælg en stemme "morph" effekt for at ændre din stemme."> + <combo_box.item label="Ingen stemme "morph"" name="no_voice_effect"/> + </combo_box> +</panel> diff --git a/indra/newview/skins/default/xui/da/sidepanel_inventory.xml b/indra/newview/skins/default/xui/da/sidepanel_inventory.xml index 767d74ca3f..64ee3f0428 100644 --- a/indra/newview/skins/default/xui/da/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/da/sidepanel_inventory.xml @@ -2,12 +2,12 @@ <panel label="Ting" name="objects panel"> <panel label="" name="sidepanel__inventory_panel"> <panel name="button_panel"> - <button label="Profil" name="info_btn"/> - <button label="Del" name="share_btn"/> - <button label="Køb ind" name="shop_btn"/> - <button label="Bær" name="wear_btn"/> + <button label="Profil" name="info_btn" tool_tip="Vis objekt profil"/> + <button label="Del" name="share_btn" tool_tip="Del en genstand fra beholdning"/> + <button label="Køb ind" name="shop_btn" tool_tip="Åben hjemmeside for markedsplads"/> + <button label="Bær" name="wear_btn" tool_tip="Tag valgte sæt på"/> <button label="Afspil" name="play_btn"/> - <button label="Teleportér" name="teleport_btn"/> + <button label="Teleportér" name="teleport_btn" tool_tip="Teleport til det valgte område"/> </panel> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index 5ceb0612a8..af0f685826 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -95,7 +95,7 @@ Et ugyldig hostnavn blev brugt for at få adgang til serveren. Check venligst din SLURL eller navnet på hosten. </string> <string name="CertExpired"> - Certifikat returneret fra nettet ser ud til at være udløbet. Check venligst din systemtid eller kontakt administratoren af dette net. + Det certifikat der blev returneret ser ud til at være udløbet. Check venligst din systemtid på computeren. </string> <string name="CertKeyUsage"> Det certifikat der blev returneret af serveren kan ikke benyttes til SSL. Kontakt venligst administrator af dette net. @@ -104,7 +104,7 @@ For mange certifikater i serverens certifikat streng. Kontakt venligst administrator af dette net. </string> <string name="CertInvalidSignature"> - Certifikat signaturen returneret på dette net kan ikke bekræftes. Kontakt venligst administrator af dette net. + Signaturen på certifkat der blev returneret af Second Life serveren kunne ikke bekræftes. </string> <string name="LoginFailedNoNetwork"> Netværksfejl: Kunne ikke etablere forbindelse, check venligst din netværksforbindelse. @@ -729,6 +729,12 @@ <string name="land_type_unknown"> (ukendt) </string> + <string name="Estate / Full Region"> + Estate / Hel region + </string> + <string name="Mainland / Full Region"> + Mainland / Hel region + </string> <string name="all_files"> Alle filer </string> @@ -873,6 +879,9 @@ <string name="NewWearable"> Ny [WEARABLE_ITEM] </string> + <string name="CreateNewWearable"> + Opret [WEARABLE_TYPE] + </string> <string name="next"> Næste </string> @@ -3445,6 +3454,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="session_initialization_timed_out_error"> Initialisering af session er "timed out" </string> + <string name="voice_morphing_url"> + http://secondlife.com/landing/voicemorphing + </string> <string name="paid_you_ldollars"> [NAME] betalte dig L$[AMOUNT] </string> @@ -3615,16 +3627,16 @@ Krænkelsesanmeldelse <string name="Male - Wow"> Mand - Wow </string> - <string name="FeMale - Excuse me"> + <string name="Female - Excuse me"> Kvinde - Undskyld mig </string> - <string name="FeMale - Get lost"> + <string name="Female - Get lost"> Kvinde - Skrid! </string> - <string name="FeMale - Blow kiss"> + <string name="Female - Blow kiss"> Kvinde - Pust et kys </string> - <string name="FeMale - Boo"> + <string name="Female - Boo"> Kvinde - Boo </string> <string name="Female - Bored"> @@ -3657,4 +3669,32 @@ Krænkelsesanmeldelse <string name="texture_load_dimensions_error"> Kan ikke hente billeder større end [WIDTH]*[HEIGHT] </string> + <string name="words_separator" value=","/> + <string name="server_is_down"> + Desværre er noget gået galt. + + Check venligst status.secondlifegrid.net for at se om der skulle være driftsproblemer. + Hvis du bliver ved med at have problemer, check venligst din firewall- og netværksopsætning. + </string> + <string name="dateTimeWeekdaysNames"> + Søndag:Mandag:Tirsdag:Onsdag:Torsdag:Fredag:Lørdag + </string> + <string name="dateTimeWeekdaysShortNames"> + Søn:Man:Tir:Ons:Tor:Fre:Lør + </string> + <string name="dateTimeMonthNames"> + Januar:Februar:Marts:April:Maj:Juni:Juli:August:September:Oktober:November:December + </string> + <string name="dateTimeMonthShortNames"> + Jan:Feb:Mar:Apr:Maj:Jun:Jul:Aug:Sep:Okt:Nov:Dec + </string> + <string name="dateTimeDayFormat"> + [MDAY] + </string> + <string name="dateTimeAM"> + AM + </string> + <string name="dateTimePM"> + PM + </string> </strings> diff --git a/indra/newview/skins/default/xui/en/menu_outfit_tab.xml b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml index 9c3151fe07..8c8bb29baf 100644 --- a/indra/newview/skins/default/xui/en/menu_outfit_tab.xml +++ b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml @@ -8,6 +8,9 @@ name="wear_replace"> <on_click function="Outfit.WearReplace" /> + <on_enable + function="Outfit.OnEnable" + parameter="wear_replace" /> <on_visible function="Outfit.OnVisible" parameter="wear_replace" /> diff --git a/indra/newview/skins/default/xui/en/menu_wearing_gear.xml b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml new file mode 100644 index 0000000000..84431a2f69 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + layout="topleft" + name="Gear Wearing"> + <menu_item_call + label="Edit Outfit" + layout="topleft" + name="edit"> + <on_click + function="Gear.Edit" /> + </menu_item_call> +</menu> diff --git a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml new file mode 100644 index 0000000000..85505f9972 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<context_menu + layout="topleft" + name="Wearing"> + <menu_item_call + label="Edit Outfit" + layout="topleft" + name="edit"> + <on_click + function="Wearing.Edit" /> + </menu_item_call> +</context_menu> diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml index f016c27b0a..d2c8ab159f 100644 --- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml +++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml @@ -31,6 +31,7 @@ item_pad="3" layout="topleft" left="0" + keep_selection_visible_on_reshape="true" multi_select="true" name="list_attachments" top="0" @@ -45,6 +46,7 @@ follows="all" height="10" item_pad="3" + keep_selection_visible_on_reshape="true" layout="topleft" left="0" multi_select="true" @@ -61,6 +63,7 @@ follows="all" height="10" item_pad="3" + keep_selection_visible_on_reshape="true" layout="topleft" left="0" multi_select="true" 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 1ab9f722d0..fc1caca9e9 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -12,95 +12,125 @@ top="0" width="333"> <string - name="edit_shape_title" - value="Editing Shape" /> + name="edit_shape_title"> + Editing Shape + </string> <string - name="edit_skin_title" - value="Editing Skin" /> + name="edit_skin_title"> + Editing Skin + </string> <string - name="edit_hair_title" - value="Editing Hair" /> + name="edit_hair_title"> + Editing Hair + </string> <string - name="edit_eyes_title" - value="Editing Eyes" /> + name="edit_eyes_title"> + Editing Eyes + </string> <string - name="edit_shirt_title" - value="Editing Shirt" /> + name="edit_shirt_title"> + Editing Shirt + </string> <string - name="edit_pants_title" - value="Editing Pants" /> + name="edit_pants_title"> + Editing Pants + </string> <string - name="edit_shoes_title" - value="Editing Shoes" /> + name="edit_shoes_title"> + Editing Shoes + </string> <string - name="edit_socks_title" - value="Editing Socks" /> + name="edit_socks_title"> + Editing Socks + </string> <string - name="edit_jacket_title" - value="Editing Jacket" /> + name="edit_jacket_title"> + Editing Jacket + </string> <string - name="edit_skirt_title" - value="Editing Skirt" /> + name="edit_skirt_title"> + Editing Skirt + </string> <string - name="edit_gloves_title" - value="Editing Gloves" /> + name="edit_gloves_title"> + Editing Gloves + </string> <string - name="edit_undershirt_title" - value="Editing Undershirt" /> + name="edit_undershirt_title"> + Editing Undershirt + </string> <string - name="edit_underpants_title" - value="Editing Underpants" /> + name="edit_underpants_title"> + Editing Underpants + </string> <string - name="edit_alpha_title" - value="Editing Alpha Mask" /> + name="edit_alpha_title"> + Editing Alpha Mask + </string> <string - name="edit_tattoo_title" - value="Editing Tattoo" /> + name="edit_tattoo_title"> + Editing Tattoo + </string> <string - name="shape_desc_text" - value="Shape:" /> + name="shape_desc_text"> + Shape: + </string> <string - name="skin_desc_text" - value="Skin:" /> + name="skin_desc_text"> + Skin: + </string> <string - name="hair_desc_text" - value="Hair:" /> + name="hair_desc_text"> + Hair: + </string> <string - name="eyes_desc_text" - value="Eyes:" /> + name="eyes_desc_text"> + Eyes: + </string> <string - name="shirt_desc_text" - value="Shirt:" /> + name="shirt_desc_text"> + Shirt: + </string> <string - name="pants_desc_text" - value="Pants:" /> + name="pants_desc_text"> + Pants: + </string> <string - name="shoes_desc_text" - value="Shoes:" /> + name="shoes_desc_text"> + Shoes: + </string> <string - name="socks_desc_text" - value="Socks:" /> + name="socks_desc_text"> + Socks: + </string> <string - name="jacket_desc_text" - value="Jacket:" /> + name="jacket_desc_text"> + Jacket: + </string> <string - name="skirt_desc_text" - value="Skirt:" /> + name="skirt_desc_text"> + Skirt: + </string> <string - name="gloves_desc_text" - value="Gloves:" /> + name="gloves_desc_text"> + Gloves: + </string> <string - name="undershirt_desc_text" - value="Undershirt:" /> + name="undershirt_desc_text"> + Undershirt: + </string> <string - name="underpants_desc_text" - value="Underpants:" /> + name="underpants_desc_text"> + Underpants: + </string> <string - name="alpha_desc_text" - value="Alpha Mask:" /> + name="alpha_desc_text"> + Alpha Mask: + </string> <string - name="tattoo_desc_text" - value="Tattoo:" /> + name="tattoo_desc_text"> + Tattoo: + </string> <button follows="top|left" height="24" @@ -390,7 +420,7 @@ <button follows="bottomleft" height="23" - label="Revert" + label="Undo Changes" layout="topleft" left_pad="7" name="revert_button" diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index d6549adfef..4abd7dceac 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -391,12 +391,12 @@ It is calculated as border_size + 2*UIResizeBarOverlap follows="bottom|right" height="25" image_hover_unselected="Toolbar_Middle_Over" - image_overlay="AddItem_Off" + image_overlay="Shop" image_selected="Toolbar_Middle_Selected" image_unselected="Toolbar_Middle_Off" layout="topleft" left_pad="0" - name="shop_btn" + name="shop_btn_1" top="1" width="31" /> </panel> @@ -472,8 +472,20 @@ It is calculated as border_size + 2*UIResizeBarOverlap layout="topleft" left_pad="1" name="dummy_right_icon" - width="184" > + width="153" > </icon> + <button + follows="bottom|right" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="Shop" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + layout="topleft" + left_pad="0" + name="shop_btn_2" + top="1" + width="31" /> </panel> <!-- SAVE AND REVERT BUTTONS --> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index a59070496e..b365540d1f 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -34,22 +34,32 @@ follows="all" label="MY OUTFITS" layout="topleft" - width="315" /> - <inventory_panel - follows="all" + width="312" /> + <panel background_visible="true" - background_opaque="true" - label="WEARING" + class="panel_wearing" + follows="all" + height="490" help_topic="now_wearing_tab" - allow_multi_select="true" - border="false" - left="0" - top="0" - mouse_opaque="true" + label="WEARING" + layout="topleft" name="cof_tab" - start_folder="Current Outfit" - use_label_suffix="true" - width="315" /> + width="312"> + <wearable_items_list + allow_select="true" + follows="all" + height="490" + keep_one_selected="true" + left="1" + multi_select="true" + name="cof_items_list" + standalone="false" + top="0" + translate="false" + width="310" + worn_indication_enabled="false" + /> + </panel> </tab_container> <panel background_visible="true" @@ -84,7 +94,7 @@ width="241" /> - <dnd_button + <button follows="bottom|right" height="25" image_hover_unselected="Toolbar_Right_Over" diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index e189d11d35..9a07d3a48a 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -21,6 +21,9 @@ width="333"> <string name="Now Wearing" value="Now wearing..." /> + <string + name="Changing outfits" + value="Changing outfits" /> <panel background_opaque="true" background_visible="true" diff --git a/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml b/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml index dbe1ea2874..50be0ac1a1 100644 --- a/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml @@ -14,5 +14,6 @@ <!-- style for inventory list item WORN on avatar --> <worn_style font="SansSerifSmall" - font.style="BOLD" /> + font.style="BOLD" + color="EmphasisColor" /> </inventory_list_item> diff --git a/indra/newview/skins/default/xui/fr/floater_camera.xml b/indra/newview/skins/default/xui/fr/floater_camera.xml index 558551b649..b0834fe170 100644 --- a/indra/newview/skins/default/xui/fr/floater_camera.xml +++ b/indra/newview/skins/default/xui/fr/floater_camera.xml @@ -9,35 +9,28 @@ <floater.string name="move_tooltip"> Déplacer la caméra vers le haut et le bas, la gauche et la droite </floater.string> - <floater.string name="orbit_mode_title"> - Faire tourner + <floater.string name="camera_modes_title"> + Modes </floater.string> <floater.string name="pan_mode_title"> - Faire un panoramique + Rotation - Zoom - Panoramique </floater.string> - <floater.string name="avatar_view_mode_title"> + <floater.string name="presets_mode_title"> Préréglages </floater.string> <floater.string name="free_mode_title"> Voir l'objet </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"/> <panel 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"/> <slider_bar name="zoom_slider" tool_tip="Zoomer en direction du point central"/> - </panel> - <joystick_rotate name="cam_rotate_stick" tool_tip="Faire tourner la caméra autour du point central"/> - <panel name="camera_presets"> - <button name="rear_view" tool_tip="Vue arrière"/> - <button name="group_view" tool_tip="Vue Groupe"/> - <button name="front_view" tool_tip="Vue frontale"/> - <button name="mouselook_view" tool_tip="Vue subjective"/> + <joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut et le bas, la gauche et la droite"/> </panel> </panel> <panel name="buttons"> - <button label="" name="orbit_btn" tool_tip="Faire tourner la caméra"/> - <button label="" name="pan_btn" tool_tip="Faire un panoramique"/> - <button label="" name="avatarview_btn" tool_tip="Préréglages"/> - <button label="" name="freecamera_btn" tool_tip="Voir l'objet"/> + <button label="" name="presets_btn" tool_tip="Préréglages"/> + <button label="" name="pan_btn" tool_tip="Rotation - Zoom - Panoramique"/> + <button label="" name="avatarview_btn" tool_tip="Modes"/> </panel> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_incoming_call.xml b/indra/newview/skins/default/xui/fr/floater_incoming_call.xml index 110c61aedc..43a7424851 100644 --- a/indra/newview/skins/default/xui/fr/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/fr/floater_incoming_call.xml @@ -16,7 +16,13 @@ a rejoint un chat vocal avec conférence. </floater.string> <floater.string name="VoiceInviteGroup"> - a rejoint un chat vocal avec le groupe [GROUP]. + vient de rejoindre le canal vocal [GROUP]. + </floater.string> + <floater.string name="VoiceInviteQuestionGroup"> + Voulez-vous quitter [CURRENT_CHAT] et rejoindre l'appel avec [GROUP] ? + </floater.string> + <floater.string name="VoiceInviteQuestionDefault"> + Voulez-vous quitter [CURRENT_CHAT] et rejoindre ce chat vocal ? </floater.string> <text name="question"> Voulez-vous quitter [CURRENT_CHAT] et rejoindre ce chat vocal ? diff --git a/indra/newview/skins/default/xui/fr/floater_snapshot.xml b/indra/newview/skins/default/xui/fr/floater_snapshot.xml index 381a513bda..033ee7443c 100644 --- a/indra/newview/skins/default/xui/fr/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/fr/floater_snapshot.xml @@ -5,12 +5,19 @@ </floater.string> <button label="Rafraîchir" name="new_snapshot_btn"/> <line_editor label="Description" name="description"/> - <button label="Partager" name="share"/> - <button label="Partage Web" name="share_to_web"/> - <button label="Dans mon inventaire" name="save_to_inventory"/> - <button label="Enregistrer" name="save"/> - <button label="Envoi par e-mail" name="share_to_email"/> - <button label="Sur mon ordinateur" name="save_to_computer"/> - <button label="Image de profil" name="set_profile_pic"/> - <button label="Précédent" name="cancel"/> + <panel name="panel_snapshot_main"> + <button label="Partager" name="share"/> + <button label="Enregistrer" name="save"/> + <button label="Image de profil" name="set_profile_pic"/> + </panel> + <panel name="panel_snapshot_share"> + <button label="Partage Web" name="share_to_web"/> + <button label="Envoi par e-mail" name="share_to_email"/> + <button label="Précédent" name="cancel_share"/> + </panel> + <panel name="panel_snapshot_save"> + <button label="Dans mon inventaire" name="save_to_inventory"/> + <button label="Sur mon ordinateur" name="save_to_computer"/> + <button label="Précédent" name="cancel_save"/> + </panel> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml index 1a7bc228fa..5c26527ed6 100644 --- a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml @@ -19,8 +19,10 @@ <layout_panel name="my_panel"> <text name="user_text" value="Mon avatar :"/> </layout_panel> - <layout_panel name="leave_call_btn_panel"> - <button label="Quitter l'appel" name="leave_call_btn"/> - </layout_panel> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="Quitter l'appel" name="leave_call_btn"/> + </layout_panel> + </layout_stack> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_voice_effect.xml b/indra/newview/skins/default/xui/fr/floater_voice_effect.xml new file mode 100644 index 0000000000..d7f0ff7f6b --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_voice_effect.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater label="Endroits" name="voice_effects" title="APERÇU DES EFFETS DE VOIX"> + <string name="no_voice_effect"> + (Aucun effet de voix) + </string> + <string name="active_voice_effect"> + (Actif) + </string> + <string name="unsubscribed_voice_effect"> + (Pas d'abonnement) + </string> + <string name="new_voice_effect"> + (Nouveau !) + </string> + <text name="status_text"> + Pour obtenir un aperçu des effets, enregistrez un court extrait de votre voix en cliquant sur le bouton ci-dessous, puis cliquez sur l'une des entrées de la liste. Vous entendrez alors le son de votre voix transformée. + +Pour vous reconnecter au chat vocal près de vous, fermez cette fenêtre. + </text> + <button label="Enregistrer un extrait" name="record_btn" tool_tip="Enregistrez un extrait de votre voix."/> + <button label="Arrêter" name="record_stop_btn"/> + <text name="voice_morphing_link"> + [[URL] Obtenir un effet de voix] + </text> + <scroll_list name="voice_effect_list" tool_tip="Enregistrez un extrait de votre voix, puis cliquez sur un effet pour obtenir un aperçu."> + <scroll_list.columns label="Effet de voix" name="name"/> + <scroll_list.columns label="Date d'expiration" name="expires"/> + </scroll_list> +</floater> diff --git a/indra/newview/skins/default/xui/fr/inspect_object.xml b/indra/newview/skins/default/xui/fr/inspect_object.xml index e50de400fd..b66af7a2bf 100644 --- a/indra/newview/skins/default/xui/fr/inspect_object.xml +++ b/indra/newview/skins/default/xui/fr/inspect_object.xml @@ -8,8 +8,8 @@ Par [CREATOR] </string> <string name="CreatorAndOwner"> - par [CREATOR] -propriétaire [OWNER] + De [CREATOR] +Propriétaire [OWNER] </string> <string name="Price"> [AMOUNT] L$ @@ -23,16 +23,16 @@ propriétaire [OWNER] <string name="Sit"> M'asseoir </string> - <text name="object_name" value="Nom d'objet de test vraiment très long"/> + <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/> <text name="object_creator"> par secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about </text> <text name="price_text"> - 300 000 L$ + 30 000 L$ </text> <text name="object_description"> - Cette description d'objet est vraiment très longue : elle compte au moins 80 caractères, voire plus de 120, vraiment très très longue. Who knows, really? + This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really? </text> <text name="object_media_url"> http://www.superdupertest.com diff --git a/indra/newview/skins/default/xui/fr/menu_cof_attachment.xml b/indra/newview/skins/default/xui/fr/menu_cof_attachment.xml new file mode 100644 index 0000000000..a4ead48b6b --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_cof_attachment.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Attachment"> + <menu_item_call label="Détacher" name="detach"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_cof_body_part.xml b/indra/newview/skins/default/xui/fr/menu_cof_body_part.xml new file mode 100644 index 0000000000..4b6907fcc6 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_cof_body_part.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Body"> + <menu_item_call label="Remplacer" name="replace"/> + <menu_item_call label="Modifier" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_cof_clothing.xml b/indra/newview/skins/default/xui/fr/menu_cof_clothing.xml new file mode 100644 index 0000000000..c5641c756a --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_cof_clothing.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="COF Clothing"> + <menu_item_call label="Enlever" name="take_off"/> + <menu_item_call label="Couche supérieure" name="move_up"/> + <menu_item_call label="Couche inférieure" name="move_down"/> + <menu_item_call label="Modifier" name="edit"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_cof_gear.xml b/indra/newview/skins/default/xui/fr/menu_cof_gear.xml new file mode 100644 index 0000000000..8276d57025 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_cof_gear.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear COF"> + <menu label="Nouveaux habits" name="COF.Gear.New_Clothes"/> + <menu label="Nouvelles parties du corps" name="COF.Geear.New_Body_Parts"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml b/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml index 3a7126fe50..86a2ddd185 100644 --- a/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/fr/menu_hide_navbar.xml @@ -2,4 +2,5 @@ <menu name="hide_navbar_menu"> <menu_item_check label="Afficher la barre de navigation" name="ShowNavbarNavigationPanel"/> <menu_item_check label="Afficher la barre des Favoris" name="ShowNavbarFavoritesPanel"/> + <menu_item_check label="Afficher la mini-barre d'emplacement" name="ShowMiniLocationPanel"/> </menu> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml index 4b9a05edd6..8b0d726e51 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml @@ -81,6 +81,7 @@ <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="Ajouter" name="Wearable Add"/> <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_outfit_gear.xml b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml new file mode 100644 index 0000000000..93730c6206 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_outfit_gear.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<menu name="Gear Outfit"> + <menu_item_call label="Porter - Remplacer la tenue actuelle" name="wear"/> + <menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/> + <menu label="Nouveaux habits" name="New Clothes"> + <menu_item_call label="Nouvelle chemise" name="New Shirt"/> + <menu_item_call label="Nouveau pantalon" name="New Pants"/> + <menu_item_call label="Nouvelles chaussures" name="New Shoes"/> + <menu_item_call label="Nouvelles chaussettes" name="New Socks"/> + <menu_item_call label="Nouvelle veste" name="New Jacket"/> + <menu_item_call label="Nouvelle jupe" name="New Skirt"/> + <menu_item_call label="Nouveaux gants" name="New Gloves"/> + <menu_item_call label="Nouveau débardeur" name="New Undershirt"/> + <menu_item_call label="Nouveau caleçon" name="New Underpants"/> + <menu_item_call label="Nouvel alpha" name="New Alpha"/> + <menu_item_call label="Nouveau tatouage" name="New Tattoo"/> + </menu> + <menu label="Nouvelles parties du corps" name="New Body Parts"> + <menu_item_call label="Nouvelle silhouette" name="New Shape"/> + <menu_item_call label="Nouvelle peau" name="New Skin"/> + <menu_item_call label="Nouveaux cheveux" name="New Hair"/> + <menu_item_call label="Nouveaux yeux" name="New Eyes"/> + </menu> + <menu_item_call label="Renommer la tenue" name="rename"/> + <menu_item_call label="Supprimer la tenue" name="delete_outfit"/> +</menu> diff --git a/indra/newview/skins/default/xui/fr/menu_outfit_tab.xml b/indra/newview/skins/default/xui/fr/menu_outfit_tab.xml new file mode 100644 index 0000000000..a68715108f --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_outfit_tab.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit"> + <menu_item_call label="Porter - Remplacer la tenue actuelle" name="wear_replace"/> + <menu_item_call label="Porter - Ajouter à la tenue actuelle" name="wear_add"/> + <menu_item_call label="Enlever - Supprimer de la tenue actuelle" name="take_off"/> + <menu_item_call label="Modifier la tenue" name="edit"/> + <menu_item_call label="Renommer" name="rename"/> + <menu_item_call label="Supprimer la tenue" name="delete"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_save_outfit.xml b/indra/newview/skins/default/xui/fr/menu_save_outfit.xml index fbec933382..f78db411b3 100644 --- a/indra/newview/skins/default/xui/fr/menu_save_outfit.xml +++ b/indra/newview/skins/default/xui/fr/menu_save_outfit.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <toggleable_menu name="save_outfit_menu"> <menu_item_call label="Enregistrer" name="save_outfit"/> - <menu_item_call label="Enregistrer comme nouvelle" name="save_as_new_outfit"/> + <menu_item_call label="Enregistrer sous" name="save_as_new_outfit"/> </toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 4c7cdefbe8..0976f0c72a 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -11,6 +11,7 @@ <menu_item_check label="Mon inventaire" name="Inventory"/> <menu_item_check label="Mon inventaire" name="ShowSidetrayInventory"/> <menu_item_check label="Mes gestes" name="Gestures"/> + <menu_item_check label="Ma voix" name="ShowVoice"/> <menu label="Mon statut" name="Status"> <menu_item_call label="Absent" name="Set Away"/> <menu_item_call label="Occupé" name="Set Busy"/> @@ -70,6 +71,12 @@ <menu_item_call label="Lien" name="Link"/> <menu_item_call label="Annuler le lien" name="Unlink"/> <menu_item_check label="Modifier les parties liées" name="Edit Linked Parts"/> + <menu label="Sélectionner les parties liées" name="Select Linked Parts"> + <menu_item_call label="Sélectionner la partie suivante" name="Select Next Part"/> + <menu_item_call label="Sélectionner la partie précédente" name="Select Previous Part"/> + <menu_item_call label="Inclure la partie suivante" name="Include Next Part"/> + <menu_item_call label="Inclure la partie précédente" name="Include Previous Part"/> + </menu> <menu_item_call label="Point central sur la sélection" name="Focus on Selection"/> <menu_item_call label="Zoomer sur la sélection" name="Zoom to Selection"/> <menu label="Objet" name="Object"> @@ -100,11 +107,11 @@ <menu_item_call label="Utiliser la sélection pour la grille" name="Use Selection for Grid"/> <menu_item_call label="Options de la grille" name="Grid Options"/> </menu> - <menu label="Sélectionner les parties liées" name="Select Linked Parts"> - <menu_item_call label="Sélectionner la partie suivante" name="Select Next Part"/> - <menu_item_call label="Sélectionner la partie précédente" name="Select Previous Part"/> - <menu_item_call label="Inclure la partie suivante" name="Include Next Part"/> - <menu_item_call label="Inclure la partie précédente" name="Include Previous Part"/> + <menu label="Charger" name="Upload"> + <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/> + <menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/> + <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/> + <menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/> </menu> </menu> <menu label="Aide" name="Help"> diff --git a/indra/newview/skins/default/xui/fr/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/fr/menu_wearable_list_item.xml new file mode 100644 index 0000000000..207ba79148 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_wearable_list_item.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<context_menu name="Outfit Wearable Context Menu"> + <menu_item_call label="Porter" name="wear"/> + <menu_item_call label="Ajouter" name="wear_add"/> + <menu_item_call label="Enlever / Détacher" name="take_off_or_detach"/> + <menu_item_call label="Détacher" name="detach"/> + <context_menu label="Attacher à ▶" name="wearable_attach_to"/> + <context_menu label="Attacher au HUD ▶" name="wearable_attach_to_hud"/> + <menu_item_call label="Enlever" name="take_off"/> + <menu_item_call label="Modifier" name="edit"/> + <menu_item_call label="Profil de l'objet" name="object_profile"/> + <menu_item_call label="Afficher l'original" name="show_original"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index bb1c4242ee..32f779f538 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -474,7 +474,9 @@ La qualité des graphiques peut être augmentée à la section Préférences > 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 ? + Vous n'êtes pas autorisé à copier les articles suivants : +[ITEMS]. +Ceux-ci disparaîtront donc de votre inventaire si vous les donnez. Voulez-vous vraiment offrir ces articles ? <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> </notification> <notification name="CannotGiveItem"> @@ -943,6 +945,26 @@ Proposer à [NAME] de devenir votre ami(e) ? <button name="Cancel" text="Annuler"/> </form> </notification> + <notification label="Enregistrer l'article à porter" name="SaveWearableAs"> + Enregistrer l'article dans mon inventaire comme : + <form name="form"> + <input name="message"> + [DESC] (nouv.) + </input> + <button name="Offer" text="OK"/> + <button name="Cancel" text="Annuler"/> + </form> + </notification> + <notification label="Renommer la tenue" name="RenameOutfit"> + Nouveau nom de la tenue : + <form name="form"> + <input name="new_name"> + [NAME] + </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"/> @@ -1555,7 +1577,7 @@ Souhaitez-vous en savoir plus sur les différentes catégories d'accès ? <notification name="RegionEntryAccessBlocked_Change"> La catégorie de contenu définie dans vos préférences ne vous permet pas de pénétrer dans cette région. -Pour cela, cliquez sur Modifier les préférences afin de spécifier une catégorie plus élevée. Vous pourrez alors rechercher du contenu [REGIONMATURITY] et y accéder. Pour modifier ce paramètre ultérieurement, accédez à Moi > Préférences > Général, le moment voulu. +Pour cela, vous devez modifier votre paramètre de catégorie de contenu. Vous pourrez alors rechercher du contenu [REGIONMATURITY] et y accéder. Pour annuler vos modifications, accédez à Moi > 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"/> @@ -2573,6 +2595,21 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore <notification name="VoiceLoginRetry"> Nous sommes en train de créer un canal vocal pour vous. Veuillez patienter quelques instants. </notification> + <notification name="VoiceEffectsExpired"> + Au moins l'un des effets de voix auxquels vous êtes abonné a expiré. +[[URL] Cliquez ici] pour renouveler votre abonnement. + </notification> + <notification name="VoiceEffectsExpiredInUse"> + L'effet de voix actif a expiré. Vos paramètres de voix normaux ont été rétablis. +[[URL] Cliquez ici] pour renouveler votre abonnement. + </notification> + <notification name="VoiceEffectsWillExpire"> + Au moins l'un de vos effets de voix expirera dans moins de [INTERVAL] jours. +[[URL] Cliquez ici] pour renouveler votre abonnement. + </notification> + <notification name="VoiceEffectsNew"> + De nouveaux effets de voix sont disponibles ! + </notification> <notification name="Cannot enter parcel: not a group member"> Seuls les membres d'un certain groupe peuvent visiter cette zone. </notification> @@ -2639,18 +2676,36 @@ Elles vont être bloquées pendant quelques secondes pour votre sécurité. Le bouton sera affiché quand il y aura suffisamment de place. </notification> <notification name="ShareNotification"> - Faire glisser des articles de l'inventaire sur une personne dans le sélecteur de résident + Sélectionnez les résidents avec lesquels partager l'élément. + </notification> + <notification name="ShareItemsConfirmation"> + Voulez-vous vraiment partager les articles suivants : + +[ITEMS] + +avec les résidents suivants : + +[RESIDENTS] ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Ok"/> + </notification> + <notification name="ItemsShared"> + Articles partagés. </notification> <notification name="DeedToGroupFail"> Échec de cession au groupe. </notification> <notification name="AvatarRezNotification"> ([EXISTENCE] secondes d'existence) -Nuage de l'avatar [NAME] disparu en [TIME] secondes. +Nuage de l'avatar [NAME] disparu au bout de [TIME] secondes. </notification> - <notification name="AvatarRezSelfNotification"> + <notification name="AvatarRezSelfBakedDoneNotification"> ([EXISTENCE] secondes d'existence) -Vous avez terminé de figer votre tenue en [TIME] secondes. +Tenue figée au bout de [TIME] secondes. + </notification> + <notification name="AvatarRezSelfBakedUpdateNotification"> + ([EXISTENCE] secondes d'existence) +Mise à jour de votre apparence transmise au bout de [TIME] secondes. +[STATUS] </notification> <notification name="AvatarRezCloudNotification"> ([EXISTENCE] secondes d'existence) @@ -2672,10 +2727,32 @@ L'avatar [NAME] est entré en mode Apparence. ([EXISTENCE] secondes d'existence) L'avatar [NAME] a quitté le mode Apparence. </notification> + <notification name="NoConnect"> + Problèmes de connexion via [PROTOCOL] [HOSTID]. +Veuillez vérifier la configuration de votre réseau et de votre pare-feu. + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> + <notification name="NoVoiceConnect"> + Problèmes de connexion à votre serveur vocal : + +[HOSTID] + +Aucune communication vocale n'est disponible. +Veuillez vérifier la configuration de votre réseau et de votre pare-feu. + <form name="form"> + <button name="OK" text="OK"/> + </form> + </notification> <notification name="AvatarRezLeftNotification"> ([EXISTENCE] secondes d'existence) Départ de l'avatar [NAME] entièrement chargé. </notification> + <notification name="AvatarRezSelfBakeNotification"> + ([EXISTENCE] secondes d'existence) +Texture figée de [RESOLUTION] chargée pour [BODYREGION] au bout de [TIME] secondes. + </notification> <notification name="ConfirmLeaveCall"> Voulez-vous vraiment quitter cet appel ? <usetemplate ignoretext="Confirmer avant de quitter l'appel" name="okcancelignore" notext="Non" yestext="Oui"/> @@ -2686,7 +2763,7 @@ Les résidents rejoignant l'appel ultérieurement seront également ignorés, même si vous quittez l'appel. Ignorer les autres ? - <usetemplate ignoretext="Confirmer avant d'ignorer les autres lors d'un appel de groupe" name="okcancelignore" notext="Ok" yestext="Annuler"/> + <usetemplate ignoretext="Confirmer avant d'ignorer les autres lors d'un appel de groupe" name="okcancelignore" notext="Annuler" yestext="Ok"/> </notification> <global name="UnsupportedCPU"> - Votre processeur ne remplit pas les conditions minimum requises. diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shape.xml b/indra/newview/skins/default/xui/fr/panel_edit_shape.xml index 88f0635d97..6a5f71a36b 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_shape.xml @@ -1,8 +1,15 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shape_panel"> - <text name="avatar_height"> - Taille : [HEIGHT] mètres - </text> + <string name="meters"> + mètres + </string> + <string name="feet"> + pieds + </string> + <string name="height"> + Taille : + </string> + <text name="avatar_height"/> <panel label="Chemise" name="accordion_panel"> <accordion name="wearable_accordion"> <accordion_tab name="shape_body_tab" title="Corps"/> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml index e0762bd791..60c46a9f2e 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml @@ -72,8 +72,8 @@ <string name="jacket_desc_text"> Veste : </string> - <string name="skirt_skirt_desc_text"> - Jupe : + <string name="skirt_desc_text"> + Jupe : </string> <string name="gloves_desc_text"> Gants : @@ -100,11 +100,6 @@ <icon name="male_icon" tool_tip="Homme"/> <icon name="female_icon" tool_tip="Femme"/> </panel> - <panel label="gear_buttom_panel" name="gear_buttom_panel"> - <button name="friends_viewsort_btn" tool_tip="Options"/> - <button name="add_btn" tool_tip="TODO"/> - <button name="del_btn" tool_tip="TODO"/> - </panel> <panel name="button_panel"> <button label="Enregistrer sous" name="save_as_button"/> <button label="Rétablir" name="revert_button" width="130"/> diff --git a/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml b/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml index 4c869d05c8..0764cfb6e7 100644 --- a/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml @@ -13,7 +13,7 @@ <string name="Filter.All" value="Tout"/> <string name="Filter.Clothes/Body" value="Habits/Corps"/> <string name="Filter.Objects" value="Objets"/> - <button label="modifier" name="edit_wearable_btn"/> + <string name="Filter.Custom" value="Filtre personnalisé"/> <text name="title" value="Modifier la tenue"/> <panel label="bottom_panel" name="header_panel"> <panel label="bottom_panel" name="outfit_name_and_status"> @@ -23,20 +23,16 @@ </panel> <layout_stack name="im_panels"> <layout_panel label="Panneau de contrôle IM" name="outfit_wearables_panel"> - <panel label="bottom_panel" name="edit_panel"/> - </layout_panel> - <layout_panel name="add_wearables_panel"> - <text name="add_to_outfit_label" value="Ajouter à la tenue :"/> <layout_stack name="filter_panels"> - <layout_panel label="Panneau de contrôle IM" name="filter_panel"> - <filter_editor label="Filtre" name="look_item_filter"/> + <layout_panel name="add_button_and_combobox"> + <button label="Ajouter plus..." name="show_add_wearables_btn"/> + </layout_panel> + <layout_panel name="filter_panel"> + <filter_editor label="Filtrer ce qui peut être porté dans l'inventaire" name="look_item_filter"/> </layout_panel> </layout_stack> - <panel label="add_wearables_button_bar" name="add_wearables_button_bar"> - <button label="D" name="folder_view_btn"/> - <button label="L" name="list_view_btn"/> - </panel> </layout_panel> + <layout_panel name="add_wearables_panel"/> </layout_stack> <panel name="save_revert_button_bar"> <button label="Enregistrer" name="save_btn"/> diff --git a/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml index f4fa3a2838..22e6adfb89 100644 --- a/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml @@ -7,8 +7,7 @@ <panel name="bottom_panel"> <button name="options_gear_btn" tool_tip="Afficher d'autres options"/> <dnd_button name="trash_btn" tool_tip="Supprimer l'objet sélectionné"/> - <button label="Enregistrer la tenue" name="make_outfit_btn" tool_tip="Enregistrer l'apparence comme tenue"/> + <button label="Enregistrer sous" name="save_btn"/> <button label="Porter" name="wear_btn" tool_tip="Porter la tenue sélectionnée"/> - <button label="Modifier tenue" name="edit_current_outfit_btn"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_places.xml b/indra/newview/skins/default/xui/fr/panel_places.xml index 9990c4612d..efb06cfce9 100644 --- a/indra/newview/skins/default/xui/fr/panel_places.xml +++ b/indra/newview/skins/default/xui/fr/panel_places.xml @@ -5,12 +5,12 @@ <filter_editor label="Filtrer les endroits" name="Filter"/> <panel name="button_panel"> <button label="Téléporter" name="teleport_btn" tool_tip="Me téléporter jusqu'à la zone sélectionnée"/> - <button label="Carte" name="map_btn"/> + <button label="Carte" name="map_btn" tool_tip="Afficher la zone correspondante sur la carte du monde"/> <button label="Éditer" name="edit_btn" tool_tip="Modifier les informations du repère"/> <button label="▼" name="overflow_btn" tool_tip="Afficher d'autres options"/> <button label="Enregistrer" name="save_btn"/> <button label="Annuler" name="cancel_btn"/> <button label="Fermer" name="close_btn"/> - <button label="Profil" name="profile_btn"/> + <button label="Profil" name="profile_btn" tool_tip="Afficher le profil de l'endroit"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml index 6b8e68bd98..9af3a8a5d8 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml @@ -13,7 +13,7 @@ </text> <check_box label="Construire/Modifier" name="edit_camera_movement" tool_tip="Utilisez le positionnement automatique de la caméra quand vous accédez au mode de modification et quand vous le quittez"/> <check_box label="Apparence" name="appearance_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra quand je suis en mode Édition"/> - <check_box label="Panneau latéral" name="appearance_sidebar_positioning" tool_tip="Positionnement auto de la caméra pour le panneau latéral"/> + <check_box initial_value="true" label="Panneau latéral" name="appearance_sidebar_positioning" tool_tip="Positionnement auto de la caméra pour le panneau latéral"/> <check_box label="Afficher en vue subjective" name="first_person_avatar_visible"/> <check_box label="Les touches de direction me font toujours me déplacer" name="arrow_keys_move_avatar_check"/> <check_box label="Appuyer deux fois et maintenir enfoncé pour courir" name="tap_tap_hold_to_run"/> 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 dffb1d4238..3c56fa68e7 100644 --- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml @@ -21,8 +21,10 @@ <panel.string name="buycurrencylabel"> [AMT] L$ </panel.string> - <button label="" label_selected="" name="buycurrency" tool_tip="Mon solde"/> - <button label="Acheter L$" name="buyL" tool_tip="Cliquez pour acheter plus de L$"/> + <panel name="balance_bg"> + <text name="balance" tool_tip="Mon solde" value="20 L$"/> + <button label="ACHETER L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$"/> + </panel> <text name="TimeText" tool_tip="Heure actuelle (Pacifique)"> 00h00 PST </text> diff --git a/indra/newview/skins/default/xui/fr/panel_voice_effect.xml b/indra/newview/skins/default/xui/fr/panel_voice_effect.xml new file mode 100644 index 0000000000..01734295f2 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_voice_effect.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel name="panel_voice_effect"> + <string name="no_voice_effect"> + Aucun effet de voix + </string> + <string name="preview_voice_effects"> + Aperçu des effets de voix ▶ + </string> + <string name="get_voice_effects"> + Obtenir un effet de voix ▶ + </string> + <combo_box name="voice_effect" tool_tip="Sélectionnez un effet pour modifier le son de votre voix."> + <combo_box.item label="Aucun effet de voix" name="no_voice_effect"/> + </combo_box> +</panel> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml b/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml index 893b64d4b2..ebee1af45b 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml @@ -2,12 +2,12 @@ <panel label="Choses" name="objects panel"> <panel label="" name="sidepanel__inventory_panel"> <panel name="button_panel"> - <button label="Profil" name="info_btn"/> - <button label="Partager" name="share_btn"/> - <button label="Acheter" name="shop_btn"/> - <button label="Porter" name="wear_btn"/> + <button label="Profil" name="info_btn" tool_tip="Afficher le profil de l'objet"/> + <button label="Partager" name="share_btn" tool_tip="Partager un article de l'inventaire"/> + <button label="Acheter" name="shop_btn" tool_tip="Accéder à la place du marché sur le Web"/> + <button label="Porter" name="wear_btn" tool_tip="Porter la tenue sélectionnée"/> <button label="Jouer" name="play_btn"/> - <button label="Téléporter" name="teleport_btn"/> + <button label="Téléporter" name="teleport_btn" tool_tip="Me téléporter jusqu'à la zone sélectionnée"/> </panel> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 15d5847c58..d95cfaedb4 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -107,7 +107,7 @@ Nom d'hôte non valide utilisé pour accéder au serveur. Vérifiez votre nom d'hôte de grille ou SLURL. </string> <string name="CertExpired"> - Il semble que le certificat renvoyé par la grille ait expiré. Vérifiez votre horloge système ou contactez l'administrateur de la grille. + Il semble que le certificat renvoyé par la grille ait expiré. Vérifiez votre horloge système ou contactez l'administrateur de la grille. </string> <string name="CertKeyUsage"> Impossible d'utiliser le certificat renvoyé par le serveur pour SSL. Contactez l'administrateur de la grille. @@ -116,7 +116,7 @@ Certificats trop nombreux dans la chaîne des certificats du serveur. Contactez l'administrateur de la grille. </string> <string name="CertInvalidSignature"> - Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l'administrateur de la grille. + Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l'administrateur de la grille. </string> <string name="LoginFailedNoNetwork"> Erreur réseau : impossible d'établir la connexion. Veuillez vérifier votre connexion réseau. @@ -753,6 +753,12 @@ <string name="land_type_unknown"> (inconnu) </string> + <string name="Estate / Full Region"> + Domaine / Région entière + </string> + <string name="Mainland / Full Region"> + Continent / Région entière + </string> <string name="all_files"> Tous fichiers </string> @@ -897,6 +903,9 @@ <string name="NewWearable"> Nouv. [WEARABLE_ITEM] </string> + <string name="CreateNewWearable"> + Créer [WEARABLE_TYPE] + </string> <string name="next"> Suivant </string> @@ -3550,6 +3559,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="session_initialization_timed_out_error"> Expiration du délai d'initialisation de la session </string> + <string name="voice_morphing_url"> + http://secondlife.com/landing/voicemorphing + </string> <string name="paid_you_ldollars"> [NAME] vous a payé [AMOUNT] L$ </string> @@ -3720,16 +3732,16 @@ de l'infraction signalée <string name="Male - Wow"> Homme - Ouah ! </string> - <string name="FeMale - Excuse me"> + <string name="Female - Excuse me"> Femme - Demander pardon </string> - <string name="FeMale - Get lost"> + <string name="Female - Get lost"> Femme - Dire d'aller au diable </string> - <string name="FeMale - Blow kiss"> + <string name="Female - Blow kiss"> Femme - Envoyer un baiser </string> - <string name="FeMale - Boo"> + <string name="Female - Boo"> Femme - Hou ! </string> <string name="Female - Bored"> @@ -3762,4 +3774,32 @@ de l'infraction signalée <string name="texture_load_dimensions_error"> Impossible de charger des images de taille supérieure à [WIDTH]*[HEIGHT] </string> + <string name="words_separator" value=","/> + <string name="server_is_down"> + Malgré nos efforts, une erreur inattendue s'est produite. + + Veuillez vous reporter à status.secondlifegrid.net afin de déterminer si un problème connu existe avec ce service. + Si le problème persiste, vérifiez la configuration de votre réseau et de votre pare-feu. + </string> + <string name="dateTimeWeekdaysNames"> + Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday + </string> + <string name="dateTimeWeekdaysShortNames"> + Sun:Mon:Tue:Wed:Thu:Fri:Sat + </string> + <string name="dateTimeMonthNames"> + January:February:March:April:May:June:July:August:September:October:November:December + </string> + <string name="dateTimeMonthShortNames"> + Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec + </string> + <string name="dateTimeDayFormat"> + [MDAY] + </string> + <string name="dateTimeAM"> + AM + </string> + <string name="dateTimePM"> + PM + </string> </strings> diff --git a/install.xml b/install.xml index f69d781c67..39806a664d 100644 --- a/install.xml +++ b/install.xml @@ -200,9 +200,9 @@ <key>linux</key> <map> <key>md5sum</key> - <string>d58ac1a8396ac983b67cc3e3541457e3</string> + <string>4db3d74e40d149eeec06f4d97a609bb1</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20100222a.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20100624.tar.bz2</uri> </map> <key>linux64</key> <map> |