update from viewer2 and merge into avp

--HG--
branch : avatar-pipeline
master
Eric M. Tulla (BigPapi) 2009-11-03 14:52:05 -05:00
commit e87975284e
121 changed files with 1736 additions and 3031 deletions

View File

@ -7,6 +7,8 @@ syntax: glob
# Emacs temp files
*~
.*.swp
#OSX image cache file
*.DS_Store
LICENSES
indra/.distcc
indra/build-darwin-*

View File

@ -0,0 +1,67 @@
# DeploySharedLibs.cmake
# This is a script to be run at build time! Its not part of the cmake configuration!
# See indra/cmake/LLSharedLibs.cmake for a macro that simplifies adding a command to a target to run this script.
# This script requires a few cmake variable to be set on the command line:
# BIN_NAME= The full path the the binary to search for dependecies.
# SEARCH_DIRS= The full paths to dirs to search for dependencies.
# DST_PATH= The full path where the dependecies will be copied.
include(GetPrerequisites)
message("Getting recursive dependencies for file: ${BIN_NAME}")
set(EXCLUDE_SYSTEM 1)
set(RECURSE 1)
get_filename_component(EXE_PATH ${BIN_NAME} PATH)
get_prerequisites( ${BIN_NAME} RESULTS ${EXCLUDE_SYSTEM} ${RECURSE} "${EXE_PATH}" "${SEARCH_DIRS}" )
foreach(DEP ${RESULTS})
Message("Processing dependency: ${DEP}")
get_filename_component(DEP_FILE ${DEP} NAME)
set(DEP_FILES ${DEP_FILES} ${DEP_FILE})
endforeach(DEP)
if(DEP_FILES)
list(REMOVE_DUPLICATES DEP_FILES)
endif(DEP_FILES)
foreach(DEP_FILE ${DEP_FILES})
if(FOUND_FILES)
list(FIND FOUND_FILES ${DEP_FILE} FOUND)
else(FOUND_FILES)
set(FOUND -1)
endif(FOUND_FILES)
if(FOUND EQUAL -1)
find_path(DEP_PATH ${DEP_FILE} PATHS ${SEARCH_DIRS} NO_DEFAULT_PATH)
if(DEP_PATH)
set(FOUND_FILES ${FOUND_FILES} "${DEP_PATH}/${DEP_FILE}")
set(DEP_PATH NOTFOUND) #reset DEP_PATH for the next find_path call.
else(DEP_PATH)
set(MISSING_FILES ${MISSING_FILES} ${DEP_FILE})
endif(DEP_PATH)
endif(FOUND EQUAL -1)
endforeach(DEP_FILE)
if(MISSING_FILES)
message("Missing:")
foreach(FILE ${MISSING_FILES})
message(" ${FILE}")
endforeach(FILE)
message("Searched in:")
foreach(SEARCH_DIR ${SEARCH_DIRS})
message(" ${SEARCH_DIR}")
endforeach(SEARCH_DIR)
message(FATAL_ERROR "Failed")
endif(MISSING_FILES)
if(FOUND_FILES)
foreach(FILE ${FOUND_FILES})
get_filename_component(DST_FILE ${FILE} NAME)
set(DST_FILE "${DST_PATH}/${DST_FILE}")
message("Copying ${FILE} to ${DST_FILE}")
execute_process(
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST_FILE}
)
endforeach(FILE ${FOUND_FILES})
endif(FOUND_FILES)
message("Success!")

View File

@ -0,0 +1,31 @@
# ll_deploy_sharedlibs_command
# target_exe: the cmake target of the executable for which the shared libs will be deployed.
# search_dirs: a list of dirs to search for the dependencies
# dst_path: path to copy deps to, relative to the output location of the target_exe
macro(ll_deploy_sharedlibs_command target_exe search_dirs dst_path)
get_target_property(OUTPUT_LOCATION ${target_exe} LOCATION)
if(DARWIN)
get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE)
if(IS_BUNDLE)
get_filename_component(TARGET_FILE ${OUTPUT_LOCATION} NAME)
set(OUTPUT_PATH ${OUTPUT_LOCATION}.app/Contents/MacOS)
set(OUTPUT_LOCATION ${OUTPUT_PATH}/${TARGET_FILE})
endif(IS_BUNDLE)
else(DARWIN)
message(FATAL_ERROR "Only darwin currently supported!")
endif(DARWIN)
add_custom_command(
TARGET ${target_exe} POST_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS
"-DBIN_NAME=\"${OUTPUT_LOCATION}\""
"-DSEARCH_DIRS=\"${search_dirs}\""
"-DDST_PATH=\"${OUTPUT_PATH}/${dst_path}\""
"-P"
"${CMAKE_SOURCE_DIR}/cmake/DeploySharedLibs.cmake"
)
endmacro(ll_deploy_sharedlibs_command)

View File

@ -135,6 +135,7 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key)
res->mKey = key;
res->setInstanceName(name);
res->applyRectControl(); // Can't apply rect control until setting instance name
res->applyDockState();//same...
if (res->mAutoTile && !res->getHost() && index > 0)
{
const LLRect& cur_rect = res->getRect();

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

@ -45,6 +45,9 @@ LLTextBox::LLTextBox(const LLTextBox::Params& p)
mClickedCallback(NULL)
{}
LLTextBox::~LLTextBox()
{}
BOOL LLTextBox::handleMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = LLTextBase::handleMouseDown(x, y, mask);
@ -97,6 +100,18 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask)
return handled;
}
BOOL LLTextBox::handleHover(S32 x, S32 y, MASK mask)
{
BOOL handled = LLTextBase::handleHover(x, y, mask);
if (!handled && mClickedCallback)
{
// Clickable text boxes change the cursor to a hand
LLUI::getWindow()->setCursor(UI_CURSOR_HAND);
return TRUE;
}
return handled;
}
void LLTextBox::setText(const LLStringExplicit& text)
{
// does string argument insertion
@ -105,6 +120,11 @@ void LLTextBox::setText(const LLStringExplicit& text)
LLTextBase::setText(mText.getString());
}
void LLTextBox::setClickedCallback( boost::function<void (void*)> cb, void* userdata /*= NULL */ )
{
mClickedCallback = boost::bind(cb, userdata);
}
S32 LLTextBox::getTextPixelWidth()
{
return getContentsRect().getWidth();
@ -115,6 +135,12 @@ S32 LLTextBox::getTextPixelHeight()
return getContentsRect().getHeight();
}
LLSD LLTextBox::getValue() const
{
return LLSD(getText());
}
BOOL LLTextBox::setTextArg( const std::string& key, const LLStringExplicit& text )
{
mText.setArg(key, text);

View File

@ -33,8 +33,6 @@
#ifndef LL_LLTEXTBOX_H
#define LL_LLTEXTBOX_H
#include "v4color.h"
#include "llstring.h"
#include "lluistring.h"
#include "lltextbase.h"
@ -54,28 +52,25 @@ protected:
friend class LLUICtrlFactory;
public:
virtual ~LLTextBox() {}
virtual ~LLTextBox();
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ void setText( const LLStringExplicit& text );
/*virtual*/ void setText( const LLStringExplicit& text );
void setRightAlign() { mHAlign = LLFontGL::RIGHT; }
void setHAlign( LLFontGL::HAlign align ) { mHAlign = align; }
void setClickedCallback( boost::function<void (void*)> cb, void* userdata = NULL ){ mClickedCallback = boost::bind(cb, userdata); } // mouse down and up within button
//const LLFontGL* getFont() const { return mDefaultFont; }
//void setFont(const LLFontGL* font) { mDefaultFont = font; }
void setClickedCallback( boost::function<void (void*)> cb, void* userdata = NULL );
void reshapeToFitText();
//const std::string& getText() const { return mText.getString(); }
S32 getTextPixelWidth();
S32 getTextPixelHeight();
virtual LLSD getValue() const { return LLSD(getText()); }
virtual BOOL setTextArg( const std::string& key, const LLStringExplicit& text );
/*virtual*/ LLSD getValue() const;
/*virtual*/ BOOL setTextArg( const std::string& key, const LLStringExplicit& text );
protected:
void onUrlLabelUpdated(const std::string &url, const std::string &label);

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

@ -10,6 +10,7 @@ include(LLMessage)
include(LLVFS)
include(LLXML)
include(Linking)
include(LLSharedLibs)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
@ -74,3 +75,7 @@ add_custom_command(
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-crash-logger.app/Contents/Resources/CrashReporter.nib
)
ll_deploy_sharedlibs_command(
mac-crash-logger
"${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR};${ARCH_PREBUILT_DIRS}"
"../Resources")

View File

@ -77,3 +77,7 @@ add_custom_command(
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-updater.app/Contents/Resources/AutoUpdater.nib
)
ll_deploy_sharedlibs_command(
mac-updater
"${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR};${ARCH_PREBUILT_DIRS}"
"../Resources")

View File

@ -52,7 +52,7 @@ class MediaPluginExample :
private:
bool init();
void update( int milliseconds );
void update( F64 milliseconds );
void write_pixel( int x, int y, unsigned char r, unsigned char g, unsigned char b );
bool mFirstTime;
@ -276,7 +276,7 @@ void MediaPluginExample::receiveMessage( const char* message_string )
if ( key == ' ')
{
mLastUpdateTime = 0;
update( 0 );
update( 0.0f );
};
};
}
@ -293,7 +293,7 @@ void MediaPluginExample::receiveMessage( const char* message_string )
mLastUpdateTime = 0;
mFirstTime = true;
mStopAction = false;
update( 0 );
update( 0.0f );
}
else
if ( message_name == "browse_stop" )
@ -302,7 +302,7 @@ void MediaPluginExample::receiveMessage( const char* message_string )
mXInc[ n ] = mYInc[ n ] = 0;
mStopAction = true;
update( 0 );
update( 0.0f );
}
else
{
@ -339,7 +339,7 @@ void MediaPluginExample::write_pixel( int x, int y, unsigned char r, unsigned ch
////////////////////////////////////////////////////////////////////////////////
//
void MediaPluginExample::update( int milliseconds )
void MediaPluginExample::update( F64 milliseconds )
{
if ( mWidth < 1 || mWidth > 2048 || mHeight < 1 || mHeight > 2048 )
return;

View File

@ -5294,7 +5294,6 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>PluginInstancesCPULimit</key>
<map>
<key>Comment</key>
@ -5360,6 +5359,17 @@
<string>U32</string>
<key>Value</key>
<integer>13</integer>
</map>
<key>PrimMediaControlsUseHoverControlSet</key>
<map>
<key>Comment</key>
<string>Whether or not hovering over prim media uses minimal "hover" controls or the authored control set.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>PrimMediaMaxRetries</key>
<map>

View File

@ -79,6 +79,8 @@ static const LLFlatListView::ItemReverseComparator REVERSE_NAME_COMPARATOR(NAME_
LLAvatarList::Params::Params()
: ignore_online_status("ignore_online_status", false)
, show_last_interaction_time("show_last_interaction_time", false)
, show_info_btn("show_info_btn", true)
, show_profile_btn("show_profile_btn", true)
{
}
@ -89,6 +91,9 @@ LLAvatarList::LLAvatarList(const Params& p)
, mContextMenu(NULL)
, mDirty(true) // to force initial update
, mLITUpdateTimer(NULL)
, mShowIcons(true)
, mShowInfoBtn(p.show_info_btn)
, mShowProfileBtn(p.show_profile_btn)
{
setCommitOnSelectionChange(true);
@ -253,6 +258,8 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
item->childSetVisible("info_btn", false);
item->setAvatarIconVisible(mShowIcons);
item->setShowInfoBtn(mShowInfoBtn);
item->setShowProfileBtn(mShowProfileBtn);
addItem(item, id, pos);
}

View File

@ -59,6 +59,8 @@ public:
{
Optional<bool> ignore_online_status; // show all items as online
Optional<bool> show_last_interaction_time; // show most recent interaction time. *HACK: move this to a derived class
Optional<bool> show_info_btn;
Optional<bool> show_profile_btn;
Params();
};
@ -96,6 +98,8 @@ private:
bool mShowLastInteractionTime;
bool mDirty;
bool mShowIcons;
bool mShowInfoBtn;
bool mShowProfileBtn;
LLTimer* mLITUpdateTimer; // last interaction time update timer
std::string mIconParamName;

View File

@ -42,8 +42,6 @@
#include "llavatariconctrl.h"
#include "llbutton.h"
S32 LLAvatarListItem::sIconWidth = 0;
LLAvatarListItem::LLAvatarListItem()
: LLPanel(),
mAvatarIcon(NULL),
@ -53,15 +51,17 @@ LLAvatarListItem::LLAvatarListItem()
mInfoBtn(NULL),
mProfileBtn(NULL),
mContextMenu(NULL),
mOnlineStatus(E_UNKNOWN)
mOnlineStatus(E_UNKNOWN),
mShowInfoBtn(true),
mShowProfileBtn(true)
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml");
// Remember avatar icon width including its padding from the name text box,
// so that we can hide and show the icon again later.
if (!sIconWidth)
{
sIconWidth = mAvatarName->getRect().mLeft - mAvatarIcon->getRect().mLeft;
}
mIconWidth = mAvatarName->getRect().mLeft - mAvatarIcon->getRect().mLeft;
mInfoBtnWidth = mInfoBtn->getRect().mRight - mSpeakingIndicator->getRect().mRight;
mProfileBtnWidth = mProfileBtn->getRect().mRight - mInfoBtn->getRect().mRight;
}
LLAvatarListItem::~LLAvatarListItem()
@ -116,8 +116,8 @@ BOOL LLAvatarListItem::postBuild()
void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
{
childSetVisible("hovered_icon", true);
mInfoBtn->setVisible(true);
mProfileBtn->setVisible(true);
mInfoBtn->setVisible(mShowInfoBtn);
mProfileBtn->setVisible(mShowProfileBtn);
LLPanel::onMouseEnter(x, y, mask);
}
@ -202,6 +202,34 @@ void LLAvatarListItem::setLastInteractionTime(const std::string& val)
mLastInteractionTime->setValue(val);
}
void LLAvatarListItem::setShowInfoBtn(bool show)
{
// Already done? Then do nothing.
if(mShowInfoBtn == show)
return;
mShowInfoBtn = show;
S32 width_delta = show ? - mInfoBtnWidth : mInfoBtnWidth;
//Translating speaking indicator
mSpeakingIndicator->translate(width_delta, 0);
//Reshaping avatar name
mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight());
}
void LLAvatarListItem::setShowProfileBtn(bool show)
{
// Already done? Then do nothing.
if(mShowProfileBtn == show)
return;
mShowProfileBtn = show;
S32 width_delta = show ? - mProfileBtnWidth : mProfileBtnWidth;
//Translating speaking indicator
mSpeakingIndicator->translate(width_delta, 0);
//Reshaping avatar name
mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight());
}
void LLAvatarListItem::setAvatarIconVisible(bool visible)
{
// Already done? Then do nothing.
@ -213,7 +241,7 @@ void LLAvatarListItem::setAvatarIconVisible(bool visible)
// Move the avatar name horizontally by icon size + its distance from the avatar name.
LLRect name_rect = mAvatarName->getRect();
name_rect.mLeft += visible ? sIconWidth : -sIconWidth;
name_rect.mLeft += visible ? mIconWidth : -mIconWidth;
mAvatarName->setRect(name_rect);
}

View File

@ -64,6 +64,9 @@ public:
void setName(const std::string& name);
void setAvatarId(const LLUUID& id, bool ignore_status_changes = false);
void setLastInteractionTime(const std::string& val);
//Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly
void setShowProfileBtn(bool hide);
void setShowInfoBtn(bool hide);
void setAvatarIconVisible(bool visible);
const LLUUID& getAvatarId() const;
@ -99,7 +102,13 @@ private:
LLUUID mAvatarId;
EOnlineStatus mOnlineStatus;
static S32 sIconWidth; // icon width + padding
//Flag indicating that info/profile button shouldn't be shown at all.
//Speaker indicator and avatar name coords are translated accordingly
bool mShowInfoBtn;
bool mShowProfileBtn;
S32 mIconWidth; // icon width + padding
S32 mInfoBtnWidth; //info btn width + padding
S32 mProfileBtnWidth; //profile btn width + padding
};
#endif //LL_LLAVATARLISTITEM_H

View File

@ -62,7 +62,6 @@
#include "llviewerwindow.h"
#include "llvoavatar.h"
#include "llimview.h"
#include "llimpanel.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@ -719,18 +718,8 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
// If there's an open IM session with this agent, send a notification there too.
LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id);
LLFloaterIMPanel *floater = gIMMgr->findFloaterBySession(session_id);
if (floater)
{
std::string notifyMsg = notification->getMessage();
if (!notifyMsg.empty())
{
floater->addHistoryLine(notifyMsg,LLUIColorTable::instance().getColor("SystemChatColor"));
}
}
//*TODO instead of adding IM message about online/offline status
//do something like graying avatar icon on messages from a user that went offline, and make it colored when online.
std::string notify_msg = notification->getMessage();
LLIMModel::instance().proccessOnlineOfflineNotification(session_id, notify_msg);
}
mModifyMask |= LLFriendObserver::ONLINE;

View File

