diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-05-05 01:05:01 +0300 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-05-05 01:05:01 +0300 | 
| commit | d647b75310dd73d9c3b1859de1a414f51422ae26 (patch) | |
| tree | e4cd9131388bbda61e58f1b9ba7ea4cf801cbdc6 | |
| parent | ad8634856dcc06db79b285b6109a2da6a363b002 (diff) | |
SL-17314 Location and label desync
Example: User can rename item in inventory, then attempt to save new landmark and changes will be lost
| -rw-r--r-- | indra/newview/llfloatercreatelandmark.cpp | 124 | ||||
| -rw-r--r-- | indra/newview/llfloatercreatelandmark.h | 3 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_create_landmark.xml | 1 | 
3 files changed, 125 insertions, 3 deletions
diff --git a/indra/newview/llfloatercreatelandmark.cpp b/indra/newview/llfloatercreatelandmark.cpp index 495bf5d20e..5b50fd7677 100644 --- a/indra/newview/llfloatercreatelandmark.cpp +++ b/indra/newview/llfloatercreatelandmark.cpp @@ -46,19 +46,60 @@  typedef std::pair<LLUUID, std::string> folder_pair_t; -class LLLandmarksInventoryObserver : public LLInventoryAddedObserver +class LLLandmarksInventoryObserver : public LLInventoryObserver  {  public:  	LLLandmarksInventoryObserver(LLFloaterCreateLandmark* create_landmark_floater) :  		mFloater(create_landmark_floater)  	{} +    void changed(U32 mask) override +    { +        if (mFloater->getItem()) +        { +            checkChanged(mask); +        } +        else +        { +            checkCreated(mask); +        } +    } +  protected: -	/*virtual*/ void done() +	void checkCreated(U32 mask)  	{ +        if (gInventory.getAddedIDs().empty()) +        { +            return; +        } + +        if (!(mask & LLInventoryObserver::ADD) || +            !(mask & LLInventoryObserver::CREATE) || +            !(mask & LLInventoryObserver::UPDATE_CREATE)) +        { +            return; +        } +  		mFloater->setItem(gInventory.getAddedIDs());  	} +    void checkChanged(U32 mask) +    { +        if (gInventory.getChangedIDs().empty()) +        { +            return; +        } + +        if ((mask & LLInventoryObserver::LABEL) || +            (mask & LLInventoryObserver::INTERNAL) || +            (mask & LLInventoryObserver::REMOVE) || +            (mask & LLInventoryObserver::STRUCTURE) || +            (mask & LLInventoryObserver::REBUILD)) +        { +            mFloater->updateItem(gInventory.getChangedIDs(), mask); +        } +    } +  private:  	LLFloaterCreateLandmark* mFloater;  }; @@ -85,6 +126,9 @@ BOOL LLFloaterCreateLandmark::postBuild()  	getChild<LLButton>("ok_btn")->setClickedCallback(boost::bind(&LLFloaterCreateLandmark::onSaveClicked, this));  	getChild<LLButton>("cancel_btn")->setClickedCallback(boost::bind(&LLFloaterCreateLandmark::onCancelClicked, this)); +    mLandmarkTitleEditor->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCommitTextChanges(); }); +    mNotesEditor->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCommitTextChanges(); }); +  	mLandmarksID = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);  	return TRUE; @@ -204,6 +248,29 @@ void LLFloaterCreateLandmark::populateFoldersList(const LLUUID &folder_id)  	}  } +void LLFloaterCreateLandmark::onCommitTextChanges() +{ +    std::string current_title_value = mLandmarkTitleEditor->getText(); +    std::string item_title_value = mItem->getName(); +    std::string current_notes_value = mNotesEditor->getText(); +    std::string item_notes_value = mItem->getDescription(); + +    LLStringUtil::trim(current_title_value); +    LLStringUtil::trim(current_notes_value); + +    if (!current_title_value.empty() && +        (item_title_value != current_title_value || item_notes_value != current_notes_value)) +    { +        LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(mItem); +        new_item->rename(current_title_value); +        new_item->setDescription(current_notes_value); +        LLPointer<LLInventoryCallback> cb; +        LLInventoryModel::LLCategoryUpdate up(mItem->getParentUUID(), 0); +        gInventory.accountForUpdate(up); +        update_inventory_item(new_item, cb); +    } +} +  void LLFloaterCreateLandmark::onCreateFolderClicked()  {  	LLNotificationsUtil::add("CreateLandmarkFolder", LLSD(), LLSD(), @@ -278,6 +345,8 @@ void LLFloaterCreateLandmark::onSaveClicked()  		new_item->updateParentOnServer(FALSE);  	} +    removeObserver(); +  	gInventory.updateItem(new_item);  	gInventory.notifyObservers(); @@ -286,6 +355,7 @@ void LLFloaterCreateLandmark::onSaveClicked()  void LLFloaterCreateLandmark::onCancelClicked()  { +    removeObserver();  	if (!mItem.isNull())  	{  		LLUUID item_id = mItem->getUUID(); @@ -314,11 +384,59 @@ void LLFloaterCreateLandmark::setItem(const uuid_set_t& items)  		{  			if(!getItem())  			{ -				removeObserver();  				mItem = item; +                mAssetID = mItem->getAssetUUID();                  setVisibleAndFrontmost(true);  				break;  			}  		}  	}  } + +void LLFloaterCreateLandmark::updateItem(const uuid_set_t& items, U32 mask) +{ +    if (!getItem()) +    { +        return; +    } + +    LLUUID landmark_id = getItem()->getUUID(); + +    for (uuid_set_t::const_iterator item_iter = items.begin(); +        item_iter != items.end(); +        ++item_iter) +    { +        const LLUUID& item_id = (*item_iter); +        if (landmark_id == item_id) +        { +            if (getItem() != gInventory.getItem(item_id)) +            { +                // item is obsolete or removed +                closeFloater(); +            } + +            LLUUID folder_id = mFolderCombo->getValue().asUUID(); +            if (folder_id != mItem->getParentUUID()) +            { +                // user moved landmark in inventory, +                // assume that we are done all other changes should already be commited +                closeFloater(); +            } + +            if ((mask & LLInventoryObserver::INTERNAL) && mAssetID != mItem->getAssetUUID()) +            { +                closeFloater(); +            } + +            if (mask & LLInventoryObserver::LABEL) +            { +                mLandmarkTitleEditor->setText(mItem->getName()); +            } + +            if (mask & LLInventoryObserver::INTERNAL) +            { +                mNotesEditor->setText(mItem->getDescription()); +            } +        } +    } +} diff --git a/indra/newview/llfloatercreatelandmark.h b/indra/newview/llfloatercreatelandmark.h index 74ac5e651c..d84f5ae1fc 100644 --- a/indra/newview/llfloatercreatelandmark.h +++ b/indra/newview/llfloatercreatelandmark.h @@ -49,6 +49,7 @@ public:  	void onOpen(const LLSD& key);  	void setItem(const uuid_set_t& items); +    void updateItem(const uuid_set_t& items, U32 mask);  	LLInventoryItem* getItem() { return mItem; } @@ -56,6 +57,7 @@ private:  	void setLandmarkInfo(const LLUUID &folder_id);  	void removeObserver();  	void populateFoldersList(const LLUUID &folder_id = LLUUID::null); +    void onCommitTextChanges();  	void onCreateFolderClicked();  	void onSaveClicked();  	void onCancelClicked(); @@ -66,6 +68,7 @@ private:  	LLLineEditor*	mLandmarkTitleEditor;  	LLTextEditor*	mNotesEditor;  	LLUUID			mLandmarksID; +    LLUUID			mAssetID;  	LLLandmarksInventoryObserver*	mInventoryObserver;  	LLPointer<LLInventoryItem>		mItem; diff --git a/indra/newview/skins/default/xui/en/floater_create_landmark.xml b/indra/newview/skins/default/xui/en/floater_create_landmark.xml index bba30626b2..632daaec7e 100644 --- a/indra/newview/skins/default/xui/en/floater_create_landmark.xml +++ b/indra/newview/skins/default/xui/en/floater_create_landmark.xml @@ -88,6 +88,7 @@       spellcheck="true"       text_readonly_color="white"       text_type="ascii_with_newline" +     commit_on_focus_lost="true"       top_pad="5"       width="290"       wrap="true" />  | 
