diff options
36 files changed, 1259 insertions, 1323 deletions
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index 0805e94b10..263b73ba23 100644 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -497,6 +497,7 @@ PARCEL_DETAILS_DESC Used with llGetParcelDetails to get the parcel description. PARCEL_DETAILS_OWNER Used with llGetParcelDetails to get the parcel owner id. PARCEL_DETAILS_GROUP Used with llGetParcelDetails to get the parcel group id. PARCEL_DETAILS_AREA Used with llGetParcelDetails to get the parcel area in square meters. +PARCEL_DETAILS_ID Used with llGetParcelDetails to get the parcel id. STRING_TRIM_HEAD Used with llStringTrim to trim leading spaces from a string. STRING_TRIM_TAIL Used with llStringTrim to trim trailing spaces from a string. diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 04a6c48b4f..774248ce4d 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -1122,11 +1122,6 @@ void LLBottomTray::initStateProcessedObjectMap() mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, mMovementPanel)); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel)); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel)); - - mDummiesMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLUICtrl>("after_gesture_panel"))); - mDummiesMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLUICtrl>("after_movement_panel"))); - mDummiesMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLUICtrl>("after_cam_panel"))); - mDummiesMap.insert(std::make_pair(RS_BUTTON_SPEAK, getChild<LLUICtrl>("after_speak_panel"))); } void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible) @@ -1140,12 +1135,6 @@ void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool vis } panel->setVisible(visible); - - if (mDummiesMap.count(shown_object_type)) - { - // Hide/show layout panel for dummy icon. - mDummiesMap[shown_object_type]->getParent()->setVisible(visible); - } } void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification) @@ -1168,20 +1157,13 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible return false; } - const S32 dummy_width = mDummiesMap.count(object_type) - ? mDummiesMap[object_type]->getParent()->getRect().getWidth() - : 0; - bool is_set = true; if (visible) { - // Assume that only chiclet panel can be auto-resized and - // don't take into account width of dummy widgets + // Assume that only chiclet panel can be auto-resized const S32 available_width = - mChicletPanel->getParent()->getRect().getWidth() - - mChicletPanel->getMinWidth() - - dummy_width; + mChicletPanel->getParent()->getRect().getWidth() - mChicletPanel->getMinWidth(); S32 preferred_width = mObjectDefaultWidthMap[object_type]; S32 current_width = cur_panel->getRect().getWidth(); @@ -1249,7 +1231,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible // Shrink buttons if needed if (is_set && decrease_width) { - processWidthDecreased( -result_width - dummy_width ); + processWidthDecreased( -result_width); } } else @@ -1264,7 +1246,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible // Extend other buttons if need if (delta_width) { - processWidthIncreased(delta_width + dummy_width); + processWidthIncreased(delta_width); } } return is_set; diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 8395b484cf..54258f74c1 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -205,9 +205,6 @@ private: typedef std::map<EResizeState, S32> state_object_width_map_t; state_object_width_map_t mObjectDefaultWidthMap; - typedef std::map<EResizeState, LLUICtrl*> dummies_map_t; - dummies_map_t mDummiesMap; - protected: LLBottomTray(const LLSD& key = LLSD()); diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index 980b456497..9dddbd998a 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -94,7 +94,6 @@ private: static void doSellLand(void *userdata); bool onConfirmSale(const LLSD& notification, const LLSD& response); static void doShowObjects(void *userdata); - static bool callbackHighlightTransferable(const LLSD& notification, const LLSD& response); void callbackAvatarPick(const std::vector<std::string>& names, const uuid_vec_t& ids); @@ -102,6 +101,7 @@ public: virtual BOOL postBuild(); bool setParcel(LLViewerRegion* region, LLParcelSelectionHandle parcel); + static bool callbackHighlightTransferable(const LLSD& notification, const LLSD& response); }; // static @@ -423,11 +423,13 @@ void LLFloaterSellLandUI::doShowObjects(void *userdata) send_parcel_select_objects(parcel->getLocalID(), RT_SELL); + // we shouldn't pass callback functor since it is registered in LLFunctorRegistration LLNotificationsUtil::add("TransferObjectsHighlighted", - LLSD(), LLSD(), - &LLFloaterSellLandUI::callbackHighlightTransferable); + LLSD(), LLSD()); } +static LLNotificationFunctorRegistration tr("TransferObjectsHighlighted", &LLFloaterSellLandUI::callbackHighlightTransferable); + // static bool LLFloaterSellLandUI::callbackHighlightTransferable(const LLSD& notification, const LLSD& data) { diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 46439150a7..d25aa37e16 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -1154,3 +1154,31 @@ void LLIMFloater::onIMChicletCreated( const LLUUID& session_id ) } } + +void LLIMFloater::onClickCloseBtn() +{ + + LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession( + mSessionID); + + if (session == NULL) + { + llwarns << "Empty session." << llendl; + return; + } + + bool is_call_with_chat = session->isGroupSessionType() + || session->isAdHocSessionType() || session->isP2PSessionType(); + + LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID); + + if (is_call_with_chat && voice_channel != NULL && voice_channel->isActive()) + { + LLSD payload; + payload["session_id"] = mSessionID; + LLNotificationsUtil::add("ConfirmLeaveCall", LLSD(), payload); + return; + } + + LLFloater::onClickCloseBtn(); +} diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index f9dd8b9b85..d63246a5cd 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -50,6 +50,7 @@ class LLInventoryCategory; */ class LLIMFloater : public LLTransientDockableFloater { + LOG_CLASS(LLIMFloater); public: LLIMFloater(const LLUUID& session_id); @@ -120,6 +121,10 @@ public: virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; } +protected: + /* virtual */ + void onClickCloseBtn(); + private: // process focus events to set a currently active session /* virtual */ void onFocusLost(); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 64379f4ce7..973257b19c 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -997,46 +997,36 @@ void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid) } } -bool LLInvFVBridge::isInOutfitsSidePanel() const +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 FALSE; return outfit_panel->isTabPanel(my_panel); } -bool LLInvFVBridge::canShare() +BOOL LLInvFVBridge::canShare() const { const LLInventoryModel* model = getInventoryModel(); - if(!model) - { - return false; - } + if (!model) return FALSE; - LLViewerInventoryItem *item = model->getItem(mUUID); + const LLViewerInventoryItem *item = model->getItem(mUUID); if (item) { - bool allowed = false; - allowed = LLInventoryCollectFunctor::itemTransferCommonlyAllowed(item); - if (allowed && - !item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID())) - { - allowed = false; - } - if (allowed && - !item->getPermissions().allowCopyBy(gAgent.getID())) - { - allowed = false; - } - return allowed; + if (!LLInventoryCollectFunctor::itemTransferCommonlyAllowed(item)) + return FALSE; + if (!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID())) + return FALSE; + if (!item->getPermissions().allowCopyBy(gAgent.getID())) + return FALSE; + return TRUE; } - LLViewerInventoryCategory* cat = model->getCategory(mUUID); - // All categories can be given. - return cat != NULL; + const LLViewerInventoryCategory* cat = model->getCategory(mUUID); + return (cat != NULL); } // +=================================================+ @@ -4095,12 +4085,11 @@ LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) : - LLItemBridge(inventory, root, uuid), - mInvType(type) + LLItemBridge(inventory, root, uuid) { mAttachPt = (flags & 0xff); // low bye of inventory flags - mIsMultiObject = ( flags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE; + mInvType = type; } LLUIImagePtr LLObjectBridge::getIcon() const @@ -4447,9 +4436,9 @@ LLWearableBridge::LLWearableBridge(LLInventoryPanel* inventory, LLWearableType::EType wearable_type) : LLItemBridge(inventory, root, uuid), mAssetType( asset_type ), - mInvType(inv_type), mWearableType(wearable_type) { + mInvType = inv_type; } // *NOTE: hack to get from avatar inventory to avatar diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index d77062ba84..c5efefac7e 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -74,21 +74,26 @@ public: U32 flags = 0x00); virtual ~LLInvFVBridge() {} - virtual const LLUUID& getUUID() const { return mUUID; } + BOOL isInOutfitsSidePanel() const; // allow context menus to be customized for side panel + BOOL canShare() const; + //-------------------------------------------------------------------- + // LLInvFVBridge functionality + //-------------------------------------------------------------------- + virtual const LLUUID& getUUID() const { return mUUID; } + virtual void clearDisplayName() {} virtual void restoreItem() {} virtual void restoreToWorld() {} - // LLFolderViewEventListener functions + //-------------------------------------------------------------------- + // Inherited LLFolderViewEventListener functions + //-------------------------------------------------------------------- virtual const std::string& getName() const; virtual const std::string& getDisplayName() const; virtual PermissionMask getPermissionMask() const; virtual LLFolderType::EType getPreferredType() const; virtual time_t getCreationDate() const; - virtual LLFontGL::StyleFlags getLabelStyle() const - { - return LLFontGL::NORMAL; - } + virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; } virtual std::string getLabelSuffix() const { return LLStringUtil::null; } virtual void openItem() {} virtual void closeItem() {} @@ -100,7 +105,6 @@ public: virtual BOOL isItemMovable() const; virtual BOOL isItemInTrash() const; virtual BOOL isLink() const; - //virtual BOOL removeItem() = 0; virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch); virtual void move(LLFolderViewEventListener* new_parent_bridge) {} @@ -120,14 +124,6 @@ public: void* cargo_data) { return FALSE; } virtual LLInventoryType::EType getInventoryType() const { return mInvType; } - // LLInvFVBridge functionality - virtual void clearDisplayName() {} - - // Allow context menus to be customized for side panel. - bool isInOutfitsSidePanel() const; - - bool canShare(); - //-------------------------------------------------------------------- // Convenience functions for adding various common menu options. //-------------------------------------------------------------------- @@ -147,7 +143,7 @@ protected: BOOL isLinkedObjectMissing() const; // Is this a linked obj whose baseobj is not in inventory? BOOL isAgentInventory() const; // false if lost or in the inventory library - BOOL isCOFFolder() const; // true if COF or descendent of. + BOOL isCOFFolder() const; // true if COF or descendent of virtual BOOL isItemPermissive() const; static void changeItemParent(LLInventoryModel* model, LLViewerInventoryItem* item, @@ -168,7 +164,7 @@ protected: }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInvFVBridge +// Class LLInvFVBridgeBuilder // // This class intended to build Folder View Bridge via LLInvFVBridge::createBridge. // It can be overridden with another way of creation necessary Inventory-Folder-View-Bridge. @@ -195,7 +191,6 @@ public: LLInvFVBridge(inventory, root, uuid) {} virtual void performAction(LLInventoryModel* model, std::string action); - virtual void selectItem(); virtual void restoreItem(); virtual void restoreToWorld(); @@ -214,30 +209,32 @@ public: virtual BOOL hasChildren() const { return FALSE; } virtual BOOL isUpToDate() const { return TRUE; } - // override for LLInvFVBridge - virtual void clearDisplayName() { mDisplayName.clear(); } + /*virtual*/ void clearDisplayName() { mDisplayName.clear(); } LLViewerInventoryItem* getItem() const; - bool isAddAction(std::string action) const; bool isRemoveAction(std::string action) const; - protected: + BOOL confirmRemoveItem(const LLSD& notification, const LLSD& response); virtual BOOL isItemPermissive() const; static void buildDisplayName(LLInventoryItem* item, std::string& name); - mutable std::string mDisplayName; - BOOL confirmRemoveItem(const LLSD& notification, const LLSD& response); + mutable std::string mDisplayName; }; class LLFolderBridge : public LLInvFVBridge { - friend class LLInvFVBridge; public: - BOOL dragItemIntoFolder(LLInventoryItem* inv_item, - BOOL drop); - BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, - BOOL drop); + LLFolderBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLInvFVBridge(inventory, root, uuid), + mCallingCards(FALSE), + mWearables(FALSE), + mMenu(NULL) {} + BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop); + BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop); + virtual void performAction(LLInventoryModel* model, std::string action); virtual void openItem(); virtual void closeItem(); @@ -278,18 +275,11 @@ public: LLViewerInventoryCategory* getCategory() const; protected: - LLFolderBridge(LLInventoryPanel* inventory, - LLFolderView* root, - const LLUUID& uuid) : - LLInvFVBridge(inventory, root, uuid), - mCallingCards(FALSE), - mWearables(FALSE), - mMenu(NULL) {} - - // menu callbacks + //-------------------------------------------------------------------- + // Menu callbacks + //-------------------------------------------------------------------- static void pasteClipboard(void* user_data); static void createNewCategory(void* user_data); - static void createNewShirt(void* user_data); static void createNewPants(void* user_data); static void createNewShoes(void* user_data); @@ -310,15 +300,17 @@ protected: void modifyOutfit(BOOL append); void determineFolderType(); - /** - * Returns a copy of current menu items. - */ - menuentry_vec_t getMenuItems() { return mItems; } + menuentry_vec_t getMenuItems() { return mItems; } // returns a copy of current menu items + + //-------------------------------------------------------------------- + // Messy hacks for handling folder options + //-------------------------------------------------------------------- public: static LLFolderBridge* sSelf; static void staticFolderOptionsMenu(); void folderOptionsMenu(); + private: BOOL mCallingCards; BOOL mWearables; @@ -329,63 +321,57 @@ private: class LLTextureBridge : public LLItemBridge { - friend class LLInvFVBridge; public: - virtual LLUIImagePtr getIcon() const; - virtual void openItem(); - virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - virtual void performAction(LLInventoryModel* model, std::string action); - -protected: LLTextureBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid, LLInventoryType::EType type) : - LLItemBridge(inventory, root, uuid), - mInvType(type) - {} + LLItemBridge(inventory, root, uuid) + { + mInvType = type; + } + virtual LLUIImagePtr getIcon() const; + virtual void openItem(); + virtual void buildContextMenu(LLMenuGL& menu, U32 flags); + virtual void performAction(LLInventoryModel* model, std::string action); bool canSaveTexture(void); - LLInventoryType::EType mInvType; }; class LLSoundBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLSoundBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLItemBridge(inventory, root, uuid) {} virtual void openItem(); virtual void previewItem(); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); static void openSoundPreview(void*); - -protected: - LLSoundBridge(LLInventoryPanel* inventory, - LLFolderView* root, - const LLUUID& uuid) : - LLItemBridge(inventory, root, uuid) {} }; class LLLandmarkBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLLandmarkBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + U32 flags = 0x00); virtual void performAction(LLInventoryModel* model, std::string action); virtual void buildContextMenu(LLMenuGL& menu, U32 flags); virtual LLUIImagePtr getIcon() const; virtual void openItem(); - -protected: - LLLandmarkBridge(LLInventoryPanel* inventory, - LLFolderView* root, - const LLUUID& uuid, - U32 flags = 0x00); protected: BOOL mVisited; }; class LLCallingCardBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLCallingCardBridge(LLInventoryPanel* inventory, + LLFolderView* folder, + const LLUUID& uuid ); + ~LLCallingCardBridge(); virtual std::string getLabelSuffix() const; //virtual const std::string& getDisplayName() const; virtual LLUIImagePtr getIcon() const; @@ -397,71 +383,57 @@ public: void* cargo_data); void refreshFolderViewItem(); protected: - LLCallingCardBridge(LLInventoryPanel* inventory, - LLFolderView* folder, - const LLUUID& uuid ); - ~LLCallingCardBridge(); -protected: LLCallingCardObserver* mObserver; }; - class LLNotecardBridge : public LLItemBridge { - friend class LLInvFVBridge; public: - virtual void openItem(); -protected: LLNotecardBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid) : LLItemBridge(inventory, root, uuid) {} + virtual void openItem(); }; class LLGestureBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLGestureBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLItemBridge(inventory, root, uuid) {} // Only suffix for gesture items, not task items, because only // gestures in your inventory can be active. virtual LLFontGL::StyleFlags getLabelStyle() const; virtual std::string getLabelSuffix() const; - virtual void performAction(LLInventoryModel* model, std::string action); virtual void openItem(); virtual BOOL removeItem(); - virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - static void playGesture(const LLUUID& item_id); - -protected: - LLGestureBridge(LLInventoryPanel* inventory, - LLFolderView* root, - const LLUUID& uuid) - : LLItemBridge(inventory, root, uuid) {} }; class LLAnimationBridge : public LLItemBridge { - friend class LLInvFVBridge; public: - virtual void performAction(LLInventoryModel* model, std::string action); - virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - - virtual void openItem(); - -protected: LLAnimationBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid) : LLItemBridge(inventory, root, uuid) {} + virtual void performAction(LLInventoryModel* model, std::string action); + virtual void buildContextMenu(LLMenuGL& menu, U32 flags); + virtual void openItem(); }; class LLObjectBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLObjectBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + LLInventoryType::EType type, + U32 flags); virtual LLUIImagePtr getIcon() const; virtual void performAction(LLInventoryModel* model, std::string action); virtual void openItem(); @@ -469,37 +441,32 @@ public: virtual std::string getLabelSuffix() const; virtual void buildContextMenu(LLMenuGL& menu, U32 flags); virtual BOOL renameItem(const std::string& new_name); - LLInventoryObject* getObject() const; protected: - LLObjectBridge(LLInventoryPanel* inventory, - LLFolderView* root, - const LLUUID& uuid, - LLInventoryType::EType type, - U32 flags); -protected: - static LLUUID sContextMenuItemID; // Only valid while the context menu is open. - LLInventoryType::EType mInvType; + static LLUUID sContextMenuItemID; // Only valid while the context menu is open. U32 mAttachPt; BOOL mIsMultiObject; }; class LLLSLTextBridge : public LLItemBridge { - friend class LLInvFVBridge; public: - virtual void openItem(); -protected: LLLSLTextBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid ) : LLItemBridge(inventory, root, uuid) {} + virtual void openItem(); }; class LLWearableBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLWearableBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid, + LLAssetType::EType asset_type, + LLInventoryType::EType inv_type, + LLWearableType::EType wearable_type); virtual LLUIImagePtr getIcon() const; virtual void performAction(LLInventoryModel* model, std::string action); virtual void openItem(); @@ -525,51 +492,38 @@ public: static void removeItemFromAvatar(LLViewerInventoryItem *item); static void removeAllClothesFromAvatar(); void removeFromAvatar(); - -protected: - LLWearableBridge(LLInventoryPanel* inventory, - LLFolderView* root, - const LLUUID& uuid, - LLAssetType::EType asset_type, - LLInventoryType::EType inv_type, - LLWearableType::EType wearable_type); protected: LLAssetType::EType mAssetType; - LLInventoryType::EType mInvType; LLWearableType::EType mWearableType; }; class LLLinkItemBridge : public LLItemBridge { - friend class LLInvFVBridge; public: - virtual const std::string& getPrefix() { return sPrefix; } - virtual void buildContextMenu(LLMenuGL& menu, U32 flags); -protected: LLLinkItemBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid) : LLItemBridge(inventory, root, uuid) {} + virtual const std::string& getPrefix() { return sPrefix; } + virtual void buildContextMenu(LLMenuGL& menu, U32 flags); protected: static std::string sPrefix; }; class LLLinkFolderBridge : public LLItemBridge { - friend class LLInvFVBridge; public: + LLLinkFolderBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : + LLItemBridge(inventory, root, uuid) {} virtual const std::string& getPrefix() { return sPrefix; } virtual LLUIImagePtr getIcon() const; virtual void buildContextMenu(LLMenuGL& menu, U32 flags); virtual void performAction(LLInventoryModel* model, std::string action); virtual void gotoItem(); protected: - LLLinkFolderBridge(LLInventoryPanel* inventory, - LLFolderView* root, - const LLUUID& uuid) : - LLItemBridge(inventory, root, uuid) {} const LLUUID &getFolderID() const; -protected: static std::string sPrefix; }; @@ -603,47 +557,33 @@ protected: LLInventoryModel* mModel; }; +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Recent Inventory Panel related classes +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/************************************************************************/ -/* Recent Inventory Panel related classes */ -/************************************************************************/ -class LLRecentInventoryBridgeBuilder; -/** - * Overridden version of the Inventory-Folder-View-Bridge for Folders - */ +// Overridden version of the Inventory-Folder-View-Bridge for Folders class LLRecentItemsFolderBridge : public LLFolderBridge { - friend class LLRecentInventoryBridgeBuilder; - public: - /** - * Creates context menu for Folders related to Recent Inventory Panel. - * - * It uses base logic and than removes from visible items "New..." menu items. - */ - /*virtual*/ void buildContextMenu(LLMenuGL& menu, U32 flags); - -protected: + // Creates context menu for Folders related to Recent Inventory Panel. + // Uses base logic and than removes from visible items "New..." menu items. LLRecentItemsFolderBridge(LLInventoryType::EType type, - LLInventoryPanel* inventory, - LLFolderView* root, - const LLUUID& uuid) : + LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : LLFolderBridge(inventory, root, uuid) { mInvType = type; } + /*virtual*/ void buildContextMenu(LLMenuGL& menu, U32 flags); }; -/** - * Bridge builder to create Inventory-Folder-View-Bridge for Recent Inventory Panel - */ +// Bridge builder to create Inventory-Folder-View-Bridge for Recent Inventory Panel class LLRecentInventoryBridgeBuilder : public LLInventoryFVBridgeBuilder { - /** - * Overrides FolderBridge for Recent Inventory Panel. - * - * It use base functionality for bridges other than FolderBridge. - */ +public: + // Overrides FolderBridge for Recent Inventory Panel. + // It use base functionality for bridges other than FolderBridge. virtual LLInvFVBridge* createBridge(LLAssetType::EType asset_type, LLAssetType::EType actual_asset_type, LLInventoryType::EType inv_type, @@ -651,11 +591,8 @@ class LLRecentInventoryBridgeBuilder : public LLInventoryFVBridgeBuilder LLFolderView* root, const LLUUID& uuid, U32 flags = 0x00) const; - }; - - void wear_inventory_item_on_avatar(LLInventoryItem* item); void rez_attachment(LLViewerInventoryItem* item, diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 35ad8b64da..2b4d9fb25c 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -87,44 +87,108 @@ BOOL LLInventoryState::sWearNewClothing = FALSE; LLUUID LLInventoryState::sWearNewClothingTransactionID; +// Generates a string containing the path to the item specified by +// item_id. +void append_path(const LLUUID& id, std::string& path) +{ + std::string temp; + const LLInventoryObject* obj = gInventory.getObject(id); + LLUUID parent_id; + if(obj) parent_id = obj->getParentUUID(); + std::string forward_slash("/"); + while(obj) + { + obj = gInventory.getCategory(parent_id); + if(obj) + { + temp.assign(forward_slash + obj->getName() + temp); + parent_id = obj->getParentUUID(); + } + } + path.append(temp); +} + +void change_item_parent(LLInventoryModel* model, + LLViewerInventoryItem* item, + const LLUUID& new_parent_id, + BOOL restamp) +{ + if (item->getParentUUID() != new_parent_id) + { + LLInventoryModel::update_list_t update; + LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1); + update.push_back(old_folder); + LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1); + update.push_back(new_folder); + gInventory.accountForUpdate(update); + + LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); + new_item->setParent(new_parent_id); + new_item->updateParentOnServer(restamp); + model->updateItem(new_item); + model->notifyObservers(); + } +} + + +BOOL get_is_item_worn(const LLUUID& id) +{ + const LLViewerInventoryItem* item = gInventory.getItem(id); + if (!item) + return FALSE; + + switch(item->getType()) + { + case LLAssetType::AT_OBJECT: + { + if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getLinkedUUID())) + return TRUE; + break; + } + case LLAssetType::AT_BODYPART: + case LLAssetType::AT_CLOTHING: + if(gAgentWearables.isWearingItem(item->getLinkedUUID())) + return TRUE; + break; + case LLAssetType::AT_GESTURE: + if (LLGestureMgr::instance().isGestureActive(item->getLinkedUUID())) + return TRUE; + break; + default: + break; + } + return FALSE; +} + ///---------------------------------------------------------------------------- /// LLInventoryCollectFunctor implementations ///---------------------------------------------------------------------------- // static -bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(LLInventoryItem* item) +bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryItem* item) { if (!item) return false; - bool allowed = false; - switch(item->getType()) { case LLAssetType::AT_CALLINGCARD: - // not allowed + return false; break; - case LLAssetType::AT_OBJECT: if (isAgentAvatarValid() && !gAgentAvatarp->isWearingAttachment(item->getUUID())) - { - allowed = true; - } + return true; break; - case LLAssetType::AT_BODYPART: case LLAssetType::AT_CLOTHING: if(!gAgentWearables.isWearingItem(item->getUUID())) - { - allowed = true; - } + return true; break; default: - allowed = true; + return true; break; } - - return allowed; + return false; } bool LLIsType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) @@ -405,55 +469,3 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder) folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP); } } - -void change_item_parent(LLInventoryModel* model, - LLViewerInventoryItem* item, - const LLUUID& new_parent_id, - BOOL restamp) -{ - if (item->getParentUUID() != new_parent_id) - { - LLInventoryModel::update_list_t update; - LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1); - update.push_back(old_folder); - LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1); - update.push_back(new_folder); - gInventory.accountForUpdate(update); - - LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item); - new_item->setParent(new_parent_id); - new_item->updateParentOnServer(restamp); - model->updateItem(new_item); - model->notifyObservers(); - } -} - - -BOOL get_is_item_worn(const LLUUID& id) -{ - const LLViewerInventoryItem* item = gInventory.getItem(id); - if (!item) - return FALSE; - - switch(item->getType()) - { - case LLAssetType::AT_OBJECT: - { - if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getLinkedUUID())) - return TRUE; - break; - } - case LLAssetType::AT_BODYPART: - case LLAssetType::AT_CLOTHING: - if(gAgentWearables.isWearingItem(item->getLinkedUUID())) - return TRUE; - break; - case LLAssetType::AT_GESTURE: - if (LLGestureMgr::instance().isGestureActive(item->getLinkedUUID())) - return TRUE; - break; - default: - break; - } - return FALSE; -} diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 1e2b4ff09c..79b9b4a9cc 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -40,6 +40,27 @@ /******************************************************************************** ** ** + ** MISCELLANEOUS GLOBAL FUNCTIONS + **/ + +// Is this item or its baseitem is worn, attached, etc... +BOOL get_is_item_worn(const LLUUID& id); + + +void change_item_parent(LLInventoryModel* model, + LLViewerInventoryItem* item, + const LLUUID& new_parent_id, + BOOL restamp); + +// Generates a string containing the path to the item specified by item_id. +void append_path(const LLUUID& id, std::string& path); + +/** Miscellaneous global functions + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** ** INVENTORY COLLECTOR FUNCTIONS **/ @@ -58,7 +79,7 @@ public: virtual ~LLInventoryCollectFunctor(){}; virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0; - static bool itemTransferCommonlyAllowed(LLInventoryItem* item); + static bool itemTransferCommonlyAllowed(const LLInventoryItem* item); }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -297,15 +318,6 @@ public: virtual void doItem(LLFolderViewItem* item); }; -// Is this item or its baseitem is worn, attached, etc... -BOOL get_is_item_worn(const LLUUID& id); - - -void change_item_parent(LLInventoryModel* model, - LLViewerInventoryItem* item, - const LLUUID& new_parent_id, - BOOL restamp); - #endif // LL_LLINVENTORYFUNCTIONS_H diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index e63da1ebb9..a527694d25 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -319,30 +319,18 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id) // specifies 'type' as what it defaults to containing. The category is // not necessarily only for that type. *NOTE: This will create a new // inventory category on the fly if one does not exist. -const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder, bool find_in_library) -{ - const LLUUID &rv = findCatUUID(t, find_in_library); - if(rv.isNull() && isInventoryUsable() && (create_folder && !find_in_library)) - { - const LLUUID &root_id = gInventory.getRootFolderID(); - if(root_id.notNull()) - { - return createNewCategory(root_id, t, LLStringUtil::null); - } - } - return rv; -} - -// Internal method which looks for a category with the specified -// preferred type. Returns LLUUID::null if not found. -const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type, bool find_in_library) const +const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType preferred_type, + bool create_folder, + bool find_in_library) { + LLUUID rv = LLUUID::null; + const LLUUID &root_id = (find_in_library) ? gInventory.getLibraryRootFolderID() : gInventory.getRootFolderID(); if(LLFolderType::FT_ROOT_INVENTORY == preferred_type) { - return root_id; + rv = root_id; } - if(root_id.notNull()) + else if (root_id.notNull()) { cat_array_t* cats = NULL; cats = get_ptr_in_map(mParentChildCategoryTree, root_id); @@ -353,12 +341,21 @@ const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type, { if(cats->get(i)->getPreferredType() == preferred_type) { - return cats->get(i)->getUUID(); + rv = cats->get(i)->getUUID(); + break; } } } } - return LLUUID::null; + + if(rv.isNull() && isInventoryUsable() && (create_folder && !find_in_library)) + { + if(root_id.notNull()) + { + return createNewCategory(root_id, preferred_type, LLStringUtil::null); + } + } + return rv; } // Convenience function to create a new category. You could call @@ -583,27 +580,6 @@ LLInventoryModel::item_array_t LLInventoryModel::collectLinkedItems(const LLUUID return items; } -// Generates a string containing the path to the item specified by -// item_id. -void LLInventoryModel::appendPath(const LLUUID& id, std::string& path) const -{ - std::string temp; - const LLInventoryObject* obj = getObject(id); - LLUUID parent_id; - if(obj) parent_id = obj->getParentUUID(); - std::string forward_slash("/"); - while(obj) - { - obj = getCategory(parent_id); - if(obj) - { - temp.assign(forward_slash + obj->getName() + temp); - parent_id = obj->getParentUUID(); - } - } - path.append(temp); -} - bool LLInventoryModel::isInventoryUsable() const { bool result = false; @@ -1024,98 +1000,6 @@ void LLInventoryModel::purgeDescendentsOf(const LLUUID& id) } } -void LLInventoryModel::deleteFromServer(LLDynamicArray<LLUUID>& category_ids, - LLDynamicArray<LLUUID>& item_ids) -{ - // Store off tre UUIDS of parents which are being deleted (thus no - // need to increment) and the parents which are being modified. We - // have to increment the version of the parent with each message - // sent upstream since the dataserver will increment each unique - // parent per update message. - std::set<LLUUID> ignore_parents; - update_map_t inc_parents; - - S32 i; - S32 count = category_ids.count(); - BOOL start_new_message = TRUE; - LLMessageSystem* msg = gMessageSystem; - LLPointer<LLViewerInventoryCategory> cat; - for(i = 0; i < count; i++) - { - if(start_new_message) - { - start_new_message = FALSE; - msg->newMessageFast(_PREHASH_RemoveInventoryObjects); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - } - LLUUID cat_id = category_ids.get(i); - - msg->nextBlockFast(_PREHASH_FolderData); - msg->addUUIDFast(_PREHASH_FolderID, cat_id); - cat = getCategory(cat_id); - ignore_parents.insert(cat_id); - addChangedMask(LLInventoryObserver::REMOVE | LLInventoryObserver::STRUCTURE, cat_id); - if(cat.notNull() && (ignore_parents.find(cat->getParentUUID())==ignore_parents.end())) - { - --inc_parents[cat->getParentUUID()]; - } - if(msg->isSendFullFast(_PREHASH_FolderData)) - { - start_new_message = TRUE; - msg->nextBlockFast(_PREHASH_ItemData); - msg->addUUIDFast(_PREHASH_ItemID, LLUUID::null); - gAgent.sendReliableMessage(); - accountForUpdate(inc_parents); - inc_parents.clear(); - } - } - - count = item_ids.count(); - std::set<LLUUID>::iterator not_ignored = ignore_parents.end(); - LLPointer<LLViewerInventoryItem> item; - if((0 == count) && (!start_new_message)) - { - msg->nextBlockFast(_PREHASH_ItemData); - msg->addUUIDFast(_PREHASH_ItemID, LLUUID::null); - } - for(i = 0; i < count; i++) - { - if(start_new_message) - { - start_new_message = FALSE; - msg->newMessageFast(_PREHASH_RemoveInventoryObjects); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_FolderData); - msg->addUUIDFast(_PREHASH_FolderID, LLUUID::null); - } - LLUUID item_id = item_ids.get(i); - msg->nextBlockFast(_PREHASH_ItemData); - msg->addUUIDFast(_PREHASH_ItemID, item_id); - item = getItem(item_id); - addChangedMask(LLInventoryObserver::REMOVE | LLInventoryObserver::STRUCTURE, item_id); - if(item.notNull() && (ignore_parents.find(item->getParentUUID()) == not_ignored)) - { - --inc_parents[item->getParentUUID()]; - } - if(msg->isSendFullFast(_PREHASH_ItemData)) - { - start_new_message = TRUE; - gAgent.sendReliableMessage(); - accountForUpdate(inc_parents); - inc_parents.clear(); - } - } - if(!start_new_message) - { - gAgent.sendReliableMessage(); - accountForUpdate(inc_parents); - } -} - // Add/remove an observer. If the observer is destroyed, be sure to // remove it. void LLInventoryModel::addObserver(LLInventoryObserver* observer) @@ -1206,29 +1090,7 @@ void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent) } } -// This method to prepares a set of mock inventory which provides -// minimal functionality before the actual arrival of inventory. -/* -void LLInventoryModel::mock(const LLUUID& root_id) -{ - llinfos << "LLInventoryModel::mock() " << root_id << llendl; - if(root_id.isNull()) - { - llwarns << "Not a valid root id" << llendl; - return; - } - LLPointer<LLViewerInventoryCategory> cat = new LLViewerInventoryCategory( - root_id, - LLUUID::null, - LLAssetType::AT_CATEGORY, - LLFolderType::lookupNewCategoryName(LLFolderType::FT_ROOT_INVENTORY), - gAgent.getID()); - addCategory(cat); - gInventory.buildParentChildMap(); -} -*/ - -//If we get back a normal response, handle it here +// If we get back a normal response, handle it here void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content) { start_new_inventory_observer(); @@ -1301,7 +1163,7 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str gInventory.notifyObservers("fetchinventory"); } -bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) +bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) const { if(folder_id.isNull()) { @@ -1836,88 +1698,6 @@ bool LLInventoryModel::loadSkeleton( return rv; } -bool LLInventoryModel::loadMeat(const LLSD& options, const LLUUID& owner_id) -{ - llinfos << "importing inventory for " << owner_id << llendl; - bool rv = true; - for(LLSD::array_const_iterator it = options.beginArray(), - end = options.endArray(); it != end; ++it) - { - LLSD name = (*it)["name"]; - LLSD item_id = (*it)["item_id"]; - LLSD parent_id = (*it)["parent_id"]; - LLSD asset_type = (*it)["type"]; - LLSD data_id = (*it)["data_id"]; - if(name.isDefined() - && item_id.isDefined() - && parent_id.isDefined() - && asset_type.isDefined() - && data_id.isDefined()) - { - LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem; - item->rename(name.asString()); - item->setUUID(item_id.asUUID()); - item->setParent(parent_id.asUUID()); - LLAssetType::EType type = (LLAssetType::EType)asset_type.asInteger(); - item->setType(type); - - LLSD llsd_inv_type = (*it)["inv_type"]; - if(llsd_inv_type.isDefined()) - { - LLInventoryType::EType inv_type = (LLInventoryType::EType)llsd_inv_type.asInteger(); - item->setInventoryType(inv_type); - } - - if(LLAssetType::AT_CALLINGCARD == type) - { - LLPermissions perm; - perm.init(data_id.asUUID(), owner_id, LLUUID::null, LLUUID::null); - item->setPermissions(perm); - } - else - { - LLPermissions default_perm; - default_perm.init(LLUUID::null, owner_id, LLUUID::null, LLUUID::null); - LLSD llsd_perm_mask = (*it)["perm_mask"]; - if(llsd_perm_mask.isDefined()) - { - PermissionMask perm_mask = llsd_perm_mask.asInteger(); - default_perm.initMasks( - perm_mask, perm_mask, perm_mask, perm_mask, perm_mask); - } - else - { - default_perm.initMasks( - PERM_NONE, PERM_NONE, PERM_NONE, PERM_NONE, PERM_NONE); - } - item->setPermissions(default_perm); - item->setAssetUUID(data_id.asUUID()); - } - - LLSD flags = (*it)["flags"]; - if(flags.isDefined()) - { - // Not sure how well LLSD.asInteger() maps to - // unsigned long - using strtoul() - item->setFlags(strtoul(flags.asString().c_str(), NULL, 0)); - } - - LLSD time = (*it)["time"]; - if(time.isDefined()) - { - item->setCreationDate(time.asInteger()); - } - addItem(item); - } - else - { - llwarns << "Unable to import near " << name.asString() << llendl; - rv = false; - } - } - return rv; -} - // This is a brute force method to rebuild the entire parent-child // relations. The overall operation has O(NlogN) performance, which // should be sufficient for our needs. @@ -2185,73 +1965,6 @@ bool LLUUIDAndName::operator>(const LLUUIDAndName& rhs) const return (mID > rhs.mID); } -// Given the current state of the inventory items, figure out the -// clone information. *FIX: This is sub-optimal, since we can insert -// this information snurgically, but this makes sure the implementation -// works before we worry about optimization. -//void LLInventoryModel::recalculateCloneInformation() -//{ -// //dumpInventory(); -// -// // This implements a 'multi-map' like structure to keep track of -// // how many clones we find. -// typedef LLDynamicArray<LLViewerInventoryItem*> viewer_item_array_t; -// typedef std::map<LLUUIDAndName, viewer_item_array_t*> clone_map_t; -// clone_map_t clone_map; -// LLUUIDAndName id_and_name; -// viewer_item_array_t* clones = NULL; -// LLViewerInventoryItem* item = NULL; -// for(item = (LLViewerInventoryItem*)mItemMap.getFirstData(); -// item != NULL; -// item = (LLViewerInventoryItem*)mItemMap.getNextData()) -// { -// if(item->getType() == LLAssetType::AT_CALLINGCARD) -// { -// // if it's a calling card, we key off of the creator id, not -// // the asset id. -// id_and_name.mID = item->getCreatorUUID(); -// } -// else -// { -// // if it's not a calling card, we key clones from the -// // asset id. -// id_and_name.mID = item->getAssetUUID(); -// } -// if(id_and_name.mID == LLUUID::null) -// { -// continue; -// } -// id_and_name.mName = item->getName(); -// if(clone_map.checkData(id_and_name)) -// { -// clones = clone_map.getData(id_and_name); -// } -// else -// { -// clones = new viewer_item_array_t; -// clone_map.addData(id_and_name, clones); -// } -// clones->put(item); -// } -// -// S32 count = 0; -// for(clones = clone_map.getFirstData(); -// clones != NULL; -// clones = clone_map.getNextData()) -// { -// count = clones->count(); -// for(S32 i = 0; i < count; i++) -// { -// item = clones->get(i); -// item->setCloneCount(count - 1); -// //clones[i] = NULL; -// } -// delete clones; -// } -// clone_map.removeAllData(); -// //dumpInventory(); -//} - // static bool LLInventoryModel::loadFromFile(const std::string& filename, LLInventoryModel::cat_array_t& categories, @@ -3097,6 +2810,10 @@ static LLInventoryModel::item_array_t::iterator find_item_iter_by_uuid(LLInvento } // static +// * @param[in, out] items - vector with items to be updated. It should be sorted in a right way +// * before calling this method. +// * @param src_item_id - LLUUID of inventory item to be moved in new position +// * @param dest_item_id - LLUUID of inventory item before which source item should be placed. void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id) { LLInventoryModel::item_array_t::iterator it_src = find_item_iter_by_uuid(items, src_item_id); @@ -3112,6 +2829,7 @@ void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, c items.insert(it_dest, src_item); } +//* @param[in] items vector of items in order to be saved. void LLInventoryModel::saveItemsOrder(const LLInventoryModel::item_array_t& items) { int sortField = 0; @@ -3155,6 +2873,8 @@ static void rearrange_item_order_by_sort_field(LLInventoryModel::item_array_t& i std::sort(items.begin(), items.end(), sort_functor); } +// * @param source_item_id - LLUUID of the source item to be moved into new position +// * @param target_item_id - LLUUID of the target item before which source item should be placed. void LLInventoryModel::rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id) { LLInventoryModel::cat_array_t cats; diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index b7c1b57397..5f5d4d6118 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -58,17 +58,15 @@ class LLMessageSystem; class LLInventoryCollectFunctor; -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLInventoryModel +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLInventoryModel // -// This class represents a collection of inventory, and provides -// efficient ways to access that information. This class could in -// theory be used for any place where you need inventory, though it -// optimizes for time efficiency - not space efficiency, probably -// making it inappropriate for use on tasks. -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - +// Represents a collection of inventory, and provides efficient ways to access +// that information. +// NOTE: This class could in theory be used for any place where you need +// inventory, though it optimizes for time efficiency - not space efficiency, +// probably making it inappropriate for use on tasks. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLInventoryModel { public: @@ -84,79 +82,129 @@ public: typedef LLDynamicArray<LLPointer<LLViewerInventoryCategory> > cat_array_t; typedef LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array_t; typedef std::set<LLUUID> changed_items_t; - - // construction & destruction - LLInventoryModel(); - ~LLInventoryModel(); - - void cleanupInventory(); - + class fetchInventoryResponder : public LLHTTPClient::Responder { public: fetchInventoryResponder(const LLSD& request_sd) : mRequestSD(request_sd) {}; void result(const LLSD& content); - void error(U32 status, const std::string& reason); - - public: - typedef std::vector<LLViewerInventoryCategory*> folder_ref_t; protected: LLSD mRequestSD; }; - // - // Accessors - // +/******************************************************************************** + ** ** + ** INITIALIZATION/SETUP + **/ - // Check if one object has a parent chain up to the category specified by UUID. - BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const; + //-------------------------------------------------------------------- + // Constructors / Destructors + //-------------------------------------------------------------------- +public: + LLInventoryModel(); + ~LLInventoryModel(); + void cleanupInventory(); +protected: + void empty(); // empty the entire contents - // Get whatever special folder this object is a child of, if any. - const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const; + //-------------------------------------------------------------------- + // Initialization + //-------------------------------------------------------------------- +public: + // The inventory model usage is sensitive to the initial construction of the model + bool isInventoryUsable() const; +private: + bool mIsAgentInvUsable; // used to handle an invalid inventory state - // Get the object by id. Returns NULL if not found. - // * WARNING: use the pointer returned for read operations - do - // not modify the object values in place or you will break stuff. - LLInventoryObject* getObject(const LLUUID& id) const; + //-------------------------------------------------------------------- + // Root Folders + //-------------------------------------------------------------------- +public: + // The following are set during login with data from the server + void setRootFolderID(const LLUUID& id); + void setLibraryOwnerID(const LLUUID& id); + void setLibraryRootFolderID(const LLUUID& id); - // Get the item by id. Returns NULL if not found. - // * WARNING: use the pointer for read operations - use the - // updateItem() method to actually modify values. - LLViewerInventoryItem* getItem(const LLUUID& id) const; + const LLUUID &getRootFolderID() const; + const LLUUID &getLibraryOwnerID() const; + const LLUUID &getLibraryRootFolderID() const; +private: + LLUUID mRootFolderID; + LLUUID mLibraryRootFolderID; + LLUUID mLibraryOwnerID; + + //-------------------------------------------------------------------- + // Structure + //-------------------------------------------------------------------- +public: + // Methods to load up inventory skeleton & meat. These are used + // during authentication. Returns true if everything parsed. + bool loadSkeleton(const LLSD& options, const LLUUID& owner_id); + void buildParentChildMap(); // brute force method to rebuild the entire parent-child relations + // Call on logout to save a terse representation. + void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id); +private: + // Information for tracking the actual inventory. We index this + // information in a lot of different ways so we can access + // the inventory using several different identifiers. + // mInventory member data is the 'master' list of inventory, and + // mCategoryMap and mItemMap store uuid->object mappings. + typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t; + typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t; + cat_map_t mCategoryMap; + item_map_t mItemMap; + // This last set of indices is used to map parents to children. + typedef std::map<LLUUID, cat_array_t*> parent_cat_map_t; + typedef std::map<LLUUID, item_array_t*> parent_item_map_t; + parent_cat_map_t mParentChildCategoryTree; + parent_item_map_t mParentChildItemTree; - // Get the category by id. Returns NULL if not found. - // * WARNING: use the pointer for read operations - use the - // updateCategory() method to actually modify values. - LLViewerInventoryCategory* getCategory(const LLUUID& id) const; + //-------------------------------------------------------------------- + // Login + //-------------------------------------------------------------------- +public: + static BOOL getIsFirstTimeInViewer2(); +private: + static BOOL sFirstTimeInViewer2; + const static S32 sCurrentInvCacheVersion; // expected inventory cache version - // Return the number of items or categories - S32 getItemCount() const; - S32 getCategoryCount() const; +/** Initialization/Setup + ** ** + *******************************************************************************/ + +/******************************************************************************** + ** ** + ** ACCESSORS + **/ + + //-------------------------------------------------------------------- + // Descendents + //-------------------------------------------------------------------- +public: + // Make sure we have the descendents in the structure. Returns true + // if a fetch was performed. + bool fetchDescendentsOf(const LLUUID& folder_id) const; // Return the direct descendents of the id provided.Set passed // in values to NULL if the call fails. - // *WARNING: The array provided points straight into the guts of - // this object, and should only be used for read operations, since - // modifications may invalidate the internal state of the - // inventory. + // NOTE: The array provided points straight into the guts of + // this object, and should only be used for read operations, since + // modifications may invalidate the internal state of the inventory. void getDirectDescendentsOf(const LLUUID& cat_id, cat_array_t*& categories, item_array_t*& items) const; - // SJB: Added version to lock the arrays to catch potential logic bugs - void lockDirectDescendentArrays(const LLUUID& cat_id, - cat_array_t*& categories, - item_array_t*& items); - void unlockDirectDescendentArrays(const LLUUID& cat_id); - // Starting with the object specified, add its descendents to the // array provided, but do not add the inventory object specified - // by id. There is no guaranteed order. Neither array will be - // erased before adding objects to it. Do not store a copy of the - // pointers collected - use them, and collect them again later if - // you need to reference the same objects. - enum { EXCLUDE_TRASH = FALSE, INCLUDE_TRASH = TRUE }; + // by id. There is no guaranteed order. + // NOTE: Neither array will be erased before adding objects to it. + // Do not store a copy of the pointers collected - use them, and + // collect them again later if you need to reference the same objects. + enum { + EXCLUDE_TRASH = FALSE, + INCLUDE_TRASH = TRUE + }; void collectDescendents(const LLUUID& id, cat_array_t& categories, item_array_t& items, @@ -172,156 +220,162 @@ public: // Assumes item_id is itself not a linked item. item_array_t collectLinkedItems(const LLUUID& item_id, const LLUUID& start_folder_id = LLUUID::null); + - // Get the inventoryID that this item points to, else just return item_id + // Check if one object has a parent chain up to the category specified by UUID. + BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const; + + //-------------------------------------------------------------------- + // Find + //-------------------------------------------------------------------- +public: + // Returns the uuid of the category that specifies 'type' as what it + // defaults to containing. The category is not necessarily only for that type. + // NOTE: If create_folder is true, this will create a new inventory category + // on the fly if one does not exist. *NOTE: if find_in_library is true it + // will search in the user's library folder instead of "My Inventory" + const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, + bool create_folder = true, + bool find_in_library = false); + + // Get whatever special folder this object is a child of, if any. + const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const; + + // Get the object by id. Returns NULL if not found. + // NOTE: Use the pointer returned for read operations - do + // not modify the object values in place or you will break stuff. + LLInventoryObject* getObject(const LLUUID& id) const; + + // Get the item by id. Returns NULL if not found. + // NOTE: Use the pointer for read operations - use the + // updateItem() method to actually modify values. + LLViewerInventoryItem* getItem(const LLUUID& id) const; + + // Get the category by id. Returns NULL if not found. + // NOTE: Use the pointer for read operations - use the + // updateCategory() method to actually modify values. + LLViewerInventoryCategory* getCategory(const LLUUID& id) const; + + // Get the inventoryID that this item points to, else just return item_id. const LLUUID& getLinkedItemID(const LLUUID& object_id) const; +private: + mutable LLPointer<LLViewerInventoryItem> mLastItem; // cache recent lookups - // The inventory model usage is sensitive to the initial construction of the - // model. - bool isInventoryUsable() const; + //-------------------------------------------------------------------- + // Count + //-------------------------------------------------------------------- +public: + // Return the number of items or categories + S32 getItemCount() const; + S32 getCategoryCount() const; + +/** Accessors + ** ** + *******************************************************************************/ - // - // Mutators - // +/******************************************************************************** + ** ** + ** MUTATORS + **/ - // Calling this method with an inventory item will either change - // an existing item with a matching item_id, or will add the item +public: + // Change an existing item with a matching item_id or add the item // to the current inventory. Returns the change mask generated by // the update. No notification will be sent to observers. This // method will only generate network traffic if the item had to be // reparented. - // *NOTE: In usage, you will want to perform cache accounting - // operations in LLInventoryModel::accountForUpdate() or - // LLViewerInventoryItem::updateServer() before calling this - // method. + // NOTE: In usage, you will want to perform cache accounting + // operations in LLInventoryModel::accountForUpdate() or + // LLViewerInventoryItem::updateServer() before calling this method. U32 updateItem(const LLViewerInventoryItem* item); - // Calling this method with an inventory category will either - // change an existing item with the matching id, or it will add + // Change an existing item with the matching id or add // the category. No notifcation will be sent to observers. This // method will only generate network traffic if the item had to be // reparented. - // *NOTE: In usage, you will want to perform cache accounting - // operations in LLInventoryModel::accountForUpdate() or - // LLViewerInventoryCategory::updateServer() before calling this - // method. + // NOTE: In usage, you will want to perform cache accounting + // operations in accountForUpdate() or LLViewerInventoryCategory:: + // updateServer() before calling this method. void updateCategory(const LLViewerInventoryCategory* cat); - // This method will move the specified object id to the specified - // category, update the internal structures. No cache accounting, + // Move the specified object id to the specified category and + // update the internal structures. No cache accounting, // observer notification, or server update is performed. void moveObject(const LLUUID& object_id, const LLUUID& cat_id); - // delete a particular inventory object by ID. This will purge one - // object from the internal data structures maintaining a + //-------------------------------------------------------------------- + // Delete + //-------------------------------------------------------------------- +public: + // Delete a particular inventory object by ID. Will purge one + // object from the internal data structures, maintaining a // consistent internal state. No cache accounting, observer - // notification, or server update is performed. Purges linked items. + // notification, or server update is performed. void deleteObject(const LLUUID& id); + void removeItem(const LLUUID& item_id); - // delete a particular inventory object by ID, and delete it from - // the server. Also updates linked items. + // Delete a particular inventory object by ID, and delete it from + // the server. Also updates linked items. void purgeObject(const LLUUID& id); - void updateLinkedObjectsFromPurge(const LLUUID& baseobj_id); - // This is a method which collects the descendants of the id + // Collects and purges the descendants of the id // provided. If the category is not found, no action is // taken. This method goes through the long winded process of // removing server representation of folders and items while doing // cache accounting in a fairly efficient manner. This method does // not notify observers (though maybe it should...) void purgeDescendentsOf(const LLUUID& id); +protected: + void updateLinkedObjectsFromPurge(const LLUUID& baseobj_id); + + //-------------------------------------------------------------------- + // Reorder + //-------------------------------------------------------------------- +public: + // Changes items order by insertion of the item identified by src_item_id + // before the item identified by dest_item_id. Both items must exist in items array. + // Sorting is stored after method is finished. Only src_item_id is moved before dest_item_id. + static void updateItemsOrder(LLInventoryModel::item_array_t& items, + const LLUUID& src_item_id, + const LLUUID& dest_item_id); + + // Saves current order of the passed items using inventory item sort field. + // Resets 'items' sort fields and saves them on server. + // Is used to save order for Favorites folder. + void saveItemsOrder(const LLInventoryModel::item_array_t& items); - // This method optimally removes the referenced categories and - // items from the current agent's inventory in the database. It - // performs all of the during deletion. The local representation - // is not removed. - void deleteFromServer(LLDynamicArray<LLUUID>& category_ids, - LLDynamicArray<LLUUID>& item_ids); - - // Add/remove an observer. If the observer is destroyed, be sure - // to remove it. - void addObserver(LLInventoryObserver* observer); - void removeObserver(LLInventoryObserver* observer); - BOOL containsObserver(LLInventoryObserver* observer) const; - - // - // Misc Methods - // - - // findCategoryUUIDForType() returns the uuid of the category that - // specifies 'type' as what it defaults to containing. The - // category is not necessarily only for that type. *NOTE: If create_folder is true, this - // will create a new inventory category on the fly if one does not exist. *NOTE: if find_in_library is - // true it will search in the user's library folder instead of "My Inventory" - // SDK: Added flag to specify whether the folder should be created if not found. This fixes the horrible - // multiple trash can bug. - const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true, bool find_in_library = false); - - // This gets called by the idle loop. It only updates if new - // state is detected. Call notifyObservers() manually to update - // regardless of whether state change has been indicated. - void idleNotifyObservers(); - - // Call this method to explicitly update everyone on a new state. - // The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328] - void notifyObservers(const std::string service_name=""); - - // This allows outsiders to tell the inventory if something has - // been changed 'under the hood', but outside the control of the - // inventory. For example, if we grant someone modify permissions, - // then that changes the data structures for LLAvatarTracker, but - // potentially affects inventory observers. This API makes sure - // that the next notify will include that notification. - void addChangedMask(U32 mask, const LLUUID& referent); - - const changed_items_t& getChangedIDs() const { return mChangedItemIDs; } - - // This method to prepares a set of mock inventory which provides - // minimal functionality before the actual arrival of inventory. - //void mock(const LLUUID& root_id); - - // Make sure we have the descendents in the structure. Returns true - // if a fetch was performed. - bool fetchDescendentsOf(const LLUUID& folder_id); - - // call this method to request the inventory. - //void requestFromServer(const LLUUID& agent_id); - - // call this method on logout to save a terse representation - void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id); - - // Generates a string containing the path to the item specified by - // item_id. - void appendPath(const LLUUID& id, std::string& path) const; - - // message handling functionality - static void registerCallbacks(LLMessageSystem* msg); + // Rearranges Landmarks inside Favorites folder. + // Moves source landmark before target one. + void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id); - // Convenience function to create a new category. You could call - // updateCatgory() with a newly generated UUID category, but this - // version will take care of details like what the name should be - // based on preferred type. Returns the UUID of the new - // category. If you want to use the default name based on type, - // pass in a NULL to the 'name parameter. + //-------------------------------------------------------------------- + // Creation + //-------------------------------------------------------------------- +public: + // Returns the UUID of the new category. If you want to use the default + // name based on type, pass in a NULL to the 'name' parameter. LLUUID createNewCategory(const LLUUID& parent_id, LLFolderType::EType preferred_type, const std::string& name); +protected: + // Internal methods that add inventory and make sure that all of + // the internal data structures are consistent. These methods + // should be passed pointers of newly created objects, and the + // instance will take over the memory management from there. + void addCategory(LLViewerInventoryCategory* category); + void addItem(LLViewerInventoryItem* item); + +/** Mutators + ** ** + *******************************************************************************/ - // methods to load up inventory skeleton & meat. These are used - // during authentication. return true if everything parsed. - bool loadSkeleton(const LLSD& options, const LLUUID& owner_id); - bool loadMeat(const LLSD& options, const LLUUID& owner_id); - - // This is a brute force method to rebuild the entire parent-child - // relations. - void buildParentChildMap(); - - // - // Category accounting. - // +/******************************************************************************** + ** ** + ** CATEGORY ACCOUNTING + **/ - // This structure represents the number of items added or removed - // from a category. +public: + // Represents the number of items added or removed from a category. struct LLCategoryUpdate { LLCategoryUpdate() : mDescendentDelta(0) {} @@ -333,8 +387,7 @@ public: }; typedef std::vector<LLCategoryUpdate> update_list_t; - // This structure eixts to make it easier to account for deltas in - // a map. + // This exists to make it easier to account for deltas in a map. struct LLInitializedS32 { LLInitializedS32() : mValue(0) {} @@ -345,102 +398,89 @@ public: }; typedef std::map<LLUUID, LLInitializedS32> update_map_t; - // Call these methods when there are category updates, but call - // them *before* the actual update so the method can do descendent - // accounting correctly. + // Call when there are category updates. Call them *before* the + // actual update so the method can do descendent accounting correctly. void accountForUpdate(const LLCategoryUpdate& update) const; void accountForUpdate(const update_list_t& updates); void accountForUpdate(const update_map_t& updates); - // Return child status of category children. yes/no/maybe + // Return (yes/no/maybe) child status of category children. EHasChildren categoryHasChildren(const LLUUID& cat_id) const; - // returns true iff category version is known and theoretical + // Returns true iff category version is known and theoretical // descendents == actual descendents. bool isCategoryComplete(const LLUUID& cat_id) const; - // callbacks - // Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed - void emptyFolderType(const std::string notification, LLFolderType::EType folder_type); - bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type); - - // Utility Functions - void removeItem(const LLUUID& item_id); - - // Data about the agent's root folder and root library folder - // are stored here, rather than in LLAgent where it used to be, because - // gInventory is a singleton and represents the agent's inventory. - // The "library" is actually the inventory of a special agent, - // usually Alexandria Linden. - const LLUUID &getRootFolderID() const; - const LLUUID &getLibraryOwnerID() const; - const LLUUID &getLibraryRootFolderID() const; - - // These are set during login with data from the server - void setRootFolderID(const LLUUID& id); - void setLibraryOwnerID(const LLUUID& id); - void setLibraryRootFolderID(const LLUUID& id); +/** Category Accounting + ** ** + *******************************************************************************/ +/******************************************************************************** + ** ** + ** NOTIFICATIONS + **/ - /** - * Changes items order by insertion of the item identified by src_item_id - * BEFORE the item identified by dest_item_id. Both items must exist in items array. - * - * Sorting is stored after method is finished. Only src_item_id is moved before dest_item_id. - * - * @param[in, out] items - vector with items to be updated. It should be sorted in a right way - * before calling this method. - * @param src_item_id - LLUUID of inventory item to be moved in new position - * @param dest_item_id - LLUUID of inventory item before which source item should be placed. - */ - static void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id); - - /** - * Saves current order of the passed items using inventory item sort field. - * - * It reset items' sort fields and saves them on server. - * Is used to save order for Favorites folder. - * - * @param[in] items vector of items in order to be saved. - */ - void saveItemsOrder(const LLInventoryModel::item_array_t& items); +public: + // Called by the idle loop. Only updates if new state is detected. Call + // notifyObservers() manually to update regardless of whether state change + // has been indicated. + void idleNotifyObservers(); - /** - * Rearranges Landmarks inside Favorites folder. - * Moves source landmark before target one. - * - * @param source_item_id - LLUUID of the source item to be moved into new position - * @param target_item_id - LLUUID of the target item before which source item should be placed. - */ - void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id); + // Call to explicitly update everyone on a new state. The optional argument + // 'service_name' is used by Agent Inventory Service [DEV-20328] + void notifyObservers(const std::string service_name=""); + // Allows outsiders to tell the inventory if something has + // been changed 'under the hood', but outside the control of the + // inventory. The next notify will include that notification. + void addChangedMask(U32 mask, const LLUUID& referent); + const changed_items_t& getChangedIDs() const { return mChangedItemIDs; } protected: + // Updates all linked items pointing to this id. + void addChangedMaskForLinks(const LLUUID& object_id, U32 mask); +private: + // Flag set when notifyObservers is being called, to look for bugs + // where it's called recursively. + BOOL mIsNotifyObservers; + // Variables used to track what has changed since the last notify. + U32 mModifyMask; + changed_items_t mChangedItemIDs; + + //-------------------------------------------------------------------- + // Observers + //-------------------------------------------------------------------- +public: + // If the observer is destroyed, be sure to remove it. + void addObserver(LLInventoryObserver* observer); + void removeObserver(LLInventoryObserver* observer); + BOOL containsObserver(LLInventoryObserver* observer) const; +private: + typedef std::set<LLInventoryObserver*> observer_list_t; + observer_list_t mObservers; + +/** Notifications + ** ** + *******************************************************************************/ - // Internal methods which add inventory and make sure that all of - // the internal data structures are consistent. These methods - // should be passed pointers of newly created objects, and the - // instance will take over the memory management from there. - void addCategory(LLViewerInventoryCategory* category); - void addItem(LLViewerInventoryItem* item); - - // ! DEPRECRATE ! Remove this and add it into findCategoryUUIDForType, - // since that's the only function that uses this. It's too confusing - // having both methods. - // - // Internal method which looks for a category with the specified - // preferred type. Returns LLUUID::null if not found - const LLUUID &findCatUUID(LLFolderType::EType preferred_type, bool find_in_library = false) const; - // Empty the entire contents - void empty(); +/******************************************************************************** + ** ** + ** MISCELLANEOUS + **/ - // Given the current state of the inventory items, figure out the - // clone information. *FIX: This is sub-optimal, since we can - // insert this information snurgically, but this makes sure the - // implementation works before we worry about optimization. - //void recalculateCloneInformation(); + //-------------------------------------------------------------------- + // Callbacks + //-------------------------------------------------------------------- +public: + // Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed + void emptyFolderType(const std::string notification, LLFolderType::EType folder_type); + bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type); + static void registerCallbacks(LLMessageSystem* msg); - // file import/export. + //-------------------------------------------------------------------- + // File I/O + //-------------------------------------------------------------------- +protected: static bool loadFromFile(const std::string& filename, cat_array_t& categories, item_array_t& items, @@ -449,86 +489,46 @@ protected: const cat_array_t& categories, const item_array_t& items); - // message handling functionality - //static void processUseCachedInventory(LLMessageSystem* msg, void**); + //-------------------------------------------------------------------- + // Message handling functionality + //-------------------------------------------------------------------- +public: static void processUpdateCreateInventoryItem(LLMessageSystem* msg, void**); static void processRemoveInventoryItem(LLMessageSystem* msg, void**); static void processUpdateInventoryFolder(LLMessageSystem* msg, void**); static void processRemoveInventoryFolder(LLMessageSystem* msg, void**); - //static void processExchangeCallingcard(LLMessageSystem* msg, void**); - //static void processAddCallingcard(LLMessageSystem* msg, void**); - //static void processDeclineCallingcard(LLMessageSystem* msg, void**); static void processSaveAssetIntoInventory(LLMessageSystem* msg, void**); static void processBulkUpdateInventory(LLMessageSystem* msg, void**); static void processInventoryDescendents(LLMessageSystem* msg, void**); static void processMoveInventoryItem(LLMessageSystem* msg, void**); static void processFetchInventoryReply(LLMessageSystem* msg, void**); - +protected: bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting); - // Updates all linked items pointing to this id. - void addChangedMaskForLinks(const LLUUID& object_id, U32 mask); - + //-------------------------------------------------------------------- + // Locks + //-------------------------------------------------------------------- +public: + void lockDirectDescendentArrays(const LLUUID& cat_id, + cat_array_t*& categories, + item_array_t*& items); + void unlockDirectDescendentArrays(const LLUUID& cat_id); protected: cat_array_t* getUnlockedCatArray(const LLUUID& id); item_array_t* getUnlockedItemArray(const LLUUID& id); - private: - // Variables used to track what has changed since the last notify. - U32 mModifyMask; - changed_items_t mChangedItemIDs; - std::map<LLUUID, bool> mCategoryLock; std::map<LLUUID, bool> mItemLock; - // cache recent lookups - mutable LLPointer<LLViewerInventoryItem> mLastItem; - - // This last set of indices is used to map parents to children. - typedef std::map<LLUUID, cat_array_t*> parent_cat_map_t; - typedef std::map<LLUUID, item_array_t*> parent_item_map_t; - parent_cat_map_t mParentChildCategoryTree; - parent_item_map_t mParentChildItemTree; - - typedef std::set<LLInventoryObserver*> observer_list_t; - observer_list_t mObservers; - - // Agent inventory folder information. - LLUUID mRootFolderID; - LLUUID mLibraryRootFolderID; - LLUUID mLibraryOwnerID; - - // Expected inventory cache version - const static S32 sCurrentInvCacheVersion; - - // This flag is used to handle an invalid inventory state. - bool mIsAgentInvUsable; - -private: - // Information for tracking the actual inventory. We index this - // information in a lot of different ways so we can access - // the inventory using several different identifiers. - // mInventory member data is the 'master' list of inventory, and - // mCategoryMap and mItemMap store uuid->object mappings. - typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t; - typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t; - //inv_map_t mInventory; - cat_map_t mCategoryMap; - item_map_t mItemMap; - - // Flag set when notifyObservers is being called, to look for bugs - // where it's called recursively. - BOOL mIsNotifyObservers; + //-------------------------------------------------------------------- + // Debugging + //-------------------------------------------------------------------- public: - // *NOTE: DEBUG functionality void dumpInventory() const; - //////////////////////////////////////////////////////////////////////////////// - // Login status -public: - static BOOL getIsFirstTimeInViewer2(); -private: - static BOOL sFirstTimeInViewer2; +/** Miscellaneous + ** ** + *******************************************************************************/ }; // a special inventory model for the agent diff --git a/indra/newview/llnotificationstorage.cpp b/indra/newview/llnotificationstorage.cpp index 316ff4324c..20b40b4e1d 100644 --- a/indra/newview/llnotificationstorage.cpp +++ b/indra/newview/llnotificationstorage.cpp @@ -112,8 +112,8 @@ void LLPersistentNotificationStorage::saveNotifications() LLNotificationPtr notification = *it; // After a notification was placed in Persist channel, it can become - // responded, expired - in this case we are should not save it - if(notification->isRespondedTo() + // responded, expired or canceled - in this case we are should not save it + if(notification->isRespondedTo() || notification->isCancelled() || notification->isExpired()) { continue; @@ -208,7 +208,6 @@ LLNotificationResponderInterface* LLResponderRegistry::createResponder(const std build_map_t::const_iterator it = sBuildMap.find(notification_name); if(sBuildMap.end() == it) { - llwarns << "Responder for notification \'" << notification_name << "\' is not registered" << llendl; return NULL; } responder_constructor_t ctr = it->second; diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 6f2e7c0b20..557fb399be 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -635,6 +635,8 @@ BOOL LLPanelEditWearable::postBuild() mPanelAlpha = getChild<LLPanel>("edit_alpha_panel"); mPanelTattoo = getChild<LLPanel>("edit_tattoo_panel"); + mTxtAvatarHeight = mPanelShape->getChild<LLTextBox>("avatar_height"); + mWearablePtr = NULL; return TRUE; @@ -661,7 +663,9 @@ void LLPanelEditWearable::draw() updateVerbs(); if (getWearable()) { - updatePanelPickerControls(getWearable()->getType()); + LLWearableType::EType type = getWearable()->getType(); + updatePanelPickerControls(type); + updateTypeSpecificControls(type); } LLPanel::draw(); @@ -864,6 +868,9 @@ void LLPanelEditWearable::initializePanel() // set name mTextEditor->setText(mWearablePtr->getName()); + // toggle wearable type-specific controls + toggleTypeSpecificControls(type); + // clear and rebuild visual param list const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type); if (!wearable_entry) @@ -922,6 +929,28 @@ void LLPanelEditWearable::initializePanel() updateVerbs(); } +void LLPanelEditWearable::toggleTypeSpecificControls(LLWearableType::EType type) +{ + // Toggle controls specific to shape editing panel. + { + bool is_shape = (type == LLWearableType::WT_SHAPE); + childSetVisible("sex_radio", is_shape); + childSetVisible("female_icon", is_shape); + childSetVisible("male_icon", is_shape); + } +} + +void LLPanelEditWearable::updateTypeSpecificControls(LLWearableType::EType type) +{ + // Update controls specific to shape editing panel. + if (type == LLWearableType::WT_SHAPE) + { + // Update avatar height + std::string avatar_height_str = llformat("%.2f", gAgentAvatarp->mBodySize.mV[VZ]); + mTxtAvatarHeight->setTextArg("[HEIGHT]", avatar_height_str); + } +} + void LLPanelEditWearable::updateScrollingPanelUI() { // do nothing if we don't have a valid wearable we're editing diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h index 876b22f0a5..a5a332019d 100644 --- a/indra/newview/llpaneleditwearable.h +++ b/indra/newview/llpaneleditwearable.h @@ -80,6 +80,8 @@ private: void onColorSwatchCommit(const LLUICtrl*); void onTexturePickerCommit(const LLUICtrl*); void updatePanelPickerControls(LLWearableType::EType type); + void toggleTypeSpecificControls(LLWearableType::EType type); + void updateTypeSpecificControls(LLWearableType::EType type); // the pointer to the wearable we're editing. NULL means we're not editing a wearable. LLWearable *mWearablePtr; @@ -91,6 +93,7 @@ private: LLTextBox *mPanelTitle; LLTextBox *mDescTitle; + LLTextBox *mTxtAvatarHeight; // This text editor reference will change each time we edit a new wearable - diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 43c2f01da5..1c74c8f26a 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -98,26 +98,75 @@ public: { if (!gInventory.isInventoryUsable()) return; - LLUUID cof = LLAppearanceMgr::getInstance()->getCOF(); - if (cof.isNull()) return; + bool panel_updated = checkCOF(); + + if (!panel_updated) + { + checkBaseOutfit(); + } + } + +protected: - LLViewerInventoryCategory* cat = gInventory.getCategory(cof); - if (!cat) return; + /** Get a version of an inventory category specified by its UUID */ + static S32 getCategoryVersion(const LLUUID& cat_id) + { + LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); + if (!cat) return LLViewerInventoryCategory::VERSION_UNKNOWN; - S32 cof_version = cat->getVersion(); + return cat->getVersion(); + } - if (cof_version == mCOFLastVersion) return; + bool checkCOF() + { + LLUUID cof = LLAppearanceMgr::getInstance()->getCOF(); + if (cof.isNull()) return false; + S32 cof_version = getCategoryVersion(cof); + + if (cof_version == mCOFLastVersion) return false; + mCOFLastVersion = cof_version; mPanel->update(); + + return true; } -protected: + void checkBaseOutfit() + { + LLUUID baseoutfit_id = LLAppearanceMgr::getInstance()->getBaseOutfitUUID(); + + if (baseoutfit_id == mBaseOutfitId) + { + if (baseoutfit_id.isNull()) return; + + const S32 baseoutfit_ver = getCategoryVersion(baseoutfit_id); + + if (baseoutfit_ver == mBaseOutfitLastVersion) return; + } + else + { + mBaseOutfitId = baseoutfit_id; + if (baseoutfit_id.isNull()) return; + + mBaseOutfitLastVersion = getCategoryVersion(mBaseOutfitId); + } + + mPanel->updateVerbs(); + } + + + + LLPanelOutfitEdit *mPanel; //last version number of a COF category S32 mCOFLastVersion; + + LLUUID mBaseOutfitId; + + S32 mBaseOutfitLastVersion; }; @@ -159,8 +208,13 @@ BOOL LLPanelOutfitEdit::postBuild() mLookItemTypes[LIT_ATTACHMENT] = LLLookItemType(getString("Filter.Objects"), ATTACHMENT_MASK); mCurrentOutfitName = getChild<LLTextBox>("curr_outfit_name"); + mStatus = getChild<LLTextBox>("status"); + + mFolderViewBtn = getChild<LLButton>("folder_view_btn"); + mListViewBtn = getChild<LLButton>("list_view_btn"); childSetCommitCallback("filter_button", boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this), NULL); + childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::showFilteredFolderWearablesPanel, this), NULL); childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showFilteredWearablesPanel, this), NULL); mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list"); @@ -217,8 +271,9 @@ BOOL LLPanelOutfitEdit::postBuild() save_registar.add("Outfit.SaveAsNew.Action", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, true)); mSaveMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_save_outfit.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - mWearableListManager = new LLFilteredWearableListManager( - getChild<LLInventoryItemsList>("filtered_wearables_list"), ALL_ITEMS_MASK); + mWearableItemsPanel = getChild<LLPanel>("filtered_wearables_panel"); + mWearableItemsList = getChild<LLInventoryItemsList>("filtered_wearables_list"); + mWearableListManager = new LLFilteredWearableListManager(mWearableItemsList, ALL_ITEMS_MASK); return TRUE; } @@ -239,12 +294,33 @@ void LLPanelOutfitEdit::toggleAddWearablesPanel() void LLPanelOutfitEdit::showWearablesFilter() { - childSetVisible("filter_combobox_panel", childGetValue("filter_button")); + bool filter_visible = childGetValue("filter_button"); + + childSetVisible("filter_panel", filter_visible); + + if(!filter_visible) + { + mSearchFilter->clear(); + onSearchEdit(LLStringUtil::null); + } } void LLPanelOutfitEdit::showFilteredWearablesPanel() { - childSetVisible("filtered_wearables_panel", !childIsVisible("filtered_wearables_panel")); + if(switchPanels(mInventoryItemsPanel, mWearableItemsPanel)) + { + mFolderViewBtn->setToggleState(FALSE); + } + mListViewBtn->setToggleState(TRUE); +} + +void LLPanelOutfitEdit::showFilteredFolderWearablesPanel() +{ + if(switchPanels(mWearableItemsPanel, mInventoryItemsPanel)) + { + mListViewBtn->setToggleState(FALSE); + } + mFolderViewBtn->setToggleState(TRUE); } void LLPanelOutfitEdit::saveOutfit(bool as_new) @@ -309,7 +385,7 @@ void LLPanelOutfitEdit::onSearchEdit(const std::string& string) if (mSearchString == "") { mInventoryItemsPanel->setFilterSubString(LLStringUtil::null); - + mWearableItemsList->setFilterSubString(LLStringUtil::null); // re-open folders that were initially open mSavedFolderState->setApply(TRUE); mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); @@ -335,6 +411,8 @@ void LLPanelOutfitEdit::onSearchEdit(const std::string& string) // set new filter string mInventoryItemsPanel->setFilterSubString(mSearchString); + mWearableItemsList->setFilterSubString(mSearchString); + } void LLPanelOutfitEdit::onAddToOutfitClicked(void) @@ -479,11 +557,26 @@ void LLPanelOutfitEdit::updateVerbs() LLAppearanceMgr::getInstance()->updateIsDirty(); bool outfit_is_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty(); - + bool has_baseoutfit = LLAppearanceMgr::getInstance()->getBaseOutfitUUID().notNull(); + childSetEnabled(SAVE_BTN, outfit_is_dirty); - childSetEnabled(REVERT_BTN, outfit_is_dirty); + childSetEnabled(REVERT_BTN, outfit_is_dirty && has_baseoutfit); mSaveMenu->setItemEnabled("save_outfit", outfit_is_dirty); + + mStatus->setText(outfit_is_dirty ? getString("unsaved_changes") : getString("now_editing")); + +} + +bool LLPanelOutfitEdit::switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel) +{ + if(switch_from_panel && switch_to_panel && !switch_to_panel->getVisible()) + { + switch_from_panel->setVisible(FALSE); + switch_to_panel->setVisible(TRUE); + return true; + } + return false; } // EOF diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 3cdfed14b9..cb8283fca3 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -42,6 +42,7 @@ #include "llremoteparcelrequest.h" #include "llinventory.h" +#include "llinventoryitemslist.h" #include "llinventorymodel.h" class LLButton; @@ -87,6 +88,7 @@ public: void toggleAddWearablesPanel(); void showWearablesFilter(); void showFilteredWearablesPanel(); + void showFilteredFolderWearablesPanel(); void saveOutfit(bool as_new = false); void showSaveMenu(); @@ -102,20 +104,34 @@ public: void update(); + void updateVerbs(); + /** + * @brief Helper function. Shows one panel instead of another. + * If panels already switched does nothing and returns false. + * @param switch_from_panel panel to hide + * @param switch_to_panel panel to show + * @retun returns true if switching happened, false if not. + */ + bool switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel); + private: - void updateVerbs(); LLTextBox* mCurrentOutfitName; + LLTextBox* mStatus; LLInventoryPanel* mInventoryItemsPanel; LLFilterEditor* mSearchFilter; LLSaveFolderState* mSavedFolderState; std::string mSearchString; LLButton* mEditWearableBtn; + LLButton* mFolderViewBtn; + LLButton* mListViewBtn; LLToggleableMenu* mSaveMenu; - LLFilteredWearableListManager* mWearableListManager; + LLFilteredWearableListManager* mWearableListManager; + LLInventoryItemsList* mWearableItemsList; + LLPanel* mWearableItemsPanel; LLCOFObserver* mCOFObserver; std::vector<LLLookItemType> mLookItemTypes; diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index 11b6c0a3ae..b68fc3b002 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -482,7 +482,7 @@ std::string LLScriptFloaterManager::getObjectName(const LLUUID& notification_id) text = notification->getSubstitutions()["OBJECTNAME"].asString(); break; case LLScriptFloaterManager::OBJ_GIVE_INVENTORY: - text = notification->getSubstitutions()["NAME"].asString(); + text = notification->getSubstitutions()["OBJECTFROMNAME"].asString(); break; default: text = LLTrans::getString("object"); diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 089163929e..9275ca4f42 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -291,7 +291,10 @@ LLToastNotifyPanel::~LLToastNotifyPanel() { // let reusable notification be deleted mNotification->setReusable(false); - LLNotifications::getInstance()->cancel(mNotification); + if (!mNotification->isPersistent()) + { + LLNotifications::getInstance()->cancel(mNotification); + } } } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 92af0c485a..28c1a1ad3a 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2328,7 +2328,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) LLSD args; args["MESSAGE"] = message; - LLNotificationsUtil::add("JoinGroup", args, payload, join_group_response); + // we shouldn't pass callback functor since it is registered in LLFunctorRegistration + LLNotificationsUtil::add("JoinGroup", args, payload); } } break; @@ -6473,3 +6474,19 @@ void LLOfferInfo::forceResponse(InventoryOfferResponse response) params.functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, this, _1, _2)); LLNotifications::instance().forceResponse(params, response); } + +static bool confirm_leave_call_callback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + const LLSD& payload = notification["payload"]; + LLUUID session_id = payload["session_id"]; + + LLFloater* im_floater = LLFloaterReg::findInstance("impanel", session_id); + if (option == 0 && im_floater != NULL) + { + im_floater->closeFloater(); + } + + return false; +} +static LLNotificationFunctorRegistration confirm_leave_call_cb("ConfirmLeaveCall", confirm_leave_call_callback); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 9533d820eb..24bd2739f7 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -71,9 +71,10 @@ class LLTexGlobalColor; class LLVOAvatarBoneInfo; class LLVOAvatarSkeletonInfo; -//------------------------------------------------------------------------ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLVOAvatar -//------------------------------------------------------------------------ +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLVOAvatar : public LLViewerObject, public LLCharacter @@ -138,13 +139,13 @@ public: virtual void updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax); virtual void getSpatialExtents(LLVector3& newMin, LLVector3& newMax); virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, - S32 face = -1, // which face to check, -1 = ALL_SIDES - BOOL pick_transparent = FALSE, - S32* face_hit = NULL, // which face was hit - LLVector3* intersection = NULL, // return the intersection point - LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point - LLVector3* normal = NULL, // return the surface normal at the intersection point - LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point + S32 face = -1, // which face to check, -1 = ALL_SIDES + BOOL pick_transparent = FALSE, + S32* face_hit = NULL, // which face was hit + LLVector3* intersection = NULL, // return the intersection point + LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point + LLVector3* normal = NULL, // return the surface normal at the intersection point + LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point //-------------------------------------------------------------------- // LLCharacter interface and related diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index e5949ae941..460291a929 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -39,9 +39,10 @@ struct LocalTextureData; -//------------------------------------------------------------------------ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLVOAvatarSelf -//------------------------------------------------------------------------ +// +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLVOAvatarSelf : public LLVOAvatar { diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 41dc95cec6..b7f3fd0dff 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -124,6 +124,29 @@ protected: /*virtual*/ void init(); }; + +class LLPanelDeletableWearableListItem : public LLPanelWearableListItem +{ + LOG_CLASS(LLPanelDeletableWearableListItem); +public: + + static LLPanelDeletableWearableListItem* create(LLViewerInventoryItem* item); + + virtual ~LLPanelDeletableWearableListItem(); + + /*virtual*/ BOOL postBuild(); + + /** + * Make button visible during mouse over event. + */ + inline void setShowDeleteButton(bool show) { setShowWidget("btn_delete", show); } + +protected: + LLPanelDeletableWearableListItem(LLViewerInventoryItem* item); + + /*virtual*/ void init(); +}; + /** * @class LLPanelDummyClothingListItem * diff --git a/indra/newview/skins/default/textures/icons/Female.png b/indra/newview/skins/default/textures/icons/Female.png Binary files differnew file mode 100644 index 0000000000..67b5653a94 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Female.png diff --git a/indra/newview/skins/default/textures/icons/Male.png b/indra/newview/skins/default/textures/icons/Male.png Binary files differnew file mode 100644 index 0000000000..f3fad77fd0 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Male.png diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index d896cab260..4f46e34520 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1207,6 +1207,7 @@ Eject [AVATAR_NAME] from your land? <notification icon="alertmodal.tga" name="EjectAvatarFromGroup" + persist="true" type="notify"> You ejected [AVATAR_NAME] from group [GROUP_NAME] </notification> @@ -2512,6 +2513,7 @@ Would you like to trust this authority? <notification icon="alertmodal.tga" name="GrantedModifyRights" + persist="true" type="notify"> [NAME] has given you permission to edit their objects. </notification> @@ -2519,6 +2521,7 @@ Would you like to trust this authority? <notification icon="alertmodal.tga" name="RevokedModifyRights" + persist="true" type="notify"> Your privilege to modify [NAME]'s objects has been revoked </notification> @@ -4433,6 +4436,7 @@ Replaced missing clothing/body part with default. <notification icon="groupnotify" name="GroupNotice" + persist="true" type="groupnotify"> Topic: [SUBJECT], Message: [MESSAGE] </notification> @@ -4481,6 +4485,7 @@ Do you wish to proceed? <notification icon="notify.tga" name="UploadPayment" + persist="true" type="notify"> You paid L$[AMOUNT] to upload. </notification> @@ -4768,6 +4773,7 @@ Please select at least one type of content to search (General, Moderate, or Adul <notification icon="notify.tga" name="SystemMessage" + persist="true" type="notify"> [MESSAGE] </notification> @@ -4775,10 +4781,13 @@ Please select at least one type of content to search (General, Moderate, or Adul <notification icon="notify.tga" name="PaymentRecived" + persist="true" type="notify"> [MESSAGE] </notification> + <!-- EventNotification couldn't be persist since server decide is it necessary to notify + user about subscribed event via LLEventNotifier--> <notification icon="notify.tga" name="EventNotification" @@ -4806,6 +4815,7 @@ Event Notification: <notification icon="notify.tga" name="TransferObjectsHighlighted" + persist="true" type="notify"> All objects on this parcel that will transfer to the purchaser of this parcel are now highlighted. @@ -4821,6 +4831,7 @@ All objects on this parcel that will transfer to the purchaser of this parcel ar <notification icon="notify.tga" name="DeactivatedGesturesTrigger" + persist="true" type="notify"> Deactivated gestures with same trigger: [NAMES] @@ -4829,6 +4840,7 @@ Deactivated gestures with same trigger: <notification icon="notify.tga" name="NoQuickTime" + persist="true" type="notify"> Apple's QuickTime software does not appear to be installed on your system. If you want to view streaming media on parcels that support it you should go to the [http://www.apple.com/quicktime QuickTime site] and install the QuickTime Player. @@ -4836,6 +4848,7 @@ If you want to view streaming media on parcels that support it you should go to <notification icon="notify.tga" name="NoPlugin" + persist="true" type="notify"> No Media Plugin was found to handle the "[MIME_TYPE]" mime type. Media of this type will be unavailable. </notification> @@ -4855,6 +4868,7 @@ Please re-install the plugin or contact the vendor if you continue to experience <notification icon="notify.tga" name="OwnedObjectsReturned" + persist="true" type="notify"> The objects you own on the selected parcel of land have been returned back to your inventory. </notification> @@ -4862,6 +4876,7 @@ The objects you own on the selected parcel of land have been returned back to yo <notification icon="notify.tga" name="OtherObjectsReturned" + persist="true" type="notify"> The objects on the selected parcel of land that is owned by [FIRST] [LAST] have been returned to his or her inventory. </notification> @@ -4869,6 +4884,7 @@ The objects on the selected parcel of land that is owned by [FIRST] [LAST] have <notification icon="notify.tga" name="OtherObjectsReturned2" + persist="true" type="notify"> The objects on the selected parcel of land owned by the Resident '[NAME]' have been returned to their owner. </notification> @@ -4876,6 +4892,7 @@ The objects on the selected parcel of land owned by the Resident '[NAME]&ap <notification icon="notify.tga" name="GroupObjectsReturned" + persist="true" type="notify"> The objects on the selected parcel of land shared with the group [GROUPNAME] have been returned back to their owner's inventory. Transferable deeded objects have been returned to their previous owners. @@ -4885,6 +4902,7 @@ Non-transferable objects that are deeded to the group have been deleted. <notification icon="notify.tga" name="UnOwnedObjectsReturned" + persist="true" type="notify"> The objects on the selected parcel that are NOT owned by you have been returned to their owners. </notification> @@ -4892,6 +4910,7 @@ The objects on the selected parcel that are NOT owned by you have been returned <notification icon="notify.tga" name="ServerObjectMessage" + persist="true" type="notify"> Message from [NAME]: <nolink>[MSG]</nolink> @@ -4900,6 +4919,7 @@ Message from [NAME]: <notification icon="notify.tga" name="NotSafe" + persist="true" type="notify"> This land has damage enabled. You can be hurt here. If you die, you will be teleported to your home location. @@ -4909,6 +4929,7 @@ You can be hurt here. If you die, you will be teleported to your home location. <notification icon="notify.tga" name="NoFly" + persist="true" type="notify"> This area has flying disabled. You can't fly here. @@ -4918,6 +4939,7 @@ You can't fly here. <notification icon="notify.tga" name="PushRestricted" + persist="true" type="notify"> This area does not allow pushing. You can't push others here unless you own the land. <unique/> @@ -4926,6 +4948,7 @@ This area does not allow pushing. You can't push others here unless you own <notification icon="notify.tga" name="NoVoice" + persist="true" type="notify"> This area has voice chat disabled. You won't be able to hear anyone talking. <unique/> @@ -4934,6 +4957,7 @@ This area has voice chat disabled. You won't be able to hear anyone talking <notification icon="notify.tga" name="NoBuild" + persist="true" type="notify"> This area has building disabled. You can't build or rez objects here. <unique/> @@ -4942,6 +4966,7 @@ This area has building disabled. You can't build or rez objects here. <notification icon="notify.tga" name="ScriptsStopped" + persist="true" type="notify"> An administrator has temporarily stopped scripts in this region. </notification> @@ -4949,6 +4974,7 @@ An administrator has temporarily stopped scripts in this region. <notification icon="notify.tga" name="ScriptsNotRunning" + persist="true" type="notify"> This region is not running any scripts. </notification> @@ -4956,6 +4982,7 @@ This region is not running any scripts. <notification icon="notify.tga" name="NoOutsideScripts" + persist="true" type="notify"> This land has outside scripts disabled. @@ -4965,6 +4992,7 @@ No scripts will work here except those belonging to the land owner. <notification icon="notify.tga" name="ClaimPublicLand" + persist="true" type="notify"> You can only claim public land in the Region you're in. </notification> @@ -4972,6 +5000,7 @@ You can only claim public land in the Region you're in. <notification icon="notify.tga" name="RegionTPAccessBlocked" + persist="true" type="notify"> You aren't allowed in that Region due to your maturity Rating. You may need to validate your age and/or install the latest Viewer. @@ -4981,6 +5010,7 @@ Please go to the Knowledge Base for details on accessing areas with this maturit <notification icon="notify.tga" name="URBannedFromRegion" + persist="true" type="notify"> You are banned from the region. </notification> @@ -4988,6 +5018,7 @@ You are banned from the region. <notification icon="notify.tga" name="NoTeenGridAccess" + persist="true" type="notify"> Your account cannot connect to this teen grid region. </notification> @@ -4995,6 +5026,7 @@ Your account cannot connect to this teen grid region. <notification icon="notify.tga" name="ImproperPaymentStatus" + persist="true" type="notify"> You do not have proper payment status to enter this region. </notification> @@ -5002,6 +5034,7 @@ You do not have proper payment status to enter this region. <notification icon="notify.tga" name="MustGetAgeRgion" + persist="true" type="notify"> You must be age-verified to enter this region. </notification> @@ -5009,6 +5042,7 @@ You must be age-verified to enter this region. <notification icon="notify.tga" name="MustGetAgeParcel" + persist="true" type="notify"> You must be age-verified to enter this parcel. </notification> @@ -5016,6 +5050,7 @@ You must be age-verified to enter this parcel. <notification icon="notify.tga" name="NoDestRegion" + persist="true" type="notify"> No destination region found. </notification> @@ -5023,6 +5058,7 @@ No destination region found. <notification icon="notify.tga" name="NotAllowedInDest" + persist="true" type="notify"> You are not allowed into the destination. </notification> @@ -5030,6 +5066,7 @@ You are not allowed into the destination. <notification icon="notify.tga" name="RegionParcelBan" + persist="true" type="notify"> Cannot region cross into banned parcel. Try another way. </notification> @@ -5037,6 +5074,7 @@ Cannot region cross into banned parcel. Try another way. <notification icon="notify.tga" name="TelehubRedirect" + persist="true" type="notify"> You have been redirected to a telehub. </notification> @@ -5044,6 +5082,7 @@ You have been redirected to a telehub. <notification icon="notify.tga" name="CouldntTPCloser" + persist="true" type="notify"> Could not teleport closer to destination. </notification> @@ -5051,6 +5090,7 @@ Could not teleport closer to destination. <notification icon="notify.tga" name="TPCancelled" + persist="true" type="notify"> Teleport cancelled. </notification> @@ -5058,6 +5098,7 @@ Teleport cancelled. <notification icon="notify.tga" name="FullRegionTryAgain" + persist="true" type="notify"> The region you are attempting to enter is currently full. Please try again in a few moments. @@ -5066,6 +5107,7 @@ Please try again in a few moments. <notification icon="notify.tga" name="GeneralFailure" + persist="true" type="notify"> General failure. </notification> @@ -5073,6 +5115,7 @@ General failure. <notification icon="notify.tga" name="RoutedWrongRegion" + persist="true" type="notify"> Routed to wrong region. Please try again. </notification> @@ -5080,6 +5123,7 @@ Routed to wrong region. Please try again. <notification icon="notify.tga" name="NoValidAgentID" + persist="true" type="notify"> No valid agent id. </notification> @@ -5087,6 +5131,7 @@ No valid agent id. <notification icon="notify.tga" name="NoValidSession" + persist="true" type="notify"> No valid session id. </notification> @@ -5094,6 +5139,7 @@ No valid session id. <notification icon="notify.tga" name="NoValidCircuit" + persist="true" type="notify"> No valid circuit code. </notification> @@ -5101,6 +5147,7 @@ No valid circuit code. <notification icon="notify.tga" name="NoValidTimestamp" + persist="true" type="notify"> No valid timestamp. </notification> @@ -5108,6 +5155,7 @@ No valid timestamp. <notification icon="notify.tga" name="NoPendingConnection" + persist="true" type="notify"> Unable to create pending connection. </notification> @@ -5115,6 +5163,7 @@ Unable to create pending connection. <notification icon="notify.tga" name="InternalUsherError" + persist="true" type="notify"> Internal error attempting to connect agent usher. </notification> @@ -5122,6 +5171,7 @@ Internal error attempting to connect agent usher. <notification icon="notify.tga" name="NoGoodTPDestination" + persist="true" type="notify"> Unable to find a good teleport destination in this region. </notification> @@ -5129,6 +5179,7 @@ Unable to find a good teleport destination in this region. <notification icon="notify.tga" name="InternalErrorRegionResolver" + persist="true" type="notify"> Internal error attempting to activate region resolver. </notification> @@ -5136,6 +5187,7 @@ Internal error attempting to activate region resolver. <notification icon="notify.tga" name="NoValidLanding" + persist="true" type="notify"> A valid landing point could not be found. </notification> @@ -5143,6 +5195,7 @@ A valid landing point could not be found. <notification icon="notify.tga" name="NoValidParcel" + persist="true" type="notify"> No valid parcel could be found. </notification> @@ -5150,7 +5203,6 @@ No valid parcel could be found. <notification icon="notify.tga" name="ObjectGiveItem" - persist="true" type="offer"> An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJECTTYPE]: [ITEM_SLURL] @@ -5173,7 +5225,6 @@ An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJEC <notification icon="notify.tga" name="UserGiveItem" - persist="true" type="offer"> [NAME_SLURL] has given you this [OBJECTTYPE]: [ITEM_SLURL] @@ -5196,6 +5247,7 @@ An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJEC <notification icon="notify.tga" name="GodMessage" + persist="true" type="notify"> [NAME] @@ -5205,6 +5257,7 @@ An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJEC <notification icon="notify.tga" name="JoinGroup" + persist="true" type="notify"> [MESSAGE] <form name="form"> @@ -5226,7 +5279,6 @@ An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJEC <notification icon="notify.tga" name="TeleportOffered" - persist="true" type="offer"> [NAME_SLURL] has offered to teleport you to their location: @@ -5254,6 +5306,7 @@ An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJEC <notification icon="notify.tga" name="GotoURL" + persist="true" type="notify"> [MESSAGE] [URL] @@ -5272,7 +5325,6 @@ An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJEC <notification icon="notify.tga" name="OfferFriendship" - persist="true" type="offer"> [NAME_SLURL] is offering friendship. @@ -5301,6 +5353,7 @@ An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJEC <notification icon="notify.tga" name="OfferFriendshipNoMessage" + persist="true" type="notify"> [NAME] is offering friendship. @@ -5327,6 +5380,7 @@ An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJEC <notification icon="notify.tga" name="FriendshipDeclined" + persist="true" type="notify"> [NAME] declined your friendship offer. </notification> @@ -5348,6 +5402,7 @@ Friendship offer declined. <notification icon="notify.tga" name="OfferCallingCard" + persist="true" type="notify"> [FIRST] [LAST] is offering their calling card. This will add a bookmark in your inventory so you can quickly IM this Resident. @@ -5368,6 +5423,7 @@ This will add a bookmark in your inventory so you can quickly IM this Resident. name="RegionRestartMinutes" priority="high" sound="UISndAlert" + persist="true" type="notify"> This region will restart in [MINUTES] minutes. If you stay in this region you will be logged out. @@ -5378,6 +5434,7 @@ If you stay in this region you will be logged out. name="RegionRestartSeconds" priority="high" sound="UISndAlert" + persist="true" type="notify"> This region will restart in [SECONDS] seconds. If you stay in this region you will be logged out. @@ -5386,6 +5443,7 @@ If you stay in this region you will be logged out. <notification icon="notify.tga" name="LoadWebPage" + persist="true" type="notify"> Load web page [URL]? @@ -5407,6 +5465,7 @@ From object: [OBJECTNAME], owner: [NAME]? <notification icon="notify.tga" name="FailedToFindWearableUnnamed" + persist="true" type="notify"> Failed to find [TYPE] in database. </notification> @@ -5414,6 +5473,7 @@ Failed to find [TYPE] in database. <notification icon="notify.tga" name="FailedToFindWearable" + persist="true" type="notify"> Failed to find [TYPE] named [DESC] in database. </notification> @@ -5421,6 +5481,7 @@ Failed to find [TYPE] named [DESC] in database. <notification icon="notify.tga" name="ShareToWebFailed" + persist="true" type="notify"> Failed to upload image to web. </notification> @@ -5428,6 +5489,7 @@ Failed to find [TYPE] named [DESC] in database. <notification icon="notify.tga" name="InvalidWearable" + persist="true" type="notify"> The item you are trying to wear uses a feature that your Viewer can't read. Please upgrade your version of [APP_NAME] to wear this item. </notification> @@ -5435,6 +5497,7 @@ The item you are trying to wear uses a feature that your Viewer can't read. <notification icon="notify.tga" name="ScriptQuestion" + persist="true" type="notify"> '[OBJECTNAME]', an object owned by '[NAME]', would like to: @@ -5460,6 +5523,7 @@ Is this OK? icon="notify.tga" name="ScriptQuestionCaution" priority="high" + persist="true" type="notify"> An object named '[OBJECTNAME]', owned by '[NAME]' would like to: @@ -5487,6 +5551,7 @@ Grant this request? <notification icon="notify.tga" name="ScriptDialog" + persist="true" type="notify"> [FIRST] [LAST]'s '[TITLE]' [MESSAGE] @@ -5501,6 +5566,7 @@ Grant this request? <notification icon="notify.tga" name="ScriptDialogGroup" + persist="true" type="notify"> [GROUPNAME]'s '[TITLE]' [MESSAGE] @@ -5516,6 +5582,7 @@ Grant this request? <notification icon="notify.tga" name="FirstBalanceIncrease" + persist="true" type="notify"> You just received L$[AMOUNT]. Your L$ balance is shown in the upper-right. @@ -5524,6 +5591,7 @@ Your L$ balance is shown in the upper-right. <notification icon="notify.tga" name="FirstBalanceDecrease" + persist="true" type="notify"> You just paid L$[AMOUNT]. Your L$ balance is shown in the upper-right. @@ -5533,6 +5601,7 @@ Your L$ balance is shown in the upper-right. <notification icon="notify.tga" name="BuyLindenDollarSuccess" + persist="true" type="notify"> Thank you for your payment! @@ -5545,6 +5614,7 @@ The status of your payment can be checked on your Transaction History page on yo <notification icon="notify.tga" name="FirstSit" + persist="true" type="notify"> You are sitting. Use your arrow keys (or AWSD) to look around. @@ -5554,6 +5624,7 @@ Click the 'Stand Up' button to stand. <notification icon="notify.tga" name="FirstMap" + persist="true" type="notify"> Click and drag the map to look around. Double-click to teleport. @@ -5563,6 +5634,7 @@ Use the controls on the right to find things and display different backgrounds. <notification icon="notify.tga" name="FirstBuild" + persist="true" type="notify"> You have opened the Build Tools. Every object you see around you was created using these tools. </notification> @@ -5572,6 +5644,7 @@ You have opened the Build Tools. Every object you see around you was created usi <notification icon="notify.tga" name="FirstLeftClickNoHit" + persist="true" type="notify"> Left-clicking interacts with special objects. If the mouse pointer changes to a hand, you can interact with the object. @@ -5581,6 +5654,7 @@ You have opened the Build Tools. Every object you see around you was created usi <notification icon="notify.tga" name="FirstTeleport" + persist="true" type="notify"> You can only teleport to certain areas in this region. The arrow points to your specific destination. Click the arrow to dismiss it. </notification> @@ -5590,6 +5664,7 @@ You can only teleport to certain areas in this region. The arrow points to your <notification icon="notify.tga" name="FirstOverrideKeys" + persist="true" type="notify"> Your movement keys are now being handled by an object. Try the arrow keys or AWSD to see what they do. @@ -5601,6 +5676,7 @@ Press 'M' to do this. <notification icon="notify.tga" name="FirstAppearance" + persist="true" type="notify"> You are editing your Appearance. Use the arrow keys to look around. @@ -5610,6 +5686,7 @@ When you are done, press 'Save All'. <notification icon="notify.tga" name="FirstInventory" + persist="true" type="notify"> This is your Inventory, which contains items you own. @@ -5622,6 +5699,7 @@ This is your Inventory, which contains items you own. <notification icon="notify.tga" name="FirstSandbox" + persist="true" type="notify"> This is a sandbox area, and is meant to help Residents learn how to build. @@ -5632,6 +5710,7 @@ Things you build here will be deleted after you leave, so don't forget to r <notification icon="notify.tga" name="FirstFlexible" + persist="true" type="notify"> This object is flexible. Flexis must be phantom and not physical. </notification> @@ -5639,6 +5718,7 @@ This object is flexible. Flexis must be phantom and not physical. <notification icon="notify.tga" name="FirstDebugMenus" + persist="true" type="notify"> You opened the Advanced menu. @@ -5651,6 +5731,7 @@ To toggle this menu, <notification icon="notify.tga" name="FirstSculptedPrim" + persist="true" type="notify"> You are editing a Sculpted prim. Sculpties require a special texture to define their shape. </notification> @@ -5660,6 +5741,7 @@ You are editing a Sculpted prim. Sculpties require a special texture to define t <notification icon="notify.tga" name="FirstMedia" + persist="true" type="notify"> You have begun playing media. Media can set to play automatically in the preferences window under Audio / Video. Note that this can be a security risk for media sites you do not trust. </notification> @@ -5700,6 +5782,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block <notification icon="notify.tga" name="AutoUnmuteByIM" + persist="true" type="notify"> [FIRST] [LAST] was sent an instant message and has been automatically unblocked. </notification> @@ -5707,6 +5790,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block <notification icon="notify.tga" name="AutoUnmuteByMoney" + persist="true" type="notify"> [FIRST] [LAST] was given money and has been automatically unblocked. </notification> @@ -5714,6 +5798,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block <notification icon="notify.tga" name="AutoUnmuteByInventory" + persist="true" type="notify"> [FIRST] [LAST] was offered inventory and has been automatically unblocked. </notification> @@ -6041,6 +6126,19 @@ Drag items from inventory onto a person in the resident picker Avatar '[NAME]' rezzed in [TIME] seconds. </notification> + <notification + icon="alertmodal.tga" + name="ConfirmLeaveCall" + type="alert"> +Are you sure you want to leave this call? + <usetemplate + ignoretext="Confirm before I leave call" + name="okcancelignore" + notext="No" + yestext="Yes"/> + <unique/> + </notification> + <global name="UnsupportedCPU"> - Your CPU speed does not meet the minimum requirements. </global> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index e412c491fd..7b11538ccc 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -1,28 +1,30 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel - mouse_opaque="true" background_visible="true" bg_alpha_color="DkGray" bg_opaque_color="DkGray" + chrome="true" follows="left|bottom|right" height="33" layout="topleft" left="0" name="bottom_tray" top="28" - chrome="true" - border_visible="false" width="1000"> - <string name="SpeakBtnToolTip">Turns microphone on/off</string> - <string name="VoiceControlBtnToolTip">Shows/hides voice control panel</string> + <string + name="SpeakBtnToolTip" + value="Turns microphone on/off" /> + <string + name="VoiceControlBtnToolTip" + value="Shows/hides voice control panel" /> <layout_stack - mouse_opaque="false" border_size="0" clip="false" follows="all" height="28" layout="topleft" left="0" + mouse_opaque="false" name="toolbar_stack" orientation="horizontal" top="0" @@ -33,288 +35,234 @@ height="10" image_name="spacer24.tga" layout="topleft" - min_width="2" left="0" + min_width="2" top="0" width="2" /> <layout_panel - mouse_opaque="false" auto_resize="false" + filename="panel_nearby_chat_bar.xml" follows="left|right" height="28" layout="topleft" left="0" - min_height="23" - width="310" - top="4" max_width="320" + min_height="23" min_width="216" + mouse_opaque="false" name="chat_bar" + top="4" user_resize="false" - filename="panel_nearby_chat_bar.xml" /> + width="310" /> <layout_panel - mouse_opaque="false" auto_resize="false" follows="right" height="28" layout="topleft" min_height="28" - width="105" - top_delta="0" - min_width="54" + min_width="57" + mouse_opaque="false" name="speak_panel" - user_resize="false"> - <talk_button - follows="left|right" - height="23" - speak_button.tab_stop="true" - show_button.tab_stop="true" - layout="topleft" - left="0" - name="talk" - top="5" - width="105"> - <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. - & pad_right is default value for long label which can be right aligned. See EXT-6318 --> - <speak_button - halign="center" - name="speak_btn" - label="Speak" - label_selected="Speak" - pad_right="22" - use_ellipses="true" - /> - <show_button> - <show_button.init_callback - function="Button.SetDockableFloaterToggle" - parameter="voice_controls" /> - </show_button> - </talk_button> + top_delta="0" + user_resize="false" + width="108"> + <talk_button + follows="left|right" + height="23" + layout="topleft" + left="0" + name="talk" + top="5" + width="105"> + <show_button + tab_stop="true"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="voice_controls" /> + </show_button> + <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales. + & pad_right is default value for long label which can be right aligned. See EXT-6318 --> + <speak_button + halign="center" + label="Speak" + label_selected="Speak" + name="speak_btn" + pad_right="22" + tab_stop="true" + use_ellipses="true" /> + </talk_button> </layout_panel> - <icon - auto_resize="false" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" - name="after_speak_panel" - min_width="3" - top="0" - width="3"/> <layout_panel - mouse_opaque="false" auto_resize="false" follows="right" height="28" layout="topleft" min_height="28" - width="82" - top_delta="0" - min_width="62" + min_width="65" + mouse_opaque="false" name="gesture_panel" - user_resize="false"> - <gesture_combo_list - follows="left|right" - height="23" - label="Gesture" - layout="topleft" - name="Gesture" - left="0" - top="5" - width="82" - tool_tip="Shows/hides gestures"> - <gesture_combo_list.combo_button - pad_right="10" - use_ellipses="true" /> - <gesture_combo_list.combo_list - page_lines="17" /> - </gesture_combo_list> + top_delta="0" + user_resize="false" + width="85"> + <gesture_combo_list + follows="left|right" + height="23" + label="Gesture" + layout="topleft" + left="0" + name="Gesture" + tool_tip="Shows/hides gestures" + top="5" + width="82"> + <combo_button + pad_right="10" + use_ellipses="true" /> + <combo_list + page_lines="17" /> + </gesture_combo_list> </layout_panel> - <icon - auto_resize="false" - color="0 0 0 0" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" - min_width="3" - name="after_gesture_panel" - top="0" - width="3"/> <layout_panel - mouse_opaque="false" auto_resize="false" follows="right" height="28" layout="topleft" min_height="28" + min_width="52" + mouse_opaque="false" name="movement_panel" user_resize="false" - width="80" - min_width="49"> + width="83"> <button - image_selected="PushButton_Selected_Press" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" follows="left|right" height="23" - use_ellipses="true" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" is_toggle="true" label="Move" layout="topleft" name="movement_btn" tool_tip="Shows/hides movement controls" top="5" + use_ellipses="true" width="80"> - <button.init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="moveview" /> </button> </layout_panel> - <icon - auto_resize="false" - color="0 0 0 0" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" - min_width="3" - name="after_movement_panel" - top="0" - width="3"/> <layout_panel - mouse_opaque="false" auto_resize="false" follows="left|right" height="28" layout="topleft" min_height="28" - min_width="49" + min_width="52" + mouse_opaque="false" name="cam_panel" user_resize="false" - width="80"> + width="83"> <button - image_selected="PushButton_Selected_Press" - image_pressed="PushButton_Press" - image_pressed_selected="PushButton_Selected_Press" follows="left|right" height="23" - use_ellipses="true" + image_pressed="PushButton_Press" + image_pressed_selected="PushButton_Selected_Press" + image_selected="PushButton_Selected_Press" is_toggle="true" label="View" layout="topleft" left="0" + name="camera_btn" tool_tip="Shows/hides camera controls" top="5" - name="camera_btn" + use_ellipses="true" width="80"> - <button.init_callback + <init_callback function="Button.SetDockableFloaterToggle" parameter="camera" /> </button> </layout_panel> - <icon - auto_resize="false" - color="0 0 0 0" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" - min_width="3" - name="after_cam_panel" - top="0" - width="3"/> <layout_panel - mouse_opaque="false" auto_resize="false" follows="left|right" height="28" layout="topleft" min_width="40" + mouse_opaque="false" name="snapshot_panel" width="40"> <button - follows="left|right" + follows="left|right" height="23" - image_selected="PushButton_Selected_Press" + image_overlay="Snapshot_Off" image_pressed="PushButton_Press" image_pressed_selected="PushButton_Selected_Press" - left="0" - label="" + image_selected="PushButton_Selected_Press" + is_toggle="true" layout="topleft" + left="0" name="snapshots" - width="36" + tool_tip="Take snapshot" top="5" - is_toggle="true" - image_overlay="Snapshot_Off" - tool_tip="Take snapshot"> - <button.init_callback - function="Button.SetFloaterToggle" - parameter="snapshot" /> - </button> - </layout_panel> + width="36"> + <init_callback + function="Button.SetFloaterToggle" + parameter="snapshot" /> + </button> + </layout_panel> <layout_panel - mouse_opaque="false" follows="left|right" height="30" layout="topleft" - top="0" - name="chiclet_list_panel" - width="189" min_width="95" + mouse_opaque="false" + name="chiclet_list_panel" + top="0" user_resize="false" - auto_resize="true"> + width="189"> <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991--> <chiclet_panel - mouse_opaque="false" + chiclet_padding="4" follows="left|right" height="24" layout="topleft" left="1" min_width="95" + mouse_opaque="false" name="chiclet_list" top="7" - chiclet_padding="4" - scrolling_offset="40" width="189"> <button auto_resize="true" follows="right" height="29" + image_hover_selected="SegmentedBtn_Left_Over" + image_hover_unselected="SegmentedBtn_Left_Over" + image_overlay="Arrow_Small_Left" + image_pressed="SegmentedBtn_Left_Press" + image_pressed_selected="SegmentedBtn_Left_Press" image_selected="SegmentedBtn_Left_Off" image_unselected="SegmentedBtn_Left_Off" - image_hover_selected="SegmentedBtn_Left_Over" - image_hover_unselected="SegmentedBtn_Left_Over" - image_pressed="SegmentedBtn_Left_Press" - image_pressed_selected="SegmentedBtn_Left_Press" - image_overlay="Arrow_Small_Left" layout="topleft" name="chicklet_left_scroll_button" - scale_image="true" tab_stop="false" top="-4" - right_pad="2" visible="false" width="7" /> <button auto_resize="true" follows="right" height="29" + image_hover_selected="SegmentedBtn_Right_Over" + image_hover_unselected="SegmentedBtn_Right_Over" + image_overlay="Arrow_Small_Right" + image_pressed="SegmentedBtn_Right_Press" + image_pressed_selected="SegmentedBtn_Right_Press" image_selected="SegmentedBtn_Right_Off" image_unselected="SegmentedBtn_Right_Off" - image_hover_selected="SegmentedBtn_Right_Over" - image_hover_unselected="SegmentedBtn_Right_Over" - image_pressed="SegmentedBtn_Right_Press" - image_pressed_selected="SegmentedBtn_Right_Press" - image_overlay="Arrow_Small_Right" layout="topleft" name="chicklet_right_scroll_button" - scale_image="true" tab_stop="false" top="-4" visible="false" @@ -332,24 +280,24 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. min_width="4" name="DUMMY" top="0" - width="4"/> + width="4" /> <layout_panel auto_resize="false" follows="right" height="28" layout="topleft" min_height="28" - top="0" - name="im_well_panel" - width="37" min_width="37" - user_resize="false"> + name="im_well_panel" + top="0" + user_resize="false" + width="37"> <chiclet_im_well - max_displayed_count="99" follows="right" height="28" layout="topleft" left="0" + max_displayed_count="99" name="im_well" top="0" width="35"> @@ -375,8 +323,8 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well left="0" name="Unread IM messages" tool_tip="Conversations" - width="34" > - <button.init_callback + width="34"> + <init_callback function="Button.SetDockableFloaterToggle" parameter="im_well_window" /> </button> @@ -388,11 +336,11 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well height="28" layout="topleft" min_height="28" - top="0" - name="notification_well_panel" - width="37" min_width="37" - user_resize="false"> + name="notification_well_panel" + top="0" + user_resize="false" + width="37"> <chiclet_notification follows="right" height="23" @@ -402,27 +350,27 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well name="notification_well" top="5" width="35"> - <button + <button + auto_resize="true" bottom_pad="3" + follows="right" + halign="center" + height="23" + image_overlay="Notices_Unread" + image_overlay_alignment="center" image_pressed="WellButton_Lit" image_pressed_selected="WellButton_Lit_Selected" image_selected="PushButton_Press" - auto_resize="true" - halign="center" - height="23" - follows="right" - label_color="Black" - left="0" - name="Unread" - image_overlay="Notices_Unread" - image_overlay_alignment="center" - tool_tip="Notifications" - width="34" > - <button.init_callback - function="Button.SetDockableFloaterToggle" - parameter="notification_well_window" /> - </button> - </chiclet_notification> + label_color="Black" + left="0" + name="Unread" + tool_tip="Notifications" + width="34"> + <init_callback + function="Button.SetDockableFloaterToggle" + parameter="notification_well_window" /> + </button> + </chiclet_notification> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_shape.xml b/indra/newview/skins/default/xui/en/panel_edit_shape.xml index e1c574001a..76842e5279 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shape.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shape.xml @@ -8,54 +8,19 @@ name="edit_shape_panel" top_pad="10" width="333" > - <panel - border="false" - bg_alpha_color="DkGray2" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true" + <text follows="top|left|right" - height="50" - left="10" + font="SansSerifSmallBold" + halign="right" + height="12" layout="topleft" - name="avatar_sex_panel" + left="0" + name="avatar_height" + text_color="EmphasisColor" top="0" - width="313" > - <text - follows="top|left" - height="16" - layout="topleft" - left="10" - name="gender_text" - width="313"> - Gender: - </text> - <radio_group - follows="left|top|right" - left="10" - height="28" - layout="topleft" - name="sex_radio" - top_pad="3" - width="303" > - <radio_item - follows="all" - height="16" - label="Female" - layout="topleft" - left="10" - name="radio" - width="82" /> - <radio_item - follows="all" - height="16" - label="Male" - layout="topleft" - left_pad="10" - name="radio2" - width="82" /> - </radio_group> - </panel> + width="310"> + [HEIGHT] Meters tall + </text> <panel border="false" bg_alpha_color="DkGray2" @@ -63,17 +28,17 @@ background_visible="true" background_opaque="true" follows="all" - height="345" + height="388" label="Shirt" layout="topleft" left="10" name="accordion_panel" - top_pad="10" + top_pad="0" width="313"> <accordion layout="topleft" follows="all" - height ="345" + height ="388" left="0" name="wearable_accordion" top="0" 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 dc2f085356..afcd4550ca 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -165,12 +165,59 @@ left="0" width="313"> <text follows="top|left|right" + font="SansSerifSmallBold" height="16" layout="topleft" left="10" name="description_text" + text_color="white" + top="10" value="Shape:" - width="303" /> + width="150" /> + <radio_group + follows="left|top|right" + left="210" + height="20" + layout="topleft" + name="sex_radio" + top="5" + width="110"> + <radio_item + follows="all" + height="16" + label="" + layout="topleft" + left="0" + name="sex_male" + tool_tip="Male" + width="40" /> + <radio_item + follows="all" + height="16" + label="" + layout="topleft" + left_pad="10" + name="sex_female" + tool_tip="Female" + width="40" /> + </radio_group> + <!-- graphical labels for the radio buttons above --> + <icon + height="16" + image_name="icons/Male.png" + left="230" + name="male_icon" + tool_tip="Male" + top="7" + width="16" /> + <icon + height="16" + image_name="icons/Female.png" + name="female_icon" + left="280" + tool_tip="Female" + top="7" + width="16" /> <text_editor follows="all" height="23" @@ -178,6 +225,7 @@ left="0" layout="topleft" max_length="300" name="description" + top_pad="3" width="290" /> </panel> <panel @@ -186,8 +234,10 @@ left="0" layout="topleft" left="0" name="edit_subpanel_container" - top_pad="10" + top_pad="2" width="333"> + <!-- the shape editing panel is taller than the others + because it also displays avatar height --> <panel filename="panel_edit_shape.xml" follows="all" @@ -201,141 +251,141 @@ left="0" <panel filename="panel_edit_skin.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_skin_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_hair.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_hair_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_eyes.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_eyes_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_shirt.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_shirt_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_pants.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_pants_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_shoes.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_shoes_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_socks.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_socks_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_jacket.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_jacket_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_skirt.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_skirt_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_gloves.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_gloves_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_undershirt.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_undershirt_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_underpants.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_underpants_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_alpha.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_alpha_panel" - top="0" + top="8" visible="false" width="333" /> <panel filename="panel_edit_tattoo.xml" follows="all" - height="400" + height="392" layout="topleft" left="0" name="edit_tattoo_panel" - top="0" + top="8" visible="false" width="333" /> </panel> 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 6a212306d6..7961664516 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -15,6 +15,12 @@ <string name="No Outfit" value="No Outfit"/> + <string + name="unsaved_changes" + value="Unsaved Changes"/> + <string + name="now_editing" + value="Now Editing"/> <panel.string name="not_available"> @@ -209,124 +215,120 @@ tab_group="2" user_resize="true" visible="false"> - - <!-- *NOTE is not used, invisible and disabled --> - <filter_editor - background_image="TextField_Search_Off" - enabled="false" - follows="left|top|right" - font="SansSerif" - label="Filter" + <text + follows="top|left|right" + font="SansSerifBold" + height="13" layout="topleft" left="5" - width="290" + name="add_to_outfit_label" + text_color="LtGray" + top="3" + value="Add to Outfit:" + use_ellipses="true" + width="150" /> + <button + follows="top|left|right" height="20" - name="look_item_filter" - text_color="black" - text_pad_left="25" - visible="false"/> + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + is_toggle="true" + label="O" + layout="topleft" + left_pad="5" + name="filter_button" + top="3" + width="20" /> + <combo_box + follows="top|left|right" + height="20" + layout="topleft" + right="-5" + name="filter_wearables_combobox" + top="2" + width="110"/> <layout_stack animate="true" follows="all" - height="25" - width="300" + height="155" + width="311" layout="topleft" - orientation="horizontal" name="filter_panels" - top="0" + top_pad="5" left="0"> <layout_panel + auto_resize="true" layout="topleft" follows="left|top|right" - height="25" + height="30" label="IM Control Panel" - name="filter_button_panel" - width="150" - auto_resize="true" - user_resize="false"> - <text - follows="top|left|right" - font="SansSerifBold" - height="13" - layout="topleft" - left="5" - name="add_to_outfit_label" - text_color="LtGray" - top="3" - value="Add to Outfit:" - use_ellipses="true" - width="270" /> - <button - follows="top|right" - height="20" - image_hover_unselected="Toolbar_Middle_Over" - image_overlay="" - image_selected="Toolbar_Middle_Selected" - image_unselected="Toolbar_Middle_Off" - is_toggle="true" - label="O" - layout="topleft" - right="-1" - name="filter_button" - top="3" - width="20" /> + name="filter_panel" + width="311" + user_resize="false" + visible="false"> + <filter_editor + background_image="TextField_Search_Off" + enabled="true" + follows="left|top|right" + font="SansSerif" + label="Filter" + layout="topleft" + left="5" + width="290" + height="25" + name="look_item_filter" + text_color="black" + text_pad_left="25" + visible="true"/> </layout_panel> <layout_panel auto_resize="true" - height="25" + height="145" min_width="130" - name="filter_combobox_panel" - width="150" - user_resize="false" - visible="false"> - <combo_box - follows="top|left|right" - height="20" - layout="topleft" - right="-5" - name="filter_wearables_combobox" - top="0" - width="130"/> + name="inventory_panel" + width="311" + user_resize="true"> + <inventory_panel + allow_multi_select="false" + border="false" + follows="left|top|right|bottom" + height="130" + layout="topleft" + left="0" + mouse_opaque="false" + name="inventory_items" + top_pad="5" + width="311" + visible="false"/> + <panel + name="filtered_wearables_panel" + background_opaque="true" + background_visible="true" + layout="topleft" + follows="left|top|right|bottom" + border="false" + height="130" + left="0" + mouse_opaque="false" + width="311" + top_delta="0" + visible="true"> + <wearable_items_list + name="filtered_wearables_list" + allow_select="true" + layout="topleft" + follows="all" + width="311" + height="130" + left="0" + top="0"/> + </panel> </layout_panel> </layout_stack> - <inventory_panel - allow_multi_select="false" - border="false" - follows="left|top|right|bottom" - height="155" - layout="topleft" - left="0" - mouse_opaque="false" - name="inventory_items" - top_pad="5" - width="300"/> - - <panel - name="filtered_wearables_panel" - background_opaque="true" - background_visible="true" - layout="topleft" - follows="left|top|right|bottom" - border="false" - height="155" - left="0" - mouse_opaque="false" - width="300" - top_delta="0" - visible="false"> - <wearable_items_list - name="filtered_wearables_list" - allow_select="true" - layout="topleft" - follows="all" - width="300" - height="155" - left="0" - top="0" /> - </panel> - <panel background_visible="true" bevel_style="none" @@ -357,6 +359,7 @@ image_overlay="" image_selected="Toolbar_Middle_Selected" image_unselected="Toolbar_Middle_Off" + is_toggle="true" label="F" layout="topleft" left_pad="1" @@ -370,6 +373,7 @@ image_overlay="" image_selected="Toolbar_Middle_Selected" image_unselected="Toolbar_Middle_Off" + is_toggle="true" label="L" layout="topleft" left_pad="1" diff --git a/indra/newview/skins/default/xui/it/floater_animation_preview.xml b/indra/newview/skins/default/xui/it/floater_animation_preview.xml index 5472e32544..77341cad63 100644 --- a/indra/newview/skins/default/xui/it/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/it/floater_animation_preview.xml @@ -153,7 +153,7 @@ La lunghezza massima è [MAX_LENGTH] secondi. <item label="Accigliato" name="Frown" value="Accigliato"/> <item label="Bacio" name="Kiss" value="Bacio"/> <item label="Risata" name="Laugh" value="Risata"/> - <item label="Plllppt" name="Plllppt" value="Plllppt"/> + <item label="Plllppt" name="Plllppt" value="Linguaccia"/> <item label="Repulsione" name="Repulsed" value="Repulsione"/> <item label="Triste" name="Sad" value="Triste"/> <item label="Scrollata di spalle" name="Shrug" value="Scrollata di spalle"/> diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml index 1c611915dc..cd16246f0f 100644 --- a/indra/newview/skins/default/xui/it/floater_tools.xml +++ b/indra/newview/skins/default/xui/it/floater_tools.xml @@ -39,11 +39,11 @@ <floater.string name="grid_attachment_text"> Accessorio </floater.string> - <button label="" label_selected="" name="button focus" tool_tip="Focus"/> - <button label="" label_selected="" name="button move" tool_tip="Muoviti"/> + <button label="" label_selected="" name="button focus" tool_tip="Ingrandisci"/> + <button label="" label_selected="" name="button move" tool_tip="Sposta"/> <button label="" label_selected="" name="button edit" tool_tip="Modifica"/> <button label="" label_selected="" name="button create" tool_tip="Crea"/> - <button label="" label_selected="" name="button land" tool_tip="Terra"/> + <button label="" label_selected="" name="button land" tool_tip="Terreno"/> <text name="text status"> Trascina per muovere, trascina+maiuscolo per copiare </text> @@ -397,7 +397,7 @@ </text> <check_box label="Massima luminosità" name="checkbox fullbright"/> <text name="tex gen"> - Applicazione della texture + Applicazione </text> <combo_box name="combobox texgen"> <combo_box.item label="Default" name="Default"/> diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index 49a1a1a746..a5923ac42b 100644 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -64,7 +64,7 @@ <menu_item_call label="Strumento Ingrandisci" name="Focus"/> <menu_item_call label="Strumento Movimento" name="Move"/> <menu_item_call label="Strumento Modifica" name="Edit"/> - <menu_item_call label="Crea strumento" name="Create"/> + <menu_item_call label="Strumento Crea" name="Create"/> <menu_item_call label="Strumento Terreno" name="Land"/> </menu> <menu_item_call label="Collegamento" name="Link"/> @@ -182,7 +182,7 @@ <menu_item_call label="Strumento Ingrandisci" name="Focus"/> <menu_item_call label="Strumento Movimento" name="Move"/> <menu_item_call label="Strumento Modifica" name="Edit"/> - <menu_item_call label="Crea strumento" name="Create"/> + <menu_item_call label="Strumento Crea" name="Create"/> <menu_item_call label="Strumento Terreno" name="Land"/> </menu> <menu_item_call label="Zoom avanti" name="Zoom In"/> diff --git a/indra/newview/skins/default/xui/it/panel_group_general.xml b/indra/newview/skins/default/xui/it/panel_group_general.xml index ffcbdca6f7..49baa73811 100644 --- a/indra/newview/skins/default/xui/it/panel_group_general.xml +++ b/indra/newview/skins/default/xui/it/panel_group_general.xml @@ -46,7 +46,7 @@ Muovi il tuo mouse sopra le opzioni per maggiore aiuto. <check_box label="Chiunque può aderire" name="open_enrollement" tool_tip="Imposta se questo gruppo permette ai nuovi membri di aderire senza essere invitati."/> <check_box label="Quota di adesione" name="check_enrollment_fee" tool_tip="Imposta se richiedere una tassa d'iscrizione per aderire al gruppo"/> <spinner label="L$" left_delta="136" name="spin_enrollment_fee" tool_tip="I nuovi soci devono pagare questa tassa d'iscrizione quando è selezionata." width="60"/> - <combo_box name="group_mature_check" tool_tip="Imposta se le informazioni sul tuo gruppo sono da considerarsi Mature."> + <combo_box name="group_mature_check" tool_tip="Imposta se le informazioni sul tuo gruppo sono da considerarsi di tipo Moderato."> <combo_item name="select_mature"> - Seleziona categoria di accesso - </combo_item> diff --git a/indra/newview/skins/default/xui/it/panel_region_general.xml b/indra/newview/skins/default/xui/it/panel_region_general.xml index a30fadcaa6..6ca5dd878e 100644 --- a/indra/newview/skins/default/xui/it/panel_region_general.xml +++ b/indra/newview/skins/default/xui/it/panel_region_general.xml @@ -30,7 +30,7 @@ <text label="Maturità" name="access_text" width="120"> Categoria di accesso: </text> - <icons_combo_box label="Mature" left="126" name="access_combo" width="74"> + <icons_combo_box label="Moderato" left="126" name="access_combo" width="74"> <icons_combo_box.item label="Adulti" name="Adult" value="42"/> <icons_combo_box.item label="Moderato" name="Mature" value="21"/> <icons_combo_box.item label="Generale" name="PG" value="13"/> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 668e21c253..2a966f4adf 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -349,6 +349,7 @@ class WindowsManifest(ViewerManifest): self.path("qtwebkitd4.dll") self.path("qtxmlpatternsd4.dll") self.path("ssleay32.dll") + self.path("winmm.dll") # For WebKit/Qt plugin runtimes (image format plugins) if self.prefix(src="imageformats", dst="imageformats"): |