@ -72,8 +72,6 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed)
BOOL LLFloaterBulkPermission::postBuild()
{
// childSetAction("help", onHelpBtn, this); // this is not in use
return TRUE;
}
@ -157,12 +155,6 @@ void LLFloaterBulkPermission::onApplyBtn()
doApply();
}
// angela -- this is not in use
//void LLFloaterBulkPermission::onHelpBtn(void* user_data)
//{
// LLNotifications::instance().add("HelpBulkPermission");
//}
void LLFloaterBulkPermission::onCloseBtn()
{
closeFloater();

View File

@ -79,7 +79,6 @@ private:
U8 key,
bool is_new);
// static void onHelpBtn(void* user_data);
void onCloseBtn();
void onApplyBtn();
void onCommitCopy();

View File

@ -105,20 +105,8 @@ LLFloaterDayCycle::~LLFloaterDayCycle()
{
}
void LLFloaterDayCycle::onClickHelp(std::string xml_alert)
{
LLNotifications::instance().add(contextualNotification(xml_alert));
}
void LLFloaterDayCycle::initHelpBtn(const std::string& name, const std::string& xml_alert)
{
getChild<LLButton>(name)->setClickedCallback(boost::bind(&LLFloaterDayCycle::onClickHelp, this, xml_alert));
}
void LLFloaterDayCycle::initCallbacks(void)
{
initHelpBtn("WLDayCycleHelp", "HelpDayCycle");
// WL Day Cycle
getChild<LLUICtrl>("WLTimeSlider")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onTimeSliderMoved, this, _1));
getChild<LLUICtrl>("WLDayCycleKeys")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onKeyTimeMoved, this, _1));

View File

@ -59,9 +59,6 @@ public:
LLFloaterDayCycle(const LLSD& key);
virtual ~LLFloaterDayCycle();
/*virtual*/ BOOL postBuild();
/// help button stuff
void onClickHelp(std::string xml_alert);
void initHelpBtn(const std::string& name, const std::string& xml_alert);
/// initialize all
void initCallbacks(void);

View File

@ -70,10 +70,6 @@ BOOL LLFloaterEnvSettings::postBuild()
syncMenu();
return TRUE;
}
void LLFloaterEnvSettings::onClickHelp()
{
LLNotifications::instance().add(contextualNotification("EnvSettingsHelpButton"));
}
void LLFloaterEnvSettings::initCallbacks(void)
{
@ -89,10 +85,8 @@ void LLFloaterEnvSettings::initCallbacks(void)
getChild<LLUICtrl>("EnvAdvancedSkyButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onOpenAdvancedSky, this));
getChild<LLUICtrl>("EnvAdvancedWaterButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onOpenAdvancedWater, this));
getChild<LLUICtrl>("EnvUseEstateTimeButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onUseEstateTime, this));
getChild<LLUICtrl>("EnvSettingsHelpButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onClickHelp, this));
}
// menu maintenance functions
void LLFloaterEnvSettings::syncMenu()

View File

@ -53,9 +53,6 @@ public:
/// initialize all the callbacks for the menu
void initCallbacks(void);
/// callback for the menus help button
void onClickHelp();
/// handle if time of day is changed
void onChangeDayTime(LLUICtrl* ctrl);

View File

@ -59,12 +59,6 @@ LLFloaterHardwareSettings::~LLFloaterHardwareSettings()
{
}
void LLFloaterHardwareSettings::onClickHelp(void* data)
{
const char* xml_alert = "HardwareSettingsHelpButton";
LLNotifications::instance().add(xml_alert);
}
void LLFloaterHardwareSettings::initCallbacks(void)
{
}

View File

@ -50,9 +50,6 @@ public:
/// initialize all the callbacks for the menu
void initCallbacks(void);
/// callback for the menus help button
static void onClickHelp(void* data);
/// OK button
static void onBtnOK( void* userdata );

View File

@ -1519,7 +1519,9 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
}
// Placeholder for name.
item_params.columns.add().font(FONT).column("name");
std::string name;
gCacheName->getFullName(owner_id, name);
item_params.columns.add().value(name).font(FONT).column("name");
object_count_str = llformat("%d", object_count);
item_params.columns.add().value(object_count_str).font(FONT).column("count");
@ -1743,7 +1745,6 @@ LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel)
mClearBtn(NULL),
mMatureCtrl(NULL),
mPushRestrictionCtrl(NULL),
mPublishHelpButton(NULL),
mParcel(parcel)
{
}
@ -1812,14 +1813,9 @@ BOOL LLPanelLandOptions::postBuild()
mMatureCtrl = getChild<LLCheckBoxCtrl>( "MatureCheck");
childSetCommitCallback("MatureCheck", onCommitAny, this);
mPublishHelpButton = getChild<LLButton>("?");
mPublishHelpButton->setClickedCallback(onClickPublishHelp, this);
if (gAgent.wantsPGOnly())
{
// Disable these buttons if they are PG (Teen) users
mPublishHelpButton->setVisible(FALSE);
mPublishHelpButton->setEnabled(FALSE);
mMatureCtrl->setVisible(FALSE);
mMatureCtrl->setEnabled(FALSE);
}
@ -1912,7 +1908,6 @@ void LLPanelLandOptions::refresh()
mClearBtn->setEnabled(FALSE);
mMatureCtrl->setEnabled(FALSE);
mPublishHelpButton->setEnabled(FALSE);
}
else
{
@ -1988,13 +1983,9 @@ void LLPanelLandOptions::refresh()
mSetBtn->setEnabled( can_change_landing_point );
mClearBtn->setEnabled( can_change_landing_point );
mPublishHelpButton->setEnabled( can_change_identity );
if (gAgent.wantsPGOnly())
{
// Disable these buttons if they are PG (Teen) users
mPublishHelpButton->setVisible(FALSE);
mPublishHelpButton->setEnabled(FALSE);
mMatureCtrl->setVisible(FALSE);
mMatureCtrl->setEnabled(FALSE);
}
@ -2247,28 +2238,6 @@ void LLPanelLandOptions::onClickClear(void* userdata)
self->refresh();
}
// static
void LLPanelLandOptions::onClickPublishHelp(void*)
{
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
LLParcel *parcel = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection()->getParcel();
llassert(region); // Region should never be null.
bool can_change_identity = region && parcel ?
LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_IDENTITY) &&
! (region->getRegionFlags() & REGION_FLAGS_BLOCK_PARCEL_SEARCH) : false;
if(! can_change_identity)
{
LLNotifications::instance().add("ClickPublishHelpLandDisabled");
}
else
{
LLNotifications::instance().add("ClickPublishHelpLand");
}
}
//---------------------------------------------------------------------------
// LLPanelLandAccess

View File

@ -320,7 +320,6 @@ private:
static void onCommitAny(LLUICtrl* ctrl, void *userdata);
static void onClickSet(void* userdata);
static void onClickClear(void* userdata);
static void onClickPublishHelp(void*);
private:
LLCheckBoxCtrl* mCheckEditObjects;
@ -345,7 +344,6 @@ private:
LLCheckBoxCtrl *mMatureCtrl;
LLCheckBoxCtrl *mPushRestrictionCtrl;
LLButton *mPublishHelpButton;
LLSafeHandle<LLParcelSelection>& mParcel;
};

View File

