Compare commits

..

24 Commits

Author SHA1 Message Date
Liru Færs
544feee19f Fix Copy Names in Object Menu not working, oops!! 2020-01-08 20:48:48 -05:00
Liru Færs
bee60da089 Break out get_obj_data into its own function 2020-01-08 20:43:47 -05:00
Liru Færs
c466b44143 Introduce rudimentary objects list menu for Area Search
Enables multiselect in areasearch
2020-01-08 20:09:46 -05:00
Liru Færs
27222d524c Add Object support to List.ShowProfile, via get_slurl_for 2020-01-08 19:49:52 -05:00
Liru Færs
b99e2cbbdd Add support for OBJECT type to get_slurl_for
Caveat: Requires area search to be instantiated (should we break this out?)
Only includes location if in object list
2020-01-08 19:48:50 -05:00
Liru Færs
a5bdc24a14 Refactor get_slurl_for 2020-01-08 19:46:42 -05:00
Liru Færs
0b6d94f202 Request: Change "Log" button on IM Floater to "History"
This is more clear and consistent with all the other places this is used
2020-01-08 19:43:27 -05:00
Liru Færs
bf5035388b Expose ObjectData from AreaSearch 2020-01-08 19:22:36 -05:00
Liru Færs
640c136bcc Add Cam To to Object URL menu 2020-01-08 19:13:36 -05:00
Liru Færs
6ebd2eef00 Feature Request: Add Chat History to Group right click menus 2020-01-08 19:11:46 -05:00
Liru Færs
c954d02125 Add missing Go To to object pie menu 2020-01-08 18:00:51 -05:00
Liru Færs
a34414849c Sync some of llcommandlineparser with alchemy
Might fix Crash R
2020-01-08 17:07:49 -05:00
Liru Færs
c1ffb1b332 [Follow] Do not fly unless flying avatar target or already flying 2020-01-08 16:58:54 -05:00
Liru Færs
d06448cdfd Remove dead german menu entry 2020-01-08 16:53:23 -05:00
Liru Færs
117ef68916 Put object pie Follow where it was actually supposed to go
Thanks for the heads up on this mistake, Router!
2020-01-08 16:07:23 -05:00
Liru Færs
83b384ab97 Combine Marking from Minimap with Radar Mark
Color people right from the Radar!
Mark button on Radar now uses Red.

Removes "Radar.Mark" and its associated code
Thanks for the help on linux, Router!
2020-01-08 15:54:43 -05:00
Liru Færs
5ee5ba473b Small refactor of minimap marking code
Mark is now encapsulated
mm_setcolor is no longer part of LLNetMap
mm_clearMark is now used to erase mark from container
Introduces mm_getMarkerColor that returns a pointer,
instead of needing a ref every time.

Also mark isAgentUnderCursor const
2020-01-08 15:39:49 -05:00
Liru Færs
4055af4afd Add Mark menu to radar 2020-01-08 15:23:51 -05:00
Liru Færs
65dad7acfd Remove weird double newline between single avatar on minimap and distance 2020-01-08 14:53:08 -05:00
Liru Færs
a21927e510 [Follow] If target av isn't rendered, still try to get their position
Mainly moves code around, rather small change.
2020-01-08 13:15:37 -05:00
Liru Færs
094c948a87 Move Minimap Mark submenu back out of Selected Avatars menu for convenience 2020-01-08 13:12:13 -05:00
Liru Færs
31003f13af Fix Crash on text editor right click
Fixes Crashes N  and P
Missing nullcheck, my bad
Never expected there not to be a menu segment url when a menu is open
2020-01-08 10:25:44 -05:00
Router Gray
c1f39e167c Bang bang on the list baby 2020-01-07 20:00:50 -06:00
Router Gray
0e28436aa9 Fix invalid initialization of non-const reference 2020-01-07 19:59:53 -06:00
23 changed files with 295 additions and 90 deletions

View File

