SL-14797 Normalize right-click - favorites panel, part #4

master
Andrey Kleshchev 2021-02-17 01:20:24 +02:00
parent 59092d052f
commit 53343bc708
7 changed files with 130 additions and 18 deletions

View File

@ -38,6 +38,7 @@
#include "lltooltip.h"
#include "llagent.h"
#include "llagentpicksinfo.h"
#include "llavatarnamecache.h"
#include "llclipboard.h"
#include "llinventorybridge.h"
@ -1194,6 +1195,10 @@ bool LLFavoritesBarCtrl::enableSelected(const LLSD& userdata)
{
return isClipboardPasteable();
}
else if (param == "create_pick")
{
return !LLAgentPicksInfo::getInstance()->isPickLimitReached();
}
return false;
}
@ -1242,6 +1247,13 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)
LLFloaterReg::showInstance("world_map", "center");
}
}
else if (action == "create_pick")
{
LLSD args;
args["type"] = "create_pick";
args["item_id"] = item->getUUID();
LLFloaterSidePanelContainer::showPanel("places", args);
}
else if (action == "cut")
{
}
@ -1257,6 +1269,16 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)
{
gInventory.removeItem(mSelectedItemID);
}
else if (action == "rename")
{
LLSD args;
args["NAME"] = item->getName();
LLSD payload;
payload["id"] = mSelectedItemID;
LLNotificationsUtil::add("RenameLandmark", args, payload, boost::bind(onRenameCommit, _1, _2));
}
// Pop-up the overflow menu again (it gets hidden whenever the user clicks a context menu item).
// See EXT-4217 and STORM-207.
@ -1269,6 +1291,28 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata)
}
}
bool LLFavoritesBarCtrl::onRenameCommit(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (0 == option)
{
LLUUID id = notification["payload"]["id"].asUUID();
LLInventoryItem *item = gInventory.getItem(id);
std::string landmark_name = response["new_name"].asString();
LLStringUtil::trim(landmark_name);
if (!landmark_name.empty() && item && item->getName() != landmark_name)
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->rename(landmark_name);
new_item->updateServer(FALSE);
gInventory.updateItem(new_item);
}
}
return false;
}
BOOL LLFavoritesBarCtrl::isClipboardPasteable() const
{
if (!LLClipboard::instance().hasContents())

View File

@ -91,6 +91,7 @@ protected:
bool enableSelected(const LLSD& userdata);
void doToSelected(const LLSD& userdata);
static bool onRenameCommit(const LLSD& notification, const LLSD& response);
BOOL isClipboardPasteable() const;
void pasteFromClipboard() const;

View File

@ -512,14 +512,20 @@ void LLLandmarksPanel::processParcelInfo(const LLParcelData& parcel_data)
{
//this function will be called after user will try to create a pick for selected landmark.
// We have to make request to sever to get parcel_id and snaption_id.
if(isLandmarkSelected())
if(mCreatePickItemId.notNull())
{
LLFolderViewModelItemInventory* cur_item = getCurSelectedViewModelItem();
if (!cur_item) return;
LLUUID id = cur_item->getUUID();
LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id);
doActionOnCurSelectedLandmark(boost::bind(
&LLLandmarksPanel::doProcessParcelInfo, this, _1, getCurSelectedItem(), inv_item, parcel_data));
LLInventoryItem* inv_item = gInventory.getItem(mCreatePickItemId);
if (inv_item && inv_item->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
// we are processing response for doCreatePick, landmark should be already loaded
LLLandmark* landmark = LLLandmarkActions::getLandmark(inv_item->getUUID());
if (landmark)
{
doProcessParcelInfo(landmark, inv_item, parcel_data);
}
}
mCreatePickItemId.setNull();
}
}
@ -1124,7 +1130,11 @@ void LLLandmarksPanel::onCustomAction(const LLSD& userdata)
}
else if ("create_pick" == command_name)
{
doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doCreatePick, this, _1));
LLFolderViewModelItemInventory* cur_item = getCurSelectedViewModelItem();
if (cur_item)
{
doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doCreatePick, this, _1, cur_item->getUUID()));
}
}
else if ("share" == command_name && mCurrentSelectedList)
{
@ -1344,7 +1354,6 @@ void LLLandmarksPanel::doShowOnMap(LLLandmark* landmark)
}
void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark,
LLFolderViewItem* cur_item,
LLInventoryItem* inv_item,
const LLParcelData& parcel_data)
{
@ -1373,7 +1382,7 @@ void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark,
LLPickData data;
data.pos_global = landmark_global_pos;
data.name = cur_item->getName();
data.name = inv_item->getName();
data.desc = inv_item->getDescription();
data.snapshot_id = parcel_data.snapshot_id;
data.parcel_id = parcel_data.parcel_id;
@ -1393,11 +1402,13 @@ void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark,
panel_pick, panel_places,params));
}
void LLLandmarksPanel::doCreatePick(LLLandmark* landmark)
void LLLandmarksPanel::doCreatePick(LLLandmark* landmark, const LLUUID &item_id)
{
LLViewerRegion* region = gAgent.getRegion();
if (!region) return;
mCreatePickItemId = item_id;
LLGlobalVec pos_global;
LLUUID region_id;
landmark->getGlobalPos(pos_global);

View File

@ -82,6 +82,8 @@ public:
void updateMenuVisibility(LLUICtrl* menu);
void doCreatePick(LLLandmark* landmark, const LLUUID &item_id );
protected:
/**
* @return true - if current selected panel is not null and selected item is a landmark
@ -160,10 +162,8 @@ private:
*/
void doShowOnMap(LLLandmark* landmark);
void doProcessParcelInfo(LLLandmark* landmark,
LLFolderViewItem* cur_item,
LLInventoryItem* inv_item,
const LLParcelData& parcel_data);
void doCreatePick(LLLandmark* landmark);
private:
LLPlacesInventoryPanel* mFavoritesInventoryPanel;
@ -183,6 +183,8 @@ private:
accordion_tabs_t mAccordionTabs;
LLAccordionCtrlTab* mMyLandmarksAccordionTab;
LLUUID mCreatePickItemId; // item we requested a pick for
};
#endif //LL_LLPANELLANDMARKS_H