@ -339,7 +339,6 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.ClickDisablePopup", boost::bind(&LLFloaterPreference::onClickDisablePopup, this));
mCommitCallbackRegistrar.add("Pref.LogPath", boost::bind(&LLFloaterPreference::onClickLogPath, this));
mCommitCallbackRegistrar.add("Pref.Logging", boost::bind(&LLFloaterPreference::onCommitLogging, this));
mCommitCallbackRegistrar.add("Pref.OpenHelp", boost::bind(&LLFloaterPreference::onOpenHelp, this));
mCommitCallbackRegistrar.add("Pref.UpdateMeterText", boost::bind(&LLFloaterPreference::updateMeterText, this, _1));
mCommitCallbackRegistrar.add("Pref.HardwareSettings", boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this));
mCommitCallbackRegistrar.add("Pref.HardwareDefaults", boost::bind(&LLFloaterPreference::setHardwareDefaults, this));
@ -608,12 +607,6 @@ void LLFloaterPreference::onBtnOK()
LLPanelLogin::refreshLocation( false );
}
void LLFloaterPreference::onOpenHelp()
{
const char* xml_alert = "GraphicsPreferencesHelp";
LLNotifications::instance().add(this->contextualNotification(xml_alert));
}
// static
void LLFloaterPreference::onBtnApply( )
{
@ -1043,11 +1036,15 @@ void LLFloaterPreference::onClickSetKey()
void LLFloaterPreference::setKey(KEY key)
{
childSetValue("modifier_combo", LLKeyboard::stringFromKey(key));
// update the control right away since we no longer wait for apply
getChild<LLUICtrl>("modifier_combo")->onCommit();
}
void LLFloaterPreference::onClickSetMiddleMouse()
{
childSetValue("modifier_combo", "MiddleMouse");
// update the control right away since we no longer wait for apply
getChild<LLUICtrl>("modifier_combo")->onCommit();
}
void LLFloaterPreference::onClickSkipDialogs()

View File

@ -84,7 +84,6 @@ protected:
void onBtnOK();
void onBtnCancel();
void onBtnApply();
void onOpenHelp();
// void onClickClearCache();
void onClickBrowserClearCache();

View File

@ -179,6 +179,8 @@ BOOL LLFloaterRegionInfo::postBuild()
LLPanelRegionInfo* panel;
panel = new LLPanelRegionGeneralInfo;
mInfoPanels.push_back(panel);
panel->getCommitCallbackRegistrar().add("RegionInfo.ManageTelehub", boost::bind(&LLPanelRegionInfo::onClickManageTelehub, panel));
LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_general.xml");
mTab->addTabPanel(LLTabContainer::TabPanelParams().panel(panel).select_tab(true));
@ -544,14 +546,10 @@ void LLPanelRegionInfo::initCtrl(const std::string& name)
getChild<LLUICtrl>(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onChangeAnything, this));
}
void LLPanelRegionInfo::initHelpBtn(const std::string& name, const std::string& xml_alert)
void LLPanelRegionInfo::onClickManageTelehub()
{
getChild<LLUICtrl>(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onClickHelp, this, xml_alert));
}
void LLPanelRegionInfo::onClickHelp(std::string xml_alert)
{
LLNotifications::instance().add(xml_alert);
LLFloaterReg::hideInstance("region_info");
LLFloaterReg::showInstance("telehubs");
}
/////////////////////////////////////////////////////////////////////////////
@ -589,22 +587,10 @@ BOOL LLPanelRegionGeneralInfo::postBuild()
initCtrl("restrict_pushobject");
initCtrl("block_parcel_search_check");
initHelpBtn("terraform_help", "HelpRegionBlockTerraform");
initHelpBtn("fly_help", "HelpRegionBlockFly");
initHelpBtn("damage_help", "HelpRegionAllowDamage");
initHelpBtn("agent_limit_help", "HelpRegionAgentLimit");
initHelpBtn("object_bonus_help", "HelpRegionObjectBonus");
initHelpBtn("access_help", "HelpRegionMaturity");
initHelpBtn("restrict_pushobject_help", "HelpRegionRestrictPushObject");
initHelpBtn("land_resell_help", "HelpRegionLandResell");
initHelpBtn("parcel_changes_help", "HelpParcelChanges");
initHelpBtn("parcel_search_help", "HelpRegionSearch");
childSetAction("kick_btn", onClickKick, this);
childSetAction("kick_all_btn", onClickKickAll, this);
childSetAction("im_btn", onClickMessage, this);
// childSetAction("manage_telehub_btn", onClickManageTelehub, this);
mCommitCallbackRegistrar.add("RegionInfo.Cancel", boost::bind(&LLPanelRegionGeneralInfo::onClickManageTelehub, this));
return LLPanelRegionInfo::postBuild();
}
@ -712,11 +698,7 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L
return false;
}
void LLPanelRegionGeneralInfo::onClickManageTelehub()
{
LLFloaterReg::hideInstance("region_info");
LLFloaterReg::showInstance("telehubs");
}
// setregioninfo
// strings[0] = 'Y' - block terraform, 'N' - not
@ -809,13 +791,6 @@ BOOL LLPanelRegionDebugInfo::postBuild()
initCtrl("disable_collisions_check");
initCtrl("disable_physics_check");
initHelpBtn("disable_scripts_help", "HelpRegionDisableScripts");
initHelpBtn("disable_collisions_help", "HelpRegionDisableCollisions");
initHelpBtn("disable_physics_help", "HelpRegionDisablePhysics");
initHelpBtn("top_colliders_help", "HelpRegionTopColliders");
initHelpBtn("top_scripts_help", "HelpRegionTopScripts");
initHelpBtn("restart_help", "HelpRegionRestart");
childSetAction("choose_avatar_btn", onClickChooseAvatar, this);
childSetAction("return_btn", onClickReturn, this);
childSetAction("top_colliders_btn", onClickTopColliders, this);
@ -1182,15 +1157,6 @@ BOOL LLPanelRegionTerrainInfo::postBuild()
{
LLPanelRegionInfo::postBuild();
initHelpBtn("water_height_help", "HelpRegionWaterHeight");
initHelpBtn("terrain_raise_help", "HelpRegionTerrainRaise");
initHelpBtn("terrain_lower_help", "HelpRegionTerrainLower");
initHelpBtn("upload_raw_help", "HelpRegionUploadRaw");
initHelpBtn("download_raw_help", "HelpRegionDownloadRaw");
initHelpBtn("use_estate_sun_help", "HelpRegionUseEstateSun");
initHelpBtn("fixed_sun_help", "HelpRegionFixedSun");
initHelpBtn("bake_terrain_help", "HelpRegionBakeTerrain");
initCtrl("water_height_spin");
initCtrl("terrain_raise_spin");
initCtrl("terrain_lower_spin");
@ -2103,20 +2069,6 @@ BOOL LLPanelEstateInfo::postBuild()
getChild<LLUICtrl>("abuse_email_address")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAnything, this));
getChild<LLLineEditor>("abuse_email_address")->setKeystrokeCallback(onChangeText, this);
initHelpBtn("estate_manager_help", "HelpEstateEstateManager");
initHelpBtn("use_global_time_help", "HelpEstateUseGlobalTime");
initHelpBtn("fixed_sun_help", "HelpEstateFixedSun");
initHelpBtn("WLEditSkyHelp", "HelpEditSky");
initHelpBtn("WLEditDayCycleHelp", "HelpEditDayCycle");
initHelpBtn("externally_visible_help", "HelpEstateExternallyVisible");
initHelpBtn("allow_direct_teleport_help", "HelpEstateAllowDirectTeleport");
initHelpBtn("allow_resident_help", "HelpEstateAllowResident");
initHelpBtn("allow_group_help", "HelpEstateAllowGroup");
initHelpBtn("ban_resident_help", "HelpEstateBanResident");
initHelpBtn("abuse_email_address_help", "HelpEstateAbuseEmailAddress");
initHelpBtn("voice_chat_help", "HelpEstateVoiceChat");
// set up the use global time checkbox
getChild<LLUICtrl>("use_global_time_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeUseGlobalTime, this));
getChild<LLUICtrl>("fixed_sun_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeFixedSun, this));
@ -2694,7 +2646,6 @@ bool LLPanelEstateCovenant::estateUpdate(LLMessageSystem* msg)
// virtual
BOOL LLPanelEstateCovenant::postBuild()
{
initHelpBtn("covenant_help", "HelpEstateCovenant");
mEstateNameText = getChild<LLTextBox>("estate_name_text");
mEstateOwnerText = getChild<LLTextBox>("estate_owner_text");
mLastModifiedText = getChild<LLTextBox>("covenant_timestamp_text");

View File

@ -123,12 +123,10 @@ public:
void enableButton(const std::string& btn_name, BOOL enable = TRUE);
void disableButton(const std::string& btn_name);
void onClickManageTelehub();
protected:
void initCtrl(const std::string& name);
void initHelpBtn(const std::string& name, const std::string& xml_alert);
// Callback for all help buttons, data is name of XML alert to show.
void onClickHelp(std::string xml_alert);
// Returns TRUE if update sent and apply button should be
// disabled.
@ -152,6 +150,7 @@ protected:
class LLPanelRegionGeneralInfo : public LLPanelRegionInfo
{
public:
LLPanelRegionGeneralInfo()
: LLPanelRegionInfo() {}
@ -161,16 +160,16 @@ public:
// LLPanel
virtual BOOL postBuild();
protected:
virtual BOOL sendUpdate();
static void onClickKick(void* userdata);
static void onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata);
static void onClickKickAll(void* userdata);
bool onKickAllCommit(const LLSD& notification, const LLSD& response);
static void onClickMessage(void* userdata);
bool onMessageCommit(const LLSD& notification, const LLSD& response);
void onClickManageTelehub();
};
/////////////////////////////////////////////////////////////////////////////

View File

@ -110,23 +110,6 @@ BOOL LLFloaterWater::postBuild()
}
void LLFloaterWater::initCallbacks(void) {
// help buttons
initHelpBtn("WaterFogColorHelp", "HelpWaterFogColor");
initHelpBtn("WaterFogDensityHelp", "HelpWaterFogDensity");
initHelpBtn("WaterUnderWaterFogModHelp", "HelpUnderWaterFogMod");
initHelpBtn("WaterGlowHelp", "HelpWaterGlow");
initHelpBtn("WaterNormalScaleHelp", "HelpWaterNormalScale");
initHelpBtn("WaterFresnelScaleHelp", "HelpWaterFresnelScale");
initHelpBtn("WaterFresnelOffsetHelp", "HelpWaterFresnelOffset");
initHelpBtn("WaterBlurMultiplierHelp", "HelpWaterBlurMultiplier");
initHelpBtn("WaterScaleBelowHelp", "HelpWaterScaleBelow");
initHelpBtn("WaterScaleAboveHelp", "HelpWaterScaleAbove");
initHelpBtn("WaterNormalMapHelp", "HelpWaterNormalMap");
initHelpBtn("WaterWave1Help", "HelpWaterWave1");
initHelpBtn("WaterWave2Help", "HelpWaterWave2");
LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
getChild<LLUICtrl>("WaterFogColor")->setCommitCallback(boost::bind(&LLFloaterWater::onWaterFogColorMoved, this, _1, &param_mgr->mFogColor));
@ -173,16 +156,6 @@ void LLFloaterWater::initCallbacks(void) {
getChild<LLUICtrl>("WaterNormalMap")->setCommitCallback(boost::bind(&LLFloaterWater::onNormalMapPicked, this, _1));
}
void LLFloaterWater::onClickHelp(std::string xml_alert)
{
LLNotifications::instance().add(contextualNotification(xml_alert));
}
void LLFloaterWater::initHelpBtn(const std::string& name, const std::string& xml_alert)
{
getChild<LLButton>(name)->setClickedCallback(boost::bind(&LLFloaterWater::onClickHelp, this, xml_alert));
}
bool LLFloaterWater::newPromptCallback(const LLSD& notification, const LLSD& response)
{
std::string text = response["message"].asString();

View File

@ -59,10 +59,6 @@ public:
/// initialize all
void initCallbacks(void);
// help button stuff
void onClickHelp(std::string xml_alert);
void initHelpBtn(const std::string& name, const std::string& xml_alert);
bool newPromptCallback(const LLSD& notification, const LLSD& response);
/// general purpose callbacks for dealing with color controllers

View File

@ -119,36 +119,6 @@ BOOL LLFloaterWindLight::postBuild()
}
void LLFloaterWindLight::initCallbacks(void) {
// help buttons
initHelpBtn("WLBlueHorizonHelp", "HelpBlueHorizon");
initHelpBtn("WLHazeHorizonHelp", "HelpHazeHorizon");
initHelpBtn("WLBlueDensityHelp", "HelpBlueDensity");
initHelpBtn("WLHazeDensityHelp", "HelpHazeDensity");
initHelpBtn("WLDensityMultHelp", "HelpDensityMult");
initHelpBtn("WLDistanceMultHelp", "HelpDistanceMult");
initHelpBtn("WLMaxAltitudeHelp", "HelpMaxAltitude");
initHelpBtn("WLSunlightColorHelp", "HelpSunlightColor");
initHelpBtn("WLAmbientHelp", "HelpSunAmbient");
initHelpBtn("WLSunGlowHelp", "HelpSunGlow");
initHelpBtn("WLTimeOfDayHelp", "HelpTimeOfDay");
initHelpBtn("WLEastAngleHelp", "HelpEastAngle");
initHelpBtn("WLSceneGammaHelp", "HelpSceneGamma");
initHelpBtn("WLStarBrightnessHelp", "HelpStarBrightness");
initHelpBtn("WLCloudColorHelp", "HelpCloudColor");
initHelpBtn("WLCloudDetailHelp", "HelpCloudDetail");
initHelpBtn("WLCloudDensityHelp", "HelpCloudDensity");
initHelpBtn("WLCloudCoverageHelp", "HelpCloudCoverage");
initHelpBtn("WLCloudScaleHelp", "HelpCloudScale");
initHelpBtn("WLCloudScrollXHelp", "HelpCloudScrollX");
initHelpBtn("WLCloudScrollYHelp", "HelpCloudScrollY");
initHelpBtn("WLClassicCloudsHelp", "HelpClassicClouds");
LLWLParamManager * param_mgr = LLWLParamManager::instance();
// blue horizon
@ -237,16 +207,6 @@ void LLFloaterWindLight::initCallbacks(void) {
getChild<LLUICtrl>("WLStarAlpha")->setCommitCallback(boost::bind(&LLFloaterWindLight::onStarAlphaMoved, this, _1));
}
void LLFloaterWindLight::onClickHelp(std::string xml_alert)
{
LLNotifications::instance().add(contextualNotification(xml_alert));
}
void LLFloaterWindLight::initHelpBtn(const std::string& name, const std::string& xml_alert)
{
getChild<LLButton>(name)->setClickedCallback(boost::bind(&LLFloaterWindLight::onClickHelp, this, xml_alert));
}
bool LLFloaterWindLight::newPromptCallback(const LLSD& notification, const LLSD& response)
{
std::string text = response["message"].asString();

View File

@ -57,10 +57,6 @@ public:
/// initialize all
void initCallbacks(void);
// help button stuff
void onClickHelp(std::string alert);
void initHelpBtn(const std::string& name, const std::string& xml_alert);
bool newPromptCallback(const LLSD& notification, const LLSD& response);
/// general purpose callbacks for dealing with color controllers

View File

@ -45,6 +45,7 @@
#include "llcallingcard.h"
#include "llcombobox.h"
#include "llviewercontrol.h"
#include "llcommandhandler.h"
#include "lldraghandle.h"
#include "llfirstuse.h"
#include "llfloaterreg.h" // getTypedInstance()
@ -96,6 +97,35 @@ static const F32 SIM_COORD_DEFAULT = 128.f;
// Globals
//---------------------------------------------------------------------------
// handle secondlife:///app/worldmap/{NAME}/{COORDS} URLs
class LLWorldMapHandler : public LLCommandHandler
{
public:
// requires trusted browser to trigger
LLWorldMapHandler() : LLCommandHandler("worldmap", UNTRUSTED_THROTTLE) { }
bool handle(const LLSD& params, const LLSD& query_map,
LLMediaCtrl* web)
{
if (params.size() == 0)
{
return false;
}
const std::string region_name = params[0].asString();
S32 x = (params.size() > 1) ? params[1].asInteger() : 128;
S32 y = (params.size() > 2) ? params[2].asInteger() : 128;
S32 z = (params.size() > 3) ? params[3].asInteger() : 0;
LLFloaterWorldMap::getInstance()->trackURL(region_name, x, y, z);
LLFloaterReg::showInstance("world_map", "center");
return true;
}
};
LLWorldMapHandler gWorldMapHandler;
LLFloaterWorldMap* gFloaterWorldMap = NULL;
class LLMapInventoryObserver : public LLInventoryObserver

View File

@ -51,6 +51,7 @@
#include "llviewerwindow.h"
#include "llvoicechannel.h"
#include "lltransientfloatermgr.h"
#include "llinventorymodel.h"
@ -265,7 +266,7 @@ void LLIMFloater::draw()
}
}
LLFloater::draw();
LLTransientDockableFloater::draw();
}
@ -602,6 +603,162 @@ void LLIMFloater::processSessionUpdate(const LLSD& session_update)
}
}
BOOL LLIMFloater::handleDragAndDrop(S32 x, S32 y, MASK mask,
BOOL drop, EDragAndDropType cargo_type,
void *cargo_data, EAcceptance *accept,
std::string& tooltip_msg)
{
if (mDialog == IM_NOTHING_SPECIAL)
{
LLToolDragAndDrop::handleGiveDragAndDrop(mOtherParticipantUUID, mSessionID, drop,
cargo_type, cargo_data, accept);
}
// handle case for dropping calling cards (and folders of calling cards) onto invitation panel for invites
else if (isInviteAllowed())
{
*accept = ACCEPT_NO;
if (cargo_type == DAD_CALLINGCARD)
{
if (dropCallingCard((LLInventoryItem*)cargo_data, drop))
{
*accept = ACCEPT_YES_MULTI;
}
}
else if (cargo_type == DAD_CATEGORY)
{
if (dropCategory((LLInventoryCategory*)cargo_data, drop))
{
*accept = ACCEPT_YES_MULTI;
}
}
}
return TRUE;
}
BOOL LLIMFloater::dropCallingCard(LLInventoryItem* item, BOOL drop)
{
BOOL rv = isInviteAllowed();
if(rv && item && item->getCreatorUUID().notNull())
{
if(drop)
{
std::vector<LLUUID> ids;
ids.push_back(item->getCreatorUUID());
inviteToSession(ids);
}
}
else
{
// set to false if creator uuid is null.
rv = FALSE;
}
return rv;
}
BOOL LLIMFloater::dropCategory(LLInventoryCategory* category, BOOL drop)
{
BOOL rv = isInviteAllowed();
if(rv && category)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
LLUniqueBuddyCollector buddies;
gInventory.collectDescendentsIf(category->getUUID(),
cats,
items,
LLInventoryModel::EXCLUDE_TRASH,
buddies);
S32 count = items.count();
if(count == 0)
{
rv = FALSE;
}
else if(drop)
{
std::vector<LLUUID> ids;
ids.reserve(count);
for(S32 i = 0; i < count; ++i)
{
ids.push_back(items.get(i)->getCreatorUUID());
}
inviteToSession(ids);
}
}
return rv;
}
BOOL LLIMFloater::isInviteAllowed() const
{
return ( (IM_SESSION_CONFERENCE_START == mDialog)
|| (IM_SESSION_INVITE == mDialog) );
}
class LLSessionInviteResponder : public LLHTTPClient::Responder
{
public:
LLSessionInviteResponder(const LLUUID& session_id)
{
mSessionID = session_id;
}
void error(U32 statusNum, const std::string& reason)
{
llinfos << "Error inviting all agents to session" << llendl;
//throw something back to the viewer here?
}
private:
LLUUID mSessionID;
};
BOOL LLIMFloater::inviteToSession(const std::vector<LLUUID>& ids)
{
LLViewerRegion* region = gAgent.getRegion();
if (!region)
{
return FALSE;
}
S32 count = ids.size();
if( isInviteAllowed() && (count > 0) )
{
llinfos << "LLIMFloater::inviteToSession() - inviting participants" << llendl;
std::string url = region->getCapability("ChatSessionRequest");
LLSD data;
data["params"] = LLSD::emptyArray();
for (int i = 0; i < count; i++)
{
data["params"].append(ids[i]);
}
data["method"] = "invite";
data["session-id"] = mSessionID;
LLHTTPClient::post(
url,
data,
new LLSessionInviteResponder(
mSessionID));
}
else
{
llinfos << "LLIMFloater::inviteToSession -"
<< " no need to invite agents for "
<< mDialog << llendl;
// successful add, because everyone that needed to get added
// was added.
}
return TRUE;
}
void LLIMFloater::addTypingIndicator(const LLIMInfo* im_info)
{
// We may have lost a "stop-typing" packet, don't add it twice

View File

@ -35,11 +35,13 @@
#include "lltransientdockablefloater.h"
#include "lllogchat.h"
#include "lltooldraganddrop.h"
class LLLineEditor;
class LLPanelChatControlPanel;
class LLChatHistory;
class LLInventoryItem;
class LLInventoryCategory;
/**
* Individual IM window that appears at the bottom of the screen,
@ -90,10 +92,21 @@ public:
void processIMTyping(const LLIMInfo* im_info, BOOL typing);
void processSessionUpdate(const LLSD& session_update);
BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
BOOL drop, EDragAndDropType cargo_type,
void *cargo_data, EAcceptance *accept,
std::string& tooltip_msg);
private:
// process focus events to set a currently active session
/* virtual */ void onFocusLost();
/* virtual */ void onFocusReceived();
BOOL dropCallingCard(LLInventoryItem* item, BOOL drop);
BOOL dropCategory(LLInventoryCategory* category, BOOL drop);
BOOL isInviteAllowed() const;
BOOL inviteToSession(const std::vector<LLUUID>& agent_ids);
static void onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata );
static void onInputEditorFocusLost(LLFocusableElement* caller, void* userdata);

View File

