summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llcommon/llstring.cpp14
-rw-r--r--indra/llcommon/llstring.h4
-rw-r--r--indra/llui/llaccordionctrltab.cpp8
-rw-r--r--indra/llui/lldraghandle.cpp7
-rw-r--r--indra/llui/lldraghandle.h3
-rw-r--r--indra/llui/llflatlistview.h5
-rw-r--r--indra/llui/llfloater.cpp52
-rw-r--r--indra/llui/llfloater.h11
-rw-r--r--indra/llui/lltextbase.cpp11
-rw-r--r--indra/newview/CMakeLists.txt4
-rw-r--r--indra/newview/llagent.cpp4
-rw-r--r--indra/newview/llavataractions.cpp22
-rw-r--r--indra/newview/llavataractions.h6
-rw-r--r--indra/newview/llavatarlist.cpp11
-rw-r--r--indra/newview/llavatarlist.h2
-rw-r--r--indra/newview/llavatarlistitem.cpp6
-rw-r--r--indra/newview/llchathistory.cpp19
-rw-r--r--indra/newview/llchathistory.h9
-rw-r--r--indra/newview/llfloatergesture.cpp8
-rw-r--r--indra/newview/llfloatergodtools.cpp41
-rw-r--r--indra/newview/llfloatergodtools.h3
-rw-r--r--indra/newview/llfloaterland.cpp2
-rw-r--r--indra/newview/llfloatermap.cpp14
-rw-r--r--indra/newview/llfloatermap.h2
-rw-r--r--indra/newview/llfolderview.cpp1
-rw-r--r--indra/newview/llimview.cpp28
-rw-r--r--indra/newview/llimview.h20
-rw-r--r--indra/newview/llinspectavatar.cpp7
-rw-r--r--indra/newview/llnamelistctrl.cpp24
-rw-r--r--indra/newview/llnearbychatbar.cpp7
-rw-r--r--indra/newview/llnotificationhandler.h17
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp63
-rw-r--r--indra/newview/llnotificationofferhandler.cpp6
-rw-r--r--indra/newview/llpanelgroup.cpp12
-rw-r--r--indra/newview/llpanelgrouplandmoney.cpp2
-rw-r--r--indra/newview/llpanellandmarkinfo.cpp11
-rw-r--r--indra/newview/llpanellandmarks.cpp18
-rw-r--r--indra/newview/llpaneloutfitedit.cpp511
-rw-r--r--indra/newview/llpaneloutfitedit.h127
-rw-r--r--indra/newview/llpanelpeople.cpp19
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp5
-rw-r--r--indra/newview/llpanelpermissions.cpp4
-rw-r--r--indra/newview/llpanelpicks.cpp3
-rw-r--r--indra/newview/llpanelteleporthistory.cpp28
-rw-r--r--indra/newview/llpanelteleporthistory.h3
-rw-r--r--indra/newview/llpreviewnotecard.cpp15
-rw-r--r--indra/newview/llpreviewnotecard.h1
-rw-r--r--indra/newview/llsidepanelappearance.cpp32
-rw-r--r--indra/newview/llsidepanelappearance.h6
-rw-r--r--indra/newview/llstatusbar.cpp2
-rw-r--r--indra/newview/llsyswellwindow.cpp12
-rw-r--r--indra/newview/llsyswellwindow.h3
-rw-r--r--indra/newview/lltoastnotifypanel.cpp19
-rw-r--r--indra/newview/lltoastnotifypanel.h7
-rw-r--r--indra/newview/llviewermessage.cpp17
-rw-r--r--indra/newview/llviewerwindow.cpp2
-rw-r--r--indra/newview/skins/default/colors.xml2
-rw-r--r--indra/newview/skins/default/xui/da/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/de/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_about.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_god_tools.xml13
-rw-r--r--indra/newview/skins/default/xui/en/floater_map.xml1
-rw-r--r--indra/newview/skins/default/xui/en/inspect_object.xml1
-rw-r--r--indra/newview/skins/default/xui/en/menu_group_plus.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml3
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml21
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_header.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_my_profile.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_edit.xml233
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml3
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_appearance.xml6
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chat_history.xml1
-rw-r--r--indra/newview/skins/default/xui/es/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/it/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/language_settings.xml6
89 files changed, 1416 insertions, 268 deletions
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index 5f3d9d6582..b5a73ec1d1 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -911,6 +911,20 @@ bool LLStringUtil::simpleReplacement(std::string &replacement, std::string token
return false;
}
+//static
+template<>
+void LLStringUtil::setLocale(std::string inLocale)
+{
+ sLocale = inLocale;
+};
+
+//static
+template<>
+std::string LLStringUtil::getLocale(void)
+{
+ return sLocale;
+};
+
// static
template<>
void LLStringUtil::formatNumber(std::string& numStr, std::string decimals)
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 62cedcde4e..96588b29b9 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -241,8 +241,8 @@ public:
LL_COMMON_API static S32 format(std::basic_string<T>& s, const LLSD& substitutions);
LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const format_map_t& substitutions);
LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const LLSD& substitutions);
- static void setLocale (std::string inLocale) {sLocale = inLocale;};
- static std::string getLocale (void) {return sLocale;};
+ LL_COMMON_API static void setLocale (std::string inLocale);
+ LL_COMMON_API static std::string getLocale (void);
static bool isValidIndex(const std::basic_string<T>& string, size_type i)
{
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index e12776f83a..0959722aa6 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -465,10 +465,11 @@ void LLAccordionCtrlTab::setHeaderVisible(bool value)
reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
};
-//vurtual
+//virtual
BOOL LLAccordionCtrlTab::postBuild()
{
- mHeader->setVisible(mHeaderVisible);
+ if(mHeader)
+ mHeader->setVisible(mHeaderVisible);
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
@@ -504,7 +505,8 @@ BOOL LLAccordionCtrlTab::postBuild()
mScrollbar->setVisible(false);
}
- mContainerPanel->setVisible(mDisplayChildren);
+ if(mContainerPanel)
+ mContainerPanel->setVisible(mDisplayChildren);
return LLUICtrl::postBuild();
}
diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp
index 832f148902..9d4e2fa495 100644
--- a/indra/llui/lldraghandle.cpp
+++ b/indra/llui/lldraghandle.cpp
@@ -248,15 +248,14 @@ void LLDragHandleTop::reshapeTitleBox()
return;
}
const LLFontGL* font = LLFontGL::getFontSansSerif();
- S32 title_width = font->getWidth( mTitleBox->getText() ) + TITLE_HPAD;
- if (getMaxTitleWidth() > 0)
- title_width = llmin(title_width, getMaxTitleWidth());
+ S32 title_width = getRect().getWidth();
+ title_width -= 2 * LEFT_PAD + 2 * BORDER_PAD + getButtonsRect().getWidth();
S32 title_height = llround(font->getLineHeight());
LLRect title_rect;
title_rect.setLeftTopAndSize(
LEFT_PAD,
getRect().getHeight() - title_vpad,
- getRect().getWidth() - LEFT_PAD - RIGHT_PAD,
+ title_width,
title_height);
// calls reshape on mTitleBox
diff --git a/indra/llui/lldraghandle.h b/indra/llui/lldraghandle.h
index dc5410787b..825bc9303e 100644
--- a/indra/llui/lldraghandle.h
+++ b/indra/llui/lldraghandle.h
@@ -71,6 +71,8 @@ public:
BOOL getForeground() const { return mForeground; }
void setMaxTitleWidth(S32 max_width) {mMaxTitleWidth = llmin(max_width, mMaxTitleWidth); }
S32 getMaxTitleWidth() const { return mMaxTitleWidth; }
+ void setButtonsRect(const LLRect& rect){ mButtonsRect = rect; }
+ LLRect getButtonsRect() { return mButtonsRect; }
void setTitleVisible(BOOL visible);
virtual void setTitle( const std::string& title ) = 0;
@@ -88,6 +90,7 @@ protected:
LLTextBox* mTitleBox;
private:
+ LLRect mButtonsRect;
S32 mDragLastScreenX;
S32 mDragLastScreenY;
S32 mLastMouseScreenX;
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 837fbb36b7..dc6400c926 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -379,11 +379,14 @@ private:
void setNoItemsCommentVisible(bool visible) const;
-private:
+protected:
/** Comparator to use when sorting the list. */
const ItemComparator* mItemComparator;
+
+private:
+
LLPanel* mItemsPanel;
S32 mItemsNoScrollWidth;
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index a9accc0ba6..e672252a50 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -346,7 +346,7 @@ void LLFloater::layoutDragHandle()
rect = getLocalRect();
}
mDragHandle->setRect(rect);
- updateButtons();
+ updateTitleButtons();
applyTitle();
}
@@ -1061,11 +1061,10 @@ void LLFloater::setMinimized(BOOL minimize)
// Reshape *after* setting mMinimized
reshape( mExpandedRect.getWidth(), mExpandedRect.getHeight(), TRUE );
}
-
- applyTitle ();
make_ui_sound("UISndWindowClose");
- updateButtons();
+ updateTitleButtons();
+ applyTitle ();
}
void LLFloater::setFocus( BOOL b )
@@ -1121,6 +1120,7 @@ void LLFloater::setIsChrome(BOOL is_chrome)
setFocus(FALSE);
// can't Ctrl-Tab to "chrome" floaters
setFocusRoot(FALSE);
+ mButtons[BUTTON_CLOSE]->setToolTip(LLStringExplicit(getButtonTooltip(Params(), BUTTON_CLOSE, is_chrome)));
}
// no titles displayed on "chrome" floaters
@@ -1190,7 +1190,7 @@ void LLFloater::setHost(LLMultiFloater* host)
mButtonScale = 1.f;
//mButtonsEnabled[BUTTON_TEAR_OFF] = FALSE;
}
- updateButtons();
+ updateTitleButtons();
if (host)
{
mHostHandle = host->getHandle();
@@ -1389,7 +1389,7 @@ void LLFloater::setCanDock(bool b)
mButtonsEnabled[BUTTON_DOCK] = FALSE;
}
}
- updateButtons();
+ updateTitleButtons();
}
void LLFloater::setDocked(bool docked, bool pop_on_undock)
@@ -1398,7 +1398,7 @@ void LLFloater::setDocked(bool docked, bool pop_on_undock)
{
mDocked = docked;
mButtonsEnabled[BUTTON_DOCK] = !mDocked;
- updateButtons();
+ updateTitleButtons();
storeDockStateControl();
}
@@ -1451,7 +1451,7 @@ void LLFloater::onClickTearOff(LLFloater* self)
}
self->setTornOff(false);
}
- self->updateButtons();
+ self->updateTitleButtons();
}
// static
@@ -1691,7 +1691,7 @@ void LLFloater::setCanMinimize(BOOL can_minimize)
mButtonsEnabled[BUTTON_MINIMIZE] = can_minimize && !isMinimized();
mButtonsEnabled[BUTTON_RESTORE] = can_minimize && isMinimized();
- updateButtons();
+ updateTitleButtons();
}
void LLFloater::setCanClose(BOOL can_close)
@@ -1699,7 +1699,7 @@ void LLFloater::setCanClose(BOOL can_close)
mCanClose = can_close;
mButtonsEnabled[BUTTON_CLOSE] = can_close;
- updateButtons();
+ updateTitleButtons();
}
void LLFloater::setCanTearOff(BOOL can_tear_off)
@@ -1707,7 +1707,7 @@ void LLFloater::setCanTearOff(BOOL can_tear_off)
mCanTearOff = can_tear_off;
mButtonsEnabled[BUTTON_TEAR_OFF] = mCanTearOff && !mHostHandle.isDead();
- updateButtons();
+ updateTitleButtons();
}
@@ -1731,10 +1731,11 @@ void LLFloater::setCanDrag(BOOL can_drag)
}
}
-void LLFloater::updateButtons()
+void LLFloater::updateTitleButtons()
{
static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0);
static LLUICachedControl<S32> close_box_from_top ("UICloseBoxFromTop", 0);
+ LLRect buttons_rect;
S32 button_count = 0;
for (S32 i = 0; i < BUTTON_COUNT; i++)
{
@@ -1785,6 +1786,15 @@ void LLFloater::updateButtons()
llround((F32)floater_close_box_size * mButtonScale));
}
+ if(!buttons_rect.isValid())
+ {
+ buttons_rect = btn_rect;
+ }
+ else
+ {
+ mDragOnLeft ? buttons_rect.mRight + btn_rect.mRight :
+ buttons_rect.mLeft = btn_rect.mLeft;
+ }
mButtons[i]->setRect(btn_rect);
mButtons[i]->setVisible(TRUE);
// the restore button should have a tab stop so that it takes action when you Ctrl-Tab to a minimized floater
@@ -1796,7 +1806,10 @@ void LLFloater::updateButtons()
}
}
if (mDragHandle)
- mDragHandle->setMaxTitleWidth(getRect().getWidth() - (button_count * (floater_close_box_size + 1)));
+ {
+ localRectToOtherView(buttons_rect, &buttons_rect, mDragHandle);
+ mDragHandle->setButtonsRect(buttons_rect);
+ }
}
void LLFloater::buildButtons(const Params& floater_params)
@@ -1844,7 +1857,7 @@ void LLFloater::buildButtons(const Params& floater_params)
p.click_callback.function(boost::bind(sButtonCallbacks[i], this));
p.tab_stop(false);
p.follows.flags(FOLLOWS_TOP|FOLLOWS_RIGHT);
- p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i);
+ p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i, getIsChrome());
p.scale_image(true);
p.chrome(true);
@@ -1853,7 +1866,7 @@ void LLFloater::buildButtons(const Params& floater_params)
mButtons[i] = buttonp;
}
- updateButtons();
+ updateTitleButtons();
}
// static
@@ -1899,8 +1912,15 @@ LLUIImage* LLFloater::getButtonPressedImage(const Params& p, EFloaterButton e)
}
// static
-std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e)
+std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e, bool is_chrome)
{
+ // EXT-4081 (Lag Meter: Ctrl+W does not close floater)
+ // If floater is chrome set 'Close' text for close button's tooltip
+ if(is_chrome && BUTTON_CLOSE == e)
+ {
+ static std::string close_tooltip_chrome = LLTrans::getString("BUTTON_CLOSE_CHROME");
+ return close_tooltip_chrome;
+ }
// TODO: per-floater localizable tooltips set in XML
return sButtonToolTips[e];
}
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 97d2bda594..403723d9d8 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -311,19 +311,26 @@ protected:
virtual void onClickCloseBtn();
+ virtual void updateTitleButtons();
+
private:
void setForeground(BOOL b); // called only by floaterview
void cleanupHandles(); // remove handles to dead floaters
void createMinimizeButton();
- void updateButtons();
void buildButtons(const Params& p);
// Images and tooltips are named in the XML, but we want to look them
// up by index.
static LLUIImage* getButtonImage(const Params& p, EFloaterButton e);
static LLUIImage* getButtonPressedImage(const Params& p, EFloaterButton e);
- static std::string getButtonTooltip(const Params& p, EFloaterButton e);
+ /**
+ * @params is_chrome - if floater is Chrome it means that floater will never get focus.
+ * Therefore it can't be closed with 'Ctrl+W'. So the tooltip text of close button( X )
+ * should be 'Close' not 'Close(Ctrl+W)' as for usual floaters.
+ */
+ static std::string getButtonTooltip(const Params& p, EFloaterButton e, bool is_chrome);
+
BOOL offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index);
void addResizeCtrls();
void layoutResizeCtrls();
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 5f4b16ec9e..56d7a63832 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -962,7 +962,18 @@ void LLTextBase::reshape(S32 width, S32 height, BOOL called_from_parent)
{
if (width != getRect().getWidth() || height != getRect().getHeight())
{
+ //EXT-4288
+ //to keep consistance scrolling behaviour
+ //when scrolling from top and from bottom...
+ bool is_scrolled_to_end = (mScroller!=NULL) && scrolledToEnd();
+
LLUICtrl::reshape( width, height, called_from_parent );
+
+ if (is_scrolled_to_end)
+ {
+ deselect();
+ endOfDoc();
+ }
// do this first after reshape, because other things depend on
// up-to-date mVisibleTextRect
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index f45237a73c..9bdf9d8893 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -317,7 +317,6 @@ set(viewer_SOURCE_FILES
llpanellandmedia.cpp
llpanellogin.cpp
llpanelloginlistener.cpp
- llpanellookinfo.cpp
llpanelmaininventory.cpp
llpanelmediasettingsgeneral.cpp
llpanelmediasettingspermissions.cpp
@@ -326,6 +325,7 @@ set(viewer_SOURCE_FILES
llpanelnearbymedia.cpp
llpanelobject.cpp
llpanelobjectinventory.cpp
+ llpaneloutfitedit.cpp
llpaneloutfitsinventory.cpp
llpanelpeople.cpp
llpanelpeoplemenus.cpp
@@ -814,7 +814,6 @@ set(viewer_HEADER_FILES
llpanellandmedia.h
llpanellogin.h
llpanelloginlistener.h
- llpanellookinfo.h
llpanelmaininventory.h
llpanelmediasettingsgeneral.h
llpanelmediasettingspermissions.h
@@ -823,6 +822,7 @@ set(viewer_HEADER_FILES
llpanelnearbymedia.h
llpanelobject.h
llpanelobjectinventory.h
+ llpaneloutfitedit.h
llpaneloutfitsinventory.h
llpanelpeople.h
llpanelpeoplemenus.h
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 3eeaacf93b..a764932815 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -3260,9 +3260,9 @@ bool LLAgent::teleportCore(bool is_local)
// yet if the teleport will succeed. Look in
// process_teleport_location_reply
- // close the map and find panels so we can see our destination
+ // close the map panel so we can see our destination.
+ // we don't close search floater, see EXT-5840.
LLFloaterReg::hideInstance("world_map");
- LLFloaterReg::hideInstance("search");
// hide land floater too - it'll be out of date
LLFloaterReg::hideInstance("about_land");
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 4075ad8ee2..c85c72837c 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -161,6 +161,14 @@ void LLAvatarActions::offerTeleport(const LLUUID& invitee)
if (invitee.isNull())
return;
+ //waiting until Name Cache gets updated with corresponding avatar name
+ std::string just_to_request_name;
+ if (!gCacheName->getFullName(invitee, just_to_request_name))
+ {
+ gCacheName->get(invitee, FALSE, boost::bind((void (*)(const LLUUID&)) &LLAvatarActions::offerTeleport, invitee));
+ return;
+ }
+
LLDynamicArray<LLUUID> ids;
ids.push_back(invitee);
offerTeleport(ids);
@@ -434,6 +442,20 @@ void LLAvatarActions::toggleBlock(const LLUUID& id)
LLMuteList::getInstance()->add(mute);
}
}
+// static
+bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
+{
+ // First use LLAvatarTracker::isBuddy()
+ // If LLAvatarTracker::instance().isBuddyOnline function only is used
+ // then for avatars that are online and not a friend it will return false.
+ // But we should give an ability to offer a teleport for such avatars.
+ if(LLAvatarTracker::instance().isBuddy(id))
+ {
+ return LLAvatarTracker::instance().isBuddyOnline(id);
+ }
+
+ return true;
+}
void LLAvatarActions::inviteToGroup(const LLUUID& id)
{
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index c573144a33..9d8b4b4e23 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -171,6 +171,12 @@ public:
*/
static void csr(const LLUUID& id, std::string name);
+ /**
+ * Checks whether can offer teleport to the avatar
+ * Can't offer only for offline friends
+ */
+ static bool canOfferTeleport(const LLUUID& id);
+
private:
static bool callbackAddFriend(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index e8abdd32ec..6ec62a61a0 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -334,6 +334,17 @@ boost::signals2::connection LLAvatarList::setItemDoubleClickCallback(const mouse
return mItemDoubleClickSignal.connect(cb);
}
+//virtual
+S32 LLAvatarList::notifyParent(const LLSD& info)
+{
+ if (info.has("sort") && &NAME_COMPARATOR == mItemComparator)
+ {
+ sort();
+ return 1;
+ }
+ return LLFlatListView::notifyParent(info);
+}
+
void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)
{
LLAvatarListItem* item = new LLAvatarListItem();
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index c3f79dcb3a..5a55975413 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -96,6 +96,8 @@ public:
boost::signals2::connection setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb);
+ virtual S32 notifyParent(const LLSD& info);
+
protected:
void refresh();
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 9645e75e60..44f88cce29 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -119,8 +119,9 @@ S32 LLAvatarListItem::notifyParent(const LLSD& info)
if (info.has("visibility_changed"))
{
updateChildren();
+ return 1;
}
- return 0;
+ return LLPanel::notifyParent(info);
}
void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
@@ -334,6 +335,9 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str
{
std::string name = first_name + " " + last_name;
setName(name);
+
+ //requesting the list to resort
+ notifyParent(LLSD().with("sort", LLSD()));
}
// Convert given number of seconds to a string like "23 minutes", "15 hours" or "3 years",
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index f5faeca126..71e7ae7061 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -447,7 +447,6 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
: LLUICtrl(p),
mMessageHeaderFilename(p.message_header),
mMessageSeparatorFilename(p.message_separator),
- mMessagePlaintextSeparatorFilename(p.message_plaintext_separator),
mLeftTextPad(p.left_text_pad),
mRightTextPad(p.right_text_pad),
mLeftWidgetPad(p.left_widget_pad),
@@ -535,12 +534,6 @@ LLView* LLChatHistory::getSeparator()
return separator;
}
-LLView* LLChatHistory::getPlaintextSeparator()
-{
- LLPanel* separator = LLUICtrlFactory::getInstance()->createFromFile<LLPanel>(mMessagePlaintextSeparatorFilename, NULL, LLPanel::child_registry_t::instance());
- return separator;
-}
-
LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params)
{
LLChatHistoryHeader* header = LLChatHistoryHeader::createInstance(mMessageHeaderFilename);
@@ -639,16 +632,6 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
if (use_plain_text_chat_history)
{
- // append plaintext separator
- LLView* separator = getPlaintextSeparator();
- LLInlineViewSegment::Params p;
- p.force_newline = true;
- p.left_pad = mLeftWidgetPad;
- p.right_pad = mRightWidgetPad;
- p.view = separator;
- //mEditor->appendWidget(p, "\n", false); // TODO: this is absolute minimal fix for EXT-3818 because it's late for 2.0
- mEditor->appendWidget(p, "", false); // This should be properly fixed in 2.1
-
mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params);
if (utf8str_trim(chat.mFromName).size() != 0)
@@ -752,7 +735,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
if (notification != NULL)
{
LLIMToastNotifyPanel* notify_box = new LLIMToastNotifyPanel(
- notification);
+ notification, chat.mSessionID);
//we can't set follows in xml since it broke toasts behavior
notify_box->setFollowsLeft();
notify_box->setFollowsRight();
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index dfe5ea98e6..950b32861b 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -47,8 +47,6 @@ class LLChatHistory : public LLUICtrl
Optional<std::string> message_header;
//Message separator filename
Optional<std::string> message_separator;
- //Message plaintext separator filename
- Optional<std::string> message_plaintext_separator;
//Text left padding from the scroll rect
Optional<S32> left_text_pad;
//Text right padding from the scroll rect
@@ -71,7 +69,6 @@ class LLChatHistory : public LLUICtrl
Params()
: message_header("message_header"),
message_separator("message_separator"),
- message_plaintext_separator("message_plaintext_separator"),
left_text_pad("left_text_pad"),
right_text_pad("right_text_pad"),
left_widget_pad("left_widget_pad"),
@@ -100,11 +97,6 @@ class LLChatHistory : public LLUICtrl
*/
LLView* getSeparator();
/**
- * Builds a message plaintext separator.
- * @return pointer to LLView separator object.
- */
- LLView* getPlaintextSeparator();
- /**
* Builds a message header.
* @return pointer to LLView header object.
*/
@@ -141,7 +133,6 @@ class LLChatHistory : public LLUICtrl
std::string mMessageHeaderFilename;
std::string mMessageSeparatorFilename;
- std::string mMessagePlaintextSeparatorFilename;
S32 mLeftTextPad;
S32 mRightTextPad;
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index bf03412696..bea4013a61 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -354,10 +354,10 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur
element["columns"][0]["value"] = "";
element["columns"][0]["font"]["name"] = "SANSSERIF";
element["columns"][0]["font"]["style"] = font_style;
- element["columns"][0]["column"] = "trigger";
- element["columns"][0]["value"] = "---";
- element["columns"][0]["font"]["name"] = "SANSSERIF";
- element["columns"][0]["font"]["style"] = font_style;
+ element["columns"][1]["column"] = "shortcut";
+ element["columns"][1]["value"] = "---";
+ element["columns"][1]["font"]["name"] = "SANSSERIF";
+ element["columns"][1]["font"]["style"] = font_style;
element["columns"][2]["column"] = "key";
element["columns"][2]["value"] = "~~~";
element["columns"][2]["font"]["name"] = "SANSSERIF";
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index fbd516ba7a..e7b2da043f 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -828,7 +828,6 @@ const F32 HOURS_TO_RADIANS = (2.f*F_PI)/24.f;
LLPanelGridTools::LLPanelGridTools() :
LLPanel()
{
- mCommitCallbackRegistrar.add("GridTools.KickAll", boost::bind(&LLPanelGridTools::onClickKickAll, this));
mCommitCallbackRegistrar.add("GridTools.FlushMapVisibilityCaches", boost::bind(&LLPanelGridTools::onClickFlushMapVisibilityCaches, this));
}
@@ -846,46 +845,6 @@ void LLPanelGridTools::refresh()
{
}
-void LLPanelGridTools::onClickKickAll()
-{
- LLNotificationsUtil::add("KickAllUsers", LLSD(), LLSD(), LLPanelGridTools::confirmKick);
-}
-
-
-bool LLPanelGridTools::confirmKick(const LLSD& notification, const LLSD& response)
-{
- if (LLNotificationsUtil::getSelectedOption(notification, response) == 0)
- {
- LLSD payload;
- payload["kick_message"] = response["message"].asString();
- LLNotificationsUtil::add("ConfirmKick", LLSD(), payload, LLPanelGridTools::finishKick);
- }
- return false;
-}
-
-
-// static
-bool LLPanelGridTools::finishKick(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
-
- if (option == 0)
- {
- LLMessageSystem* msg = gMessageSystem;
-
- msg->newMessageFast(_PREHASH_GodKickUser);
- msg->nextBlockFast(_PREHASH_UserInfo);
- msg->addUUIDFast(_PREHASH_GodID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
- msg->addUUIDFast(_PREHASH_AgentID, LL_UUID_ALL_AGENTS );
- msg->addU32("KickFlags", KICK_FLAGS_DEFAULT );
- msg->addStringFast(_PREHASH_Reason, notification["payload"]["kick_message"].asString());
- gAgent.sendReliableMessage();
- }
- return false;
-}
-
void LLPanelGridTools::onClickFlushMapVisibilityCaches()
{
LLNotificationsUtil::add("FlushMapVisibilityCaches", LLSD(), LLSD(), flushMapVisibilityCachesConfirm);
diff --git a/indra/newview/llfloatergodtools.h b/indra/newview/llfloatergodtools.h
index 4e97a1058e..aee9db78a3 100644
--- a/indra/newview/llfloatergodtools.h
+++ b/indra/newview/llfloatergodtools.h
@@ -198,9 +198,6 @@ public:
void refresh();
- void onClickKickAll();
- static bool confirmKick(const LLSD& notification, const LLSD& response);
- static bool finishKick(const LLSD& notification, const LLSD& response);
static void onDragSunPhase(LLUICtrl *ctrl, void *userdata);
void onClickFlushMapVisibilityCaches();
static bool flushMapVisibilityCachesConfirm(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 6467ee13b0..02c83dcd09 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -1612,7 +1612,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
item_params.columns.add().value(object_count_str).font(FONT).column("count");
item_params.columns.add().value(LLDate((time_t)most_recent_time)).font(FONT).column("mostrecent").type("date");
- self->mOwnerList->addRow(item_params);
+ self->mOwnerList->addNameItemRow(item_params);
lldebugs << "object owner " << owner_id << " (" << (is_group_owned ? "group" : "agent")
<< ") owns " << object_count << " objects." << llendl;
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 8894628788..5677899dd9 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -215,6 +215,20 @@ void LLFloaterMap::draw()
LLFloater::draw();
}
+// virtual
+void LLFloaterMap::onFocusReceived()
+{
+ setBackgroundOpaque(true);
+ LLPanel::onFocusReceived();
+}
+
+// virtual
+void LLFloaterMap::onFocusLost()
+{
+ setBackgroundOpaque(false);
+ LLPanel::onFocusLost();
+}
+
void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent)
{
LLFloater::reshape(width, height, called_from_parent);
diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h
index 6c9138c6a7..9ff2f03180 100644
--- a/indra/newview/llfloatermap.h
+++ b/indra/newview/llfloatermap.h
@@ -53,6 +53,8 @@ public:
/*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ void draw();
+ /*virtual*/ void onFocusLost();
+ /*virtual*/ void onFocusReceived();
private:
void handleZoom(const LLSD& userdata);
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 149bbe805d..90a100bd9b 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -979,7 +979,6 @@ void LLFolderView::finishRenamingItem( void )
if( mRenameItem )
{
setSelectionFromRoot( mRenameItem, TRUE );
- mRenameItem = NULL;
}
// List is re-sorted alphabeticly, so scroll to make sure the selected item is visible.
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index a8d876e8a3..a6473fb34b 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -80,6 +80,9 @@ const static std::string ADHOC_NAME_SUFFIX(" Conference");
const static std::string NEARBY_P2P_BY_OTHER("nearby_P2P_by_other");
const static std::string NEARBY_P2P_BY_AGENT("nearby_P2P_by_agent");
+/** Timeout of outgoing session initialization (in seconds) */
+const static U32 SESSION_INITIALIZATION_TIMEOUT = 30;
+
std::string LLCallDialogManager::sPreviousSessionlName = "";
LLIMModel::LLIMSession::SType LLCallDialogManager::sPreviousSessionType = LLIMModel::LLIMSession::P2P_SESSION;
std::string LLCallDialogManager::sCurrentSessionlName = "";
@@ -91,6 +94,19 @@ const LLUUID LLOutgoingCallDialog::OCD_KEY = LLUUID("7CF78E11-0CFE-498D-ADB9-141
//
LLIMMgr* gIMMgr = NULL;
+
+BOOL LLSessionTimeoutTimer::tick()
+{
+ if (mSessionId.isNull()) return TRUE;
+
+ LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId);
+ if (session && !session->mSessionInitialized)
+ {
+ gIMMgr->showSessionStartError("session_initialization_timed_out_error", mSessionId);
+ }
+ return TRUE;
+}
+
void toast_callback(const LLSD& msg){
// do not show toast in busy mode or it goes from agent
if (gAgent.getBusy() || gAgent.getID() == msg["from_id"])
@@ -214,6 +230,11 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
//so we're already initialized
mSessionInitialized = true;
}
+ else
+ {
+ //tick returns TRUE - timer will be deleted after the tick
+ new LLSessionTimeoutTimer(mSessionID, SESSION_INITIALIZATION_TIMEOUT);
+ }
if (IM_NOTHING_SPECIAL == type)
{
@@ -1538,6 +1559,11 @@ LLCallDialog::LLCallDialog(const LLSD& payload)
setDocked(true);
}
+LLCallDialog::~LLCallDialog()
+{
+ LLUI::removePopup(this);
+}
+
void LLCallDialog::getAllowedRect(LLRect& rect)
{
rect = gViewerWindow->getWorldViewRectScaled();
@@ -1591,7 +1617,7 @@ void LLCallDialog::onOpen(const LLSD& key)
LLDockableFloater::onOpen(key);
// it should be over the all floaters. EXT-5116
- gFloaterView->bringToFront(this, FALSE);
+ LLUI::addPopup(this);
}
void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 0a23fda9d8..ffa8a16797 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -34,6 +34,7 @@
#define LL_LLIMVIEW_H
#include "lldockablefloater.h"
+#include "lleventtimer.h"
#include "llinstantmessage.h"
#include "lllogchat.h"
@@ -45,7 +46,24 @@ class LLFriendObserver;
class LLCallDialogManager;
class LLIMSpeakerMgr;
+/**
+ * Timeout Timer for outgoing Ad-Hoc/Group IM sessions which being initialized by the server
+ */
+class LLSessionTimeoutTimer : public LLEventTimer
+{
+public:
+ LLSessionTimeoutTimer(const LLUUID& session_id, F32 period) : LLEventTimer(period), mSessionId(session_id) {}
+ virtual ~LLSessionTimeoutTimer() {};
+ /* virtual */ BOOL tick();
+
+private:
+ LLUUID mSessionId;
+};
+
+/**
+ * Model (MVC) for IM Sessions
+ */
class LLIMModel : public LLSingleton<LLIMModel>
{
public:
@@ -477,7 +495,7 @@ class LLCallDialog : public LLDockableFloater
{
public:
LLCallDialog(const LLSD& payload);
- ~LLCallDialog() {}
+ ~LLCallDialog();
virtual BOOL postBuild();
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 35cb9b3468..94ea236757 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -137,6 +137,7 @@ private:
void onVolumeChange(const LLSD& data);
bool enableMute();
bool enableUnmute();
+ bool enableTeleportOffer();
// Is used to determine if "Add friend" option should be enabled in gear menu
bool isNotFriend();
@@ -235,6 +236,7 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this));
mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableCall", boost::bind(&LLAvatarActions::canCall));
+ mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableTeleportOffer", boost::bind(&LLInspectAvatar::enableTeleportOffer, this));
mEnableCallbackRegistrar.add("InspectAvatar.EnableMute", boost::bind(&LLInspectAvatar::enableMute, this));
mEnableCallbackRegistrar.add("InspectAvatar.EnableUnmute", boost::bind(&LLInspectAvatar::enableUnmute, this));
@@ -764,6 +766,11 @@ bool LLInspectAvatar::enableUnmute()
}
}
+bool LLInspectAvatar::enableTeleportOffer()
+{
+ return LLAvatarActions::canOfferTeleport(mAvatarID);
+}
+
//////////////////////////////////////////////////////////////////////////////
// LLInspectAvatarUtil
//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 7a538e372b..9611c286eb 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -148,16 +148,30 @@ void LLNameListCtrl::mouseOverHighlightNthItem( S32 target_index )
if(0 <= cur_index && cur_index < (S32)getItemList().size())
{
LLScrollListItem* item = getItemList()[cur_index];
- LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex));
- if(cell)
- cell->setTextWidth(cell->getTextWidth() + info_icon_size);
+ if (item)
+ {
+ LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex));
+ if (cell)
+ cell->setTextWidth(cell->getTextWidth() + info_icon_size);
+ }
+ else
+ {
+ llwarns << "highlighted name list item is NULL" << llendl;
+ }
}
if(target_index != -1)
{
LLScrollListItem* item = getItemList()[target_index];
LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex));
- if(cell)
- cell->setTextWidth(cell->getTextWidth() - info_icon_size);
+ if (item)
+ {
+ if (cell)
+ cell->setTextWidth(cell->getTextWidth() - info_icon_size);
+ }
+ else
+ {
+ llwarns << "target name item is NULL" << llendl;
+ }
}
}
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 424b8c9a66..1507b7d324 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -807,8 +807,11 @@ public:
{
if (tokens.size() < 2) return false;
S32 channel = tokens[0].asInteger();
- std::string mesg = tokens[1].asString();
- send_chat_from_viewer(mesg, CHAT_TYPE_NORMAL, channel);
+
+ // Send unescaped message, see EXT-6353.
+ std::string unescaped_mesg (LLURI::unescape(tokens[1].asString()));
+
+ send_chat_from_viewer(unescaped_mesg, CHAT_TYPE_NORMAL, channel);
return true;
}
};
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 1dc0e414a2..99a1fedcf3 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -42,6 +42,8 @@
#include "llinstantmessage.h"
#include "llnotificationptr.h"
+class LLIMFloater;
+
namespace LLNotificationsUI
{
// ENotificationType enumerates all possible types of notifications that could be met
@@ -304,8 +306,6 @@ public:
/**
* Checks if passed notification can create toast.
- *
- * It returns false only for inventory accepted/declined notifications if respective IM window is open (EXT-5909)
*/
static bool canSpawnToast(const LLNotificationPtr& notification);
@@ -315,6 +315,11 @@ public:
static bool isIMFloaterOpened(const LLNotificationPtr& notification);
/**
+ * Determines whether IM floater is focused.
+ */
+ static bool isIMFloaterFocused(const LLNotificationPtr& notification);
+
+ /**
* Writes notification message to IM session.
*/
static void logToIM(const EInstantMessage& session_type,
@@ -375,6 +380,14 @@ public:
* Decrements counter of IM messages.
*/
static void decIMMesageCounter(const LLNotificationPtr& notification);
+
+private:
+
+ /**
+ * Find IM floater based on "from_id"
+ */
+ static LLIMFloater* findIMFloater(const LLNotificationPtr& notification);
+
};
}
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index d3ad61128d..6aafa04a17 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -128,7 +128,8 @@ const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
FRIEND_ONLINE("FriendOnline"), FRIEND_OFFLINE("FriendOffline"),
SERVER_OBJECT_MESSAGE("ServerObjectMessage"),
TELEPORT_OFFERED("TeleportOffered"),
- TELEPORT_OFFER_SENT("TeleportOfferSent");
+ TELEPORT_OFFER_SENT("TeleportOfferSent"),
+ IM_SYSTEM_MESSAGE_TIP("IMSystemMessageTip");
// static
@@ -147,7 +148,8 @@ bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
|| INVENTORY_DECLINED == notification->getName()
|| USER_GIVE_ITEM == notification->getName()
|| TELEPORT_OFFERED == notification->getName()
- || TELEPORT_OFFER_SENT == notification->getName();
+ || TELEPORT_OFFER_SENT == notification->getName()
+ || IM_SYSTEM_MESSAGE_TIP == notification->getName();
}
// static
@@ -157,7 +159,8 @@ bool LLHandlerUtil::canLogToNearbyChat(const LLNotificationPtr& notification)
&& FRIEND_ONLINE != notification->getName()
&& FRIEND_OFFLINE != notification->getName()
&& INVENTORY_ACCEPTED != notification->getName()
- && INVENTORY_DECLINED != notification->getName();
+ && INVENTORY_DECLINED != notification->getName()
+ && IM_SYSTEM_MESSAGE_TIP != notification->getName();
}
// static
@@ -193,10 +196,36 @@ bool LLHandlerUtil::canSpawnSessionAndLogToIM(const LLNotificationPtr& notificat
// static
bool LLHandlerUtil::canSpawnToast(const LLNotificationPtr& notification)
{
- bool cannot_spawn = isIMFloaterOpened(notification) && (INVENTORY_DECLINED == notification->getName()
- || INVENTORY_ACCEPTED == notification->getName());
-
- return !cannot_spawn;
+ if(INVENTORY_DECLINED == notification->getName()
+ || INVENTORY_ACCEPTED == notification->getName())
+ {
+ // return false for inventory accepted/declined notifications if respective IM window is open (EXT-5909)
+ return ! isIMFloaterOpened(notification);
+ }
+
+ if(FRIENDSHIP_ACCEPTED == notification->getName())
+ {
+ // don't show FRIENDSHIP_ACCEPTED if IM window is opened and focused - EXT-6441
+ return ! isIMFloaterFocused(notification);
+ }
+
+ if(OFFER_FRIENDSHIP == notification->getName()
+ || USER_GIVE_ITEM == notification->getName()
+ || TELEPORT_OFFERED == notification->getName())
+ {
+ // When ANY offer arrives, show toast, unless IM window is already open - EXT-5904
+ return ! isIMFloaterOpened(notification);
+ }
+
+ return true;
+}
+
+// static
+LLIMFloater* LLHandlerUtil::findIMFloater(const LLNotificationPtr& notification)
+{
+ LLUUID from_id = notification->getPayload()["from_id"];
+ LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, from_id);
+ return LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
}
// static
@@ -204,12 +233,7 @@ bool LLHandlerUtil::isIMFloaterOpened(const LLNotificationPtr& notification)
{
bool res = false;
- LLUUID from_id = notification->getPayload()["from_id"];
- LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL,
- from_id);
-
- LLIMFloater* im_floater = LLFloaterReg::findTypedInstance<LLIMFloater>(
- "impanel", session_id);
+ LLIMFloater* im_floater = findIMFloater(notification);
if (im_floater != NULL)
{
res = im_floater->getVisible() == TRUE;
@@ -218,6 +242,19 @@ bool LLHandlerUtil::isIMFloaterOpened(const LLNotificationPtr& notification)
return res;
}
+bool LLHandlerUtil::isIMFloaterFocused(const LLNotificationPtr& notification)
+{
+ bool res = false;
+
+ LLIMFloater* im_floater = findIMFloater(notification);
+ if (im_floater != NULL)
+ {
+ res = im_floater->hasFocus() == TRUE;
+ }
+
+ return res;
+}
+
// static
void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
const std::string& session_name, const std::string& from_name,
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index e93aec9d01..c5960a9040 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -115,15 +115,11 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
session_id = LLHandlerUtil::spawnIMSession(name, from_id);
}
- bool show_toast = true;
+ bool show_toast = LLHandlerUtil::canSpawnToast(notification);
bool add_notid_to_im = LLHandlerUtil::canAddNotifPanelToIM(notification);
if (add_notid_to_im)
{
LLHandlerUtil::addNotifPanelToIM(notification);
- if (LLHandlerUtil::isIMFloaterOpened(notification))
- {
- show_toast = false;
- }
}
if (notification->getPayload().has("SUPPRESS_TOAST")
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 706787e824..c00b6a4147 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -59,6 +59,8 @@
#include "llaccordionctrltab.h"
#include "llaccordionctrl.h"
+#include "lltrans.h"
+
static LLRegisterPanelClassWrapper<LLPanelGroup> t_panel_group("panel_group_info_sidetray");
@@ -333,8 +335,9 @@ void LLPanelGroup::update(LLGroupChange gc)
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mID);
if(gdatap)
{
- childSetValue("group_name", gdatap->mName);
- childSetToolTip("group_name",gdatap->mName);
+ std::string group_name = gdatap->mName.empty() ? LLTrans::getString("LoadingData") : gdatap->mName;
+ childSetValue("group_name", group_name);
+ childSetToolTip("group_name",group_name);
LLGroupData agent_gdatap;
bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlike();
@@ -379,8 +382,9 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mID);
if(gdatap)
{
- childSetValue("group_name", gdatap->mName);
- childSetToolTip("group_name",gdatap->mName);
+ std::string group_name = gdatap->mName.empty() ? LLTrans::getString("LoadingData") : gdatap->mName;
+ childSetValue("group_name", group_name);
+ childSetToolTip("group_name",group_name);
}
LLButton* button_apply = findChild<LLButton>("btn_apply");
diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index 9023afc602..f276df8573 100644
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -1600,6 +1600,8 @@ void LLPanelGroupLandMoney::setGroupID(const LLUUID& id)
mImplementationp->mMoneySalesTabEHp->setGroupID(mGroupID);
}
+ mImplementationp->mBeenActivated = true;
+
activate();
}
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index 143a64d08b..a60c69f169 100644
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -396,17 +396,20 @@ std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCatego
if (is_under_root_category || cat->getParentUUID() == gInventory.getRootFolderID())
{
std::string localized_name;
+
+ // Looking for translation only for protected type categories
+ // to avoid warnings about non existent string in strings.xml.
+ bool is_protected_type = LLFolderType::lookupIsProtectedType(cat->getPreferredType());
+
if (is_under_root_category)
{
// translate category name, if it's right below the root
- // FIXME: it can throw notification about non existent string in strings.xml
- bool is_found = LLTrans::findString(localized_name, "InvFolder " + name);
+ bool is_found = is_protected_type && LLTrans::findString(localized_name, "InvFolder " + name);
name = is_found ? localized_name : name;
}
else
{
- // FIXME: it can throw notification about non existent string in strings.xml
- bool is_found = LLTrans::findString(localized_name, "InvFolder " + cat->getName());
+ bool is_found = is_protected_type && LLTrans::findString(localized_name, "InvFolder " + cat->getName());
// add translated category name to folder's full name
name = (is_found ? localized_name : cat->getName()) + "/" + name;
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index e3b8581aca..6ff784db0a 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -923,12 +923,7 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
return false;
}
}
- else if (!root_folder_view && "category" != command_name)
- {
- return false;
- }
else if ( "paste" == command_name
- || "rename" == command_name
|| "cut" == command_name
|| "copy" == command_name
|| "delete" == command_name
@@ -940,17 +935,16 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
}
else if ( "teleport" == command_name
|| "more_info" == command_name
- || "rename" == command_name
|| "show_on_map" == command_name
|| "copy_slurl" == command_name
)
{
// disable some commands for multi-selection. EXT-1757
- if (root_folder_view &&
- root_folder_view->getSelectedCount() > 1)
- {
- return false;
- }
+ return root_folder_view && root_folder_view->getSelectedCount() == 1;
+ }
+ else if ("rename" == command_name)
+ {
+ return root_folder_view && root_folder_view->getSelectedCount() == 1 && canSelectedBeModified(command_name);
}
else if("category" == command_name)
{
@@ -1079,7 +1073,7 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co
}
else if ("delete" == command_name)
{
- can_be_modified = listenerp ? listenerp->isItemRemovable() : false;
+ can_be_modified = listenerp ? listenerp->isItemRemovable() && !listenerp->isItemInTrash() : false;
}
else if("paste" == command_name)
{
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
new file mode 100644
index 0000000000..55bf25f15b
--- /dev/null
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -0,0 +1,511 @@
+/**
+ * @file llpaneloutfitedit.cpp
+ * @brief Displays outfit edit information in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpaneloutfitedit.h"
+
+// *TODO: reorder includes to match the coding standard
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llinventory.h"
+#include "llviewercontrol.h"
+#include "llui.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "llinventoryfunctions.h"
+#include "llinventorypanel.h"
+#include "llviewerwindow.h"
+#include "llviewerinventory.h"
+#include "llbutton.h"
+#include "llcombobox.h"
+#include "llfiltereditor.h"
+#include "llfloaterinventory.h"
+#include "llinventorybridge.h"
+#include "llinventorymodel.h"
+#include "lluiconstants.h"
+#include "llscrolllistctrl.h"
+#include "lltextbox.h"
+#include "lluictrlfactory.h"
+#include "llsdutil.h"
+#include "llsidepanelappearance.h"
+#include "llwearablelist.h"
+
+static LLRegisterPanelClassWrapper<LLPanelOutfitEdit> t_look("panel_outfit_edit");
+
+const U64 WEARABLE_MASK = (1LL << LLInventoryType::IT_WEARABLE);
+const U64 ATTACHMENT_MASK = (1LL << LLInventoryType::IT_ATTACHMENT) | (1LL << LLInventoryType::IT_OBJECT);
+const U64 ALL_ITEMS_MASK = WEARABLE_MASK | ATTACHMENT_MASK;
+
+class LLInventoryLookObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryLookObserver(LLPanelOutfitEdit *panel) : mPanel(panel) {}
+ virtual ~LLInventoryLookObserver()
+ {
+ if (gInventory.containsObserver(this))
+ {
+ gInventory.removeObserver(this);
+ }
+ }
+
+ virtual void changed(U32 mask)
+ {
+ if (mask & (LLInventoryObserver::ADD | LLInventoryObserver::REMOVE))
+ {
+ mPanel->updateLookInfo();
+ }
+ }
+protected:
+ LLPanelOutfitEdit *mPanel;
+};
+
+class LLLookFetchObserver : public LLInventoryFetchDescendentsObserver
+{
+public:
+ LLLookFetchObserver(LLPanelOutfitEdit *panel) :
+ mPanel(panel)
+ {}
+ LLLookFetchObserver() {}
+ virtual void done()
+ {
+ mPanel->lookFetched();
+ if(gInventory.containsObserver(this))
+ {
+ gInventory.removeObserver(this);
+ }
+ }
+private:
+ LLPanelOutfitEdit *mPanel;
+};
+
+
+
+LLPanelOutfitEdit::LLPanelOutfitEdit()
+: LLPanel(), mLookID(), mFetchLook(NULL), mSearchFilter(NULL),
+mLookContents(NULL), mInventoryItemsPanel(NULL), mAddToLookBtn(NULL),
+mRemoveFromLookBtn(NULL), mLookObserver(NULL), mNumItemsInLook(0)
+{
+ mSavedFolderState = new LLSaveFolderState();
+ mSavedFolderState->setApply(FALSE);
+
+ mFetchLook = new LLLookFetchObserver(this);
+ mLookObserver = new LLInventoryLookObserver(this);
+ gInventory.addObserver(mLookObserver);
+
+ mLookItemTypes.reserve(NUM_LOOK_ITEM_TYPES);
+ for (U32 i = 0; i < NUM_LOOK_ITEM_TYPES; i++)
+ {
+ mLookItemTypes.push_back(LLLookItemType());
+ }
+
+ // TODO: make these strings translatable
+ mLookItemTypes[LIT_ALL] = LLLookItemType("All Items", ALL_ITEMS_MASK);
+ mLookItemTypes[LIT_WEARABLE] = LLLookItemType("Shape & Clothing", WEARABLE_MASK);
+ mLookItemTypes[LIT_ATTACHMENT] = LLLookItemType("Attachments", ATTACHMENT_MASK);
+
+}
+
+LLPanelOutfitEdit::~LLPanelOutfitEdit()
+{
+ delete mSavedFolderState;
+ if (gInventory.containsObserver(mFetchLook))
+ {
+ gInventory.removeObserver(mFetchLook);
+ }
+ delete mFetchLook;
+
+ if (gInventory.containsObserver(mLookObserver))
+ {
+ gInventory.removeObserver(mLookObserver);
+ }
+ delete mLookObserver;
+}
+
+BOOL LLPanelOutfitEdit::postBuild()
+{
+ // gInventory.isInventoryUsable() no longer needs to be tested per Richard's fix for race conditions between inventory and panels
+
+ mLookName = getChild<LLTextBox>("curr_look_name");
+
+ /*
+ mLookContents->setDoubleClickCallback(onDoubleClickSpeaker, this);
+ mLookContents->setCommitOnSelectionChange(TRUE);
+ mLookContents->setCommitCallback(boost::bind(&LLPanelActiveSpeakers::handleSpeakerSelect, this, _2));
+ mLookContents->setSortChangedCallback(boost::bind(&LLPanelActiveSpeakers::onSortChanged, this));
+ mLookContents->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+ */
+
+ mInventoryItemsPanel = getChild<LLInventoryPanel>("inventory_items");
+ mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK);
+ mInventoryItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ // mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
+ // mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
+
+ LLComboBox* type_filter = getChild<LLComboBox>("inventory_filter");
+ type_filter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onTypeFilterChanged, this, _1));
+ type_filter->removeall();
+ for (U32 i = 0; i < mLookItemTypes.size(); ++i)
+ {
+ type_filter->add(mLookItemTypes[i].displayName);
+ }
+ type_filter->setCurrentByIndex(LIT_ALL);
+
+ mSearchFilter = getChild<LLFilterEditor>("look_item_filter");
+ mSearchFilter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onSearchEdit, this, _2));
+
+ /* Removing add to look inline button (not part of mvp for viewer 2)
+ LLButton::Params add_params;
+ add_params.name("add_to_look");
+ add_params.click_callback.function(boost::bind(&LLPanelOutfitEdit::onAddToLookClicked, this));
+ add_params.label("+");
+
+ mAddToLookBtn = LLUICtrlFactory::create<LLButton>(add_params);
+ mAddToLookBtn->setEnabled(FALSE);
+ mAddToLookBtn->setVisible(FALSE); */
+
+ childSetAction("add_item_btn", boost::bind(&LLPanelOutfitEdit::onAddToLookClicked, this), this);
+
+ mUpBtn = getChild<LLButton>("up_btn");
+ mUpBtn->setEnabled(TRUE);
+ mUpBtn->setClickedCallback(boost::bind(&LLPanelOutfitEdit::onUpClicked, this));
+
+ mLookContents = getChild<LLScrollListCtrl>("look_items_list");
+ mLookContents->sortByColumn("look_item_sort", TRUE);
+ mLookContents->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onLookItemSelectionChange, this));
+
+ /*
+ LLButton::Params remove_params;
+ remove_params.name("remove_from_look");
+ remove_params.click_callback.function(boost::bind(&LLPanelOutfitEdit::onRemoveFromLookClicked, this));
+ remove_params.label("-"); */
+
+ //mRemoveFromLookBtn = LLUICtrlFactory::create<LLButton>(remove_params);
+ mRemoveFromLookBtn = getChild<LLButton>("remove_from_look_btn");
+ mRemoveFromLookBtn->setEnabled(FALSE);
+ mRemoveFromLookBtn->setVisible(FALSE);
+ //childSetAction("remove_from_look_btn", boost::bind(&LLPanelOutfitEdit::onRemoveFromLookClicked, this), this);
+ mRemoveFromLookBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onRemoveFromLookClicked, this));
+ //getChild<LLPanel>("look_info_group_bar")->addChild(mRemoveFromLookBtn); remove_item_btn
+
+ mEditWearableBtn = getChild<LLButton>("edit_wearable_btn");
+ mEditWearableBtn->setEnabled(FALSE);
+ mEditWearableBtn->setVisible(FALSE);
+ mEditWearableBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onEditWearableClicked, this));
+
+ childSetAction("remove_item_btn", boost::bind(&LLPanelOutfitEdit::onRemoveFromLookClicked, this), this);
+
+ return TRUE;
+}
+
+void LLPanelOutfitEdit::onTypeFilterChanged(LLUICtrl* ctrl)
+{
+ LLComboBox* type_filter = dynamic_cast<LLComboBox*>(ctrl);
+ llassert(type_filter);
+ if (type_filter)
+ {
+ U32 curr_filter_type = type_filter->getCurrentIndex();
+ mInventoryItemsPanel->setFilterTypes(mLookItemTypes[curr_filter_type].inventoryMask);
+ }
+
+ mSavedFolderState->setApply(TRUE);
+ mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+
+ LLOpenFoldersWithSelection opener;
+ mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(opener);
+ mInventoryItemsPanel->getRootFolder()->scrollToShowSelection();
+
+ gInventory.startBackgroundFetch();
+}
+
+void LLPanelOutfitEdit::onSearchEdit(const std::string& string)
+{
+ if (mSearchString != string)
+ {
+ mSearchString = string;
+
+ // Searches are case-insensitive
+ LLStringUtil::toUpper(mSearchString);
+ LLStringUtil::trimHead(mSearchString);
+ }
+
+ if (mSearchString == "")
+ {
+ mInventoryItemsPanel->setFilterSubString(LLStringUtil::null);
+
+ // re-open folders that were initially open
+ mSavedFolderState->setApply(TRUE);
+ mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ LLOpenFoldersWithSelection opener;
+ mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(opener);
+ mInventoryItemsPanel->getRootFolder()->scrollToShowSelection();
+ }
+
+ gInventory.startBackgroundFetch();
+
+ if (mInventoryItemsPanel->getFilterSubString().empty() && mSearchString.empty())
+ {
+ // current filter and new filter empty, do nothing
+ return;
+ }
+
+ // save current folder open state if no filter currently applied
+ if (mInventoryItemsPanel->getRootFolder()->getFilterSubString().empty())
+ {
+ mSavedFolderState->setApply(FALSE);
+ mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ }
+
+ // set new filter string
+ mInventoryItemsPanel->setFilterSubString(mSearchString);
+}
+
+void LLPanelOutfitEdit::onAddToLookClicked(void)
+{
+ LLFolderViewItem* curr_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();
+ LLFolderViewEventListener* listenerp = curr_item->getListener();
+ link_inventory_item(gAgent.getID(), listenerp->getUUID(), mLookID, listenerp->getName(),
+ LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL));
+ updateLookInfo();
+}
+
+
+void LLPanelOutfitEdit::onRemoveFromLookClicked(void)
+{
+ LLUUID id_to_remove = mLookContents->getSelectionInterface()->getCurrentID();
+
+ LLViewerInventoryItem * item_to_remove = gInventory.getItem(id_to_remove);
+
+ if (item_to_remove)
+ {
+ // returns null if not a wearable (attachment, etc).
+ const LLWearable* wearable_to_remove = gAgentWearables.getWearableFromAssetID(item_to_remove->getAssetUUID());
+ if (!wearable_to_remove || gAgentWearables.canWearableBeRemoved( wearable_to_remove ))
+ {
+ gInventory.purgeObject( id_to_remove );
+ updateLookInfo();
+ mRemoveFromLookBtn->setEnabled(FALSE);
+ if (mRemoveFromLookBtn->getVisible())
+ {
+ mRemoveFromLookBtn->setVisible(FALSE);
+ }
+ }
+ }
+}
+
+
+void LLPanelOutfitEdit::onUpClicked(void)
+{
+ LLUUID inv_id = mLookContents->getSelectionInterface()->getCurrentID();
+ if (inv_id.isNull())
+ {
+ //nothing selected, do nothing
+ return;
+ }
+
+ LLViewerInventoryItem *link_item = gInventory.getItem(inv_id);
+ if (!link_item)
+ {
+ llwarns << "could not find inventory item based on currently worn link." << llendl;
+ return;
+ }
+
+
+ LLUUID asset_id = link_item->getAssetUUID();
+ if (asset_id.isNull())
+ {
+ llwarns << "inventory link has null Asset ID. could not get object reference" << llendl;
+ }
+
+ static const std::string empty = "";
+ LLWearableList::instance().getAsset(asset_id,
+ empty, // don't care about wearable name
+ link_item->getActualType(),
+ LLSidepanelAppearance::editWearable,
+ (void*)getParentUICtrl());
+}
+
+
+void LLPanelOutfitEdit::onEditWearableClicked(void)
+{
+ LLUUID id_to_edit = mLookContents->getSelectionInterface()->getCurrentID();
+
+ LLViewerInventoryItem * item_to_edit = gInventory.getItem(id_to_edit);
+
+ if (item_to_edit)
+ {
+ // returns null if not a wearable (attachment, etc).
+ LLWearable* wearable_to_edit = gAgentWearables.getWearableFromAssetID(item_to_edit->getAssetUUID());
+ if (!wearable_to_edit || !wearable_to_edit->getPermissions().allowModifyBy(gAgent.getID()) )
+ {
+ LLSidepanelAppearance::editWearable(wearable_to_edit, getParent());
+ if (mEditWearableBtn->getVisible())
+ {
+ mEditWearableBtn->setVisible(FALSE);
+ }
+ }
+ }
+}
+
+void LLPanelOutfitEdit::onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+{
+ LLFolderViewItem* current_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+
+ /* Removing add to look inline button (not part of mvp for viewer 2)
+ LLRect btn_rect(current_item->getLocalRect().mRight - 50,
+ current_item->getLocalRect().mTop,
+ current_item->getLocalRect().mRight - 30,
+ current_item->getLocalRect().mBottom);
+
+ mAddToLookBtn->setRect(btn_rect);
+ mAddToLookBtn->setEnabled(TRUE);
+ if (!mAddToLookBtn->getVisible())
+ {
+ mAddToLookBtn->setVisible(TRUE);
+ }
+
+ current_item->addChild(mAddToLookBtn); */
+}
+
+void LLPanelOutfitEdit::onLookItemSelectionChange(void)
+{
+ S32 left_offset = -4;
+ S32 top_offset = -10;
+ LLRect rect = mLookContents->getLastSelectedItem()->getRect();
+ LLRect btn_rect(
+ left_offset + rect.mRight - 50,
+ top_offset + rect.mTop,
+ left_offset + rect.mRight - 30,
+ top_offset + rect.mBottom);
+
+ mEditWearableBtn->setRect(btn_rect);
+
+ mEditWearableBtn->setEnabled(TRUE);
+ if (!mEditWearableBtn->getVisible())
+ {
+ mEditWearableBtn->setVisible(TRUE);
+ }
+ //mLookContents->addChild(mRemoveFromLookBtn);
+}
+
+void LLPanelOutfitEdit::changed(U32 mask)
+{
+}
+
+void LLPanelOutfitEdit::lookFetched(void)
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+
+ // collectDescendentsIf takes non-const reference:
+ LLFindCOFValidItems is_cof_valid;
+ gInventory.collectDescendentsIf(mLookID,
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_cof_valid);
+ for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
+ iter != item_array.end();
+ iter++)
+ {
+ const LLViewerInventoryItem *item = (*iter);
+
+ LLSD row;
+ row["id"] = item->getUUID();
+ LLSD& columns = row["columns"];
+ columns[0]["column"] = "look_item";
+ columns[0]["type"] = "text";
+ columns[0]["value"] = item->getName();
+ columns[1]["column"] = "look_item_sort";
+ columns[1]["type"] = "text"; // TODO: multi-wearable sort "type" should go here.
+ columns[1]["value"] = "BAR"; // TODO: Multi-wearable sort index should go here
+
+ mLookContents->addElement(row);
+ }
+
+ if (mLookContents->getItemCount() != mNumItemsInLook)
+ {
+ mNumItemsInLook = mLookContents->getItemCount();
+ LLAppearanceMgr::instance().updateCOF(mLookID);
+ }
+}
+
+void LLPanelOutfitEdit::updateLookInfo()
+{
+ if (getVisible())
+ {
+ mLookContents->clearRows();
+
+ uuid_vec_t folders;
+ folders.push_back(mLookID);
+ mFetchLook->fetchDescendents(folders);
+ if (mFetchLook->isEverythingComplete())
+ {
+ mFetchLook->done();
+ }
+ else
+ {
+ gInventory.addObserver(mFetchLook);
+ }
+ }
+}
+
+void LLPanelOutfitEdit::displayLookInfo(const LLInventoryCategory* pLook)
+{
+ if (!pLook)
+ {
+ return;
+ }
+
+ if (!getVisible())
+ {
+ setVisible(TRUE);
+ }
+
+ if (mLookID != pLook->getUUID())
+ {
+ mLookID = pLook->getUUID();
+ mLookName->setText("Look: " + pLook->getName());
+ updateLookInfo();
+ }
+}
+
+void LLPanelOutfitEdit::reset()
+{
+ mLookID.setNull();
+}
+
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
new file mode 100644
index 0000000000..09ec51c056
--- /dev/null
+++ b/indra/newview/llpaneloutfitedit.h
@@ -0,0 +1,127 @@
+/**
+ * @file llpaneloutfitedit.h
+ * @brief Displays outfit edit information in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELOUTFITEDIT_H
+#define LL_LLPANELOUTFITEDIT_H
+
+#include "llpanel.h"
+
+#include "v3dmath.h"
+#include "lluuid.h"
+
+#include "lliconctrl.h"
+
+#include "llremoteparcelrequest.h"
+#include "llinventory.h"
+#include "llinventorymodel.h"
+
+class LLButton;
+class LLTextBox;
+class LLInventoryCategory;
+class LLInventoryLookObserver;
+class LLInventoryPanel;
+class LLSaveFolderState;
+class LLFolderViewItem;
+class LLScrollListCtrl;
+class LLLookFetchObserver;
+class LLFilterEditor;
+
+class LLPanelOutfitEdit : public LLPanel
+{
+public:
+
+ // NOTE: initialize mLookItemTypes at the index of any new enum you add in the LLPanelOutfitEdit() constructor
+ typedef enum e_look_item_type
+ {
+ LIT_ALL = 0,
+ LIT_WEARABLE, // clothing or shape
+ LIT_ATTACHMENT,
+ NUM_LOOK_ITEM_TYPES
+ } ELookItemType;
+
+ struct LLLookItemType {
+ std::string displayName;
+ U64 inventoryMask;
+ LLLookItemType() : displayName("NONE"), inventoryMask(0) {}
+ LLLookItemType(std::string name, U64 mask) : displayName(name), inventoryMask(mask) {}
+ };
+
+ LLPanelOutfitEdit();
+ /*virtual*/ ~LLPanelOutfitEdit();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void changed(U32 mask);
+
+ void reset();
+ // Ignore all old information, useful if you are
+ // recycling an existing dialog and need to clear it.
+
+ /*virtual*/ void setParcelID(const LLUUID& parcel_id);
+ // Sends a request for data about the given parcel, which will
+ // only update the location if there is none already available.
+
+ void onTypeFilterChanged(LLUICtrl* ctrl);
+ void onSearchEdit(const std::string& string);
+ void onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+ void onAddToLookClicked(void);
+ void onLookItemSelectionChange(void);
+ void onRemoveFromLookClicked(void);
+ void onEditWearableClicked(void);
+ void onUpClicked(void);
+
+ void displayLookInfo(const LLInventoryCategory* pLook);
+
+ void lookFetched(void);
+
+ void updateLookInfo(void);
+
+private:
+
+ LLUUID mLookID;
+ LLTextBox* mLookName;
+ LLScrollListCtrl* mLookContents;
+ LLInventoryPanel* mInventoryItemsPanel;
+ LLFilterEditor* mSearchFilter;
+ LLSaveFolderState* mSavedFolderState;
+ std::string mSearchString;
+ LLButton* mAddToLookBtn;
+ LLButton* mRemoveFromLookBtn;
+ LLButton* mUpBtn;
+ LLButton* mEditWearableBtn;
+ S32 mNumItemsInLook;
+
+ LLLookFetchObserver* mFetchLook;
+ LLInventoryLookObserver* mLookObserver;
+ std::vector<LLLookItemType> mLookItemTypes;
+};
+
+#endif // LL_LLPANELOUTFITEDIT_H
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 8a1be2706c..288edeb031 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -178,8 +178,8 @@ public:
protected:
virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const
{
- LLPointer<LLSpeaker> lhs = LLLocalSpeakerMgr::instance().findSpeaker(item1->getAvatarId());
- LLPointer<LLSpeaker> rhs = LLLocalSpeakerMgr::instance().findSpeaker(item2->getAvatarId());
+ LLPointer<LLSpeaker> lhs = LLActiveSpeakerMgr::instance().findSpeaker(item1->getAvatarId());
+ LLPointer<LLSpeaker> rhs = LLActiveSpeakerMgr::instance().findSpeaker(item2->getAvatarId());
if ( lhs.notNull() && rhs.notNull() )
{
// Compare by last speaking time
@@ -672,11 +672,6 @@ void LLPanelPeople::updateFriendList()
lldebugs << "Friends Cards were not found" << llendl;
}
- // show special help text for just created account to help found friends. EXT-4836
- static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_msg");
- no_friends_text->setVisible(all_friendsp.size() == 0);
-
-
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
for (; buddy_it != all_buddies.end(); ++buddy_it)
{
@@ -685,6 +680,14 @@ void LLPanelPeople::updateFriendList()
online_friendsp.push_back(buddy_id);
}
+ // show special help text for just created account to help found friends. EXT-4836
+ static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_msg");
+
+ // Seems sometimes all_friends can be empty because of issue with Inventory loading (clear cache, slow connection...)
+ // So, lets check all lists to avoid overlapping the text with online list. See EXT-6448.
+ bool any_friend_exists = (all_friendsp.size() > 0) || (online_friendsp.size() > 0);
+ no_friends_text->setVisible(!any_friend_exists);
+
/*
* Avatarlists will be hidden by showFriendsAccordionsIfNeeded(), if they do not have items.
* But avatarlist can be updated only if it is visible @see LLAvatarList::draw();
@@ -708,7 +711,7 @@ void LLPanelPeople::updateNearbyList()
mNearbyList->setDirty();
DISTANCE_COMPARATOR.updateAvatarsPositions(positions, mNearbyList->getIDs());
- LLLocalSpeakerMgr::instance().update(TRUE);
+ LLActiveSpeakerMgr::instance().update(TRUE);
}
void LLPanelPeople::updateRecentList()
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 8b365c6433..862e32cca8 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -226,6 +226,11 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
return (LLAvatarTracker::instance().isBuddyOnline(id) && is_agent_mappable(id))
|| gAgent.isGodlike();
}
+ else if(item == std::string("can_offer_teleport"))
+ {
+ const LLUUID& id = mUUIDs.front();
+ return LLAvatarActions::canOfferTeleport(id);
+ }
return false;
}
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 01b6e8ffad..71d16a08b4 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -195,8 +195,8 @@ void LLPanelPermissions::disableAll()
childSetEnabled("Owner Name", FALSE);
childSetEnabled("Group:", FALSE);
- childSetText("Group Name", LLStringUtil::null);
- childSetEnabled("Group Name", FALSE);
+ childSetText("Group Name Proxy", LLStringUtil::null);
+ childSetEnabled("Group Name Proxy", FALSE);
childSetEnabled("button set group", FALSE);
childSetText("Object Name", LLStringUtil::null);
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 6f920cf4b9..bde8d02885 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -288,7 +288,8 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
LLAvatarClassifieds* c_info = static_cast<LLAvatarClassifieds*>(data);
if(c_info && getAvatarId() == c_info->target_id)
{
- mClassifiedsList->clear();
+ // do not clear classified list in case we will receive two or more data packets.
+ // list has been cleared in updateData(). (fix for EXT-6436)
LLAvatarClassifieds::classifieds_list_t::const_iterator it = c_info->classifieds_list.begin();
for(; c_info->classifieds_list.end() != it; ++it)
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 90c8f2551f..0a34531eee 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -348,7 +348,7 @@ LLContextMenu* LLTeleportHistoryPanel::ContextMenu::createMenu()
void LLTeleportHistoryPanel::ContextMenu::onTeleport()
{
- LLTeleportHistoryStorage::getInstance()->goToItem(mIndex);
+ confirmTeleport(mIndex);
}
void LLTeleportHistoryPanel::ContextMenu::onInfo()
@@ -507,7 +507,7 @@ void LLTeleportHistoryPanel::onTeleport()
return;
// teleport to existing item in history, so we don't add it again
- mTeleportHistory->goToItem(itemp->getIndex());
+ confirmTeleport(itemp->getIndex());
}
/*
@@ -1058,3 +1058,27 @@ void LLTeleportHistoryPanel::onAccordionExpand(LLUICtrl* ctrl, const LLSD& param
mLastSelectedFlatlList->resetSelection();
}
}
+
+// static
+void LLTeleportHistoryPanel::confirmTeleport(S32 hist_idx)
+{
+ LLSD args;
+ args["HISTORY_ENTRY"] = LLTeleportHistoryStorage::getInstance()->getItems()[hist_idx].mTitle;
+ LLNotificationsUtil::add("TeleportToHistoryEntry", args, LLSD(),
+ boost::bind(&LLTeleportHistoryPanel::onTeleportConfirmation, _1, _2, hist_idx));
+}
+
+// Called when user reacts upon teleport confirmation dialog.
+// static
+bool LLTeleportHistoryPanel::onTeleportConfirmation(const LLSD& notification, const LLSD& response, S32 hist_idx)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (0 == option)
+ {
+ // Teleport to given history item.
+ LLTeleportHistoryStorage::getInstance()->goToItem(hist_idx);
+ }
+
+ return false;
+}
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index 4eeaec7705..5e2ccc0c93 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -103,6 +103,9 @@ private:
bool isAccordionCollapsedByUser(LLUICtrl* acc_tab);
void onAccordionExpand(LLUICtrl* ctrl, const LLSD& param);
+ static void confirmTeleport(S32 hist_idx);
+ static bool onTeleportConfirmation(const LLSD& notification, const LLSD& response, S32 hist_idx);
+
LLTeleportHistoryStorage* mTeleportHistory;
LLAccordionCtrl* mHistoryAccordion;
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index ee8e3f1db6..bfd9a840f2 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -38,6 +38,7 @@
#include "llagent.h"
#include "llassetuploadresponders.h"
+#include "lldraghandle.h"
#include "llviewerwindow.h"
#include "llbutton.h"
#include "llfloaterreg.h"
@@ -188,6 +189,20 @@ void LLPreviewNotecard::refreshFromInventory(const LLUUID& new_item_id)
loadAsset();
}
+void LLPreviewNotecard::updateTitleButtons()
+{
+ LLPreview::updateTitleButtons();
+
+ LLUICtrl* lock_btn = getChild<LLUICtrl>("lock");
+ if(lock_btn->getVisible() && !isMinimized()) // lock button stays visible if floater is minimized.
+ {
+ LLRect lock_rc = lock_btn->getRect();
+ LLRect buttons_rect = getDragHandle()->getButtonsRect();
+ buttons_rect.mLeft = lock_rc.mLeft;
+ getDragHandle()->setButtonsRect(buttons_rect);
+ }
+}
+
void LLPreviewNotecard::loadAsset()
{
// request the asset.
diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h
index 5b8cf1c2f6..e0363eef54 100644
--- a/indra/newview/llpreviewnotecard.h
+++ b/indra/newview/llpreviewnotecard.h
@@ -79,6 +79,7 @@ public:
protected:
+ void updateTitleButtons();
virtual void loadAsset();
bool saveIfNeeded(LLInventoryItem* copyitem = NULL);
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 8364eee09d..00e152b7f5 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -93,7 +93,7 @@ LLSidepanelAppearance::LLSidepanelAppearance() :
LLPanel(),
mFilterSubString(LLStringUtil::null),
mFilterEditor(NULL),
- mLookInfo(NULL),
+ mOutfitEdit(NULL),
mCurrOutfitPanel(NULL)
{
}
@@ -129,10 +129,10 @@ BOOL LLSidepanelAppearance::postBuild()
mPanelOutfitsInventory = dynamic_cast<LLPanelOutfitsInventory *>(getChild<LLPanel>("panel_outfits_inventory"));
mPanelOutfitsInventory->setParent(this);
- mLookInfo = dynamic_cast<LLPanelLookInfo*>(getChild<LLPanel>("panel_look_info"));
- if (mLookInfo)
+ mOutfitEdit = dynamic_cast<LLPanelOutfitEdit*>(getChild<LLPanel>("panel_outfit_edit"));
+ if (mOutfitEdit)
{
- LLButton* back_btn = mLookInfo->getChild<LLButton>("back_btn");
+ LLButton* back_btn = mOutfitEdit->getChild<LLButton>("back_btn");
if (back_btn)
{
back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onBackButtonClicked, this));
@@ -177,7 +177,7 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)
if(key.size() == 0)
return;
- toggleLookInfoPanel(TRUE);
+ toggleOutfitEditPanel(TRUE);
updateVerbs();
mLookInfoType = key["type"].asString();
@@ -186,7 +186,7 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)
{
LLInventoryCategory *pLook = gInventory.getCategory(key["id"].asUUID());
if (pLook)
- mLookInfo->displayLookInfo(pLook);
+ mOutfitEdit->displayLookInfo(pLook);
}
}
@@ -241,9 +241,9 @@ void LLSidepanelAppearance::onEditAppearanceButtonClicked()
void LLSidepanelAppearance::onEditButtonClicked()
{
- toggleLookInfoPanel(FALSE);
+ toggleOutfitEditPanel(FALSE);
toggleWearableEditPanel(TRUE, NULL);
- /*if (mLookInfo->getVisible())
+ /*if (mOutfitEdit->getVisible())
{
}
else
@@ -254,7 +254,7 @@ void LLSidepanelAppearance::onEditButtonClicked()
void LLSidepanelAppearance::onNewOutfitButtonClicked()
{
- if (!mLookInfo->getVisible())
+ if (!mOutfitEdit->getVisible())
{
mPanelOutfitsInventory->onSave();
}
@@ -263,22 +263,22 @@ void LLSidepanelAppearance::onNewOutfitButtonClicked()
void LLSidepanelAppearance::onBackButtonClicked()
{
- toggleLookInfoPanel(FALSE);
+ toggleOutfitEditPanel(FALSE);
}
void LLSidepanelAppearance::onEditWearBackClicked()
{
mEditWearable->saveChanges();
toggleWearableEditPanel(FALSE, NULL);
- toggleLookInfoPanel(TRUE);
+ toggleOutfitEditPanel(TRUE);
}
-void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible)
+void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible)
{
- if (!mLookInfo)
+ if (!mOutfitEdit)
return;
- mLookInfo->setVisible(visible);
+ mOutfitEdit->setVisible(visible);
if (mPanelOutfitsInventory) mPanelOutfitsInventory->setVisible(!visible);
mFilterEditor->setVisible(!visible);
mEditBtn->setVisible(!visible);
@@ -305,7 +305,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we
void LLSidepanelAppearance::updateVerbs()
{
- bool is_look_info_visible = mLookInfo->getVisible();
+ bool is_look_info_visible = mOutfitEdit->getVisible();
if (mPanelOutfitsInventory && !is_look_info_visible)
{
@@ -344,7 +344,7 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
void LLSidepanelAppearance::editWearable(LLWearable *wearable, void *data)
{
LLSidepanelAppearance *panel = (LLSidepanelAppearance*) data;
- panel->toggleLookInfoPanel(FALSE);
+ panel->toggleOutfitEditPanel(FALSE);
panel->toggleWearableEditPanel(TRUE, wearable);
}
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index aa2e67fd16..1d78e92a84 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -36,7 +36,7 @@
#include "llinventoryobserver.h"
#include "llinventory.h"
-#include "llpanellookinfo.h"
+#include "llpaneloutfitedit.h"
class LLFilterEditor;
class LLCurrentlyWornFetchObserver;
@@ -71,12 +71,12 @@ private:
void onEditButtonClicked();
void onBackButtonClicked();
void onEditWearBackClicked();
- void toggleLookInfoPanel(BOOL visible);
+ void toggleOutfitEditPanel(BOOL visible);
void toggleWearableEditPanel(BOOL visible, LLWearable* wearable);
LLFilterEditor* mFilterEditor;
LLPanelOutfitsInventory* mPanelOutfitsInventory;
- LLPanelLookInfo* mLookInfo;
+ LLPanelOutfitEdit* mOutfitEdit;
LLPanelEditWearable* mEditWearable;
LLButton* mOpenOutfitBtn;
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 58f64ff1f3..b660a2b8ea 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -372,6 +372,8 @@ void LLStatusBar::setVisibleForMouselook(bool visible)
mTextTime->setVisible(visible);
getChild<LLUICtrl>("buycurrency")->setVisible(visible);
getChild<LLUICtrl>("buyL")->setVisible(visible);
+ mBtnVolume->setVisible(visible);
+ mMediaToggle->setVisible(visible);
mSGBandwidth->setVisible(visible);
mSGPacketLoss->setVisible(visible);
setBackgroundVisible(visible);
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 66373feb93..cbb030836e 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -58,7 +58,8 @@ LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLTransientDockableFloater(N
mSysWellChiclet(NULL),
mSeparator(NULL),
NOTIFICATION_WELL_ANCHOR_NAME("notification_well_panel"),
- IM_WELL_ANCHOR_NAME("im_well_panel")
+ IM_WELL_ANCHOR_NAME("im_well_panel"),
+ mIsReshapedByUser(false)
{
mTypedItemsCount[IT_NOTIFICATION] = 0;
@@ -100,6 +101,13 @@ void LLSysWellWindow::setMinimized(BOOL minimize)
}
//---------------------------------------------------------------------------------
+void LLSysWellWindow::handleReshape(const LLRect& rect, bool by_user)
+{
+ mIsReshapedByUser |= by_user; // mark floater that it is reshaped by user
+ LLTransientDockableFloater::handleReshape(rect, by_user);
+}
+
+//---------------------------------------------------------------------------------
void LLSysWellWindow::onStartUpToastClick(S32 x, S32 y, MASK mask)
{
// just set floater visible. Screen channels will be cleared.
@@ -211,7 +219,7 @@ void LLSysWellWindow::reshapeWindow()
// it includes height from floater top to list top and from floater bottom and list bottom
static S32 parent_list_delta_height = getRect().getHeight() - mMessageList->getRect().getHeight();
- if (isDocked()) // Don't reshape undocked Well window. See EXT-5715.
+ if (!mIsReshapedByUser) // Don't reshape Well window, if it ever was reshaped by user. See EXT-5715.
{
S32 notif_list_height = mMessageList->getItemsRect().getHeight() + 2 * mMessageList->getBorderWidth();
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 3790aa3ea9..296bdf7482 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -70,6 +70,7 @@ public:
/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
// override LLFloater's minimization according to EXT-1216
/*virtual*/ void setMinimized(BOOL minimize);
+ /*virtual*/ void handleReshape(const LLRect& rect, bool by_user);
void onStartUpToastClick(S32 x, S32 y, MASK mask);
@@ -121,7 +122,7 @@ protected:
typedef std::map<EItemType, S32> typed_items_count_t;
typed_items_count_t mTypedItemsCount;
-
+ bool mIsReshapedByUser;
};
/**
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 907740a88e..c9d2d404c0 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -45,6 +45,7 @@
#include "lltrans.h"
#include "llnotificationsutil.h"
#include "llviewermessage.h"
+#include "llimfloater.h"
const S32 BOTTOM_PAD = VPAD * 3;
const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding
@@ -531,12 +532,26 @@ void LLToastNotifyPanel::disableRespondedOptions(LLNotificationPtr& notification
//////////////////////////////////////////////////////////////////////////
-LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLRect& rect /* = LLRect::null */)
- : LLToastNotifyPanel(pNotification, rect)
+LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect /* = LLRect::null */)
+ : mSessionID(session_id), LLToastNotifyPanel(pNotification, rect)
{
mTextBox->setFollowsAll();
}
+LLIMToastNotifyPanel::~LLIMToastNotifyPanel()
+{
+ // We shouldn't delete notification when IM floater exists
+ // since that notification will be reused by IM floater.
+ // This may happened when IM floater reloads messages, exactly when user
+ // changes layout of IM chat log(disable/enable plaintext mode).
+ // See EXT-6500
+ LLIMFloater* im_floater = LLIMFloater::findInstance(mSessionID);
+ if (im_floater != NULL && !im_floater->isDead())
+ {
+ mCloseNotificationOnDestroy = false;
+ }
+}
+
void LLIMToastNotifyPanel::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
{
S32 text_height = mTextBox->getTextBoundingRect().getHeight();
diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h
index a8d2d03236..1c68e4c6b3 100644
--- a/indra/newview/lltoastnotifypanel.h
+++ b/indra/newview/lltoastnotifypanel.h
@@ -138,9 +138,14 @@ class LLIMToastNotifyPanel : public LLToastNotifyPanel
{
public:
- LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLRect& rect = LLRect::null);
+ LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect = LLRect::null);
+
+ ~LLIMToastNotifyPanel();
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+protected:
+ LLUUID mSessionID;
};
#endif /* LLTOASTNOTIFYPANEL_H_ */
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 42c8b4ee64..a3d78d13fa 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1753,17 +1753,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
std::string separator_string(": ");
LLSD args;
+ LLSD payload;
switch(dialog)
{
case IM_CONSOLE_AND_CHAT_HISTORY:
- // These are used for system messages, hence don't need the name,
- // as it is always "Second Life".
// *TODO: Translate
args["MESSAGE"] = message;
-
- // Note: don't put the message in the IM history, even though was sent
- // via the IM mechanism.
- LLNotificationsUtil::add("SystemMessageTip",args);
+ payload["SESSION_NAME"] = name;
+ payload["from_id"] = from_id;
+ LLNotificationsUtil::add("IMSystemMessageTip",args, payload);
break;
case IM_NOTHING_SPECIAL:
@@ -1986,7 +1984,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// For requested notices, we don't want to send the popups.
if (dialog != IM_GROUP_NOTICE_REQUESTED)
{
- LLSD payload;
payload["subject"] = subj;
payload["message"] = mes;
payload["sender_name"] = name;
@@ -2317,7 +2314,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
{
LLSD args;
// *TODO: Translate -> [FIRST] [LAST] (maybe)
- args["NAME"] = name;
+ args["NAME_SLURL"] = LLSLURL::buildCommand("agent", from_id, "about");
args["MESSAGE"] = message;
LLSD payload;
payload["from_id"] = from_id;
@@ -5589,6 +5586,10 @@ void handle_lure(const LLUUID& invitee)
// Prompt for a message to the invited user.
void handle_lure(const uuid_vec_t& ids)
{
+ if (ids.empty()) return;
+
+ if (!gAgent.getRegion()) return;
+
LLSD edit_args;
edit_args["REGION"] = gAgent.getRegion()->getName();
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 85c961f34a..d7d5cbbd10 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2090,7 +2090,7 @@ void LLViewerWindow::draw()
// Draw tool specific overlay on world
LLToolMgr::getInstance()->getCurrentTool()->draw();
- if( gAgentCamera.cameraMouselook() )
+ if( gAgentCamera.cameraMouselook() || LLFloaterCamera::inFreeCameraMode() )
{
drawMouselookInstructions();
stop_glerror();
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index fcf5cfadb2..777d671e81 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -524,7 +524,7 @@
reference="Unused?" />
<color
name="NetMapBackgroundColor"
- value="0 0 0 0.3" />
+ value="0 0 0 0" />
<color
name="NetMapGroupOwnAboveWater"
reference="Purple" />
diff --git a/indra/newview/skins/default/xui/da/language_settings.xml b/indra/newview/skins/default/xui/da/language_settings.xml
index 71418d446a..fa8a788605 100644
--- a/indra/newview/skins/default/xui/da/language_settings.xml
+++ b/indra/newview/skins/default/xui/da/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">danish</string>
+ <string name="DarwinLocale">da_DK.UTF-8</string>
+ <string name="LinuxLocale">da_DK.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/de/language_settings.xml b/indra/newview/skins/default/xui/de/language_settings.xml
index 71418d446a..3e357007ff 100644
--- a/indra/newview/skins/default/xui/de/language_settings.xml
+++ b/indra/newview/skins/default/xui/de/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">german</string>
+ <string name="DarwinLocale">de_DE.UTF-8</string>
+ <string name="LinuxLocale">de_DE.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index bc67621dfd..d03231a3fa 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -76,7 +76,7 @@ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number
allow_html="true"
follows="top|left"
font="SansSerif"
- height="350"
+ height="343"
bg_readonly_color="Transparent"
left="5"
max_length="65536"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
index e02d32596a..637f9f55d4 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -24,13 +24,13 @@
<text
type="string"
length="1"
- follows="top|left"
+ follows="top|left|right"
font="SansSerifHuge"
layout="topleft"
left="20"
height="30"
top="25"
- width="300"
+ width="340"
name="info_need_more">
You need more L$
</text>
@@ -55,7 +55,7 @@
left="20"
height="30"
top="25"
- width="200"
+ width="300"
name="info_buying">
Buy L$
</text>
@@ -178,8 +178,8 @@
follows="top|left"
height="16"
halign="right"
- left="140"
- width="180"
+ left="20"
+ width="300"
layout="topleft"
name="buy_action">
[ACTION]
diff --git a/indra/newview/skins/default/xui/en/floater_god_tools.xml b/indra/newview/skins/default/xui/en/floater_god_tools.xml
index 36ef6beb59..240871ec25 100644
--- a/indra/newview/skins/default/xui/en/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml
@@ -31,19 +31,6 @@
<button
follows="left|top"
height="20"
- label="Kick all Residents"
- label_selected="Kick all Residents"
- layout="topleft"
- left="10"
- name="Kick all users"
- top="30"
- width="120">
- <button.commit_callback
- function="GridTools.KickAll" />
- </button>
- <button
- follows="left|top"
- height="20"
label="Flush This Region&apos;s Map Visibility Caches"
label_selected="Flush This Region&apos;s Map Visibility Caches"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml
index 5d35275e17..e21e44204d 100644
--- a/indra/newview/skins/default/xui/en/floater_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_map.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
+ bg_alpha_image_overlay="DkGray_66"
legacy_header_height="18"
can_minimize="true"
can_resize="true"
diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml
index 00e00b9694..b8a7222e8e 100644
--- a/indra/newview/skins/default/xui/en/inspect_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_object.xml
@@ -26,6 +26,7 @@ owner [OWNER]
<string name="Touch">Touch</string>
<string name="Sit">Sit</string>
<text
+ allow_html="false"
follows="all"
font="SansSerifLarge"
height="16"
diff --git a/indra/newview/skins/default/xui/en/menu_group_plus.xml b/indra/newview/skins/default/xui/en/menu_group_plus.xml
index e83d07baec..fce7414d80 100644
--- a/indra/newview/skins/default/xui/en/menu_group_plus.xml
+++ b/indra/newview/skins/default/xui/en/menu_group_plus.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
- mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+ mouse_opaque="false">
<menu_item_call name="item_join" label="Join Group...">
<menu_item_call.on_click function="People.Group.Plus.Action" userdata="join_group" />
</menu_item_call>
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
index 1b002b1c32..a5ac5f76e1 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
@@ -40,6 +40,8 @@
name="teleport">
<menu_item_call.on_click
function="InspectAvatar.Teleport"/>
+ <menu_item_call.on_enable
+ function="InspectAvatar.Gear.EnableTeleportOffer"/>
</menu_item_call>
<menu_item_call
label="Invite to Group"
diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
index f1117d1419..92752a0fee 100644
--- a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
- mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+ mouse_opaque="false">
<menu_item_check
label="Sort by Name"
name="sort_name">
diff --git a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
index df3cb26b04..2efb204ffb 100644
--- a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
- mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+ mouse_opaque="false">
<menu_item_check
label="Display Group Icons"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
index 014a52bb4f..d2e35e4cc0 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -88,5 +88,8 @@
name="teleport">
<menu_item_call.on_click
function="Avatar.OfferTeleport"/>
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_offer_teleport"/>
</menu_item_call>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
index 39f9e48609..69b3831738 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
- mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+ mouse_opaque="false">
<menu_item_check
label="Sort by Recent Speakers"
name="sort_by_recent_speakers">
diff --git a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
index cfd6dc78b6..5c9555db92 100644
--- a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
- mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+ mouse_opaque="false">
<menu_item_check
label="Sort by Most Recent"
name="sort_most">
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index a08bc16066..ac31636ed2 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -159,7 +159,8 @@
<menu_item_call
label="My Groups"
layout="topleft"
- name="My Groups">
+ name="My Groups"
+ shortcut="control|shift|G">
<menu_item_call.on_click
function="SideTray.PanelPeopleTab"
parameter="groups_panel" />
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index c39a91281e..8501143fe6 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3111,6 +3111,18 @@ Teleport to [PICK]?
</notification>
<notification
+ icon="alertmodal.tga"
+ name="TeleportToHistoryEntry"
+ type="alertmodal">
+Teleport to [HISTORY_ENTRY]?
+ <usetemplate
+ ignoretext="Confirm that I want to teleport to a history location"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="Teleport"/>
+ </notification>
+
+ <notification
icon="alert.tga"
label="Message everyone in your Estate"
name="MessageEstate"
@@ -4269,6 +4281,13 @@ The string [STRING_NAME] is missing from strings.xml
type="notifytip">
[MESSAGE]
</notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="IMSystemMessageTip"
+ type="notifytip">
+[MESSAGE]
+ </notification>
<notification
icon="notifytip.tga"
@@ -5103,7 +5122,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
icon="notify.tga"
name="TeleportOffered"
type="offer">
-[NAME] has offered to teleport you to their location:
+[NAME_SLURL] has offered to teleport you to their location:
[MESSAGE]
<form name="form">
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 58c5c11e51..b6d7bf8dd0 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -263,7 +263,7 @@
top="0"
name="chiclet_list_panel"
width="189"
- min_width="60"
+ min_width="95"
user_resize="false"
auto_resize="true">
<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
@@ -274,7 +274,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
height="24"
layout="topleft"
left="1"
- min_width="60"
+ min_width="95"
name="chiclet_list"
top="7"
chiclet_padding="4"
@@ -330,7 +330,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
min_width="4"
name="DUMMY"
top="0"
- width="5"/>
+ width="4"/>
<layout_panel
auto_resize="false"
follows="right"
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index 250dadd390..9124ad528d 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -21,6 +21,7 @@
top="3"
width="18" />
<text
+ allow_html="false"
allow_scroll="false"
v_pad = "7"
read_only = "true"
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 731b3c119c..479629f6ea 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -131,6 +131,7 @@ Maximum 200 per group daily
Subject:
</text>
<line_editor
+ follows="left|top|right"
border_style="line"
border_thickness="1"
height="16"
@@ -153,6 +154,7 @@ Maximum 200 per group daily
Message:
</text>
<text_editor
+ follows="left|top|right"
height="90"
layout="topleft"
left_pad="3"
@@ -173,6 +175,7 @@ Maximum 200 per group daily
Attach:
</text>
<line_editor
+ follows="left|top|right"
enabled="false"
height="19"
layout="topleft"
@@ -222,7 +225,7 @@ Maximum 200 per group daily
label="Send"
label_selected="Send"
layout="topleft"
- right="-10"
+ right="-25"
top_pad="10"
name="send_notice"
width="100" />
diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
index 4112b65635..4386475cf1 100644
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -117,6 +117,7 @@
layout="topleft"
left="107"
textbox.max_length="512"
+ textbox.show_context_menu="true"
name="sl_description_edit"
top_pad="-3"
translate="false"
@@ -171,6 +172,7 @@
layout="topleft"
left="107"
textbox.max_length="512"
+ textbox.show_context_menu="true"
name="fl_description_edit"
top_pad="-3"
translate="false"
@@ -311,6 +313,7 @@
name="sl_groups"
top_pad="0"
translate="false"
+ textbox.show_context_menu="true"
width="298"
expanded_bg_visible="true"
expanded_bg_color="DkGray">
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
new file mode 100644
index 0000000000..d4924562fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ border="false"
+ height="570"
+ follows="all"
+ label="Look Info"
+ layout="topleft"
+ name="look_info"
+ width="320">
+ <panel.string
+ name="not_available">
+ (N\A)
+ </panel.string>
+ <panel.string
+ name="unknown">
+ (unknown)
+ </panel.string>
+ <panel
+ background_visible="true"
+ bevel_style="none"
+ follows="left|top|right|bottom"
+ height="530"
+ label="Outfit"
+ layout="topleft"
+ name="look_management_panel"
+ width="320">
+ <panel
+ follows="left|right|top"
+ header_visible="false"
+ layout="topleft"
+ min_height="300"
+ name="look_group"
+ title="Outfit Group"
+ top="0">
+ <panel
+ follows="left|right|top"
+ height="210"
+ layout="topleft"
+ top_pad="0"
+ name="look_info_group_bar"
+ width="295">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ mouse_opaque="false"
+ name="curr_look_name"
+ width="175">
+ Look: [LOOK]
+ </text>
+ <button
+ follows="left|top"
+ height="20"
+ label="Wear"
+ layout="topleft"
+ name="wear_look_btn"
+ left_pad="5"
+ top_pad="-24"
+ width="65" />
+ <button
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ name="back_btn"
+ width="20" />
+ </panel>
+ </panel>
+
+ <panel
+ follows="left|right|top"
+ height="200"
+ layout="topleft"
+ name="outfit_display"
+ top_pad="10"
+ width="320">
+
+ <scroll_list
+ width="285"
+ column_padding="0"
+ draw_heading="false"
+ draw_stripes="false"
+ follows="left|top|bottom|right"
+ layout="topleft"
+ name="look_items_list"
+ search_column="1"
+ sort_column="2"
+ left="0"
+ height="200"
+ top_pad="0">
+ <scroll_list.columns
+ label="Look Item"
+ name="look_item"
+ width="285" />
+ <scroll_list.columns
+ label="Outfit Item Sort"
+ width="0"
+ sort_column="look_item_sort"
+ name="look_item_sort" />
+ </scroll_list>
+ <button
+ follows="left|top|right"
+ height="20"
+ label="-"
+ left_pad="0"
+ layout="topleft"
+ name="edit_wearable_btn"
+ width="20" />
+ </panel>
+ <panel
+ follows="all"
+ header_visible="false"
+ min_height="100"
+ left="0"
+ name="inventory_group"
+ title="My Inventory"
+ top_pad="10"
+ width="230">
+ <panel
+ follows="left|right|top"
+ height="270"
+ name="lower_look_accordion"
+ width="295">
+ <panel
+ follows="left|right|top"
+ height="20"
+ layout="topleft"
+ name="inventory_bar"
+ width="295">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ mouse_opaque="false"
+ name="inventory_info_text"
+ width="100">
+ My Inventory
+ </text>
+ <combo_box
+ follows="left"
+ height="20"
+ layout="topleft"
+ left_pad="0"
+ top_pad="-24"
+ name="inventory_filter"
+ tool_tip="Only show the selected inventory types"
+ width="185" />
+ </panel>
+ <panel
+ follows="left|right|top"
+ height="20"
+ layout="topleft"
+ name="look_item_filter_bar"
+ width="295">
+ <filter_editor
+ background_image="TextField_Search_Off"
+ follows="left|top|right"
+ font="SansSerif"
+ label="Outfit Item Filter"
+ layout="topleft"
+ left="0"
+ top_pad="0"
+ width="270"
+ height="20"
+ name="look_item_filter"
+ text_color="black"
+ text_pad_left="25" />
+ </panel>
+ <panel
+ follows="all"
+ height="230"
+ layout="topleft"
+ name="inventory_panel"
+ width="285">
+ <inventory_panel
+ allow_multi_select="true"
+ border="true"
+ follows="left|top|right|bottom"
+ height="230"
+ mouse_opaque="false"
+ name="inventory_items"
+ width="285"/>
+ </panel>
+ </panel>
+ </panel>
+ </panel>
+ <panel
+ follows="left|right|bottom"
+ height="30"
+ layout="topleft"
+ left="5"
+ top_pad="0"
+ name="button_bar"
+ width="295">
+ <button
+ follows="top|left|right"
+ height="25"
+ label="Add"
+ left="0"
+ layout="topleft"
+ name="add_item_btn"
+ width="90" />
+ <button
+ follows="left|right"
+ height="25"
+ left_pad="0"
+ label="Remove"
+ layout="topleft"
+ name="remove_item_btn"
+ width="90" />
+ <button
+ follows="top|left|right"
+ height="25"
+ label="UP"
+ left_pad="0"
+ layout="topleft"
+ name="up_btn"
+ width="55" />
+ <button
+ follows="left|top|right"
+ height="25"
+ label="DOWN"
+ left_pad="0"
+ layout="topleft"
+ name="down_btn"
+ width="60" />
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 30191aecb6..34ec64b8af 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -107,6 +107,7 @@
layout="topleft"
left="107"
textbox.max_length="512"
+ textbox.show_context_menu="true"
name="sl_description_edit"
top_pad="-3"
translate="false"
@@ -151,6 +152,7 @@
layout="topleft"
left="107"
textbox.max_length="512"
+ textbox.show_context_menu="true"
name="fl_description_edit"
top_pad="-3"
translate="false"
@@ -289,6 +291,7 @@
left="7"
name="sl_groups"
textbox.max_length="512"
+ textbox.show_context_menu="true"
top_pad="0"
translate="false"
width="290"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index b3d55fec65..735635f1a0 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -102,12 +102,12 @@ width="333">
name="newlook_btn"
width="100" />-->
<panel
- class="panel_look_info"
- filename="panel_look_info.xml"
+ class="panel_outfit_edit"
+ filename="panel_outfit_edit.xml"
follows="all"
layout="topleft"
left="0"
- name="panel_look_info"
+ name="panel_outfit_edit"
top="35"
visible="false" />
<panel
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 00bbbd65d0..0c73b8d769 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -114,6 +114,7 @@
<!-- ButtonToolTips, llfloater.cpp -->
<string name="BUTTON_CLOSE_DARWIN">Close (&#8984;W)</string>
<string name="BUTTON_CLOSE_WIN">Close (Ctrl+W)</string>
+ <string name="BUTTON_CLOSE_CHROME">Close</string>>
<string name="BUTTON_RESTORE">Restore</string>
<string name="BUTTON_MINIMIZE">Minimize</string>
<string name="BUTTON_TEAR_OFF">Tear Off</string>
@@ -3048,6 +3049,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="unread_chat_multiple">
[SOURCES] have said something new
</string>"
+ <string name="session_initialization_timed_out_error">
+ The session initialization is timed out
+ </string>
<!-- Financial operations strings -->
<string name="paid_you_ldollars">[NAME] paid you L$[AMOUNT]</string>
diff --git a/indra/newview/skins/default/xui/en/widgets/chat_history.xml b/indra/newview/skins/default/xui/en/widgets/chat_history.xml
index aa3ea736b8..ef885e8045 100644
--- a/indra/newview/skins/default/xui/en/widgets/chat_history.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chat_history.xml
@@ -2,7 +2,6 @@
<chat_history
message_header="panel_chat_header.xml"
message_separator="panel_chat_separator.xml"
- message_plaintext_separator="panel_chat_plaintext_separator.xml"
left_text_pad="10"
right_text_pad="15"
left_widget_pad="0"
diff --git a/indra/newview/skins/default/xui/es/language_settings.xml b/indra/newview/skins/default/xui/es/language_settings.xml
index 71418d446a..1ade4ba300 100644
--- a/indra/newview/skins/default/xui/es/language_settings.xml
+++ b/indra/newview/skins/default/xui/es/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">spanish</string>
+ <string name="DarwinLocale">es_ES.UTF-8</string>
+ <string name="LinuxLocale">es_ES.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/fr/language_settings.xml b/indra/newview/skins/default/xui/fr/language_settings.xml
index 71418d446a..117ae16ee8 100644
--- a/indra/newview/skins/default/xui/fr/language_settings.xml
+++ b/indra/newview/skins/default/xui/fr/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">french</string>
+ <string name="DarwinLocale">fr_FR.UTF-8</string>
+ <string name="LinuxLocale">fr_FR.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/it/language_settings.xml b/indra/newview/skins/default/xui/it/language_settings.xml
index 71418d446a..82cf789a6b 100644
--- a/indra/newview/skins/default/xui/it/language_settings.xml
+++ b/indra/newview/skins/default/xui/it/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">italian</string>
+ <string name="DarwinLocale">it_IT.UTF-8</string>
+ <string name="LinuxLocale">it_IT.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/ja/language_settings.xml b/indra/newview/skins/default/xui/ja/language_settings.xml
index 71418d446a..72382417d9 100644
--- a/indra/newview/skins/default/xui/ja/language_settings.xml
+++ b/indra/newview/skins/default/xui/ja/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">japanese</string>
+ <string name="DarwinLocale">ja_JP.UTF-8</string>
+ <string name="LinuxLocale">ja_JP.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/nl/language_settings.xml b/indra/newview/skins/default/xui/nl/language_settings.xml
index 71418d446a..dc4663705f 100644
--- a/indra/newview/skins/default/xui/nl/language_settings.xml
+++ b/indra/newview/skins/default/xui/nl/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">dutch</string>
+ <string name="DarwinLocale">nl_NL.UTF-8</string>
+ <string name="LinuxLocale">nl_NL.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/pl/language_settings.xml b/indra/newview/skins/default/xui/pl/language_settings.xml
index 71418d446a..debc451a33 100644
--- a/indra/newview/skins/default/xui/pl/language_settings.xml
+++ b/indra/newview/skins/default/xui/pl/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">polish</string>
+ <string name="DarwinLocale">pl_PL.UTF-8</string>
+ <string name="LinuxLocale">pl_PL.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/pt/language_settings.xml b/indra/newview/skins/default/xui/pt/language_settings.xml
index 71418d446a..f25e77574d 100644
--- a/indra/newview/skins/default/xui/pt/language_settings.xml
+++ b/indra/newview/skins/default/xui/pt/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">portuguese</string>
+ <string name="DarwinLocale">pt_PT.UTF-8</string>
+ <string name="LinuxLocale">pt_PT.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu