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
Lynx Linden 2009-11-03 19:08:11 +00:00
parent 97f9ad9f4c
commit 00e56b0907
12 changed files with 150 additions and 4 deletions

View File

@ -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));

View File

@ -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));

View File

@ -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);

View File

@ -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);
}

View File

@ -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

View File

@ -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());

View File

@ -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>

View File

@ -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"

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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 (&#8984;W)</string>