@ -89,9 +89,6 @@ LLIMMgr* gIMMgr = NULL;
const static std::string IM_SEPARATOR(": ");
std::map<LLUUID, LLIMModel::LLIMSession*> LLIMModel::sSessionsMap;
void toast_callback(const LLSD& msg){
// do not show toast in busy mode or it goes from agent
@ -105,7 +102,13 @@ void toast_callback(const LLSD& msg){
{
return;
}
// Skip toasting for system messages
if (msg["from_id"].asUUID() == LLUUID::null)
{
return;
}
LLSD args;
args["MESSAGE"] = msg["message"];
args["TIME"] = msg["time"];
@ -232,6 +235,12 @@ void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& f
message["index"] = (LLSD::Integer)mMsgs.size();
mMsgs.push_front(message);
if (mSpeakers && from_id.notNull())
{
mSpeakers->speakerChatted(from_id);
mSpeakers->setSpeakerTyping(from_id, FALSE);
}
}
void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata)
@ -252,12 +261,11 @@ void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const
LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const
{
return get_if_there(LLIMModel::instance().sSessionsMap, session_id,
return get_if_there(mId2SessionMap, session_id,
(LLIMModel::LLIMSession*) NULL);
}
//*TODO change name to represent session initialization aspect (IB)
void LLIMModel::updateSessionID(const LLUUID& old_session_id, const LLUUID& new_session_id)
void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
{
LLIMSession* session = findIMSession(old_session_id);
if (session)
@ -266,8 +274,8 @@ void LLIMModel::updateSessionID(const LLUUID& old_session_id, const LLUUID& new_
if (old_session_id != new_session_id)
{
sSessionsMap.erase(old_session_id);
sSessionsMap[new_session_id] = session;
mId2SessionMap.erase(old_session_id);
mId2SessionMap[new_session_id] = session;
gIMMgr->notifyObserverSessionIDUpdated(old_session_id, new_session_id);
}
@ -316,14 +324,14 @@ void LLIMModel::testMessages()
bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
{
if (is_in_map(sSessionsMap, session_id))
if (findIMSession(session_id))
{
llwarns << "IM Session " << session_id << " already exists" << llendl;
return false;
}
LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids);
sSessionsMap[session_id] = session;
mId2SessionMap[session_id] = session;
LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id);
@ -333,9 +341,9 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co
bool LLIMModel::clearSession(const LLUUID& session_id)
{
if (sSessionsMap.find(session_id) == sSessionsMap.end()) return false;
delete (sSessionsMap[session_id]);
sSessionsMap.erase(session_id);
if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false;
delete (mId2SessionMap[session_id]);
mId2SessionMap.erase(session_id);
return true;
}
@ -383,7 +391,6 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from,
return true;
}
//*TODO rewrite chat history persistence using LLSD serialization (IB)
bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
{
S32 im_log_option = gSavedPerAccountSettings.getS32("IMLogOptions");
@ -403,6 +410,23 @@ bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, con
return false;
}
bool LLIMModel::proccessOnlineOfflineNotification(
const LLUUID& session_id,
const std::string& utf8_text)
{
// Add message to old one floater
LLFloaterIMPanel *floater = gIMMgr->findFloaterBySession(session_id);
if ( floater )
{
if ( !utf8_text.empty() )
{
floater->addHistoryLine(utf8_text, LLUIColorTable::instance().getColor("SystemChatColor"));
}
}
// Add system message to history
return addMessage(session_id, SYSTEM_FROM, LLUUID::null, utf8_text);
}
bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
const std::string& utf8_text, bool log2file /* = true */) {
LLIMSession* session = findIMSession(session_id);
@ -547,8 +571,7 @@ void LLIMModel::sendLeaveSession(const LLUUID& session_id, const LLUUID& other_p
}
}
//*TODO update list of messages in a LLIMSession (IB)
//*TODO this method is better be moved to the LLIMMgr
void LLIMModel::sendMessage(const std::string& utf8_text,
const LLUUID& im_session_id,
const LLUUID& other_participant_id,
@ -1443,14 +1466,6 @@ void LLIMMgr::addMessage(
else
{
floater->addHistoryLine(msg, color, true, other_participant_id, from); // Insert linked name to front of message
//*TODO consider moving that speaker management stuff into model (IB)
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(new_session_id);
if (speaker_mgr)
{
speaker_mgr->speakerChatted(gAgentID);
speaker_mgr->setSpeakerTyping(gAgentID, FALSE);
}
}
LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg);
@ -1516,7 +1531,7 @@ S32 LLIMMgr::getNumberOfUnreadIM()
std::map<LLUUID, LLIMModel::LLIMSession*>::iterator it;
S32 num = 0;
for(it = LLIMModel::sSessionsMap.begin(); it != LLIMModel::sSessionsMap.end(); ++it)
for(it = LLIMModel::getInstance()->mId2SessionMap.begin(); it != LLIMModel::getInstance()->mId2SessionMap.end(); ++it)
{
num += (*it).second->mNumUnread;
}
@ -1582,7 +1597,9 @@ LLUUID LLIMMgr::addSession(
LLUUID session_id = computeSessionID(dialog,other_participant_id);
if (!LLIMModel::getInstance()->findIMSession(session_id))
bool new_session = !LLIMModel::getInstance()->findIMSession(session_id);
if (new_session)
{
LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);
}
@ -1604,6 +1621,9 @@ LLUUID LLIMMgr::addSession(
ids);
}
//we don't need to show notes about online/offline, mute/unmute users' statuses for existing sessions
if (!new_session) return session_id;
noteOfflineUsers(session_id, floater, ids);
// Only warn for regular IMs - not group IMs
@ -1612,8 +1632,6 @@ LLUUID LLIMMgr::addSession(
noteMutedUsers(session_id, floater, ids);
}
return session_id;
}
@ -2013,7 +2031,7 @@ void LLIMMgr::noteOfflineUsers(
{
const LLRelationship* info = NULL;
LLAvatarTracker& at = LLAvatarTracker::instance();
LLIMModel* im_model = LLIMModel::getInstance();
LLIMModel& im_model = LLIMModel::instance();
for(S32 i = 0; i < count; ++i)
{
info = at.getBuddyInfo(ids.get(i));
@ -2024,13 +2042,7 @@ void LLIMMgr::noteOfflineUsers(
LLUIString offline = LLTrans::getString("offline_message");
offline.setArg("[FIRST]", first);
offline.setArg("[LAST]", last);
if (floater)
{
floater->addHistoryLine(offline, LLUIColorTable::instance().getColor("SystemChatColor"));
}
im_model->addMessage(session_id, SYSTEM_FROM, LLUUID::null, offline);
im_model.proccessOnlineOfflineNotification(session_id, offline);
}
}
}
@ -2122,7 +2134,7 @@ public:
{
session_id = body["session_id"].asUUID();
LLIMModel::getInstance()->updateSessionID(temp_session_id, session_id);
LLIMModel::getInstance()->processSessionInitializedReply(temp_session_id, session_id);
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
if (speaker_mgr)

View File

@ -92,8 +92,8 @@ public:
void resetActiveSessionID() { mActiveSessionID.setNull(); }
LLUUID getActiveSessionID() { return mActiveSessionID; }
//*TODO make it non-static as LLIMMOdel is a singleton (IB)
static std::map<LLUUID, LLIMSession*> sSessionsMap; //mapping session_id to session
/** Session id to session object */
std::map<LLUUID, LLIMSession*> mId2SessionMap;
typedef boost::signals2::signal<void(const LLSD&)> session_signal_t;
typedef boost::function<void(const LLSD&)> session_callback_t;
@ -109,7 +109,7 @@ public:
/**
* Rebind session data to a new session id.
*/
void updateSessionID(const LLUUID& old_session_id, const LLUUID& new_session_id);
void processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id);
boost::signals2::connection addNewMsgCallback( session_callback_t cb ) { return mNewMsgSignal.connect(cb); }
boost::signals2::connection addNoUnreadMsgsCallback( session_callback_t cb ) { return mNoUnreadMsgsSignal.connect(cb); }
@ -136,7 +136,12 @@ public:
* It sends new message signal for each added message.
*/
bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true);
/**
* Add a system message to an IM Model
*/
bool proccessOnlineOfflineNotification(const LLUUID& session_id, const std::string& utf8_text);
/**
* Get a session's name.
* For a P2P chat - it's an avatar's name,

View File

@ -107,9 +107,12 @@ private:
void onClickPay();
void onClickBlock();
void onClickReport();
void onClickFreeze();
void onClickEject();
void onClickZoomIn();
void onClickFindOnMap();
bool onVisibleFindOnMap();
bool onVisibleFreezeEject();
void onClickMuteVolume();
void onVolumeChange(const LLSD& data);
@ -190,11 +193,16 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup", boost::bind(&LLInspectAvatar::onClickInviteToGroup, this));
mCommitCallbackRegistrar.add("InspectAvatar.Pay", boost::bind(&LLInspectAvatar::onClickPay, this));
mCommitCallbackRegistrar.add("InspectAvatar.Block", boost::bind(&LLInspectAvatar::onClickBlock, this));
mCommitCallbackRegistrar.add("InspectAvatar.Freeze",
boost::bind(&LLInspectAvatar::onClickFreeze, this));
mCommitCallbackRegistrar.add("InspectAvatar.Eject",
boost::bind(&LLInspectAvatar::onClickEject, this));
mCommitCallbackRegistrar.add("InspectAvatar.Report", boost::bind(&LLInspectAvatar::onClickReport, this));
mCommitCallbackRegistrar.add("InspectAvatar.FindOnMap", boost::bind(&LLInspectAvatar::onClickFindOnMap, this));
mCommitCallbackRegistrar.add("InspectAvatar.ZoomIn", boost::bind(&LLInspectAvatar::onClickZoomIn, this));
mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap", boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this));
mVisibleCallbackRegistrar.add("InspectAvatar.VisibleFreezeEject",
boost::bind(&LLInspectAvatar::onVisibleFreezeEject, this));
// can't make the properties request until the widgets are constructed
// as it might return immediately, so do it in postBuild.
@ -437,13 +445,13 @@ void LLInspectAvatar::nameUpdatedCallback(
void LLInspectAvatar::onClickAddFriend()
{
LLAvatarActions::requestFriendshipDialog(mAvatarID, mAvatarName);
closeFloater();
}
void LLInspectAvatar::onClickViewProfile()
{
// hide inspector when showing profile
setFocus(FALSE);
LLAvatarActions::showProfile(mAvatarID);
closeFloater();
}
bool LLInspectAvatar::onVisibleFindOnMap()
@ -451,24 +459,33 @@ bool LLInspectAvatar::onVisibleFindOnMap()
return gAgent.isGodlike() || is_agent_mappable(mAvatarID);
}
bool LLInspectAvatar::onVisibleFreezeEject()
{
return enable_freeze_eject( LLSD(mAvatarID) );
}
void LLInspectAvatar::onClickIM()
{
LLAvatarActions::startIM(mAvatarID);
closeFloater();
}
void LLInspectAvatar::onClickTeleport()
{
LLAvatarActions::offerTeleport(mAvatarID);
closeFloater();
}
void LLInspectAvatar::onClickInviteToGroup()
{
LLAvatarActions::inviteToGroup(mAvatarID);
closeFloater();
}
void LLInspectAvatar::onClickPay()
{
LLAvatarActions::pay(mAvatarID);
closeFloater();
}
void LLInspectAvatar::onClickBlock()
@ -476,11 +493,25 @@ void LLInspectAvatar::onClickBlock()
LLMute mute(mAvatarID, mAvatarName, LLMute::AGENT);
LLMuteList::getInstance()->add(mute);
LLPanelBlockedList::showPanelAndSelect(mute.mID);
closeFloater();
}
void LLInspectAvatar::onClickReport()
{
LLFloaterReporter::showFromObject(mAvatarID);
closeFloater();
}
void LLInspectAvatar::onClickFreeze()
{
handle_avatar_freeze( LLSD(mAvatarID) );
closeFloater();
}
void LLInspectAvatar::onClickEject()
{
handle_avatar_eject( LLSD(mAvatarID) );
closeFloater();
}
void LLInspectAvatar::onClickZoomIn()

View File

@ -133,6 +133,33 @@ public:
}
};
// Returns true if the given inventory item is a landmark pointing to the current parcel.
// Used to find out if there is at least one landmark from current parcel.
class LLFistAgentParcelLandmark : public LLInventoryCollectFunctor
{
private:
bool mFounded;// to avoid unnecessary check
public:
LLFistAgentParcelLandmark(): mFounded(false){}
/*virtual*/ bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
{
if (mFounded || !item || item->getType() != LLAssetType::AT_LANDMARK)
return false;
LLLandmark* landmark = gLandmarkList.getAsset(item->getAssetUUID());
if (!landmark) // the landmark not been loaded yet
return false;
LLVector3d landmark_global_pos;
if (!landmark->getGlobalPos(landmark_global_pos))
return false;
mFounded = LLViewerParcelMgr::getInstance()->inAgentParcel(landmark_global_pos);
return mFounded;
}
};
static void fetch_landmarks(LLInventoryModel::cat_array_t& cats,
LLInventoryModel::item_array_t& items,
LLInventoryCollectFunctor& add)
@ -172,6 +199,16 @@ bool LLLandmarkActions::landmarkAlreadyExists()
return findLandmarkForAgentPos() != NULL;
}
//static
bool LLLandmarkActions::hasParcelLandmark()
{
LLFistAgentParcelLandmark get_first_agent_landmark;
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
fetch_landmarks(cats, items, get_first_agent_landmark);
return !items.empty();
}
// *TODO: This could be made more efficient by only fetching the FIRST
// landmark that meets the criteria

View File

