diff options
| -rwxr-xr-x | indra/llui/llfolderview.cpp | 2 | ||||
| -rwxr-xr-x | indra/llui/llfolderviewmodel.h | 2 | ||||
| -rw-r--r-- | indra/newview/llconversationmodel.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llinventorybridge.cpp | 119 | ||||
| -rwxr-xr-x | indra/newview/llinventorybridge.h | 7 | ||||
| -rwxr-xr-x | indra/newview/llinventoryfunctions.cpp | 36 | ||||
| -rwxr-xr-x | indra/newview/llinventoryfunctions.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llinventorymodel.cpp | 4 | ||||
| -rwxr-xr-x | indra/newview/llmarketplacefunctions.cpp | 18 | ||||
| -rwxr-xr-x | indra/newview/llpanelobjectinventory.cpp | 4 | ||||
| -rwxr-xr-x | indra/newview/skins/default/xui/en/notifications.xml | 13 | 
11 files changed, 156 insertions, 53 deletions
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index 0bfe9a803e..537f2ac4d7 100755 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -946,7 +946,7 @@ void LLFolderView::cut()  			if (listener)  			{  				listener->cutToClipboard(); -				listener->removeItem(); +				//listener->removeItem();  			}  		} diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index 8d98363c5f..0b968ecee9 100755 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -169,7 +169,7 @@ public:  	virtual BOOL isItemCopyable() const = 0;  	virtual BOOL copyToClipboard() const = 0; -	virtual BOOL cutToClipboard() const = 0; +	virtual BOOL cutToClipboard() = 0;  	virtual BOOL isClipboardPasteable() const = 0;  	virtual void pasteFromClipboard() = 0; diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index dc74506c53..d3d9fbd109 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -86,7 +86,7 @@ public:  	virtual void move( LLFolderViewModelItem* parent_listener ) { }  	virtual BOOL isItemCopyable() const { return FALSE; }  	virtual BOOL copyToClipboard() const { return FALSE; } -	virtual BOOL cutToClipboard() const { return FALSE; } +	virtual BOOL cutToClipboard() { return FALSE; }  	virtual BOOL isClipboardPasteable() const { return FALSE; }  	virtual void pasteFromClipboard() { }  	virtual void pasteLinkFromClipboard() { } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 47b47bf705..b471b0ca15 100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -263,13 +263,50 @@ BOOL LLInvFVBridge::isLibraryItem() const  /**   * @brief Adds this item into clipboard storage   */ -BOOL LLInvFVBridge::cutToClipboard() const +BOOL LLInvFVBridge::cutToClipboard() +{ +	const LLInventoryObject* obj = gInventory.getObject(mUUID); +	if (obj && isItemMovable() && isItemRemovable()) +	{ +        const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false); +        const BOOL cut_from_marketplacelistings = gInventory.isObjectDescendentOf(mUUID, marketplacelistings_id); +             +        if (cut_from_marketplacelistings && LLMarketplaceData::instance().isInActiveFolder(mUUID)) +        { +            // Prompt the user if cutting from marketplace active listing +            LLNotificationsUtil::add("ConfirmMerchantActiveChange", LLSD(), LLSD(), boost::bind(&LLInvFVBridge::callback_cutToClipboard, this, _1, _2)); +        } +        else +        { +            // Otherwise just do the cut +            return perform_cutToClipboard(); +        } +    } +	return FALSE; +} + +// Callback for cutToClipboard if DAMA required... +BOOL LLInvFVBridge::callback_cutToClipboard(const LLSD& notification, const LLSD& response) +{ +    S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +    if (option == 0) // YES +    { +        return perform_cutToClipboard(); +    } +    return FALSE; +} + +BOOL LLInvFVBridge::perform_cutToClipboard()  {  	const LLInventoryObject* obj = gInventory.getObject(mUUID);  	if (obj && isItemMovable() && isItemRemovable())  	{  		LLClipboard::instance().setCutMode(true); -		return LLClipboard::instance().addToClipboard(mUUID); +		if (LLClipboard::instance().addToClipboard(mUUID)) +        { +            removeObject(&gInventory, mUUID); +            return TRUE; +        }  	}  	return FALSE;  } @@ -1480,7 +1517,7 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)  	else if ("cut" == action)  	{  		cutToClipboard(); -        removeObject(model, mUUID); +        //removeObject(model, mUUID);  		return;  	}  	else if ("copy" == action) @@ -2455,7 +2492,16 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,                  if ((move_is_from_marketplacelistings && LLMarketplaceData::instance().isInActiveFolder(cat_id)) ||                      (move_is_into_marketplacelistings && LLMarketplaceData::instance().isInActiveFolder(mUUID)))                  { -                    LLNotificationsUtil::add("ConfirmMerchantActiveChange", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_dropCategoryIntoFolder, this, _1, _2, inv_cat)); +                    if (move_is_from_marketplacelistings && (LLMarketplaceData::instance().isListed(cat_id) || LLMarketplaceData::instance().isVersionFolder(cat_id))) +                    { +                        // Move the active version folder or listing folder itself outside marketplace listings will unlist the listing so ask that question specifically +                        LLNotificationsUtil::add("ConfirmMerchantUnlist", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_dropCategoryIntoFolder, this, _1, _2, inv_cat)); +                    } +                    else +                    { +                        // Any other case will simply modify but not unlist a listing +                        LLNotificationsUtil::add("ConfirmMerchantActiveChange", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_dropCategoryIntoFolder, this, _1, _2, inv_cat)); +                    }                      return true;                  }              } @@ -2891,7 +2937,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)  	else if ("cut" == action)  	{  		cutToClipboard(); -        removeObject(model, mUUID); +        //removeObject(model, mUUID);  		return;  	}  	else if ("copy" == action) @@ -3192,20 +3238,53 @@ void LLFolderBridge::updateHierarchyCreationDate(time_t date)  void LLFolderBridge::pasteFromClipboard()  {  	LLInventoryModel* model = getInventoryModel(); -	if(model && isClipboardPasteable()) +	if (model && isClipboardPasteable())  	{ -		const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); -		const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);          const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false); +        const BOOL paste_into_marketplacelistings = model->isObjectDescendentOf(mUUID, marketplacelistings_id); +         +        if (paste_into_marketplacelistings && !LLMarketplaceData::instance().isListed(mUUID) && LLMarketplaceData::instance().isInActiveFolder(mUUID)) +        { +            // Prompt the user if pasting in marketplace active version listing (note that pasting right in the listing folder doesn't need a prompt) +            LLNotificationsUtil::add("ConfirmMerchantActiveChange", LLSD(), LLSD(), boost::bind(&LLFolderBridge::callback_pasteFromClipboard, this, _1, _2)); +        } +        else +        { +            // Otherwise just do the paste +            perform_pasteFromClipboard(); +        } +	} +} +// Callback for pasteFromClipboard if DAMA required... +void LLFolderBridge::callback_pasteFromClipboard(const LLSD& notification, const LLSD& response) +{ +    S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +    if (option == 0) // YES +    { +        perform_pasteFromClipboard(); +    } +} + +void LLFolderBridge::perform_pasteFromClipboard() +{ +	LLInventoryModel* model = getInventoryModel(); +	if (model && isClipboardPasteable()) +	{ +         +		 +        const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); +		const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); +        const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false); +          		const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);  		const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);  		const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);          const BOOL move_is_into_marketplacelistings = model->isObjectDescendentOf(mUUID, marketplacelistings_id); - -		std::vector<LLUUID> objects; +         +        std::vector<LLUUID> objects;  		LLClipboard::instance().pasteFromClipboard(objects); - +          		if (move_is_into_outbox || move_is_into_marketplacelistings)  		{              std::string error_msg; @@ -3234,15 +3313,15 @@ void LLFolderBridge::pasteFromClipboard()                  return;              }  		} - +          		const LLUUID parent_id(mUUID); - +          		for (std::vector<LLUUID>::const_iterator iter = objects.begin();  			 iter != objects.end();  			 ++iter)  		{  			const LLUUID& item_id = (*iter); - +              			LLInventoryItem *item = model->getItem(item_id);  			LLInventoryObject *obj = model->getObject(item_id);  			if (obj) @@ -3338,12 +3417,12 @@ void LLFolderBridge::pasteFromClipboard()                              else                              {                                  copy_inventory_item( -                                    gAgent.getID(), -                                    item->getPermissions().getOwner(), -                                    item->getUUID(), -                                    parent_id, -                                    std::string(), -                                    LLPointer<LLInventoryCallback>(NULL)); +                                                    gAgent.getID(), +                                                    item->getPermissions().getOwner(), +                                                    item->getUUID(), +                                                    parent_id, +                                                    std::string(), +                                                    LLPointer<LLInventoryCallback>(NULL));                              }                          }                      } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 418679d17c..410decaf5b 100755 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -114,7 +114,7 @@ public:  	virtual void move(LLFolderViewModelItem* new_parent_bridge) {}  	virtual BOOL isItemCopyable() const { return FALSE; }  	virtual BOOL copyToClipboard() const; -	virtual BOOL cutToClipboard() const; +	virtual BOOL cutToClipboard();  	virtual BOOL isClipboardPasteable() const;  	virtual BOOL isClipboardPasteableAsLink() const;  	virtual void pasteFromClipboard() {} @@ -176,6 +176,9 @@ protected:  									 const LLUUID& new_parent,  									 BOOL restamp);  	void removeBatchNoCheck(std::vector<LLFolderViewModelItem*>& batch); +     +    BOOL callback_cutToClipboard(const LLSD& notification, const LLSD& response); +    BOOL perform_cutToClipboard();  protected:  	LLHandle<LLInventoryPanel> mInventoryPanel;  	LLFolderView* mRoot; @@ -356,6 +359,8 @@ public:  	static void staticFolderOptionsMenu();  private: +    void callback_pasteFromClipboard(const LLSD& notification, const LLSD& response); +    void perform_pasteFromClipboard();  	bool							mCallingCards;  	bool							mWearables; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 5dc2385f04..f832237b8d 100755 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -141,7 +141,7 @@ void update_marketplace_folder_hierarchy(const LLUUID cat_id)      return;  } -void update_marketplace_category(const LLUUID& cur_uuid) +void update_marketplace_category(const LLUUID& cur_uuid, bool skip_consistency_enforcement)  {      // When changing the marketplace status of an item, we usually have to change the status of all      // folders in the same listing. This is because the display of each folder is affected by the @@ -160,12 +160,11 @@ void update_marketplace_category(const LLUUID& cur_uuid)          LLUUID listing_uuid = nested_parent_id(cur_uuid, depth);          // Verify marketplace data consistency for this listing -        if (LLMarketplaceData::instance().isListed(listing_uuid)) +        if (!skip_consistency_enforcement && LLMarketplaceData::instance().isListed(listing_uuid))          {              LLUUID version_folder_uuid = LLMarketplaceData::instance().getVersionFolder(listing_uuid);              if (version_folder_uuid.notNull() && !gInventory.isObjectDescendentOf(version_folder_uuid, listing_uuid))              { -                // *TODO : Confirm with Producer that this is what we want to happen in that case!                  LL_INFOS("SLM") << "Unlist as the version folder is not under the listing folder anymore!!" << LL_ENDL;                  LLMarketplaceData::instance().setVersionFolder(listing_uuid, LLUUID::null);                  LLMarketplaceData::instance().activateListing(listing_uuid, false); @@ -177,9 +176,8 @@ void update_marketplace_category(const LLUUID& cur_uuid)      }      else if (depth < 0)      { -        if (LLMarketplaceData::instance().isListed(cur_uuid)) +        if (!skip_consistency_enforcement && LLMarketplaceData::instance().isListed(cur_uuid))          { -            // *TODO : Confirm with Producer that this is what we want to happen in that case!              LL_INFOS("SLM") << "Disassociate as the listing folder is not under the marketplace folder anymore!!" << LL_ENDL;              LLMarketplaceData::instance().clearListing(cur_uuid);          } @@ -1928,21 +1926,16 @@ void LLInventoryAction::callback_doToSelected(const LLSD& notification, const LL  void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root, const std::string& action, BOOL user_confirm)  { -	if ("rename" == action) -	{ -		root->startRenamingSelectedItem(); -		return; -	} -      	std::set<LLFolderViewItem*> selected_items = root->getSelectionList();      // Prompt the user for some marketplace active listing edits -	if (user_confirm && (("paste" == action) || ("cut" == action) || ("delete" == action))) +	if (user_confirm && (("cut" == action) || ("delete" == action) || ("rename" == action) || ("properties" == action) || ("task_properties" == action)))      {          std::set<LLFolderViewItem*>::iterator set_iter = selected_items.begin(); +        LLFolderViewModelItemInventory * viewModel = NULL;          for (; set_iter != selected_items.end(); ++set_iter)          { -            LLFolderViewModelItemInventory * viewModel = dynamic_cast<LLFolderViewModelItemInventory *>((*set_iter)->getViewModelItem()); +            viewModel = dynamic_cast<LLFolderViewModelItemInventory *>((*set_iter)->getViewModelItem());              if (viewModel && LLMarketplaceData::instance().isInActiveFolder(viewModel->getUUID()))              {                  break; @@ -1950,11 +1943,26 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root          }          if (set_iter != selected_items.end())          { -            LLNotificationsUtil::add("ConfirmMerchantActiveChange", LLSD(), LLSD(), boost::bind(&LLInventoryAction::callback_doToSelected, _1, _2, model, root, action)); +            if ((("cut" == action) || ("delete" == action)) && (LLMarketplaceData::instance().isListed(viewModel->getUUID()) || LLMarketplaceData::instance().isVersionFolder(viewModel->getUUID()))) +            { +                // Cut or delete of the active version folder or listing folder itself will unlist the listing so ask that question specifically +                LLNotificationsUtil::add("ConfirmMerchantUnlist", LLSD(), LLSD(), boost::bind(&LLInventoryAction::callback_doToSelected, _1, _2, model, root, action)); +            } +            else +            { +                // Any other case will simply modify but not unlist a listing +                LLNotificationsUtil::add("ConfirmMerchantActiveChange", LLSD(), LLSD(), boost::bind(&LLInventoryAction::callback_doToSelected, _1, _2, model, root, action)); +            }              return;          }      } +	if ("rename" == action) +	{ +		root->startRenamingSelectedItem(); +		return; +	} +      	if ("delete" == action)  	{  		LLSD args; diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 5018e5a53e..d52618d795 100755 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -59,7 +59,7 @@ void show_item_original(const LLUUID& item_uuid);  void reset_inventory_filter();  // Nudge the listing categories in the inventory to signal that their marketplace status changed -void update_marketplace_category(const LLUUID& cat_id); +void update_marketplace_category(const LLUUID& cat_id, bool skip_consistency_enforcement = false);  // Nudge all listing categories to signal that their marketplace status changed  void update_all_marketplace_count(); diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 8f8ea8e602..110f514017 100755 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1537,11 +1537,11 @@ void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent)  		}  	} -	mModifyMask |= mask;  +	mModifyMask |= mask;  	if (referent.notNull() && (mChangedItemIDs.find(referent) == mChangedItemIDs.end()))  	{  		mChangedItemIDs.insert(referent); -        update_marketplace_category(referent); +        update_marketplace_category(referent, true);  		if (mask & LLInventoryObserver::ADD)  		{ diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp index f6a0a28735..d3d529cedb 100755 --- a/indra/newview/llmarketplacefunctions.cpp +++ b/indra/newview/llmarketplacefunctions.cpp @@ -1318,7 +1318,7 @@ bool LLMarketplaceData::addListing(const LLUUID& folder_id, S32 listing_id, cons      }  	mMarketplaceItems[folder_id] = LLMarketplaceTuple(folder_id, listing_id, version_id, is_listed); -    update_marketplace_category(folder_id); +    update_marketplace_category(folder_id, true);      gInventory.notifyObservers();      return true;  } @@ -1334,7 +1334,7 @@ bool LLMarketplaceData::deleteListing(const LLUUID& folder_id, bool update_slm)      if (update_slm)      { -        update_marketplace_category(folder_id); +        update_marketplace_category(folder_id, true);          gInventory.notifyObservers();      }      return true; @@ -1422,11 +1422,9 @@ bool LLMarketplaceData::isInActiveFolder(const LLUUID& obj_id)  {      S32 depth = depth_nesting_in_marketplace(obj_id);      LLUUID listing_uuid = nested_parent_id(obj_id, depth); -    // *TODO: use true activation status once SLM is in decent shape again -    //bool active = getActivationState(listing_uuid); Hack waiting for SLM to allow activation again... -    bool active = true; +    bool active = getActivationState(listing_uuid);      LLUUID version_uuid = getVersionFolder(listing_uuid); -    return (active && gInventory.isObjectDescendentOf(obj_id, version_uuid)); +    return (active && ((obj_id == listing_uuid) || (obj_id == version_uuid) || gInventory.isObjectDescendentOf(obj_id, version_uuid)));  }  // Private Modifiers @@ -1440,7 +1438,7 @@ bool LLMarketplaceData::setListingID(const LLUUID& folder_id, S32 listing_id)      (it->second).mListingId = listing_id; -    update_marketplace_category(folder_id); +    update_marketplace_category(folder_id, true);      gInventory.notifyObservers();      return true;  } @@ -1461,8 +1459,8 @@ bool LLMarketplaceData::setVersionFolderID(const LLUUID& folder_id, const LLUUID      (it->second).mVersionFolderId = version_id; -    update_marketplace_category(old_version_id); -    update_marketplace_category(version_id); +    update_marketplace_category(old_version_id, true); +    update_marketplace_category(version_id, true);      gInventory.notifyObservers();      return true;  } @@ -1477,7 +1475,7 @@ bool LLMarketplaceData::setActivationState(const LLUUID& folder_id, bool activat      (it->second).mIsActive = activate; -    update_marketplace_category((it->second).mListingFolderId); +    update_marketplace_category((it->second).mListingFolderId, true);      gInventory.notifyObservers();      return true;  } diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 665b9ab294..aabd9b89f0 100755 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -130,7 +130,7 @@ public:  	virtual void move(LLFolderViewModelItem* parent_listener);	  	virtual BOOL isItemCopyable() const;  	virtual BOOL copyToClipboard() const; -	virtual BOOL cutToClipboard() const; +	virtual BOOL cutToClipboard();  	virtual BOOL isClipboardPasteable() const;  	virtual void pasteFromClipboard();  	virtual void pasteLinkFromClipboard(); @@ -542,7 +542,7 @@ BOOL LLTaskInvFVBridge::copyToClipboard() const  	return FALSE;  } -BOOL LLTaskInvFVBridge::cutToClipboard() const +BOOL LLTaskInvFVBridge::cutToClipboard()  {  	return FALSE;  } diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 4ed0bb6902..b2533b16ec 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -320,6 +320,19 @@ Initialization with the Marketplace failed because of a system or network error.      </notification>      <notification +        icon="alertmodal.tga" +        name="ConfirmMerchantUnlist" +        type="alertmodal"> +        This action will unlist this listing. Do you want to continue? +        <tag>confirm</tag> +        <usetemplate +        ignoretext="Confirm before I unlist an active listing on the marketplace" +        name="okcancelignore" +        notext="Cancel" +        yestext="OK"/> +    </notification> +     +    <notification     icon="alertmodal.tga"     name="CompileQueueSaveText"     type="alertmodal">  | 
