Automated merge with ssh://rick@hg.lindenlab.com/q/viewer-hotfix/
commit
62ed45b5b0
|
|
@ -54,7 +54,10 @@ else (STANDALONE)
|
|||
endif (WINDOWS)
|
||||
set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/apr-1)
|
||||
|
||||
if (LINUX AND VIEWER)
|
||||
list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid)
|
||||
endif (LINUX AND VIEWER)
|
||||
if (LINUX)
|
||||
if (VIEWER)
|
||||
list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid)
|
||||
endif (VIEWER)
|
||||
list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} rt)
|
||||
endif (LINUX)
|
||||
endif (STANDALONE)
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ elseif (LINUX)
|
|||
gmodule-2.0
|
||||
dl
|
||||
gthread-2.0
|
||||
rt
|
||||
glib-2.0
|
||||
)
|
||||
endif (STANDALONE)
|
||||
|
|
|
|||
|
|
@ -1565,25 +1565,13 @@ void LLFloater::draw()
|
|||
// draw background
|
||||
if( isBackgroundVisible() )
|
||||
{
|
||||
drawShadow(this);
|
||||
|
||||
S32 left = LLPANEL_BORDER_WIDTH;
|
||||
S32 top = getRect().getHeight() - LLPANEL_BORDER_WIDTH;
|
||||
S32 right = getRect().getWidth() - LLPANEL_BORDER_WIDTH;
|
||||
S32 bottom = LLPANEL_BORDER_WIDTH;
|
||||
|
||||
static LLUICachedControl<S32> shadow_offset_S32 ("DropShadowFloater", 0);
|
||||
static LLUIColor shadow_color_cached = LLUIColorTable::instance().getColor("ColorDropShadow");
|
||||
LLColor4 shadow_color = shadow_color_cached;
|
||||
F32 shadow_offset = (F32)shadow_offset_S32;
|
||||
|
||||
if (!isBackgroundOpaque())
|
||||
{
|
||||
shadow_offset *= 0.2f;
|
||||
shadow_color.mV[VALPHA] *= 0.5f;
|
||||
}
|
||||
gl_drop_shadow(left, top, right, bottom,
|
||||
shadow_color % alpha,
|
||||
llround(shadow_offset));
|
||||
|
||||
LLUIImage* image = NULL;
|
||||
LLColor4 color;
|
||||
if (isBackgroundOpaque())
|
||||
|
|
@ -1666,6 +1654,29 @@ void LLFloater::draw()
|
|||
}
|
||||
}
|
||||
|
||||
void LLFloater::drawShadow(LLPanel* panel)
|
||||
{
|
||||
F32 alpha = panel->getDrawContext().mAlpha;
|
||||
S32 left = LLPANEL_BORDER_WIDTH;
|
||||
S32 top = panel->getRect().getHeight() - LLPANEL_BORDER_WIDTH;
|
||||
S32 right = panel->getRect().getWidth() - LLPANEL_BORDER_WIDTH;
|
||||
S32 bottom = LLPANEL_BORDER_WIDTH;
|
||||
|
||||
static LLUICachedControl<S32> shadow_offset_S32 ("DropShadowFloater", 0);
|
||||
static LLUIColor shadow_color_cached = LLUIColorTable::instance().getColor("ColorDropShadow");
|
||||
LLColor4 shadow_color = shadow_color_cached;
|
||||
F32 shadow_offset = (F32)shadow_offset_S32;
|
||||
|
||||
if (!panel->isBackgroundOpaque())
|
||||
{
|
||||
shadow_offset *= 0.2f;
|
||||
shadow_color.mV[VALPHA] *= 0.5f;
|
||||
}
|
||||
gl_drop_shadow(left, top, right, bottom,
|
||||
shadow_color % alpha,
|
||||
llround(shadow_offset));
|
||||
}
|
||||
|
||||
void LLFloater::setCanMinimize(BOOL can_minimize)
|
||||
{
|
||||
// if removing minimize/restore button programmatically,
|
||||
|
|
|
|||
|
|
@ -222,6 +222,7 @@ public:
|
|||
virtual BOOL handleScrollWheel(S32 x, S32 y, S32 mask);
|
||||
|
||||
virtual void draw();
|
||||
virtual void drawShadow(LLPanel* panel);
|
||||
|
||||
virtual void onOpen(const LLSD& key) {}
|
||||
virtual void onClose(bool app_quitting) {}
|
||||
|
|
|
|||
|
|
@ -4,13 +4,13 @@
|
|||
<key>AFKTimeout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Time before automatically setting AFK (away from keyboard) mode (seconds)</string>
|
||||
<string>Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<real>300.0</real>
|
||||
<real>0</real>
|
||||
</map>
|
||||
<key>AdvanceSnapshot</key>
|
||||
<map>
|
||||
|
|
@ -197,7 +197,7 @@
|
|||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>1.0</real>
|
||||
<real>0.5</real>
|
||||
</map>
|
||||
<key>AudioLevelMic</key>
|
||||
<map>
|
||||
|
|
@ -219,7 +219,7 @@
|
|||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>1.0</real>
|
||||
<real>0.5</real>
|
||||
</map>
|
||||
<key>AudioLevelRolloff</key>
|
||||
<map>
|
||||
|
|
@ -241,7 +241,7 @@
|
|||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>1.0</real>
|
||||
<real>0.5</real>
|
||||
</map>
|
||||
<key>AudioLevelUI</key>
|
||||
<map>
|
||||
|
|
@ -4328,13 +4328,13 @@
|
|||
<key>LoginLocation</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Login at same location you last logged out</string>
|
||||
<string>Login location ('last', 'home')</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>last</string>
|
||||
<string>home</string>
|
||||
</map>
|
||||
<key>LoginPage</key>
|
||||
<map>
|
||||
|
|
@ -5554,7 +5554,7 @@
|
|||
<key>PreferredMaturity</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Setting for the user's preferred maturity level.</string>
|
||||
<string>Setting for the user's preferred maturity level (consts in indra_constants.h)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -10114,7 +10114,7 @@
|
|||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>UseFreezeFrame</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -422,6 +422,18 @@ void LLBottomTray::showSnapshotButton(BOOL visible)
|
|||
setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
|
||||
}
|
||||
|
||||
void LLBottomTray::toggleMovementControls()
|
||||
{
|
||||
if (mMovementButton)
|
||||
mMovementButton->onCommit();
|
||||
}
|
||||
|
||||
void LLBottomTray::toggleCameraControls()
|
||||
{
|
||||
if (mCamButton)
|
||||
mCamButton->onCommit();
|
||||
}
|
||||
|
||||
BOOL LLBottomTray::postBuild()
|
||||
{
|
||||
|
||||
|
|
|
|||
|
|
@ -94,6 +94,9 @@ public:
|
|||
void showCameraButton(BOOL visible);
|
||||
void showSnapshotButton(BOOL visible);
|
||||
|
||||
void toggleMovementControls();
|
||||
void toggleCameraControls();
|
||||
|
||||
void onMouselookModeIn();
|
||||
void onMouselookModeOut();
|
||||
|
||||
|
|
|
|||
|
|
@ -260,6 +260,10 @@ private:
|
|||
* @see sOnCurrentChannelChanged()
|
||||
*/
|
||||
static LLVoiceChannel* sCurrentVoiceCanel;
|
||||
|
||||
/* virtual */
|
||||
LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
|
||||
|
||||
boost::signals2::connection mVoiceChannelStateChangeConnection;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -682,17 +682,24 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
|
|||
}
|
||||
BOOL notify = FALSE;
|
||||
LLSD args;
|
||||
LLSD payload;
|
||||
for(S32 i = 0; i < count; ++i)
|
||||
{
|
||||
msg->getUUIDFast(_PREHASH_AgentBlock, _PREHASH_AgentID, agent_id, i);
|
||||
payload["FROM_ID"] = agent_id;
|
||||
info = getBuddyInfo(agent_id);
|
||||
if(info)
|
||||
{
|
||||
setBuddyOnline(agent_id,online);
|
||||
if(chat_notify)
|
||||
{
|
||||
notify = TRUE;
|
||||
args["NAME_SLURL"] = LLSLURL::buildCommand("agent", agent_id, "about");
|
||||
std::string first, last;
|
||||
if(gCacheName->getName(agent_id, first, last))
|
||||
{
|
||||
notify = TRUE;
|
||||
args["FIRST"] = first;
|
||||
args["LAST"] = last;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -719,13 +726,13 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
|
|||
notification =
|
||||
LLNotificationsUtil::add("FriendOnline",
|
||||
args,
|
||||
LLSD().with("respond_on_mousedown", TRUE),
|
||||
payload.with("respond_on_mousedown", TRUE),
|
||||
boost::bind(&LLAvatarActions::startIM, agent_id));
|
||||
}
|
||||
else
|
||||
{
|
||||
notification =
|
||||
LLNotificationsUtil::add("FriendOffline", args);
|
||||
LLNotificationsUtil::add("FriendOffline", args, payload);
|
||||
}
|
||||
|
||||
// If there's an open IM session with this agent, send a notification there too.
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ public:
|
|||
BOOL handleToolTip(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLTextBase* name = getChild<LLTextBase>("user_name");
|
||||
if (name && name->parentPointInView(x, y) && mAvatarID.notNull() && SYSTEM_FROM != mFrom)
|
||||
if (name && name->parentPointInView(x, y) && mAvatarID.notNull() && mFrom.size() && SYSTEM_FROM != mFrom)
|
||||
{
|
||||
|
||||
// Spawn at right side of the name textbox.
|
||||
|
|
@ -179,12 +179,7 @@ public:
|
|||
}
|
||||
else if (level == "add")
|
||||
{
|
||||
std::string name;
|
||||
name.assign(getFirstName());
|
||||
name.append(" ");
|
||||
name.append(getLastName());
|
||||
|
||||
LLAvatarActions::requestFriendshipDialog(getAvatarId(), name);
|
||||
LLAvatarActions::requestFriendshipDialog(getAvatarId(), mFrom);
|
||||
}
|
||||
else if (level == "remove")
|
||||
{
|
||||
|
|
@ -253,8 +248,6 @@ public:
|
|||
}
|
||||
|
||||
const LLUUID& getAvatarId () const { return mAvatarID;}
|
||||
const std::string& getFirstName() const { return mFirstName; }
|
||||
const std::string& getLastName () const { return mLastName; }
|
||||
|
||||
void setup(const LLChat& chat,const LLStyle::Params& style_params)
|
||||
{
|
||||
|
|
@ -264,7 +257,7 @@ public:
|
|||
gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4));
|
||||
|
||||
//*TODO overly defensive thing, source type should be maintained out there
|
||||
if(chat.mFromID.isNull() || chat.mFromName == SYSTEM_FROM)
|
||||
if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM)
|
||||
{
|
||||
mSourceType = CHAT_SOURCE_SYSTEM;
|
||||
}
|
||||
|
|
@ -275,9 +268,11 @@ public:
|
|||
userName->setColor(style_params.color());
|
||||
|
||||
userName->setValue(chat.mFromName);
|
||||
mFrom = chat.mFromName;
|
||||
if (chat.mFromName.empty() || CHAT_SOURCE_SYSTEM == mSourceType)
|
||||
{
|
||||
userName->setValue(LLTrans::getString("SECOND_LIFE"));
|
||||
mFrom = LLTrans::getString("SECOND_LIFE");
|
||||
userName->setValue(mFrom);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -337,8 +332,7 @@ public:
|
|||
{
|
||||
if (id != mAvatarID)
|
||||
return;
|
||||
mFirstName = first;
|
||||
mLastName = last;
|
||||
mFrom = first + " " + last;
|
||||
}
|
||||
protected:
|
||||
static const S32 PADDING = 20;
|
||||
|
|
@ -423,8 +417,6 @@ protected:
|
|||
|
||||
LLUUID mAvatarID;
|
||||
EChatSourceType mSourceType;
|
||||
std::string mFirstName;
|
||||
std::string mLastName;
|
||||
std::string mFrom;
|
||||
LLUUID mSessionID;
|
||||
|
||||
|
|
@ -796,6 +788,12 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
|
|||
}
|
||||
}
|
||||
|
||||
if (irc_me && !use_plain_text_chat_history)
|
||||
{
|
||||
message = chat.mFromName + message;
|
||||
}
|
||||
|
||||
|
||||
mEditor->appendText(message, FALSE, style_params);
|
||||
}
|
||||
mEditor->blockUndo();
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@
|
|||
#include "llpanelmaininventory.h"
|
||||
#include "llresmgr.h"
|
||||
#include "llviewerfoldertype.h"
|
||||
#include "lltransientfloatermgr.h"
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
/// LLFloaterInventory
|
||||
|
|
@ -49,10 +50,12 @@
|
|||
LLFloaterInventory::LLFloaterInventory(const LLSD& key)
|
||||
: LLFloater(key)
|
||||
{
|
||||
LLTransientFloaterMgr::getInstance()->addControlView(this);
|
||||
}
|
||||
|
||||
LLFloaterInventory::~LLFloaterInventory()
|
||||
{
|
||||
LLTransientFloaterMgr::getInstance()->removeControlView(this);
|
||||
}
|
||||
|
||||
BOOL LLFloaterInventory::postBuild()
|
||||
|
|
|
|||
|
|
@ -511,7 +511,8 @@ void LLFloaterPreference::onOpen(const LLSD& key)
|
|||
// if we have no agent, we can't let them choose anything
|
||||
// if we have an agent, then we only let them choose if they have a choice
|
||||
bool can_choose_maturity =
|
||||
gAgent.getID().notNull() && (gAgent.isMature() || gAgent.isGodlike());
|
||||
gAgent.getID().notNull() &&
|
||||
(gAgent.isMature() || gAgent.isGodlike());
|
||||
|
||||
LLComboBox* maturity_combo = getChild<LLComboBox>("maturity_desired_combobox");
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
#include "llavatariconctrl.h"
|
||||
#include "llgroupiconctrl.h"
|
||||
#include "llagent.h"
|
||||
#include "lltransientfloatermgr.h"
|
||||
|
||||
//
|
||||
// LLIMFloaterContainer
|
||||
|
|
@ -47,9 +48,13 @@ LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
|
|||
: LLMultiFloater(seed)
|
||||
{
|
||||
mAutoResize = FALSE;
|
||||
LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
|
||||
}
|
||||
|
||||
LLIMFloaterContainer::~LLIMFloaterContainer(){}
|
||||
LLIMFloaterContainer::~LLIMFloaterContainer()
|
||||
{
|
||||
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
|
||||
}
|
||||
|
||||
BOOL LLIMFloaterContainer::postBuild()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -120,6 +120,7 @@ private:
|
|||
void onClickTeleport();
|
||||
void onClickInviteToGroup();
|
||||
void onClickPay();
|
||||
void onClickShare();
|
||||
void onToggleMute();
|
||||
void onClickReport();
|
||||
void onClickFreeze();
|
||||
|
|
@ -213,6 +214,7 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
|
|||
mCommitCallbackRegistrar.add("InspectAvatar.Teleport", boost::bind(&LLInspectAvatar::onClickTeleport, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup", boost::bind(&LLInspectAvatar::onClickInviteToGroup, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Pay", boost::bind(&LLInspectAvatar::onClickPay, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Share", boost::bind(&LLInspectAvatar::onClickShare, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.ToggleMute", boost::bind(&LLInspectAvatar::onToggleMute, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Freeze",
|
||||
boost::bind(&LLInspectAvatar::onClickFreeze, this));
|
||||
|
|
@ -678,6 +680,12 @@ void LLInspectAvatar::onClickPay()
|
|||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickShare()
|
||||
{
|
||||
LLAvatarActions::share(mAvatarID);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onToggleMute()
|
||||
{
|
||||
LLMute mute(mAvatarID, mAvatarName, LLMute::AGENT);
|
||||
|
|
|
|||
|
|
@ -290,8 +290,12 @@ void LLInventoryPanel::modelChanged(U32 mask)
|
|||
if(bridge)
|
||||
{ // Clear the display name first, so it gets properly re-built during refresh()
|
||||
bridge->clearDisplayName();
|
||||
|
||||
view_item->refresh();
|
||||
|
||||
// Set the new tooltip with the new display name.
|
||||
view_item->setToolTip(bridge->getDisplayName());
|
||||
}
|
||||
view_item->refresh();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -69,6 +69,8 @@ const static std::string MULTI_LINE_PREFIX(" ");
|
|||
* Katar Ivercourt is Offline
|
||||
* [3:00] Katar Ivercourt is Offline
|
||||
* [2009/11/20 3:01] Corba ProductEngine is Offline
|
||||
*
|
||||
* Note: "You" was used as an avatar names in viewers of previous versions
|
||||
*/
|
||||
const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$");
|
||||
|
||||
|
|
@ -78,6 +80,9 @@ const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+
|
|||
*/
|
||||
const static boost::regex NAME_AND_TEXT("(You:|Second Life:|[^\\s:]+\\s*[:]{1}|\\S+\\s+[^\\s:]+[:]{1})?(\\s*)(.*)");
|
||||
|
||||
//is used to parse complex object names like "Xstreet SL Terminal v2.2.5 st"
|
||||
const static std::string NAME_TEXT_DIVIDER(": ");
|
||||
|
||||
const static int IDX_TIMESTAMP = 1;
|
||||
const static int IDX_STUFF = 2;
|
||||
const static int IDX_NAME = 1;
|
||||
|
|
@ -160,10 +165,19 @@ void LLLogChat::saveHistory(const std::string& filename,
|
|||
if (gSavedPerAccountSettings.getBOOL("LogTimestamp"))
|
||||
item["time"] = LLLogChat::timestamp(gSavedPerAccountSettings.getBOOL("LogTimestampDate"));
|
||||
|
||||
item["from"] = from;
|
||||
item["from_id"] = from_id;
|
||||
item["message"] = line;
|
||||
|
||||
//adding "Second Life:" for all system messages to make chat log history parsing more reliable
|
||||
if (from.empty() && from_id.isNull())
|
||||
{
|
||||
item["from"] = SYSTEM_FROM;
|
||||
}
|
||||
else
|
||||
{
|
||||
item["from"] = from;
|
||||
}
|
||||
|
||||
file << LLChatLogFormatter(item) << std::endl;
|
||||
|
||||
file.close();
|
||||
|
|
@ -398,6 +412,18 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im)
|
|||
im[IM_FROM_ID] = LLUUID::null;
|
||||
}
|
||||
|
||||
//possibly a case of complex object names consisting of 3+ words
|
||||
if (!has_name)
|
||||
{
|
||||
U32 divider_pos = stuff.find(NAME_TEXT_DIVIDER);
|
||||
if (divider_pos != std::string::npos && divider_pos < (stuff.length() - NAME_TEXT_DIVIDER.length()))
|
||||
{
|
||||
im[IM_FROM] = stuff.substr(0, divider_pos);
|
||||
im[IM_TEXT] = stuff.substr(divider_pos + NAME_TEXT_DIVIDER.length());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!has_name)
|
||||
{
|
||||
//text is mandatory
|
||||
|
|
|
|||
|
|
@ -282,7 +282,7 @@ void LLNearbyChatScreenChannel::showToastsBottom()
|
|||
gFloaterView->sendChildToBack(toast);
|
||||
}
|
||||
|
||||
bottom = toast->getRect().mTop;
|
||||
bottom = toast->getRect().mTop - toast->getTopPad();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -220,6 +220,7 @@ void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChat
|
|||
{
|
||||
LLChat chat_msg(notification->getMessage());
|
||||
chat_msg.mSourceType = type;
|
||||
chat_msg.mFromName = SYSTEM_FROM;
|
||||
nearby_chat->addMessage(chat_msg);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,6 +43,37 @@
|
|||
|
||||
using namespace LLNotificationsUI;
|
||||
|
||||
class LLOnalineStatusToast : public LLToastPanel
|
||||
{
|
||||
public:
|
||||
|
||||
struct Params
|
||||
{
|
||||
LLNotificationPtr notification;
|
||||
LLUUID avatar_id;
|
||||
std::string message;
|
||||
|
||||
Params() {}
|
||||
};
|
||||
|
||||
LLOnalineStatusToast(Params& p) : LLToastPanel(p.notification)
|
||||
{
|
||||
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_online_status.xml");
|
||||
|
||||
childSetValue("avatar_icon", p.avatar_id);
|
||||
childSetValue("message", p.message);
|
||||
|
||||
if (p.notification->getPayload().has("respond_on_mousedown")
|
||||
&& p.notification->getPayload()["respond_on_mousedown"] )
|
||||
{
|
||||
setMouseDownCallback(boost::bind(&LLNotification::respond, p.notification,
|
||||
p.notification->getResponseTemplate()));
|
||||
}
|
||||
|
||||
// set line max count to 2 in case of a very long name
|
||||
snapToMessageHeight(getChild<LLTextBox>("message"), 2);
|
||||
}
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id)
|
||||
|
|
@ -114,7 +145,19 @@ bool LLTipHandler::processNotification(const LLSD& notify)
|
|||
LLHandlerUtil::spawnIMSession(name, from_id);
|
||||
}
|
||||
|
||||
LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
|
||||
LLToastPanel* notify_box = NULL;
|
||||
if("FriendOffline" == notification->getName() || "FriendOnline" == notification->getName())
|
||||
{
|
||||
LLOnalineStatusToast::Params p;
|
||||
p.notification = notification;
|
||||
p.message = notification->getMessage();
|
||||
p.avatar_id = notification->getPayload()["FROM_ID"];
|
||||
notify_box = new LLOnalineStatusToast(p);
|
||||
}
|
||||
else
|
||||
{
|
||||
notify_box = new LLToastNotifyPanel(notification);
|
||||
}
|
||||
|
||||
LLToast::Params p;
|
||||
p.notif_id = notification->getID();
|
||||
|
|
|
|||
|
|
@ -79,17 +79,12 @@ LLScreenChannelBase::~LLScreenChannelBase()
|
|||
|
||||
bool LLScreenChannelBase::isHovering()
|
||||
{
|
||||
bool res = mHoveredToast != NULL;
|
||||
if (!res)
|
||||
if (!mHoveredToast)
|
||||
{
|
||||
return res;
|
||||
return false;
|
||||
}
|
||||
|
||||
S32 x, y;
|
||||
mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
|
||||
gViewerWindow->getCurrentMouseY(), &x, &y);
|
||||
res = mHoveredToast->pointInView(x, y) == TRUE;
|
||||
return res;
|
||||
return mHoveredToast->isHovered();
|
||||
}
|
||||
|
||||
void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
|
||||
|
|
@ -479,7 +474,8 @@ void LLScreenChannel::showToastsBottom()
|
|||
{
|
||||
if(it != mToastList.rbegin())
|
||||
{
|
||||
bottom = (*(it-1)).toast->getRect().mTop;
|
||||
LLToast* toast = (*(it-1)).toast;
|
||||
bottom = toast->getRect().mTop - toast->getTopPad();
|
||||
toast_margin = gSavedSettings.getS32("ToastGap");
|
||||
}
|
||||
|
||||
|
|
@ -777,23 +773,16 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
|
|||
{
|
||||
// because of LLViewerWindow::updateUI() that NOT ALWAYS calls onMouseEnter BEFORE onMouseLeave
|
||||
// we must check hovering directly to prevent incorrect setting for hovering in a channel
|
||||
S32 x,y;
|
||||
if (mouse_enter)
|
||||
{
|
||||
toast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
|
||||
gViewerWindow->getCurrentMouseY(), &x, &y);
|
||||
bool hover = toast->pointInView(x, y) == TRUE;
|
||||
if (hover)
|
||||
if (toast->isHovered())
|
||||
{
|
||||
mHoveredToast = toast;
|
||||
}
|
||||
}
|
||||
else if (mHoveredToast != NULL)
|
||||
{
|
||||
mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
|
||||
gViewerWindow->getCurrentMouseY(), &x, &y);
|
||||
bool hover = mHoveredToast->pointInView(x, y) == TRUE;
|
||||
if (!hover)
|
||||
if (!mHoveredToast->isHovered())
|
||||
{
|
||||
mHoveredToast = NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -248,6 +248,11 @@ LLSideTray::LLSideTray(Params& params)
|
|||
// panel_name should be specified via "parameter" attribute.
|
||||
commit.add("SideTray.ShowPanel", boost::bind(&LLSideTray::showPanel, this, _2, LLUUID::null));
|
||||
LLTransientFloaterMgr::getInstance()->addControlView(this);
|
||||
LLView* side_bar_tabs = gViewerWindow->getRootView()->getChildView("side_bar_tabs");
|
||||
if (side_bar_tabs != NULL)
|
||||
{
|
||||
LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs);
|
||||
}
|
||||
|
||||
LLPanel::Params p;
|
||||
p.name = "buttons_panel";
|
||||
|
|
|
|||
|
|
@ -2899,7 +2899,9 @@ bool process_login_success_response()
|
|||
text = response["agent_region_access"].asString();
|
||||
if (!text.empty())
|
||||
{
|
||||
int preferredMaturity = LLAgent::convertTextToMaturity(text[0]);
|
||||
U32 preferredMaturity =
|
||||
llmin((U32)LLAgent::convertTextToMaturity(text[0]),
|
||||
gSavedSettings.getU32("PreferredMaturity"));
|
||||
gSavedSettings.setU32("PreferredMaturity", preferredMaturity);
|
||||
}
|
||||
// During the AO transition, this flag will be true. Then the flag will
|
||||
|
|
|
|||
|
|
@ -68,12 +68,17 @@ LLToast::LLToast(const LLToast::Params& p)
|
|||
mNotification(p.notification),
|
||||
mIsHidden(false),
|
||||
mHideBtnPressed(false),
|
||||
mIsTip(p.is_tip)
|
||||
mIsTip(p.is_tip),
|
||||
mWrapperPanel(NULL)
|
||||
{
|
||||
LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL);
|
||||
|
||||
setCanDrag(FALSE);
|
||||
|
||||
mWrapperPanel = getChild<LLPanel>("wrapper_panel");
|
||||
mWrapperPanel->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
|
||||
mWrapperPanel->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
|
||||
|
||||
if(mPanel)
|
||||
{
|
||||
insertPanel(mPanel);
|
||||
|
|
@ -83,6 +88,8 @@ LLToast::LLToast(const LLToast::Params& p)
|
|||
{
|
||||
mHideBtn = getChild<LLButton>("hide_btn");
|
||||
mHideBtn->setClickedCallback(boost::bind(&LLToast::hide,this));
|
||||
mHideBtn->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
|
||||
mHideBtn->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
|
||||
}
|
||||
|
||||
// init callbacks if present
|
||||
|
|
@ -174,6 +181,42 @@ void LLToast::hide()
|
|||
mOnFadeSignal(this);
|
||||
}
|
||||
|
||||
void LLToast::onFocusLost()
|
||||
{
|
||||
if(mWrapperPanel && !isBackgroundVisible())
|
||||
{
|
||||
// Lets make wrapper panel behave like a floater
|
||||
setBackgroundOpaque(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
void LLToast::onFocusReceived()
|
||||
{
|
||||
if(mWrapperPanel && !isBackgroundVisible())
|
||||
{
|
||||
// Lets make wrapper panel behave like a floater
|
||||
setBackgroundOpaque(TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
S32 LLToast::getTopPad()
|
||||
{
|
||||
if(mWrapperPanel)
|
||||
{
|
||||
return getRect().getHeight() - mWrapperPanel->getRect().getHeight();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
S32 LLToast::getRightPad()
|
||||
{
|
||||
if(mWrapperPanel)
|
||||
{
|
||||
return getRect().getWidth() - mWrapperPanel->getRect().getWidth();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
void LLToast::setCanFade(bool can_fade)
|
||||
{
|
||||
|
|
@ -199,22 +242,21 @@ void LLToast::reshapeToPanel()
|
|||
if(!panel)
|
||||
return;
|
||||
|
||||
LLRect panel_rect;
|
||||
LLRect panel_rect = panel->getRect();
|
||||
|
||||
panel_rect = panel->getRect();
|
||||
reshape(panel_rect.getWidth(), panel_rect.getHeight());
|
||||
panel_rect.setLeftTopAndSize(0, panel_rect.getHeight(), panel_rect.getWidth(), panel_rect.getHeight());
|
||||
panel->setRect(panel_rect);
|
||||
panel->setShape(panel_rect);
|
||||
|
||||
LLRect toast_rect = getRect();
|
||||
toast_rect.setLeftTopAndSize(toast_rect.mLeft,toast_rect.mTop,panel_rect.getWidth(), panel_rect.getHeight());
|
||||
setRect(toast_rect);
|
||||
|
||||
toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop,
|
||||
panel_rect.getWidth() + getRightPad(), panel_rect.getHeight() + getTopPad());
|
||||
setShape(toast_rect);
|
||||
}
|
||||
|
||||
void LLToast::insertPanel(LLPanel* panel)
|
||||
{
|
||||
addChild(panel);
|
||||
mWrapperPanel->addChild(panel);
|
||||
reshapeToPanel();
|
||||
}
|
||||
|
||||
|
|
@ -227,6 +269,19 @@ void LLToast::draw()
|
|||
}
|
||||
|
||||
LLFloater::draw();
|
||||
|
||||
if(!isBackgroundVisible())
|
||||
{
|
||||
// Floater background is invisible, lets make wrapper panel look like a
|
||||
// floater - draw shadow.
|
||||
drawShadow(mWrapperPanel);
|
||||
|
||||
// Shadow will probably overlap close button, lets redraw the button
|
||||
if(mHideBtn)
|
||||
{
|
||||
drawChild(mHideBtn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
|
|
@ -261,43 +316,78 @@ void LLToast::setVisible(BOOL show)
|
|||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
void LLToast::onMouseEnter(S32 x, S32 y, MASK mask)
|
||||
void LLToast::onToastMouseEnter()
|
||||
{
|
||||
mOnToastHoverSignal(this, MOUSE_ENTER);
|
||||
|
||||
setBackgroundOpaque(TRUE);
|
||||
|
||||
//toasts fading is management by Screen Channel
|
||||
|
||||
sendChildToFront(mHideBtn);
|
||||
if(mHideBtn && mHideBtn->getEnabled())
|
||||
mHideBtn->setVisible(TRUE);
|
||||
mOnMouseEnterSignal(this);
|
||||
|
||||
LLModalDialog::onMouseEnter(x, y, mask);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
void LLToast::onMouseLeave(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
mOnToastHoverSignal(this, MOUSE_LEAVE);
|
||||
|
||||
//toasts fading is management by Screen Channel
|
||||
|
||||
if(mHideBtn && mHideBtn->getEnabled())
|
||||
LLRect panel_rc = mWrapperPanel->calcScreenRect();
|
||||
LLRect button_rc;
|
||||
if(mHideBtn)
|
||||
{
|
||||
if( mHideBtnPressed )
|
||||
{
|
||||
mHideBtnPressed = false;
|
||||
return;
|
||||
}
|
||||
mHideBtn->setVisible(FALSE);
|
||||
button_rc = mHideBtn->calcScreenRect();
|
||||
}
|
||||
|
||||
LLModalDialog::onMouseLeave(x, y, mask);
|
||||
S32 x, y;
|
||||
LLUI::getMousePositionScreen(&x, &y);
|
||||
|
||||
if(panel_rc.pointInRect(x, y) || button_rc.pointInRect(x, y))
|
||||
{
|
||||
mOnToastHoverSignal(this, MOUSE_ENTER);
|
||||
|
||||
setBackgroundOpaque(TRUE);
|
||||
|
||||
//toasts fading is management by Screen Channel
|
||||
|
||||
sendChildToFront(mHideBtn);
|
||||
if(mHideBtn && mHideBtn->getEnabled())
|
||||
{
|
||||
mHideBtn->setVisible(TRUE);
|
||||
}
|
||||
mOnMouseEnterSignal(this);
|
||||
mToastMouseEnterSignal(this, getValue());
|
||||
}
|
||||
}
|
||||
|
||||
void LLToast::onToastMouseLeave()
|
||||
{
|
||||
LLRect panel_rc = mWrapperPanel->calcScreenRect();
|
||||
LLRect button_rc;
|
||||
if(mHideBtn)
|
||||
{
|
||||
button_rc = mHideBtn->calcScreenRect();
|
||||
}
|
||||
|
||||
S32 x, y;
|
||||
LLUI::getMousePositionScreen(&x, &y);
|
||||
|
||||
if( !panel_rc.pointInRect(x, y) && !button_rc.pointInRect(x, y))
|
||||
{
|
||||
mOnToastHoverSignal(this, MOUSE_LEAVE);
|
||||
|
||||
//toasts fading is management by Screen Channel
|
||||
|
||||
if(mHideBtn && mHideBtn->getEnabled())
|
||||
{
|
||||
if( mHideBtnPressed )
|
||||
{
|
||||
mHideBtnPressed = false;
|
||||
return;
|
||||
}
|
||||
mHideBtn->setVisible(FALSE);
|
||||
}
|
||||
mToastMouseLeaveSignal(this, getValue());
|
||||
}
|
||||
}
|
||||
|
||||
void LLToast::setBackgroundOpaque(BOOL b)
|
||||
{
|
||||
if(mWrapperPanel && !isBackgroundVisible())
|
||||
{
|
||||
mWrapperPanel->setBackgroundOpaque(b);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLModalDialog::setBackgroundOpaque(b);
|
||||
}
|
||||
}
|
||||
|
||||
void LLNotificationsUI::LLToast::stopFading()
|
||||
{
|
||||
|
|
@ -315,6 +405,13 @@ void LLNotificationsUI::LLToast::startFading()
|
|||
}
|
||||
}
|
||||
|
||||
bool LLToast::isHovered()
|
||||
{
|
||||
S32 x, y;
|
||||
LLUI::getMousePositionScreen(&x, &y);
|
||||
return mWrapperPanel->calcScreenRect().pointInRect(x, y);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
BOOL LLToast::handleMouseDown(S32 x, S32 y, MASK mask)
|
||||
|
|
|
|||
|
|
@ -86,8 +86,6 @@ public:
|
|||
|
||||
// Toast handlers
|
||||
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
|
||||
virtual void onMouseEnter(S32 x, S32 y, MASK mask);
|
||||
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
|
||||
|
||||
//Fading
|
||||
|
||||
|
|
@ -97,6 +95,7 @@ public:
|
|||
/** Start fading timer */
|
||||
virtual void startFading();
|
||||
|
||||
bool isHovered();
|
||||
|
||||
// Operating with toasts
|
||||
// insert a panel to a toast
|
||||
|
|
@ -118,10 +117,22 @@ public:
|
|||
virtual void draw();
|
||||
//
|
||||
virtual void setVisible(BOOL show);
|
||||
|
||||
/*virtual*/ void setBackgroundOpaque(BOOL b);
|
||||
//
|
||||
virtual void hide();
|
||||
|
||||
/*virtual*/ void onFocusLost();
|
||||
|
||||
/*virtual*/ void onFocusReceived();
|
||||
|
||||
/**
|
||||
* Returns padding between floater top and wrapper_panel top.
|
||||
* This padding should be taken into account when positioning or reshaping toasts
|
||||
*/
|
||||
S32 getTopPad();
|
||||
|
||||
S32 getRightPad();
|
||||
|
||||
// get/set Toast's flags or states
|
||||
// get information whether the notification corresponding to the toast is valid or not
|
||||
|
|
@ -154,9 +165,15 @@ public:
|
|||
toast_hover_check_signal_t mOnToastHoverSignal;
|
||||
boost::signals2::connection setOnToastHoverCallback(toast_hover_check_callback_t cb) { return mOnToastHoverSignal.connect(cb); }
|
||||
|
||||
boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseEnterSignal.connect(cb); };
|
||||
boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseLeaveSignal.connect(cb); };
|
||||
|
||||
private:
|
||||
|
||||
void onToastMouseEnter();
|
||||
|
||||
void onToastMouseLeave();
|
||||
|
||||
void handleTipToastClick(S32 x, S32 y, MASK mask);
|
||||
|
||||
// check timer
|
||||
|
|
@ -168,6 +185,8 @@ private:
|
|||
LLUUID mSessionID;
|
||||
LLNotificationPtr mNotification;
|
||||
|
||||
LLPanel* mWrapperPanel;
|
||||
|
||||
// timer counts a lifetime of a toast
|
||||
LLTimer mTimer;
|
||||
F32 mToastLifetime; // in seconds
|
||||
|
|
@ -184,6 +203,9 @@ private:
|
|||
bool mHideBtnPressed;
|
||||
bool mIsHidden; // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849)
|
||||
bool mIsTip;
|
||||
|
||||
commit_signal_t mToastMouseEnterSignal;
|
||||
commit_signal_t mToastMouseLeaveSignal;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -223,6 +223,17 @@ void LLURLDispatcherImpl::regionNameCallback(U64 region_handle, const std::strin
|
|||
S32 z = 0;
|
||||
LLURLSimString::parse(sim_string, ®ion_name, &x, &y, &z);
|
||||
|
||||
// Invalid location? EXT-5380
|
||||
if (!region_handle)
|
||||
{
|
||||
if(!region_name.empty() && !LLStringOps::isDigit(region_name.c_str()[0]))// it is no sense to search an empty region_name or when the region_name starts with digits
|
||||
{
|
||||
// may be an user types incorrect region name, let's help him to find a correct one
|
||||
LLFloaterReg::showInstance("search", LLSD().with("category", "places").with("id", LLSD(region_name)));
|
||||
}
|
||||
//*TODO: add notification about invalid region_name
|
||||
return;
|
||||
}
|
||||
LLVector3 local_pos;
|
||||
local_pos.mV[VX] = (F32)x;
|
||||
local_pos.mV[VY] = (F32)y;
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@
|
|||
#include "llagent.h"
|
||||
#include "llagentwearables.h"
|
||||
#include "llagentpilot.h"
|
||||
#include "llbottomtray.h"
|
||||
#include "llcompilequeue.h"
|
||||
#include "llconsole.h"
|
||||
#include "lldebugview.h"
|
||||
|
|
@ -7631,6 +7632,24 @@ class LLWorldDayCycle : public view_listener_t
|
|||
}
|
||||
};
|
||||
|
||||
class LLWorldToggleMovementControls : public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
LLBottomTray::getInstance()->toggleMovementControls();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class LLWorldToggleCameraControls : public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
LLBottomTray::getInstance()->toggleCameraControls();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y)
|
||||
{
|
||||
static LLMenuGL* show_navbar_context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_hide_navbar.xml",
|
||||
|
|
@ -7750,6 +7769,9 @@ void initialize_menus()
|
|||
view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess");
|
||||
view_listener_t::addMenu(new LLWorldDayCycle(), "World.DayCycle");
|
||||
|
||||
view_listener_t::addMenu(new LLWorldToggleMovementControls(), "World.Toggle.MovementControls");
|
||||
view_listener_t::addMenu(new LLWorldToggleCameraControls(), "World.Toggle.CameraControls");
|
||||
|
||||
// Tools menu
|
||||
view_listener_t::addMenu(new LLToolsSelectTool(), "Tools.SelectTool");
|
||||
view_listener_t::addMenu(new LLToolsSelectOnlyMyObjects(), "Tools.SelectOnlyMyObjects");
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@
|
|||
left="10"
|
||||
name="move up btn"
|
||||
scale_image="false"
|
||||
tool_tip="Fly up, press "E""
|
||||
tool_tip="Fly up, press E"
|
||||
top="14"
|
||||
width="25" />
|
||||
<button
|
||||
|
|
@ -96,7 +96,7 @@
|
|||
left_pad="45"
|
||||
name="move down btn"
|
||||
scale_image="false"
|
||||
tool_tip="Fly down, press "C""
|
||||
tool_tip="Fly down, press C"
|
||||
top_delta="0"
|
||||
width="20" />
|
||||
<joystick_turn
|
||||
|
|
|
|||
|
|
@ -116,4 +116,10 @@
|
|||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Pay"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Share"
|
||||
name="share">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Share"/>
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
|
|
|
|||
|
|
@ -299,8 +299,7 @@
|
|||
function="Floater.Visible"
|
||||
parameter="moveview" />
|
||||
<menu_item_check.on_click
|
||||
function="Floater.Toggle"
|
||||
parameter="moveview" />
|
||||
function="World.Toggle.MovementControls" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
label="View Controls"
|
||||
|
|
@ -310,8 +309,7 @@
|
|||
function="Floater.Visible"
|
||||
parameter="camera" />
|
||||
<menu_item_check.on_click
|
||||
function="Floater.Toggle"
|
||||
parameter="camera" />
|
||||
function="World.Toggle.CameraControls" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
label="Ban Lines"
|
||||
|
|
|
|||
|
|
@ -4310,14 +4310,14 @@ Topic: [SUBJECT], Message: [MESSAGE]
|
|||
icon="notifytip.tga"
|
||||
name="FriendOnline"
|
||||
type="notifytip">
|
||||
[NAME_SLURL] is Online
|
||||
[FIRST] [LAST] is Online
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notifytip.tga"
|
||||
name="FriendOffline"
|
||||
type="notifytip">
|
||||
[NAME_SLURL] is Offline
|
||||
[FIRST] [LAST] is Offline
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel
|
||||
background_visible="false"
|
||||
height="152"
|
||||
label="friend_online_status"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="friend_online_status"
|
||||
top="0"
|
||||
width="305">
|
||||
<avatar_icon
|
||||
follows="top|left"
|
||||
height="18"
|
||||
image_name="Generic_Person"
|
||||
layout="topleft"
|
||||
left="3"
|
||||
mouse_opaque="false"
|
||||
name="avatar_icon"
|
||||
top="10"
|
||||
width="18" />
|
||||
<text
|
||||
font="SansSerifSmall"
|
||||
follows="all"
|
||||
height="137"
|
||||
layout="topleft"
|
||||
left_pad="5"
|
||||
name="message"
|
||||
text_color="white"
|
||||
top="15"
|
||||
use_ellipses="true"
|
||||
value=""
|
||||
width="285"
|
||||
word_wrap="true"
|
||||
max_length="350" />
|
||||
</panel>
|
||||
|
|
@ -3,17 +3,25 @@
|
|||
|
||||
<!-- Don't remove floater's height! It is needed for Overflow and Start-Up toasts!-->
|
||||
|
||||
<!--
|
||||
This floater is invisible. To make toast look like a floater we render wrapper_panel
|
||||
like a floater(draw shadows and so on). This is done with one purpose - make close button
|
||||
look like it is positioned out of floater and able to accept mouse clicks (see EXT-4246)
|
||||
-->
|
||||
|
||||
<floater
|
||||
legacy_header_height="18"
|
||||
legacy_header_height="0"
|
||||
header_height="0"
|
||||
name="toast"
|
||||
title=""
|
||||
visible="false"
|
||||
layout="topleft"
|
||||
height="40"
|
||||
width="305"
|
||||
height="47"
|
||||
width="310"
|
||||
left="0"
|
||||
top="0"
|
||||
follows="right|bottom"
|
||||
background_visible="false"
|
||||
bg_opaque_image="Toast_Over"
|
||||
bg_alpha_image="Toast_Background"
|
||||
can_minimize="false"
|
||||
|
|
@ -27,6 +35,21 @@
|
|||
drop_shadow_visible = "false"
|
||||
border = "false"
|
||||
>
|
||||
<panel
|
||||
background_opaque="false"
|
||||
border_visible="false"
|
||||
background_visible="true"
|
||||
bg_opaque_image="Toast_Over"
|
||||
bg_alpha_image="Toast_Background"
|
||||
label="wrapper_panel"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="wrapper_panel"
|
||||
top="7"
|
||||
height="40"
|
||||
follows="all"
|
||||
translate="false"
|
||||
width="305">
|
||||
<!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!-->
|
||||
<text
|
||||
clip_partial="true"
|
||||
|
|
@ -46,10 +69,11 @@
|
|||
width="260">
|
||||
Toast text;
|
||||
</text>
|
||||
</panel>
|
||||
<button
|
||||
layout="topleft"
|
||||
top="-14"
|
||||
left="293"
|
||||
top="0"
|
||||
right="310"
|
||||
width="17"
|
||||
height="17"
|
||||
follows="top|right"
|
||||
|
|
|
|||
Loading…
Reference in New Issue