@ -50,9 +50,14 @@ public:
*/
static LLInventoryModel::item_array_t fetchLandmarksByName(std::string& name, BOOL if_use_substring);
/**
* @brief Checks whether landmark exists for current parcel.
* @brief Checks whether landmark exists for current agent position.
*/
static bool landmarkAlreadyExists();
/**
* @brief Checks whether landmark exists for current parcel.
*/
static bool hasParcelLandmark();
/**
* @brief Searches landmark for global position.

View File

@ -294,6 +294,11 @@ void LLLocationInputCtrl::hideList()
BOOL LLLocationInputCtrl::handleToolTip(S32 x, S32 y, MASK mask)
{
if(mAddLandmarkBtn->parentPointInView(x,y))
{
updateAddLandmarkTooltip();
}
// Let the buttons show their tooltips.
if (LLUICtrl::handleToolTip(x, y, mask))
{
@ -602,11 +607,12 @@ void LLLocationInputCtrl::enableAddLandmarkButton(bool val)
// depending on whether current parcel has been landmarked.
void LLLocationInputCtrl::updateAddLandmarkButton()
{
bool landmark_exists = LLLandmarkActions::landmarkAlreadyExists();
enableAddLandmarkButton(!landmark_exists);
enableAddLandmarkButton(LLLandmarkActions::hasParcelLandmark());
}
void LLLocationInputCtrl::updateAddLandmarkTooltip()
{
std::string tooltip;
if(landmark_exists)
if(LLLandmarkActions::landmarkAlreadyExists())
{
tooltip = mEditLandmarkTooltip;
}

View File

@ -107,6 +107,7 @@ private:
bool findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter);
void setText(const LLStringExplicit& text);
void updateAddLandmarkButton();
void updateAddLandmarkTooltip();
void updateContextMenu();
void updateWidgetlayout();
void changeLocationPresentation();

View File

@ -77,7 +77,6 @@ private:
void onBackOrForwardButtonHeldDown(const LLSD& param);
void onForwardButtonClicked();
void onHomeButtonClicked();
void onHelpButtonClicked();
void onLocationSelection();
void onLocationPrearrange(const LLSD& data);
void onSearchCommit();

View File

@ -262,8 +262,9 @@ void LLNearbyChatScreenChannel::showToastsBottom()
toast_rect.setLeftTopAndSize(getRect().mLeft , toast_top, toast_rect.getWidth() ,toast_rect.getHeight());
toast->setRect(toast_rect);
toast->setIsHidden(false);
toast->setVisible(TRUE);
bottom = toast->getRect().mTop;
}
}

View File

@ -86,23 +86,6 @@ BOOL LLPanelGroupTab::postBuild()
return TRUE;
}
void LLPanelGroupTab::handleClickHelp()
{
// Display the help text.
std::string help_text( getHelpText() );
if ( !help_text.empty() )
{
LLSD args;
args["MESSAGE"] = help_text;
LLFloater* parent_floater = gFloaterView->getParentFloater(this);
LLNotification::Params params(parent_floater->contextualNotification("GenericAlert"));
params.substitutions(args);
LLNotifications::instance().add(params);
}
}
LLPanelGroup::LLPanelGroup()
: LLPanel(),
LLGroupMgrObserver( LLUUID() ),

View File

@ -148,12 +148,6 @@ public:
// Triggered when group information changes in the group manager.
virtual void update(LLGroupChange gc) { }
// This is the text to be displayed when a help button is pressed.
virtual std::string getHelpText() const { return mHelpText; }
// Display anything returned by getHelpText
void handleClickHelp();
// This just connects the help button callback.
virtual BOOL postBuild();
@ -171,11 +165,8 @@ public:
protected:
LLUUID mGroupID;
std::string mHelpText;
BOOL mAllowEdit;
BOOL mHasModal;
};
#endif // LL_LLPANELGROUP_H

View File

@ -361,20 +361,6 @@ void LLPanelGroupRoles::cancel()
panelp->cancel();
}
// Pass all of these messages to the currently visible sub tab.
std::string LLPanelGroupRoles::getHelpText() const
{
LLPanelGroupTab* panelp = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel();
if (panelp)
{
return panelp->getHelpText();
}
else
{
return mHelpText;
}
}
void LLPanelGroupRoles::update(LLGroupChange gc)
{
if (mGroupID.isNull()) return;

View File

@ -78,7 +78,6 @@ public:
bool onModalClose(const LLSD& notification, const LLSD& response);
// Most of these messages are just passed on to the current sub-tab.
virtual std::string getHelpText() const;
virtual void activate();
virtual void deactivate();
virtual bool needsApply(std::string& mesg);

View File

@ -54,10 +54,16 @@ void LLPanelChatControlPanel::onEndCallButtonClicked()
gIMMgr->endCall(mSessionId);
}
void LLPanelChatControlPanel::onOpenVoiceControlsClicked()
{
// TODO: implement Voice Control Panel opening
}
BOOL LLPanelChatControlPanel::postBuild()
{
childSetAction("call_btn", boost::bind(&LLPanelChatControlPanel::onCallButtonClicked, this));
childSetAction("end_call_btn", boost::bind(&LLPanelChatControlPanel::onEndCallButtonClicked, this));
childSetAction("voice_ctrls_btn", boost::bind(&LLPanelChatControlPanel::onOpenVoiceControlsClicked, this));
return TRUE;
}
@ -73,8 +79,10 @@ void LLPanelChatControlPanel::draw()
LLVoiceChannel* voice_channel = session->mVoiceChannel;
if (voice_channel && voice_enabled)
{
childSetVisible("end_call_btn", voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED);
childSetVisible("call_btn", voice_channel->getState() < LLVoiceChannel::STATE_CALL_STARTED);
bool is_call_started = ( voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED );
childSetVisible("end_call_btn", is_call_started);
childSetVisible("voice_ctrls_btn", is_call_started);
childSetVisible("call_btn", ! is_call_started);
}
bool session_initialized = session->mSessionInitialized;

View File

@ -50,6 +50,7 @@ public:
void onCallButtonClicked();
void onEndCallButtonClicked();
void onOpenVoiceControlsClicked();
virtual void setSessionId(const LLUUID& session_id) { mSessionId = session_id; }

View File

@ -70,7 +70,6 @@ BOOL LLPanelLandInfo::postBuild()
childSetAction("button subdivide land",onClickDivide,this);
childSetAction("button join land",onClickJoin,this);
childSetAction("button about land",onClickAbout,this);
childSetAction("button show owners help", onShowOwnersHelp, this);
mCheckShowOwners = getChild<LLCheckBoxCtrl>("checkbox show owners");
childSetValue("checkbox show owners", gSavedSettings.getBOOL("ShowParcelOwners"));
@ -265,8 +264,3 @@ void LLPanelLandInfo::onClickAbout(void*)
LLFloaterReg::showInstance("about_land");
}
void LLPanelLandInfo::onShowOwnersHelp(void* user_data)
{
LLNotifications::instance().add("ShowOwnersHelp");
}

View File

@ -60,7 +60,6 @@ protected:
static void onClickDivide(void*);
static void onClickJoin(void*);
static void onClickAbout(void*);
static void onShowOwnersHelp(void*);
protected:
//LLTextBox* mTextPriceLabel;

View File

@ -185,9 +185,9 @@ void LLLandmarksPanel::updateVerbs()
if (!isTabVisible())
return;
BOOL enabled = isLandmarkSelected();
mTeleportBtn->setEnabled(enabled);
mShowOnMapBtn->setEnabled(enabled);
bool landmark_selected = isLandmarkSelected();
mTeleportBtn->setEnabled(landmark_selected && isActionEnabled("teleport"));
mShowOnMapBtn->setEnabled(landmark_selected && isActionEnabled("show_on_map"));
// TODO: mantipov: Uncomment when mShareBtn is supported
// Share button should be enabled when neither a folder nor a landmark is selected

View File

@ -1,339 +1,337 @@
/**
* @file llpanelmediasettingssecurity.cpp
* @brief LLPanelMediaSettingsSecurity class implementation
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
* Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llfloaterreg.h"
#include "llpanelmediasettingssecurity.h"
#include "llpanelcontents.h"
#include "llcheckboxctrl.h"
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
#include "lluictrlfactory.h"
#include "llwindow.h"
#include "llviewerwindow.h"
#include "llsdutil.h"
#include "llselectmgr.h"
#include "llmediaentry.h"
#include "llfloaterwhitelistentry.h"
#include "llfloatermediasettings.h"
////////////////////////////////////////////////////////////////////////////////
//
LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() :
mParent( NULL )
{
// build dialog from XML
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml");
mCommitCallbackRegistrar.add("Media.whitelistAdd", boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this));
mCommitCallbackRegistrar.add("Media.whitelistDelete", boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this));
}
////////////////////////////////////////////////////////////////////////////////
//
BOOL LLPanelMediaSettingsSecurity::postBuild()
{
mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY );
mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY );
childSetAction("whitelist_add", onBtnAdd, this);
childSetAction("whitelist_del", onBtnDel, this);
setDefaultBtn("whitelist_add");
return true;
}
////////////////////////////////////////////////////////////////////////////////
// virtual
LLPanelMediaSettingsSecurity::~LLPanelMediaSettingsSecurity()
{
}
////////////////////////////////////////////////////////////////////////////////
//
void LLPanelMediaSettingsSecurity::draw()
{
// housekeeping
LLPanel::draw();
// if list is empty, disable DEL button and checkbox to enable use of list
if ( mWhiteListList->isEmpty() )
{
childSetEnabled( "whitelist_del", false );
childSetEnabled( LLMediaEntry::WHITELIST_KEY, false );
childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, false );
}
else
{
childSetEnabled( "whitelist_del", true );
childSetEnabled( LLMediaEntry::WHITELIST_KEY, true );
childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, true );
};
// if nothing is selected, disable DEL button
if ( mWhiteListList->getSelectedValue().asString().empty() )
{
childSetEnabled( "whitelist_del", false );
}
else
{
childSetEnabled( "whitelist_del", true );
};
}
////////////////////////////////////////////////////////////////////////////////
// static
void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media_settings , bool editable)
{
LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
{
if(LLFloaterMediaSettings::getInstance()->mMultipleMedia)
{
self->clearValues(self, editable);
// only show multiple
return;
}
}
else
{
if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
{
self->clearValues(self, editable);
// only show multiple
return;
}
}
std::string base_key( "" );
std::string tentative_key( "" );
struct
{
std::string key_name;
LLUICtrl* ctrl_ptr;
std::string ctrl_type;
} data_set [] =
{
{ LLMediaEntry::WHITELIST_ENABLE_KEY, self->mEnableWhiteList, "LLCheckBoxCtrl" },
{ LLMediaEntry::WHITELIST_KEY, self->mWhiteListList, "LLScrollListCtrl" },
{ "", NULL , "" }
};
for( int i = 0; data_set[ i ].key_name.length() > 0; ++i )
{
base_key = std::string( data_set[ i ].key_name );
tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX );
// TODO: CP - I bet there is a better way to do this using Boost
if ( media_settings[ base_key ].isDefined() )
{
if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
{
static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
setValue( media_settings[ base_key ].asBoolean() );
}
else
if ( data_set[ i ].ctrl_type == "LLScrollListCtrl" )
{
// get control
LLScrollListCtrl* list = static_cast< LLScrollListCtrl* >( data_set[ i ].ctrl_ptr );
list->deleteAllItems();
// points to list of white list URLs
LLSD url_list = media_settings[ base_key ];
// iterate over them and add to scroll list
LLSD::array_iterator iter = url_list.beginArray();
while( iter != url_list.endArray() )
{
// TODO: is iter guaranteed to be valid here?
std::string url = *iter;
list->addSimpleElement( url );
++iter;
};
};
data_set[ i ].ctrl_ptr->setEnabled(editable);
data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
};
};
}
////////////////////////////////////////////////////////////////////////////////
// static
void LLPanelMediaSettingsSecurity::clearValues( void* userdata , bool editable)
{
LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
self->mEnableWhiteList->clear();
self->mWhiteListList->deleteAllItems();
self->mEnableWhiteList->setEnabled(editable);
self->mWhiteListList->setEnabled(editable);
}
////////////////////////////////////////////////////////////////////////////////
// static
void LLPanelMediaSettingsSecurity::apply( void* userdata )
{
LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
// build LLSD Fragment
LLSD media_data_security;
self->getValues(media_data_security);
// this merges contents of LLSD passed in with what's there so this is ok
LLSelectMgr::getInstance()->selectionSetMediaData( media_data_security );
}
////////////////////////////////////////////////////////////////////////////////
//
void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in )
{
fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue();
// iterate over white list and extract items
std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin();
fill_me_in[LLMediaEntry::WHITELIST_KEY].clear();
while( iter != white_list_items.end() )
{
std::string white_list_url = (*iter)->getValue().asString();
fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( white_list_url );
++iter;
};
}
///////////////////////////////////////////////////////////////////////////////
// Try to make a valid URL if a fragment (
// white list list box widget and build a list to test against. Can also
const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& src_url )
{
// use LLURI to determine if we have a valid scheme
/**
* @file llpanelmediasettingssecurity.cpp
* @brief LLPanelMediaSettingsSecurity class implementation
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
* Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llfloaterreg.h"
#include "llpanelmediasettingssecurity.h"
#include "llpanelcontents.h"
#include "llcheckboxctrl.h"
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
#include "lluictrlfactory.h"
#include "llwindow.h"
#include "llviewerwindow.h"
#include "llsdutil.h"
#include "llselectmgr.h"
#include "llmediaentry.h"
#include "llfloaterwhitelistentry.h"
#include "llfloatermediasettings.h"
////////////////////////////////////////////////////////////////////////////////
//
LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() :
mParent( NULL )
{
mCommitCallbackRegistrar.add("Media.whitelistAdd", boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this));
mCommitCallbackRegistrar.add("Media.whitelistDelete", boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this));
// build dialog from XML
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml");
}
////////////////////////////////////////////////////////////////////////////////
//
BOOL LLPanelMediaSettingsSecurity::postBuild()
{
mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY );
mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY );
setDefaultBtn("whitelist_add");
return true;
}
////////////////////////////////////////////////////////////////////////////////
// virtual
LLPanelMediaSettingsSecurity::~LLPanelMediaSettingsSecurity()
{
}
////////////////////////////////////////////////////////////////////////////////
//
void LLPanelMediaSettingsSecurity::draw()
{
// housekeeping
LLPanel::draw();
// if list is empty, disable DEL button and checkbox to enable use of list
if ( mWhiteListList->isEmpty() )
{
childSetEnabled( "whitelist_del", false );
childSetEnabled( LLMediaEntry::WHITELIST_KEY, false );
childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, false );
}
else
{
childSetEnabled( "whitelist_del", true );
childSetEnabled( LLMediaEntry::WHITELIST_KEY, true );
childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, true );
};
// if nothing is selected, disable DEL button
if ( mWhiteListList->getSelectedValue().asString().empty() )
{
childSetEnabled( "whitelist_del", false );
}
else
{
childSetEnabled( "whitelist_del", true );
};
}
////////////////////////////////////////////////////////////////////////////////
// static
void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media_settings , bool editable)
{
LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
{
if(LLFloaterMediaSettings::getInstance()->mMultipleMedia)
{
self->clearValues(self, editable);
// only show multiple
return;
}
}
else
{
if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
{
self->clearValues(self, editable);
// only show multiple
return;
}
}
std::string base_key( "" );
std::string tentative_key( "" );
struct
{
std::string key_name;
LLUICtrl* ctrl_ptr;
std::string ctrl_type;
} data_set [] =
{
{ LLMediaEntry::WHITELIST_ENABLE_KEY, self->mEnableWhiteList, "LLCheckBoxCtrl" },
{ LLMediaEntry::WHITELIST_KEY, self->mWhiteListList, "LLScrollListCtrl" },
{ "", NULL , "" }
};
for( int i = 0; data_set[ i ].key_name.length() > 0; ++i )
{
base_key = std::string( data_set[ i ].key_name );
tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX );
// TODO: CP - I bet there is a better way to do this using Boost
if ( media_settings[ base_key ].isDefined() )
{
if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
{
static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
setValue( media_settings[ base_key ].asBoolean() );
}
else
if ( data_set[ i ].ctrl_type == "LLScrollListCtrl" )
{
// get control
LLScrollListCtrl* list = static_cast< LLScrollListCtrl* >( data_set[ i ].ctrl_ptr );
list->deleteAllItems();
// points to list of white list URLs
LLSD url_list = media_settings[ base_key ];
// iterate over them and add to scroll list
LLSD::array_iterator iter = url_list.beginArray();
while( iter != url_list.endArray() )
{
// TODO: is iter guaranteed to be valid here?
std::string url = *iter;
list->addSimpleElement( url );
++iter;
};
};
data_set[ i ].ctrl_ptr->setEnabled(editable);
data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
};
};
}
////////////////////////////////////////////////////////////////////////////////
// static
void LLPanelMediaSettingsSecurity::clearValues( void* userdata , bool editable)
{
LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
self->mEnableWhiteList->clear();
self->mWhiteListList->deleteAllItems();
self->mEnableWhiteList->setEnabled(editable);
self->mWhiteListList->setEnabled(editable);
}
////////////////////////////////////////////////////////////////////////////////
// static
void LLPanelMediaSettingsSecurity::apply( void* userdata )
{
LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
// build LLSD Fragment
LLSD media_data_security;
self->getValues(media_data_security);
// this merges contents of LLSD passed in with what's there so this is ok
LLSelectMgr::getInstance()->selectionSetMediaData( media_data_security );
}
////////////////////////////////////////////////////////////////////////////////
//
void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in )
{
fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue();
// iterate over white list and extract items
std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin();
fill_me_in[LLMediaEntry::WHITELIST_KEY].clear();
while( iter != white_list_items.end() )
{
std::string white_list_url = (*iter)->getValue().asString();
fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( white_list_url );
++iter;
};
}
///////////////////////////////////////////////////////////////////////////////
// Try to make a valid URL if a fragment (
// white list list box widget and build a list to test against. Can also
const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string& src_url )
{
// use LLURI to determine if we have a valid scheme
LLURI candidate_url( src_url );
if ( candidate_url.scheme().empty() )
{
// build a URL comprised of default scheme and the original fragment
const std::string default_scheme( "http://" );
return default_scheme + src_url;
// build a URL comprised of default scheme and the original fragment
const std::string default_scheme( "http://" );
return default_scheme + src_url;
};
// we *could* test the "default scheme" + "original fragment" URL again
// using LLURI to see if it's valid but I think the outcome is the same
// in either case - our only option is to return the original URL
// we *think* the original url passed in was valid
return src_url;
}
///////////////////////////////////////////////////////////////////////////////
// wrapper for testing a URL against the whitelist. We grab entries from
// white list list box widget and build a list to test against. Can also
// optionally pass the URL that you are trying to add to the widget since
// it won't be added until this call returns.
bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url,
const std::string& test_url )
{
// the checkUrlAgainstWhitelist(..) function works on a vector
// of strings for the white list entries - in this panel, the white list
// is stored in the widgets themselves so we need to build something compatible.
std::vector< std::string > whitelist_strings;
whitelist_strings.clear(); // may not be required - I forget what the spec says.
// step through whitelist widget entries and grab them as strings
std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin();
while( iter != white_list_items.end() )
{
const std::string whitelist_url = (*iter)->getValue().asString();
whitelist_strings.push_back( whitelist_url );
++iter;
};
// add in the URL that might be added to the whitelist so we can test that too
if ( added_url.length() )
whitelist_strings.push_back( added_url );
// possible the URL is just a fragment so we validize it
const std::string valid_url = makeValidUrl( test_url );
// indicate if the URL passes whitelist
return LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_strings );
}
///////////////////////////////////////////////////////////////////////////////
//
void LLPanelMediaSettingsSecurity::addWhiteListItem(const std::string& url)
{
// grab home URL from the general panel (via the parent floater)
std::string home_url( "" );
if ( mParent )
home_url = mParent->getHomeUrl();
// if the home URL is blank (user hasn't entered it yet) then
// don't bother to check if it passes the white list
if ( home_url.empty() )
{
mWhiteListList->addSimpleElement( url );
return;
};
// if the URL passes the white list, add it
if ( passesWhiteList( url, home_url ) )
{
mWhiteListList->addSimpleElement( url );
}
else
// display a message indicating you can't do that
{
LLNotifications::instance().add("WhiteListInvalidatesHomeUrl");
};
}
///////////////////////////////////////////////////////////////////////////////
// static
void LLPanelMediaSettingsSecurity::onBtnAdd( void* userdata )
{
LLFloaterReg::showInstance("whitelist_entry");
}
///////////////////////////////////////////////////////////////////////////////
// static
void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata )
{
LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
self->mWhiteListList->deleteSelectedItems();
}
// we *think* the original url passed in was valid
return src_url;
}
///////////////////////////////////////////////////////////////////////////////
// wrapper for testing a URL against the whitelist. We grab entries from
// white list list box widget and build a list to test against. Can also
// optionally pass the URL that you are trying to add to the widget since
// it won't be added until this call returns.
bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url,
const std::string& test_url )
{
// the checkUrlAgainstWhitelist(..) function works on a vector
// of strings for the white list entries - in this panel, the white list
// is stored in the widgets themselves so we need to build something compatible.
std::vector< std::string > whitelist_strings;
whitelist_strings.clear(); // may not be required - I forget what the spec says.
// step through whitelist widget entries and grab them as strings
std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin();
while( iter != white_list_items.end() )
{
const std::string whitelist_url = (*iter)->getValue().asString();
whitelist_strings.push_back( whitelist_url );
++iter;
};
// add in the URL that might be added to the whitelist so we can test that too
if ( added_url.length() )
whitelist_strings.push_back( added_url );
// possible the URL is just a fragment so we validize it
const std::string valid_url = makeValidUrl( test_url );
// indicate if the URL passes whitelist
return LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_strings );
}
///////////////////////////////////////////////////////////////////////////////
//
void LLPanelMediaSettingsSecurity::addWhiteListItem(const std::string& url)
{
// grab home URL from the general panel (via the parent floater)
std::string home_url( "" );
if ( mParent )
home_url = mParent->getHomeUrl();
// if the home URL is blank (user hasn't entered it yet) then
// don't bother to check if it passes the white list
if ( home_url.empty() )
{
mWhiteListList->addSimpleElement( url );
return;
};
// if the URL passes the white list, add it
if ( passesWhiteList( url, home_url ) )
{
mWhiteListList->addSimpleElement( url );
}
else
// display a message indicating you can't do that
{
LLNotifications::instance().add("WhiteListInvalidatesHomeUrl");
};
}
///////////////////////////////////////////////////////////////////////////////
// static
void LLPanelMediaSettingsSecurity::onBtnAdd( void* userdata )
{
LLFloaterReg::showInstance("whitelist_entry");
}
///////////////////////////////////////////////////////////////////////////////
// static
void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata )
{
LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
self->mWhiteListList->deleteSelectedItems();
}
////////////////////////////////////////////////////////////////////////////////
//
void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent )

View File

@ -289,10 +289,24 @@ const std::string& LLTaskInvFVBridge::getName() const
const std::string& LLTaskInvFVBridge::getDisplayName() const
{
LLInventoryItem* item = findItem();
if(item)
{
mDisplayName.assign(item->getName());
if(item->getParentUUID().isNull())
{
if(item->getName() == "Contents")
{
mDisplayName.assign(LLTrans::getString("ViewerObjectContents"));
}
else
{
mDisplayName.assign(item->getName());
}
}
else
{
mDisplayName.assign(item->getName());
}
const LLPermissions& perm(item->getPermissions());
BOOL copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE);
BOOL mod = gAgent.allowOperation(PERM_MODIFY, perm, GP_OBJECT_MANIPULATE);
@ -300,15 +314,15 @@ const std::string& LLTaskInvFVBridge::getDisplayName() const
if(!copy)
{
mDisplayName.append(" (no copy)");
mDisplayName.append(LLTrans::getString("no_copy"));
}
if(!mod)
{
mDisplayName.append(" (no modify)");
mDisplayName.append(LLTrans::getString("no_modify"));
}
if(!xfer)
{
mDisplayName.append(" (no transfer)");
mDisplayName.append(LLTrans::getString("no_transfer"));
}
}

View File

@ -54,6 +54,7 @@
#include "llaccordionctrltab.h"
#include "llagent.h"
#include "llagentui.h"
#include "llappviewer.h"
#include "llavatarpropertiesprocessor.h"
#include "llcallbacklist.h"
#include "llexpandabletextbox.h"
@ -1003,13 +1004,15 @@ void LLPanelPlaceInfo::updateYouAreHereBanner(void* userdata)
LLPanelPlaceInfo* self = static_cast<LLPanelPlaceInfo*>(userdata);
if(!self->getVisible())
return;
if(!gDisconnected)
{
static F32 radius = gSavedSettings.getF32("YouAreHereDistance");
static F32 radius = gSavedSettings.getF32("YouAreHereDistance");
BOOL display_banner = self->mLastSelectedRegionID == gAgent.getRegion()->getRegionID() &&
BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID &&
LLAgentUI::checkAgentDistance(self->mPosRegion, radius);
self->mYouAreHerePanel->setVisible(display_banner);
self->mYouAreHerePanel->setVisible(display_banner);
}
}
void LLPanelPlaceInfo::onForSaleBannerClick()

View File

@ -228,7 +228,10 @@ void LLPanelPrimMediaControls::updateShape()
bool can_navigate = parcel->getMediaAllowNavigate();
bool enabled = false;
bool has_focus = media_impl->hasFocus();
// There is no such thing as "has_focus" being different from normal controls set
// anymore (as of user feedback from bri 10/09). So we cheat here and force 'has_focus'
// to 'true' (or, actually, we use a setting)
bool has_focus = (gSavedSettings.getBOOL("PrimMediaControlsUseHoverControlSet")) ? media_impl->hasFocus() : true;
setVisible(enabled);
if (objectp)
@ -310,8 +313,8 @@ void LLPanelPrimMediaControls::updateShape()
fwd_ctrl->setEnabled(has_focus);
media_address_ctrl->setVisible(false);
media_address_ctrl->setEnabled(false);
media_play_slider_panel->setVisible(!mini_controls);
media_play_slider_panel->setEnabled(!mini_controls);
media_play_slider_panel->setVisible(has_focus && !mini_controls);
media_play_slider_panel->setEnabled(has_focus && !mini_controls);
volume_ctrl->setVisible(has_focus);
volume_up_ctrl->setVisible(has_focus);

View File

@ -59,17 +59,61 @@ public:
return false;
}
if (params[1].asString() == "about")
const std::string verb = params[1].asString();
if (verb == "about")
{
LLAvatarActions::showProfile(avatar_id);
return true;
}
if (params[1].asString() == "inspect")
if (verb == "inspect")
{
LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", avatar_id));
return true;
}
if (verb == "im")
{
LLAvatarActions::startIM(avatar_id);
return true;
}
if (verb == "pay")
{
LLAvatarActions::pay(avatar_id);
return true;
}
if (verb == "offerteleport")
{
LLAvatarActions::offerTeleport(avatar_id);
return true;
}
if (verb == "requestfriend")
{
LLAvatarActions::requestFriendshipDialog(avatar_id);
return true;
}
if (verb == "mute")
{
if (! LLAvatarActions::isBlocked(avatar_id))
{
LLAvatarActions::toggleBlock(avatar_id);
}
return true;
}
if (verb == "unmute")
{
if (LLAvatarActions::isBlocked(avatar_id))
{
LLAvatarActions::toggleBlock(avatar_id);
}
return true;
}
return false;
}
};

View File

@ -32,10 +32,12 @@
#include "llviewerprecompiledheaders.h"
#include "llavatarconstants.h"
#include "lluserrelations.h"
#include "llpanelprofileview.h"
#include "llavatarpropertiesprocessor.h"
#include "llcallingcard.h"
#include "llpanelavatar.h"
#include "llpanelpicks.h"
@ -48,14 +50,46 @@ static std::string PANEL_NOTES = "panel_notes";
static const std::string PANEL_PROFILE = "panel_profile";
static const std::string PANEL_PICKS = "panel_picks";
class AvatarStatusObserver : public LLAvatarPropertiesObserver
{
public:
AvatarStatusObserver(LLPanelProfileView* profile_view)
{
mProfileView = profile_view;
}
void processProperties(void* data, EAvatarProcessorType type)
{
if(APT_PROPERTIES != type) return;
const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
if(avatar_data && mProfileView->getAvatarId() == avatar_data->avatar_id)
{
mProfileView->processOnlineStatus(avatar_data->flags & AVATAR_ONLINE);
LLAvatarPropertiesProcessor::instance().removeObserver(mProfileView->getAvatarId(), this);
}
}
void subscribe()
{
LLAvatarPropertiesProcessor::instance().addObserver(mProfileView->getAvatarId(), this);
}
private:
LLPanelProfileView* mProfileView;
};
LLPanelProfileView::LLPanelProfileView()
: LLPanelProfile()
, mStatusText(NULL)
, mAvatarStatusObserver(NULL)
{
mAvatarStatusObserver = new AvatarStatusObserver(this);
}
LLPanelProfileView::~LLPanelProfileView(void)
{
delete mAvatarStatusObserver;
}
/*virtual*/
@ -66,6 +100,9 @@ void LLPanelProfileView::onOpen(const LLSD& key)
{
id = key["id"];
}
// subscribe observer to get online status. Request will be sent by LLPanelAvatarProfile itself
mAvatarStatusObserver->subscribe();
if(id.notNull() && getAvatarId() != id)
{
setAvatarId(id);
@ -74,10 +111,12 @@ void LLPanelProfileView::onOpen(const LLSD& key)
// Update the avatar name.
gCacheName->get(getAvatarId(), FALSE,
boost::bind(&LLPanelProfileView::onAvatarNameCached, this, _1, _2, _3, _4));
/*
// disable this part of code according to EXT-2022. See processOnlineStatus
// status should only show if viewer has permission to view online/offline. EXT-453
mStatusText->setVisible(isGrantedToSeeOnlineStatus());
updateOnlineStatus();
*/
LLPanelProfile::onOpen(key);
}
@ -93,6 +132,7 @@ BOOL LLPanelProfileView::postBuild()
getTabContainer()[PANEL_PROFILE]->childSetVisible("status_combo", FALSE);
mStatusText = getChild<LLTextBox>("status");
mStatusText->setVisible(false);
childSetCommitCallback("back",boost::bind(&LLPanelProfileView::onBackBtnClick,this),NULL);
@ -135,13 +175,18 @@ void LLPanelProfileView::updateOnlineStatus()
return;
bool online = relationship->isOnline();
// std::string statusName();
std::string status = getString(online ? "status_online" : "status_offline");
mStatusText->setValue(status);
}
void LLPanelProfileView::processOnlineStatus(bool online)
{
mAvatarIsOnline = online;
mStatusText->setVisible(online);
}
void LLPanelProfileView::onAvatarNameCached(const LLUUID& id, const std::string& first_name, const std::string& last_name, BOOL is_group)
{
llassert(getAvatarId() == id);
@ -155,7 +200,7 @@ void LLPanelProfileView::togglePanel(LLPanel* panel)
{
// LLPanelProfile::togglePanel shows/hides all children,
// we don't want to display online status for non friends, so re-hide it here
mStatusText->setVisible(isGrantedToSeeOnlineStatus());
mStatusText->setVisible(mAvatarIsOnline);
}
}

