summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llcommon/llfasttimer.h27
-rw-r--r--indra/llui/llfloater.cpp2
-rw-r--r--indra/llui/lllayoutstack.cpp12
-rw-r--r--indra/llui/lllayoutstack.h1
-rw-r--r--indra/llui/llmultislider.cpp48
-rw-r--r--indra/llui/llmultislider.h32
-rw-r--r--indra/llui/llmultisliderctrl.cpp4
-rw-r--r--indra/llui/llmultisliderctrl.h2
-rw-r--r--indra/llui/llpanel.cpp4
-rw-r--r--indra/llui/llradiogroup.cpp4
-rw-r--r--indra/llui/llscrolllistcell.cpp2
-rw-r--r--indra/llui/llspinctrl.cpp20
-rw-r--r--indra/llui/lltabcontainer.cpp8
-rw-r--r--indra/llui/lltextbase.cpp23
-rw-r--r--indra/llui/lltextbase.h2
-rw-r--r--indra/llui/llui.cpp17
-rw-r--r--indra/llui/lluictrlfactory.h3
-rw-r--r--indra/llui/lluiimage.cpp1
-rw-r--r--indra/llui/llurlentry.cpp2
-rw-r--r--indra/llui/llurlregistry.cpp20
-rw-r--r--indra/llui/llurlregistry.h4
-rw-r--r--indra/llui/llview.cpp24
-rw-r--r--indra/llui/llview.h8
-rw-r--r--indra/newview/CMakeLists.txt8
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl52
-rw-r--r--indra/newview/featuretable.txt3
-rw-r--r--indra/newview/featuretable_linux.txt3
-rw-r--r--indra/newview/featuretable_mac.txt3
-rw-r--r--indra/newview/llagentwearables.cpp21
-rw-r--r--indra/newview/llavataractions.cpp110
-rw-r--r--indra/newview/llavataractions.h24
-rw-r--r--indra/newview/llcallfloater.cpp191
-rw-r--r--indra/newview/llcallfloater.h93
-rw-r--r--indra/newview/llchathistory.cpp141
-rw-r--r--indra/newview/llchathistory.h22
-rw-r--r--indra/newview/llcommanddispatcherlistener.cpp13
-rw-r--r--indra/newview/llcommanddispatcherlistener.h1
-rw-r--r--indra/newview/llcommandhandler.cpp55
-rw-r--r--indra/newview/llcommandhandler.h5
-rw-r--r--indra/newview/llfasttimerview.cpp16
-rw-r--r--indra/newview/llfasttimerview.h1
-rw-r--r--indra/newview/llfloaterpreference.cpp3
-rw-r--r--indra/newview/llfloatersnapshot.cpp7
-rw-r--r--indra/newview/llfloatersnapshot.h1
-rw-r--r--indra/newview/llfolderview.cpp6
-rw-r--r--indra/newview/llfolderviewitem.cpp31
-rw-r--r--indra/newview/llfolderviewitem.h9
-rw-r--r--indra/newview/llgroupactions.cpp7
-rw-r--r--indra/newview/llimfloater.cpp18
-rw-r--r--indra/newview/llimview.cpp83
-rw-r--r--indra/newview/llimview.h10
-rw-r--r--indra/newview/llinventorymodel.cpp73
-rw-r--r--indra/newview/llinventorymodel.h19
-rw-r--r--indra/newview/llinventorypanel.cpp7
-rw-r--r--indra/newview/lllogininstance.cpp41
-rw-r--r--indra/newview/lllogininstance.h2
-rwxr-xr-xindra/newview/llmediadataclient.cpp16
-rw-r--r--indra/newview/llnavigationbar.cpp18
-rw-r--r--indra/newview/llpanelavatar.cpp34
-rw-r--r--indra/newview/llpanelavatar.h9
-rw-r--r--indra/newview/llpanelpicks.cpp12
-rw-r--r--indra/newview/llpanelpicks.h2
-rw-r--r--indra/newview/llparticipantlist.cpp1
-rw-r--r--indra/newview/llprogressview.cpp27
-rw-r--r--indra/newview/llprogressview.h6
-rw-r--r--indra/newview/llscreenchannel.cpp20
-rw-r--r--indra/newview/llspeakbutton.cpp4
-rw-r--r--indra/newview/llstartup.cpp22
-rw-r--r--indra/newview/llstartup.h1
-rw-r--r--indra/newview/lltexturectrl.cpp1
-rw-r--r--indra/newview/lltexturectrl.h4
-rw-r--r--indra/newview/lltexturefetch.cpp32
-rw-r--r--indra/newview/lltoolpie.cpp6
-rw-r--r--indra/newview/llvovolume.cpp16
-rw-r--r--indra/newview/pipeline.cpp3
-rw-r--r--indra/newview/skins/default/colors.xml10
-rw-r--r--indra/newview/skins/default/textures/icons/SL_Logo.pngbin0 -> 973 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml16
-rw-r--r--indra/newview/skins/default/xui/en/floater_aaa.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_nearby_chat.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_search.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_water.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_profile_overflow.xml36
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_appearance.xml17
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_item_info.xml190
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_task_info.xml545
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml10
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chat_history.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/tab_container.xml8
-rwxr-xr-xindra/newview/viewer_manifest.py16
-rw-r--r--indra/test_apps/llplugintest/CMakeLists.txt42
-rw-r--r--indra/viewer_components/login/lllogin.cpp11
97 files changed, 1775 insertions, 751 deletions
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 45b84ea3ea..f5c90291b8 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -36,6 +36,7 @@
#include "llinstancetracker.h"
#define FAST_TIMER_ON 1
+#define TIME_FAST_TIMERS 0
#if LL_WINDOWS
@@ -56,7 +57,7 @@ inline U32 get_cpu_clock_count_32()
return ret_val;
}
-// return full timer value, still shifted by 8 bits
+// return full timer value, *not* shifted by 8 bits
inline U64 get_cpu_clock_count_64()
{
U64 ret_val;
@@ -69,7 +70,7 @@ inline U64 get_cpu_clock_count_64()
mov dword ptr [ret_val+4], edx
mov dword ptr [ret_val], eax
}
- return ret_val >> 8;
+ return ret_val;
}
#endif // LL_WINDOWS
@@ -242,6 +243,9 @@ public:
LLFastTimer(NamedTimer::FrameState& timer)
: mFrameState(&timer)
{
+#if TIME_FAST_TIMERS
+ U64 timer_start = get_cpu_clock_count_64();
+#endif
#if FAST_TIMER_ON
NamedTimer::FrameState* frame_state = &timer;
U32 cur_time = get_cpu_clock_count_32();
@@ -256,10 +260,17 @@ public:
mLastTimer = sCurTimer;
sCurTimer = this;
#endif
+#if TIME_FAST_TIMERS
+ U64 timer_end = get_cpu_clock_count_64();
+ sTimerCycles += timer_end - timer_start;
+#endif
}
~LLFastTimer()
{
+#if TIME_FAST_TIMERS
+ U64 timer_start = get_cpu_clock_count_64();
+#endif
#if FAST_TIMER_ON
NamedTimer::FrameState* frame_state = mFrameState;
U32 cur_time = get_cpu_clock_count_32();
@@ -276,6 +287,11 @@ public:
U32 total_time = cur_time - mStartTotalTime;
last_timer->mStartSelfTime += total_time;
#endif
+#if TIME_FAST_TIMERS
+ U64 timer_end = get_cpu_clock_count_64();
+ sTimerCycles += timer_end - timer_start;
+ sTimerCalls++;
+#endif
}
@@ -297,11 +313,12 @@ public:
static const NamedTimer* getTimerByName(const std::string& name);
public:
- static bool sPauseHistory;
- static bool sResetHistory;
+ static bool sPauseHistory;
+ static bool sResetHistory;
+ static U64 sTimerCycles;
+ static U32 sTimerCalls;
private:
- typedef std::vector<LLFastTimer*> timer_stack_t;
static LLFastTimer* sCurTimer;
static S32 sCurFrameIndex;
static S32 sLastFrameIndex;
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index f7fd2dbdfe..d7a692ec9b 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2717,7 +2717,7 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
}
params.from_xui = true;
- setupParams(params, parent);
+ applyXUILayout(params, parent);
initFromParams(params);
initFloater(params);
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 5e15fa3919..1aaba88c49 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -247,7 +247,7 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
}
p.from_xui = true;
- setupParams(p, parent);
+ applyXUILayout(p, parent);
LLLayoutStack* layout_stackp = LLUICtrlFactory::create<LLLayoutStack>(p);
if (parent && layout_stackp)
@@ -414,6 +414,16 @@ void LLLayoutStack::updatePanelAutoResize(const std::string& panel_name, BOOL au
}
}
+void LLLayoutStack::setPanelUserResize(const std::string& panel_name, BOOL user_resize)
+{
+ LayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+
+ if (panel)
+ {
+ panel->mUserResize = user_resize;
+ }
+}
+
bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp)
{
LayoutPanel* panel = findEmbeddedPanelByName(panel_name);
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index c1af428674..cde383b047 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -80,6 +80,7 @@ public:
S32 getNumPanels() { return mPanels.size(); }
void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize);
+ void setPanelUserResize(const std::string& panel_name, BOOL user_resize);
/**
* Gets minimal width and/or height of the specified by name panel.
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index 1891bca36c..aea7c5f87c 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -50,6 +50,12 @@ const F32 FLOAT_THRESHOLD = 0.00001f;
S32 LLMultiSlider::mNameCounter = 0;
+LLMultiSlider::SliderParams::SliderParams()
+: name("name"),
+ value("value", 0.f)
+{
+}
+
LLMultiSlider::Params::Params()
: max_sliders("max_sliders", 1),
allow_overlap("allow_overlap", false),
@@ -63,7 +69,8 @@ LLMultiSlider::Params::Params()
triangle_color("triangle_color"),
mouse_down_callback("mouse_down_callback"),
mouse_up_callback("mouse_up_callback"),
- thumb_width("thumb_width")
+ thumb_width("thumb_width"),
+ sliders("slider")
{
name = "multi_slider_bar";
mouse_opaque(true);
@@ -99,6 +106,20 @@ LLMultiSlider::LLMultiSlider(const LLMultiSlider::Params& p)
{
setMouseUpCallback(initCommitCallback(p.mouse_up_callback));
}
+
+ for (LLInitParam::ParamIterator<SliderParams>::const_iterator it = p.sliders().begin();
+ it != p.sliders().end();
+ ++it)
+ {
+ if (it->name.isProvided())
+ {
+ addSlider(it->value, it->name);
+ }
+ else
+ {
+ addSlider(it->value);
+ }
+ }
}
LLMultiSlider::~LLMultiSlider()
@@ -230,6 +251,30 @@ const std::string& LLMultiSlider::addSlider(F32 val)
return mCurSlider;
}
+void LLMultiSlider::addSlider(F32 val, const std::string& name)
+{
+ F32 initVal = val;
+
+ if(mValue.size() >= mMaxNumSliders) {
+ return;
+ }
+
+ bool foundOne = findUnusedValue(initVal);
+ if(!foundOne) {
+ return;
+ }
+
+ // add a new thumb rect
+ mThumbRects[name] = LLRect( 0, getRect().getHeight(), mThumbWidth, 0 );
+
+ // add the value and set the current slider to this one
+ mValue.insert(name, initVal);
+ mCurSlider = name;
+
+ // move the slider
+ setSliderValue(mCurSlider, initVal, TRUE);
+}
+
bool LLMultiSlider::findUnusedValue(F32& initVal)
{
bool firstTry = true;
@@ -572,7 +617,6 @@ void LLMultiSlider::draw()
LLF32UICtrl::draw();
}
-
boost::signals2::connection LLMultiSlider::setMouseDownCallback( const commit_signal_t::slot_type& cb )
{
if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t();
diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h
index f8e43a0470..88576da85b 100644
--- a/indra/llui/llmultislider.h
+++ b/indra/llui/llmultislider.h
@@ -41,6 +41,13 @@ class LLUICtrlFactory;
class LLMultiSlider : public LLF32UICtrl
{
public:
+ struct SliderParams : public LLInitParam::Block<SliderParams>
+ {
+ Optional<std::string> name;
+ Mandatory<F32> value;
+ SliderParams();
+ };
+
struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params>
{
Optional<S32> max_sliders;
@@ -60,6 +67,7 @@ public:
mouse_up_callback;
Optional<S32> thumb_width;
+ Multiple<SliderParams> sliders;
Params();
};
@@ -68,13 +76,13 @@ protected:
friend class LLUICtrlFactory;
public:
virtual ~LLMultiSlider();
- void setSliderValue(const std::string& name, F32 value, BOOL from_event = FALSE);
- F32 getSliderValue(const std::string& name) const;
+ void setSliderValue(const std::string& name, F32 value, BOOL from_event = FALSE);
+ F32 getSliderValue(const std::string& name) const;
- const std::string& getCurSlider() const { return mCurSlider; }
- F32 getCurSliderValue() const { return getSliderValue(mCurSlider); }
- void setCurSlider(const std::string& name);
- void setCurSliderValue(F32 val, BOOL from_event = false) { setSliderValue(mCurSlider, val, from_event); }
+ const std::string& getCurSlider() const { return mCurSlider; }
+ F32 getCurSliderValue() const { return getSliderValue(mCurSlider); }
+ void setCurSlider(const std::string& name);
+ void setCurSliderValue(F32 val, BOOL from_event = false) { setSliderValue(mCurSlider, val, from_event); }
/*virtual*/ void setValue(const LLSD& value);
/*virtual*/ LLSD getValue() const { return mValue; }
@@ -82,12 +90,13 @@ public:
boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );
boost::signals2::connection setMouseUpCallback( const commit_signal_t::slot_type& cb );
- bool findUnusedValue(F32& initVal);
+ bool findUnusedValue(F32& initVal);
const std::string& addSlider();
const std::string& addSlider(F32 val);
- void deleteSlider(const std::string& name);
- void deleteCurSlider() { deleteSlider(mCurSlider); }
- void clear();
+ void addSlider(F32 val, const std::string& name);
+ void deleteSlider(const std::string& name);
+ void deleteCurSlider() { deleteSlider(mCurSlider); }
+ void clear();
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
@@ -109,7 +118,8 @@ protected:
LLRect mDragStartThumbRect;
S32 mThumbWidth;
- std::map<std::string, LLRect> mThumbRects;
+ std::map<std::string, LLRect>
+ mThumbRects;
LLUIColor mTrackColor;
LLUIColor mThumbOutlineColor;
LLUIColor mThumbCenterColor;
diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp
index 7323323d8c..f4434a0f78 100644
--- a/indra/llui/llmultisliderctrl.cpp
+++ b/indra/llui/llmultisliderctrl.cpp
@@ -65,7 +65,8 @@ LLMultiSliderCtrl::Params::Params()
text_color("text_color"),
text_disabled_color("text_disabled_color"),
mouse_down_callback("mouse_down_callback"),
- mouse_up_callback("mouse_up_callback")
+ mouse_up_callback("mouse_up_callback"),
+ sliders("slider")
{
mouse_opaque = true;
}
@@ -161,6 +162,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p)
S32 slider_left = label_width ? label_width + multi_sliderctrl_spacing : 0;
LLRect slider_rect( slider_left, top, slider_right, bottom );
LLMultiSlider::Params params;
+ params.sliders = p.sliders;
params.rect(slider_rect);
params.commit_callback.function( LLMultiSliderCtrl::onSliderCommit );
params.mouse_down_callback( p.mouse_down_callback );
diff --git a/indra/llui/llmultisliderctrl.h b/indra/llui/llmultisliderctrl.h
index 16d07541f2..e8366d09c2 100644
--- a/indra/llui/llmultisliderctrl.h
+++ b/indra/llui/llmultisliderctrl.h
@@ -69,6 +69,8 @@ public:
Optional<CommitCallbackParam> mouse_down_callback,
mouse_up_callback;
+ Multiple<LLMultiSlider::SliderParams> sliders;
+
Params();
};
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 738a96f730..db32882438 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -452,7 +452,7 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
parseFollowsFlags(p);
setToolTip(p.tool_tip());
- setSaveToXML(p.from_xui);
+ setFromXUI(p.from_xui);
mHoverCursor = getCursorFromString(p.hover_cursor);
@@ -542,7 +542,7 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu
}
params.from_xui = true;
- setupParams(params, parent);
+ applyXUILayout(params, parent);
{
LLFastTimer timer(FTM_PANEL_CONSTRUCTION);
initFromParams(params);
diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp
index 997b9c13f8..4087b484aa 100644
--- a/indra/llui/llradiogroup.cpp
+++ b/indra/llui/llradiogroup.cpp
@@ -116,6 +116,10 @@ void LLRadioGroup::initFromParams(const Params& p)
item_params.font.setIfNotProvided(mFont); // apply radio group font by default
item_params.commit_callback.function = boost::bind(&LLRadioGroup::onClickButton, this, _1);
item_params.from_xui = p.from_xui;
+ if (p.from_xui)
+ {
+ applyXUILayout(item_params, this);
+ }
LLRadioCtrl* item = LLUICtrlFactory::create<LLRadioCtrl>(item_params, this);
mRadioButtons.push_back(item);
diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp
index 544352176a..7238d903a3 100644
--- a/indra/llui/llscrolllistcell.cpp
+++ b/indra/llui/llscrolllistcell.cpp
@@ -353,7 +353,7 @@ LLScrollListCheck::LLScrollListCheck(const LLScrollListCell::Params& p)
{
LLCheckBoxCtrl::Params checkbox_p;
checkbox_p.name("checkbox");
- checkbox_p.rect.left(0).bottom(0).width(p.width).height(p.width);
+ checkbox_p.rect = LLRect(0, p.width, p.width, 0);
checkbox_p.enabled(p.enabled);
checkbox_p.initial_value(p.value());
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index d6d46654d5..20a1ab7af3 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -75,10 +75,8 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
static LLUICachedControl<S32> spinctrl_spacing ("UISpinctrlSpacing", 0);
static LLUICachedControl<S32> spinctrl_btn_width ("UISpinctrlBtnWidth", 0);
static LLUICachedControl<S32> spinctrl_btn_height ("UISpinctrlBtnHeight", 0);
- S32 top = getRect().getHeight();
- S32 bottom = top - 2 * spinctrl_btn_height;
- S32 centered_top = top;
- S32 centered_bottom = bottom;
+ S32 centered_top = getRect().getHeight();
+ S32 centered_bottom = getRect().getHeight() - 2 * spinctrl_btn_height;
S32 btn_left = 0;
// reserve space for spinner
S32 label_width = llclamp(p.label_width(), 0, llmax(0, getRect().getWidth() - 40));
@@ -105,25 +103,15 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
// Spin buttons
LLButton::Params up_button_params(p.up_button);
- up_button_params.rect
- .left(btn_left)
- .top(top)
- .right(btn_right)
- .height(spinctrl_btn_height);
+ up_button_params.rect = LLRect(btn_left, getRect().getHeight(), btn_right, getRect().getHeight() - spinctrl_btn_height);
up_button_params.click_callback.function(boost::bind(&LLSpinCtrl::onUpBtn, this, _2));
up_button_params.mouse_held_callback.function(boost::bind(&LLSpinCtrl::onUpBtn, this, _2));
mUpBtn = LLUICtrlFactory::create<LLButton>(up_button_params);
addChild(mUpBtn);
- LLRect down_rect( btn_left, top - spinctrl_btn_height, btn_right, bottom );
-
LLButton::Params down_button_params(p.down_button);
- down_button_params.rect
- .left(btn_left)
- .right(btn_right)
- .bottom(bottom)
- .height(spinctrl_btn_height);
+ down_button_params.rect = LLRect(btn_left, getRect().getHeight() - spinctrl_btn_height, btn_right, getRect().getHeight() - 2 * spinctrl_btn_height);
down_button_params.click_callback.function(boost::bind(&LLSpinCtrl::onDownBtn, this, _2));
down_button_params.mouse_held_callback.function(boost::bind(&LLSpinCtrl::onDownBtn, this, _2));
mDownBtn = LLUICtrlFactory::create<LLButton>(down_button_params);
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 83e2e3db50..327dd01612 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -266,8 +266,6 @@ bool LLTabContainer::addChild(LLView* view, S32 tab_group)
if (panelp)
{
- panelp->setSaveToXML(TRUE);
-
addTabPanel(TabPanelParams().panel(panelp).label(panelp->getLabel()).is_placeholder(dynamic_cast<LLPlaceHolderPanel*>(view) != NULL));
return true;
}
@@ -1019,12 +1017,10 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
{
if (textbox)
{
- textbox->setSaveToXML(false);
addChild( textbox, 0 );
}
if (btn)
{
- btn->setSaveToXML(false);
addChild( btn, 0 );
}
}
@@ -1747,24 +1743,20 @@ void LLTabContainer::initButtons()
}
}
- mPrevArrowBtn->setSaveToXML(false);
mPrevArrowBtn->setTabStop(FALSE);
addChild(mPrevArrowBtn);
- mNextArrowBtn->setSaveToXML(false);
mNextArrowBtn->setTabStop(FALSE);
addChild(mNextArrowBtn);
if (mJumpPrevArrowBtn)
{
- mJumpPrevArrowBtn->setSaveToXML(false);
mJumpPrevArrowBtn->setTabStop(FALSE);
addChild(mJumpPrevArrowBtn);
}
if (mJumpNextArrowBtn)
{
- mJumpNextArrowBtn->setSaveToXML(false);
mJumpNextArrowBtn->setTabStop(FALSE);
addChild(mJumpNextArrowBtn);
}
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index cb0907a771..e54032ac5e 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -962,7 +962,10 @@ void LLTextBase::draw()
reflow();
// then update scroll position, as cursor may have moved
- updateScrollFromCursor();
+ if (!mReadOnly)
+ {
+ updateScrollFromCursor();
+ }
LLRect doc_rect;
if (mScroller)
@@ -1932,11 +1935,19 @@ void LLTextBase::endOfLine()
void LLTextBase::startOfDoc()
{
setCursorPos(0);
+ if (mScroller)
+ {
+ mScroller->goToTop();
+ }
}
void LLTextBase::endOfDoc()
{
setCursorPos(getLength());
+ if (mScroller)
+ {
+ mScroller->goToBottom();
+ }
}
void LLTextBase::changePage( S32 delta )
@@ -2001,6 +2012,16 @@ void LLTextBase::changeLine( S32 delta )
setCursorPos(new_cursor_pos, true);
}
+bool LLTextBase::scrolledToStart()
+{
+ return mScroller->isAtTop();
+}
+
+bool LLTextBase::scrolledToEnd()
+{
+ return mScroller->isAtBottom();
+}
+
bool LLTextBase::setCursor(S32 row, S32 column)
{
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index a1f8ba39ae..c91578b637 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -180,6 +180,8 @@ public:
void changePage( S32 delta );
void changeLine( S32 delta );
+ bool scrolledToStart();
+ bool scrolledToEnd();
const LLFontGL* getDefaultFont() const { return mDefaultFont; }
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 1ea6b66a93..d0ed3b6fca 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -1915,6 +1915,7 @@ namespace LLInitParam
green = color.mV[VGREEN];
blue = color.mV[VBLUE];
alpha = color.mV[VALPHA];
+ control.set("", false);
}
void TypeValues<LLUIColor>::declareValues()
@@ -2046,12 +2047,16 @@ namespace LLInitParam
void TypedParam<LLRect>::setBlockFromValue()
{
- left = mData.mValue.mLeft;
- right = mData.mValue.mRight;
- bottom = mData.mValue.mBottom;
- top = mData.mValue.mTop;
- width.setProvided(false);
- height.setProvided(false);
+ // because of the ambiguity in specifying a rect by position and/or dimensions
+ // we clear the "provided" flag so that values from xui/etc have priority
+ // over those calculated from the rect object
+
+ left.set(mData.mValue.mLeft, false);
+ right.set(mData.mValue.mRight, false);
+ bottom.set(mData.mValue.mBottom, false);
+ top.set(mData.mValue.mTop, false);
+ width.set(mData.mValue.getWidth(), false);
+ height.set(mData.mValue.getHeight(), false);
}
TypedParam<LLCoordGL>::TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index 6788f29ba9..b1fa6add67 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -184,8 +184,6 @@ public:
{
T* widget = NULL;
- T::setupParams(params, parent);
-
if (!params.validateBlock())
{
llwarns << getInstance()->getCurFileName() << ": Invalid parameter block for " << typeid(T).name() << llendl;
@@ -310,6 +308,7 @@ fail:
// Apply layout transformations, usually munging rect
params.from_xui = true;
+ T::applyXUILayout(params, parent);
T* widget = createWidget<T>(params, parent);
typedef typename T::child_registry_t registry_t;
diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp
index 1dfc281d93..966d919dc7 100644
--- a/indra/llui/lluiimage.cpp
+++ b/indra/llui/lluiimage.cpp
@@ -168,6 +168,7 @@ namespace LLInitParam
if (name() == "none")
{
mData.mValue = NULL;
+ return;
}
LLUIImage* imagep = LLUI::getUIImage(name());
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 95dc2ce027..983f0a2d49 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -80,7 +80,7 @@ std::string LLUrlEntryBase::escapeUrl(const std::string &url) const
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789"
- "-._~!$?&()*+,@:;=/%";
+ "-._~!$?&()*+,@:;=/%#";
std::sort(no_escape_chars.begin(), no_escape_chars.end());
initialized = true;
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index afcff0d409..ad5c0911f8 100644
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -223,3 +223,23 @@ bool LLUrlRegistry::hasUrl(const LLWString &text)
LLUrlMatch match;
return findUrl(text, match);
}
+
+bool LLUrlRegistry::isUrl(const std::string &text)
+{
+ LLUrlMatch match;
+ if (findUrl(text, match))
+ {
+ return (match.getStart() == 0 && match.getEnd() >= text.size()-1);
+ }
+ return false;
+}
+
+bool LLUrlRegistry::isUrl(const LLWString &text)
+{
+ LLUrlMatch match;
+ if (findUrl(text, match))
+ {
+ return (match.getStart() == 0 && match.getEnd() >= text.size()-1);
+ }
+ return false;
+}
diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h
index d7800d8cfc..399ee0a988 100644
--- a/indra/llui/llurlregistry.h
+++ b/indra/llui/llurlregistry.h
@@ -85,6 +85,10 @@ public:
bool hasUrl(const std::string &text);
bool hasUrl(const LLWString &text);
+ // return true if the given string is a URL that findUrl would match
+ bool isUrl(const std::string &text);
+ bool isUrl(const LLWString &text);
+
private:
LLUrlRegistry();
friend class LLSingleton<LLUrlRegistry>;
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index a8d8626e49..f1b08c380b 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -126,7 +126,7 @@ LLView::LLView(const LLView::Params& p)
: mName(p.name),
mParentView(NULL),
mReshapeFlags(FOLLOWS_NONE),
- mSaveToXML(p.from_xui),
+ mFromXUI(p.from_xui),
mIsFocusRoot(FALSE),
mLastVisible(FALSE),
mNextInsertionOrdinal(0),
@@ -2479,7 +2479,7 @@ static bool get_last_child_rect(LLView* parent, LLRect *rect)
for (;itor != parent->getChildList()->end(); ++itor)
{
LLView *last_view = (*itor);
- if (last_view->getSaveToXML())
+ if (last_view->getFromXUI())
{
*rect = last_view->getRect();
return true;
@@ -2489,7 +2489,7 @@ static bool get_last_child_rect(LLView* parent, LLRect *rect)
}
//static
-void LLView::setupParams(LLView::Params& p, LLView* parent)
+void LLView::applyXUILayout(LLView::Params& p, LLView* parent)
{
const S32 VPAD = 4;
const S32 MIN_WIDGET_HEIGHT = 10;
@@ -2509,7 +2509,7 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)
LLRect last_rect = parent->getLocalRect();
bool layout_topleft = (p.layout() == "topleft");
- if (layout_topleft && p.from_xui)
+ if (layout_topleft)
{
//invert top to bottom
if (p.rect.top.isProvided()) p.rect.top = parent_rect.getHeight() - p.rect.top;
@@ -2535,10 +2535,10 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)
p.rect.right.setProvided(false); // recalculate the right
}
}
- else if (p.from_xui) // only do negative coordinate magic for XUI
+ else
{
- if (p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth();
- if (p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth();
+ if (p.rect.left.isProvided() && p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth();
+ if (p.rect.right.isProvided() && p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth();
}
if (p.center_vert)
{
@@ -2556,15 +2556,15 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)
p.rect.top.setProvided(false); // recalculate the top
}
}
- else if (p.from_xui)
+ else
{
- if (p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight();
- if (p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight();
+ if (p.rect.bottom.isProvided() && p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight();
+ if (p.rect.top.isProvided() && p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight();
}
// DEPRECATE: automatically fall back to height of MIN_WIDGET_HEIGHT pixels
- if (!p.rect.height.isProvided() && !p.rect.top.isProvided())
+ if (!p.rect.height.isProvided() && !p.rect.top.isProvided() && p.rect.height == 0)
{
p.rect.height = MIN_WIDGET_HEIGHT;
}
@@ -2663,7 +2663,7 @@ static void convert_to_relative_layout(LLView::Params& p, LLView* parent)
// Use setupParams to get the final widget rectangle
// according to our wacky layout rules.
LLView::Params final = p;
- LLView::setupParams(final, parent);
+ LLView::applyXUILayout(final, parent);
// Must actually extract the rectangle to get consistent
// right = left+width, top = bottom+height
LLRect final_rect = final.rect;
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index f8460f5361..c4d7313743 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -395,8 +395,8 @@ public:
void parseFollowsFlags(const LLView::Params& params);
// Some widgets, like close box buttons, don't need to be saved
- BOOL getSaveToXML() const { return mSaveToXML; }
- void setSaveToXML(BOOL b) { mSaveToXML = b; }
+ BOOL getFromXUI() const { return mFromXUI; }
+ void setFromXUI(BOOL b) { mFromXUI = b; }
typedef enum e_hit_test_type
{
@@ -498,7 +498,7 @@ public:
// Set up params after XML load before calling new(),
// usually to adjust layout.
- static void setupParams(Params& p, LLView* parent);
+ static void applyXUILayout(Params& p, LLView* parent);
// For re-export of floaters and panels, convert the coordinate system
// to be top-left based.
@@ -573,7 +573,7 @@ private:
LLUIString mToolTipMsg; // isNull() is true if none.
U8 mSoundFlags;
- BOOL mSaveToXML;
+ BOOL mFromXUI;
BOOL mIsFocusRoot;
BOOL mUseBoundingRect; // hit test against bounding rectangle that includes all child elements
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 9f7b782320..f3d399c616 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1446,6 +1446,10 @@ if (WINDOWS)
${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qmng4.dll
${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qsvg4.dll
${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qtiff4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qcncodecs4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qjpcodecs4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qkrcodecs4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qtwcodecs4.dll
${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll
${ARCH_PREBUILT_DIRS_DEBUG}/qtcored4.dll
${ARCH_PREBUILT_DIRS_DEBUG}/qtguid4.dll
@@ -1460,6 +1464,10 @@ if (WINDOWS)
${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qmngd4.dll
${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qsvgd4.dll
${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qtiffd4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qcncodecsd4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qjpcodecsd4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qkrcodecsd4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qtwcodecsd4.dll
SLPlugin
media_plugin_quicktime
media_plugin_webkit
diff --git a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
index 28908a311d..0fad5b4b50 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
@@ -10,7 +10,6 @@
uniform sampler2DRect depthMap;
uniform sampler2DRect normalMap;
uniform sampler2DRect lightMap;
-uniform sampler2DRect edgeMap;
uniform float dist_factor;
uniform float blur_size;
@@ -46,53 +45,36 @@ void main()
dlt /= max(-pos.z*dist_factor, 1.0);
- vec2 defined_weight = kern[0].xy; // special case the kern[0] (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
+ vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
vec4 col = defined_weight.xyxx * ccol;
-
- float center_e = 1.0 - (texture2DRect(edgeMap, vary_fragcoord.xy).a+
- texture2DRect(edgeMap, vary_fragcoord.xy+dlt*0.333).a+
- texture2DRect(edgeMap, vary_fragcoord.xy-dlt*0.333).a);
- float e = center_e;
for (int i = 1; i < 4; i++)
{
vec2 tc = vary_fragcoord.xy + kern[i].z*dlt;
-
- e = max(e, 0.0);
-
- vec2 wght = kern[i].xy*e;
-
- col += texture2DRect(lightMap, tc)*wght.xyxx;
- defined_weight += wght;
-
- e *= e;
- e -= texture2DRect(edgeMap, tc.xy).a+
- texture2DRect(edgeMap, tc.xy+dlt*0.333).a+
- texture2DRect(edgeMap, tc.xy-dlt*0.333).a;
+ vec3 samppos = getPosition(tc).xyz;
+ float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
+ if (d*d <= 0.003)
+ {
+ col += texture2DRect(lightMap, tc)*kern[i].xyxx;
+ defined_weight += kern[i].xy;
+ }
}
-
- e = center_e;
for (int i = 1; i < 4; i++)
{
vec2 tc = vary_fragcoord.xy - kern[i].z*dlt;
-
- e = max(e, 0.0);
-
- vec2 wght = kern[i].xy*e;
-
- col += texture2DRect(lightMap, tc)*wght.xyxx;
- defined_weight += wght;
-
- e *= e;
- e -= texture2DRect(edgeMap, tc.xy).a+
- texture2DRect(edgeMap, tc.xy+dlt*0.333).a+
- texture2DRect(edgeMap, tc.xy-dlt*0.333).a;
+ vec3 samppos = getPosition(tc).xyz;
+ float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
+ if (d*d <= 0.003)
+ {
+ col += texture2DRect(lightMap, tc)*kern[i].xyxx;
+ defined_weight += kern[i].xy;
+ }
}
+
col /= defined_weight.xyxx;
gl_FragColor = col;
-
- //gl_FragColor = ccol;
}
+
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index d20c23df80..4029bf95a0 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,4 +1,4 @@
-version 20
+version 21
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -28,6 +28,7 @@ RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarVP 1 1
RenderCubeMap 1 1
+RenderDelayVBUpdate 1 0
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderFogRatio 1 4.0
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 57d712ede7..61a8e51c50 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -1,4 +1,4 @@
-version 20
+version 21
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -28,6 +28,7 @@ RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
RenderAvatarVP 1 1
RenderCubeMap 1 1
+RenderDelayVBUpdate 1 0
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderFogRatio 1 4.0
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 15974c0691..12d47a904c 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,4 @@
-version 20
+version 21
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -28,6 +28,7 @@ RenderAvatarCloth 0 0
RenderAvatarLODFactor 1 1.0
RenderAvatarVP 1 0
RenderCubeMap 1 1
+RenderDelayVBUpdate 1 0
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderFogRatio 1 4.0
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 454e547155..79ba3fb51d 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -871,24 +871,31 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
if (mInitialWearablesUpdateReceived)
return;
mInitialWearablesUpdateReceived = true;
+
+ // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account)
+ // then auto-populate outfits from the library into the My Outfits folder.
+ if (LLInventoryModel::getIsFirstTimeInViewer2())
+ {
+ gAgentWearables.populateMyOutfitsFolder();
+ }
LLUUID agent_id;
gMessageSystem->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
- const BOOL is_first_time_in_viewer2_0 = (gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, FALSE) == LLUUID::null);
-
-
LLVOAvatar* avatar = gAgent.getAvatarObject();
if (avatar && (agent_id == avatar->getID()))
{
gMessageSystem->getU32Fast(_PREHASH_AgentData, _PREHASH_SerialNum, gAgentQueryManager.mUpdateSerialNum);
+ const S32 NUM_BODY_PARTS = 4;
S32 num_wearables = gMessageSystem->getNumberOfBlocksFast(_PREHASH_WearableData);
- if (num_wearables < 4)
+ if (num_wearables < NUM_BODY_PARTS)
{
// Transitional state. Avatars should always have at least their body parts (hair, eyes, shape and skin).
- // The fact that they don't have any here (only a dummy is sent) implies that this account existed
- // before we had wearables, or that the database has gotten messed up.
+ // The fact that they don't have any here (only a dummy is sent) implies that either:
+ // 1. This account existed before we had wearables
+ // 2. The database has gotten messed up
+ // 3. This is the account's first login (i.e. the wearables haven't been generated yet).
return;
}
@@ -957,8 +964,6 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
gInventory.addObserver(outfit);
}
- if (is_first_time_in_viewer2_0)
- gAgentWearables.populateMyOutfitsFolder();
}
}
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index c5a1ffdcb3..2a8c55e5db 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -243,7 +243,6 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)
return;
}
- // start the call once the session has fully initialized
gIMMgr->autoStartCallOnStartup(session_id);
make_ui_sound("UISndStartIM");
@@ -333,6 +332,54 @@ void LLAvatarActions::pay(const LLUUID& id)
}
}
+// static
+void LLAvatarActions::kick(const LLUUID& id)
+{
+ LLSD payload;
+ payload["avatar_id"] = id;
+ LLNotifications::instance().add("KickUser", LLSD(), payload, handleKick);
+}
+
+// static
+void LLAvatarActions::freeze(const LLUUID& id)
+{
+ LLSD payload;
+ payload["avatar_id"] = id;
+ LLNotifications::instance().add("FreezeUser", LLSD(), payload, handleFreeze);
+}
+
+// static
+void LLAvatarActions::unfreeze(const LLUUID& id)
+{
+ LLSD payload;
+ payload["avatar_id"] = id;
+ LLNotifications::instance().add("UnFreezeUser", LLSD(), payload, handleUnfreeze);
+}
+
+//static
+void LLAvatarActions::csr(const LLUUID& id, std::string name)
+{
+ if (name.empty()) return;
+
+ std::string url = "http://csr.lindenlab.com/agent/";
+
+ // slow and stupid, but it's late
+ S32 len = name.length();
+ for (S32 i = 0; i < len; i++)
+ {
+ if (name[i] == ' ')
+ {
+ url += "%20";
+ }
+ else
+ {
+ url += name[i];
+ }
+ }
+
+ LLWeb::loadURL(url);
+}
+
//static
void LLAvatarActions::share(const LLUUID& id)
{
@@ -457,6 +504,67 @@ bool LLAvatarActions::callbackAddFriendWithMessage(const LLSD& notification, con
}
// static
+bool LLAvatarActions::handleKick(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+
+ if (option == 0)
+ {
+ LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+ 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, avatar_id );
+ msg->addU32("KickFlags", KICK_FLAGS_DEFAULT );
+ msg->addStringFast(_PREHASH_Reason, response["message"].asString() );
+ gAgent.sendReliableMessage();
+ }
+ return false;
+}
+bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+
+ if (option == 0)
+ {
+ LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+ 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, avatar_id );
+ msg->addU32("KickFlags", KICK_FLAGS_FREEZE );
+ msg->addStringFast(_PREHASH_Reason, response["message"].asString() );
+ gAgent.sendReliableMessage();
+ }
+ return false;
+}
+bool LLAvatarActions::handleUnfreeze(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+ std::string text = response["message"].asString();
+ if (option == 0)
+ {
+ LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+ 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, avatar_id );
+ msg->addU32("KickFlags", KICK_FLAGS_UNFREEZE );
+ msg->addStringFast(_PREHASH_Reason, text );
+ gAgent.sendReliableMessage();
+ }
+ return false;
+}
+// static
bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 01c18d4228..a4504ae679 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -138,11 +138,35 @@ public:
*/
static void inviteToGroup(const LLUUID& id);
+ /**
+ * Kick avatar off grid
+ */
+ static void kick(const LLUUID& id);
+
+ /**
+ * Freeze avatar
+ */
+ static void freeze(const LLUUID& id);
+
+ /**
+ * Unfreeze avatar
+ */
+ static void unfreeze(const LLUUID& id);
+
+ /**
+ * Open csr page for avatar
+ */
+ static void csr(const LLUUID& id, std::string name);
+
+
private:
static bool callbackAddFriend(const LLSD& notification, const LLSD& response);
static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
static bool handleRemove(const LLSD& notification, const LLSD& response);
static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id);
+ static bool handleKick(const LLSD& notification, const LLSD& response);
+ static bool handleFreeze(const LLSD& notification, const LLSD& response);
+ static bool handleUnfreeze(const LLSD& notification, const LLSD& response);
static void callback_invite_to_group(LLUUID group_id, LLUUID id);
// Just request friendship, no dialog.
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index fe4f0c5525..c222ced98f 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -79,6 +79,28 @@ static void* create_non_avatar_caller(void*)
return new LLNonAvatarCaller;
}
+LLCallFloater::LLAvatarListItemRemoveTimer::LLAvatarListItemRemoveTimer(callback_t remove_cb, F32 period, const LLUUID& speaker_id)
+: LLEventTimer(period)
+, mRemoveCallback(remove_cb)
+, mSpeakerId(speaker_id)
+{
+}
+
+BOOL LLCallFloater::LLAvatarListItemRemoveTimer::tick()
+{
+ if (mRemoveCallback)
+ {
+ mRemoveCallback(mSpeakerId);
+ }
+ return TRUE;
+}
+
+
+LLCallFloater::Params::Params()
+: voice_left_remove_delay("voice_left_remove_delay", 10)
+{
+}
+
LLCallFloater::LLCallFloater(const LLSD& key)
: LLDockableFloater(NULL, false, key)
, mSpeakerManager(NULL)
@@ -90,6 +112,7 @@ LLCallFloater::LLCallFloater(const LLSD& key)
, mSpeakingIndicator(NULL)
, mIsModeratorMutedVoice(false)
, mInitParticipantsVoiceState(false)
+, mVoiceLeftRemoveDelay(10) // TODO: mantipov: make xml driven
{
mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL);
LLVoiceClient::getInstance()->addObserver(this);
@@ -98,6 +121,8 @@ LLCallFloater::LLCallFloater(const LLSD& key)
LLCallFloater::~LLCallFloater()
{
+ resetVoiceRemoveTimers();
+
delete mPaticipants;
mPaticipants = NULL;
@@ -149,7 +174,11 @@ void LLCallFloater::draw()
// It should be done only when she joins or leaves voice chat.
// But seems that LLVoiceClientParticipantObserver is not enough to satisfy this requirement.
// *TODO: mantipov: remove from draw()
- onChange();
+
+ // NOTE: it looks like calling onChange() here is not necessary,
+ // but sometime it is not called properly from the observable object.
+ // Seems this is a problem somewhere in Voice Client (LLVoiceClient::participantAddedEvent)
+// onChange();
bool is_moderator_muted = gVoiceClient->getIsModeratorMuted(gAgentID);
@@ -262,12 +291,28 @@ void LLCallFloater::updateSession()
if (show_me)
{
setVisible(true);
+ // Workaround(EM): Set current call dialog to front most because
+ // connect/leaving popups should appear on top of VCP.
+ // See bug EXT-3628.
+ LLOutgoingCallDialog* instance =
+ LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
+ if(instance && instance->getVisible())
+ {
+ instance->setFrontmost();
+ }
}
}
}
void LLCallFloater::refreshPartisipantList()
{
+ // lets forget states from the previous session
+ // for timers...
+ resetVoiceRemoveTimers();
+
+ // ...and for speaker state
+ mSpeakerStateMap.clear();
+
delete mPaticipants;
mPaticipants = NULL;
mAvatarList->clear();
@@ -482,28 +527,10 @@ void LLCallFloater::updateParticipantsVoiceState()
std::vector<LLUUID> speakers_list;
// Get a list of participants from VoiceClient
- LLVoiceClient::participantMap *map = gVoiceClient->getParticipantList();
- if (!map) return;
-
- for (LLVoiceClient::participantMap::const_iterator iter = map->begin();
- iter != map->end(); ++iter)
- {
- LLUUID id = (*iter).second->mAvatarID;
-// if ( id != gAgent.getID() )
- {
- speakers_list.push_back(id);
-/*
- LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*> (mAvatarList->getItemByValue(id));
- if (item)
- {
- setState(item, STATE_JOINED);
- }
-*/
-
- }
- }
+ std::vector<LLUUID> speakers_uuids;
+ get_voice_participants_uuids(speakers_uuids);
- // Updating the status for each participant.
+ // Updating the status for each participant already in list.
std::vector<LLPanel*> items;
mAvatarList->getItems(items);
std::vector<LLPanel*>::const_iterator
@@ -518,14 +545,14 @@ void LLCallFloater::updateParticipantsVoiceState()
const LLUUID participant_id = item->getAvatarId();
bool found = false;
- std::vector<LLUUID>::iterator speakers_iter = std::find(speakers_list.begin(), speakers_list.end(), participant_id);
+ std::vector<LLUUID>::iterator speakers_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), participant_id);
lldebugs << "processing speaker: " << item->getAvatarName() << ", " << item->getAvatarId() << llendl;
// If an avatarID assigned to a panel is found in a speakers list
// obtained from VoiceClient we assign the JOINED status to the owner
// of this avatarID.
- if (speakers_iter != speakers_list.end())
+ if (speakers_iter != speakers_uuids.end())
{
setState(item, STATE_JOINED);
@@ -534,15 +561,15 @@ void LLCallFloater::updateParticipantsVoiceState()
continue;
speaker->mHasLeftCurrentCall = FALSE;
- speakers_list.erase(speakers_iter);
+ speakers_uuids.erase(speakers_iter);
found = true;
}
- // If an avatarID is not found in a speakers list from VoiceClient and
- // a panel with this ID has a JOINED status this means that this person
- // HAS LEFT the call.
if (!found)
{
+ // If an avatarID is not found in a speakers list from VoiceClient and
+ // a panel with this ID has a JOINED status this means that this person
+ // HAS LEFT the call.
if ((getState(participant_id) == STATE_JOINED))
{
setState(item, STATE_LEFT);
@@ -553,30 +580,13 @@ void LLCallFloater::updateParticipantsVoiceState()
speaker->mHasLeftCurrentCall = TRUE;
}
+ // If an avatarID is not found in a speakers list from VoiceClient and
+ // a panel with this ID has a LEFT status this means that this person
+ // HAS ENTERED session but it is not in voice chat yet. So, set INVITED status
else if ((getState(participant_id) != STATE_LEFT))
{
setState(item, STATE_INVITED);
}
-
-/*
- // If there is already a started timer for the current panel don't do anything.
- bool no_timer_for_current_panel = true;
- if (mTimersMap.size() > 0)
- {
- timers_map::iterator found_it = mTimersMap.find(participant_id);
- if (found_it != mTimersMap.end())
- {
- no_timer_for_current_panel = false;
- }
- }
-
- if (no_timer_for_current_panel)
- {
- // Starting a timer to remove an avatar row panel after timeout
- // *TODO Make the timeout period adjustable
- mTimersMap.insert(timer_pair(participant_id, new LLAvatarRowRemoveTimer(this->getHandle(), 10, participant_id)));
- }
-*/
}
}
@@ -584,6 +594,19 @@ void LLCallFloater::updateParticipantsVoiceState()
void LLCallFloater::setState(LLAvatarListItem* item, ESpeakerState state)
{
+ // *HACK: mantipov: sometimes such situation is possible while switching to voice channel:
+/*
+ - voice channel is switched to the one user is joining
+ - participant list is initialized with voice states: agent is in voice
+ - than such log messages were found (with agent UUID)
+ - LLVivoxProtocolParser::process_impl: parsing: <Response requestId="22" action="Session.MediaDisconnect.1"><ReturnCode>0</ReturnCode><Results><StatusCode>0</StatusCode><StatusString /></Results><InputXml><Request requestId="22" action="Session.MediaDisconnect.1"><SessionGroupHandle>9</SessionGroupHandle><SessionHandle>12</SessionHandle><Media>Audio</Media></Request></InputXml></Response>
+ - LLVoiceClient::sessionState::removeParticipant: participant "sip:x2pwNkMbpR_mK4rtB_awASA==@bhr.vivox.com" (da9c0d90-c6e9-47f9-8ae2-bb41fdac0048) removed.
+ - and than while updating participants voice states agent is marked as HAS LEFT
+ - next updating of LLVoiceClient state makes agent JOINED
+ So, lets skip HAS LEFT state for agent's avatar
+*/
+ if (STATE_LEFT == state && item->getAvatarId() == gAgentID) return;
+
setState(item->getAvatarId(), state);
LLStyle::Params speaker_style;
@@ -592,18 +615,16 @@ void LLCallFloater::setState(LLAvatarListItem* item, ESpeakerState state)
switch (state)
{
case STATE_INVITED:
-// status_str = "INVITED"; // *TODO: localize
new_desc.setStyle(LLFontGL::NORMAL);
break;
case STATE_JOINED:
-// status_str = "JOINED"; // *TODO: localize
+ removeVoiceRemoveTimer(item->getAvatarId());
new_desc.setStyle(LLFontGL::NORMAL);
break;
case STATE_LEFT:
{
- // status_str = "HAS LEFT CALL"; // *TODO: localize
+ setVoiceRemoveTimer(item->getAvatarId());
new_desc.setStyle(LLFontGL::ITALIC);
-
}
break;
default:
@@ -622,4 +643,70 @@ void LLCallFloater::setState(LLAvatarListItem* item, ESpeakerState state)
}
}
+void LLCallFloater::setVoiceRemoveTimer(const LLUUID& voice_speaker_id)
+{
+
+ // If there is already a started timer for the current panel don't do anything.
+ bool no_timer_for_current_panel = true;
+ if (mVoiceLeftTimersMap.size() > 0)
+ {
+ timers_map::iterator found_it = mVoiceLeftTimersMap.find(voice_speaker_id);
+ if (found_it != mVoiceLeftTimersMap.end())
+ {
+ no_timer_for_current_panel = false;
+ }
+ }
+
+ if (no_timer_for_current_panel)
+ {
+ // Starting a timer to remove an avatar row panel after timeout
+ mVoiceLeftTimersMap.insert(timer_pair(voice_speaker_id,
+ new LLAvatarListItemRemoveTimer(boost::bind(&LLCallFloater::removeVoiceLeftParticipant, this, _1), mVoiceLeftRemoveDelay, voice_speaker_id)));
+ }
+}
+
+void LLCallFloater::removeVoiceLeftParticipant(const LLUUID& voice_speaker_id)
+{
+ if (mVoiceLeftTimersMap.size() > 0)
+ {
+ mVoiceLeftTimersMap.erase(mVoiceLeftTimersMap.find(voice_speaker_id));
+ }
+
+ LLAvatarList::uuid_vector_t& speaker_uuids = mAvatarList->getIDs();
+ LLAvatarList::uuid_vector_t::iterator pos = std::find(speaker_uuids.begin(), speaker_uuids.end(), voice_speaker_id);
+ if(pos != speaker_uuids.end())
+ {
+ speaker_uuids.erase(pos);
+ mAvatarList->setDirty();
+ }
+}
+
+
+void LLCallFloater::resetVoiceRemoveTimers()
+{
+ if (mVoiceLeftTimersMap.size() > 0)
+ {
+ for (timers_map::iterator iter = mVoiceLeftTimersMap.begin();
+ iter != mVoiceLeftTimersMap.end(); ++iter)
+ {
+ delete iter->second;
+ }
+ }
+ mVoiceLeftTimersMap.clear();
+}
+
+void LLCallFloater::removeVoiceRemoveTimer(const LLUUID& voice_speaker_id)
+{
+ // Remove the timer if it has been already started
+ if (mVoiceLeftTimersMap.size() > 0)
+ {
+ timers_map::iterator found_it = mVoiceLeftTimersMap.find(voice_speaker_id);
+ if (found_it != mVoiceLeftTimersMap.end())
+ {
+ delete found_it->second;
+ mVoiceLeftTimersMap.erase(found_it);
+ }
+ }
+}
+
//EOF
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
index 21fba433c6..537c57f671 100644
--- a/indra/newview/llcallfloater.h
+++ b/indra/newview/llcallfloater.h
@@ -57,6 +57,15 @@ class LLSpeakerMgr;
class LLCallFloater : public LLDockableFloater, LLVoiceClientParticipantObserver
{
public:
+ struct Params : public LLInitParam::Block<Params, LLDockableFloater::Params>
+ {
+ Optional<S32> voice_left_remove_delay;
+
+ Params();
+ };
+
+ LOG_CLASS(LLCallFloater);
+
LLCallFloater(const LLSD& key);
~LLCallFloater();
@@ -106,6 +115,13 @@ private:
* Refreshes participant list according to current Voice Channel
*/
void refreshPartisipantList();
+
+ /**
+ * Handles event on avatar list is refreshed after it was marked dirty.
+ *
+ * It sets initial participants voice states (once after the first refreshing)
+ * and updates voice states each time anybody is joined/left voice chat in session.
+ */
void onAvatarListRefreshed();
@@ -114,7 +130,21 @@ private:
void setModeratorMutedVoice(bool moderator_muted);
void updateAgentModeratorState();
+ /**
+ * Sets initial participants voice states in avatar list (Invited, Joined, Has Left).
+ *
+ * @see refreshPartisipantList()
+ * @see onAvatarListRefreshed()
+ * @see mInitParticipantsVoiceState
+ */
void initParticipantsVoiceState();
+
+ /**
+ * Updates participants voice states in avatar list (Invited, Joined, Has Left).
+ *
+ * @see onAvatarListRefreshed()
+ * @see onChanged()
+ */
void updateParticipantsVoiceState();
void setState(LLAvatarListItem* item, ESpeakerState state);
@@ -130,6 +160,34 @@ private:
return mSpeakerStateMap[speaker_id];
}
+
+ /**
+ * Instantiates new LLAvatarListItemRemoveTimer and adds it into the map if it is not already created.
+ *
+ * @param voice_speaker_id LLUUID of Avatar List item to be removed from the list when timer expires.
+ */
+ void setVoiceRemoveTimer(const LLUUID& voice_speaker_id);
+
+ /**
+ * Removes specified by UUID Avatar List item.
+ *
+ * @param voice_speaker_id LLUUID of Avatar List item to be removed from the list.
+ */
+ void removeVoiceLeftParticipant(const LLUUID& voice_speaker_id);
+
+ /**
+ * Deletes all timers from the list to prevent started timers from ticking after destruction
+ * and after switching on another voice channel.
+ */
+ void resetVoiceRemoveTimers();
+
+ /**
+ * Removes specified by UUID timer from the map.
+ *
+ * @param voice_speaker_id LLUUID of Avatar List item whose timer should be removed from the map.
+ */
+ void removeVoiceRemoveTimer(const LLUUID& voice_speaker_id);
+
private:
speaker_state_map_t mSpeakerStateMap;
LLSpeakerMgr* mSpeakerManager;
@@ -141,10 +199,45 @@ private:
LLOutputMonitorCtrl* mSpeakingIndicator;
bool mIsModeratorMutedVoice;
+ /**
+ * Flag indicated that participants voice states should be initialized.
+ *
+ * It is used due to Avatar List has delayed refreshing after it content is changed.
+ * Real initializing is performed when Avatar List is first time refreshed.
+ *
+ * @see onAvatarListRefreshed()
+ * @see initParticipantsVoiceState()
+ */
bool mInitParticipantsVoiceState;
boost::signals2::connection mAvatarListRefreshConnection;
+ /**
+ * class LLAvatarListItemRemoveTimer
+ *
+ * Implements a timer that removes avatar list item of a participant
+ * who has left the call.
+ */
+ class LLAvatarListItemRemoveTimer : public LLEventTimer
+ {
+ public:
+ typedef boost::function<void(const LLUUID&)> callback_t;
+
+ LLAvatarListItemRemoveTimer(callback_t remove_cb, F32 period, const LLUUID& speaker_id);
+ virtual ~LLAvatarListItemRemoveTimer() {};
+
+ virtual BOOL tick();
+
+ private:
+ callback_t mRemoveCallback;
+ LLUUID mSpeakerId;
+ };
+
+ typedef std::pair<LLUUID, LLAvatarListItemRemoveTimer*> timer_pair;
+ typedef std::map<LLUUID, LLAvatarListItemRemoveTimer*> timers_map;
+
+ timers_map mVoiceLeftTimersMap;
+ S32 mVoiceLeftRemoveDelay;
};
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 7a83299dac..b1ddddc4b1 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -44,6 +44,8 @@
#include "llfloaterreg.h"
#include "llmutelist.h"
#include "llstylemap.h"
+#include "lllayoutstack.h"
+#include "llagent.h"
#include "llsidetray.h"//for blocked objects panel
@@ -346,18 +348,23 @@ protected:
LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
-: LLTextEditor(p),
-mMessageHeaderFilename(p.message_header),
-mMessageSeparatorFilename(p.message_separator),
-mLeftTextPad(p.left_text_pad),
-mRightTextPad(p.right_text_pad),
-mLeftWidgetPad(p.left_widget_pad),
-mRightWidgetPad(p.right_widget_pad),
-mTopSeparatorPad(p.top_separator_pad),
-mBottomSeparatorPad(p.bottom_separator_pad),
-mTopHeaderPad(p.top_header_pad),
-mBottomHeaderPad(p.bottom_header_pad)
+: LLUICtrl(p),
+ mMessageHeaderFilename(p.message_header),
+ mMessageSeparatorFilename(p.message_separator),
+ mLeftTextPad(p.left_text_pad),
+ mRightTextPad(p.right_text_pad),
+ mLeftWidgetPad(p.left_widget_pad),
+ mRightWidgetPad(p.right_widget_pad),
+ mTopSeparatorPad(p.top_separator_pad),
+ mBottomSeparatorPad(p.bottom_separator_pad),
+ mTopHeaderPad(p.top_header_pad),
+ mBottomHeaderPad(p.bottom_header_pad)
{
+ LLTextEditor::Params editor_params(p);
+ editor_params.rect = getLocalRect();
+ editor_params.follows.flags = FOLLOWS_ALL;
+ editor_params.enabled = false; // read only
+ mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);
}
LLChatHistory::~LLChatHistory()
@@ -365,6 +372,49 @@ LLChatHistory::~LLChatHistory()
this->clear();
}
+void LLChatHistory::initFromParams(const LLChatHistory::Params& p)
+{
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+ LLRect stack_rect = getLocalRect();
+ stack_rect.mRight -= scrollbar_size;
+ LLLayoutStack::Params layout_p;
+ layout_p.rect = stack_rect;
+ layout_p.follows.flags = FOLLOWS_ALL;
+ layout_p.orientation = "vertical";
+ layout_p.mouse_opaque = false;
+
+ LLLayoutStack* stackp = LLUICtrlFactory::create<LLLayoutStack>(layout_p, this);
+
+ const S32 NEW_TEXT_NOTICE_HEIGHT = 20;
+
+ LLPanel::Params panel_p;
+ panel_p.name = "spacer";
+ panel_p.background_visible = false;
+ panel_p.has_border = false;
+ panel_p.mouse_opaque = false;
+ stackp->addPanel(LLUICtrlFactory::create<LLPanel>(panel_p), 0, 30, true, false, LLLayoutStack::ANIMATE);
+
+ panel_p.name = "new_text_notice_holder";
+ LLRect new_text_notice_rect = getLocalRect();
+ new_text_notice_rect.mTop = new_text_notice_rect.mBottom + NEW_TEXT_NOTICE_HEIGHT;
+ panel_p.rect = new_text_notice_rect;
+ panel_p.background_opaque = true;
+ panel_p.background_visible = true;
+ panel_p.visible = false;
+ mMoreChatPanel = LLUICtrlFactory::create<LLPanel>(panel_p);
+
+ LLTextBox::Params text_p(p.more_chat_text);
+ text_p.rect = mMoreChatPanel->getLocalRect();
+ text_p.follows.flags = FOLLOWS_ALL;
+ text_p.name = "more_chat_text";
+ mMoreChatText = LLUICtrlFactory::create<LLTextBox>(text_p, mMoreChatPanel);
+ mMoreChatText->setClickedCallback(boost::bind(&LLChatHistory::onClickMoreText, this));
+
+ stackp->addPanel(mMoreChatPanel, 0, 0, false, false, LLLayoutStack::ANIMATE);
+}
+
+
/*void LLChatHistory::updateTextRect()
{
static LLUICachedControl<S32> texteditor_border ("UITextEditorBorder", 0);
@@ -393,15 +443,49 @@ LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style
return header;
}
+void LLChatHistory::onClickMoreText()
+{
+ mEditor->endOfDoc();
+}
+
void LLChatHistory::clear()
{
mLastFromName.clear();
- LLTextEditor::clear();
+ mEditor->clear();
mLastFromID = LLUUID::null;
}
void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_chat_history, const LLStyle::Params& input_append_params)
{
+ if (!mEditor->scrolledToEnd() && chat.mFromID != gAgent.getID() && !chat.mFromName.empty())
+ {
+ mUnreadChatSources.insert(chat.mFromName);
+ mMoreChatPanel->setVisible(TRUE);
+ std::string chatters;
+ for (unread_chat_source_t::iterator it = mUnreadChatSources.begin();
+ it != mUnreadChatSources.end();)
+ {
+ chatters += *it;
+ if (++it != mUnreadChatSources.end())
+ {
+ chatters += ",";
+ }
+ }
+ LLStringUtil::format_map_t args;
+ args["SOURCES"] = chatters;
+
+ if (mUnreadChatSources.size() == 1)
+ {
+ mMoreChatText->setValue(LLTrans::getString("unread_chat_single", args));
+ }
+ else
+ {
+ mMoreChatText->setValue(LLTrans::getString("unread_chat_multiple", args));
+ }
+ S32 height = mMoreChatText->getTextPixelHeight() + 5;
+ mMoreChatPanel->reshape(mMoreChatPanel->getRect().getWidth(), height);
+ }
+
LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
LLViewerChat::getChatColor(chat,txt_color);
LLFontGL* fontp = LLViewerChat::getChatFont();
@@ -416,7 +500,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
if (use_plain_text_chat_history)
{
- appendText("[" + chat.mTimeStr + "] ", getText().size() != 0, style_params);
+ mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params);
if (utf8str_trim(chat.mFromName).size() != 0)
{
@@ -426,11 +510,11 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
LLStyle::Params link_params(style_params);
link_params.fillFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
// Convert the name to a hotlink and add to message.
- appendText(chat.mFromName + ": ", false, link_params);
+ mEditor->appendText(chat.mFromName + ": ", false, link_params);
}
else
{
- appendText(chat.mFromName + ": ", false, style_params);
+ mEditor->appendText(chat.mFromName + ": ", false, style_params);
}
}
}
@@ -457,7 +541,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
else
{
view = getHeader(chat, style_params);
- if (getText().size() == 0)
+ if (mEditor->getText().size() == 0)
p.top_pad = 0;
else
p.top_pad = mTopHeaderPad;
@@ -467,9 +551,9 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
p.view = view;
//Prepare the rect for the view
- LLRect target_rect = getDocumentView()->getRect();
+ LLRect target_rect = mEditor->getDocumentView()->getRect();
// squeeze down the widget by subtracting padding off left and right
- target_rect.mLeft += mLeftWidgetPad + mHPad;
+ target_rect.mLeft += mLeftWidgetPad + mEditor->getHPad();
target_rect.mRight -= mRightWidgetPad;
view->reshape(target_rect.getWidth(), view->getRect().getHeight());
view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
@@ -478,7 +562,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
header_text += chat.mFromName + ": ";
- appendWidget(p, header_text, false);
+ mEditor->appendWidget(p, header_text, false);
mLastFromName = chat.mFromName;
mLastFromID = chat.mFromID;
mLastMessageTime = new_message_time;
@@ -490,10 +574,10 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
style_params.font.style = "ITALIC";
if (chat.mFromName.size() > 0)
- appendText(chat.mFromName + " ", TRUE, style_params);
+ mEditor->appendText(chat.mFromName + " ", TRUE, style_params);
// Ensure that message ends with NewLine, to avoid losing of new lines
// while copy/paste from text chat. See EXT-3263.
- appendText(chat.mText.substr(4) + NEW_LINE, FALSE, style_params);
+ mEditor->appendText(chat.mText.substr(4) + NEW_LINE, FALSE, style_params);
}
else
{
@@ -504,8 +588,19 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
// while copy/paste from text chat. See EXT-3263.
message += NEW_LINE;
}
- appendText(message, FALSE, style_params);
+ mEditor->appendText(message, FALSE, style_params);
}
- blockUndo();
+ mEditor->blockUndo();
+}
+
+void LLChatHistory::draw()
+{
+ if (mEditor->scrolledToEnd())
+ {
+ mUnreadChatSources.clear();
+ mMoreChatPanel->setVisible(FALSE);
+ }
+
+ LLUICtrl::draw();
}
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index 8ca7dd1d58..260015e2dc 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -34,10 +34,11 @@
#define LLCHATHISTORY_H_
#include "lltexteditor.h"
+#include "lltextbox.h"
#include "llviewerchat.h"
//Chat log widget allowing addition of a message as a widget
-class LLChatHistory : public LLTextEditor
+class LLChatHistory : public LLUICtrl
{
public:
struct Params : public LLInitParam::Block<Params, LLTextEditor::Params>
@@ -63,6 +64,8 @@ class LLChatHistory : public LLTextEditor
//Header bottom padding
Optional<S32> bottom_header_pad;
+ Optional<LLTextBox::Params> more_chat_text;
+
Params()
: message_header("message_header"),
message_separator("message_separator"),
@@ -73,15 +76,16 @@ class LLChatHistory : public LLTextEditor
top_separator_pad("top_separator_pad"),
bottom_separator_pad("bottom_separator_pad"),
top_header_pad("top_header_pad"),
- bottom_header_pad("bottom_header_pad")
- {
- }
+ bottom_header_pad("bottom_header_pad"),
+ more_chat_text("more_chat_text")
+ {}
};
protected:
LLChatHistory(const Params&);
friend class LLUICtrlFactory;
+ /*virtual*/ void draw();
/**
* Redefinition of LLTextEditor::updateTextRect() to considerate text
* left/right padding params.
@@ -98,9 +102,13 @@ class LLChatHistory : public LLTextEditor
*/
LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params);
+ void onClickMoreText();
+
public:
~LLChatHistory();
+ void initFromParams(const Params&);
+
/**
* Appends a widget message.
* If last user appended message, concurs with current user,
@@ -129,5 +137,11 @@ class LLChatHistory : public LLTextEditor
S32 mBottomSeparatorPad;
S32 mTopHeaderPad;
S32 mBottomHeaderPad;
+
+ LLPanel* mMoreChatPanel;
+ LLTextBox* mMoreChatText;
+ LLTextEditor* mEditor;
+ typedef std::set<std::string> unread_chat_source_t;
+ unread_chat_source_t mUnreadChatSources;
};
#endif /* LLCHATHISTORY_H_ */
diff --git a/indra/newview/llcommanddispatcherlistener.cpp b/indra/newview/llcommanddispatcherlistener.cpp
index 00a20de30e..91baeaf989 100644
--- a/indra/newview/llcommanddispatcherlistener.cpp
+++ b/indra/newview/llcommanddispatcherlistener.cpp
@@ -31,6 +31,11 @@ LLCommandDispatcherListener::LLCommandDispatcherListener(/* LLCommandDispatcher*
"[\"query\"] map of parameters, as if from ?key1=val&key2=val\n"
"[\"trusted\"] boolean indicating trusted browser [default true]",
&LLCommandDispatcherListener::dispatch);
+ add("enumerate",
+ "Post to [\"reply\"] a map of registered LLCommandHandler instances, containing\n"
+ "name key and (e.g.) untrusted flag",
+ &LLCommandDispatcherListener::enumerate,
+ LLSD().with("reply", LLSD()));
}
void LLCommandDispatcherListener::dispatch(const LLSD& params) const
@@ -45,3 +50,11 @@ void LLCommandDispatcherListener::dispatch(const LLSD& params) const
LLCommandDispatcher::dispatch(params["cmd"], params["params"], params["query"], NULL,
trusted_browser);
}
+
+void LLCommandDispatcherListener::enumerate(const LLSD& params) const
+{
+ LLReqID reqID(params);
+ LLSD response(LLCommandDispatcher::enumerate());
+ reqID.stamp(response);
+ LLEventPumps::instance().obtain(params["reply"]).post(response);
+}
diff --git a/indra/newview/llcommanddispatcherlistener.h b/indra/newview/llcommanddispatcherlistener.h
index d0070ddd71..9bcddebcc1 100644
--- a/indra/newview/llcommanddispatcherlistener.h
+++ b/indra/newview/llcommanddispatcherlistener.h
@@ -23,6 +23,7 @@ public:
private:
void dispatch(const LLSD& params) const;
+ void enumerate(const LLSD& params) const;
//LLCommandDispatcher* mDispatcher;
};
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index 8c7e7bea83..dc506a1692 100644
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
@@ -36,6 +36,7 @@
#include "llcommandhandler.h"
#include "llnotificationsutil.h"
#include "llcommanddispatcherlistener.h"
+#include "stringize.h"
// system includes
#include <boost/tokenizer.hpp>
@@ -67,6 +68,7 @@ public:
bool trusted_browser);
private:
+ friend LLSD LLCommandDispatcher::enumerate();
std::map<std::string, LLCommandHandlerInfo> mMap;
};
@@ -175,3 +177,56 @@ bool LLCommandDispatcher::dispatch(const std::string& cmd,
return LLCommandHandlerRegistry::instance().dispatch(
cmd, params, query_map, web, trusted_browser);
}
+
+static std::string lookup(LLCommandHandler::EUntrustedAccess value);
+
+LLSD LLCommandDispatcher::enumerate()
+{
+ LLSD response;
+ LLCommandHandlerRegistry& registry(LLCommandHandlerRegistry::instance());
+ for (std::map<std::string, LLCommandHandlerInfo>::const_iterator chi(registry.mMap.begin()),
+ chend(registry.mMap.end());
+ chi != chend; ++chi)
+ {
+ LLSD info;
+ info["untrusted"] = chi->second.mUntrustedBrowserAccess;
+ info["untrusted_str"] = lookup(chi->second.mUntrustedBrowserAccess);
+ response[chi->first] = info;
+ }
+ return response;
+}
+
+/*------------------------------ lookup stuff ------------------------------*/
+struct symbol_info
+{
+ const char* name;
+ LLCommandHandler::EUntrustedAccess value;
+};
+
+#define ent(SYMBOL) \
+ { \
+ #SYMBOL + 28, /* skip "LLCommandHandler::UNTRUSTED_" prefix */ \
+ SYMBOL \
+ }
+
+symbol_info symbols[] =
+{
+ ent(LLCommandHandler::UNTRUSTED_ALLOW), // allow commands from untrusted browsers
+ ent(LLCommandHandler::UNTRUSTED_BLOCK), // ignore commands from untrusted browsers
+ ent(LLCommandHandler::UNTRUSTED_THROTTLE) // allow untrusted, but only a few per min.
+};
+
+#undef ent
+
+static std::string lookup(LLCommandHandler::EUntrustedAccess value)
+{
+ for (symbol_info *sii(symbols), *siend(symbols + (sizeof(symbols)/sizeof(symbols[0])));
+ sii != siend; ++sii)
+ {
+ if (sii->value == value)
+ {
+ return sii->name;
+ }
+ }
+ return STRINGIZE("UNTRUSTED_" << value);
+}
diff --git a/indra/newview/llcommandhandler.h b/indra/newview/llcommandhandler.h
index 1bae6d9414..a1d4c880f5 100644
--- a/indra/newview/llcommandhandler.h
+++ b/indra/newview/llcommandhandler.h
@@ -34,6 +34,8 @@
#ifndef LLCOMMANDHANDLER_H
#define LLCOMMANDHANDLER_H
+#include "llsd.h"
+
/* Example: secondlife:///app/foo/<uuid>
Command "foo" that takes one parameter, a UUID.
@@ -103,6 +105,9 @@ public:
// Execute a command registered via the above mechanism,
// passing string parameters.
// Returns true if command was found and executed correctly.
+ /// Return an LLSD::Map of registered LLCommandHandlers and associated
+ /// info (e.g. EUntrustedAccess).
+ static LLSD enumerate();
};
#endif
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 0b27001f10..effa57b1ef 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -98,6 +98,7 @@ LLFastTimerView::LLFastTimerView(const LLRect& rect)
mHoverBarIndex = -1;
FTV_NUM_TIMERS = LLFastTimer::NamedTimer::instanceCount();
mPrintStats = -1;
+ mAverageCyclesPerTimer = 0;
}
@@ -306,8 +307,9 @@ void LLFastTimerView::draw()
S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);
S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f);
- // HACK: casting away const. Should use setRect or some helper function instead.
- const_cast<LLRect&>(getRect()).setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height);
+ LLRect new_rect;
+ new_rect.setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height);
+ setRect(new_rect);
S32 left, top, right, bottom;
S32 x, y, barw, barh, dx, dy;
@@ -321,6 +323,10 @@ void LLFastTimerView::draw()
S32 xleft = margin;
S32 ytop = margin;
+ mAverageCyclesPerTimer = llround(lerp((F32)mAverageCyclesPerTimer, (F32)(LLFastTimer::sTimerCycles / (U64)LLFastTimer::sTimerCalls), 0.1f));
+ LLFastTimer::sTimerCycles = 0;
+ LLFastTimer::sTimerCalls = 0;
+
// Draw some help
{
@@ -328,6 +334,10 @@ void LLFastTimerView::draw()
y = height - ytop;
texth = (S32)LLFontGL::getFontMonospace()->getLineHeight();
+#if TIME_FAST_TIMERS
+ tdesc = llformat("Cycles per timer call: %d", mAverageCyclesPerTimer);
+ LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+#else
char modedesc[][32] = {
"2 x Average ",
"Max ",
@@ -342,7 +352,6 @@ void LLFastTimerView::draw()
tdesc = llformat("Full bar = %s [Click to pause/reset] [SHIFT-Click to toggle]",modedesc[mDisplayMode]);
LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
-
textw = LLFontGL::getFontMonospace()->getWidth(tdesc);
x = xleft, y -= (texth + 2);
@@ -352,6 +361,7 @@ void LLFastTimerView::draw()
LLFontGL::getFontMonospace()->renderUTF8(std::string("[Right-Click log selected] [ALT-Click toggle counts] [ALT-SHIFT-Click sub hidden]"),
0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+#endif
y -= (texth + 2);
}
diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h
index 2bb023ab14..f5c8f23818 100644
--- a/indra/newview/llfasttimerview.h
+++ b/indra/newview/llfasttimerview.h
@@ -91,6 +91,7 @@ private:
S32 mHoverBarIndex;
LLFrameTimer mHighlightTimer;
S32 mPrintStats;
+ S32 mAverageCyclesPerTimer;
};
#endif
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index ff568a11a9..7e0e8bfaa7 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -760,8 +760,9 @@ void LLFloaterPreference::onClickResetCache()
{
gSavedSettings.setString("NewCacheLocation", "");
gSavedSettings.setString("NewCacheLocationTopFolder", "");
- LLNotificationsUtil::add("CacheWillBeMoved");
}
+
+ LLNotificationsUtil::add("CacheWillBeMoved");
std::string cache_location = gDirUtilp->getCacheDir(true);
gSavedSettings.setString("CacheLocation", cache_location);
std::string top_folder(gDirUtilp->getBaseFileName(cache_location));
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index dbecd45d1f..f53b62e490 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -1379,7 +1379,6 @@ void LLFloaterSnapshot::Impl::onClickDiscard(void* data)
if (view)
{
- view->getParent()->setMouseOpaque(FALSE);
view->closeFloater();
}
}
@@ -2105,6 +2104,12 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)
gSnapshotFloaterView->adjustToFitScreen(this, FALSE);
}
+void LLFloaterSnapshot::onClose(bool app_quitting)
+{
+ getParent()->setMouseOpaque(FALSE);
+}
+
+
//static
void LLFloaterSnapshot::update()
{
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index bd01f6c573..1333497bd2 100644
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -52,6 +52,7 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void draw();
/*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClose(bool app_quitting);
static void update();
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 8b05f8614d..9cca1b07db 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -751,7 +751,7 @@ void LLFolderView::sanitizeSelection()
}
// Don't allow invisible items (such as root folders) to be selected.
- if (item->getDontShowInHierarchy())
+ if (item->getHidden())
{
items_to_remove.push_back(item);
}
@@ -774,7 +774,7 @@ void LLFolderView::sanitizeSelection()
parent_folder;
parent_folder = parent_folder->getParentFolder())
{
- if (parent_folder->potentiallyVisible() && !parent_folder->getDontShowInHierarchy())
+ if (parent_folder->potentiallyVisible() && !parent_folder->getHidden())
{
// give initial selection to first ancestor folder that potentially passes the filter
if (!new_selection)
@@ -796,7 +796,7 @@ void LLFolderView::sanitizeSelection()
// nothing selected to start with, so pick "My Inventory" as best guess
new_selection = getItemByID(gInventory.getRootFolderID());
// ... except if it's hidden from the UI.
- if (new_selection && new_selection->getDontShowInHierarchy())
+ if (new_selection && new_selection->getHidden())
{
new_selection = NULL;
}
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index bfd9d6dca7..720c2c7b1a 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -136,7 +136,7 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)
mListener(p.listener),
mArrowImage(p.folder_arrow_image),
mBoxImage(p.selection_image),
- mDontShowInHierarchy(false),
+ mHidden(false),
mShowLoadStatus(false)
{
refresh();
@@ -201,7 +201,7 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)
LLFolderViewItem* itemp = mParentFolder->getPreviousFromChild( this, include_children );
// Skip over items that are invisible or are hidden from the UI.
- while(itemp && (!itemp->getVisible() || itemp->getDontShowInHierarchy()))
+ while(itemp && (!itemp->getVisible() || itemp->getHidden()))
{
LLFolderViewItem* next_itemp = itemp->mParentFolder->getPreviousFromChild( itemp, include_children );
if (itemp == next_itemp)
@@ -418,7 +418,7 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
S32 LLFolderViewItem::getItemHeight()
{
- if (mDontShowInHierarchy) return 0;
+ if (mHidden) return 0;
S32 icon_height = mIcon->getHeight();
S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());
@@ -823,7 +823,7 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
void LLFolderViewItem::draw()
{
- if (mDontShowInHierarchy) return;
+ if (mHidden) return;
static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
@@ -970,11 +970,26 @@ void LLFolderViewItem::draw()
font->renderUTF8( mLabel, 0, text_left, y, color,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE);
+ LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+ S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE);
+// LLViewerInventoryCategory *item = 0;
+// if (getListener())
+// item = gInventory.getCategory(getListener()->getUUID());
+ bool root_is_loading = false;
+ if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getRootFolderID()))
+ {
+ // Descendent of my inventory.
+ root_is_loading = gInventory.myInventoryFetchInProgress();
+ }
+ if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getLibraryRootFolderID()))
+ {
+ // Descendent of library
+ root_is_loading = gInventory.libraryFetchInProgress();
+ }
+
if ( (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime"))
- || (LLInventoryModel::backgroundFetchActive() && mShowLoadStatus) )
+ || (LLInventoryModel::backgroundFetchActive() && root_is_loading && mShowLoadStatus) )
{
std::string load_string = " ( " + LLTrans::getString("LoadingData") + " ) ";
font->renderUTF8(load_string, 0, right_x, y, sSearchStatusColor,
@@ -1257,7 +1272,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
// filter self only on first pass through
LLFolderViewItem::filter( filter );
}
- if (mDontShowInHierarchy)
+ if (mHidden)
{
setOpen();
}
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index a43096dcb2..21e24c2a4d 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -162,7 +162,7 @@ protected:
LLUIImagePtr mBoxImage;
BOOL mIsLoading;
LLTimer mTimeSinceRequestStart;
- bool mDontShowInHierarchy;
+ bool mHidden;
bool mShowLoadStatus;
// helper function to change the selection from the root.
@@ -206,8 +206,11 @@ public:
// makes sure that this view and it's children are the right size.
virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
virtual S32 getItemHeight();
- void setDontShowInHierarchy(bool dont_show) { mDontShowInHierarchy = dont_show; }
- bool getDontShowInHierarchy() const { return mDontShowInHierarchy; }
+
+ // Hide the folder from the UI, such as if you want to hide the root
+ // folder in an inventory panel.
+ void setHidden(bool hidden) { mHidden = hidden; }
+ bool getHidden() const { return mHidden; }
// applies filters to control visibility of inventory items
virtual void filter( LLInventoryFilter& filter);
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 22658b4d65..7dd8ea694e 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -138,12 +138,7 @@ void LLGroupActions::startCall(const LLUUID& group_id)
}
// start the call
- // *TODO: move this to LLIMMgr?
- LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
- if (session && session->mSessionInitialized)
- gIMMgr->startCall(session_id);
- else
- gIMMgr->autoStartCallOnStartup(session_id);
+ gIMMgr->autoStartCallOnStartup(session_id);
make_ui_sound("UISndStartIM");
}
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index acaa6076f8..0ce8d4b7cd 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -45,6 +45,7 @@
#include "llfloaterchat.h"
#include "llfloaterreg.h"
#include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container
+#include "lllayoutstack.h"
#include "lllineeditor.h"
#include "lllogchat.h"
#include "llpanelimcontrolpanel.h"
@@ -56,6 +57,7 @@
#include "llvoicechannel.h"
#include "lltransientfloatermgr.h"
#include "llinventorymodel.h"
+#include "llrootview.h"
@@ -220,6 +222,12 @@ LLIMFloater::~LLIMFloater()
//virtual
BOOL LLIMFloater::postBuild()
{
+ // User-resizable control panels in P2P sessions look ugly (EXT-3470).
+ if (mDialog == IM_NOTHING_SPECIAL || mDialog == IM_SESSION_P2P_INVITE)
+ {
+ getChild<LLLayoutStack>("im_panels")->setPanelUserResize("panel_im_control_panel", FALSE);
+ }
+
const LLUUID& other_party_id = LLIMModel::getInstance()->getOtherParticipantID(mSessionID);
if (other_party_id.notNull())
{
@@ -437,6 +445,16 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
void LLIMFloater::getAllowedRect(LLRect& rect)
{
rect = gViewerWindow->getWorldViewRectRaw();
+ static S32 right_padding = 0;
+ if (right_padding == 0)
+ {
+ LLPanel* side_bar_tabs =
+ gViewerWindow->getRootView()->getChild<LLPanel> (
+ "side_bar_tabs");
+ right_padding = side_bar_tabs->getRect().getWidth();
+ LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs);
+ }
+ rect.mRight -= right_padding;
}
void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index a521eb56af..d209060b58 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -439,6 +439,50 @@ LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const
(LLIMModel::LLIMSession*) NULL);
}
+//*TODO consider switching to using std::set instead of std::list for holding LLUUIDs across the whole code
+LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const std::vector<LLUUID>& ids)
+{
+ S32 num = ids.size();
+ if (!num) return NULL;
+
+ if (mId2SessionMap.empty()) return NULL;
+
+ std::map<LLUUID, LLIMSession*>::const_iterator it = mId2SessionMap.begin();
+ for (; it != mId2SessionMap.end(); ++it)
+ {
+ LLIMSession* session = (*it).second;
+
+ if (!session->isAdHoc()) continue;
+ if (session->mInitialTargetIDs.size() != num) continue;
+
+ std::list<LLUUID> tmp_list(session->mInitialTargetIDs.begin(), session->mInitialTargetIDs.end());
+
+ std::vector<LLUUID>::const_iterator iter = ids.begin();
+ while (iter != ids.end())
+ {
+ tmp_list.remove(*iter);
+ ++iter;
+
+ if (tmp_list.empty())
+ {
+ break;
+ }
+ }
+
+ if (tmp_list.empty() && iter == ids.end())
+ {
+ return session;
+ }
+ }
+
+ return NULL;
+}
+
+bool LLIMModel::LLIMSession::isAdHoc()
+{
+ return IM_SESSION_CONFERENCE_START == mType || (IM_SESSION_INVITE == mType && !gAgent.isInGroup(mSessionID));
+}
+
void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
{
LLIMSession* session = findIMSession(old_session_id);
@@ -1413,11 +1457,20 @@ void LLCallDialog::getAllowedRect(LLRect& rect)
rect = gViewerWindow->getWorldViewRectScaled();
}
-void LLCallDialog::onOpen(const LLSD& key)
+BOOL LLCallDialog::postBuild()
{
+ if (!LLDockableFloater::postBuild())
+ return FALSE;
+
// dock the dialog to the Speak Button, where other sys messages appear
- setDockControl(new LLDockControl(LLBottomTray::getInstance()->getChild<LLPanel>("speak_panel"),
- this, getDockTongue(), LLDockControl::TOP, boost::bind(&LLCallDialog::getAllowedRect, this, _1)));
+ LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel");
+
+ setDockControl(new LLDockControl(
+ anchor_panel, this,
+ getDockTongue(), LLDockControl::TOP,
+ boost::bind(&LLCallDialog::getAllowedRect, this, _1)));
+
+ return TRUE;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1561,7 +1614,7 @@ void LLOutgoingCallDialog::onCancel(void* user_data)
BOOL LLOutgoingCallDialog::postBuild()
{
- BOOL success = LLDockableFloater::postBuild();
+ BOOL success = LLCallDialog::postBuild();
childSetAction("Cancel", onCancel, this);
@@ -1580,7 +1633,7 @@ LLCallDialog(payload)
BOOL LLIncomingCallDialog::postBuild()
{
- LLDockableFloater::postBuild();
+ LLCallDialog::postBuild();
LLUUID session_id = mPayload["session_id"].asUUID();
LLSD caller_id = mPayload["caller_id"];
@@ -2107,7 +2160,13 @@ BOOL LLIMMgr::getIMReceived() const
void LLIMMgr::autoStartCallOnStartup(const LLUUID& session_id)
{
LLIMModel::LLIMSession *session = LLIMModel::getInstance()->findIMSession(session_id);
- if (session)
+ if (!session) return;
+
+ if (session->mSessionInitialized)
+ {
+ startCall(session_id);
+ }
+ else
{
session->mStartCallOnInitialize = true;
}
@@ -2169,12 +2228,22 @@ LLUUID LLIMMgr::addSession(
bool new_session = !LLIMModel::getInstance()->findIMSession(session_id);
+ //works only for outgoing ad-hoc sessions
+ if (new_session && IM_SESSION_CONFERENCE_START == dialog && ids.size())
+ {
+ LLIMModel::LLIMSession* ad_hoc_found = LLIMModel::getInstance()->findAdHocIMSession(ids);
+ if (ad_hoc_found)
+ {
+ new_session = false;
+ session_id = ad_hoc_found->mSessionID;
+ }
+ }
+
if (new_session)
{
LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids, voice);
}
-
//*TODO remove this "floater" thing when Communicate Floater's gone
LLFloaterIMPanel* floater = findFloaterBySession(session_id);
if(!floater)
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 09f0c9df71..3f46b0d754 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -74,6 +74,8 @@ public:
void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction);
static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata);
+ bool isAdHoc();
+
LLUUID mSessionID;
std::string mName;
EInstantMessage mType;
@@ -133,6 +135,12 @@ public:
*/
LLIMSession* findIMSession(const LLUUID& session_id) const;
+ /**
+ * Find an Ad-Hoc IM Session with specified participants
+ * @return first found Ad-Hoc session or NULL if the session does not exist
+ */
+ LLIMSession* findAdHocIMSession(const std::vector<LLUUID>& ids);
+
/**
* Rebind session data to a new session id.
*/
@@ -476,7 +484,7 @@ public:
LLCallDialog(const LLSD& payload);
~LLCallDialog() {}
- virtual void onOpen(const LLSD& key);
+ virtual BOOL postBuild();
protected:
virtual void getAllowedRect(LLRect& rect);
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 0a8108899a..1eb8d1bc2c 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -67,6 +67,7 @@ F32 LLInventoryModel::sMaxTimeBetweenFetches = 10.f;
BOOL LLInventoryModel::sTimelyFetchPending = FALSE;
LLFrameTimer LLInventoryModel::sFetchTimer;
S16 LLInventoryModel::sBulkFetchCount = 0;
+BOOL LLInventoryModel::sFirstTimeInViewer2 = TRUE;
// Increment this if the inventory contents change in a non-backwards-compatible way.
// For viewer 2, the addition of link items makes a pre-viewer-2 cache incorrect.
@@ -1339,8 +1340,7 @@ bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)
//Initialize statics.
bool LLInventoryModel::isBulkFetchProcessingComplete()
{
- return ( (sFetchQueue.empty()
- && sBulkFetchCount<=0) ? TRUE : FALSE ) ;
+ return sFetchQueue.empty() && sBulkFetchCount<=0;
}
class LLInventoryModelFetchDescendentsResponder: public LLHTTPClient::Responder
@@ -1615,10 +1615,58 @@ void LLInventoryModel::bulkFetch(std::string url)
}
}
+bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id)
+{
+ for (std::deque<LLUUID>::iterator it = sFetchQueue.begin();
+ it != sFetchQueue.end(); ++it)
+ {
+ const LLUUID& fetch_id = *it;
+ if (gInventory.isObjectDescendentOf(fetch_id, cat_id))
+ return false;
+ }
+ return true;
+}
+
+/* static */
+bool LLInventoryModel::libraryFetchStarted()
+{
+ return sLibraryFetchStarted;
+}
+
+/* static */
+bool LLInventoryModel::libraryFetchCompleted()
+{
+ return libraryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getLibraryRootFolderID());
+}
+
+/* static */
+bool LLInventoryModel::libraryFetchInProgress()
+{
+ return libraryFetchStarted() && !libraryFetchCompleted();
+}
+
+/* static */
+bool LLInventoryModel::myInventoryFetchStarted()
+{
+ return sMyInventoryFetchStarted;
+}
+
+/* static */
+bool LLInventoryModel::myInventoryFetchCompleted()
+{
+ return myInventoryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getRootFolderID());
+}
+
+/* static */
+bool LLInventoryModel::myInventoryFetchInProgress()
+{
+ return myInventoryFetchStarted() && !myInventoryFetchCompleted();
+}
+
// static
bool LLInventoryModel::isEverythingFetched()
{
- return (sAllFoldersFetched ? true : false);
+ return sAllFoldersFetched;
}
//static
@@ -1637,7 +1685,6 @@ void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id)
if (!sMyInventoryFetchStarted)
{
sMyInventoryFetchStarted = TRUE;
- sFetchQueue.push_back(gInventory.getLibraryRootFolderID());
sFetchQueue.push_back(gInventory.getRootFolderID());
gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
}
@@ -1645,7 +1692,6 @@ void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id)
{
sLibraryFetchStarted = TRUE;
sFetchQueue.push_back(gInventory.getLibraryRootFolderID());
- sFetchQueue.push_back(gInventory.getRootFolderID());
gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
}
}
@@ -2517,6 +2563,10 @@ void LLInventoryModel::buildParentChildMap()
llwarns << "Found " << lost << " lost categories." << llendl;
}
+ const BOOL COF_exists = (findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, FALSE) != LLUUID::null);
+ sFirstTimeInViewer2 = !COF_exists || gAgent.isFirstLogin();
+
+
// Now the items. We allocated in the last step, so now all we
// have to do is iterate over the items and put them in the right
// place.
@@ -3530,6 +3580,19 @@ void LLInventoryModel::setLibraryOwnerID(const LLUUID& val)
mLibraryOwnerID = val;
}
+// static
+BOOL LLInventoryModel::getIsFirstTimeInViewer2()
+{
+ // Do not call this before parentchild map is built.
+ if (!gInventory.mIsAgentInvUsable)
+ {
+ llwarns << "Parent Child Map not yet built; guessing as first time in viewer2." << llendl;
+ return TRUE;
+ }
+
+ return sFirstTimeInViewer2;
+}
+
//----------------------------------------------------------------------------
// *NOTE: DEBUG functionality
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 27bbca493d..39377b4ae2 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -499,9 +499,9 @@ public:
// *NOTE: DEBUG functionality
void dumpInventory() const;
- ////////////////////////////////////////////////////////////////////////////////
- // Bulk / Background Fetch
+ ////////////////////////////////////////////////////////////////////////////////
+ // Bulk fetch
public:
// Start and stop background breadth-first fetching of inventory contents.
// This gets triggered when performing a filter-search
@@ -516,6 +516,14 @@ public:
// Add categories to a list to be fetched in bulk.
static void bulkFetch(std::string url);
+ static bool libraryFetchStarted();
+ static bool libraryFetchCompleted();
+ static bool libraryFetchInProgress();
+
+ static bool myInventoryFetchStarted();
+ static bool myInventoryFetchCompleted();
+ static bool myInventoryFetchInProgress();
+
private:
static BOOL sMyInventoryFetchStarted;
static BOOL sLibraryFetchStarted;
@@ -525,6 +533,13 @@ private:
// completing the fetch once per session should be sufficient
static BOOL sBackgroundFetchActive;
static S16 sBulkFetchCount;
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Login status
+public:
+ static BOOL getIsFirstTimeInViewer2();
+private:
+ static BOOL sFirstTimeInViewer2;
};
// a special inventory model for the agent
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 3c34ba32e2..082b7a9468 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -402,9 +402,12 @@ void LLInventoryPanel::modelChanged(U32 mask)
// static
void LLInventoryPanel::onIdle(void *userdata)
{
+ if (!gInventory.isInventoryUsable())
+ return;
+
LLInventoryPanel *self = (LLInventoryPanel*)userdata;
// Inventory just initialized, do complete build
- if (!self->mViewsInitialized && gInventory.isInventoryUsable())
+ if (!self->mViewsInitialized)
{
self->initializeViews();
}
@@ -502,7 +505,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
// but still have the parent folder present for listener-related operations.
if (id == mStartFolderID)
{
- folderp->setDontShowInHierarchy(TRUE);
+ folderp->setHidden(TRUE);
}
}
}
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 2dc9f255d7..24c72c65ce 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -76,6 +76,7 @@ LLLoginInstance::LLLoginInstance() :
mDispatcher.add("fail.login", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
mDispatcher.add("connect", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
mDispatcher.add("disconnect", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
+ mDispatcher.add("indeterminate", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1));
}
LLLoginInstance::~LLLoginInstance()
@@ -204,6 +205,8 @@ bool LLLoginInstance::handleLoginEvent(const LLSD& event)
mTransferRate = event["transfer_rate"].asReal();
}
+
+
// Call the method registered in constructor, if any, for more specific
// handling
LLEventDispatcher::Callable method(mDispatcher.get(event["change"]));
@@ -295,6 +298,22 @@ void LLLoginInstance::handleDisconnect(const LLSD& event)
// placeholder
}
+void LLLoginInstance::handleIndeterminate(const LLSD& event)
+{
+ // The indeterminate response means that the server
+ // gave the viewer a new url and params to try.
+ // The login module handles the retry, but it gives us the
+ // server response so that we may show
+ // the user some status.
+ LLSD message = event.get("data").get("message");
+ if(message.isDefined())
+ {
+ LLSD progress_update;
+ progress_update["desc"] = message;
+ LLEventPumps::getInstance()->obtain("LLProgressView").post(progress_update);
+ }
+}
+
bool LLLoginInstance::handleTOSResponse(bool accepted, const std::string& key)
{
if(accepted)
@@ -374,28 +393,6 @@ void LLLoginInstance::updateApp(bool mandatory, const std::string& auth_msg)
mNotifications->add(notification_name, args, payload,
boost::bind(&LLLoginInstance::updateDialogCallback, this, _1, _2));
}
-
- /* *NOTE:Mani Experiment with Event API interface.
- if(!mUpdateAppResponse)
- {
- bool make_unique = true;
- mUpdateAppResponse.reset(new LLEventStream("logininstance_updateapp", make_unique));
- mUpdateAppResponse->listen("diaupdateDialogCallback",
- boost::bind(&LLLoginInstance::updateDialogCallback,
- this, _1
- )
- );
- }
-
- LLSD event;
- event["op"] = "requestAdd";
- event["name"] = notification_name;
- event["substitutions"] = args;
- event["payload"] = payload;
- event["reply"] = mUpdateAppResponse->getName();
-
- LLEventPumps::getInstance()->obtain("LLNotifications").post(event);
- */
}
bool LLLoginInstance::updateDialogCallback(const LLSD& notification, const LLSD& response)
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index 19d7449bc1..c8704eddb4 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -89,6 +89,7 @@ private:
void handleLoginFailure(const LLSD& event);
void handleLoginSuccess(const LLSD& event);
void handleDisconnect(const LLSD& event);
+ void handleIndeterminate(const LLSD& event);
bool handleTOSResponse(bool v, const std::string& key);
@@ -107,7 +108,6 @@ private:
std::string mSerialNumber;
int mLastExecEvent;
UpdaterLauncherCallback mUpdaterLauncher;
- boost::scoped_ptr<LLEventStream> mUpdateAppResponse;
LLEventDispatcher mDispatcher;
};
diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index 2bb2a3da6f..b8da368bd7 100755
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -164,7 +164,7 @@ void LLMediaDataClient::enqueue(const Request *request)
// Sadly, we have to const-cast because items put into the queue are not const
mSortedQueue.push_back(const_cast<LLMediaDataClient::Request*>(request));
- LL_DEBUGS("LLMediaDataClient") << "SORTED queue:" << mSortedQueue << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientQueue") << "SORTED queue:" << mSortedQueue << LL_ENDL;
}
else {
if (mRoundRobinQueue.size() > mMaxRoundRobinQueueSize)
@@ -187,7 +187,7 @@ void LLMediaDataClient::enqueue(const Request *request)
// Sadly, we have to const-cast because items put into the queue are not const
mRoundRobinQueue.push_front(const_cast<LLMediaDataClient::Request*>(request));
- LL_DEBUGS("LLMediaDataClient") << "RR queue:" << mRoundRobinQueue << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientQueue") << "RR queue:" << mRoundRobinQueue << LL_ENDL;
}
else
{
@@ -226,16 +226,16 @@ bool LLMediaDataClient::processQueueTimer()
{
LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue size is: " << mSortedQueue.size()
<< ", RR queue size is: " << mRoundRobinQueue.size() << LL_ENDL;
- LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue is: " << mSortedQueue << LL_ENDL;
- LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, RR queue is: " << mRoundRobinQueue << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() started, SORTED queue is: " << mSortedQueue << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() started, RR queue is: " << mRoundRobinQueue << LL_ENDL;
}
serviceQueue();
LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, SORTED queue size is: " << mSortedQueue.size()
<< ", RR queue size is: " << mRoundRobinQueue.size() << LL_ENDL;
- LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, SORTED queue is: " << mSortedQueue << LL_ENDL;
- LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, RR queue is: " << mRoundRobinQueue << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() finished, SORTED queue is: " << mSortedQueue << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() finished, RR queue is: " << mRoundRobinQueue << LL_ENDL;
return isEmpty();
}
@@ -649,7 +649,7 @@ void LLMediaDataClient::Responder::error(U32 status, const std::string& reason)
/*virtual*/
void LLMediaDataClient::Responder::result(const LLSD& content)
{
- LL_DEBUGS("LLMediaDataClient") << *mRequest << " result : " << ll_print_sd(content) << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientResponse") << *mRequest << " result : " << ll_print_sd(content) << LL_ENDL;
}
//////////////////////////////////////////////////////////////////////////////////////
@@ -703,7 +703,7 @@ void LLObjectMediaDataClient::Responder::result(const LLSD& content)
llassert(type == LLMediaDataClient::Request::GET || type == LLMediaDataClient::Request::UPDATE)
if (type == LLMediaDataClient::Request::GET)
{
- LL_DEBUGS("LLMediaDataClient") << *(getRequest()) << " GET returned: " << ll_print_sd(content) << LL_ENDL;
+ LL_DEBUGS("LLMediaDataClientResponse") << *(getRequest()) << " GET returned: " << ll_print_sd(content) << LL_ENDL;
// Look for an error
if (content.has("error"))
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 6210151d1b..71dc0f9011 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -51,6 +51,8 @@
#include "llsidetray.h"
#include "llslurl.h"
#include "llurlsimstring.h"
+#include "llurlregistry.h"
+#include "llurldispatcher.h"
#include "llviewerinventory.h"
#include "llviewermenu.h"
#include "llviewerparcelmgr.h"
@@ -58,6 +60,7 @@
#include "llappviewer.h"
#include "llviewercontrol.h"
#include "llfloatermediabrowser.h"
+#include "llweb.h"
#include "llinventorymodel.h"
#include "lllandmarkactions.h"
@@ -543,7 +546,20 @@ void LLNavigationBar::onRegionNameResponse(
// Invalid location?
if (!region_handle)
{
- invokeSearch(typed_location);
+ // handle any secondlife:// SLapps, or
+ // display http:// URLs in the media browser, or
+ // anything else is sent to the search floater
+ if (LLUrlRegistry::instance().isUrl(typed_location))
+ {
+ if (! LLURLDispatcher::dispatchFromTextEditor(typed_location))
+ {
+ LLWeb::loadURL(typed_location);
+ }
+ }
+ else
+ {
+ invokeSearch(typed_location);
+ }
return;
}
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index ffe7f57167..e9131a342e 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -403,6 +403,11 @@ void LLPanelProfileTab::updateButtons()
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
+bool enable_god()
+{
+ return gAgent.isGodlike();
+}
+
LLPanelAvatarProfile::LLPanelAvatarProfile()
: LLPanelProfileTab()
{
@@ -423,6 +428,13 @@ BOOL LLPanelAvatarProfile::postBuild()
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
registrar.add("Profile.Pay", boost::bind(&LLPanelAvatarProfile::pay, this));
registrar.add("Profile.Share", boost::bind(&LLPanelAvatarProfile::share, this));
+ registrar.add("Profile.Kick", boost::bind(&LLPanelAvatarProfile::kick, this));
+ registrar.add("Profile.Freeze", boost::bind(&LLPanelAvatarProfile::freeze, this));
+ registrar.add("Profile.Unfreeze", boost::bind(&LLPanelAvatarProfile::unfreeze, this));
+ registrar.add("Profile.CSR", boost::bind(&LLPanelAvatarProfile::csr, this));
+
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable;
+ enable.add("Profile.EnableGod", boost::bind(&enable_god));
mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
@@ -622,6 +634,28 @@ void LLPanelAvatarProfile::share()
LLAvatarActions::share(getAvatarId());
}
+void LLPanelAvatarProfile::kick()
+{
+ LLAvatarActions::kick(getAvatarId());
+}
+
+void LLPanelAvatarProfile::freeze()
+{
+ LLAvatarActions::freeze(getAvatarId());
+}
+
+void LLPanelAvatarProfile::unfreeze()
+{
+ LLAvatarActions::unfreeze(getAvatarId());
+}
+
+void LLPanelAvatarProfile::csr()
+{
+ std::string name;
+ gCacheName->getFullName(getAvatarId(), name);
+ LLAvatarActions::csr(getAvatarId(), name);
+}
+
void LLPanelAvatarProfile::onUrlTextboxClicked(const std::string& url)
{
LLWeb::loadURL(url);
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index b19c5cca49..8f07c67fb1 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -181,6 +181,15 @@ protected:
*/
void share();
+ void kick();
+ void freeze();
+ void unfreeze();
+ void csr();
+
+
+ bool enableGod();
+
+
void onUrlTextboxClicked(const std::string& url);
void onHomepageTextboxClicked();
void onAddFriendButtonClick();
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index a52aa6d30f..751705dd57 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -485,6 +485,18 @@ void LLPanelPicks::onOpen(const LLSD& key)
LLPanelProfileTab::onOpen(key);
}
+void LLPanelPicks::onClosePanel()
+{
+ if (mPanelClassifiedInfo)
+ {
+ onPanelClassifiedClose(mPanelClassifiedInfo);
+ }
+ if (mPanelPickInfo)
+ {
+ onPanelPickClose(mPanelPickInfo);
+ }
+}
+
void LLPanelPicks::onListCommit(const LLFlatListView* f_list)
{
// Make sure only one of the lists has selection.
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index fd8a9e6938..1b2e35ca46 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -74,6 +74,8 @@ public:
/*virtual*/ void onOpen(const LLSD& key);
+ /*virtual*/ void onClosePanel();
+
void processProperties(void* data, EAvatarProcessorType type);
void updateData();
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 5941487c7d..7d5944ea2b 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -213,7 +213,6 @@ void LLParticipantList::updateRecentSpeakersOrder()
if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder())
{
// Resort avatar list
- mAvatarList->setDirty(true);
sort();
}
}
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index 5f6b210767..7a48f890e0 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -72,10 +72,12 @@ const S32 ANIMATION_FRAMES = 1; //13;
LLProgressView::LLProgressView(const LLRect &rect)
: LLPanel(),
mPercentDone( 0.f ),
- mMouseDownInActiveArea( false )
+ mMouseDownInActiveArea( false ),
+ mUpdateEvents("LLProgressView")
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_progress.xml");
reshape(rect.getWidth(), rect.getHeight());
+ mUpdateEvents.listen("self", boost::bind(&LLProgressView::handleUpdate, this, _1));
}
BOOL LLProgressView::postBuild()
@@ -260,3 +262,26 @@ void LLProgressView::onClickMessage(void* data)
}
}
}
+
+bool LLProgressView::handleUpdate(const LLSD& event_data)
+{
+ LLSD message = event_data.get("message");
+ LLSD desc = event_data.get("desc");
+ LLSD percent = event_data.get("percent");
+
+ if(message.isDefined())
+ {
+ setMessage(message.asString());
+ }
+
+ if(desc.isDefined())
+ {
+ setText(desc.asString());
+ }
+
+ if(percent.isDefined())
+ {
+ setPercent(percent.asReal());
+ }
+ return false;
+}
diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h
index 865646c85d..6853674d88 100644
--- a/indra/newview/llprogressview.h
+++ b/indra/newview/llprogressview.h
@@ -35,6 +35,7 @@
#include "llpanel.h"
#include "llframetimer.h"
+#include "llevents.h"
class LLImageRaw;
class LLButton;
@@ -75,7 +76,12 @@ protected:
LLRect mOutlineRect;
bool mMouseDownInActiveArea;
+ // The LLEventStream mUpdateEvents depends upon this class being a singleton
+ // to avoid pump name conflicts.
static LLProgressView* sInstance;
+ LLEventStream mUpdateEvents;
+
+ bool handleUpdate(const LLSD& event_data);
};
#endif // LL_LLPROGRESSVIEW_H
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index bd256ec9c2..c18fe8ad7e 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -217,7 +217,10 @@ void LLScreenChannel::addToast(const LLToast::Params& p)
ToastElem new_toast_elem(p);
+ // reset HIDDEN flags for the Overflow Toast
mOverflowToastHidden = false;
+ if(mOverflowToastPanel)
+ mOverflowToastPanel->setIsHidden(false);
new_toast_elem.toast->setOnFadeCallback(boost::bind(&LLScreenChannel::onToastFade, this, _1));
new_toast_elem.toast->setOnToastDestroyedCallback(boost::bind(&LLScreenChannel::onToastDestroyed, this, _1));
@@ -459,8 +462,6 @@ void LLScreenChannel::showToastsBottom()
S32 toast_margin = 0;
std::vector<ToastElem>::reverse_iterator it;
- closeOverflowToastPanel();
-
for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)
{
if(it != mToastList.rbegin())
@@ -513,7 +514,11 @@ void LLScreenChannel::showToastsBottom()
mHiddenToastsNum++;
}
createOverflowToast(bottom, gSavedSettings.getS32("NotificationTipToastLifeTime"));
- }
+ }
+ else
+ {
+ closeOverflowToastPanel();
+ }
}
//--------------------------------------------------------------------------
@@ -544,11 +549,14 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
LLRect toast_rect;
LLToast::Params p;
p.lifetime_secs = timer;
- mOverflowToastPanel = new LLToast(p);
+
+ if(!mOverflowToastPanel)
+ mOverflowToastPanel = new LLToast(p);
if(!mOverflowToastPanel)
return;
+ mOverflowToastPanel->startFading();
mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onOverflowToastHide, this));
LLTextBox* text_box = mOverflowToastPanel->getChild<LLTextBox>("toast_text");
@@ -606,8 +614,8 @@ void LLScreenChannel::closeOverflowToastPanel()
{
if(mOverflowToastPanel != NULL)
{
- mOverflowToastPanel->closeFloater();
- mOverflowToastPanel = NULL;
+ mOverflowToastPanel->setVisible(FALSE);
+ mOverflowToastPanel->stopFading();
}
}
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index fd39bde118..90214a1bd7 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -61,7 +61,9 @@ void LLSpeakButton::draw()
{
// gVoiceClient is the authoritative global source of info regarding our open-mic state, we merely reflect that state.
bool openmic = gVoiceClient->getUserPTTState();
- mSpeakBtn->setToggleState(openmic);
+ bool voiceenabled = gVoiceClient->voiceEnabled();
+ mSpeakBtn->setToggleState(openmic && voiceenabled);
+ mOutputMonitor->setIsMuted(!voiceenabled);
LLUICtrl::draw();
}
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 73e7d99815..eb2275bff0 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1082,6 +1082,17 @@ bool idle_startup()
credentials["passwd"] = gPassword;
login->connect(credentials);
+ LLStartUp::setStartupState( STATE_LOGIN_CURL_UNSTUCK );
+ return FALSE;
+ }
+
+ if(STATE_LOGIN_CURL_UNSTUCK == LLStartUp::getStartupState())
+ {
+ // If we get here we have gotten past the potential stall
+ // in curl, so take "may appear frozen" out of progress bar. JC
+ auth_desc = LLTrans::getString("LoginInProgressNoFrozen");
+ set_startup_status(progress, auth_desc, auth_message);
+
LLStartUp::setStartupState( STATE_LOGIN_PROCESS_RESPONSE );
return FALSE;
}
@@ -1168,16 +1179,6 @@ bool idle_startup()
show_connect_box = true;
}
}
- else
- {
- // Still waiting for response.
- // *TODO:Mani - Actually check for login progress.
- // If we get here we have gotten past the potential stall
- // in curl, so take "may appear frozen" out of progress bar. JC
- auth_desc = LLTrans::getString("LoginInProgressNoFrozen");
- set_startup_status(progress, auth_desc, auth_message);
- }
-
return FALSE;
}
@@ -2703,6 +2704,7 @@ std::string LLStartUp::startupStateToString(EStartupState state)
RTNENUM( STATE_LOGIN_WAIT );
RTNENUM( STATE_LOGIN_CLEANUP );
RTNENUM( STATE_LOGIN_AUTH_INIT );
+ RTNENUM( STATE_LOGIN_CURL_UNSTUCK );
RTNENUM( STATE_LOGIN_PROCESS_RESPONSE );
RTNENUM( STATE_WORLD_INIT );
RTNENUM( STATE_MULTIMEDIA_INIT );
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index ab11b42e74..92fe9521d3 100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -55,6 +55,7 @@ typedef enum {
STATE_LOGIN_WAIT, // Wait for user input at login screen
STATE_LOGIN_CLEANUP, // Get rid of login screen and start login
STATE_LOGIN_AUTH_INIT, // Start login to SL servers
+ STATE_LOGIN_CURL_UNSTUCK, // Update progress to remove "SL appears frozen" msg.
STATE_LOGIN_PROCESS_RESPONSE, // Check authentication reply
STATE_WORLD_INIT, // Start building the world
STATE_MULTIMEDIA_INIT, // Init the rest of multimedia library
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 5f7c2f5080..25e5e23e6f 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -1237,6 +1237,7 @@ void LLTextureCtrl::draw()
// Using the discard level, do not show the string if the texture is almost but not
// fully loaded.
if ( mTexturep.notNull() &&
+ (!mTexturep->isFullyLoaded()) &&
(mShowLoadingPlaceholder == TRUE) &&
(mTexturep->getDiscardLevel() != 1) &&
(mTexturep->getDiscardLevel() != 0))
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 0b232da62b..fb1d591e32 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -45,7 +45,7 @@
class LLButton;
class LLFloaterTexturePicker;
class LLInventoryItem;
-class LLViewerTexture;
+class LLViewerFetchedTexture;
// used for setting drag & drop callbacks.
typedef boost::function<BOOL (LLUICtrl*, LLInventoryItem*)> drag_n_drop_callback;
@@ -189,7 +189,7 @@ private:
drag_n_drop_callback mDropCallback;
commit_callback_t mOnCancelCallback;
commit_callback_t mOnSelectCallback;
- LLPointer<LLViewerTexture> mTexturep;
+ LLPointer<LLViewerFetchedTexture> mTexturep;
LLUIColor mBorderColor;
LLUUID mImageItemID;
LLUUID mImageAssetID;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index e80dafe245..3f489544b4 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -801,7 +801,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (mState == SEND_HTTP_REQ)
{
{
- const S32 HTTP_QUEUE_MAX_SIZE = 32;
+ const S32 HTTP_QUEUE_MAX_SIZE = 8;
// *TODO: Integrate this with llviewerthrottle
// Note: LLViewerThrottle uses dynamic throttling which makes sense for UDP,
// but probably not for Textures.
@@ -874,12 +874,30 @@ bool LLTextureFetchWorker::doWork(S32 param)
S32 cur_size = mFormattedImage.notNull() ? mFormattedImage->getDataSize() : 0;
if (mRequestedSize < 0)
{
- const S32 HTTP_MAX_RETRY_COUNT = 3;
- S32 max_attempts = (mGetStatus == HTTP_NOT_FOUND) ? 1 : HTTP_MAX_RETRY_COUNT + 1;
- llinfos << "HTTP GET failed for: " << mUrl
- << " Status: " << mGetStatus << " Reason: '" << mGetReason << "'"
- << " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl;
- ++mHTTPFailCount;
+ S32 max_attempts;
+ if (mGetStatus == HTTP_NOT_FOUND)
+ {
+ mHTTPFailCount = max_attempts = 1; // Don't retry
+ llinfos << "Texture missing from server (404): " << mUrl << llendl;
+ }
+ else if (mGetStatus == HTTP_SERVICE_UNAVAILABLE)
+ {
+ // *TODO: Should probably introduce a timer here to delay future HTTP requsts
+ // for a short time (~1s) to ease server load? Ideally the server would queue
+ // requests instead of returning 503... we already limit the number pending.
+ ++mHTTPFailCount;
+ max_attempts = mHTTPFailCount+1; // Keep retrying
+ LL_INFOS_ONCE("Texture") << "Texture server busy (503): " << mUrl << LL_ENDL;
+ }
+ else
+ {
+ const S32 HTTP_MAX_RETRY_COUNT = 3;
+ max_attempts = HTTP_MAX_RETRY_COUNT + 1;
+ ++mHTTPFailCount;
+ llinfos << "HTTP GET failed for: " << mUrl
+ << " Status: " << mGetStatus << " Reason: '" << mGetReason << "'"
+ << " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl;
+ }
if (mHTTPFailCount >= max_attempts)
{
if (cur_size > 0)
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 74fbce890d..b1d09eccba 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -731,14 +731,13 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
// *HACK: We may select this object, so pretend it was clicked
mPick = mHoverPick;
LLInspector::Params p;
+ p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
p.message(avatar_name);
p.image(LLUI::getUIImage("Info"));
p.click_callback(boost::bind(showAvatarInspector, hover_object->getID()));
p.visible_time_near(6.f);
p.visible_time_far(3.f);
p.wrap(false);
-
- p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
LLToolTipMgr::instance().show(p);
}
@@ -822,6 +821,7 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
// We may select this object, so pretend it was clicked
mPick = mHoverPick;
LLInspector::Params p;
+ p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
p.message(tooltip_msg);
p.image(LLUI::getUIImage("Info_Off"));
p.click_callback(boost::bind(showObjectInspector, hover_object->getID(), mHoverPick.mObjectFace));
@@ -833,8 +833,6 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
p.visible_time_near(6.f);
p.visible_time_far(3.f);
p.wrap(false);
-
- p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
LLToolTipMgr::instance().show(p);
}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index f98aa361e0..70bfc67523 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -134,9 +134,21 @@ public:
virtual F64 getMediaInterest() const
{
- F64 tmp = mObject->getTotalMediaInterest();
- return (tmp < 0.0) ? mObject->getPixelArea() : tmp;
+ F64 interest = mObject->getTotalMediaInterest();
+ if (interest < (F64)0.0)
+ {
+ // media interest not valid yet, try pixel area
+ interest = mObject->getPixelArea();
+ // HACK: force recalculation of pixel area if interest is the "magic default" of 1024.
+ if (interest == 1024.f)
+ {
+ const_cast<LLVOVolume*>(static_cast<LLVOVolume*>(mObject))->setPixelAreaAndAngle(gAgent);
+ interest = mObject->getPixelArea();
+ }
+ }
+ return interest;
}
+
virtual bool isInterestingEnough() const
{
return LLViewerMedia::isInterestingEnough(mObject, getMediaInterest());
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 73b5222ee3..4f4fc83819 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -6352,7 +6352,8 @@ void LLPipeline::renderDeferredLighting()
mDeferredLight[0].flush();
- if (gSavedSettings.getBOOL("RenderDeferredBlurLight"))
+ if (gSavedSettings.getBOOL("RenderDeferredBlurLight") &&
+ gSavedSettings.getBOOL("RenderDeferredGI"))
{
LLFastTimer ftm(FTM_EDGE_DETECTION);
//get edge map
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 88e77f11ee..706245a479 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -71,10 +71,14 @@
<color
name="Transparent"
value="0 0 0 0" />
+ <!-- Make potentially unused colors show up bright purple.
+ Leave this here until all Unused? are removed below, otherwise
+ the viewer generates many warnings on startup. -->
+ <color
+ name="Unused?"
+ value="1 0 1 1" />
-
-
- <!-- UI Definitions -->
+ <!-- UI Definitions -->
<color
name="AgentChatColor"
diff --git a/indra/newview/skins/default/textures/icons/SL_Logo.png b/indra/newview/skins/default/textures/icons/SL_Logo.png
new file mode 100644
index 0000000000..c9fbde987a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/SL_Logo.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 412f8b6d68..8a9126208a 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -234,6 +234,7 @@ with the same filename but different name
<texture name="Inv_Gloves" file_name="icons/Inv_Gloves.png" preload="false" />
<texture name="Inv_Hair" file_name="icons/Inv_Hair.png" preload="false" />
<texture name="Inv_LinkItem" file_name="icons/Inv_LinkItem.png" preload="false" />
+ <texture name="Inv_LinkItem_Broken" file_name="icons/Inv_LinkItem_Broken.png" preload="false" />
<texture name="Inv_LinkFolder" file_name="icons/Inv_LinkFolder.png" preload="false" />
<texture name="Inv_Jacket" file_name="icons/Inv_Jacket.png" preload="false" />
<texture name="Inv_LookFolderOpen" file_name="icons/Inv_LookFolderOpen.png" preload="false" />
@@ -487,7 +488,8 @@ with the same filename but different name
<texture name="SliderThumb_Off" file_name="widgets/SliderThumb_Off.png" />
<texture name="SliderThumb_Disabled" file_name="widgets/SliderThumb_Disabled.png" />
<texture name="SliderThumb_Press" file_name="widgets/SliderThumb_Press.png" />
- <texture name="SL_Logo" file_name="map_infohub.tga" />
+
+ <texture name="SL_Logo" file_name="icons/SL_Logo.png" preload="true" />
<texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="Snapshot_Over" file_name="bottomtray/Snapshot_Over.png" preload="false" />
@@ -495,12 +497,12 @@ with the same filename but different name
<texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" />
- <texture name="Stepper_Down_Disabled" file_name="widgets/Stepper_Down_Disabled.png" preload="true" />
- <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="true" />
- <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="true" />
- <texture name="Stepper_Up_Disabled" file_name="widgets/Stepper_Up_Disabled.png" preload="true" />
- <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="true" />
- <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="true" />
+ <texture name="Stepper_Down_Disabled" file_name="widgets/Stepper_Down_Disabled.png" preload="false" />
+ <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="false" />
+ <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="false" />
+ <texture name="Stepper_Up_Disabled" file_name="widgets/Stepper_Up_Disabled.png" preload="false" />
+ <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="false" />
+ <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="false" />
<texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="false" />
<texture name="Stop_Over" file_name="icons/Stop_Over.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml
index 6956b73371..cb4cbd229a 100644
--- a/indra/newview/skins/default/xui/en/floater_aaa.xml
+++ b/indra/newview/skins/default/xui/en/floater_aaa.xml
@@ -15,21 +15,21 @@
title="TEST FLOATER"
save_dock_state="true"
save_visibility="true"
- single_instance="true"
+ single_instance="true"
width="320">
<string name="nudge_parabuild">Nudge 1</string>
<string name="test_the_vlt">This string is extracted.</string>
<chat_history
allow_html="true"
bg_readonly_color="ChatHistoryBgColor"
- bg_writeable_color="ChatHistoryBgColor"
- border_visible="false"
+ bg_writeable_color="ChatHistoryBgColor"
+ border_visible="false"
follows="all"
font="SansSerif"
- left="1"
+ left="1"
top="20"
layout="topleft"
- height="260"
+ height="260"
name="chat_history"
parse_highlights="true"
text_color="ChatHistoryTextColor"
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index a581190d18..cc955369e2 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -4,6 +4,7 @@
height="420"
layout="topleft"
name="floaterland"
+ help_topic="floaterland"
save_rect="true"
title="ABOUT LAND"
width="490">
diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
index fb8893678d..58ba346e50 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -18,6 +18,7 @@
height="300"
layout="topleft"
name="nearby_chat"
+ help_topic="nearby_chat"
save_rect="true"
title="NEARBY CHAT"
save_dock_state="true"
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 2f26e5d0c1..15655a920e 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -7,6 +7,7 @@
height="460"
layout="topleft"
name="Preferences"
+ help_topic="preferences"
single_instance="true"
title="PREFERENCES"
width="620">
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index 9c1a5499db..5a9e2ebe6e 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -4,8 +4,8 @@
can_resize="true"
height="646"
layout="topleft"
- min_height="140"
- min_width="467"
+ min_height="646"
+ min_width="670"
name="floater_search"
help_topic="floater_search"
save_rect="true"
diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml
index 7f31692ad9..32739ac953 100644
--- a/indra/newview/skins/default/xui/en/floater_water.xml
+++ b/indra/newview/skins/default/xui/en/floater_water.xml
@@ -4,6 +4,7 @@
height="240"
layout="topleft"
name="Water Floater"
+ help_topic="water_floater"
save_rect="true"
title="ADVANCED WATER EDITOR"
width="700">
diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml
index e632b67d11..169a0ea676 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -296,7 +296,7 @@
layout="topleft"
name="pg_label"
width="60">
- PG
+ General
</text>
<check_box
@@ -330,7 +330,7 @@
layout="topleft"
name="mature_label"
width="66">
- Mature
+ Moderate
</text>
<check_box
@@ -361,7 +361,7 @@
top_delta="2"
left_pad="3"
layout="topleft"
- name="pg_label"
+ name="adult_label"
width="66">
Adult
</text>
diff --git a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
index d0128d1c9a..1dc1c610cf 100644
--- a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
+++ b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
@@ -19,4 +19,40 @@
<menu_item_call.on_click
function="Profile.Share" />
</menu_item_call>
+ <menu_item_call
+ label="Kick"
+ layout="topleft"
+ name="kick">
+ <menu_item_call.on_click
+ function="Profile.Kick" />
+ <menu_item_call.on_visible
+ function="Profile.EnableGod" />
+ </menu_item_call>
+ <menu_item_call
+ label="Freeze"
+ layout="topleft"
+ name="freeze">
+ <menu_item_call.on_click
+ function="Profile.Freeze" />
+ <menu_item_call.on_visible
+ function="Profile.EnableGod" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unfreeze"
+ layout="topleft"
+ name="unfreeze">
+ <menu_item_call.on_click
+ function="Profile.Unfreeze" />
+ <menu_item_call.on_visible
+ function="Profile.EnableGod" />
+ </menu_item_call>
+ <menu_item_call
+ label="CSR"
+ layout="topleft"
+ name="csr">
+ <menu_item_call.on_click
+ function="Profile.CSR" />
+ <menu_item_call.on_visible
+ function="Profile.EnableGod" />
+ </menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index b4ce32ea1d..8f1799688b 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2975,14 +2975,6 @@
<menu_item_call.on_click
function="Advanced.SendTestIMs" />
</menu_item_call>
- <menu_item_call
- label="Test Inspectors"
- name="Test Inspectors"
- shortcut="control|shift|I">
- <menu_item_call.on_click
- function="Floater.Show"
- parameter="test_inspectors" />
- </menu_item_call>
</menu>
<menu
create_jump_keys="true"
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index 5c99022f35..d6d8e9562b 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -3,7 +3,7 @@
<panel name="Outfits"
background_visible="true"
follows="all"
- height="550"
+ height="570"
label="Things"
layout="topleft"
min_height="350"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 7f4b4aef82..44248eedd5 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -2,23 +2,24 @@
<panel
background_visible="true"
follows="all"
-height="635"
+height="570"
label="Outfits"
layout="topleft"
-min_height="460"
+min_height="350"
+min_width="240"
name="appearance panel"
top="0"
left="0"
- width="333">
+width="333">
<string
name="No Outfit"
value="No Outfit" />
<panel
left="0"
top="0"
- follows="left|top|right"
+ follows="all"
layout="topleft"
- width="333"
+ width="330"
height="33"
name="panel_currentlook"
>
@@ -85,9 +86,9 @@ left="0"
class="panel_outfits_inventory"
filename="panel_outfits_inventory.xml"
name="panel_outfits_inventory"
- height="550"
- min_height="510"
- width="333"
+ height="515"
+ min_height="410"
+ width="320"
top_pad="0"
follows="all"
/>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 7b0b4b0bde..790f8afd3a 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -33,10 +33,10 @@
height="18"
image_name="Lock"
layout="topleft"
- right="-50"
+ right="-15"
mouse_opaque="true"
name="IconLocked"
- top="4"
+ top="8"
width="18" />
<button
follows="top|right"
@@ -60,14 +60,23 @@
use_ellipses="true"
value="Object Profile"
width="275" />
+ <text
+ follows="top|left"
+ height="13"
+ layout="topleft"
+ left="45"
+ name="where"
+ text_color="LtGray_50"
+ value="(Inventory)"
+ width="150" />
<panel
follows="all"
- height="500"
+ height="490"
label=""
layout="topleft"
left="10"
help_topic=""
- top="30"
+ top="45"
width="313"
background_visible="true"
bg_alpha_color="DkGray2">
@@ -125,7 +134,7 @@
layout="topleft"
left="5"
name="LabelCreatorTitle"
-top_pad="10"
+ top_pad="10"
width="78">
Creator:
</text>
@@ -135,7 +144,7 @@ top_pad="10"
default_icon_name="Generic_Person"
layout="topleft"
left_pad="0"
- top_delta="-6"
+ top_delta="-6"
mouse_opaque="true"
width="20" />
<text
@@ -165,28 +174,28 @@ top_pad="10"
follows="left|top"
height="23"
layout="topleft"
- left="5"
+ left="5"
name="LabelOwnerTitle"
-top_pad="5"
+ top_pad="10"
width="78">
Owner:
</text>
<avatar_icon
- follows="top|left"
- height="20"
- default_icon_name="Generic_Person"
- layout="topleft"
- left_pad="0"
- top_delta="-6"
- mouse_opaque="true"
- width="20" />
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-6"
+ mouse_opaque="true"
+ width="20" />
<text
type="string"
- follows="left|right"
- font="SansSerifSmall"
- height="15"
- layout="topleft"
- left_pad="5"
+ follows="left|right"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
name="LabelOwnerName"
top_delta="6"
width="140">
@@ -224,7 +233,7 @@ top_pad="10"
top_delta="0"
width="222">
Wed May 24 12:50:46 2006
- </text>
+ </text>
<panel
border="false"
follows="left|top"
@@ -350,7 +359,7 @@ top_pad="10"
tool_tip="Next owner can give away or resell this object"
width="106" />
</panel>
- <check_box
+ <check_box
height="18"
label="For Sale"
layout="topleft"
@@ -388,144 +397,21 @@ top_pad="10"
height="23"
max_val="999999999"
top_pad="10"/>
- <!--line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_pad="5"
- max_length="25"
- name="EditPrice"
- top_delta="0"
- width="242" /-->
- <!--text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="10"
- name="BaseMaskDebug"
- top="155"
- width="330">
- B:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="60"
- name="OwnerMaskDebug"
- top_delta="0"
- width="270">
- O:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="60"
- name="GroupMaskDebug"
- top_delta="0"
- width="210">
- G:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="60"
- name="EveryoneMaskDebug"
- top_delta="0"
- width="150">
- E:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="60"
- name="NextMaskDebug"
- top_delta="0"
- width="90">
- N:
- </text-->
- <!--text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="10"
- name="SaleLabel"
- top_pad="5"
- width="330">
- Mark Item:
- </text-->
- <!--radio_group
- draw_border="false"
- follows="left|top|right"
- height="16"
- layout="topleft"
- left_delta="78"
- name="RadioSaleType"
- top_delta="0"
- width="252">
- <radio_item
- height="16"
- label="Original"
- layout="topleft"
- left="0"
- name="radio"
- top="0"
- width="70" />
- <radio_item
- height="16"
- label="Copy"
- layout="topleft"
- left_delta="60"
- name="radio2"
- top_delta="0"
- width="70" />
- </radio_group-->
- <!--text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="TextPrice"
- top_pad="5"
- width="78">
- Price: L$
- </text-->
- </panel>
+ </panel>
<panel
- height="25"
+ height="30"
layout="bottomright"
help_topic="button_tab"
name="button_panel"
left="5"
- bottom="5"
+ bottom="2"
width="313">
<button
- follows="bottom|right"
- height="25"
+ height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
right="-1"
- left_pad="10"
width="100" />
- </panel>
-</panel>
+ </panel>
+ </panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index 5b379b54e3..d26e855e2f 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -6,7 +6,7 @@
name="object properties"
help_topic="object_properties"
save_rect="true"
- title="Object Properties"
+ title="Object Profile"
width="333">
<panel.string
name="text deed continued">
@@ -57,127 +57,173 @@
Mixed Sale
</panel.string>
<button
- follows="top|right"
- height="25"
- image_overlay="BackArrow_Off"
- layout="topleft"
- name="back_btn"
- picture_style="true"
- right="-5"
- tab_stop="false"
- top="0"
- width="25" />
+ follows="top|right"
+ height="23"
+ image_overlay="BackArrow_Off"
+ layout="topleft"
+ left="10"
+ name="back_btn"
+ tab_stop="false"
+ top="0"
+ width="23" />
+ <text
+ follows="top|left|right"
+ font="SansSerifHuge"
+ height="26"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="LtGray"
+ top="0"
+ use_ellipses="true"
+ value="Object Profile"
+ width="275" />
+ <text
+ follows="top|left"
+ height="13"
+ layout="topleft"
+ left="45"
+ name="where"
+ text_color="LtGray_50"
+ value="(In World)"
+ width="150" />
<panel
follows="all"
- height="500"
+ height="490"
label=""
layout="topleft"
- left="5"
+ left="10"
help_topic=""
- top="30"
- border="1"
- width="313">
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="10"
+ top="45"
+ width="313"
+ background_visible="true"
+ bg_alpha_color="DkGray2">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
name="Name:"
- top_pad="5"
- width="90">
- Name:
- </text>
- <line_editor
- follows="left|top|right"
- height="19"
- layout="topleft"
- left_pad="0"
- max_length="63"
+ top="10"
+ width="78">
+ Name:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="20"
+ layout="topleft"
+ left_delta="78"
+ max_length="63"
name="Object Name"
- select_on_focus="true"
- top_delta="0"
- width="170" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="10"
+ top_delta="0"
+ width="225" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
name="Description:"
- top_pad="3"
- width="90">
- Description:
- </text>
+ top_pad="10"
+ width="78">
+ Description:
+ </text>
<line_editor
+ border_style="line"
+ border_thickness="1"
follows="left|top|right"
- height="19"
+ height="23"
layout="topleft"
- left_pad="0"
- max_length="127"
name="Object Description"
select_on_focus="true"
- top_delta="0"
- width="170" />
- <text
- type="string"
- left="10"
- length="1"
- follows="left|top"
- height="19"
- layout="topleft"
- name="Creator:"
- width="90">
- Creator:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- left_pad="0"
- height="19"
- layout="topleft"
+ left_delta="78"
+ max_length="127"
+ top_delta="-5"
+ width="225"/>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="CreatorNameLabel"
+ top_pad="10"
+ width="78">
+ Creator:
+ </text>
+ <avatar_icon
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-6"
+ mouse_opaque="true"
+ width="20" />
+ <text
+ type="string"
+ follows="left|right"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
name="Creator Name"
- width="175">
- Esbee Linden
- </text>
- <text
- type="string"
- length="1"
- left="10"
- follows="left|top"
- height="19"
- layout="topleft"
- name="Owner:"
- width="90">
- Owner:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="19"
- layout="topleft"
- name="Owner Name"
- left_pad="0"
- width="175">
- Erica Linden
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- layout="topleft"
- left="10"
- height="18"
- name="Group:"
- top_pad="4"
- width="75">
- Group:
- </text>
- <button
+ top_delta="6"
+ width="140">
+ Erica Linden
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="Owner:"
+ top_pad="10"
+ width="78">
+ Owner:
+ </text>
+ <avatar_icon
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-6"
+ mouse_opaque="true"
+ width="20" />
+ <text
+ type="string"
+ follows="left|right"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
+ name="Owner Name"
+ top_delta="6"
+ width="140">
+ Erica Linden
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="Group_label"
+ top_pad="10"
+ width="78">
+ Group:
+ </text>
+ <button
follows="top|left"
height="10"
image_disabled="Activate_Checkmark"
@@ -203,43 +249,34 @@
width="150" />
<button
follows="top|left"
- height="20"
+ height="23"
label="Deed"
label_selected="Deed"
layout="topleft"
name="button deed"
top_pad="0"
- left="100"
+ left="81"
tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."
- width="80" />
- <check_box
- height="19"
- follows="left|top"
- label="Share"
- layout="topleft"
- name="checkbox share with group"
- tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
- left_pad="3"
width="100" />
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="9"
layout="topleft"
- top_pad="15"
- left="10"
+ top_pad="5"
+ left="5"
name="label click action"
- width="90">
+ width="280">
Click to:
</text>
<combo_box
follows="left|top"
- height="20"
+ height="23"
layout="topleft"
name="clickaction"
width="168"
- left_pad="0">
+ left="81">
<combo_box.item
label="Touch (default)"
name="Touch/grab(default)"
@@ -261,26 +298,131 @@
name="Open"
value="Open" />
</combo_box>
- <check_box
- height="16"
+ <panel
+ border="false"
+ follows="left|top"
+ layout="topleft"
+ mouse_opaque="false"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ name="perms_inv"
+ left="0"
+ top_pad="15"
+ height="135"
+ width="313">
+ <text
+ type="string"
+ length="1"
+ left="10"
top_pad="15"
- label="For Sale:"
+ text_color="EmphasisColor"
+ height="15"
+ follows="left|top|right"
+ layout="topleft"
+ name="perm_modify"
+ width="200">
+ You can modify this object
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="Anyone can:"
+ top_pad="8"
+ width="100">
+ Anyone:
+ </text>
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="checkbox allow everyone copy"
+ top_delta="-2"
+ width="90" />
+ <check_box
+ height="18"
+ label="Move"
layout="topleft"
+ name="checkbox allow everyone move"
+ left_pad="0"
+ width="150" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="GroupLabel"
+ top_pad="8"
+ width="100">
+ Group:
+ </text>
+ <check_box
+ height="18"
+ label="Share"
+ layout="topleft"
+ left_pad="90"
+ top_delta="-2"
+ name="checkbox share with group"
+ tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
+ width="150" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="NextOwnerLabel"
+ top_pad="8"
+ width="200"
+ word_wrap="true">
+ Next owner:
+ </text>
+ <check_box
+ height="18"
+ label="Modify"
+ layout="topleft"
+ left="20"
+ top_pad="0"
+ name="checkbox next owner can modify"
+ width="90" />
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="checkbox next owner can copy"
+ width="90" />
+ <check_box
+ height="18"
+ label="Transfer"
+ layout="topleft"
+ left_pad="0"
+ name="checkbox next owner can transfer"
+ tool_tip="Next owner can give away or resell this object"
+ width="106" />
+ </panel>
+ <check_box
+ height="23"
+ label="For Sale"
+ layout="topleft"
+ left="20"
name="checkbox for sale"
- left="10"
- width="90" />
-<!-- NEW SALE TYPE COMBO BOX -->
- <combo_box
- left_pad="0"
- layout="topleft"
- follows="left|top"
- allow_text_entry="false"
- height="20"
- intial_value="2"
- max_chars="20"
- mouse_opaque="true"
+ top_pad="10"
+ width="100" />
+ <combo_box
+ height="23"
+ left_pad="0"
+ layout="topleft"
+ follows="left|top"
name="sale type"
- width="158">
+ width="170">
<combo_box.item
name="Copy"
label="Copy"
@@ -293,14 +435,13 @@
name="Original"
label="Original"
value="1" />
- </combo_box>
-<!-- NEW PRICE SPINNER -->
- <spinner
+ </combo_box>
+ <spinner
follows="left|top"
decimal_digits="0"
increment="1"
- top_pad="8"
- left="100"
+ top_pad="10"
+ left="120"
control_name="Edit Cost"
name="Edit Cost"
label="Price: L$"
@@ -310,106 +451,25 @@
height="20"
max_val="999999999" />
<check_box
- height="15"
+ height="20"
width="110"
- top_pad="3"
+ top_pad="6"
label="Show in search"
layout="topleft"
- left="100"
+ left="120"
name="search_check"
tool_tip="Let people see this object in search results" />
- <panel
- border="false"
- follows="left|top"
- layout="topleft"
- mouse_opaque="false"
- background_visible="true"
- bg_alpha_color="DkGray"
- name="perms_build"
- left="0"
- top="241"
- height="120"
- width="278">
- <text
- type="string"
- length="1"
- left="10"
- top_pad="9"
- text_color="EmphasisColor"
- height="16"
- follows="left|top|right"
- layout="topleft"
- name="perm_modify"
- width="250">
- You can modify this object
- </text>
- <text
- type="string"
- follows="left|top"
- name="Anyone can:"
- width="250"
- left="10">
- Anyone:
- </text>
- <check_box
- height="19"
- label="Move"
- layout="topleft"
- name="checkbox allow everyone move"
- left="15"
- width="85" />
- <check_box
- height="19"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="checkbox allow everyone copy"
- width="90" />
- <text
- type="string"
- follows="left|top"
- height="19"
- name="Next owner can:"
- width="250"
- left="10">
- Next owner:
- </text>
- <check_box
- follows="left|top|right"
- label="Modify"
- layout="topleft"
- left="15"
- name="checkbox next owner can modify"
- width="85" />
- <check_box
- follows="left|top|right"
- height="19"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="checkbox next owner can copy"
- width="90" />
- <check_box
- follows="left|top|right"
- height="19"
- label="Transfer"
- layout="topleft"
- name="checkbox next owner can transfer"
- left_pad="0"
- top_delta="0"
- tool_tip="Next owner can give away or resell this object"
- width="90" />
<text
type="string"
text_color="EmphasisColor"
length="1"
- top_pad="5"
+ top_pad="15"
follows="left|top"
layout="topleft"
left="10"
name="B:"
height="10"
- width="45">
+ width="50">
B:
</text>
<text
@@ -421,7 +481,7 @@
left_pad="0"
name="O:"
height="10"
- width="44">
+ width="50">
O:
</text>
<text
@@ -433,7 +493,7 @@
left_pad="0"
name="G:"
height="10"
- width="43">
+ width="50">
G:
</text>
<text
@@ -445,7 +505,7 @@
layout="topleft"
name="E:"
height="10"
- width="43">
+ width="50">
E:
</text>
<text
@@ -457,7 +517,7 @@
left_pad="0"
name="N:"
height="10"
- width="48">
+ width="50">
N:
</text>
<text
@@ -473,7 +533,6 @@
F:
</text>
</panel>
- </panel>
<panel
height="25"
layout="bottomright"
@@ -484,30 +543,30 @@
width="313">
<button
follows="bottom|left"
- height="25"
+ height="23"
label="Open"
layout="topleft"
left="5"
name="open_btn"
top="0"
- width="60" />
+ width="100" />
<button
follows="bottom|left"
- height="25"
+ height="23"
label="Pay"
layout="topleft"
left_pad="5"
name="pay_btn"
top="0"
- width="50" />
+ width="100" />
<button
follows="bottom|left"
- height="25"
+ height="23"
label="Buy"
layout="topleft"
left_pad="5"
name="buy_btn"
top="0"
- width="60" />
+ width="100" />
</panel>
</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 9aae04ba38..32eae9d11d 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2904,13 +2904,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="joined_call">Joined the voice call</string>
<string name="ringing-im">
- Joining Voice Chat...
+ Joining voice call...
</string>
<string name="connected-im">
Connected, click End Call to hang up
</string>
<string name="hang_up-im">
- Left Voice Chat
+ Left voice call
</string>
<string name="answering-im">
Connecting...
@@ -2996,4 +2996,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="close_on_no_ability">
You no longer have the ability to be in the chat session.
</string>
+ <string name="unread_chat_single">
+ [SOURCES] has said something new
+ </string>"
+ <string name="unread_chat_multiple">
+ [SOURCES] have said something new
+ </string>"
</strings>
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 2be37d222a..8785dff2ae 100644
--- a/indra/newview/skins/default/xui/en/widgets/chat_history.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chat_history.xml
@@ -11,9 +11,13 @@
top_header_pad="17"
bottom_header_pad="10"
max_length="2147483647"
- enabled="false"
track_bottom="true"
name="chat_history"
type="string"
word_wrap="true"
- font="SansSerif"/>
+ font="SansSerif">
+ <more_chat_text
+ mouse_opaque="true"
+ word_wrap="true"
+ />
+</chat_history>
diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
index 3368fa88ef..3f5a4b8379 100644
--- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
@@ -20,12 +20,12 @@ label_pad_left - padding to the left of tab button labels
tab_top_image_selected="TabTop_Middle_Selected"
tab_bottom_image_unselected="Toolbar_Middle_Off"
tab_bottom_image_selected="Toolbar_Middle_Selected"
- tab_left_image_unselected="TabTop_Middle_Off"
- tab_left_image_selected="TabTop_Middle_Selected"/>
+ tab_left_image_unselected="SegmentedBtn_Left_Disabled"
+ tab_left_image_selected="SegmentedBtn_Left_Off"/>
<last_tab tab_top_image_unselected="TabTop_Right_Off"
tab_top_image_selected="TabTop_Right_Selected"
tab_bottom_image_unselected="Toolbar_Right_Off"
tab_bottom_image_selected="Toolbar_Right_Selected"
- tab_left_image_unselected="TabTop_Middle_Off"
- tab_left_image_selected="TabTop_Middle_Selected"/>
+ tab_left_image_unselected="SegmentedBtn_Left_Disabled"
+ tab_left_image_selected="SegmentedBtn_Left_Off"/>
</tab_container>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index d2859db296..0db18525d7 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -354,6 +354,14 @@ class WindowsManifest(ViewerManifest):
self.path("qtiffd4.dll")
self.end_prefix()
+ # For WebKit/Qt plugin runtimes (codec/character encoding plugins)
+ if self.prefix(src="codecs", dst="codecs"):
+ self.path("qcncodecsd4.dll")
+ self.path("qjpcodecsd4.dll")
+ self.path("qkrcodecsd4.dll")
+ self.path("qtwcodecsd4.dll")
+ self.end_prefix()
+
self.end_prefix()
else:
if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'release'),
@@ -377,6 +385,14 @@ class WindowsManifest(ViewerManifest):
self.path("qtiff4.dll")
self.end_prefix()
+ # For WebKit/Qt plugin runtimes (codec/character encoding plugins)
+ if self.prefix(src="codecs", dst="codecs"):
+ self.path("qcncodecs4.dll")
+ self.path("qjpcodecs4.dll")
+ self.path("qkrcodecs4.dll")
+ self.path("qtwcodecs4.dll")
+ self.end_prefix()
+
self.end_prefix()
self.disable_manifest_check()
diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt
index 89e2d8582d..b4043b0fd9 100644
--- a/indra/test_apps/llplugintest/CMakeLists.txt
+++ b/indra/test_apps/llplugintest/CMakeLists.txt
@@ -428,7 +428,23 @@ if(WINDOWS)
${plugintest_debug_files}
)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-
+
+ # Debug config runtime files required for the plugin test mule (Qt codec plugins)
+ set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug/codecs")
+ set(plugintest_debug_files
+ qcncodecsd4.dll
+ qjpcodecsd4.dll
+ qkrcodecsd4.dll
+ qtwcodecsd4.dll
+ )
+ copy_if_different(
+ ${plugintest_debug_src_dir}
+ "${CMAKE_CURRENT_BINARY_DIR}/Debug/codecs"
+ out_targets
+ ${plugintest_debug_files}
+ )
+ set(plugin_test_targets ${plugin_test_targets} ${out_targets})
+
# Release & ReleaseDebInfo config runtime files required for the plugin test mule
set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
set(plugintest_release_files
@@ -486,6 +502,30 @@ if(WINDOWS)
${plugintest_release_files}
)
set(plugin_test_targets ${plugin_test_targets} ${out_targets})
+
+ # Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt codec plugins)
+ set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release/codecs")
+ set(plugintest_release_files
+ qcncodecs4.dll
+ qjpcodecs4.dll
+ qkrcodecs4.dll
+ qtwcodecs4.dll
+ )
+ copy_if_different(
+ ${plugintest_release_src_dir}
+ "${CMAKE_CURRENT_BINARY_DIR}/Release/codecs"
+ out_targets
+ ${plugintest_release_files}
+ )
+ set(plugin_test_targets ${plugin_test_targets} ${out_targets})
+
+ copy_if_different(
+ ${plugintest_release_src_dir}
+ "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/codecs"
+ out_targets
+ ${plugintest_release_files}
+ )
+ set(plugin_test_targets ${plugin_test_targets} ${out_targets})
add_custom_target(copy_plugintest_libs ALL
DEPENDS
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index 018f691672..364088ab31 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -235,6 +235,8 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
break;
}
+ sendProgressEvent("offline", "indeterminate", mAuthResponse["responses"]);
+
// Here the login service at the current URI is redirecting us
// to some other URI ("indeterminate" -- why not "redirect"?).
// The response should contain another uri to try, with its
@@ -276,7 +278,14 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
// Here we got through all the rewrittenURIs without succeeding. Tell
// caller this didn't work out so well. Of course, the only failure data
// we can reasonably show are from the last of the rewrittenURIs.
- sendProgressEvent("offline", "fail.login", mAuthResponse["responses"]);
+
+ // *NOTE: The response from LLXMLRPCListener's Poller::poll method returns an
+ // llsd with no "responses" node. To make the output from an incomplete login symmetrical
+ // to success, add a data/message and data/reason fields.
+ LLSD error_response;
+ error_response["reason"] = mAuthResponse["status"];
+ error_response["message"] = mAuthResponse["error"];
+ sendProgressEvent("offline", "fail.login", error_response);
}
void LLLogin::Impl::disconnect()