@@ -375,7 +375,7 @@ LLTextEditor::~LLTextEditor()
const std::string& LLTextEditor::getMenuSegmentUrl() const const std::string& LLTextEditor::getMenuSegmentUrl() const
{ {
auto segment = getSegmentAtLocalPos(mLastContextMenuX, mLastContextMenuY); auto segment = getSegmentAtLocalPos(mLastContextMenuX, mLastContextMenuY);
auto style = segment->getStyle(); auto style = segment ? segment->getStyle() : nullptr;
return style ? style->getLinkHREF() : LLStringUtil::null; return style ? style->getLinkHREF() : LLStringUtil::null;
} }

View File

@@ -80,13 +80,21 @@ BOOL JCFloaterAreaSearch::postBuild()
mResultList = getChild<LLScrollListCtrl>("result_list"); mResultList = getChild<LLScrollListCtrl>("result_list");
mResultList->setDoubleClickCallback(boost::bind(&JCFloaterAreaSearch::onDoubleClick,this)); mResultList->setDoubleClickCallback(boost::bind(&JCFloaterAreaSearch::onDoubleClick,this));
mResultList->sortByColumn("Name", TRUE); 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"); mCounterText = getChild<LLTextBox>("counter");
getChild<LLButton>("Refresh")->setClickedCallback(boost::bind(&JCFloaterAreaSearch::onRefresh,this)); getChild<LLButton>("Refresh")->setClickedCallback(boost::bind(&JCFloaterAreaSearch::onRefresh,this));
getChild<LLButton>("Stop")->setClickedCallback(boost::bind(&JCFloaterAreaSearch::onStop,this)); getChild<LLButton>("Stop")->setClickedCallback(boost::bind(&JCFloaterAreaSearch::onStop,this));
getChild<LLButton>("TP")->setClickedCallback(boost::bind(&JCFloaterAreaSearch::teleportToSelected, this)); tp->setClickedCallback(boost::bind(&JCFloaterAreaSearch::teleportToSelected, this));
getChild<LLButton>("Look")->setClickedCallback(boost::bind(&JCFloaterAreaSearch::lookAtSelected, 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>("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)); getChild<LLFilterEditor>("Description query chunk")->setCommitCallback(boost::bind(&JCFloaterAreaSearch::onCommitLine,this,_1,_2,LIST_OBJECT_DESC));

View File

@@ -56,6 +56,20 @@ public:
void results(); void results();
static void processObjectPropertiesFamily(LLMessageSystem* msg, void** user_data); 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: private:
@@ -84,14 +98,6 @@ private:
LLViewerRegion* mLastRegion; LLViewerRegion* mLastRegion;
bool mStopped; bool mStopped;
struct ObjectData
{
LLUUID id;
std::string name;
std::string desc;
LLUUID owner_id;
LLUUID group_id;
};
uuid_set_t mPendingObjects; uuid_set_t mPendingObjects;
boost::unordered_map<LLUUID, ObjectData> mCachedObjects; boost::unordered_map<LLUUID, ObjectData> mCachedObjects;

View File

@@ -1613,12 +1613,14 @@ void LLAgent::startAutoPilotGlobal(
mAutoPilotFlyOnStop = FALSE; mAutoPilotFlyOnStop = FALSE;
} }
if (distance > 30.0 && mAutoPilotAllowFlying) bool follow = mAutoPilotBehaviorName == "Follow";
if (!follow && distance > 30.0 && mAutoPilotAllowFlying)
{ {
setFlying(TRUE); setFlying(TRUE);
} }
if ( distance > 1.f && if (!follow && distance > 1.f &&
mAutoPilotAllowFlying && mAutoPilotAllowFlying &&
heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f)) heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
{ {
@@ -1757,16 +1759,25 @@ void LLAgent::autoPilot(F32 *delta_yaw)
bool follow = !mLeaderID.isNull(); //mAutoPilotBehaviorName == "Follow"; bool follow = !mLeaderID.isNull(); //mAutoPilotBehaviorName == "Follow";
if (follow) if (follow)
{ {
LLViewerObject* object = gObjectList.findObject(mLeaderID); if (auto object = gObjectList.findObject(mLeaderID))
if (!object)
{ {
mAutoPilotBehaviorName.clear(); // Nothing left to follow pilot mAutoPilotTargetGlobal = object->getPositionGlobal();
stopAutoPilot(); if (const auto& av = object->asAvatar()) // Fly if avatar target is flying
return; 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; if (!isAgentAvatarValid()) return;

View File

@@ -293,19 +293,19 @@ bool LLCommandLineParser::parseAndStoreResults(po::command_line_parser& clp)
po::basic_parsed_options<char> opts = clp.run(); po::basic_parsed_options<char> opts = clp.run();
po::store(opts, gVariableMap); po::store(opts, gVariableMap);
} }
catch(po::error& e) catch (const po::error& e)
{ {
LL_WARNS() << "Caught Error:" << e.what() << LL_ENDL; LL_WARNS() << "Caught Error:" << e.what() << LL_ENDL;
mErrorMsg = e.what(); mErrorMsg = e.what();
return false; return false;
} }
catch(LLCLPError& e) catch (const LLCLPError& e)
{ {
LL_WARNS() << "Caught Error:" << e.what() << LL_ENDL; LL_WARNS() << "Caught Error:" << e.what() << LL_ENDL;
mErrorMsg = e.what(); mErrorMsg = e.what();
return false; return false;
} }
catch(LLCLPLastOption&) catch (const LLCLPLastOption&)
{ {
// This exception means a token was read after an option // This exception means a token was read after an option
// that must be the last option was reached (see url and slurl options) // 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); 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) 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 // Split the string content into tokens
boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'"); const char* escape_chars = "\\";
boost::tokenizer< boost::escaped_list_separator<char> > tok(str, sep); 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::vector<std::string> tokens;
// std::copy(tok.begin(), tok.end(), std::back_inserter(tokens)); // std::copy(tok.begin(), tok.end(), std::back_inserter(tokens));
for(boost::tokenizer< boost::escaped_list_separator<char> >::iterator i = tok.begin(); for(boost::tokenizer< boost::escaped_list_separator<char> >::iterator i = tok.begin();
i != tok.end(); i != tok.end();
++i) ++i)
{ {
if(0 != i->size()) if(!i->empty())
{ {
tokens.push_back(*i); tokens.push_back(*i);
} }
@@ -386,20 +426,28 @@ bool LLCommandLineParser::parseCommandLineFile(const std::basic_istream < char >
void LLCommandLineParser::notify() 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 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; std::string name = i.first;
token_vector_t values = i->second.as<token_vector_t>(); token_vector_t values = i.second.as<token_vector_t>();
std::ostringstream oss; std::ostringstream oss;
oss << name << ": "; 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; LL_INFOS() << oss.str() << LL_ENDL;
} }

View File

@@ -134,8 +134,9 @@ namespace
} }
} //namespace } //namespace
const LLColor4* mm_getMarkerColor(const LLUUID& id);
LLAvatarListEntry::LLAvatarListEntry(const LLUUID& id, const std::string& name, const LLVector3d& position) : 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(), mStats(),
mActivityType(ACTIVITY_NEW), mActivityTimer(), mActivityType(ACTIVITY_NEW), mActivityTimer(),
mIsInList(false), mAge(-1), mTime(time(NULL)) 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_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_ar(const LLAvatarListEntry* entry);
static void cmd_teleport(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 class RadarFocus : public view_listener_t
{ {
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 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() void add_radar_listeners()
{ {
addMenu(new RadarTrack, "Radar.Track"); addMenu(new RadarTrack, "Radar.Track");
addMenu(new RadarMark, "Radar.Mark");
addMenu(new RadarFocus, "Radar.Focus"); addMenu(new RadarFocus, "Radar.Focus");
addMenu(new RadarFocusPrev, "Radar.FocusPrev"); addMenu(new RadarFocusPrev, "Radar.FocusPrev");
addMenu(new RadarFocusNext, "Radar.FocusNext"); addMenu(new RadarFocusNext, "Radar.FocusNext");
@@ -779,7 +777,7 @@ void LLFloaterAvatarList::refreshAvatarList()
if (entry->isMarked()) if (entry->isMarked())
{ {
mark.value = "X"; mark.value = "X";
mark.color = LLColor4::blue; mark.color = *mm_getMarkerColor(av_id);
mark.font_style = "BOLD"; mark.font_style = "BOLD";
} }
element.columns.add(mark); 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) static void cmd_append_names(const LLAvatarListEntry* entry, std::string &str, std::string &sep)
{ if(!str.empty())str.append(sep);str.append(entry->getName()); } { 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_ar(const LLAvatarListEntry* entry) { LLFloaterReporter::showFromObject(entry->getID()); }
static void cmd_profile(const LLAvatarListEntry* entry) { LLAvatarActions::showProfile(entry->getID()); } static void cmd_profile(const LLAvatarListEntry* entry) { LLAvatarActions::showProfile(entry->getID()); }
static void cmd_teleport(const LLAvatarListEntry* entry) { gAgent.teleportViaLocation(entry->getPosition()); } static void cmd_teleport(const LLAvatarListEntry* entry) { gAgent.teleportViaLocation(entry->getPosition()); }

View File

@@ -124,7 +124,7 @@ enum ACTIVITY_TYPE
bool isInList() const { return mIsInList; } bool isInList() const { return mIsInList; }
void toggleMark() { mMarked = !mMarked; } void setMarked(bool marked) { mMarked = marked; }
struct uuidMatch struct uuidMatch
{ {

View File

@@ -545,7 +545,7 @@ void LLHoverView::updateText()
} }
mText.push_back(line); mText.push_back(line);
auto& objects = LLSelectMgr::getInstance()->getHoverObjects(); auto objects = LLSelectMgr::getInstance()->getHoverObjects();
line.clear(); line.clear();
S32 prim_count = objects->getObjectCount(); S32 prim_count = objects->getObjectCount();

View File

@@ -296,15 +296,25 @@ std::size_t hash_value(const LLUUID& uuid)
return (std::size_t)uuid.getCRC32(); return (std::size_t)uuid.getCRC32();
} }
boost::unordered_map<const LLUUID,LLColor4> mm_MarkerColors; 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); auto it = mm_MarkerColors.find(id);
if (it == mm_MarkerColors.end()) return false; return it == mm_MarkerColors.end() ? nullptr : &it->second;
color = it->second;
return true;
} }
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; 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; LLVector3d delta = targetPosition - myPosition;
F32 distance = (F32)delta.magVec(); F32 distance = (F32)delta.magVec();
if (single_agent) if (single_agent)
tool_tip.append( llformat("\n\n(Distance: %.02fm)\n",distance) ); tool_tip.append( llformat("\n(Distance: %.02fm)\n",distance) );
else else
tool_tip.append(llformat(" (%.02fm)\n", distance)); tool_tip.append(llformat(" (%.02fm)\n", distance));
} }
@@ -1498,9 +1508,13 @@ bool LLScaleMap::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
//moymod - minimap color shit //moymod - minimap color shit
void markMassAgents(const LLColor4& color) void markMassAgents(const LLColor4& color)
{ {
auto self = LFIDBearer::getActive<LLNetMap>(); auto radar = LLFloaterAvatarList::getInstance();
for (const auto& id : self->getSelectedIDs()) for (const auto& id : LFIDBearer::getActiveSelectedIDs())
self->mm_setcolor(id, color); {
mm_setcolor(id, color);
if (auto entry = radar ? radar->getAvatarEntry(id) : nullptr)
entry->setMarked(true);
}
} }
bool mmsetred::handleEvent(LLPointer<LLEvent>, const LLSD&) 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&) bool mmsetunmark::handleEvent(LLPointer<LLEvent>, const LLSD&)
{ {
auto radar = LLFloaterAvatarList::getInstance();
for (const auto& id : LFIDBearer::getActiveSelectedIDs()) 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; return true;
} }
bool mmenableunmark::handleEvent(LLPointer<LLEvent>, const LLSD& userdata) bool mmenableunmark::handleEvent(LLPointer<LLEvent>, const LLSD& userdata)

View File

@@ -72,9 +72,6 @@ public:
uuid_vec_t getSelectedIDs() const override final { return mClosestAgentsAtLastClick; } uuid_vec_t getSelectedIDs() const override final { return mClosestAgentsAtLastClick; }
S32 getNumSelected() const override final { return mClosestAgentsAtLastClick.size(); } 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) // [SL:KB] - Patch: World-MinimapOverlay | Checked: 2012-06-20 (Catznip-3.3.0)
void refreshParcelOverlay() { mUpdateParcelImage = true; } void refreshParcelOverlay() { mUpdateParcelImage = true; }
// [/SL:KB] // [/SL:KB]
@@ -157,7 +154,7 @@ private:
LLUUID mClosestAgentToCursor; LLUUID mClosestAgentToCursor;
LLUUID mClosestAgentAtLastRightClick; LLUUID mClosestAgentAtLastRightClick;
BOOL isAgentUnderCursor() { return mClosestAgentToCursor.notNull(); } BOOL isAgentUnderCursor() const { return mClosestAgentToCursor.notNull(); }
LLMenuGL* mPopupMenu; LLMenuGL* mPopupMenu;
}; };