View File

@ -40,6 +40,7 @@
class LLPanelProfile;
class LLPanelProfileTab;
class LLTextBox;
class AvatarStatusObserver;
/**
* Panel for displaying Avatar's profile. It consists of three sub panels - Profile,
@ -49,6 +50,7 @@ class LLPanelProfileView : public LLPanelProfile
{
LOG_CLASS(LLPanelProfileView);
friend class LLUICtrlFactory;
friend class AvatarStatusObserver;
public:
@ -65,8 +67,9 @@ public:
protected:
void onBackBtnClick();
bool isGrantedToSeeOnlineStatus();
void updateOnlineStatus();
bool isGrantedToSeeOnlineStatus(); // deprecated after EXT-2022 is implemented
void updateOnlineStatus(); // deprecated after EXT-2022 is implemented
void processOnlineStatus(bool online);
private:
// LLCacheName will call this function when avatar name is loaded from server.
@ -78,6 +81,8 @@ private:
BOOL is_group);
LLTextBox* mStatusText;
AvatarStatusObserver* mAvatarStatusObserver;
bool mAvatarIsOnline;
};
#endif //LL_LLPANELPROFILEVIEW_H

View File

@ -451,7 +451,7 @@ bool LLScriptEdCore::hasChanged()
{
if (!mEditor) return false;
return !mEditor->isPristine();
return ((!mEditor->isPristine() || mEnableSave) && mHasScriptData);
}
void LLScriptEdCore::draw()

View File

@ -801,6 +801,8 @@ LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp, S32
return NULL;
}
mHoverObjects->mPrimaryObject = objectp;
objectp = objectp->getRootEdit();
// is the requested object the same as the existing hover object root?
@ -834,6 +836,11 @@ LLSelectNode *LLSelectMgr::getHoverNode()
return mHoverObjects->getFirstRootNode();
}
LLSelectNode *LLSelectMgr::getPrimaryHoverNode()
{
return mHoverObjects->mSelectNodeMap[mHoverObjects->mPrimaryObject];
}
void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp)
{
if (!objectp)

View File

@ -404,6 +404,7 @@ public:
LLObjectSelectionHandle setHoverObject(LLViewerObject *objectp, S32 face = -1);
LLSelectNode *getHoverNode();
LLSelectNode *getPrimaryHoverNode();
void highlightObjectOnly(LLViewerObject *objectp);
void highlightObjectAndFamily(LLViewerObject *objectp);

View File

@ -409,7 +409,6 @@ bool LLSysWellWindow::isWindowEmpty()
void LLSysWellWindow::sessionAdded(const LLUUID& session_id,
const std::string& name, const LLUUID& other_participant_id)
{
//*TODO get rid of get_session_value, session_id's are unique, cause performance degradation with lots chiclets (IB)
if (mMessageList->getItemByValue(session_id) == NULL)
{
S32 chicletCounter = LLIMModel::getInstance()->getNumUnread(session_id);

View File

@ -598,6 +598,9 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
static bool needs_tooltip(LLSelectNode* nodep)
{
if (!nodep)
return false;
LLViewerObject* object = nodep->getObject();
LLViewerObject *parent = (LLViewerObject *)object->getParent();
if (object->flagHandleTouch()
@ -773,7 +776,10 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
}
}
bool needs_tip = needs_tooltip(nodep);
// also check the primary node since sometimes it can have an action even though
// the root node doesn't
bool needs_tip = needs_tooltip(nodep) ||
needs_tooltip(LLSelectMgr::getInstance()->getPrimaryHoverNode());
if (show_all_object_tips || needs_tip)
{

View File

@ -582,7 +582,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
}
else
{
gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR));
gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
}
if (gRenderForSelect)

View File

@ -1189,6 +1189,17 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask)
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////////////////
std::string LLViewerMediaImpl::getName() const
{
if (mMediaSource)
{
return mMediaSource->getMediaName();
}
return LLStringUtil::null;
};
//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::navigateBack()
{

View File

@ -228,7 +228,7 @@ public:
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask) { return FALSE; };
/*virtual*/ BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask) { return FALSE; };
/*virtual*/ BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask) {return FALSE; };
/*virtual*/ std::string getName() const { return LLStringUtil::null; };
/*virtual*/ std::string getName() const;
/*virtual*/ void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const {};
/*virtual*/ void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const {};
@ -258,7 +258,7 @@ public:
void calculateInterest();
F64 getInterest() const { return mInterest; };
F64 getApproximateTextureInterest();
S32 getProximity() { return mProximity; };
S32 getProximity() const { return mProximity; };
// Mark this object as being used in a UI panel instead of on a prim
// This will be used as part of the interest sorting algorithm.

View File

@ -86,6 +86,9 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
mFocusedObjectID = objectp->getID();
mFocusedObjectFace = face;
mFocusedObjectNormal = pick_normal;
// Focusing on a media face clears its disable flag.
media_impl->setDisabled(false);
LLTextureEntry* tep = objectp->getTE(face);
if(tep->hasMedia())

View File

@ -2964,11 +2964,20 @@ bool callback_freeze(const LLSD& notification, const LLSD& response)
}
class LLAvatarFreeze : public view_listener_t
void handle_avatar_freeze(const LLSD& avatar_id)
{
bool handleEvent(const LLSD& userdata)
{
LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
// Use avatar_id if available, otherwise default to right-click avatar
LLVOAvatar* avatar = NULL;
if (avatar_id.asUUID().notNull())
{
avatar = find_avatar_from_object(avatar_id.asUUID());
}
else
{
avatar = find_avatar_from_object(
LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
}
if( avatar )
{
std::string fullname = avatar->getFullname();
@ -2992,9 +3001,7 @@ class LLAvatarFreeze : public view_listener_t
callback_freeze);
}
}
return true;
}
};
}
class LLAvatarVisibleDebug : public view_listener_t
{
@ -3004,14 +3011,6 @@ class LLAvatarVisibleDebug : public view_listener_t
}
};
class LLAvatarEnableDebug : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
return gAgent.isGodlike();
}
};
class LLAvatarDebug : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@ -3088,11 +3087,20 @@ bool callback_eject(const LLSD& notification, const LLSD& response)
return false;
}
class LLAvatarEject : public view_listener_t
void handle_avatar_eject(const LLSD& avatar_id)
{
bool handleEvent(const LLSD& userdata)
{
LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
// Use avatar_id if available, otherwise default to right-click avatar
LLVOAvatar* avatar = NULL;
if (avatar_id.asUUID().notNull())
{
avatar = find_avatar_from_object(avatar_id.asUUID());
}
else
{
avatar = find_avatar_from_object(
LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
}
if( avatar )
{
LLSD payload;
@ -3143,38 +3151,41 @@ class LLAvatarEject : public view_listener_t
}
}
}
return true;
}
};
}
class LLAvatarEnableFreezeEject : public view_listener_t
bool enable_freeze_eject(const LLSD& avatar_id)
{
bool handleEvent(const LLSD& userdata)
// Use avatar_id if available, otherwise default to right-click avatar
LLVOAvatar* avatar = NULL;
if (avatar_id.asUUID().notNull())
{
LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() );
bool new_value = (avatar != NULL);
if (new_value)
{
const LLVector3& pos = avatar->getPositionRegion();
const LLVector3d& pos_global = avatar->getPositionGlobal();
LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel();
LLViewerRegion* region = avatar->getRegion();
new_value = (region != NULL);
if (new_value)
{
new_value = region->isOwnedSelf(pos);
if (!new_value || region->isOwnedGroup(pos))
{
new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN);
}
}
}
return new_value;
avatar = find_avatar_from_object(avatar_id.asUUID());
}
};
else
{
avatar = find_avatar_from_object(
LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
}
if (!avatar) return false;
// Gods can always freeze
if (gAgent.isGodlike()) return true;
// Estate owners / managers can freeze
// Parcel owners can also freeze
const LLVector3& pos = avatar->getPositionRegion();
const LLVector3d& pos_global = avatar->getPositionGlobal();
LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel();
LLViewerRegion* region = avatar->getRegion();
if (!region) return false;
bool new_value = region->isOwnedSelf(pos);
if (!new_value || region->isOwnedGroup(pos))
{
new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN);
}
return new_value;
}
class LLAvatarGiveCard : public view_listener_t
{
@ -8022,18 +8033,18 @@ void initialize_menus()
view_listener_t::addMenu(new LLObjectMute(), "Avatar.Mute");
view_listener_t::addMenu(new LLAvatarAddFriend(), "Avatar.AddFriend");
view_listener_t::addMenu(new LLAvatarAddContact(), "Avatar.AddContact");
view_listener_t::addMenu(new LLAvatarFreeze(), "Avatar.Freeze");
commit.add("Avatar.Freeze", boost::bind(&handle_avatar_freeze, LLSD()));
view_listener_t::addMenu(new LLAvatarDebug(), "Avatar.Debug");
view_listener_t::addMenu(new LLAvatarVisibleDebug(), "Avatar.VisibleDebug");
view_listener_t::addMenu(new LLAvatarEnableDebug(), "Avatar.EnableDebug");
view_listener_t::addMenu(new LLAvatarInviteToGroup(), "Avatar.InviteToGroup");
view_listener_t::addMenu(new LLAvatarGiveCard(), "Avatar.GiveCard");
view_listener_t::addMenu(new LLAvatarEject(), "Avatar.Eject");
commit.add("Avatar.Eject", boost::bind(&handle_avatar_eject, LLSD()));
view_listener_t::addMenu(new LLAvatarSendIM(), "Avatar.SendIM");
view_listener_t::addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse");
view_listener_t::addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend");
view_listener_t::addMenu(new LLAvatarEnableFreezeEject(), "Avatar.EnableFreezeEject");
enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2));
visible.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2));
// Object pie menu
view_listener_t::addMenu(new LLObjectBuild(), "Object.Build");

View File

@ -101,6 +101,14 @@ void handle_take_copy();
void handle_look_at_selection(const LLSD& param);
void handle_zoom_to_object(LLUUID object_id);
// Takes avatar UUID, or if no UUID passed, uses last selected object
void handle_avatar_freeze(const LLSD& avatar_id);
// Takes avatar UUID, or if no UUID passed, uses last selected object
void handle_avatar_eject(const LLSD& avatar_id);
bool enable_freeze_eject(const LLSD& avatar_id);
// Can anyone take a free copy of the object?
// *TODO: Move to separate file
bool anyone_copy_selection(LLSelectNode* nodep);

View File