View File

@ -79,6 +79,7 @@
static const F32 PLACE_INFO_UPDATE_INTERVAL = 3.0;
static const std::string AGENT_INFO_TYPE = "agent";
static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark";
static const std::string CREATE_PICK_TYPE = "create_pick";
static const std::string LANDMARK_INFO_TYPE = "landmark";
static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place";
static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history";
@ -388,6 +389,21 @@ void LLPanelPlaces::onOpen(const LLSD& key)
// Update the buttons at the bottom of the panel
updateVerbs();
}
else if (key_type == CREATE_PICK_TYPE)
{
LLUUID item_id = key["item_id"];
LLLandmarksPanel* landmarks_panel =
dynamic_cast<LLLandmarksPanel*>(mTabContainer->getPanelByName("Landmarks"));
if (landmarks_panel && item_id.notNull())
{
LLLandmark* landmark = LLLandmarkActions::getLandmark(item_id, boost::bind(&LLLandmarksPanel::doCreatePick, landmarks_panel, _1, item_id));
if (landmark)
{
landmarks_panel->doCreatePick(landmark, item_id);
}
}
}
else // "create_landmark"
{
mFilterEditor->clear();

View File

@ -36,6 +36,17 @@
function="Favorites.DoToSelected"
parameter="copy_slurl" />
</menu_item_call>
<menu_item_call
label="Create Pick"
layout="topleft"
name="create_pick">
<menu_item_call.on_click
function="Favorites.DoToSelected"
parameter="create_pick" />
<menu_item_call.on_enable
function="Favorites.EnableSelected"
parameter="create_pick" />
</menu_item_call>
<menu_item_separator
layout="topleft" />
@ -59,10 +70,14 @@
function="Favorites.EnableSelected"
parameter="can_paste" />
</menu_item_call>
<menu_item_separator
layout="topleft" />
<menu_item_call
label="Rename"
layout="topleft"
name="rename">
<menu_item_call.on_click
function="Favorites.DoToSelected"
parameter="rename" />
</menu_item_call>
<menu_item_call
label="Delete"
layout="topleft"

View File

@ -3141,7 +3141,30 @@ See https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
text="Cancel"/>
</form>
</notification>
<notification
icon="alertmodal.tga"
label="Rename Landmark"
name="RenameLandmark"
type="alertmodal">
Choose a new name for [NAME]
<tag>confirm</tag>
<form name="form">
<input name="new_name" type="text" width="300">
[NAME]
</input>
<button
default="true"
index="0"
name="OK"
text="OK"/>
<button
index="1"
name="Cancel"
text="Cancel"/>
</form>
</notification>
<notification
icon="alertmodal.tga"
name="RemoveFromFriends"