View File

@@ -337,12 +337,21 @@ void LLPanelAvatarFirstLife::enableControls(BOOL self)
void show_picture(const LLUUID& id, const std::string& name); 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 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)); } 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); void show_log_browser(const std::string& name, const std::string& id);
LLAvatarName av_name; std::string name;
LLAvatarNameCache::get(id, &av_name); if (type == LFIDBearer::AVATAR)
show_log_browser(av_name.getLegacyName(), id.asString()); {
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() 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>("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>("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))); getChild<LLUICtrl>("Pay...")->setCommitCallback(boost::bind(LLAvatarActions::pay, boost::bind(&LLPanelAvatar::getAvatarID, pa)));
if (LLUICtrl* ctrl = findChild<LLUICtrl>("Mute")) if (LLUICtrl* ctrl = findChild<LLUICtrl>("Mute"))
{ {

View File

@@ -135,6 +135,7 @@
#include "llfloaternotificationsconsole.h" #include "llfloaternotificationsconsole.h"
// <edit> // <edit>
#include "jcfloaterareasearch.h"
#include "lltexteditor.h" // Initialize the text editor menu listeners in here #include "lltexteditor.h" // Initialize the text editor menu listeners in here
#include "llfloatermessagelog.h" #include "llfloatermessagelog.h"
#include "shfloatermediaticker.h" #include "shfloatermediaticker.h"
@@ -9041,9 +9042,38 @@ template<typename T> T* get_focused()
return t; 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) 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) const LLWString get_wslurl_for(const LLUUID& id, const LFIDBearer::Type& type)
@@ -9193,10 +9223,19 @@ class ListCopyNames : public view_listener_t
return ret; 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) bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{ {
LLWString str; 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); if (!str.empty()) LLView::getWindow()->copyTextToClipboard(str);
return true; return true;
} }
@@ -9287,13 +9326,13 @@ bool can_show_web_profile()
return !gSavedSettings.getString("WebProfileURL").empty(); 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 class ListShowLog : public view_listener_t
{ {
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{ {
for (const LLUUID& id : LFIDBearer::getActiveSelectedIDs()) for (const LLUUID& id : LFIDBearer::getActiveSelectedIDs())
show_log_browser(id); show_log_browser(id, LFIDBearer::getActiveType());
return true; return true;
} }
}; };
@@ -9306,6 +9345,7 @@ class ListShowProfile : public view_listener_t
{ {
case LFIDBearer::AVATAR: LLAvatarActions::showProfiles(LFIDBearer::getActiveSelectedIDs()); break; case LFIDBearer::AVATAR: LLAvatarActions::showProfiles(LFIDBearer::getActiveSelectedIDs()); break;
case LFIDBearer::GROUP: LLGroupActions::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; default: break;
} }
return true; return true;
@@ -9403,7 +9443,7 @@ class ListIsNearby : public view_listener_t
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{ {
const auto&& id = LFIDBearer::getActiveSelectedID(); const auto&& id = LFIDBearer::getActiveSelectedID();
gMenuHolder->findControl(userdata["control"].asString())->setValue(LFIDBearer::getActiveType() == LFIDBearer::OBJECT ? gObjectList.findObject(id) : is_nearby(id)); gMenuHolder->findControl(userdata["control"].asString())->setValue(LFIDBearer::getActiveType() == LFIDBearer::OBJECT ? !!gObjectList.findObject(id) : is_nearby(id));
return true; 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 class MediaCtrlCopyURL : public view_listener_t
{ {
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -9975,6 +10024,7 @@ void initialize_menus()
addMenu(new ListLeave, "List.Leave"); addMenu(new ListLeave, "List.Leave");
addMenu(new ListJoin, "List.Join"); addMenu(new ListJoin, "List.Join");
addMenu(new ListActivate, "List.Activate"); addMenu(new ListActivate, "List.Activate");
addMenu(new ListObjectCamTo, "List.Object.CamTo");
add_radar_listeners(); add_radar_listeners();

View File

@@ -25,7 +25,6 @@
<menu_item_call label="Focus Next" name="Focus Next"/> <menu_item_call label="Focus Next" name="Focus Next"/>
<menu_item_call label="Focus Previous" name="Focus Previous"/> <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 Next Marked" name="Focus Next Marked"/>
<menu_item_call label="Focus Previous Marked" name="Focus Previous Marked"/> <menu_item_call label="Focus Previous Marked" name="Focus Previous Marked"/>
</menu> </menu>

View File

@@ -33,7 +33,7 @@
<scroll_list name="result_list" <scroll_list name="result_list"
left="10" right="-10" top="-103" bottom="32" left="10" right="-10" top="-103" bottom="32"
follows="left|top|bottom|right" can_resize="true" 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="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="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"/> <column name="Owner" label="Owner" dynamicwidth="true" tool_tip="Double click on any entry to get a position beacon"/>

View File

@@ -30,8 +30,8 @@
<string name="focus" value="Focus"/> <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="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="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_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="50" name="start_call_btn" width="80"/> <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"/> <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"> <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"/> <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"/>

View File

@@ -19,6 +19,11 @@
<on_enable function="List.EnableSingleSelected"/> <on_enable function="List.EnableSingleSelected"/>
<on_visible function="List.IsInGroup"/> <on_visible function="List.IsInGroup"/>
</menu_item_call> </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"> <menu_item_call label="Join Group" name="join_group">
<on_click function="List.Join"/> <on_click function="List.Join"/>
<on_visible function="List.NotInGroup"/> <on_visible function="List.NotInGroup"/>

View File

@@ -87,7 +87,6 @@
<on_click function="StopTracking" /> <on_click function="StopTracking" />
<on_visible function="IsTracking" /> <on_visible function="IsTracking" />
</menu_item_call> </menu_item_call>
<menu name="avs_menu" label="Selected Avatars" filename="menu_local_avs.xml">
<menu name="Mark" label="Mark"> <menu name="Mark" label="Mark">
<menu_item_call label="Red" name="Red"> <menu_item_call label="Red" name="Red">
<on_click function="MiniMap.setred" /> <on_click function="MiniMap.setred" />
@@ -109,7 +108,7 @@
<on_click function="MiniMap.setunmark" /> <on_click function="MiniMap.setunmark" />
<on_enable function="MiniMap.enableunmark" /> <on_enable function="MiniMap.enableunmark" />
</menu_item_call> </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"> <menu_item_check label="World Map Textures" name="World Map Textures">
<on_check control="MiniMapWorldMapTextures" /> <on_check control="MiniMapWorldMapTextures" />
<on_click function="ToggleControl" userdata="MiniMapWorldMapTextures" /> <on_click function="ToggleControl" userdata="MiniMapWorldMapTextures" />

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

View File

@@ -74,14 +74,15 @@
<menu_item_call enabled="true" hidden="false" label="Data" mouse_opaque="true" name="Data"> <menu_item_call enabled="true" hidden="false" label="Data" mouse_opaque="true" name="Data">
<on_click function="Object.Data" /> <on_click function="Object.Data" />
</menu_item_call> </menu_item_call>
<menu_item_separator /> <menu_item_call label="Go To" name="Go To">
<menu_item_separator /> <on_click function="GoToObject" />
<menu_item_separator />
<menu_item_call enabled="true" label="Reload" mouse_opaque="true" name="Reload Textures">
<on_click function="Object.ReloadTextures" />
</menu_item_call> </menu_item_call>
<menu_item_call label="Follow" name="Follow"> <menu_item_call label="Follow" name="Follow">
<on_click function="Object.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> </menu_item_call>
</pie_menu> </pie_menu>
<menu_item_call enabled="false" label="Mute" mouse_opaque="true" name="Object Mute"> <menu_item_call enabled="false" label="Mute" mouse_opaque="true" name="Object Mute">

View File

@@ -114,6 +114,27 @@
<on_click function="Radar.FocusPrev" userdata="1"/> <on_click function="Radar.FocusPrev" userdata="1"/>
</menu_item_call> </menu_item_call>
</menu> </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 label="Alerts" name="Alerts" create_jump_keys="true">
<menu_item_check label="Display alerts when an avatar" name="Display alerts in chat"> <menu_item_check label="Display alerts when an avatar" name="Display alerts in chat">
<on_click function="ToggleControl" userdata="RadarChatAlerts"/> <on_click function="ToggleControl" userdata="RadarChatAlerts"/>
@@ -189,10 +210,6 @@
</menu_item_call> </menu_item_call>
</menu> </menu>
<menu label="Hide Columns" name="Hide Columns" create_jump_keys="true"> <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"> <menu_item_check label="Position" name="Position">
<on_click function="ToggleControl" userdata="RadarColumnPositionHidden"/> <on_click function="ToggleControl" userdata="RadarColumnPositionHidden"/>
<on_check control="RadarColumnPositionHidden"/> <on_check control="RadarColumnPositionHidden"/>

View File

@@ -23,6 +23,10 @@
<on_click function="List.Activate"/> <on_click function="List.Activate"/>
<on_visible function="List.IsInGroup"/> <on_visible function="List.IsInGroup"/>
</menu_item_call> </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"> <menu_item_call label="Join Group" name="join_group">
<on_click function="List.Join"/> <on_click function="List.Join"/>
<on_visible function="List.NotInGroup"/> <on_visible function="List.NotInGroup"/>

View File

@@ -40,6 +40,10 @@
<menu_item_call.on_click <menu_item_call.on_click
function="Text.Url" userdata="Teleport" /> function="Text.Url" userdata="Teleport" />
</menu_item_call> </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"> <menu_item_call label="Follow" name="Follow">
<on_click function="List.Follow"/> <on_click function="List.Follow"/>
<on_visible function="List.IsNearby"/> <on_visible function="List.IsNearby"/>

View File

@@ -24,7 +24,6 @@
<menu_item_call label="Enfocar Siguiente" name="Focus Next"/> <menu_item_call label="Enfocar Siguiente" name="Focus Next"/>
<menu_item_call label="Enfocar Anterior" name="Focus Previous"/> <menu_item_call label="Enfocar Anterior" name="Focus Previous"/>
<menu_item_separator/> <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 Siguiente Marcado" name="Focus Next Marked"/>
<menu_item_call label="Enfocar Anterior Marcado" name="Focus Previous Marked"/> <menu_item_call label="Enfocar Anterior Marcado" name="Focus Previous Marked"/>
</menu> </menu>