@ -2381,7 +2381,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
switch(chat.mChatType)
{
case CHAT_TYPE_WHISPER:
verb = "(" + LLTrans::getString("whisper") + ")";
verb = LLTrans::getString("whisper") + " ";
break;
case CHAT_TYPE_DEBUG_MSG:
case CHAT_TYPE_OWNER:
@ -2389,7 +2389,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
verb = "";
break;
case CHAT_TYPE_SHOUT:
verb = "(" + LLTrans::getString("shout") + ")";
verb = LLTrans::getString("shout") + " ";
break;
case CHAT_TYPE_START:
case CHAT_TYPE_STOP:

View File

@ -7908,6 +7908,7 @@ void LLPipeline::generateHighlight(LLCamera& camera)
mHighlight.flush();
gGL.setColorMask(true, false);
gViewerWindow->setup3DViewport();
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 332 B

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -492,6 +492,9 @@
<!--WARNING OLD ART *do not use*-->
<texture name="Banner_ForSale" file_name="Banner_ForSale.png" preload="false" />
<texture name="Banner_YouAreHere" file_name="Banner_YouAreHere.png" preload="false" />
<texture name="btn_chatbar.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0" />
<texture name="btn_chatbar_selected.tga" scale.left="20" scale.top="24" scale.right="44" scale.bottom="0" />
@ -536,15 +539,6 @@
<texture name="move_down_in.tga" preload="false" />
<texture name="move_down_out.tga" preload="false" />
<texture name="tool_grab.tga" />
<texture name="tool_grab_active.tga" />
<texture name="tool_face.tga" />
<texture name="tool_face_active.tga" />
<texture name="tool_create.tga" />
<texture name="tool_create_active.tga" />
<texture name="up_arrow.tga" file_name="up_arrow.png" />
<texture name="down_arrow.tga" file_name="down_arrow.png" />
@ -609,54 +603,6 @@
<texture name="icon_popular.tga" />
<texture name="icon_top_pick.tga" />
<texture name="inv_folder_animation.tga" />
<texture name="inv_folder_bodypart.tga" />
<texture name="inv_folder_callingcard.tga" />
<texture name="inv_folder_clothing.tga" />
<texture name="inv_folder_current_outfit.tga" />
<texture name="inv_folder_gesture.tga" />
<texture name="inv_folder_landmark.tga" />
<texture name="inv_folder_lostandfound.tga" />
<texture name="inv_folder_my_outfits.tga" />
<texture name="inv_folder_notecard.tga" />
<texture name="inv_folder_object.tga" />
<texture name="inv_folder_outfit.tga" />
<texture name="inv_folder_plain_closed.tga" />
<texture name="inv_folder_script.tga" />
<texture name="inv_folder_snapshot.tga" />
<texture name="inv_folder_sound.tga" />
<texture name="inv_folder_texture.tga" />
<texture name="inv_folder_trash.tga" />
<texture name="inv_item_animation.tga" />
<texture name="inv_item_skin.tga" />
<texture name="inv_item_callingcard_offline.tga" />
<texture name="inv_item_callingcard_online.tga" />
<texture name="inv_item_eyes.tga" />
<texture name="inv_item_gesture.tga" />
<texture name="inv_item_gloves.tga" />
<texture name="inv_item_hair.tga" />
<texture name="inv_item_jacket.tga" />
<texture name="inv_item_landmark.tga" />
<texture name="inv_item_landmark_visited.tga" />
<texture name="inv_item_linkitem.tga" />
<texture name="inv_item_linkfolder.tga" />
<texture name="inv_item_notecard.tga" />
<texture name="inv_item_object.tga" />
<texture name="inv_item_object_multi.tga" />
<texture name="inv_item_pants.tga" />
<texture name="inv_item_script.tga" />
<texture name="inv_item_shape.tga" />
<texture name="inv_item_shirt.tga" />
<texture name="inv_item_shoes.tga" />
<texture name="inv_item_skirt.tga" />
<texture name="inv_item_snapshot.tga" />
<texture name="inv_item_socks.tga" />
<texture name="inv_item_sound.tga" />
<texture name="inv_item_texture.tga" />
<texture name="inv_item_underpants.tga" />
<texture name="inv_item_undershirt.tga" />
<texture name="lag_status_critical.tga" />
<texture name="lag_status_good.tga" />
<texture name="lag_status_warning.tga" />
@ -683,37 +629,6 @@
<texture name="notify_next.png" preload="true" />
<texture name="notify_box_icon.tga" />
<texture name="object_cone.tga" />
<texture name="object_cone_active.tga" />
<texture name="object_cube.tga" />
<texture name="object_cube_active.tga" />
<texture name="object_cylinder.tga" />
<texture name="object_cylinder_active.tga" />
<texture name="object_grass.tga" />
<texture name="object_grass_active.tga" />
<texture name="object_hemi_cone.tga" />
<texture name="object_hemi_cone_active.tga" />
<texture name="object_hemi_cylinder.tga" />
<texture name="object_hemi_cylinder_active.tga" />
<texture name="object_hemi_sphere.tga" />
<texture name="object_hemi_sphere_active.tga" />
<texture name="object_prism.tga" />
<texture name="object_prism_active.tga" />
<texture name="object_pyramid.tga" />
<texture name="object_pyramid_active.tga" />
<texture name="object_ring.tga" />
<texture name="object_ring_active.tga" />
<texture name="object_sphere.tga" />
<texture name="object_sphere_active.tga" />
<texture name="object_tetrahedron.tga" />
<texture name="object_tetrahedron_active.tga" />
<texture name="object_torus.tga" />
<texture name="object_torus_active.tga" />
<texture name="object_tree.tga" />
<texture name="object_tree_active.tga" />
<texture name="object_tube.tga" />
<texture name="object_tube_active.tga" />
<texture name="pixiesmall.j2c" use_mips="true" />
<texture name="script_error.j2c" use_mips="true" />
<texture name="silhouette.j2c" use_mips="true" />
@ -729,11 +644,6 @@
<texture name="status_no_push.tga" />
<texture name="status_no_scripts.tga" />
<texture name="tool_dozer.tga" />
<texture name="tool_dozer_active.tga" />
<texture name="tool_zoom.tga" />
<texture name="tool_zoom_active.tga" />
<texture name="icn_active-speakers-dot-lvl0.tga" />
<texture name="icn_active-speakers-dot-lvl1.tga" />
<texture name="icn_active-speakers-dot-lvl2.tga" />

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
can_tear_off="false"
height="420"
layout="topleft"
@ -26,28 +25,24 @@
remaining
</floater.string>
<tab_container
follows="all"
follows="left|top|right|bottom"
height="400"
halign="center"
layout="topleft"
font="SansSerifSmall"
left="1"
tab_padding_right="5"
tab_height="20"
name="landtab"
tab_position="top"
top="20"
width="459">
<panel
<panel
border="true"
follows="all"
follows="left|top|right|bottom"
height="380"
label="General"
layout="topleft"
left="1"
help_topic="land_general_tab"
name="land_general_panel"
top="0"
top="-31"
width="458">
<panel.string
name="new users only">
@ -536,7 +531,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
</panel>
<panel
border="true"
follows="all"
follows="left|top|right|bottom"
height="380"
label="Covenant"
layout="topleft"
@ -632,7 +627,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
length="1"
enabled="false"
follows="left|top|right|bottom"
handle_edit_keys_directly="true"
handle_edit_keys_directly="true"
height="115"
layout="topleft"
left_delta="0"
@ -803,7 +798,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
</panel>
<panel
border="true"
follows="all"
follows="left|top|right|bottom"
height="380"
label="Objects"
layout="topleft"
@ -854,7 +849,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
left_delta="152"
name="objects_available"
top_delta="0"
width="212">
width="260">
[COUNT] out of [MAX] ([AVAILABLE] available)
</text>
<text
@ -875,7 +870,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
left_delta="152"
left_delta="200"
name="object_contrib_text"
top_delta="0"
width="212">
@ -899,7 +894,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
left_delta="152"
left_delta="200"
name="total_objects_text"
top_delta="0"
width="48">
@ -914,7 +909,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
left="28"
name="Owned by parcel owner:"
top="84"
width="128">
width="176">
Owned by parcel owner:
</text>
<text
@ -923,7 +918,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
left_delta="128"
left_delta="176"
name="owner_objects_text"
top_delta="0"
width="48">
@ -939,7 +934,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
label_selected="Show"
layout="topleft"
name="ShowOwner"
right="-190"
right="-140"
width="60" />
<button
bottom="100"
@ -951,7 +946,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
label_selected="Return..."
layout="topleft"
name="ReturnOwner..."
right="-60"
right="-10"
tool_tip="Return objects to their owners."
width="119" />
<text
@ -963,7 +958,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
left="28"
name="Set to group:"
top="104"
width="128">
width="176">
Set to group:
</text>
<text
@ -972,7 +967,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
left_delta="128"
left_delta="176"
name="group_objects_text"
top_delta="0"
width="48">
@ -988,7 +983,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
label_selected="Show"
layout="topleft"
name="ShowGroup"
right="-190"
right="-140"
width="60" />
<button
bottom="120"
@ -1000,7 +995,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
label_selected="Return..."
layout="topleft"
name="ReturnGroup..."
right="-60"
right="-10"
tool_tip="Return objects to their owners."
width="119" />
<text
@ -1012,7 +1007,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
left="28"
name="Owned by others:"
top="124"
width="128">
width="176">
Owned by others:
</text>
<text
@ -1021,7 +1016,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
left_delta="128"
left_delta="176"
name="other_objects_text"
top_delta="0"
width="48">
@ -1037,7 +1032,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
label_selected="Show"
layout="topleft"
name="ShowOther"
right="-190"
right="-140"
width="60" />
<button
bottom="140"
@ -1049,7 +1044,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
label_selected="Return..."
layout="topleft"
name="ReturnOther..."
right="-60"
right="-10"
tool_tip="Return objects to their owners."
width="119" />
<text
@ -1061,7 +1056,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
left="28"
name="Selected / sat upon:"
top="144"
width="128">
width="176">
Selected / sat upon:
</text>
<text
@ -1070,7 +1065,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
follows="left|top"
height="16"
layout="topleft"
left_delta="128"
left_delta="176"
name="selected_objects_text"
top_delta="0"
width="48">
@ -1097,7 +1092,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
layout="topleft"
max_length="6"
name="clean other time"
right="-100"
right="-50"
width="56" />
<text
type="string"
@ -1169,7 +1164,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
</panel>
<panel
border="true"
follows="all"
follows="left|top|right|bottom"
height="333"
label="Options"
layout="topleft"
@ -1492,16 +1487,6 @@ Only large parcels can be listed in search.
name="item12"
value="other" />
</combo_box>
<button
follows="left|top"
height="18"
label="?"
label_selected="?"
layout="topleft"
left_pad="15"
name="?"
top_delta="0"
width="18" />
<check_box
height="16"
label="Mature Content"
@ -1605,15 +1590,16 @@ Only large parcels can be listed in search.
value="Anywhere" />
</combo_box>
</panel>
<panel
<panel
border="true"
follows="all"
follows="left|top|right|bottom"
height="363"
label="Media"
layout="topleft"
left_delta="0"
help_topic="land_media_tab"
name="land_media_panel"
top_delta="1"
width="458">
<text
type="string"
@ -1624,22 +1610,24 @@ Only large parcels can be listed in search.
left="10"
name="with media:"
top="9"
width="100">
width="65">
Type:
</text>
<combo_box
height="20"
height="18"
layout="topleft"
left_pad="10"
left_pad="5"
name="media type"
tool_tip="Specify if the URL is a movie, web page, or other media"
width="150" />
top_delta="-2"
width="120" />
<text
follows="left|top"
height="16"
layout="topleft"
left_pad="10"
name="mime_type"
top_delta="2"
width="200" />
<text
type="string"
@ -1649,30 +1637,32 @@ Only large parcels can be listed in search.
layout="topleft"
left="10"
name="at URL:"
top_pad="10"
width="100">
top="29"
width="65">
Home URL:
</text>
<line_editor
bottom_delta="0"
follows="left|top"
height="20"
height="16"
layout="topleft"
left_pad="10"
left="80"
max_length="255"
name="media_url"
right="-80"
select_on_focus="true"
width="270"
/>
text_readonly_color="0.576471 0.662745 0.835294 1" />
<button
follows="left|top"
font="SansSerifSmall"
height="20"
label="Set"
label_selected="Set"
height="16"
label="Set..."
label_selected="Set..."
layout="topleft"
left_pad="5"
left_pad="8"
name="set_media_url"
width="50" />
top_delta="0"
width="60" />
<text
type="string"
length="1"
@ -1681,34 +1671,37 @@ Only large parcels can be listed in search.
layout="topleft"
left="10"
name="CurrentURL:"
top_pad="10"
width="100">
top="49"
width="65">
Current URL:
</text>
<text
follows="left|top"
height="16"
layout="topleft"
left_pad="10"
left_pad="5"
name="current_url"
width="260">http://</text>
top_delta="0"
width="300" />
<button
follows="left|top"
height="20"
label="Reset"
label_selected="Reset"
font="SansSerifSmall"
height="16"
label="Reset..."
label_selected="Reset..."
layout="topleft"
left_pad="6"
name="reset_media_url"
top_delta="0"
width="60" />
<check_box
height="16"
label="Hide URL"
layout="topleft"
left="120"
left="100"
name="hide_media_url"
tool_tip="Checking this option will hide the media url to any non-authorized viewers of this parcel information. Note this is not available for HTML types."
top_pad="2"
top="89"
width="200" />
<text
type="string"
@ -1718,20 +1711,23 @@ Only large parcels can be listed in search.
layout="topleft"
left="10"
name="Description:"
top_pad="10"
width="100">
top="49"
width="364">
Description:
</text>
<line_editor
border_style="line"
border_thickness="1"
bottom_delta="0"
follows="left|top"
height="35"
height="16"
layout="topleft"
left="80"
max_length="255"
name="url_description"
left_pad="10"
right="-80"
select_on_focus="true"
tool_tip="Text displayed next to play/load button"
top_delta="0"
width="270" />
tool_tip="Text displayed next to play/load button" />
<text
type="string"
length="1"
@ -1740,9 +1736,10 @@ Only large parcels can be listed in search.
layout="topleft"
left="10"
name="Media texture:"
top_pad="10"
width="100">
Replace Texture:
top="69"
width="364">
Replace
Texture:
</text>
<texture_picker
allow_no_texture="true"
@ -1750,7 +1747,7 @@ Only large parcels can be listed in search.
follows="left|top"
height="80"
layout="topleft"
left_pad="10"
left_delta="70"
name="media texture"
tool_tip="Click to choose a picture"
top_delta="0"
@ -1759,22 +1756,25 @@ Only large parcels can be listed in search.
type="string"
length="1"
follows="left|top"
height="50"
height="16"
layout="topleft"
left_pad="10"
left_delta="75"
name="replace_texture_help"
top_delta="0"
word_wrap="true"
width="240">
Objects using this texture will show the movie or web page after you click the play arrow.
top="85"
width="270">
Objects using this texture will show the movie or
web page after you click the play arrow.
Select the thumbnail to choose a different texture.
</text>
<check_box
height="16"
label="Auto scale"
layout="topleft"
left_delta="70"
name="media_auto_scale"
tool_tip="Checking this option will scale the content for this parcel automatically. It may be slightly slower and lower quality visually but no other texture scaling or alignment will be required."
top_pad="3"
top_delta="0"
width="200" />
<text
type="string"
@ -1782,11 +1782,11 @@ Only large parcels can be listed in search.
follows="left|top"
height="16"
layout="topleft"
left="10"
top_pad="10"
left="85"
name="media_size"
tool_tip="Size to render Web media, leave 0 for default."
width="100">
top="185"
width="85">
Size:
</text>
<spinner
@ -1798,22 +1798,12 @@ Only large parcels can be listed in search.
increment="1"
initial_value="0"
layout="topleft"
left_pad="10"
left_delta="65"
max_val="1024"
name="media_size_width"
tool_tip="Size to render Web media, leave 0 for default."
top_delta="0"
width="64" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left_pad="5"
name="pixels">
px wide
</text>
<spinner
decimal_digits="0"
enabled="false"
@ -1823,21 +1813,23 @@ Only large parcels can be listed in search.
increment="1"
initial_value="0"
layout="topleft"
left="120"
top_pad="3"
left_pad="16"
max_val="1024"
name="media_size_height"
tool_tip="Size to render Web media, leave 0 for default."
top_delta="0"
width="64" />
<text
type="string"
length="1"
bottom_delta="0"
follows="left|top"
height="16"
layout="topleft"
left_pad="5"
name="pixels">
px high
left_delta="70"
name="pixels"
right="-10">
pixels
</text>
<text
type="string"
@ -1847,15 +1839,15 @@ Only large parcels can be listed in search.
layout="topleft"
left="10"
name="Options:"
top_pad="10"
width="100">
top="237"
width="292">
Options:
</text>
<check_box
height="16"
label="Loop"
layout="topleft"
left_pad="10"
left_delta="70"
name="media_loop"
tool_tip="Play media in a loop. When the media has finished playing, it will restart from the beginning."
top_delta="0"
@ -1863,9 +1855,9 @@ Only large parcels can be listed in search.
</panel>
<panel
border="true"
follows="all"
follows="left|top|right|bottom"
height="363"
label="Sound"
label="Audio"
layout="topleft"
left_delta="0"
help_topic="land_audio_tab"
@ -1916,16 +1908,6 @@ Only large parcels can be listed in search.
name="check sound local"
top_delta="0"
width="292" />
<button
follows="left|top"
height="18"
label="?"
label_selected="?"
layout="topleft"
left_delta="292"
name="?"
top_delta="-2"
width="18" />
<text
type="string"
length="1"
@ -1967,7 +1949,7 @@ Only large parcels can be listed in search.
</panel>
<panel
border="true"
follows="all"
follows="left|top|right|bottom"
height="333"
label="Access"
layout="topleft"

View File

@ -104,9 +104,9 @@
layout="topleft"
left="10"
name="InstructSelectFriend"
top="15"
top="5"
width="200">
Select a friend(s):
Select a person:
</text>
<button
follows="top|right"

View File

@ -28,16 +28,6 @@
name="Day Cycle"
top="0"
width="642">
<button
follows="left|top"
font="SansSerifSmall"
height="15"
label="?"
layout="topleft"
left="612"
name="WLDayCycleHelp"
top="3"
width="18" />
<multi_slider
can_edit_text="true"
control_name="WLTimeSlider"

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<multi_floater
legacy_header_height="18"
can_resize="true"
follows="left|bottom"
height="422"

View File

@ -3,7 +3,7 @@
legacy_header_height="18"
background_visible="true"
follows="left|top|right|bottom"
height="250"
height="270"
layout="topleft"
left="0"
name="panel_im"
@ -17,7 +17,7 @@
min_width="200"
min_height="150">
<layout_stack follows="left|top|right|bottom"
height="235"
height="255"
width="365"
layout="topleft"
orientation="horizontal"
@ -29,11 +29,11 @@
layout="topleft"
top_delta="-3"
width="146"
height="225"
height="255"
follows="left"
label="IM Control Panel"
user_resize="false" />
<layout_panel height="235"
<layout_panel height="255"
width="200"
left_delta="146"
top="0"
@ -56,7 +56,7 @@
length="1"
follows="left|top|right|bottom"
font="SansSerif"
height="185"
height="205"
layout="topleft"
name="chat_history"
parse_highlights="true"

View File

@ -323,15 +323,6 @@
left="40"
name="server_lag_cause"
right="-32" />
<!--button
bottom="145"
follows="left|top"
height="18"
label="?"
layout="topleft"
name="server_help"
right="-10"
width="18" /-->
<button
follows="left|top"
height="20"

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
height="400"
height="430"
layout="topleft"
name="land holdings floater"
help_topic="land_holdings_floater"
title="My Land"
width="280">
title="MY LAND"
width="600">
<floater.string
name="area_string">
[AREA] m²
@ -15,81 +15,82 @@
draw_heading="true"
height="170"
layout="topleft"
left="8"
left="10"
name="parcel list"
top="24"
width="270">
top="28"
width="580">
<scroll_list.columns
label="Parcel"
name="name"
width="69" />
width="167" />
<scroll_list.columns
label="Region"
name="location"
width="74" />
width="180" />
<scroll_list.columns
label="Type"
name="type"
width="55" />
width="145" />
<scroll_list.columns
label="Area"
name="area"
width="10" />
width="88" />
<scroll_list.columns
label=""
name="hidden"
width="-1" />
</scroll_list>
<button
height="20"
font="SansSerifSmall"
height="23"
font="SansSerifBold"
label="Teleport"
label_selected="Teleport"
layout="topleft"
left_delta="4"
top="208"
left="10"
name="Teleport"
tool_tip="Teleport to the center of this land."
top_pad="4"
width="100" />
width="80" />
<button
height="20"
font="SansSerifSmall"
height="23"
font="SansSerifBold"
label="Map"
label_selected="Map"
layout="topleft"
left_pad="4"
top="208"
left="95"
name="Show on Map"
tool_tip="Show this land on the world map"
top_delta="0"
width="100" />
width="80" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
left="12"
top="251"
left="10"
name="contrib_label"
top="222"
width="480">
height="16"
width="580">
Contributions to your groups:
</text>
<scroll_list
draw_heading="true"
height="75"
layout="topleft"
left_delta="-4"
name="grant list"
top_pad="4"
width="270">
top="271"
left="10"
width="580">
<scroll_list.columns
label="Group"
name="group"
width="125" />
width="290"
left_pad="10" />
<scroll_list.columns
label="Area"
name="area"
width="125" />
width="290" />
</scroll_list>
<text
type="string"
@ -97,12 +98,11 @@
follows="left|top"
height="16"
layout="topleft"
left_delta="4"
name="allowed_label"
top_pad="4"
width="150">
Allowed land holdings at
current payment plan:
top="366"
left="10"
width="290">
Allowed land holdings at current payment plan:
</text>
<text
type="string"
@ -110,10 +110,10 @@ current payment plan:
follows="left|top"
height="16"
layout="topleft"
left_pad="5"
name="allowed_text"
top_delta="10"
width="132">
top="366"
left="305"
width="290">
[AREA] m²
</text>
<text
@ -122,10 +122,10 @@ current payment plan:
follows="left|top"
height="16"
layout="topleft"
left="12"
top="386"
left="10"
name="current_label"
top_pad="5"
width="150">
width="290">
Current land holdings:
</text>
<text
@ -134,10 +134,10 @@ current payment plan:
follows="left|top"
height="16"
layout="topleft"
left_pad="5"
top="386"
left="305"
name="current_text"
top_delta="0"
width="132">
width="290">
[AREA] m²
</text>
<text
@ -147,12 +147,11 @@ current payment plan:
font="SansSerifBold"
height="16"
layout="topleft"
left="12"
top="406"
left="10"
name="available_label"
top_pad="5"
width="150">
Available for land
purchases:
width="290">
Available for land purchases:
</text>
<text
type="string"
@ -161,10 +160,10 @@ purchases:
font="SansSerifBold"
height="16"
layout="topleft"
left_pad="5"
name="available_text"
top_delta="5"
width="140">
top="406"
left="305"
width="290">
[AREA] m²
</text>
</floater>

View File

@ -14,6 +14,7 @@
help_topic="nearby_chat"
save_rect="true"
title="Nearby Chat"
save_dock_state="true"
save_visibility="true"
single_instance="true"
width="320">

View File

@ -17,20 +17,6 @@
name="permissions"
top="20"
width="315">
<button
follows="left"
height="18"
label="?"
label_selected="?"
layout="topleft"
left="260"
name="help"
top="7"
width="22">
<button.commit_callback
function="Notification.Show"
parameter="ClickUploadHelpPermissions" />
</button>
<check_box
control_name="ShareWithGroup"
height="16"

View File

@ -75,7 +75,7 @@
left="4"
max_length="65536"
name="Notecard Editor"
allow_html="true"
allow_html="false"
handle_edit_keys_directly="true"
tab_group="1"
top="46"

View File

@ -2868,15 +2868,6 @@
tool_tip="Colorize the parcels according to the type of owner: &#10;&#10;Green = Your land &#10;Aqua = Your group&apos;s land &#10;Red = Owned by others &#10;Yellow = For sale &#10;Purple = For auction &#10;Grey = Public"
top_pad="8"
width="205" />
<!--TODO: HOOK UP TO HELP VIEWER-->
<!-- <button
image_overlay="Arrow_Right_Off"
picture_style="true"
left_pad="5"
name="button show owners help"
tool_tip="See an explanation of colors"
width="26"
height="22" />-->
<text
type="string"
length="1"

View File

@ -95,16 +95,6 @@
width="355">
Water Fog Color
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WaterFogColorHelp"
top_delta="-2"
width="18" />
<color_swatch
border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
@ -130,16 +120,6 @@
width="355">
Fog Density Exponent
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WaterFogDensityHelp"
top_delta="-2"
width="18" />
<slider
control_name="WaterFogDensity"
decimal_digits="1"
@ -165,16 +145,6 @@
width="355">
Underwater Fog Modifier
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WaterUnderWaterFogModHelp"
top_delta="-2"
width="18" />
<slider
decimal_digits="2"
follows="left"
@ -200,16 +170,6 @@
width="355">
Reflection Wavelet Scale
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WaterNormalScaleHelp"
top_delta="-2"
width="18" />
<text
type="string"
length="1"
@ -298,16 +258,6 @@
width="355">
Fresnel Scale
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WaterFresnelScaleHelp"
top_delta="-2"
width="18" />
<slider
control_name="WaterFresnelScale"
decimal_digits="2"
@ -333,16 +283,6 @@
width="355">
Fresnel Offset
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WaterFresnelOffsetHelp"
top_delta="-2"
width="18" />
<slider
control_name="WaterFresnelOffset"
decimal_digits="2"
@ -368,16 +308,6 @@
width="355">
Refract Scale Above
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WaterScaleAboveHelp"
top_delta="-2"
width="18" />
<slider
control_name="WaterScaleAbove"
decimal_digits="2"
@ -403,16 +333,6 @@
width="355">
Refract Scale Below
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WaterScaleBelowHelp"
top_delta="-2"
width="18" />
<slider
control_name="WaterScaleBelow"
decimal_digits="2"
@ -438,16 +358,6 @@
width="355">
Blur Multiplier
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WaterBlurMultiplierHelp"
top_delta="-2"
width="18" />
<slider
control_name="WaterBlurMult"
follows="left"
@ -486,16 +396,6 @@
width="355">
Big Wave Direction
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="145"
name="WaterWave1Help"
top_delta="-2"
width="18" />
<text
type="string"
length="1"
@ -563,16 +463,6 @@
width="355">
Little Wave Direction
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="145"
name="WaterWave2Help"
top_delta="-2"
width="18" />
<text
type="string"
length="1"
@ -640,16 +530,6 @@
width="355">
Normal Map
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="125"
name="WaterNormalMapHelp"
top_delta="-2"
width="18" />
<texture_picker
height="143"
layout="topleft"

View File

@ -104,16 +104,6 @@
width="355">
Blue Horizon
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLBlueHorizonHelp"
top_delta="-2"
width="18" />
<text
type="string"
length="1"
@ -227,16 +217,6 @@
width="355">
Haze Horizon
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLHazeHorizonHelp"
top_delta="-2"
width="18" />
<slider
control_name="WLHazeHorizon"
decimal_digits="2"
@ -262,16 +242,6 @@
width="355">
Blue Density
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLBlueDensityHelp"
top_delta="-2"
width="18" />
<text
type="string"
length="1"
@ -385,16 +355,6 @@
width="355">
Haze Density
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLHazeDensityHelp"
top_delta="-2"
width="18" />
<slider
control_name="WLHazeDensity"
decimal_digits="2"
@ -421,16 +381,6 @@
width="355">
Density Multiplier
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLDensityMultHelp"
top_delta="-2"
width="18" />
<slider
control_name="WLDensityMult"
decimal_digits="2"
@ -457,16 +407,6 @@
width="355">
Distance Multiplier
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLDistanceMultHelp"
top_delta="-2"
width="18" />
<slider
control_name="WLDistancMult"
decimal_digits="1"
@ -492,16 +432,6 @@
width="355">
Max Altitude
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLMaxAltitudeHelp"
top_delta="-2"
width="18" />
<slider
control_name="WLMaxAltitude"
decimal_digits="0"
@ -540,16 +470,6 @@
width="355">
Sun/Moon Color
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLSunlightColorHelp"
top_delta="-2"
width="18" />
<text
type="string"
length="1"
@ -663,16 +583,6 @@
width="355">
Sun/Moon Position
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLTimeOfDayHelp"
top_delta="-2"
width="18" />
<icon
height="20"
image_name="icon_diurnal.tga"
@ -705,16 +615,6 @@
width="355">
Ambient
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLAmbientHelp"
top_delta="-2"
width="18" />
<text
type="string"
length="1"
@ -828,16 +728,6 @@
width="355">
East Angle
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLEastAngleHelp"
top_delta="-2"
width="18" />
<slider
control_name="WLEastAngle"
decimal_digits="2"
@ -863,16 +753,6 @@
width="355">
Sun Glow
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLSunGlowHelp"
top_delta="-2"
width="18" />
<slider
control_name="WLGlowB"
decimal_digits="2"
@ -915,16 +795,6 @@
width="200">
Scene Gamma
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLSceneGammaHelp"
top_delta="-2"
width="18" />
<slider
control_name="WLGamma"
decimal_digits="2"
@ -951,16 +821,6 @@
width="355">
Star Brightness
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLStarBrightnessHelp"
top_delta="-2"
width="18" />
<slider
control_name="WLStarAlpha"
decimal_digits="2"
@ -1000,16 +860,6 @@
width="355">
Cloud Color
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLCloudColorHelp"
top_delta="-2"
width="18" />
<text
type="string"
length="1"
@ -1123,16 +973,6 @@
width="355">
Cloud XY/Density
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLCloudDensityHelp"
top_delta="-2"
width="18" />
<text
type="string"
length="1"
@ -1221,16 +1061,6 @@
width="355">
Cloud Coverage
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLCloudCoverageHelp"
top_delta="-2"
width="18" />
<slider
control_name="WLCloudCoverage"
decimal_digits="2"
@ -1256,16 +1086,6 @@
width="355">
Cloud Scale
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLCloudScaleHelp"
top_delta="-2"
width="18" />
<slider
control_name="WLCloudScale"
decimal_digits="2"
@ -1292,16 +1112,6 @@
width="355">
Cloud Detail (XY/Density)
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="150"
name="WLCloudDetailHelp"
top_delta="-2"
width="18" />
<text
type="string"
length="1"
@ -1390,16 +1200,6 @@
width="355">
Cloud Scroll X
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="125"
name="WLCloudScrollXHelp"
top_delta="-2"
width="18" />
<check_box
control_name="WLCloudLockX"
follows="left"
@ -1436,16 +1236,6 @@
width="355">
Cloud Scroll Y
</text>
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left_delta="125"
name="WLCloudScrollYHelp"
top_delta="-2"
width="18" />
<check_box
control_name="WLCloudLockY"
follows="left"
@ -1479,16 +1269,6 @@
name="DrawClassicClouds"
top="104"
width="200" />
<button
follows="left|top"
font="SansSerifSmall"
height="18"
label="?"
layout="topleft"
left="608"
name="WLClassicCloudsHelp"
top="84"
width="18" />
</panel>
</tab_container>
</floater>

View File

@ -73,6 +73,8 @@ L$123 to join
name="group_icon"
top="24"
width="38" />
<!-- Must be tab_stop="true" so something can hold focus even when the
other buttons are disabled or invisible, otherwise inspector closes -->
<button
follows="top|left"
height="18"
@ -84,7 +86,7 @@ L$123 to join
right="-8"
top="35"
left_delta="110"
tab_stop="false"
tab_stop="true"
width="18"
commit_callback.function="InspectGroup.ViewProfile" />
<button

View File

@ -1,112 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<menu
create_jump_keys="true"
layout="topleft"
mouse_opaque="false"
visible="false"
name="Gear Menu">
<menu_item_call
label="View Profile"
layout="topleft"
enabled="true"
name="view_profile">
<menu_item_call.on_click
function="InspectAvatar.ViewProfile"/>
</menu_item_call>
<menu_item_call
label="Add Friend"
layout="topleft"
name="add_friend">
<menu_item_call.on_click
function="InspectAvatar.AddFriend"/>
</menu_item_call>
<menu_item_call
label="IM"
layout="topleft"
name="im">
<menu_item_call.on_click
function="InspectAvatar.IM"/>
</menu_item_call>
<menu_item_call
label="Call"
layout="topleft"
enabled="true"
name="call">
</menu_item_call>
<menu_item_call
label="Teleport"
layout="topleft"
name="teleport">
<menu_item_call.on_click
function="InspectAvatar.Teleport"/>
</menu_item_call>
<menu_item_call
label="Invite to Group"
layout="topleft"
name="invite_to_group">
<menu_item_call.on_click
function="InspectAvatar.InviteToGroup"/>
</menu_item_call>
<menu_item_separator layout="topleft" />
<menu_item_call
label="Block"
layout="topleft"
name="block">
<menu_item_call.on_click
function="InspectAvatar.Block"/>
</menu_item_call>
<menu_item_call
label="Report"
layout="topleft"
name="report">
<menu_item_call.on_click
function="InspectAvatar.Report"/>
</menu_item_call>
<menu_item_call
label="Freeze"
name="freeze">
<menu_item_call.on_click
function="InspectAvatar.Freeze"/>
<menu_item_call.on_visible
function="IsGodCustomerService"/>
</menu_item_call>
<menu_item_call
label="Eject"
name="eject">
<menu_item_call.on_click
function="InspectAvatar.Eject"/>
<menu_item_call.on_visible
function="IsGodCustomerService"/>
</menu_item_call>
<menu_item_call
label="Debug"
name="debug">
<menu_item_call.on_click
function="InspectAvatar.Debug"/>
<menu_item_call.on_visible
function="IsGodCustomerService"/>
</menu_item_call>
<menu_item_call
label="Find On Map"
layout="topleft"
name="find_on_map">
<menu_item_call.on_click
function="InspectAvatar.FindOnMap"/>
<menu_item_call.on_visible
function="InspectAvatar.VisibleFindOnMap"/>
</menu_item_call>
<menu_item_call
label="Zoom In"
layout="topleft"
name="zoom_in">
<menu_item_call.on_click
function="InspectAvatar.ZoomIn"/>
</menu_item_call>
<menu_item_call
label="Pay"
layout="topleft"
name="pay">
<menu_item_call.on_click
function="InspectAvatar.Pay"/>
</menu_item_call>
<?xml version="1.0" encoding="utf-8"?>
<menu
create_jump_keys="true"
layout="topleft"
mouse_opaque="false"
visible="false"
name="Gear Menu">
<menu_item_call
label="View Profile"
layout="topleft"
enabled="true"
name="view_profile">
<menu_item_call.on_click
function="InspectAvatar.ViewProfile"/>
</menu_item_call>
<menu_item_call
label="Add Friend"
layout="topleft"
name="add_friend">
<menu_item_call.on_click
function="InspectAvatar.AddFriend"/>
</menu_item_call>
<menu_item_call
label="IM"
layout="topleft"
name="im">
<menu_item_call.on_click
function="InspectAvatar.IM"/>
</menu_item_call>
<menu_item_call
label="Call"
layout="topleft"
enabled="true"
name="call">
</menu_item_call>
<menu_item_call
label="Teleport"
layout="topleft"
name="teleport">
<menu_item_call.on_click
function="InspectAvatar.Teleport"/>
</menu_item_call>
<menu_item_call
label="Invite to Group"
layout="topleft"
name="invite_to_group">
<menu_item_call.on_click
function="InspectAvatar.InviteToGroup"/>
</menu_item_call>
<menu_item_separator layout="topleft" />
<menu_item_call
label="Block"
layout="topleft"
name="block">
<menu_item_call.on_click
function="InspectAvatar.Block"/>
</menu_item_call>
<menu_item_call
label="Report"
layout="topleft"
name="report">
<menu_item_call.on_click
function="InspectAvatar.Report"/>
</menu_item_call>
<menu_item_call
label="Freeze"
name="freeze">
<menu_item_call.on_click
function="InspectAvatar.Freeze"/>
<menu_item_call.on_visible
function="InspectAvatar.VisibleFreezeEject"/>
</menu_item_call>
<menu_item_call
label="Eject"
name="eject">
<menu_item_call.on_click
function="InspectAvatar.Eject"/>
<menu_item_call.on_visible
function="InspectAvatar.VisibleFreezeEject"/>
</menu_item_call>
<menu_item_call
label="Debug"
name="debug">
<menu_item_call.on_click
function="Avatar.Debug"/>
<menu_item_call.on_visible
function="IsGodCustomerService"/>
</menu_item_call>
<menu_item_call
label="Find On Map"
layout="topleft"
name="find_on_map">
<menu_item_call.on_click
function="InspectAvatar.FindOnMap"/>
<menu_item_call.on_visible
function="InspectAvatar.VisibleFindOnMap"/>
</menu_item_call>
<menu_item_call
label="Zoom In"
layout="topleft"
name="zoom_in">
<menu_item_call.on_click
function="InspectAvatar.ZoomIn"/>
</menu_item_call>
<menu_item_call
label="Pay"
layout="topleft"
name="pay">
<menu_item_call.on_click
function="InspectAvatar.Pay"/>
</menu_item_call>
</menu>

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

Some files were not shown because too many files have changed in this diff Show More