DEV-41358 DEV-41361: Added support for secondlife:///app/worldmap
SLurls to the LLUrlRegistry. These are now displayed with the more human-readable label of "Show Map for XXXX" and sport a context menu with various operations. I also added "Show on Map" options to the context menus for other location-based SLurls. I also internationalized the text for "Teleport to" and the new "Show Map for" strings.meow-7.2.2
parent
97f9ad9f4c
commit
00e56b0907
|
|
@ -1419,6 +1419,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
|
|||
registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url));
|
||||
registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url));
|
||||
registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));
|
||||
registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));
|
||||
registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url));
|
||||
registrar.add("Url.CopyUrl", boost::bind(&LLUrlAction::copyURLToClipboard, url));
|
||||
|
||||
|
|
|
|||
|
|
@ -121,6 +121,18 @@ void LLUrlAction::teleportToLocation(std::string url)
|
|||
}
|
||||
}
|
||||
|
||||
void LLUrlAction::showLocationOnMap(std::string url)
|
||||
{
|
||||
LLUrlMatch match;
|
||||
if (LLUrlRegistry::instance().findUrl(url, match))
|
||||
{
|
||||
if (! match.getLocation().empty())
|
||||
{
|
||||
executeSLURL("secondlife:///app/worldmap/" + match.getLocation());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLUrlAction::copyURLToClipboard(std::string url)
|
||||
{
|
||||
LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(url));
|
||||
|
|
|
|||
|
|
@ -67,6 +67,9 @@ public:
|
|||
/// if the Url specifies an SL location, teleport there
|
||||
static void teleportToLocation(std::string url);
|
||||
|
||||
/// if the Url specifies an SL location, show it on a map
|
||||
static void showLocationOnMap(std::string url);
|
||||
|
||||
/// perform the appropriate action for left-clicking on a Url
|
||||
static void clickAction(std::string url);
|
||||
|
||||
|
|
|
|||
|
|
@ -468,6 +468,7 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
|
|||
LLURI uri(url);
|
||||
LLSD path_array = uri.pathArray();
|
||||
S32 path_parts = path_array.size();
|
||||
const std::string label = LLTrans::getString("SLurlLabelTeleport");
|
||||
if (path_parts == 6)
|
||||
{
|
||||
// handle teleport url with (X,Y,Z) coordinates
|
||||
|
|
@ -475,7 +476,7 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
|
|||
std::string x = path_array[path_parts-3];
|
||||
std::string y = path_array[path_parts-2];
|
||||
std::string z = path_array[path_parts-1];
|
||||
return "Teleport to " + location + " (" + x + "," + y + "," + z + ")";
|
||||
return label + " " + location + " (" + x + "," + y + "," + z + ")";
|
||||
}
|
||||
else if (path_parts == 5)
|
||||
{
|
||||
|
|
@ -483,20 +484,20 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
|
|||
std::string location = unescapeUrl(path_array[path_parts-3]);
|
||||
std::string x = path_array[path_parts-2];
|
||||
std::string y = path_array[path_parts-1];
|
||||
return "Teleport to " + location + " (" + x + "," + y + ")";
|
||||
return label + " " + location + " (" + x + "," + y + ")";
|
||||
}
|
||||
else if (path_parts == 4)
|
||||
{
|
||||
// handle teleport url with (X) coordinate only
|
||||
std::string location = unescapeUrl(path_array[path_parts-2]);
|
||||
std::string x = path_array[path_parts-1];
|
||||
return "Teleport to " + location + " (" + x + ")";
|
||||
return label + " " + location + " (" + x + ")";
|
||||
}
|
||||
else if (path_parts == 3)
|
||||
{
|
||||
// handle teleport url with no coordinates
|
||||
std::string location = unescapeUrl(path_array[path_parts-1]);
|
||||
return "Teleport to " + location;
|
||||
return label + " " + location;
|
||||
}
|
||||
|
||||
return url;
|
||||
|
|
@ -599,3 +600,52 @@ std::string LLUrlEntrySLLabel::getUrl(const std::string &string)
|
|||
return getUrlFromWikiLink(string);
|
||||
}
|
||||
|
||||
//
|
||||
// LLUrlEntryWorldMap Describes secondlife:///<location> URLs
|
||||
//
|
||||
LLUrlEntryWorldMap::LLUrlEntryWorldMap()
|
||||
{
|
||||
mPattern = boost::regex("secondlife:///app/worldmap/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*",
|
||||
boost::regex::perl|boost::regex::icase);
|
||||
mMenuName = "menu_url_map.xml";
|
||||
mTooltip = LLTrans::getString("TooltipMapUrl");
|
||||
}
|
||||
|
||||
std::string LLUrlEntryWorldMap::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
|
||||
{
|
||||
//
|
||||
// we handle SLURLs in the following formats:
|
||||
// - secondlife:///app/worldmap/PLACE/X/Y/Z
|
||||
// - secondlife:///app/worldmap/PLACE/X/Y
|
||||
// - secondlife:///app/worldmap/PLACE/X
|
||||
//
|
||||
LLURI uri(url);
|
||||
LLSD path_array = uri.pathArray();
|
||||
S32 path_parts = path_array.size();
|
||||
if (path_parts < 3)
|
||||
{
|
||||
return url;
|
||||
}
|
||||
|
||||
const std::string label = LLTrans::getString("SLurlLabelShowOnMap");
|
||||
std::string location = path_array[2];
|
||||
std::string x = (path_parts > 3) ? path_array[3] : "128";
|
||||
std::string y = (path_parts > 4) ? path_array[4] : "128";
|
||||
std::string z = (path_parts > 5) ? path_array[5] : "0";
|
||||
return label + " " + location + " (" + x + "," + y + "," + z + ")";
|
||||
}
|
||||
|
||||
std::string LLUrlEntryWorldMap::getLocation(const std::string &url) const
|
||||
{
|
||||
// return the part of the Url after secondlife:///app/worldmap/ part
|
||||
const std::string search_string = "//app/worldmap/";
|
||||
size_t pos = url.find(search_string);
|
||||
if (pos == std::string::npos)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
pos += search_string.size();
|
||||
return url.substr(pos, url.size() - pos);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -243,4 +243,16 @@ public:
|
|||
/*virtual*/ std::string getUrl(const std::string &string);
|
||||
};
|
||||
|
||||
///
|
||||
/// LLUrlEntryWorldMap Describes a Second Life worldmap Url, e.g.,
|
||||
/// secondlife:///app/worldmap/Ahern/50/50/50
|
||||
///
|
||||
class LLUrlEntryWorldMap : public LLUrlEntryBase
|
||||
{
|
||||
public:
|
||||
LLUrlEntryWorldMap();
|
||||
/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
|
||||
/*virtual*/ std::string getLocation(const std::string &url) const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ LLUrlRegistry::LLUrlRegistry()
|
|||
registerUrl(new LLUrlEntryGroup());
|
||||
registerUrl(new LLUrlEntryParcel());
|
||||
registerUrl(new LLUrlEntryTeleport());
|
||||
registerUrl(new LLUrlEntryWorldMap());
|
||||
registerUrl(new LLUrlEntryObjectIM());
|
||||
registerUrl(new LLUrlEntryPlace());
|
||||
registerUrl(new LLUrlEntrySL());
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<context_menu
|
||||
layout="topleft"
|
||||
name="Url Popup">
|
||||
<menu_item_call
|
||||
label="Show on Map"
|
||||
layout="topleft"
|
||||
name="show_on_map">
|
||||
<menu_item_call.on_click
|
||||
function="Url.Execute" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator
|
||||
layout="topleft" />
|
||||
<menu_item_call
|
||||
label="Teleport to Location"
|
||||
layout="topleft"
|
||||
name="teleport_to_location">
|
||||
<menu_item_call.on_click
|
||||
function="Url.Teleport" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator
|
||||
layout="topleft" />
|
||||
<menu_item_call
|
||||
label="Copy SLurl to clipboard"
|
||||
layout="topleft"
|
||||
name="url_copy">
|
||||
<menu_item_call.on_click
|
||||
function="Url.CopyUrl" />
|
||||
</menu_item_call>
|
||||
</context_menu>
|
||||
|
|
@ -11,6 +11,13 @@
|
|||
</menu_item_call>
|
||||
<menu_item_separator
|
||||
layout="topleft" />
|
||||
<menu_item_call
|
||||
label="Show on Map"
|
||||
layout="topleft"
|
||||
name="show_on_map">
|
||||
<menu_item_call.on_click
|
||||
function="Url.ShowOnMap" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Teleport to Object Location"
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -9,6 +9,15 @@
|
|||
<menu_item_call.on_click
|
||||
function="Url.Execute" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator
|
||||
layout="topleft" />
|
||||
<menu_item_call
|
||||
label="Show on Map"
|
||||
layout="topleft"
|
||||
name="show_on_map">
|
||||
<menu_item_call.on_click
|
||||
function="Url.ShowOnMap" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator
|
||||
layout="topleft" />
|
||||
<menu_item_call
|
||||
|
|
|
|||
|
|
@ -11,6 +11,13 @@
|
|||
</menu_item_call>
|
||||
<menu_item_separator
|
||||
layout="topleft" />
|
||||
<menu_item_call
|
||||
label="Show on Map"
|
||||
layout="topleft"
|
||||
name="show_on_map">
|
||||
<menu_item_call.on_click
|
||||
function="Url.ShowOnMap" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Teleport to Location"
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -9,6 +9,15 @@
|
|||
<menu_item_call.on_click
|
||||
function="Url.Execute" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator
|
||||
layout="topleft" />
|
||||
<menu_item_call
|
||||
label="Show on Map"
|
||||
layout="topleft"
|
||||
name="show_on_map">
|
||||
<menu_item_call.on_click
|
||||
function="Url.ShowOnMap" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator
|
||||
layout="topleft" />
|
||||
<menu_item_call
|
||||
|
|
|
|||
|
|
@ -73,8 +73,13 @@
|
|||
<string name="TooltipParcelUrl">Click to view this parcel's description</string>
|
||||
<string name="TooltipTeleportUrl">Click to teleport to this location</string>
|
||||
<string name="TooltipObjectIMUrl">Click to view this object's description</string>
|
||||
<string name="TooltipMapUrl">Click to view this location on a map</string>
|
||||
<string name="TooltipSLAPP">Click to run the secondlife:// command</string>
|
||||
<string name="CurrentURL" value=" CurrentURL: [CurrentURL]" />
|
||||
|
||||
<!-- text for SLURL labels -->
|
||||
<string name="SLurlLabelTeleport">Teleport to</string>
|
||||
<string name="SLurlLabelShowOnMap">Show Map for</string>
|
||||
|
||||
<!-- ButtonToolTips, llfloater.cpp -->
|
||||
<string name="BUTTON_CLOSE_DARWIN">Close (⌘W)</string>
|
||||
|
|
|
|||
Loading…
Reference in New Issue