Compare commits
21 Commits
sv-1.8.7.8
...
sv-1.8.7.8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
544feee19f | ||
|
|
bee60da089 | ||
|
|
c466b44143 | ||
|
|
27222d524c | ||
|
|
b99e2cbbdd | ||
|
|
a5bdc24a14 | ||
|
|
0b6d94f202 | ||
|
|
bf5035388b | ||
|
|
640c136bcc | ||
|
|
6ebd2eef00 | ||
|
|
c954d02125 | ||
|
|
a34414849c | ||
|
|
c1ffb1b332 | ||
|
|
d06448cdfd | ||
|
|
117ef68916 | ||
|
|
83b384ab97 | ||
|
|
5ee5ba473b | ||
|
|
4055af4afd | ||
|
|
65dad7acfd | ||
|
|
a21927e510 | ||
|
|
094c948a87 |
@@ -80,13 +80,21 @@ BOOL JCFloaterAreaSearch::postBuild()
|
||||
mResultList = getChild<LLScrollListCtrl>("result_list");
|
||||
mResultList->setDoubleClickCallback(boost::bind(&JCFloaterAreaSearch::onDoubleClick,this));
|
||||
mResultList->sortByColumn("Name", TRUE);
|
||||
auto tp = getChild<LLButton>("TP");
|
||||
auto look = getChild<LLButton>("Look");
|
||||
mResultList->setCommitOnSelectionChange(true);
|
||||
mResultList->setCommitCallback([=](LLUICtrl* ctrl, const LLSD& param){
|
||||
bool enabled = mResultList->getNumSelected() == 1;
|
||||
tp->setEnabled(enabled);
|
||||
look->setEnabled(enabled);
|
||||
});
|
||||
|
||||
mCounterText = getChild<LLTextBox>("counter");
|
||||
|
||||
getChild<LLButton>("Refresh")->setClickedCallback(boost::bind(&JCFloaterAreaSearch::onRefresh,this));
|
||||
getChild<LLButton>("Stop")->setClickedCallback(boost::bind(&JCFloaterAreaSearch::onStop,this));
|
||||
getChild<LLButton>("TP")->setClickedCallback(boost::bind(&JCFloaterAreaSearch::teleportToSelected, this));
|
||||
getChild<LLButton>("Look")->setClickedCallback(boost::bind(&JCFloaterAreaSearch::lookAtSelected, this));
|
||||
tp->setClickedCallback(boost::bind(&JCFloaterAreaSearch::teleportToSelected, this));
|
||||
look->setClickedCallback(boost::bind(&JCFloaterAreaSearch::lookAtSelected, this));
|
||||
|
||||
getChild<LLFilterEditor>("Name query chunk")->setCommitCallback(boost::bind(&JCFloaterAreaSearch::onCommitLine,this,_1,_2,LIST_OBJECT_NAME));
|
||||
getChild<LLFilterEditor>("Description query chunk")->setCommitCallback(boost::bind(&JCFloaterAreaSearch::onCommitLine,this,_1,_2,LIST_OBJECT_DESC));
|
||||
|
||||
@@ -56,6 +56,20 @@ public:
|
||||
|
||||
void results();
|
||||
static void processObjectPropertiesFamily(LLMessageSystem* msg, void** user_data);
|
||||
struct ObjectData
|
||||
{
|
||||
LLUUID id;
|
||||
std::string name;
|
||||
std::string desc;
|
||||
LLUUID owner_id;
|
||||
LLUUID group_id;
|
||||
};
|
||||
|
||||
const ObjectData* getObjectData(const LLUUID& id) const
|
||||
{
|
||||
const auto& it = mCachedObjects.find(id);
|
||||
return it != mCachedObjects.end() ? &it->second : nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -84,14 +98,6 @@ private:
|
||||
LLViewerRegion* mLastRegion;
|
||||
bool mStopped;
|
||||
|
||||
struct ObjectData
|
||||
{
|
||||
LLUUID id;
|
||||
std::string name;
|
||||
std::string desc;
|
||||
LLUUID owner_id;
|
||||
LLUUID group_id;
|
||||
};
|
||||
uuid_set_t mPendingObjects;
|
||||
boost::unordered_map<LLUUID, ObjectData> mCachedObjects;
|
||||
|
||||
|
||||
@@ -1613,12 +1613,14 @@ void LLAgent::startAutoPilotGlobal(
|
||||
mAutoPilotFlyOnStop = FALSE;
|
||||
}
|
||||
|
||||
if (distance > 30.0 && mAutoPilotAllowFlying)
|
||||
bool follow = mAutoPilotBehaviorName == "Follow";
|
||||
|
||||
if (!follow && distance > 30.0 && mAutoPilotAllowFlying)
|
||||
{
|
||||
setFlying(TRUE);
|
||||
}
|
||||
|
||||
if ( distance > 1.f &&
|
||||
if (!follow && distance > 1.f &&
|
||||
mAutoPilotAllowFlying &&
|
||||
heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
|
||||
{
|
||||
@@ -1757,16 +1759,25 @@ void LLAgent::autoPilot(F32 *delta_yaw)
|
||||
bool follow = !mLeaderID.isNull(); //mAutoPilotBehaviorName == "Follow";
|
||||
if (follow)
|
||||
{
|
||||
LLViewerObject* object = gObjectList.findObject(mLeaderID);
|
||||
if (!object)
|
||||
if (auto object = gObjectList.findObject(mLeaderID))
|
||||
{
|
||||
mAutoPilotBehaviorName.clear(); // Nothing left to follow pilot
|
||||
stopAutoPilot();
|
||||
return;
|
||||
mAutoPilotTargetGlobal = object->getPositionGlobal();
|
||||
if (const auto& av = object->asAvatar()) // Fly if avatar target is flying
|
||||
setFlying(av->mInAir);
|
||||
}
|
||||
else // We might still have a valid avatar pos
|
||||
{
|
||||
const LLVector3d& get_av_pos(const LLUUID & id);
|
||||
auto pos = get_av_pos(mLeaderID);
|
||||
if (pos.isExactlyZero()) // Default constructed or invalid from server
|
||||
{
|
||||
mAutoPilotBehaviorName.clear(); // Nothing left to follow pilot
|
||||
stopAutoPilot();
|
||||
return;
|
||||
}
|
||||
mAutoPilotTargetGlobal = pos;
|
||||
// Should we fly if the height difference is great enough here? Altitude is often invalid...
|
||||
}
|
||||
mAutoPilotTargetGlobal = object->getPositionGlobal();
|
||||
if (const auto& av = object->asAvatar()) // Fly if avatar target is flying
|
||||
setFlying(av->mInAir);
|
||||
}
|
||||
|
||||
if (!isAgentAvatarValid()) return;
|
||||
|
||||
@@ -293,19 +293,19 @@ bool LLCommandLineParser::parseAndStoreResults(po::command_line_parser& clp)
|
||||
po::basic_parsed_options<char> opts = clp.run();
|
||||
po::store(opts, gVariableMap);
|
||||
}
|
||||
catch(po::error& e)
|
||||
catch (const po::error& e)
|
||||
{
|
||||
LL_WARNS() << "Caught Error:" << e.what() << LL_ENDL;
|
||||
mErrorMsg = e.what();
|
||||
return false;
|
||||
}
|
||||
catch(LLCLPError& e)
|
||||
catch (const LLCLPError& e)
|
||||
{
|
||||
LL_WARNS() << "Caught Error:" << e.what() << LL_ENDL;
|
||||
mErrorMsg = e.what();
|
||||
return false;
|
||||
}
|
||||
catch(LLCLPLastOption&)
|
||||
catch (const LLCLPLastOption&)
|
||||
{
|
||||
// This exception means a token was read after an option
|
||||
// that must be the last option was reached (see url and slurl options)
|
||||
@@ -354,18 +354,58 @@ bool LLCommandLineParser::parseCommandLine(int argc, char **argv)
|
||||
return parseAndStoreResults(clp);
|
||||
}
|
||||
|
||||
// TODO:
|
||||
// - Break out this funky parsing logic into separate method
|
||||
// - Unit-test it with tests like LLStringUtil::getTokens() (the command-line
|
||||
// overload that supports quoted tokens)
|
||||
// - Unless this logic offers significant semantic benefits, replace it with
|
||||
// LLStringUtil::getTokens(). This would fix a known bug: you cannot --set a
|
||||
// string-valued variable to the empty string, because empty strings are
|
||||
// eliminated below.
|
||||
|
||||
bool LLCommandLineParser::parseCommandLineString(const std::string& str)
|
||||
{
|
||||
std::string cmd_line_string("");
|
||||
if (!str.empty())
|
||||
{
|
||||
bool add_last_c = true;
|
||||
S32 last_c_pos = str.size() - 1; //don't get out of bounds on pos+1, last char will be processed separately
|
||||
for (S32 pos = 0; pos < last_c_pos; ++pos)
|
||||
{
|
||||
cmd_line_string.append(&str[pos], 1);
|
||||
if (str[pos] == '\\')
|
||||
{
|
||||
cmd_line_string.append("\\", 1);
|
||||
if (str[pos + 1] == '\\')
|
||||
{
|
||||
++pos;
|
||||
add_last_c = (pos != last_c_pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (add_last_c)
|
||||
{
|
||||
cmd_line_string.append(&str[last_c_pos], 1);
|
||||
if (str[last_c_pos] == '\\')
|
||||
{
|
||||
cmd_line_string.append("\\", 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Split the string content into tokens
|
||||
boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'");
|
||||
boost::tokenizer< boost::escaped_list_separator<char> > tok(str, sep);
|
||||
const char* escape_chars = "\\";
|
||||
const char* separator_chars = "\r\n ";
|
||||
const char* quote_chars = "\"'";
|
||||
boost::escaped_list_separator<char> sep(escape_chars, separator_chars, quote_chars);
|
||||
boost::tokenizer< boost::escaped_list_separator<char> > tok(cmd_line_string, sep);
|
||||
std::vector<std::string> tokens;
|
||||
// std::copy(tok.begin(), tok.end(), std::back_inserter(tokens));
|
||||
for(boost::tokenizer< boost::escaped_list_separator<char> >::iterator i = tok.begin();
|
||||
i != tok.end();
|
||||
++i)
|
||||
{
|
||||
if(0 != i->size())
|
||||
if(!i->empty())
|
||||
{
|
||||
tokens.push_back(*i);
|
||||
}
|
||||
@@ -386,20 +426,28 @@ bool LLCommandLineParser::parseCommandLineFile(const std::basic_istream < char >
|
||||
|
||||
void LLCommandLineParser::notify()
|
||||
{
|
||||
po::notify(gVariableMap);
|
||||
try
|
||||
{
|
||||
po::notify(gVariableMap);
|
||||
}
|
||||
catch (const LLCLPError& e)
|
||||
{
|
||||
LL_WARNS() << "Caught Error: " << e.what() << LL_ENDL;
|
||||
mErrorMsg = e.what();
|
||||
}
|
||||
}
|
||||
|
||||
void LLCommandLineParser::printOptions() const
|
||||
{
|
||||
for(po::variables_map::iterator i = gVariableMap.begin(); i != gVariableMap.end(); ++i)
|
||||
for (auto& i : gVariableMap)
|
||||
{
|
||||
std::string name = i->first;
|
||||
token_vector_t values = i->second.as<token_vector_t>();
|
||||
std::string name = i.first;
|
||||
token_vector_t values = i.second.as<token_vector_t>();
|
||||
std::ostringstream oss;
|
||||
oss << name << ": ";
|
||||
for(token_vector_t::iterator t_itr = values.begin(); t_itr != values.end(); ++t_itr)
|
||||
for (auto& value : values)
|
||||
{
|
||||
oss << t_itr->c_str() << " ";
|
||||
oss << value.c_str() << " ";
|
||||
}
|
||||
LL_INFOS() << oss.str() << LL_ENDL;
|
||||
}
|
||||
|
||||
@@ -134,8 +134,9 @@ namespace
|
||||
}
|
||||
} //namespace
|
||||
|
||||
const LLColor4* mm_getMarkerColor(const LLUUID& id);
|
||||
LLAvatarListEntry::LLAvatarListEntry(const LLUUID& id, const std::string& name, const LLVector3d& position) :
|
||||
mID(id), mName(name), mPosition(position), mMarked(false), mFocused(false),
|
||||
mID(id), mName(name), mPosition(position), mMarked(mm_getMarkerColor(id)), mFocused(false),
|
||||
mStats(),
|
||||
mActivityType(ACTIVITY_NEW), mActivityTimer(),
|
||||
mIsInList(false), mAge(-1), mTime(time(NULL))
|
||||
@@ -348,7 +349,14 @@ void track_av(const LLUUID& id)
|
||||
}
|
||||
|
||||
static void cmd_profile(const LLAvatarListEntry* entry);
|
||||
static void cmd_toggle_mark(LLAvatarListEntry* entry);
|
||||
static void cmd_toggle_mark(LLAvatarListEntry* entry)
|
||||
{
|
||||
bool mark = !entry->isMarked();
|
||||
void mm_setcolor(LLUUID key, LLColor4 col);
|
||||
void mm_clearMark(const LLUUID & id);
|
||||
mark ? mm_setcolor(entry->getID(), LLColor4::red) : mm_clearMark(entry->getID());
|
||||
entry->setMarked(mark);
|
||||
}
|
||||
static void cmd_ar(const LLAvatarListEntry* entry);
|
||||
static void cmd_teleport(const LLAvatarListEntry* entry);
|
||||
|
||||
@@ -364,15 +372,6 @@ namespace
|
||||
}
|
||||
};
|
||||
|
||||
class RadarMark : public view_listener_t
|
||||
{
|
||||
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
LLFloaterAvatarList::instance().doCommand(cmd_toggle_mark);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class RadarFocus : public view_listener_t
|
||||
{
|
||||
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
@@ -415,7 +414,6 @@ void addMenu(view_listener_t* menu, const std::string& name);
|
||||
void add_radar_listeners()
|
||||
{
|
||||
addMenu(new RadarTrack, "Radar.Track");
|
||||
addMenu(new RadarMark, "Radar.Mark");
|
||||
addMenu(new RadarFocus, "Radar.Focus");
|
||||
addMenu(new RadarFocusPrev, "Radar.FocusPrev");
|
||||
addMenu(new RadarFocusNext, "Radar.FocusNext");
|
||||
@@ -779,7 +777,7 @@ void LLFloaterAvatarList::refreshAvatarList()
|
||||
if (entry->isMarked())
|
||||
{
|
||||
mark.value = "X";
|
||||
mark.color = LLColor4::blue;
|
||||
mark.color = *mm_getMarkerColor(av_id);
|
||||
mark.font_style = "BOLD";
|
||||
}
|
||||
element.columns.add(mark);
|
||||
@@ -1449,7 +1447,6 @@ void send_estate_message(const std::string request, const std::vector<std::strin
|
||||
|
||||
static void cmd_append_names(const LLAvatarListEntry* entry, std::string &str, std::string &sep)
|
||||
{ if(!str.empty())str.append(sep);str.append(entry->getName()); }
|
||||
static void cmd_toggle_mark(LLAvatarListEntry* entry) { entry->toggleMark(); }
|
||||
static void cmd_ar(const LLAvatarListEntry* entry) { LLFloaterReporter::showFromObject(entry->getID()); }
|
||||
static void cmd_profile(const LLAvatarListEntry* entry) { LLAvatarActions::showProfile(entry->getID()); }
|
||||
static void cmd_teleport(const LLAvatarListEntry* entry) { gAgent.teleportViaLocation(entry->getPosition()); }
|
||||
|
||||
@@ -124,7 +124,7 @@ enum ACTIVITY_TYPE
|
||||
|
||||
bool isInList() const { return mIsInList; }
|
||||
|
||||
void toggleMark() { mMarked = !mMarked; }
|
||||
void setMarked(bool marked) { mMarked = marked; }
|
||||
|
||||
struct uuidMatch
|
||||
{
|
||||
|
||||
@@ -296,15 +296,25 @@ std::size_t hash_value(const LLUUID& uuid)
|
||||
return (std::size_t)uuid.getCRC32();
|
||||
}
|
||||
boost::unordered_map<const LLUUID,LLColor4> mm_MarkerColors;
|
||||
bool mm_getMarkerColor(const LLUUID& id, LLColor4& color)
|
||||
const LLColor4* mm_getMarkerColor(const LLUUID& id)
|
||||
{
|
||||
boost::unordered_map<const LLUUID,LLColor4>::const_iterator it = mm_MarkerColors.find(id);
|
||||
if (it == mm_MarkerColors.end()) return false;
|
||||
color = it->second;
|
||||
return true;
|
||||
auto it = mm_MarkerColors.find(id);
|
||||
return it == mm_MarkerColors.end() ? nullptr : &it->second;
|
||||
}
|
||||
|
||||
void LLNetMap::mm_setcolor(LLUUID key,LLColor4 col)
|
||||
bool mm_getMarkerColor(const LLUUID& id, LLColor4& color)
|
||||
{
|
||||
auto c = mm_getMarkerColor(id);
|
||||
if (c) color = *c;
|
||||
return c;
|
||||
}
|
||||
|
||||
void mm_clearMark(const LLUUID& id)
|
||||
{
|
||||
mm_MarkerColors.erase(id);
|
||||
}
|
||||
|
||||
void mm_setcolor(LLUUID key,LLColor4 col)
|
||||
{
|
||||
mm_MarkerColors[key] = col;
|
||||
}
|
||||
@@ -1005,7 +1015,7 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& tool_tip, LLRect* stick
|
||||
LLVector3d delta = targetPosition - myPosition;
|
||||
F32 distance = (F32)delta.magVec();
|
||||
if (single_agent)
|
||||
tool_tip.append( llformat("\n\n(Distance: %.02fm)\n",distance) );
|
||||
tool_tip.append( llformat("\n(Distance: %.02fm)\n",distance) );
|
||||
else
|
||||
tool_tip.append(llformat(" (%.02fm)\n", distance));
|
||||
}
|
||||
@@ -1498,9 +1508,13 @@ bool LLScaleMap::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
//moymod - minimap color shit
|
||||
void markMassAgents(const LLColor4& color)
|
||||
{
|
||||
auto self = LFIDBearer::getActive<LLNetMap>();
|
||||
for (const auto& id : self->getSelectedIDs())
|
||||
self->mm_setcolor(id, color);
|
||||
auto radar = LLFloaterAvatarList::getInstance();
|
||||
for (const auto& id : LFIDBearer::getActiveSelectedIDs())
|
||||
{
|
||||
mm_setcolor(id, color);
|
||||
if (auto entry = radar ? radar->getAvatarEntry(id) : nullptr)
|
||||
entry->setMarked(true);
|
||||
}
|
||||
}
|
||||
|
||||
bool mmsetred::handleEvent(LLPointer<LLEvent>, const LLSD&)
|
||||
@@ -1530,8 +1544,13 @@ bool mmsetcustom::handleEvent(LLPointer<LLEvent>, const LLSD&)
|
||||
}
|
||||
bool mmsetunmark::handleEvent(LLPointer<LLEvent>, const LLSD&)
|
||||
{
|
||||
auto radar = LLFloaterAvatarList::getInstance();
|
||||
for (const auto& id : LFIDBearer::getActiveSelectedIDs())
|
||||
mm_MarkerColors.erase(id);
|
||||
{
|
||||
mm_clearMark(id);
|
||||
if (auto entry = radar ? radar->getAvatarEntry(id) : nullptr)
|
||||
entry->setMarked(false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
bool mmenableunmark::handleEvent(LLPointer<LLEvent>, const LLSD& userdata)
|
||||
|
||||
@@ -72,9 +72,6 @@ public:
|
||||
uuid_vec_t getSelectedIDs() const override final { return mClosestAgentsAtLastClick; }
|
||||
S32 getNumSelected() const override final { return mClosestAgentsAtLastClick.size(); }
|
||||
|
||||
static void mm_setcolor(LLUUID key,LLColor4 col); //moymod
|
||||
|
||||
|
||||
// [SL:KB] - Patch: World-MinimapOverlay | Checked: 2012-06-20 (Catznip-3.3.0)
|
||||
void refreshParcelOverlay() { mUpdateParcelImage = true; }
|
||||
// [/SL:KB]
|
||||
@@ -157,7 +154,7 @@ private:
|
||||
LLUUID mClosestAgentToCursor;
|
||||
LLUUID mClosestAgentAtLastRightClick;
|
||||
|
||||
BOOL isAgentUnderCursor() { return mClosestAgentToCursor.notNull(); }
|
||||
BOOL isAgentUnderCursor() const { return mClosestAgentToCursor.notNull(); }
|
||||
LLMenuGL* mPopupMenu;
|
||||
};
|
||||
|
||||
|
||||
@@ -337,12 +337,21 @@ void LLPanelAvatarFirstLife::enableControls(BOOL self)
|
||||
void show_picture(const LLUUID& id, const std::string& name);
|
||||
static std::string profile_picture_title(const std::string& str) { return "Profile Picture: " + str; }
|
||||
static void show_partner_help() { LLNotificationsUtil::add("ClickPartnerHelpAvatar", LLSD(), LLSD(), boost::bind(LLPanelAvatarSecondLife::onClickPartnerHelpLoadURL, _1, _2)); }
|
||||
void show_log_browser(const LLUUID& id)
|
||||
void show_log_browser(const LLUUID& id, const LFIDBearer::Type& type)
|
||||
{
|
||||
void show_log_browser(const std::string& name, const std::string& id);
|
||||
LLAvatarName av_name;
|
||||
LLAvatarNameCache::get(id, &av_name);
|
||||
show_log_browser(av_name.getLegacyName(), id.asString());
|
||||
std::string name;
|
||||
if (type == LFIDBearer::AVATAR)
|
||||
{
|
||||
LLAvatarName av_name;
|
||||
LLAvatarNameCache::get(id, &av_name);
|
||||
name = av_name.getLegacyName();
|
||||
}
|
||||
else // GROUP
|
||||
{
|
||||
gCacheName->getGroupName(id, name);
|
||||
}
|
||||
show_log_browser(name, id.asString());
|
||||
}
|
||||
BOOL LLPanelAvatarSecondLife::postBuild()
|
||||
{
|
||||
@@ -368,7 +377,7 @@ BOOL LLPanelAvatarSecondLife::postBuild()
|
||||
getChild<LLUICtrl>("GroupInvite_Button")->setCommitCallback(boost::bind(static_cast<void(*)(const LLUUID&)>(LLAvatarActions::inviteToGroup), boost::bind(&LLPanelAvatar::getAvatarID, pa)));
|
||||
|
||||
getChild<LLUICtrl>("Add Friend...")->setCommitCallback(boost::bind(LLAvatarActions::requestFriendshipDialog, boost::bind(&LLPanelAvatar::getAvatarID, pa)));
|
||||
getChild<LLUICtrl>("Log")->setCommitCallback(boost::bind(show_log_browser, boost::bind(&LLPanelAvatar::getAvatarID, pa)));
|
||||
getChild<LLUICtrl>("Log")->setCommitCallback(boost::bind(show_log_browser, boost::bind(&LLPanelAvatar::getAvatarID, pa), LFIDBearer::AVATAR));
|
||||
getChild<LLUICtrl>("Pay...")->setCommitCallback(boost::bind(LLAvatarActions::pay, boost::bind(&LLPanelAvatar::getAvatarID, pa)));
|
||||
if (LLUICtrl* ctrl = findChild<LLUICtrl>("Mute"))
|
||||
{
|
||||
|
||||
@@ -135,6 +135,7 @@
|
||||
#include "llfloaternotificationsconsole.h"
|
||||
|
||||
// <edit>
|
||||
#include "jcfloaterareasearch.h"
|
||||
#include "lltexteditor.h" // Initialize the text editor menu listeners in here
|
||||
#include "llfloatermessagelog.h"
|
||||
#include "shfloatermediaticker.h"
|
||||
@@ -9041,9 +9042,38 @@ template<typename T> T* get_focused()
|
||||
return t;
|
||||
}
|
||||
|
||||
const JCFloaterAreaSearch::ObjectData* get_obj_data(const LLUUID& id)
|
||||
{
|
||||
auto areasearch = JCFloaterAreaSearch::findInstance();
|
||||
return areasearch ? areasearch->getObjectData(id) : nullptr;
|
||||
}
|
||||
|
||||
const std::string get_slurl_for(const LLUUID& id, const LFIDBearer::Type& type)
|
||||
{
|
||||
return type == LFIDBearer::GROUP ? LLGroupActions::getSLURL(id) : LLAvatarActions::getSLURL(id);
|
||||
switch (type)
|
||||
{
|
||||
case LFIDBearer::GROUP: return LLGroupActions::getSLURL(id);
|
||||
case LFIDBearer::AVATAR: return LLAvatarActions::getSLURL(id);
|
||||
case LFIDBearer::OBJECT:
|
||||
{
|
||||
const auto& obj_data = get_obj_data(id);
|
||||
if (!obj_data) return LLStringUtil::null;
|
||||
|
||||
LLSD sdQuery;
|
||||
sdQuery["name"] = obj_data->name;
|
||||
sdQuery["owner"] = obj_data->owner_id;
|
||||
|
||||
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES) && (obj_data->owner_id != gAgentID))
|
||||
sdQuery["rlv_shownames"] = true;
|
||||
|
||||
if (const auto obj = gObjectList.findObject(id))
|
||||
if (const auto region = obj->getRegion())
|
||||
sdQuery["slurl"] = LLSLURL(region->getName(), obj->getPositionAgent()).getLocationString();
|
||||
|
||||
return LLSLURL("objectim", id, LLURI::mapToQueryString(sdQuery)).getSLURLString();
|
||||
}
|
||||
default: return LLStringUtil::null;
|
||||
}
|
||||
}
|
||||
|
||||
const LLWString get_wslurl_for(const LLUUID& id, const LFIDBearer::Type& type)
|
||||
@@ -9193,10 +9223,19 @@ class ListCopyNames : public view_listener_t
|
||||
return ret;
|
||||
}
|
||||
|
||||
static std::string getObjectName(const LLUUID& id)
|
||||
{
|
||||
const auto& obj_data = get_obj_data(id);
|
||||
return obj_data ? obj_data->name : LLStringUtil::null;
|
||||
}
|
||||
|
||||
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
LLWString str;
|
||||
copy_from_ids(LFIDBearer::getActiveSelectedIDs(), LFIDBearer::getActiveType() == LFIDBearer::GROUP ? getGroupName : getAvatarName);
|
||||
const auto& type = LFIDBearer::getActiveType();
|
||||
copy_from_ids(LFIDBearer::getActiveSelectedIDs(), type == LFIDBearer::GROUP ? getGroupName :
|
||||
type == LFIDBearer::OBJECT ? getObjectName :
|
||||
getAvatarName);
|
||||
if (!str.empty()) LLView::getWindow()->copyTextToClipboard(str);
|
||||
return true;
|
||||
}
|
||||
@@ -9287,13 +9326,13 @@ bool can_show_web_profile()
|
||||
return !gSavedSettings.getString("WebProfileURL").empty();
|
||||
}
|
||||
|
||||
void show_log_browser(const LLUUID& id);
|
||||
void show_log_browser(const LLUUID& id, const LFIDBearer::Type& type);
|
||||
class ListShowLog : public view_listener_t
|
||||
{
|
||||
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
for (const LLUUID& id : LFIDBearer::getActiveSelectedIDs())
|
||||
show_log_browser(id);
|
||||
show_log_browser(id, LFIDBearer::getActiveType());
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -9306,6 +9345,7 @@ class ListShowProfile : public view_listener_t
|
||||
{
|
||||
case LFIDBearer::AVATAR: LLAvatarActions::showProfiles(LFIDBearer::getActiveSelectedIDs()); break;
|
||||
case LFIDBearer::GROUP: LLGroupActions::showProfiles(LFIDBearer::getActiveSelectedIDs()); break;
|
||||
case LFIDBearer::OBJECT: for (const auto& id : LFIDBearer::getActiveSelectedIDs()) LLUrlAction::openURL(get_slurl_for(id, LFIDBearer::OBJECT)); break;
|
||||
default: break;
|
||||
}
|
||||
return true;
|
||||
@@ -9583,6 +9623,15 @@ class ListActivate : public view_listener_t
|
||||
}
|
||||
};
|
||||
|
||||
class ListObjectCamTo : public view_listener_t
|
||||
{
|
||||
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
{
|
||||
gAgentCamera.lookAtObject(LFIDBearer::getActiveSelectedID(), false);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class MediaCtrlCopyURL : public view_listener_t
|
||||
{
|
||||
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
|
||||
@@ -9975,6 +10024,7 @@ void initialize_menus()
|
||||
addMenu(new ListLeave, "List.Leave");
|
||||
addMenu(new ListJoin, "List.Join");
|
||||
addMenu(new ListActivate, "List.Activate");
|
||||
addMenu(new ListObjectCamTo, "List.Object.CamTo");
|
||||
|
||||
add_radar_listeners();
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
<menu_item_call label="Focus Next" name="Focus Next"/>
|
||||
<menu_item_call label="Focus Previous" name="Focus Previous"/>
|
||||
|
||||
<menu_item_call label="Mark/Unmark" name="Mark/Unmark"/>
|
||||
<menu_item_call label="Focus Next Marked" name="Focus Next Marked"/>
|
||||
<menu_item_call label="Focus Previous Marked" name="Focus Previous Marked"/>
|
||||
</menu>
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<scroll_list name="result_list"
|
||||
left="10" right="-10" top="-103" bottom="32"
|
||||
follows="left|top|bottom|right" can_resize="true"
|
||||
column_padding="0" draw_heading="true" multi_select="false" search_column="1">
|
||||
column_padding="0" draw_heading="true" multi_select="true" search_column="1" menu_num="2">
|
||||
<column name="Name" label="Name" dynamicwidth="true" tool_tip="Double click on any entry to get a position beacon"/>
|
||||
<column name="Description" label="Description" dynamicwidth="true" tool_tip="Double click on any entry to get a position beacon"/>
|
||||
<column name="Owner" label="Owner" dynamicwidth="true" tool_tip="Double click on any entry to get a position beacon"/>
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
<string name="focus" value="Focus"/>
|
||||
<button bottom_delta="0" follows="left|top" height="20" left_delta="81" width="50" name="tp_btn" label="TP"/>
|
||||
<button bottom_delta="0" follows="left|top" height="20" left_delta="50" width="50" name="pay_btn" label="Pay"/>
|
||||
<button bottom_delta="0" follows="left|top" height="20" left_delta="50" width="50" name="history_btn" label="Log"/>
|
||||
<button bottom="-37" follows="left|top" height="20" image_overlay="icn_voice-call-start.tga" image_overlay_alignment="left" label="Call" left_delta="50" name="start_call_btn" width="80"/>
|
||||
<button bottom_delta="0" follows="left|top" height="20" left_delta="50" width="80" name="history_btn" label="History"/>
|
||||
<button bottom="-37" follows="left|top" height="20" image_overlay="icn_voice-call-start.tga" image_overlay_alignment="left" label="Call" left_delta="80" name="start_call_btn" width="80"/>
|
||||
<button bottom="-37" follows="top" height="20" image_overlay="icn_voice-call-end.tga" image_overlay_alignment="left" label="End" name="end_call_btn" visible="false" width="80"/>
|
||||
<panel border="false" bottom="-34" follows="left|top" height="20" left_delta="80" name="speaker_controls" width="100">
|
||||
<volume_slider bottom="0" follows="bottom" height="15" increment="0.05" initial_val="0.5" max_val="1.0" min_val="0.0" name="speaker_volume" width="56"/>
|
||||
|
||||
@@ -19,6 +19,11 @@
|
||||
<on_enable function="List.EnableSingleSelected"/>
|
||||
<on_visible function="List.IsInGroup"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Chat History" name="Chat History">
|
||||
<on_click function="List.ShowLog"/>
|
||||
<on_enable function="List.EnableAnySelected"/>
|
||||
<on_visible function="List.IsInGroup"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Join Group" name="join_group">
|
||||
<on_click function="List.Join"/>
|
||||
<on_visible function="List.NotInGroup"/>
|
||||
|
||||
@@ -87,7 +87,6 @@
|
||||
<on_click function="StopTracking" />
|
||||
<on_visible function="IsTracking" />
|
||||
</menu_item_call>
|
||||
<menu name="avs_menu" label="Selected Avatars" filename="menu_local_avs.xml">
|
||||
<menu name="Mark" label="Mark">
|
||||
<menu_item_call label="Red" name="Red">
|
||||
<on_click function="MiniMap.setred" />
|
||||
@@ -109,7 +108,7 @@
|
||||
<on_click function="MiniMap.setunmark" />
|
||||
<on_enable function="MiniMap.enableunmark" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
<menu name="avs_menu" label="Selected Avatars" filename="menu_local_avs.xml"/>
|
||||
<menu_item_check label="World Map Textures" name="World Map Textures">
|
||||
<on_check control="MiniMapWorldMapTextures" />
|
||||
<on_click function="ToggleControl" userdata="MiniMapWorldMapTextures" />
|
||||
|
||||
32
indra/newview/skins/default/xui/en-us/menu_objects_list.xml
Normal file
32
indra/newview/skins/default/xui/en-us/menu_objects_list.xml
Normal file
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<context_menu label="Objects" name="Objects">
|
||||
<menu_item_call label="Cam To" name="Cam To">
|
||||
<on_click function="List.Object.CamTo"/>
|
||||
<on_visible function="List.EnableSingleSelected"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Follow" name="Follow">
|
||||
<on_click function="List.Follow"/>
|
||||
<on_visible function="List.EnableSingleSelected"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Move To" name="Move To">
|
||||
<on_click function="List.GoTo"/>
|
||||
<on_visible function="List.EnableSingleSelected"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Teleport To" name="Teleport To">
|
||||
<on_click function="List.TeleportTo"/>
|
||||
<on_visible function="List.EnableSingleSelected"/>
|
||||
</menu_item_call>
|
||||
<menu_item_separator/>
|
||||
<menu_item_call label="Copy Key" name="Copy Key">
|
||||
<on_click function="List.CopyUUIDs"/>
|
||||
<on_enable function="List.EnableAnySelected"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Copy Name" name="Copy Name">
|
||||
<on_click function="List.CopyNames"/>
|
||||
<on_enable function="List.EnableAnySelected"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Copy SLURL" name="Copy SLURL">
|
||||
<on_click function="List.CopySLURL"/>
|
||||
<on_visible function="List.EnableSingleSelected"/>
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
@@ -74,14 +74,15 @@
|
||||
<menu_item_call enabled="true" hidden="false" label="Data" mouse_opaque="true" name="Data">
|
||||
<on_click function="Object.Data" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator />
|
||||
<menu_item_separator />
|
||||
<menu_item_separator />
|
||||
<menu_item_call enabled="true" label="Reload" mouse_opaque="true" name="Reload Textures">
|
||||
<on_click function="Object.ReloadTextures" />
|
||||
<menu_item_call label="Go To" name="Go To">
|
||||
<on_click function="GoToObject" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Follow" name="Follow">
|
||||
<on_click function="Object.Follow"/>
|
||||
</menu_item_call>
|
||||
<menu_item_separator />
|
||||
<menu_item_call enabled="true" label="Reload" mouse_opaque="true" name="Reload Textures">
|
||||
<on_click function="Object.ReloadTextures" />
|
||||
</menu_item_call>
|
||||
</pie_menu>
|
||||
<menu_item_call enabled="false" label="Mute" mouse_opaque="true" name="Object Mute">
|
||||
|
||||
@@ -114,6 +114,27 @@
|
||||
<on_click function="Radar.FocusPrev" userdata="1"/>
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
<menu name="Mark" label="Mark">
|
||||
<menu_item_call label="Red" name="Red">
|
||||
<on_click function="MiniMap.setred" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Green" name="Green">
|
||||
<on_click function="MiniMap.setgreen" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Blue" name="Blue">
|
||||
<on_click function="MiniMap.setblue" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Yellow" name="Yellow">
|
||||
<on_click function="MiniMap.setyellow" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Custom..." name="Custom">
|
||||
<on_click function="MiniMap.setcustom" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Unmark" name="Unmark">
|
||||
<on_click function="MiniMap.setunmark" />
|
||||
<on_enable function="MiniMap.enableunmark" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
<menu label="Alerts" name="Alerts" create_jump_keys="true">
|
||||
<menu_item_check label="Display alerts when an avatar" name="Display alerts in chat">
|
||||
<on_click function="ToggleControl" userdata="RadarChatAlerts"/>
|
||||
@@ -189,10 +210,6 @@
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
<menu label="Hide Columns" name="Hide Columns" create_jump_keys="true">
|
||||
<menu_item_check label="Mark" name="Mark">
|
||||
<on_click function="ToggleControl" userdata="RadarColumnMarkHidden"/>
|
||||
<on_check control="RadarColumnMarkHidden"/>
|
||||
</menu_item_check>
|
||||
<menu_item_check label="Position" name="Position">
|
||||
<on_click function="ToggleControl" userdata="RadarColumnPositionHidden"/>
|
||||
<on_check control="RadarColumnPositionHidden"/>
|
||||
|
||||
@@ -23,6 +23,10 @@
|
||||
<on_click function="List.Activate"/>
|
||||
<on_visible function="List.IsInGroup"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Chat History" name="Chat History">
|
||||
<on_click function="List.ShowLog"/>
|
||||
<on_visible function="List.IsInGroup"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Join Group" name="join_group">
|
||||
<on_click function="List.Join"/>
|
||||
<on_visible function="List.NotInGroup"/>
|
||||
|
||||
@@ -40,6 +40,10 @@
|
||||
<menu_item_call.on_click
|
||||
function="Text.Url" userdata="Teleport" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Cam To" name="Cam To">
|
||||
<on_click function="List.Object.CamTo"/>
|
||||
<on_visible function="List.IsNearby"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Follow" name="Follow">
|
||||
<on_click function="List.Follow"/>
|
||||
<on_visible function="List.IsNearby"/>
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
<menu_item_call label="Enfocar Siguiente" name="Focus Next"/>
|
||||
<menu_item_call label="Enfocar Anterior" name="Focus Previous"/>
|
||||
<menu_item_separator/>
|
||||
<menu_item_call label="Marcar/Desmarcar" name="Mark/Unmark"/>
|
||||
<menu_item_call label="Enfocar Siguiente Marcado" name="Focus Next Marked"/>
|
||||
<menu_item_call label="Enfocar Anterior Marcado" name="Focus Previous Marked"/>
|
||||
</menu>
|
||||
|
||||
Reference in New Issue
Block a user