merge with viewer-development
commit
e29bb9d9f8
|
|
@ -38,6 +38,8 @@
|
|||
#include "message.h"
|
||||
#include "llmemtype.h"
|
||||
|
||||
#include <boost/regex.hpp>
|
||||
|
||||
// llsd serialization constants
|
||||
static const std::string AGENTS("agents");
|
||||
static const std::string GROUPS("groups");
|
||||
|
|
@ -551,6 +553,31 @@ std::string LLCacheName::buildUsername(const std::string& full_name)
|
|||
return full_name;
|
||||
}
|
||||
|
||||
//static
|
||||
std::string LLCacheName::buildLegacyName(const std::string& complete_name)
|
||||
{
|
||||
boost::regex complete_name_regex("(.+)( \\()([A-Za-z]+)(.[A-Za-z]+)*(\\))");
|
||||
boost::match_results<std::string::const_iterator> name_results;
|
||||
if (!boost::regex_match(complete_name, name_results, complete_name_regex)) return complete_name;
|
||||
|
||||
std::string legacy_name = name_results[3];
|
||||
// capitalize the first letter
|
||||
std::string cap_letter = legacy_name.substr(0, 1);
|
||||
LLStringUtil::toUpper(cap_letter);
|
||||
legacy_name = cap_letter + legacy_name.substr(1);
|
||||
|
||||
if (name_results[4].matched)
|
||||
{
|
||||
std::string last_name = name_results[4];
|
||||
std::string cap_letter = last_name.substr(1, 1);
|
||||
LLStringUtil::toUpper(cap_letter);
|
||||
last_name = cap_letter + last_name.substr(2);
|
||||
legacy_name = legacy_name + " " + last_name;
|
||||
}
|
||||
|
||||
return legacy_name;
|
||||
}
|
||||
|
||||
// This is a little bit kludgy. LLCacheNameCallback is a slot instead of a function pointer.
|
||||
// The reason it is a slot is so that the legacy get() function below can bind an old callback
|
||||
// and pass it as a slot. The reason it isn't a boost::function is so that trackable behavior
|
||||
|
|
|
|||
|
|
@ -90,6 +90,12 @@ public:
|
|||
// "Random Linden" -> "random.linden"
|
||||
static std::string buildUsername(const std::string& name);
|
||||
|
||||
// Converts a complete display name to a legacy name
|
||||
// if possible, otherwise returns the input
|
||||
// "Alias (random.linden)" -> "Random Linden"
|
||||
// "Something random" -> "Something random"
|
||||
static std::string buildLegacyName(const std::string& name);
|
||||
|
||||
// If available, this method copies the group name into the string
|
||||
// provided. The caller must allocate at least
|
||||
// DB_GROUP_NAME_BUF_SIZE characters. If not available, this
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
#include "llmenubutton.h"
|
||||
|
||||
// Linden library includes
|
||||
#include "llmenugl.h"
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "llstring.h"
|
||||
#include "v4color.h"
|
||||
|
||||
|
|
@ -44,22 +44,26 @@ LLMenuButton::Params::Params()
|
|||
|
||||
LLMenuButton::LLMenuButton(const LLMenuButton::Params& p)
|
||||
: LLButton(p),
|
||||
mMenu(NULL),
|
||||
mMenuVisibleLastFrame(false),
|
||||
mIsMenuShown(false),
|
||||
mMenuPosition(MP_BOTTOM_LEFT)
|
||||
{
|
||||
std::string menu_filename = p.menu_filename;
|
||||
|
||||
if (!menu_filename.empty())
|
||||
{
|
||||
mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(menu_filename, LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
|
||||
if (!mMenu)
|
||||
LLToggleableMenu* menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>(menu_filename, LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
|
||||
if (!menu)
|
||||
{
|
||||
llwarns << "Error loading menu_button menu" << llendl;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
updateMenuOrigin();
|
||||
menu->setVisibilityChangeCallback(boost::bind(&LLMenuButton::onMenuVisibilityChange, this, _2));
|
||||
|
||||
mMenuHandle = menu->getHandle();
|
||||
|
||||
updateMenuOrigin();
|
||||
}
|
||||
}
|
||||
|
||||
boost::signals2::connection LLMenuButton::setMouseDownCallback( const mouse_signal_t::slot_type& cb )
|
||||
|
|
@ -69,34 +73,34 @@ boost::signals2::connection LLMenuButton::setMouseDownCallback( const mouse_sign
|
|||
|
||||
void LLMenuButton::hideMenu()
|
||||
{
|
||||
if(!mMenu) return;
|
||||
mMenu->setVisible(FALSE);
|
||||
}
|
||||
if(mMenuHandle.isDead()) return;
|
||||
|
||||
void LLMenuButton::setMenu(LLMenuGL* menu, EMenuPosition position /*MP_TOP_LEFT*/)
|
||||
{
|
||||
mMenu = menu;
|
||||
mMenuPosition = position;
|
||||
}
|
||||
|
||||
void LLMenuButton::draw()
|
||||
{
|
||||
//we save this off so next frame when we try to close it by
|
||||
//button click, and it hides menus before we get to it, we know
|
||||
mMenuVisibleLastFrame = mMenu && mMenu->getVisible();
|
||||
|
||||
if (mMenuVisibleLastFrame)
|
||||
LLToggleableMenu* menu = dynamic_cast<LLToggleableMenu*>(mMenuHandle.get());
|
||||
if (menu)
|
||||
{
|
||||
setForcePressedState(true);
|
||||
menu->setVisible(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
LLButton::draw();
|
||||
LLToggleableMenu* LLMenuButton::getMenu()
|
||||
{
|
||||
return dynamic_cast<LLToggleableMenu*>(mMenuHandle.get());
|
||||
}
|
||||
|
||||
setForcePressedState(false);
|
||||
void LLMenuButton::setMenu(LLToggleableMenu* menu, EMenuPosition position /*MP_TOP_LEFT*/)
|
||||
{
|
||||
if (!menu) return;
|
||||
|
||||
mMenuHandle = menu->getHandle();
|
||||
mMenuPosition = position;
|
||||
|
||||
menu->setVisibilityChangeCallback(boost::bind(&LLMenuButton::onMenuVisibilityChange, this, _2));
|
||||
}
|
||||
|
||||
BOOL LLMenuButton::handleKeyHere(KEY key, MASK mask )
|
||||
{
|
||||
if (mMenuHandle.isDead()) return FALSE;
|
||||
|
||||
if( KEY_RETURN == key && mask == MASK_NONE && !gKeyboard->getKeyRepeated(key))
|
||||
{
|
||||
// *HACK: We emit the mouse down signal to fire the callback bound to the
|
||||
|
|
@ -107,9 +111,10 @@ BOOL LLMenuButton::handleKeyHere(KEY key, MASK mask )
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
if (mMenu && mMenu->getVisible() && key == KEY_ESCAPE && mask == MASK_NONE)
|
||||
LLToggleableMenu* menu = dynamic_cast<LLToggleableMenu*>(mMenuHandle.get());
|
||||
if (menu && menu->getVisible() && key == KEY_ESCAPE && mask == MASK_NONE)
|
||||
{
|
||||
mMenu->setVisible(FALSE);
|
||||
menu->setVisible(FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -119,6 +124,7 @@ BOOL LLMenuButton::handleKeyHere(KEY key, MASK mask )
|
|||
BOOL LLMenuButton::handleMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLButton::handleMouseDown(x, y, mask);
|
||||
|
||||
toggleMenu();
|
||||
|
||||
return TRUE;
|
||||
|
|
@ -126,28 +132,38 @@ BOOL LLMenuButton::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
|
||||
void LLMenuButton::toggleMenu()
|
||||
{
|
||||
if(!mMenu) return;
|
||||
if(mMenuHandle.isDead()) return;
|
||||
|
||||
if (mMenu->getVisible() || mMenuVisibleLastFrame)
|
||||
LLToggleableMenu* menu = dynamic_cast<LLToggleableMenu*>(mMenuHandle.get());
|
||||
if (!menu) return;
|
||||
|
||||
// Store the button rectangle to toggle menu visibility if a mouse event
|
||||
// occurred inside or outside the button rect.
|
||||
menu->setButtonRect(this);
|
||||
|
||||
if (!menu->toggleVisibility() && mIsMenuShown)
|
||||
{
|
||||
mMenu->setVisible(FALSE);
|
||||
setForcePressedState(false);
|
||||
mIsMenuShown = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
mMenu->buildDrawLabels();
|
||||
mMenu->arrangeAndClear();
|
||||
mMenu->updateParent(LLMenuGL::sMenuContainer);
|
||||
menu->buildDrawLabels();
|
||||
menu->arrangeAndClear();
|
||||
menu->updateParent(LLMenuGL::sMenuContainer);
|
||||
|
||||
updateMenuOrigin();
|
||||
|
||||
//mMenu->needsArrange(); //so it recalculates the visible elements
|
||||
LLMenuGL::showPopup(getParent(), mMenu, mX, mY);
|
||||
LLMenuGL::showPopup(getParent(), menu, mX, mY);
|
||||
|
||||
setForcePressedState(true);
|
||||
mIsMenuShown = true;
|
||||
}
|
||||
}
|
||||
|
||||
void LLMenuButton::updateMenuOrigin()
|
||||
{
|
||||
if (!mMenu) return;
|
||||
if (mMenuHandle.isDead()) return;
|
||||
|
||||
LLRect rect = getRect();
|
||||
|
||||
|
|
@ -156,7 +172,7 @@ void LLMenuButton::updateMenuOrigin()
|
|||
case MP_TOP_LEFT:
|
||||
{
|
||||
mX = rect.mLeft;
|
||||
mY = rect.mTop + mMenu->getRect().getHeight();
|
||||
mY = rect.mTop + mMenuHandle.get()->getRect().getHeight();
|
||||
break;
|
||||
}
|
||||
case MP_BOTTOM_LEFT:
|
||||
|
|
@ -167,3 +183,17 @@ void LLMenuButton::updateMenuOrigin()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLMenuButton::onMenuVisibilityChange(const LLSD& param)
|
||||
{
|
||||
bool new_visibility = param["visibility"].asBoolean();
|
||||
bool is_closed_by_button_click = param["closed_by_button_click"].asBoolean();
|
||||
|
||||
// Reset the button "pressed" state only if the menu is shown by this particular
|
||||
// menu button (not any other control) and is not being closed by a click on the button.
|
||||
if (!new_visibility && !is_closed_by_button_click && mIsMenuShown)
|
||||
{
|
||||
setForcePressedState(false);
|
||||
mIsMenuShown = false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
#include "llbutton.h"
|
||||
|
||||
class LLMenuGL;
|
||||
class LLToggleableMenu;
|
||||
|
||||
class LLMenuButton
|
||||
: public LLButton
|
||||
|
|
@ -52,14 +52,13 @@ public:
|
|||
|
||||
boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb );
|
||||
|
||||
/*virtual*/ void draw();
|
||||
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
|
||||
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask );
|
||||
|
||||
void hideMenu();
|
||||
|
||||
LLMenuGL* getMenu() { return mMenu; }
|
||||
void setMenu(LLMenuGL* menu, EMenuPosition position = MP_TOP_LEFT);
|
||||
LLToggleableMenu* getMenu();
|
||||
void setMenu(LLToggleableMenu* menu, EMenuPosition position = MP_TOP_LEFT);
|
||||
|
||||
void setMenuPosition(EMenuPosition position) { mMenuPosition = position; }
|
||||
|
||||
|
|
@ -70,12 +69,14 @@ protected:
|
|||
void toggleMenu();
|
||||
void updateMenuOrigin();
|
||||
|
||||
void onMenuVisibilityChange(const LLSD& param);
|
||||
|
||||
private:
|
||||
LLMenuGL* mMenu;
|
||||
bool mMenuVisibleLastFrame;
|
||||
EMenuPosition mMenuPosition;
|
||||
S32 mX;
|
||||
S32 mY;
|
||||
LLHandle<LLView> mMenuHandle;
|
||||
bool mIsMenuShown;
|
||||
EMenuPosition mMenuPosition;
|
||||
S32 mX;
|
||||
S32 mY;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -35,10 +35,22 @@ static LLDefaultChildRegistry::Register<LLToggleableMenu> r("toggleable_menu");
|
|||
LLToggleableMenu::LLToggleableMenu(const LLToggleableMenu::Params& p)
|
||||
: LLMenuGL(p),
|
||||
mButtonRect(),
|
||||
mVisibilityChangeSignal(NULL),
|
||||
mClosedByButtonClick(false)
|
||||
{
|
||||
}
|
||||
|
||||
LLToggleableMenu::~LLToggleableMenu()
|
||||
{
|
||||
delete mVisibilityChangeSignal;
|
||||
}
|
||||
|
||||
boost::signals2::connection LLToggleableMenu::setVisibilityChangeCallback(const commit_signal_t::slot_type& cb)
|
||||
{
|
||||
if (!mVisibilityChangeSignal) mVisibilityChangeSignal = new commit_signal_t();
|
||||
return mVisibilityChangeSignal->connect(cb);
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLToggleableMenu::handleVisibilityChange (BOOL curVisibilityIn)
|
||||
{
|
||||
|
|
@ -49,6 +61,12 @@ void LLToggleableMenu::handleVisibilityChange (BOOL curVisibilityIn)
|
|||
{
|
||||
mClosedByButtonClick = true;
|
||||
}
|
||||
|
||||
if (mVisibilityChangeSignal)
|
||||
{
|
||||
(*mVisibilityChangeSignal)(this,
|
||||
LLSD().with("visibility", curVisibilityIn).with("closed_by_button_click", mClosedByButtonClick));
|
||||
}
|
||||
}
|
||||
|
||||
void LLToggleableMenu::setButtonRect(const LLRect& rect, LLView* current_view)
|
||||
|
|
|
|||
|
|
@ -41,6 +41,10 @@ protected:
|
|||
LLToggleableMenu(const Params&);
|
||||
friend class LLUICtrlFactory;
|
||||
public:
|
||||
~LLToggleableMenu();
|
||||
|
||||
boost::signals2::connection setVisibilityChangeCallback( const commit_signal_t::slot_type& cb );
|
||||
|
||||
virtual void handleVisibilityChange (BOOL curVisibilityIn);
|
||||
|
||||
const LLRect& getButtonRect() const { return mButtonRect; }
|
||||
|
|
@ -57,6 +61,7 @@ public:
|
|||
protected:
|
||||
bool mClosedByButtonClick;
|
||||
LLRect mButtonRect;
|
||||
commit_signal_t* mVisibilityChangeSignal;
|
||||
};
|
||||
|
||||
#endif // LL_LLTOGGLEABLEMENU_H
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
version 23
|
||||
version 25
|
||||
|
||||
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
|
||||
// Should be combined into one table
|
||||
|
|
@ -144,7 +144,7 @@ WLSkyDetail 1 48
|
|||
RenderDeferred 1 0
|
||||
RenderDeferredSSAO 1 0
|
||||
RenderShadowDetail 1 0
|
||||
RenderUseFBO 1 1
|
||||
RenderUseFBO 1 0
|
||||
|
||||
//
|
||||
// Ultra graphics (REALLY PURTY!)
|
||||
|
|
@ -171,7 +171,7 @@ WLSkyDetail 1 128
|
|||
RenderDeferred 1 0
|
||||
RenderDeferredSSAO 1 0
|
||||
RenderShadowDetail 1 0
|
||||
RenderUseFBO 1 1
|
||||
RenderUseFBO 1 0
|
||||
|
||||
//
|
||||
// Class Unknown Hardware (unknown)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
version 23
|
||||
version 25
|
||||
|
||||
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
|
||||
// Should be combined into one table
|
||||
|
|
@ -144,7 +144,7 @@ WLSkyDetail 1 48
|
|||
RenderDeferred 1 0
|
||||
RenderDeferredSSAO 1 0
|
||||
RenderShadowDetail 1 0
|
||||
RenderUseFBO 1 1
|
||||
RenderUseFBO 1 0
|
||||
|
||||
//
|
||||
// Ultra graphics (REALLY PURTY!)
|
||||
|
|
@ -171,7 +171,7 @@ WLSkyDetail 1 128
|
|||
RenderDeferred 1 0
|
||||
RenderDeferredSSAO 1 0
|
||||
RenderShadowDetail 1 0
|
||||
RenderUseFBO 1 1
|
||||
RenderUseFBO 1 0
|
||||
|
||||
//
|
||||
// Class Unknown Hardware (unknown)
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ LangString LanguageCode ${LANG_JAPANESE} "ja"
|
|||
LangString LanguageCode ${LANG_ITALIAN} "it"
|
||||
LangString LanguageCode ${LANG_KOREAN} "ko"
|
||||
LangString LanguageCode ${LANG_DUTCH} "nl"
|
||||
LangString LanguageCode ${LANG_POLISH} "da"
|
||||
LangString LanguageCode ${LANG_POLISH} "pl"
|
||||
LangString LanguageCode ${LANG_PORTUGUESEBR} "pt"
|
||||
LangString LanguageCode ${LANG_SIMPCHINESE} "zh"
|
||||
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@
|
|||
#include "llviewertexteditor.h"
|
||||
#include "llworld.h"
|
||||
#include "lluiconstants.h"
|
||||
#include "llstring.h"
|
||||
|
||||
#include "llviewercontrol.h"
|
||||
|
||||
|
|
@ -260,7 +261,7 @@ public:
|
|||
if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull())
|
||||
{
|
||||
mSourceType = CHAT_SOURCE_SYSTEM;
|
||||
}
|
||||
}
|
||||
|
||||
mUserNameFont = style_params.font();
|
||||
LLTextBox* user_name = getChild<LLTextBox>("user_name");
|
||||
|
|
@ -268,14 +269,14 @@ public:
|
|||
user_name->setColor(style_params.color());
|
||||
|
||||
if (chat.mFromName.empty()
|
||||
|| mSourceType == CHAT_SOURCE_SYSTEM
|
||||
|| mAvatarID.isNull())
|
||||
|| mSourceType == CHAT_SOURCE_SYSTEM)
|
||||
{
|
||||
mFrom = LLTrans::getString("SECOND_LIFE");
|
||||
user_name->setValue(mFrom);
|
||||
updateMinUserNameWidth();
|
||||
}
|
||||
else if (mSourceType == CHAT_SOURCE_AGENT
|
||||
&& !mAvatarID.isNull()
|
||||
&& chat.mChatStyle != CHAT_STYLE_HISTORY)
|
||||
{
|
||||
// ...from a normal user, lookup the name and fill in later.
|
||||
|
|
@ -288,7 +289,41 @@ public:
|
|||
LLAvatarNameCache::get(mAvatarID,
|
||||
boost::bind(&LLChatHistoryHeader::onAvatarNameCache, this, _1, _2));
|
||||
}
|
||||
else {
|
||||
else if (chat.mChatStyle == CHAT_STYLE_HISTORY ||
|
||||
mSourceType == CHAT_SOURCE_AGENT)
|
||||
{
|
||||
//if it's an avatar name with a username add formatting
|
||||
S32 username_start = chat.mFromName.rfind(" (");
|
||||
S32 username_end = chat.mFromName.rfind(')');
|
||||
|
||||
if (username_start != std::string::npos &&
|
||||
username_end == (chat.mFromName.length() - 1))
|
||||
{
|
||||
mFrom = chat.mFromName.substr(0, username_start);
|
||||
user_name->setValue(mFrom);
|
||||
|
||||
if (gSavedSettings.getBOOL("NameTagShowUsernames"))
|
||||
{
|
||||
std::string username = chat.mFromName.substr(username_start + 2);
|
||||
username = username.substr(0, username.length() - 1);
|
||||
LLStyle::Params style_params_name;
|
||||
LLColor4 userNameColor = LLUIColorTable::instance().getColor("EmphasisColor");
|
||||
style_params_name.color(userNameColor);
|
||||
style_params_name.font.name("SansSerifSmall");
|
||||
style_params_name.font.style("NORMAL");
|
||||
style_params_name.readonly_color(userNameColor);
|
||||
user_name->appendText(" - " + username, FALSE, style_params_name);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mFrom = chat.mFromName;
|
||||
user_name->setValue(mFrom);
|
||||
updateMinUserNameWidth();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// ...from an object, just use name as given
|
||||
mFrom = chat.mFromName;
|
||||
user_name->setValue(mFrom);
|
||||
|
|
@ -367,7 +402,9 @@ public:
|
|||
user_name->setValue( LLSD(av_name.mDisplayName ) );
|
||||
user_name->setToolTip( av_name.mUsername );
|
||||
|
||||
if (gSavedSettings.getBOOL("NameTagShowUsernames") && LLAvatarNameCache::useDisplayNames())
|
||||
if (gSavedSettings.getBOOL("NameTagShowUsernames") &&
|
||||
LLAvatarNameCache::useDisplayNames() &&
|
||||
!av_name.mIsDisplayNameDefault)
|
||||
{
|
||||
LLStyle::Params style_params_name;
|
||||
LLColor4 userNameColor = LLUIColorTable::instance().getColor("EmphasisColor");
|
||||
|
|
|
|||
|
|
@ -430,8 +430,9 @@ void LLIMModel::LLIMSession::addMessagesFromHistory(const std::list<LLSD>& histo
|
|||
}
|
||||
else
|
||||
{
|
||||
// Legacy chat logs only wrote the legacy name, not the agent_id
|
||||
gCacheName->getUUID(from, from_id);
|
||||
// convert it to a legacy name if we have a complete name
|
||||
std::string legacy_name = gCacheName->buildLegacyName(from);
|
||||
gCacheName->getUUID(legacy_name, from_id);
|
||||
}
|
||||
|
||||
std::string timestamp = msg[IM_TIME];
|
||||
|
|
@ -526,8 +527,16 @@ bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
|
|||
|
||||
void LLIMModel::LLIMSession::onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name)
|
||||
{
|
||||
// if username is empty, display names isn't enabled, use the display name
|
||||
mHistoryFileName = av_name.mUsername.empty() ? av_name.mDisplayName : av_name.mUsername;
|
||||
if (av_name.mLegacyFirstName.empty())
|
||||
{
|
||||
// if mLegacyFirstName is empty it means display names is off and the
|
||||
// data came from the gCacheName, mDisplayName will be the legacy name
|
||||
mHistoryFileName = LLCacheName::cleanFullName(av_name.mDisplayName);
|
||||
}
|
||||
else
|
||||
{
|
||||
mHistoryFileName = LLCacheName::cleanFullName(av_name.getLegacyName());
|
||||
}
|
||||
}
|
||||
|
||||
void LLIMModel::LLIMSession::buildHistoryFileName()
|
||||
|
|
@ -737,8 +746,18 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from,
|
|||
bool LLIMModel::logToFile(const std::string& file_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
|
||||
{
|
||||
if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
|
||||
{
|
||||
LLLogChat::saveHistory(file_name, from, from_id, utf8_text);
|
||||
{
|
||||
std::string from_name = from;
|
||||
|
||||
LLAvatarName av_name;
|
||||
if (!from_id.isNull() &&
|
||||
LLAvatarNameCache::get(from_id, &av_name) &&
|
||||
!av_name.mIsDisplayNameDefault)
|
||||
{
|
||||
from_name = av_name.getCompleteName();
|
||||
}
|
||||
|
||||
LLLogChat::saveHistory(file_name, from_name, from_id, utf8_text);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@
|
|||
#include "llfloaterreg.h"
|
||||
#include "llmenubutton.h"
|
||||
#include "lltextbox.h"
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "lltooltip.h" // positionViewNearMouse()
|
||||
#include "lltrans.h"
|
||||
#include "lluictrl.h"
|
||||
|
|
@ -402,8 +403,8 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data)
|
|||
// if neither the gear menu or self gear menu are open
|
||||
void LLInspectAvatar::onMouseLeave(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLMenuGL* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu();
|
||||
LLMenuGL* gear_menu_self = getChild<LLMenuButton>("gear_self_btn")->getMenu();
|
||||
LLToggleableMenu* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu();
|
||||
LLToggleableMenu* gear_menu_self = getChild<LLMenuButton>("gear_self_btn")->getMenu();
|
||||
if ( gear_menu && gear_menu->getVisible() &&
|
||||
gear_menu_self && gear_menu_self->getVisible() )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
#include "llsafehandle.h"
|
||||
#include "llsidetray.h"
|
||||
#include "lltextbox.h" // for description truncation
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "lltrans.h"
|
||||
#include "llui.h" // positionViewNearMouse()
|
||||
#include "lluictrl.h"
|
||||
|
|
@ -568,7 +569,7 @@ void LLInspectObject::updateSecureBrowsing()
|
|||
// if the gear menu is not open
|
||||
void LLInspectObject::onMouseLeave(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLMenuGL* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu();
|
||||
LLToggleableMenu* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu();
|
||||
if ( gear_menu && gear_menu->getVisible() )
|
||||
{
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ public:
|
|||
LLIconDictionary::LLIconDictionary()
|
||||
{
|
||||
addEntry(LLInventoryIcon::ICONNAME_TEXTURE, new IconEntry("Inv_Texture"));
|
||||
addEntry(LLInventoryIcon::ICONNAME_SOUND, new IconEntry("Inv_Texture"));
|
||||
addEntry(LLInventoryIcon::ICONNAME_SOUND, new IconEntry("Inv_Sound"));
|
||||
addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_ONLINE, new IconEntry("Inv_CallingCard"));
|
||||
addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_OFFLINE, new IconEntry("Inv_CallingCard"));
|
||||
addEntry(LLInventoryIcon::ICONNAME_LANDMARK, new IconEntry("Inv_Landmark"));
|
||||
|
|
@ -83,7 +83,7 @@ LLIconDictionary::LLIconDictionary()
|
|||
addEntry(LLInventoryIcon::ICONNAME_GESTURE, new IconEntry("Inv_Gesture"));
|
||||
|
||||
addEntry(LLInventoryIcon::ICONNAME_LINKITEM, new IconEntry("Inv_LinkItem"));
|
||||
addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkItem"));
|
||||
addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkFolder"));
|
||||
|
||||
addEntry(LLInventoryIcon::ICONNAME_INVALID, new IconEntry("Inv_Invalid"));
|
||||
|
||||
|
|
|
|||
|
|
@ -26,18 +26,13 @@
|
|||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "lllogchat.h"
|
||||
|
||||
// viewer includes
|
||||
#include "llagent.h"
|
||||
#include "llagentui.h"
|
||||
#include "lllogchat.h"
|
||||
#include "lltrans.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
||||
// library includes
|
||||
#include "llchat.h"
|
||||
#include "llinstantmessage.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "llsingleton.h" // for LLSingleton
|
||||
|
||||
#include <boost/algorithm/string/trim.hpp>
|
||||
|
|
@ -65,7 +60,6 @@ const std::string IM_TIME("time");
|
|||
const std::string IM_TEXT("message");
|
||||
const std::string IM_FROM("from");
|
||||
const std::string IM_FROM_ID("from_id");
|
||||
const std::string IM_SOURCE_TYPE("source_type");
|
||||
|
||||
const static std::string IM_SEPARATOR(": ");
|
||||
const static std::string NEW_LINE("\n");
|
||||
|
|
@ -93,7 +87,7 @@ const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+
|
|||
* Regular expression suitable to match names like
|
||||
* "You", "Second Life", "Igor ProductEngine", "Object", "Mega House"
|
||||
*/
|
||||
const static boost::regex NAME_AND_TEXT("(You:|Second Life:|[^\\s:]+\\s*[:]{1}|\\S+\\s+[^\\s:]+[:]{1})?(\\s*)(.*)");
|
||||
const static boost::regex NAME_AND_TEXT("([^:]+[:]{1})?(\\s*)(.*)");
|
||||
|
||||
//is used to parse complex object names like "Xstreet SL Terminal v2.2.5 st"
|
||||
const static std::string NAME_TEXT_DIVIDER(": ");
|
||||
|
|
@ -190,8 +184,7 @@ std::string LLLogChat::makeLogFileName(std::string filename)
|
|||
{
|
||||
filename = cleanFileName(filename);
|
||||
filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS,filename);
|
||||
// new files are llsd notation format
|
||||
filename += ".llsd";
|
||||
filename += ".txt";
|
||||
return filename;
|
||||
}
|
||||
|
||||
|
|
@ -240,18 +233,6 @@ void LLLogChat::saveHistory(const std::string& filename,
|
|||
const std::string& from,
|
||||
const LLUUID& from_id,
|
||||
const std::string& line)
|
||||
{
|
||||
LLChat chat;
|
||||
chat.mText = line;
|
||||
chat.mFromName = from;
|
||||
chat.mFromID = from_id;
|
||||
// default to being from an agent
|
||||
chat.mSourceType = CHAT_SOURCE_AGENT;
|
||||
saveHistory(filename, chat);
|
||||
}
|
||||
|
||||
//static
|
||||
void LLLogChat::saveHistory(const std::string& filename, const LLChat& chat)
|
||||
{
|
||||
std::string tmp_filename = filename;
|
||||
LLStringUtil::trim(tmp_filename);
|
||||
|
|
@ -273,27 +254,89 @@ void LLLogChat::saveHistory(const std::string& filename, const LLChat& chat)
|
|||
LLSD item;
|
||||
|
||||
if (gSavedPerAccountSettings.getBOOL("LogTimestamp"))
|
||||
item[IM_TIME] = LLLogChat::timestamp(gSavedPerAccountSettings.getBOOL("LogTimestampDate"));
|
||||
item["time"] = LLLogChat::timestamp(gSavedPerAccountSettings.getBOOL("LogTimestampDate"));
|
||||
|
||||
item[IM_FROM_ID] = chat.mFromID;
|
||||
item[IM_TEXT] = chat.mText;
|
||||
item[IM_SOURCE_TYPE] = chat.mSourceType;
|
||||
item["from_id"] = from_id;
|
||||
item["message"] = line;
|
||||
|
||||
//adding "Second Life:" for all system messages to make chat log history parsing more reliable
|
||||
if (chat.mFromName.empty() && chat.mFromID.isNull())
|
||||
if (from.empty() && from_id.isNull())
|
||||
{
|
||||
item[IM_FROM] = SYSTEM_FROM;
|
||||
item["from"] = SYSTEM_FROM;
|
||||
}
|
||||
else
|
||||
{
|
||||
item[IM_FROM] = chat.mFromName;
|
||||
item["from"] = from;
|
||||
}
|
||||
|
||||
file << LLSDOStreamer<LLSDNotationFormatter>(item) << std::endl;
|
||||
file << LLChatLogFormatter(item) << std::endl;
|
||||
|
||||
file.close();
|
||||
}
|
||||
|
||||
void LLLogChat::loadHistory(const std::string& filename, void (*callback)(ELogLineType, const LLSD&, void*), void* userdata)
|
||||
{
|
||||
if(!filename.size())
|
||||
{
|
||||
llwarns << "Filename is Empty!" << llendl;
|
||||
return ;
|
||||
}
|
||||
|
||||
LLFILE* fptr = LLFile::fopen(makeLogFileName(filename), "r"); /*Flawfinder: ignore*/
|
||||
if (!fptr)
|
||||
{
|
||||
callback(LOG_EMPTY, LLSD(), userdata);
|
||||
return; //No previous conversation with this name.
|
||||
}
|
||||
else
|
||||
{
|
||||
char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/
|
||||
char *bptr;
|
||||
S32 len;
|
||||
bool firstline=TRUE;
|
||||
|
||||
if ( fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END) )
|
||||
{ //File is smaller than recall size. Get it all.
|
||||
firstline = FALSE;
|
||||
if ( fseek(fptr, 0, SEEK_SET) )
|
||||
{
|
||||
fclose(fptr);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
while ( fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr) )
|
||||
{
|
||||
len = strlen(buffer) - 1; /*Flawfinder: ignore*/
|
||||
for ( bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--) *bptr='\0';
|
||||
|
||||
if (!firstline)
|
||||
{
|
||||
LLSD item;
|
||||
std::string line(buffer);
|
||||
std::istringstream iss(line);
|
||||
|
||||
if (!LLChatLogParser::parse(line, item))
|
||||
{
|
||||
item["message"] = line;
|
||||
callback(LOG_LINE, item, userdata);
|
||||
}
|
||||
else
|
||||
{
|
||||
callback(LOG_LLSD, item, userdata);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
firstline = FALSE;
|
||||
}
|
||||
}
|
||||
callback(LOG_END, LLSD(), userdata);
|
||||
|
||||
fclose(fptr);
|
||||
}
|
||||
}
|
||||
|
||||
void append_to_last_message(std::list<LLSD>& messages, const std::string& line)
|
||||
{
|
||||
if (!messages.size()) return;
|
||||
|
|
@ -367,25 +410,53 @@ void LLLogChat::loadAllHistory(const std::string& file_name, std::list<LLSD>& me
|
|||
fclose(fptr);
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLChatLogParser::parse(const std::string& raw, LLSD& im)
|
||||
//*TODO mark object's names in a special way so that they will be distinguishable form avatar name
|
||||
//which are more strict by its nature (only firstname and secondname)
|
||||
//Example, an object's name can be writen like "Object <actual_object's_name>"
|
||||
void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const
|
||||
{
|
||||
if (!im.isMap())
|
||||
{
|
||||
llwarning("invalid LLSD type of an instant message", 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (im[IM_TIME].isDefined())
|
||||
{
|
||||
std::string timestamp = im[IM_TIME].asString();
|
||||
boost::trim(timestamp);
|
||||
ostr << '[' << timestamp << ']' << TWO_SPACES;
|
||||
}
|
||||
|
||||
//*TODO mark object's names in a special way so that they will be distinguishable form avatar name
|
||||
//which are more strict by its nature (only firstname and secondname)
|
||||
//Example, an object's name can be writen like "Object <actual_object's_name>"
|
||||
if (im[IM_FROM].isDefined())
|
||||
{
|
||||
std::string from = im[IM_FROM].asString();
|
||||
boost::trim(from);
|
||||
if (from.size())
|
||||
{
|
||||
ostr << from << IM_SEPARATOR;
|
||||
}
|
||||
}
|
||||
|
||||
if (im[IM_TEXT].isDefined())
|
||||
{
|
||||
std::string im_text = im[IM_TEXT].asString();
|
||||
|
||||
//multilined text will be saved with prepended spaces
|
||||
boost::replace_all(im_text, NEW_LINE, NEW_LINE_SPACE_PREFIX);
|
||||
ostr << im_text;
|
||||
}
|
||||
}
|
||||
|
||||
bool LLChatLogParser::parse(std::string& raw, LLSD& im)
|
||||
{
|
||||
if (!raw.length()) return false;
|
||||
|
||||
im = LLSD::emptyMap();
|
||||
|
||||
// In Viewer 2.1 we added UUID to chat/IM logging so we can look up
|
||||
// display names
|
||||
if (raw[0] == '{')
|
||||
{
|
||||
// ...this is a viewer 2.1, new-style LLSD notation format log
|
||||
std::istringstream raw_stream(raw);
|
||||
LLPointer<LLSDParser> parser = new LLSDNotationParser();
|
||||
S32 count = parser->parse(raw_stream, im, raw.length());
|
||||
// expect several map items per parsed line
|
||||
return (count != LLSDParser::PARSE_FAILURE);
|
||||
}
|
||||
|
||||
//matching a timestamp
|
||||
boost::match_results<std::string::const_iterator> matches;
|
||||
if (!boost::regex_match(raw, matches, TIMESTAMP_AND_STUFF)) return false;
|
||||
|
|
|
|||
|
|
@ -41,21 +41,48 @@ public:
|
|||
};
|
||||
static std::string timestamp(bool withdate = false);
|
||||
static std::string makeLogFileName(std::string(filename));
|
||||
|
||||
// Log a single line item to the appropriate chat file
|
||||
static void saveHistory(const std::string& filename, const LLChat& chat);
|
||||
|
||||
// Prefer the above version - it saves more metadata about the item
|
||||
static void saveHistory(const std::string& filename,
|
||||
const std::string& from,
|
||||
const LLUUID& from_id,
|
||||
const std::string& line);
|
||||
|
||||
/** @deprecated @see loadAllHistory() */
|
||||
static void loadHistory(const std::string& filename,
|
||||
void (*callback)(ELogLineType, const LLSD&, void*),
|
||||
void* userdata);
|
||||
|
||||
static void loadAllHistory(const std::string& file_name, std::list<LLSD>& messages);
|
||||
private:
|
||||
static std::string cleanFileName(std::string filename);
|
||||
};
|
||||
|
||||
/**
|
||||
* Formatter for the plain text chat log files
|
||||
*/
|
||||
class LLChatLogFormatter
|
||||
{
|
||||
public:
|
||||
LLChatLogFormatter(const LLSD& im) : mIM(im) {}
|
||||
virtual ~LLChatLogFormatter() {};
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& str, const LLChatLogFormatter& formatter)
|
||||
{
|
||||
formatter.format(formatter.mIM, str);
|
||||
return str;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
/**
|
||||
* Format an instant message to a stream
|
||||
* Timestamps and sender names are required
|
||||
* New lines of multilined messages are prepended with a space
|
||||
*/
|
||||
void format(const LLSD& im, std::ostream& ostr) const;
|
||||
|
||||
LLSD mIM;
|
||||
};
|
||||
|
||||
/**
|
||||
* Parser for the plain text chat log files
|
||||
*/
|
||||
|
|
@ -74,7 +101,7 @@ public:
|
|||
*
|
||||
* @return false if failed to parse mandatory data - message text
|
||||
*/
|
||||
static bool parse(const std::string& raw, LLSD& im);
|
||||
static bool parse(std::string& raw, LLSD& im);
|
||||
|
||||
protected:
|
||||
LLChatLogParser();
|
||||
|
|
@ -86,6 +113,5 @@ extern const std::string IM_TIME; //("time");
|
|||
extern const std::string IM_TEXT; //("message");
|
||||
extern const std::string IM_FROM; //("from");
|
||||
extern const std::string IM_FROM_ID; //("from_id");
|
||||
extern const std::string IM_SOURCE_TYPE; //("source_type");
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -46,6 +46,8 @@
|
|||
#include "llchathistory.h"
|
||||
#include "llstylemap.h"
|
||||
|
||||
#include "llavatarnamecache.h"
|
||||
|
||||
#include "lldraghandle.h"
|
||||
|
||||
#include "llbottomtray.h"
|
||||
|
|
@ -179,7 +181,21 @@ void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args)
|
|||
|
||||
if (gSavedPerAccountSettings.getBOOL("LogNearbyChat"))
|
||||
{
|
||||
LLLogChat::saveHistory("chat", chat);
|
||||
std::string from_name = chat.mFromName;
|
||||
|
||||
if (chat.mSourceType == CHAT_SOURCE_AGENT)
|
||||
{
|
||||
// if the chat is coming from an agent, log the complete name
|
||||
LLAvatarName av_name;
|
||||
LLAvatarNameCache::get(chat.mFromID, &av_name);
|
||||
|
||||
if (!av_name.mIsDisplayNameDefault)
|
||||
{
|
||||
from_name = av_name.getCompleteName();
|
||||
}
|
||||
}
|
||||
|
||||
LLLogChat::saveHistory("chat", from_name, chat.mFromID, chat.mText);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -248,11 +264,23 @@ void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue)
|
|||
nearby_chat->updateChatHistoryStyle();
|
||||
}
|
||||
|
||||
bool isTwoWordsName(const std::string& name)
|
||||
bool isWordsName(const std::string& name)
|
||||
{
|
||||
//checking for a single space
|
||||
S32 pos = name.find(' ', 0);
|
||||
return std::string::npos != pos && name.rfind(' ', name.length()) == pos && 0 != pos && name.length()-1 != pos;
|
||||
// checking to see if it's display name plus username in parentheses
|
||||
S32 open_paren = name.find(" (", 0);
|
||||
S32 close_paren = name.find(')', 0);
|
||||
|
||||
if (open_paren != std::string::npos &&
|
||||
close_paren == name.length()-1)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
//checking for a single space
|
||||
S32 pos = name.find(' ', 0);
|
||||
return std::string::npos != pos && name.rfind(' ', name.length()) == pos && 0 != pos && name.length()-1 != pos;
|
||||
}
|
||||
}
|
||||
|
||||
void LLNearbyChat::loadHistory()
|
||||
|
|
@ -275,9 +303,10 @@ void LLNearbyChat::loadHistory()
|
|||
from_id = msg[IM_FROM_ID].asUUID();
|
||||
}
|
||||
else
|
||||
{
|
||||
gCacheName->getUUID(from, from_id);
|
||||
}
|
||||
{
|
||||
std::string legacy_name = gCacheName->buildLegacyName(from);
|
||||
gCacheName->getUUID(legacy_name, from_id);
|
||||
}
|
||||
|
||||
LLChat chat;
|
||||
chat.mFromName = from;
|
||||
|
|
@ -286,18 +315,15 @@ void LLNearbyChat::loadHistory()
|
|||
chat.mTimeStr = msg[IM_TIME].asString();
|
||||
chat.mChatStyle = CHAT_STYLE_HISTORY;
|
||||
|
||||
if (msg.has(IM_SOURCE_TYPE))
|
||||
{
|
||||
S32 source_type = msg[IM_SOURCE_TYPE].asInteger();
|
||||
chat.mSourceType = (EChatSourceType)source_type;
|
||||
}
|
||||
else if (from_id.isNull() && SYSTEM_FROM == from)
|
||||
chat.mSourceType = CHAT_SOURCE_AGENT;
|
||||
if (from_id.isNull() && SYSTEM_FROM == from)
|
||||
{
|
||||
chat.mSourceType = CHAT_SOURCE_SYSTEM;
|
||||
|
||||
}
|
||||
else if (from_id.isNull())
|
||||
{
|
||||
chat.mSourceType = isTwoWordsName(from) ? CHAT_SOURCE_UNKNOWN : CHAT_SOURCE_OBJECT;
|
||||
chat.mSourceType = isWordsName(from) ? CHAT_SOURCE_UNKNOWN : CHAT_SOURCE_OBJECT;
|
||||
}
|
||||
|
||||
addMessage(chat, true, do_not_log);
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@
|
|||
#include "llnotificationsutil.h"
|
||||
#include "lloutfitobserver.h"
|
||||
#include "llsidetray.h"
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "lltransutil.h"
|
||||
#include "llviewermenu.h"
|
||||
#include "llvoavatar.h"
|
||||
|
|
@ -122,7 +123,7 @@ public:
|
|||
enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitListGearMenu::onEnable, this, _2));
|
||||
enable_registrar.add("Gear.OnVisible", boost::bind(&LLOutfitListGearMenu::onVisible, this, _2));
|
||||
|
||||
mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(
|
||||
mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>(
|
||||
"menu_outfit_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
llassert(mMenu);
|
||||
}
|
||||
|
|
@ -137,7 +138,7 @@ public:
|
|||
mMenu->arrangeAndClear(); // update menu height
|
||||
}
|
||||
|
||||
LLMenuGL* getMenu() { return mMenu; }
|
||||
LLToggleableMenu* getMenu() { return mMenu; }
|
||||
|
||||
private:
|
||||
const LLUUID& getSelectedOutfitID()
|
||||
|
|
@ -251,8 +252,8 @@ private:
|
|||
return true;
|
||||
}
|
||||
|
||||
LLOutfitsList* mOutfitList;
|
||||
LLMenuGL* mMenu;
|
||||
LLOutfitsList* mOutfitList;
|
||||
LLToggleableMenu* mMenu;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@
|
|||
#include "llplacesinventorybridge.h"
|
||||
#include "llplacesinventorypanel.h"
|
||||
#include "llsidetray.h"
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "llviewermenu.h"
|
||||
#include "llviewerregion.h"
|
||||
|
||||
|
|
@ -706,8 +707,8 @@ void LLLandmarksPanel::initListCommandsHandlers()
|
|||
mCommitCallbackRegistrar.add("Places.LandmarksGear.Folding.Action", boost::bind(&LLLandmarksPanel::onFoldingAction, this, _2));
|
||||
mEnableCallbackRegistrar.add("Places.LandmarksGear.Check", boost::bind(&LLLandmarksPanel::isActionChecked, this, _2));
|
||||
mEnableCallbackRegistrar.add("Places.LandmarksGear.Enable", boost::bind(&LLLandmarksPanel::isActionEnabled, this, _2));
|
||||
mGearLandmarkMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_landmark.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mGearFolderMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_folder.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mGearLandmarkMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_places_gear_landmark.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mGearFolderMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_places_gear_folder.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_place_add_button.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
|
||||
mListCommands->childSetAction(ADD_BUTTON_NAME, boost::bind(&LLLandmarksPanel::showActionMenu, this, mMenuAdd, ADD_BUTTON_NAME));
|
||||
|
|
@ -726,7 +727,7 @@ void LLLandmarksPanel::updateListCommands()
|
|||
|
||||
void LLLandmarksPanel::onActionsButtonClick()
|
||||
{
|
||||
LLMenuGL* menu = mGearFolderMenu;
|
||||
LLToggleableMenu* menu = mGearFolderMenu;
|
||||
|
||||
LLFolderViewItem* cur_item = NULL;
|
||||
if(mCurrentSelectedList)
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ class LLAccordionCtrlTab;
|
|||
class LLFolderViewItem;
|
||||
class LLMenuButton;
|
||||
class LLMenuGL;
|
||||
class LLToggleableMenu;
|
||||
class LLInventoryPanel;
|
||||
class LLPlacesInventoryPanel;
|
||||
|
||||
|
|
@ -157,8 +158,8 @@ private:
|
|||
LLPlacesInventoryPanel* mMyInventoryPanel;
|
||||
LLPlacesInventoryPanel* mLibraryInventoryPanel;
|
||||
LLMenuButton* mGearButton;
|
||||
LLMenuGL* mGearLandmarkMenu;
|
||||
LLMenuGL* mGearFolderMenu;
|
||||
LLToggleableMenu* mGearLandmarkMenu;
|
||||
LLToggleableMenu* mGearFolderMenu;
|
||||
LLMenuGL* mMenuAdd;
|
||||
LLPlacesInventoryPanel* mCurrentSelectedList;
|
||||
LLInventoryObserver* mInventoryObserver;
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@
|
|||
#include "llscrollcontainer.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "llspinctrl.h"
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "lltooldraganddrop.h"
|
||||
#include "llviewermenu.h"
|
||||
#include "llviewertexturelist.h"
|
||||
|
|
@ -915,7 +916,7 @@ void LLPanelMainInventory::initListCommandsHandlers()
|
|||
|
||||
mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
|
||||
mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
|
||||
mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mGearMenuButton->setMenu(mMenuGearDefault);
|
||||
mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ class LLTabContainer;
|
|||
class LLFloaterInventoryFinder;
|
||||
class LLMenuButton;
|
||||
class LLMenuGL;
|
||||
class LLToggleableMenu;
|
||||
class LLFloater;
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
@ -143,7 +144,7 @@ protected:
|
|||
void setUploadCostIfNeeded();
|
||||
private:
|
||||
LLDragAndDropButton* mTrashButton;
|
||||
LLMenuGL* mMenuGearDefault;
|
||||
LLToggleableMenu* mMenuGearDefault;
|
||||
LLMenuGL* mMenuAdd;
|
||||
LLMenuButton* mGearMenuButton;
|
||||
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@
|
|||
#include "llsaveoutfitcombobtn.h"
|
||||
#include "llscrolllistctrl.h"
|
||||
#include "lltextbox.h"
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "lltrans.h"
|
||||
#include "lluictrlfactory.h"
|
||||
#include "llsdutil.h"
|
||||
|
|
@ -152,13 +153,13 @@ std::string LLShopURLDispatcher::resolveURL(LLAssetType::EType asset_type, ESex
|
|||
class LLPanelOutfitEditGearMenu
|
||||
{
|
||||
public:
|
||||
static LLMenuGL* create()
|
||||
static LLToggleableMenu* create()
|
||||
{
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
|
||||
registrar.add("Wearable.Create", boost::bind(onCreate, _2));
|
||||
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(
|
||||
LLToggleableMenu* menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>(
|
||||
"menu_cof_gear.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
llassert(menu);
|
||||
if (menu)
|
||||
|
|
@ -219,7 +220,7 @@ private:
|
|||
class LLAddWearablesGearMenu : public LLInitClass<LLAddWearablesGearMenu>
|
||||
{
|
||||
public:
|
||||
static LLMenuGL* create(LLWearableItemsList* flat_list, LLInventoryPanel* inventory_panel)
|
||||
static LLToggleableMenu* create(LLWearableItemsList* flat_list, LLInventoryPanel* inventory_panel)
|
||||
{
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
|
||||
|
|
@ -234,7 +235,7 @@ public:
|
|||
enable_registrar.add("AddWearable.Gear.Check", boost::bind(onCheck, flat_list_handle, inventory_panel_handle, _2));
|
||||
enable_registrar.add("AddWearable.Gear.Visible", boost::bind(onVisible, inventory_panel_handle, _2));
|
||||
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(
|
||||
LLToggleableMenu* menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>(
|
||||
"menu_add_wearable_gear.xml",
|
||||
LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
|
||||
|
|
@ -404,6 +405,7 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()
|
|||
mAddWearablesPanel(NULL),
|
||||
mFolderViewFilterCmbBox(NULL),
|
||||
mListViewFilterCmbBox(NULL),
|
||||
mWearableListManager(NULL),
|
||||
mPlusBtn(NULL),
|
||||
mWearablesGearMenuBtn(NULL),
|
||||
mGearMenuBtn(NULL)
|
||||
|
|
@ -431,6 +433,7 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()
|
|||
|
||||
LLPanelOutfitEdit::~LLPanelOutfitEdit()
|
||||
{
|
||||
delete mWearableListManager;
|
||||
delete mSavedFolderState;
|
||||
|
||||
delete mCOFDragAndDropObserver;
|
||||
|
|
|
|||
|
|
@ -233,8 +233,8 @@ private:
|
|||
std::vector<LLFilterItem*> mListViewItemTypes;
|
||||
|
||||
LLCOFWearables* mCOFWearables;
|
||||
LLMenuGL* mGearMenu;
|
||||
LLMenuGL* mAddWearablesGearMenu;
|
||||
LLToggleableMenu* mGearMenu;
|
||||
LLToggleableMenu* mAddWearablesGearMenu;
|
||||
bool mInitialized;
|
||||
std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn;
|
||||
LLMenuButton* mWearablesGearMenuBtn;
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
#include "lleventtimer.h"
|
||||
#include "llfiltereditor.h"
|
||||
#include "lltabcontainer.h"
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "lluictrlfactory.h"
|
||||
|
||||
#include "llpanelpeople.h"
|
||||
|
|
@ -632,28 +633,28 @@ BOOL LLPanelPeople::postBuild()
|
|||
LLMenuGL* plus_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_group_plus.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mGroupPlusMenuHandle = plus_menu->getHandle();
|
||||
|
||||
LLMenuGL* nearby_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_nearby_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
LLToggleableMenu* nearby_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_nearby_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if(nearby_view_sort)
|
||||
{
|
||||
mNearbyViewSortMenuHandle = nearby_view_sort->getHandle();
|
||||
mNearbyGearButton->setMenu(nearby_view_sort);
|
||||
}
|
||||
|
||||
LLMenuGL* friend_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_friends_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
LLToggleableMenu* friend_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_friends_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if(friend_view_sort)
|
||||
{
|
||||
mFriendsViewSortMenuHandle = friend_view_sort->getHandle();
|
||||
mFriendsGearButton->setMenu(friend_view_sort);
|
||||
}
|
||||
|
||||
LLMenuGL* group_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_groups_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
LLToggleableMenu* group_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_groups_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if(group_view_sort)
|
||||
{
|
||||
mGroupsViewSortMenuHandle = group_view_sort->getHandle();
|
||||
mGroupsGearButton->setMenu(group_view_sort);
|
||||
}
|
||||
|
||||
LLMenuGL* recent_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_recent_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
LLToggleableMenu* recent_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_recent_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if(recent_view_sort)
|
||||
{
|
||||
mRecentViewSortMenuHandle = recent_view_sort->getHandle();
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@
|
|||
#include "llflatlistview.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "lltextbox.h"
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "llviewermenu.h"
|
||||
#include "lllandmarkactions.h"
|
||||
#include "llclipboard.h"
|
||||
|
|
@ -450,7 +451,7 @@ BOOL LLTeleportHistoryPanel::postBuild()
|
|||
|
||||
mMenuGearButton = getChild<LLMenuButton>("gear_btn");
|
||||
|
||||
LLMenuGL* gear_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_teleport_history_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());;
|
||||
LLToggleableMenu* gear_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_teleport_history_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());;
|
||||
if(gear_menu)
|
||||
{
|
||||
mGearMenuHandle = gear_menu->getHandle();
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@
|
|||
|
||||
#include "llpanelwearing.h"
|
||||
|
||||
#include "lltoggleablemenu.h"
|
||||
|
||||
#include "llappearancemgr.h"
|
||||
#include "llinventoryfunctions.h"
|
||||
#include "llinventorymodel.h"
|
||||
|
|
@ -59,12 +61,12 @@ public:
|
|||
|
||||
enable_registrar.add("Gear.OnEnable", boost::bind(&LLPanelWearing::isActionEnabled, mPanelWearing, _2));
|
||||
|
||||
mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(
|
||||
mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>(
|
||||
"menu_wearing_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
llassert(mMenu);
|
||||
}
|
||||
|
||||
LLMenuGL* getMenu() { return mMenu; }
|
||||
LLToggleableMenu* getMenu() { return mMenu; }
|
||||
|
||||
private:
|
||||
|
||||
|
|
@ -79,8 +81,8 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
LLMenuGL* mMenu;
|
||||
LLPanelWearing* mPanelWearing;
|
||||
LLToggleableMenu* mMenu;
|
||||
LLPanelWearing* mPanelWearing;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -4160,6 +4160,11 @@ class LLObjectEnableReturn : public view_listener_t
|
|||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
if (LLSelectMgr::getInstance()->getSelection()->isEmpty())
|
||||
{
|
||||
// Do not enable if nothing selected
|
||||
return false;
|
||||
}
|
||||
#ifdef HACKED_GODLIKE_VIEWER
|
||||
bool new_value = true;
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu
|
||||
<toggleable_menu
|
||||
layout="topleft"
|
||||
name="Add Wearable Gear Menu">
|
||||
<menu_item_check
|
||||
|
|
@ -38,4 +38,4 @@
|
|||
function="AddWearable.Gear.Visible"
|
||||
parameter="by_type" />
|
||||
</menu_item_check>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu
|
||||
<toggleable_menu
|
||||
layout="topleft"
|
||||
name="Gear COF">
|
||||
<menu
|
||||
|
|
@ -10,4 +10,4 @@
|
|||
label="New Body Parts"
|
||||
layout="topleft"
|
||||
name="COF.Geear.New_Body_Parts" />
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu
|
||||
<toggleable_menu
|
||||
layout="topleft"
|
||||
mouse_opaque="false"
|
||||
name="menu_gesture_gear"
|
||||
|
|
@ -62,4 +62,4 @@
|
|||
function="Gesture.EnableAction"
|
||||
parameter="edit_gesture" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu
|
||||
<toggleable_menu
|
||||
create_jump_keys="true"
|
||||
layout="topleft"
|
||||
mouse_opaque="false"
|
||||
|
|
@ -124,4 +124,4 @@
|
|||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Share"/>
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu
|
||||
<toggleable_menu
|
||||
create_jump_keys="true"
|
||||
layout="topleft"
|
||||
mouse_opaque="false"
|
||||
|
|
@ -136,4 +136,4 @@
|
|||
<menu_item_call.on_click
|
||||
function="InspectObject.MoreInfo"/>
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu
|
||||
<toggleable_menu
|
||||
create_jump_keys="true"
|
||||
layout="topleft"
|
||||
mouse_opaque="false"
|
||||
|
|
@ -63,4 +63,4 @@
|
|||
<menu_item_call.on_visible
|
||||
function="IsGodCustomerService"/>
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu
|
||||
<toggleable_menu
|
||||
bottom="806"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
|
|
@ -125,4 +125,4 @@
|
|||
function="Inventory.GearDefault.Custom.Action"
|
||||
parameter="empty_trash" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu
|
||||
<toggleable_menu
|
||||
layout="topleft"
|
||||
visible="false"
|
||||
name="Gear Outfit">
|
||||
|
|
@ -212,4 +212,4 @@
|
|||
function="Gear.OnVisible"
|
||||
parameter="delete" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu name="menu_group_plus"
|
||||
<toggleable_menu
|
||||
name="menu_group_plus"
|
||||
left="0" bottom="0" visible="false"
|
||||
mouse_opaque="false">
|
||||
<menu_item_check
|
||||
|
|
@ -43,4 +44,4 @@
|
|||
<menu_item_call name="show_blocked_list" label="Show Blocked Residents & Objects">
|
||||
<menu_item_call.on_click function="SideTray.ShowPanel" parameter="panel_block_list_sidetray" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu name="menu_group_plus"
|
||||
<toggleable_menu
|
||||
name="menu_group_plus"
|
||||
left="0" bottom="0" visible="false"
|
||||
mouse_opaque="false">
|
||||
<menu_item_check
|
||||
|
|
@ -22,4 +23,4 @@
|
|||
<menu_item_call.on_enable
|
||||
function="People.Group.Minus.Enable"/>
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu name="menu_group_plus"
|
||||
<toggleable_menu
|
||||
name="menu_group_plus"
|
||||
left="0" bottom="0" visible="false"
|
||||
mouse_opaque="false">
|
||||
<menu_item_check
|
||||
|
|
@ -45,4 +46,4 @@
|
|||
<menu_item_call name="show_blocked_list" label="Show Blocked Residents & Objects">
|
||||
<menu_item_call.on_click function="SideTray.ShowPanel" userdata="panel_block_list_sidetray" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu name="menu_group_plus"
|
||||
<toggleable_menu
|
||||
name="menu_group_plus"
|
||||
left="0" bottom="0" visible="false"
|
||||
mouse_opaque="false">
|
||||
<menu_item_check
|
||||
|
|
@ -35,4 +36,4 @@
|
|||
<menu_item_call name="show_blocked_list" label="Show Blocked Residents & Objects">
|
||||
<menu_item_call.on_click function="SideTray.ShowPanel" userdata="panel_block_list_sidetray" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu
|
||||
<toggleable_menu
|
||||
bottom="806"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
|
|
@ -145,4 +145,4 @@
|
|||
function="Places.LandmarksGear.Folding.Action"
|
||||
parameter="sort_by_date" />
|
||||
</menu_item_check>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu
|
||||
<toggleable_menu
|
||||
bottom="806"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
|
|
@ -174,4 +174,4 @@
|
|||
function="Places.LandmarksGear.Enable"
|
||||
parameter="create_pick" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu
|
||||
<toggleable_menu
|
||||
name="Teleport History Gear Context Menu"
|
||||
left="0"
|
||||
bottom="0"
|
||||
|
|
@ -33,4 +33,4 @@
|
|||
<menu_item_call.on_click
|
||||
function="TeleportHistory.ClearTeleportHistory" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<menu
|
||||
<toggleable_menu
|
||||
layout="topleft"
|
||||
visible="false"
|
||||
name="Gear Wearing">
|
||||
|
|
@ -20,4 +20,4 @@
|
|||
function="Gear.OnEnable"
|
||||
parameter="take_off" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</toggleable_menu>
|
||||
|
|
|
|||
|
|
@ -2409,10 +2409,10 @@ Wilt u de [SECOND_LIFE] website bezoeken om dit in te stellen?
|
|||
Onderwerp: [SUBJECT], Bericht: [MESSAGE]
|
||||
</notification>
|
||||
<notification name="FriendOnline">
|
||||
[FIRST] [LAST] is Online
|
||||
[NAME] is Online
|
||||
</notification>
|
||||
<notification name="FriendOffline">
|
||||
[FIRST] [LAST] is Offline
|
||||
[NAME] is Offline
|
||||
</notification>
|
||||
<notification name="AddSelfFriend">
|
||||
U kunt uzelf niet als vriend toevoegen.
|
||||
|
|
@ -2574,7 +2574,7 @@ Indien u streaming media wilt zien op percelen die dit ondersteunen, dient u naa
|
|||
De objecten die uw eigendom zijn op het geselecteerde perceel zijn geretourneerd naar uw inventaris.
|
||||
</notification>
|
||||
<notification name="OtherObjectsReturned">
|
||||
De objecten op het geselecteerde perceel dat het eigendom is van [FIRST] [LAST], zijn geretourneerd naar zijn of haar inventaris.
|
||||
De objecten op het geselecteerde perceel dat het eigendom is van [NAME], zijn geretourneerd naar zijn of haar inventaris.
|
||||
</notification>
|
||||
<notification name="OtherObjectsReturned2">
|
||||
De objecten op het geselecteerde perceel dat het eigendom is van inwoner '[NAME]', zijn geretourneerd naar hun eigenaar.
|
||||
|
|
@ -2701,7 +2701,7 @@ Probeer het alstublieft opnieuw over enkele ogenblikken.
|
|||
Geen geldig perceel kon gevonden worden.
|
||||
</notification>
|
||||
<notification name="ObjectGiveItem">
|
||||
Een object genaamd [OBJECTFROMNAME], eigendom van [FIRST] [LAST], heeft u een [OBJECTTYPE] genaamd [OBJECTNAME] gegeven.
|
||||
Een object genaamd <nolink>[OBJECTFROMNAME]</nolink>, eigendom van [NAME_SLURL], heeft u een [OBJECTTYPE] genaamd [ITEM_SLURL] gegeven.
|
||||
<form name="form">
|
||||
<button name="Keep" text="Behouden"/>
|
||||
<button name="Discard" text="Afwijzen"/>
|
||||
|
|
@ -2840,7 +2840,7 @@ Dit verzoek inwilligen?
|
|||
</form>
|
||||
</notification>
|
||||
<notification name="ScriptDialog">
|
||||
[FIRST] [LAST]'s '[TITLE]'
|
||||
[NAME]'s '<nolink>[TITLE]</nolink>'
|
||||
[MESSAGE]
|
||||
<form name="form">
|
||||
<button name="Ignore" text="Negeren"/>
|
||||
|
|
@ -2941,13 +2941,13 @@ Klik Accepteren om deel te nemen aan dit gesprek of Afwijzen om de uitnodiging a
|
|||
</form>
|
||||
</notification>
|
||||
<notification name="AutoUnmuteByIM">
|
||||
Er is een instant message naar [FIRST] [LAST] gestuurd, waardoor deze automatisch van de negeerlijst is gehaald.
|
||||
Er is een instant message naar [NAME] gestuurd, waardoor deze automatisch van de negeerlijst is gehaald.
|
||||
</notification>
|
||||
<notification name="AutoUnmuteByMoney">
|
||||
Er is geld gegeven aan [FIRST] [LAST], waardoor deze automatisch van de negeerlijst is gehaald.
|
||||
Er is geld gegeven aan [NAME], waardoor deze automatisch van de negeerlijst is gehaald.
|
||||
</notification>
|
||||
<notification name="AutoUnmuteByInventory">
|
||||
Er is inventaris aangeboden aan [FIRST] [LAST], waardoor deze automatisch van de negeerlijst is gehaald.
|
||||
Er is inventaris aangeboden aan [NAME], waardoor deze automatisch van de negeerlijst is gehaald.
|
||||
</notification>
|
||||
<notification name="VoiceInviteGroup">
|
||||
[NAME] doet nu mee met een Voice chat gesprek binnen de groep [GROUP].
|
||||
|
|
|
|||
Loading…
Reference in New Issue