summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorskolb <none@none>2009-12-03 14:33:38 -0800
committerskolb <none@none>2009-12-03 14:33:38 -0800
commitfaa188322a72b86b6a167834a4d2cd664da112bc (patch)
treed498ee9f8642cf17d0b4555b0ad02db42ec73bb2
parentec34503e0193514ffbb1ccb1249013adb0a9e320 (diff)
parent4535fd64fbee1ee0dd3bfe54c090cfa9c56a11b6 (diff)
Merge
-rw-r--r--indra/llcommon/llevents.h10
-rw-r--r--indra/llcommon/lllistenerwrapper.h8
-rw-r--r--indra/llcommon/tests/llerror_test.cpp9
-rw-r--r--indra/llui/llflatlistview.cpp96
-rw-r--r--indra/llui/llflatlistview.h6
-rw-r--r--indra/llui/llview.h2
-rw-r--r--indra/newview/llagentwearables.cpp8
-rw-r--r--indra/newview/llappviewer.cpp2
-rw-r--r--indra/newview/llassetuploadresponders.cpp12
-rw-r--r--indra/newview/llbottomtray.cpp2
-rw-r--r--indra/newview/llchathistory.cpp37
-rw-r--r--indra/newview/llchathistory.h1
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp2
-rw-r--r--indra/newview/llfloaterinventory.cpp22
-rw-r--r--indra/newview/llfloaterinventory.h5
-rw-r--r--indra/newview/llfloateropenobject.cpp6
-rw-r--r--indra/newview/llimview.cpp18
-rw-r--r--indra/newview/llimview.h3
-rw-r--r--indra/newview/llinventorybridge.cpp54
-rw-r--r--indra/newview/llinventorybridge.h1
-rw-r--r--indra/newview/llinventorymodel.cpp107
-rw-r--r--indra/newview/llinventorymodel.h9
-rw-r--r--indra/newview/llinventoryobserver.h7
-rw-r--r--indra/newview/llinventorypanel.cpp381
-rw-r--r--indra/newview/llinventorypanel.h12
-rw-r--r--indra/newview/lllocationinputctrl.cpp2
-rw-r--r--indra/newview/llnearbychat.cpp29
-rw-r--r--indra/newview/llnearbychathandler.cpp18
-rw-r--r--indra/newview/llpanelgroupnotices.cpp3
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp9
-rw-r--r--indra/newview/llpanelimcontrolpanel.h5
-rw-r--r--indra/newview/llpanellandmarks.cpp17
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp4
-rw-r--r--indra/newview/llpanelplaces.cpp18
-rw-r--r--indra/newview/llpanelplacestab.h8
-rw-r--r--indra/newview/llscriptfloater.cpp52
-rw-r--r--indra/newview/llscriptfloater.h11
-rw-r--r--indra/newview/llsidepanelinventory.cpp13
-rw-r--r--indra/newview/llsidepanelinventory.h3
-rw-r--r--indra/newview/llteleporthistory.cpp5
-rw-r--r--indra/newview/lltexturefetch.cpp8
-rw-r--r--indra/newview/lltoolbar.cpp12
-rw-r--r--indra/newview/llviewerfloaterreg.cpp1
-rw-r--r--indra/newview/llviewerinventory.cpp14
-rw-r--r--indra/newview/llviewermenu.cpp122
-rw-r--r--indra/newview/llviewermessage.cpp137
-rw-r--r--indra/newview/llvoicechannel.cpp28
-rw-r--r--indra/newview/llvoicechannel.h1
-rw-r--r--indra/newview/llwearable.cpp10
-rw-r--r--indra/newview/llwearable.h4
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_LinkFolder.pngbin0 -> 296 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_LinkItem.pngbin0 -> 296 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby.xml1
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_my_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml8
-rw-r--r--indra/viewer_components/login/tests/lllogin_test.cpp5
-rw-r--r--install.xml8
61 files changed, 684 insertions, 716 deletions
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index ed714e4e40..a73ada2931 100644
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -257,6 +257,11 @@ namespace LLEventDetail
/// signature.
typedef boost::function<LLBoundListener(const LLEventListener&)> ConnectFunc;
+ /// overload of visit_and_connect() when we have a string identifier available
+ template <typename LISTENER>
+ LLBoundListener visit_and_connect(const std::string& name,
+ const LISTENER& listener,
+ const ConnectFunc& connect_func);
/**
* Utility template function to use Visitor appropriately
*
@@ -271,11 +276,6 @@ namespace LLEventDetail
{
return visit_and_connect("", listener, connect_func);
}
- /// overload of visit_and_connect() when we have a string identifier available
- template <typename LISTENER>
- LLBoundListener visit_and_connect(const std::string& name,
- const LISTENER& listener,
- const ConnectFunc& connect_func);
} // namespace LLEventDetail
/*****************************************************************************
diff --git a/indra/llcommon/lllistenerwrapper.h b/indra/llcommon/lllistenerwrapper.h
index e7bad1423a..2f747fb182 100644
--- a/indra/llcommon/lllistenerwrapper.h
+++ b/indra/llcommon/lllistenerwrapper.h
@@ -24,7 +24,7 @@
* derivation from LLEventTrackable, and so forth.
*/
template <typename LISTENER>
-class LL_COMMON_API LLListenerWrapper: public LLListenerWrapperBase
+class LLListenerWrapper: public LLListenerWrapperBase
{
public:
/// Wrap an arbitrary listener object
@@ -89,7 +89,7 @@ struct ll_template_cast_impl<const LLListenerWrapperBase*, const CLASS<T>*> \
* write llwrap<Wrapper>(boost::bind(...)).
*/
template <template<typename> class WRAPPER, typename T>
-WRAPPER<T> LL_COMMON_API llwrap(const T& listener)
+WRAPPER<T> llwrap(const T& listener)
{
return WRAPPER<T>(listener);
}
@@ -109,7 +109,7 @@ WRAPPER<T> LL_COMMON_API llwrap(const T& listener)
* @endcode
*/
template <class LISTENER>
-class LL_COMMON_API LLCoutListener: public LLListenerWrapper<LISTENER>
+class LLCoutListener: public LLListenerWrapper<LISTENER>
{
typedef LLListenerWrapper<LISTENER> super;
@@ -151,7 +151,7 @@ LLLISTENER_WRAPPER_SUBCLASS(LLCoutListener);
* @endcode
*/
template <class LISTENER>
-class LL_COMMON_API LLLogListener: public LLListenerWrapper<LISTENER>
+class LLLogListener: public LLListenerWrapper<LISTENER>
{
typedef LLListenerWrapper<LISTENER> super;
diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp
index 1558df231a..6785d0cf17 100644
--- a/indra/llcommon/tests/llerror_test.cpp
+++ b/indra/llcommon/tests/llerror_test.cpp
@@ -545,6 +545,15 @@ namespace tut
// output order
void ErrorTestObject::test<10>()
{
+#if LL_LINUX
+ skip("Fails on Linux, see comments");
+// on Linux:
+// [error, 10] fail: 'order is time type location function message: expected
+// '1947-07-08T03:04:05Z INFO: llcommon/tests/llerror_test.cpp(268) :
+// writeReturningLocationAndFunction: apple' actual
+// '1947-07-08T03:04:05Z INFO: llcommon/tests/llerror_test.cpp(268) :
+// LLError::NoClassInfo::writeReturningLocationAndFunction: apple''
+#endif
LLError::setPrintLocation(true);
LLError::setTimeFunction(roswell);
mRecorder.setWantsTime(true);
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index f4a5f1c990..d4c3cfb7b6 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -689,6 +689,17 @@ LLRect LLFlatListView::getSelectedItemsRect()
return rc;
}
+void LLFlatListView::selectFirstItem ()
+{
+ selectItemPair(mItemPairs.front(), true);
+}
+
+void LLFlatListView::selectLastItem ()
+{
+ selectItemPair(mItemPairs.back(), true);
+}
+
+
// virtual
bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selection)
{
@@ -696,53 +707,53 @@ bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selecti
if ( !mItemPairs.size() )
return false;
- item_pair_t* cur_sel_pair = NULL;
+
item_pair_t* to_sel_pair = NULL;
-
+ item_pair_t* cur_sel_pair = NULL;
if ( mSelectedItemPairs.size() )
{
// Take the last selected pair
cur_sel_pair = mSelectedItemPairs.back();
- }
- else
- {
- // If there weren't selected items then choose the first one bases on given direction
- cur_sel_pair = (is_up_direction) ? mItemPairs.back() : mItemPairs.front();
- // Force selection to first item
- to_sel_pair = cur_sel_pair;
- }
-
- // Bases on given direction choose next item to select
- if ( is_up_direction )
- {
- // Find current selected item position in mItemPairs list
- pairs_list_t::reverse_iterator sel_it = std::find(mItemPairs.rbegin(), mItemPairs.rend(), cur_sel_pair);
-
- for (;++sel_it != mItemPairs.rend();)
+ // Bases on given direction choose next item to select
+ if ( is_up_direction )
{
- // skip invisible items
- if ( (*sel_it)->first->getVisible() )
+ // Find current selected item position in mItemPairs list
+ pairs_list_t::reverse_iterator sel_it = std::find(mItemPairs.rbegin(), mItemPairs.rend(), cur_sel_pair);
+
+ for (;++sel_it != mItemPairs.rend();)
{
- to_sel_pair = *sel_it;
- break;
+ // skip invisible items
+ if ( (*sel_it)->first->getVisible() )
+ {
+ to_sel_pair = *sel_it;
+ break;
+ }
}
}
- }
- else
- {
- // Find current selected item position in mItemPairs list
- pairs_list_t::iterator sel_it = std::find(mItemPairs.begin(), mItemPairs.end(), cur_sel_pair);
-
- for (;++sel_it != mItemPairs.end();)
+ else
{
- // skip invisible items
- if ( (*sel_it)->first->getVisible() )
+ // Find current selected item position in mItemPairs list
+ pairs_list_t::iterator sel_it = std::find(mItemPairs.begin(), mItemPairs.end(), cur_sel_pair);
+
+ for (;++sel_it != mItemPairs.end();)
{
- to_sel_pair = *sel_it;
- break;
+ // skip invisible items
+ if ( (*sel_it)->first->getVisible() )
+ {
+ to_sel_pair = *sel_it;
+ break;
+ }
}
}
}
+ else
+ {
+ // If there weren't selected items then choose the first one bases on given direction
+ cur_sel_pair = (is_up_direction) ? mItemPairs.back() : mItemPairs.front();
+ // Force selection to first item
+ to_sel_pair = cur_sel_pair;
+ }
+
if ( to_sel_pair )
{
@@ -920,4 +931,23 @@ void LLFlatListView::onFocusLost()
mSelectedItemsBorder->setVisible(FALSE);
}
+//virtual
+void LLFlatListView::notify(const LLSD& info)
+{
+ if(info.has("action"))
+ {
+ std::string str_action = info["action"];
+ if(str_action == "select_first")
+ {
+ setFocus(true);
+ selectFirstItem();
+ }
+ else if(str_action == "select_last")
+ {
+ setFocus(true);
+ selectLastItem();
+ }
+ }
+}
+
//EOF
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 3867e910c0..9e1e0f90fc 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -279,6 +279,12 @@ public:
bool updateValue(const LLSD& old_value, const LLSD& new_value);
+
+ void selectFirstItem ();
+ void selectLastItem ();
+
+ virtual void notify(const LLSD& info) ;
+
protected:
/** Pairs LLpanel representing a single item LLPanel and LLSD associated with it */
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index d485244a05..c611e4c85f 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -514,6 +514,8 @@ public:
virtual void notifyParent(const LLSD& info);
virtual void notifyChildren(const LLSD& info);
+ virtual void notify(const LLSD& info) {};
+
static const LLViewDrawContext& getDrawContext();
protected:
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index b52b58f9e2..3114a37ada 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -37,7 +37,6 @@
#include "llcallbacklist.h"
#include "llfloatercustomize.h"
-#include "llfloaterinventory.h"
#include "llinventorybridge.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
@@ -704,6 +703,7 @@ U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearabl
void LLAgentWearables::wearableUpdated(LLWearable *wearable)
{
mAvatarObject->wearableUpdated(wearable->getType(), TRUE);
+ wearable->refreshName();
wearable->setLabelUpdated();
// Hack pt 2. If the wearable we just loaded has definition version 24,
@@ -1361,10 +1361,10 @@ void LLAgentWearables::makeNewOutfitDone(S32 type, U32 index)
// Open the inventory and select the first item we added.
if (first_item_id.notNull())
{
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
- if (view)
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (active_panel)
{
- view->getPanel()->setSelection(first_item_id, TAKE_FOCUS_NO);
+ active_panel->setSelection(first_item_id, TAKE_FOCUS_NO);
}
}
}
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 84843138bf..ddc818172d 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1668,7 +1668,7 @@ bool LLAppViewer::initThreads()
// Image decoding
LLAppViewer::sImageDecodeThread = new LLImageDecodeThread(enable_threads && true);
LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true);
- LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && true);
+ LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && false);
LLImage::initClass();
if (LLFastTimer::sLog || LLFastTimer::sMetricLog)
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index d5f9f7ca5d..1d03cc8823 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -42,7 +42,6 @@
#include "llnotify.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
-#include "llfloaterinventory.h"
#include "llpermissionsflags.h"
#include "llpreviewnotecard.h"
#include "llpreviewscript.h"
@@ -287,19 +286,18 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
// Show the preview panel for textures and sounds to let
// user know that the image (or snapshot) arrived intact.
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
- if(view)
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (active_panel)
{
- LLFocusableElement* focus = gFocusMgr.getKeyboardFocus();
-
- view->getPanel()->setSelection(content["new_inventory_item"].asUUID(), TAKE_FOCUS_NO);
+ active_panel->setSelection(content["new_inventory_item"].asUUID(), TAKE_FOCUS_NO);
if((LLAssetType::AT_TEXTURE == asset_type || LLAssetType::AT_SOUND == asset_type)
&& LLFilePicker::instance().getFileCount() <= FILE_COUNT_DISPLAY_THRESHOLD)
{
- view->getPanel()->openSelected();
+ active_panel->openSelected();
}
//LLFloaterInventory::dumpSelectionInformation((void*)view);
// restore keyboard focus
+ LLFocusableElement* focus = gFocusMgr.getKeyboardFocus();
gFocusMgr.setKeyboardFocus(focus);
}
}
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 96c06b1665..6d3d61d4fe 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -391,7 +391,7 @@ bool LLBottomTray::onContextMenuItemEnabled(const LLSD& userdata)
}
else if (item == "can_select_all")
{
- return edit_box->canSelectAll();
+ return edit_box->canSelectAll() && (edit_box->getLength()>0);
}
return true;
}
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 5e17770314..96b5ae5908 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -43,6 +43,7 @@
#include "lltrans.h"
#include "llfloaterreg.h"
#include "llmutelist.h"
+#include "llstylemap.h"
#include "llsidetray.h"//for blocked objects panel
@@ -355,6 +356,7 @@ void LLChatHistory::clear()
{
mLastFromName.clear();
LLTextEditor::clear();
+ mLastFromID = LLUUID::null;
}
void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_chat_history, const LLStyle::Params& input_append_params)
@@ -371,13 +373,25 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
style_params.font.size(font_size);
style_params.font.style(input_append_params.font.style);
- std::string header_text = "[" + chat.mTimeStr + "] ";
- if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
- header_text += chat.mFromName + ": ";
-
if (use_plain_text_chat_history)
{
- appendText(header_text, getText().size() != 0, style_params);
+ appendText("[" + chat.mTimeStr + "] ", getText().size() != 0, style_params);
+
+ if (utf8str_trim(chat.mFromName).size() != 0)
+ {
+ // Don't hotlink any messages from the system (e.g. "Second Life:"), so just add those in plain text.
+ if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() )
+ {
+ 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);
+ }
+ else
+ {
+ appendText(chat.mFromName + ": ", false, style_params);
+ }
+ }
}
else
{
@@ -389,9 +403,11 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
LLDate new_message_time = LLDate::now();
- if (mLastFromName == chat.mFromName &&
- mLastMessageTime.notNull() &&
- (new_message_time.secondsSinceEpoch() - mLastMessageTime.secondsSinceEpoch()) < 60.0 )
+ if (mLastFromName == chat.mFromName
+ && mLastFromID == chat.mFromID
+ && mLastMessageTime.notNull()
+ && (new_message_time.secondsSinceEpoch() - mLastMessageTime.secondsSinceEpoch()) < 60.0
+ )
{
view = getSeparator();
p.top_pad = mTopSeparatorPad;
@@ -417,8 +433,13 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
view->reshape(target_rect.getWidth(), view->getRect().getHeight());
view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
+ std::string header_text = "[" + chat.mTimeStr + "] ";
+ if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
+ header_text += chat.mFromName + ": ";
+
appendWidget(p, header_text, false);
mLastFromName = chat.mFromName;
+ mLastFromID = chat.mFromID;
mLastMessageTime = new_message_time;
}
//Handle IRC styled /me messages.
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index d2cfa53d8b..8ca7dd1d58 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -114,6 +114,7 @@ class LLChatHistory : public LLTextEditor
private:
std::string mLastFromName;
+ LLUUID mLastFromID;
LLDate mLastMessageTime;
std::string mMessageHeaderFilename;
std::string mMessageSeparatorFilename;
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index efdaff3f6a..92df281307 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -122,7 +122,6 @@ void LLNearbyChatToastPanel::addMessage(LLSD& notification)
if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
{
- messageText = messageText.substr(3);
style_params.font.style = "ITALIC";
}
else if( chat_type == CHAT_TYPE_SHOUT)
@@ -208,7 +207,6 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
{
- messageText = messageText.substr(3);
style_params.font.style = "ITALIC";
}
else if( chat_type == CHAT_TYPE_SHOUT)
diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp
index 4a2e1913cd..76c0a7637c 100644
--- a/indra/newview/llfloaterinventory.cpp
+++ b/indra/newview/llfloaterinventory.cpp
@@ -120,28 +120,6 @@ LLFloaterInventory* LLFloaterInventory::showAgentInventory()
}
// static
-LLFloaterInventory* LLFloaterInventory::getActiveInventory()
-{
- LLFloaterInventory* res = NULL;
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
- S32 z_min = S32_MAX;
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
- {
- LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter);
- if (iv)
- {
- S32 z_order = gFloaterView->getZOrder(iv);
- if (z_order < z_min)
- {
- res = iv;
- z_min = z_order;
- }
- }
- }
- return res;
-}
-
-// static
void LLFloaterInventory::cleanup()
{
LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h
index c0de89bff2..b661c391a7 100644
--- a/indra/newview/llfloaterinventory.h
+++ b/indra/newview/llfloaterinventory.h
@@ -55,11 +55,6 @@ public:
BOOL postBuild();
- // Return the active inventory view if there is one. Active is
- // defined as the inventory that is the closest to the front, and
- // is visible.
- static LLFloaterInventory* getActiveInventory();
-
// This method makes sure that an inventory view exists, is
// visible, and has focus. The view chosen is returned.
static LLFloaterInventory* showAgentInventory();
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index 6caa0d60f9..56a86c2cb7 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -195,10 +195,10 @@ void LLFloaterOpenObject::callbackMoveInventory(S32 result, void* data)
if (result == 0)
{
LLFloaterInventory::showAgentInventory();
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
- if (view)
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (active_panel)
{
- view->getPanel()->setSelection(cat->mCatID, TAKE_FOCUS_NO);
+ active_panel->setSelection(cat->mCatID, TAKE_FOCUS_NO);
}
}
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 5481ca97cd..d3058e67af 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -165,7 +165,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
if(mVoiceChannel)
{
- mVoiceChannel->setStateChangedCallback(boost::bind(&LLIMSession::onVoiceChannelStateChanged, this, _1, _2));
+ mVoiceChannelStateChangeConnection = mVoiceChannel->setStateChangedCallback(boost::bind(&LLIMSession::onVoiceChannelStateChanged, this, _1, _2));
}
mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);
@@ -270,9 +270,11 @@ LLIMModel::LLIMSession::~LLIMSession()
}
}
+ mVoiceChannelStateChangeConnection.disconnect();
+
// HAVE to do this here -- if it happens in the LLVoiceChannel destructor it will call the wrong version (since the object's partially deconstructed at that point).
mVoiceChannel->deactivate();
-
+
delete mVoiceChannel;
mVoiceChannel = NULL;
}
@@ -1392,13 +1394,13 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
}
else
{
- LLUUID session_id = gIMMgr->addSession(
+ LLUUID new_session_id = gIMMgr->addSession(
mPayload["session_name"].asString(),
type,
session_id);
- if (session_id != LLUUID::null)
+ if (new_session_id != LLUUID::null)
{
- LLIMFloater::show(session_id);
+ LLIMFloater::show(new_session_id);
}
std::string url = gAgent.getRegion()->getCapability(
@@ -1486,13 +1488,13 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
}
else
{
- LLUUID session_id = gIMMgr->addSession(
+ LLUUID new_session_id = gIMMgr->addSession(
payload["session_name"].asString(),
type,
session_id);
- if (session_id != LLUUID::null)
+ if (new_session_id != LLUUID::null)
{
- LLIMFloater::show(session_id);
+ LLIMFloater::show(new_session_id);
}
std::string url = gAgent.getRegion()->getCapability(
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 66f92c83a5..8a0f57deb0 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -72,6 +72,9 @@ public:
LLUUID mOtherParticipantID;
std::vector<LLUUID> mInitialTargetIDs;
+ // connection to voice channel state change signal
+ boost::signals2::connection mVoiceChannelStateChangeConnection;
+
//does NOT include system messages
S32 mNumUnread;
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index ac6aa307f2..5bfad0695c 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -38,7 +38,6 @@
#include "llappearancemgr.h"
#include "llavataractions.h"
#include "llfloatercustomize.h"
-#include "llfloaterinventory.h"
#include "llfloateropenobject.h"
#include "llfloaterreg.h"
#include "llfloaterworldmap.h"
@@ -125,8 +124,8 @@ std::string ICON_NAME[ICON_NAME_COUNT] =
"Inv_Animation",
"Inv_Gesture",
- "inv_item_linkitem.tga",
- "inv_item_linkfolder.tga"
+ "Inv_LinkItem",
+ "Inv_LinkFolder"
};
// +=================================================+
@@ -516,7 +515,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
if (obj && obj->getIsLinkType())
{
items.push_back(std::string("Find Original"));
- if (LLAssetType::lookupIsLinkType(obj->getType()))
+ if (isLinkedObjectMissing())
{
disabled_items.push_back(std::string("Find Original"));
}
@@ -666,6 +665,20 @@ BOOL LLInvFVBridge::isLinkedObjectInTrash() const
return FALSE;
}
+BOOL LLInvFVBridge::isLinkedObjectMissing() const
+{
+ const LLInventoryObject *obj = getInventoryObject();
+ if (!obj)
+ {
+ return TRUE;
+ }
+ if (obj->getIsLinkType() && LLAssetType::lookupIsLinkType(obj->getType()))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
BOOL LLInvFVBridge::isAgentInventory() const
{
const LLInventoryModel* model = getInventoryModel();
@@ -856,9 +869,6 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
new_listener = new LLFolderBridge(inventory, uuid);
break;
case LLAssetType::AT_LINK:
- // Only should happen for broken links.
- new_listener = new LLLinkItemBridge(inventory, uuid);
- break;
case LLAssetType::AT_LINK_FOLDER:
// Only should happen for broken links.
new_listener = new LLLinkItemBridge(inventory, uuid);
@@ -1055,7 +1065,7 @@ void LLItemBridge::gotoItem(LLFolderView *folder)
LLInventoryObject *obj = getInventoryObject();
if (obj && obj->getIsLinkType())
{
- LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel();
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
if (active_panel)
{
active_panel->setSelection(obj->getLinkedUUID(), TAKE_FOCUS_NO);
@@ -2941,9 +2951,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// everything in the active window so that we don't follow
// the selection to its new location (which is very
// annoying).
- if (LLFloaterInventory::getActiveInventory())
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (active_panel)
{
- LLInventoryPanel* active_panel = LLFloaterInventory::getActiveInventory()->getPanel();
LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
if (active_panel && (panel != active_panel))
{
@@ -4091,7 +4101,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
items.push_back(std::string("Detach From Yourself"));
}
else
- if( !isInTrash() && !isLinkedObjectInTrash() )
+ if( !isInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing())
{
items.push_back(std::string("Attach Separator"));
items.push_back(std::string("Object Wear"));
@@ -4490,16 +4500,20 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else
{ // FWIW, it looks like SUPPRESS_OPEN_ITEM is not set anywhere
- BOOL no_open = ((flags & SUPPRESS_OPEN_ITEM) == SUPPRESS_OPEN_ITEM);
+ BOOL can_open = ((flags & SUPPRESS_OPEN_ITEM) != SUPPRESS_OPEN_ITEM);
// If we have clothing, don't add "Open" as it's the same action as "Wear" SL-18976
LLViewerInventoryItem* item = getItem();
- if( !no_open && item )
+ if (can_open && item)
{
- no_open = (item->getType() == LLAssetType::AT_CLOTHING) ||
- (item->getType() == LLAssetType::AT_BODYPART);
+ can_open = (item->getType() != LLAssetType::AT_CLOTHING) &&
+ (item->getType() != LLAssetType::AT_BODYPART);
}
- if (!no_open)
+ if (isLinkedObjectMissing())
+ {
+ can_open = FALSE;
+ }
+ if (can_open)
{
items.push_back(std::string("Open"));
}
@@ -4519,7 +4533,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
disabled_items.push_back(std::string("Wearable Edit"));
}
// Don't allow items to be worn if their baseobj is in the trash.
- if (isLinkedObjectInTrash())
+ if (isLinkedObjectInTrash() || isLinkedObjectMissing())
{
disabled_items.push_back(std::string("Wearable Wear"));
disabled_items.push_back(std::string("Wearable Add"));
@@ -5091,7 +5105,7 @@ LLUIImagePtr LLLinkItemBridge::getIcon() const
{
if (LLViewerInventoryItem *item = getItem())
{
- return get_item_icon(item->getActualType(), LLInventoryType::IT_NONE, 0, FALSE);
+ return get_item_icon(item->getActualType(), item->getInventoryType(), 0, FALSE);
}
return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE);
}
@@ -5103,6 +5117,9 @@ void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
std::vector<std::string> items;
std::vector<std::string> disabled_items;
+ items.push_back(std::string("Find Original"));
+ disabled_items.push_back(std::string("Find Original"));
+
if(isInTrash())
{
items.push_back(std::string("Purge Item"));
@@ -5115,6 +5132,7 @@ void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else
{
+ items.push_back(std::string("Properties"));
items.push_back(std::string("Delete"));
if (!isItemRemovable())
{
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index ef340af0cb..67dfc5b6f9 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -191,6 +191,7 @@ protected:
BOOL isInTrash() const;
BOOL isLinkedObjectInTrash() const; // Is this obj or its baseobj in the trash?
+ BOOL isLinkedObjectMissing() const; // Is this a linked obj whose baseobj is not in inventory?
BOOL isAgentInventory() const; // false if lost or in the inventory library
BOOL isCOFFolder() const; // true if COF or descendent of.
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 9f96ebc366..29096ff718 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -36,10 +36,10 @@
#include "llagent.h"
#include "llagentwearables.h"
#include "llinventorypanel.h"
-#include "llfloaterinventory.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
#include "llinventoryobserver.h"
+#include "llinventorypanel.h"
#include "llnotificationsutil.h"
#include "llwindow.h"
#include "llviewercontrol.h"
@@ -871,46 +871,48 @@ void LLInventoryModel::moveObject(const LLUUID& object_id, const LLUUID& cat_id)
// Delete a particular inventory object by ID.
void LLInventoryModel::deleteObject(const LLUUID& id)
{
- // Disabling this; let users manually purge linked objects.
- // purgeLinkedObjects(id);
lldebugs << "LLInventoryModel::deleteObject()" << llendl;
LLPointer<LLInventoryObject> obj = getObject(id);
- if(obj)
+ if (!obj)
{
- lldebugs << "Deleting inventory object " << id << llendl;
- mLastItem = NULL;
- LLUUID parent_id = obj->getParentUUID();
- mCategoryMap.erase(id);
- mItemMap.erase(id);
- //mInventory.erase(id);
- item_array_t* item_list = getUnlockedItemArray(parent_id);
- if(item_list)
- {
- LLViewerInventoryItem* item = (LLViewerInventoryItem*)((LLInventoryObject*)obj);
- item_list->removeObj(item);
- }
- cat_array_t* cat_list = getUnlockedCatArray(parent_id);
- if(cat_list)
- {
- LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)((LLInventoryObject*)obj);
- cat_list->removeObj(cat);
- }
- item_list = getUnlockedItemArray(id);
- if(item_list)
- {
- delete item_list;
- mParentChildItemTree.erase(id);
- }
- cat_list = getUnlockedCatArray(id);
- if(cat_list)
- {
- delete cat_list;
- mParentChildCategoryTree.erase(id);
- }
- addChangedMask(LLInventoryObserver::REMOVE, id);
- obj = NULL; // delete obj
- gInventory.notifyObservers();
+ llwarns << "Deleting non-existent object [ id: " << id << " ] " << llendl;
+ return;
+ }
+
+ lldebugs << "Deleting inventory object " << id << llendl;
+ mLastItem = NULL;
+ LLUUID parent_id = obj->getParentUUID();
+ mCategoryMap.erase(id);
+ mItemMap.erase(id);
+ //mInventory.erase(id);
+ item_array_t* item_list = getUnlockedItemArray(parent_id);
+ if(item_list)
+ {
+ LLViewerInventoryItem* item = (LLViewerInventoryItem*)((LLInventoryObject*)obj);
+ item_list->removeObj(item);
}
+ cat_array_t* cat_list = getUnlockedCatArray(parent_id);
+ if(cat_list)
+ {
+ LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)((LLInventoryObject*)obj);
+ cat_list->removeObj(cat);
+ }
+ item_list = getUnlockedItemArray(id);
+ if(item_list)
+ {
+ delete item_list;
+ mParentChildItemTree.erase(id);
+ }
+ cat_list = getUnlockedCatArray(id);
+ if(cat_list)
+ {
+ delete cat_list;
+ mParentChildCategoryTree.erase(id);
+ }
+ addChangedMask(LLInventoryObserver::REMOVE, id);
+ obj = NULL; // delete obj
+ updateLinkedObjectsFromPurge(id);
+ gInventory.notifyObservers();
}
// Delete a particular inventory item by ID, and remove it from the server.
@@ -926,26 +928,23 @@ void LLInventoryModel::purgeObject(const LLUUID &id)
}
}
-void LLInventoryModel::purgeLinkedObjects(const LLUUID &id)
+void LLInventoryModel::updateLinkedObjectsFromPurge(const LLUUID &baseobj_id)
{
- LLInventoryObject* objectp = getObject(id);
- if (!objectp) return;
-
- if (objectp->getIsLinkType())
- {
- return;
- }
+ LLInventoryModel::item_array_t item_array = collectLinkedItems(baseobj_id);
- LLInventoryModel::item_array_t item_array = collectLinkedItems(id);
-
- for (LLInventoryModel::item_array_t::iterator iter = item_array.begin();
+ // REBUILD is expensive, so clear the current change list first else
+ // everything else on the changelist will also get rebuilt.
+ gInventory.notifyObservers();
+ for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
iter != item_array.end();
iter++)
{
- LLViewerInventoryItem *linked_item = (*iter);
- if (linked_item->getUUID() == id) continue;
- purgeObject(linked_item->getUUID());
+ const LLViewerInventoryItem *linked_item = (*iter);
+ const LLUUID &item_id = linked_item->getUUID();
+ if (item_id == baseobj_id) continue;
+ addChangedMask(LLInventoryObserver::REBUILD, item_id);
}
+ gInventory.notifyObservers();
}
// This is a method which collects the descendents of the id
@@ -3048,10 +3047,10 @@ void LLInventoryModel::processUpdateInventoryFolder(LLMessageSystem* msg,
gInventory.notifyObservers();
// *HACK: Do the 'show' logic for a new item in the inventory.
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
- if(view)
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (active_panel)
{
- view->getPanel()->setSelection(lastfolder->getUUID(), TAKE_FOCUS_NO);
+ active_panel->setSelection(lastfolder->getUUID(), TAKE_FOCUS_NO);
}
}
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 50f54cb842..c3e04ab93c 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -82,6 +82,8 @@ public:
// These are used a lot...
typedef LLDynamicArray<LLPointer<LLViewerInventoryCategory> > cat_array_t;
typedef LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array_t;
+ typedef std::set<LLUUID> changed_items_t;
+
// construction & destruction
LLInventoryModel();
~LLInventoryModel();
@@ -214,9 +216,9 @@ public:
void deleteObject(const LLUUID& id);
// delete a particular inventory object by ID, and delete it from
- // the server. Also purges linked items via purgeLinkedObjects.
+ // the server. Also updates linked items.
void purgeObject(const LLUUID& id);
- void purgeLinkedObjects(const LLUUID& id);
+ void updateLinkedObjectsFromPurge(const LLUUID& baseobj_id);
// This is a method which collects the descendants of the id
// provided. If the category is not found, no action is
@@ -269,7 +271,7 @@ public:
// that the next notify will include that notification.
void addChangedMask(U32 mask, const LLUUID& referent);
- const std::set<LLUUID>& getChangedIDs() { return mChangedItemIDs; }
+ const changed_items_t& getChangedIDs() const { return mChangedItemIDs; }
// This method to prepares a set of mock inventory which provides
// minimal functionality before the actual arrival of inventory.
@@ -451,7 +453,6 @@ protected:
private:
// Variables used to track what has changed since the last notify.
U32 mModifyMask;
- typedef std::set<LLUUID> changed_items_t;
changed_items_t mChangedItemIDs;
std::map<LLUUID, bool> mCategoryLock;
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index 4ee6c48cb1..99e6dbe3c8 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -56,11 +56,12 @@ public:
{
NONE = 0,
LABEL = 1, // name changed
- INTERNAL = 2, // internal change, eg, asset uuid different
+ INTERNAL = 2, // internal change (e.g. asset uuid different)
ADD = 4, // something added
REMOVE = 8, // something deleted
- STRUCTURE = 16, // structural change, eg, item or folder moved
- CALLING_CARD = 32, // online, grant status, cancel, etc change
+ STRUCTURE = 16, // structural change (eg item or folder moved)
+ CALLING_CARD = 32, // (eg online, grant status, cancel)
+ REBUILD = 64, // item UI changed (eg item type different)
ALL = 0xffffffff
};
LLInventoryObserver();
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 0c893dddd6..baa659df7c 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -31,20 +31,22 @@
*/
#include "llviewerprecompiledheaders.h"
+#include "llinventorypanel.h"
#include <utility> // for std::pair<>
-#include "llinventorypanel.h"
-
#include "llagent.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
+#include "llfloaterinventory.h"
#include "llfloaterreg.h"
+#include "llimfloater.h"
#include "llimview.h"
#include "llinventorybridge.h"
+#include "llsidepanelinventory.h"
+#include "llsidetray.h"
#include "llscrollcontainer.h"
#include "llviewerfoldertype.h"
-#include "llimfloater.h"
#include "llvoavatarself.h"
static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
@@ -65,7 +67,10 @@ class LLInventoryPanelObserver : public LLInventoryObserver
public:
LLInventoryPanelObserver(LLInventoryPanel* ip) : mIP(ip) {}
virtual ~LLInventoryPanelObserver() {}
- virtual void changed(U32 mask);
+ virtual void changed(U32 mask)
+ {
+ mIP->modelChanged(mask);
+ }
protected:
LLInventoryPanel* mIP;
};
@@ -109,7 +114,7 @@ BOOL LLInventoryPanel::postBuild()
mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
- // create root folder
+ // Create root folder
{
LLRect folder_rect(0,
0,
@@ -128,7 +133,7 @@ BOOL LLInventoryPanel::postBuild()
mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
- // scroller
+ // Scroller
{
LLRect scroller_view_rect = getRect();
scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
@@ -139,23 +144,21 @@ BOOL LLInventoryPanel::postBuild()
p.reserve_scroll_corner(true);
p.tab_stop(true);
mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
+ addChild(mScroller);
+ mScroller->addChild(mFolders);
+ mFolders->setScrollContainer(mScroller);
}
- addChild(mScroller);
- mScroller->addChild(mFolders);
-
- mFolders->setScrollContainer(mScroller);
- // set up the callbacks from the inventory we're viewing, and then
- // build everything.
+ // Set up the callbacks from the inventory we're viewing, and then build everything.
mInventoryObserver = new LLInventoryPanelObserver(this);
mInventory->addObserver(mInventoryObserver);
- // build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback
+ // Build view of inventory if we need default full hierarchy and inventory ready,
+ // otherwise wait for idle callback.
if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mViewsInitialized)
{
initializeViews();
}
-
gIdleCallbacks.addFunction(onIdle, (void*)this);
if (mSortOrderSetting != INHERIT_SORT_ORDER)
@@ -173,7 +176,6 @@ BOOL LLInventoryPanel::postBuild()
LLInventoryPanel::~LLInventoryPanel()
{
- // should this be a global setting?
if (mFolders)
{
U32 sort_order = mFolders->getSortOrder();
@@ -189,17 +191,19 @@ LLInventoryPanel::~LLInventoryPanel()
mScroller = NULL;
}
-LLMemType mt(LLMemType::MTYPE_INVENTORY_FROM_XML); // ! BUG ! Should this be removed?
void LLInventoryPanel::draw()
{
- // select the desired item (in case it wasn't loaded when the selection was requested)
+ // Select the desired item (in case it wasn't loaded when the selection was requested)
mFolders->updateSelection();
LLPanel::draw();
}
LLInventoryFilter* LLInventoryPanel::getFilter()
{
- if (mFolders) return mFolders->getFilter();
+ if (mFolders)
+ {
+ return mFolders->getFilter();
+ }
return NULL;
}
@@ -249,133 +253,152 @@ LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState()
return mFolders->getFilter()->getShowFolderState();
}
-static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh");
-
void LLInventoryPanel::modelChanged(U32 mask)
{
+ static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh");
LLFastTimer t2(FTM_REFRESH);
bool handled = false;
- if (!mViewsInitialized)
- {
- return;
- }
+ if (!mViewsInitialized) return;
- if (mask & LLInventoryObserver::LABEL)
- {
- handled = true;
- // label change - empty out the display name for each object
- // in this change set.
- const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
- std::set<LLUUID>::const_iterator id_it = changed_items.begin();
- std::set<LLUUID>::const_iterator id_end = changed_items.end();
- LLFolderViewItem* view = NULL;
- LLInvFVBridge* bridge = NULL;
- for (;id_it != id_end; ++id_it)
+ const LLInventoryModel* model = getModel();
+ if (!model) return;
+
+ const LLInventoryModel::changed_items_t& changed_items = model->getChangedIDs();
+ if (changed_items.empty()) return;
+
+ for (LLInventoryModel::changed_items_t::const_iterator items_iter = changed_items.begin();
+ items_iter != changed_items.end();
+ ++items_iter)
+ {
+ const LLUUID& item_id = (*items_iter);
+ const LLInventoryObject* model_item = model->getObject(item_id);
+ LLFolderViewItem* view_item = mFolders->getItemByID(item_id);
+
+ //////////////////////////////
+ // LABEL Operation
+ // Empty out the display name for relabel.
+ if (mask & LLInventoryObserver::LABEL)
{
- view = mFolders->getItemByID(*id_it);
- if(view)
+ handled = true;
+ if (view_item)
{
- // request refresh on this item (also flags for filtering)
- bridge = (LLInvFVBridge*)view->getListener();
+ // Request refresh on this item (also flags for filtering)
+ LLInvFVBridge* bridge = (LLInvFVBridge*)view_item->getListener();
if(bridge)
{ // Clear the display name first, so it gets properly re-built during refresh()
bridge->clearDisplayName();
}
- view->refresh();
+ view_item->refresh();
}
}
- }
- // We don't really care which of these masks the item is actually flagged with, since the masks
- // may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
- // Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
- // panel). What's relevant is that the item and UI are probably out of sync and thus need to be
- // resynchronized.
- if (mask & (LLInventoryObserver::STRUCTURE |
- LLInventoryObserver::ADD |
- LLInventoryObserver::REMOVE))
- {
- handled = true;
- // Record which folders are open by uuid.
- LLInventoryModel* model = getModel();
- if (model)
+ //////////////////////////////
+ // REBUILD Operation
+ // Destroy and regenerate the UI.
+ if (mask & LLInventoryObserver::REBUILD)
{
- const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
+ handled = true;
+ if (model_item && view_item)
+ {
+ view_item->destroyView();
+ }
+ buildNewViews(item_id);
+ }
- std::set<LLUUID>::const_iterator id_it = changed_items.begin();
- std::set<LLUUID>::const_iterator id_end = changed_items.end();
- for (;id_it != id_end; ++id_it)
+ //////////////////////////////
+ // INTERNAL Operation
+ // This could be anything. For now, just refresh the item.
+ if (mask & LLInventoryObserver::INTERNAL)
+ {
+ if (view_item)
{
- // sync view with model
- LLInventoryObject* model_item = model->getObject(*id_it);
- LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
+ view_item->refresh();
+ }
+ }
+
+ // We don't typically care which of these masks the item is actually flagged with, since the masks
+ // may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
+ // Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
+ // panel). What's relevant is that the item and UI are probably out of sync and thus need to be
+ // resynchronized.
+ if (mask & (LLInventoryObserver::STRUCTURE |
+ LLInventoryObserver::ADD |
+ LLInventoryObserver::REMOVE))
+ {
+ handled = true;
- // Item exists in memory but a UI element hasn't been created for it.
- if (model_item && !view_item)
+ //////////////////////////////
+ // ADD Operation
+ // Item exists in memory but a UI element hasn't been created for it.
+ if (model_item && !view_item)
+ {
+ // Add the UI element for this item.
+ buildNewViews(item_id);
+ // Select any newly created object that has the auto rename at top of folder root set.
+ if(mFolders->getRoot()->needsAutoRename())
{
- // Add the UI element for this item.
- buildNewViews(*id_it);
- // Select any newly created object that has the auto rename at top of folder root set.
- if(mFolders->getRoot()->needsAutoRename())
- {
- setSelection(*id_it, FALSE);
- }
+ setSelection(item_id, FALSE);
}
+ }
- // This item already exists in both memory and UI. It was probably moved
- // around in the panel's directory structure (i.e. reparented).
- if (model_item && view_item)
+ //////////////////////////////
+ // STRUCTURE Operation
+ // This item already exists in both memory and UI. It was probably reparented.
+ if (model_item && view_item)
+ {
+ // Don't process the item if it's hanging from the root, since its
+ // model_item's parent will be NULL.
+ if (view_item->getRoot() != view_item->getParent())
{
- // Don't process the item if it's hanging from the root, since its
- // model_item's parent will be NULL.
- if (view_item->getRoot() != view_item->getParent())
+ LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
+ // Item has been moved.
+ if (view_item->getParentFolder() != new_parent)
{
- LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
- // Item has been moved.
- if (view_item->getParentFolder() != new_parent)
+ if (new_parent != NULL)
+ {
+ // Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
+ view_item->getParentFolder()->extractItem(view_item);
+ view_item->addToFolder(new_parent, mFolders);
+ }
+ else
{
- if (new_parent != NULL)
- {
- // Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
- view_item->getParentFolder()->extractItem(view_item);
- view_item->addToFolder(new_parent, mFolders);
- }
- else
- {
- // Item is to be moved outside the panel's directory (e.g. moved to trash for a panel that
- // doesn't include trash). Just remove the item's UI.
- view_item->destroyView();
- }
+ // Item is to be moved outside the panel's directory (e.g. moved to trash for a panel that
+ // doesn't include trash). Just remove the item's UI.
+ view_item->destroyView();
}
}
}
-
- // This item has been removed from memory, but its associated UI element still exists.
- if (!model_item && view_item)
- {
- // Remove the item's UI.
- view_item->destroyView();
- }
+ }
+
+ //////////////////////////////
+ // REMOVE Operation
+ // This item has been removed from memory, but its associated UI element still exists.
+ if (!model_item && view_item)
+ {
+ // Remove the item's UI.
+ view_item->destroyView();
}
}
}
+ /* I don't think we need this code, but not positive -- Seraph
if (!handled)
{
- // it's a small change that only requires a refresh.
+ // It's a small change that only requires a refresh.
// *TODO: figure out a more efficient way to do the refresh
// since it is expensive on large inventories
mFolders->refresh();
}
+ */
}
// static
void LLInventoryPanel::onIdle(void *userdata)
{
LLInventoryPanel *self = (LLInventoryPanel*)userdata;
- // inventory just initialized, do complete build
+ // Inventory just initialized, do complete build
if (!self->mViewsInitialized && gInventory.isInventoryUsable())
{
self->initializeViews();
@@ -388,8 +411,7 @@ void LLInventoryPanel::onIdle(void *userdata)
void LLInventoryPanel::initializeViews()
{
- if (!gInventory.isInventoryUsable())
- return;
+ if (!gInventory.isInventoryUsable()) return;
// Determine the root folder in case specified, and
// build the views starting with that folder.
@@ -412,7 +434,7 @@ void LLInventoryPanel::initializeViews()
void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
{
- // Destroy the old view for this ID so we can rebuild it
+ // Destroy the old view for this ID so we can rebuild it.
LLFolderViewItem* old_view = mFolders->getItemByID(id);
if (old_view && id.notNull())
{
@@ -437,21 +459,21 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
}
else if ((mStartFolderID != LLUUID::null) && (!gInventory.isObjectDescendentOf(id, mStartFolderID)))
{
- // This item exists outside the inventory's hierarchy,
- // so don't add it.
+ // This item exists outside the inventory's hierarchy, so don't add it.
return;
}
if (objectp->getType() <= LLAssetType::AT_NONE ||
objectp->getType() >= LLAssetType::AT_COUNT)
{
- llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " <<
- ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() << llendl;
+ llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : "
+ << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
+ << llendl;
return;
}
- if (objectp->getType() == LLAssetType::AT_CATEGORY &&
- objectp->getActualType() != LLAssetType::AT_LINK_FOLDER)
+ if ((objectp->getType() == LLAssetType::AT_CATEGORY) &&
+ (objectp->getActualType() != LLAssetType::AT_LINK_FOLDER))
{
LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
objectp->getType(),
@@ -471,9 +493,8 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
folderp->setItemSortOrder(mFolders->getSortOrder());
itemp = folderp;
- // Hide the root folder, so we can show the contents of a folder
- // flat but still have the parent folder present for listener-related
- // operations.
+ // Hide the root folder, so we can show the contents of a folder flat
+ // but still have the parent folder present for listener-related operations.
if (id == mStartFolderID)
{
folderp->setDontShowInHierarchy(TRUE);
@@ -482,7 +503,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
}
else
{
- // Build new view for item
+ // Build new view for item.
LLInventoryItem* item = (LLInventoryItem*)objectp;
LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
item->getActualType(),
@@ -518,23 +539,26 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
{
LLViewerInventoryCategory::cat_array_t* categories;
LLViewerInventoryItem::item_array_t* items;
-
mInventory->lockDirectDescendentArrays(id, categories, items);
+
if(categories)
{
- S32 count = categories->count();
- for(S32 i = 0; i < count; ++i)
+ for (LLViewerInventoryCategory::cat_array_t::const_iterator cat_iter = categories->begin();
+ cat_iter != categories->end();
+ ++cat_iter)
{
- LLInventoryCategory* cat = categories->get(i);
+ const LLViewerInventoryCategory* cat = (*cat_iter);
buildNewViews(cat->getUUID());
}
}
+
if(items)
{
- S32 count = items->count();
- for(S32 i = 0; i < count; ++i)
+ for (LLViewerInventoryItem::item_array_t::const_iterator item_iter = items->begin();
+ item_iter != items->end();
+ ++item_iter)
{
- LLInventoryItem* item = items->get(i);
+ const LLViewerInventoryItem* item = (*item_iter);
buildNewViews(item->getUUID());
}
}
@@ -562,39 +586,6 @@ void LLInventoryPanel::defaultOpenInventory()
}
}
-struct LLConfirmPurgeData
-{
- LLUUID mID;
- LLInventoryModel* mModel;
-};
-
-class LLIsNotWorn : public LLInventoryCollectFunctor
-{
-public:
- LLIsNotWorn() {}
- virtual ~LLIsNotWorn() {}
- virtual bool operator()(LLInventoryCategory* cat,
- LLInventoryItem* item)
- {
- return !gAgentWearables.isWearingItem(item->getUUID());
- }
-};
-
-class LLOpenFolderByID : public LLFolderViewFunctor
-{
-public:
- LLOpenFolderByID(const LLUUID& id) : mID(id) {}
- virtual ~LLOpenFolderByID() {}
- virtual void doFolder(LLFolderViewFolder* folder)
- {
- if (folder->getListener() && folder->getListener()->getUUID() == mID) folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
- }
- virtual void doItem(LLFolderViewItem* item) {}
-protected:
- const LLUUID& mID;
-};
-
-
void LLInventoryPanel::openSelected()
{
LLFolderViewItem* folder_item = mFolders->getCurSelectedItem();
@@ -659,7 +650,6 @@ void LLInventoryPanel::onFocusReceived()
LLPanel::onFocusReceived();
}
-
void LLInventoryPanel::openAllFolders()
{
mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
@@ -696,8 +686,6 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it
// Seraph - Put determineFolderType in here for ensemble typing?
}
-//----------------------------------------------------------------------------
-
void LLInventoryPanel::doToSelected(const LLSD& userdata)
{
mFolders->doToSelected(&gInventory, userdata);
@@ -855,55 +843,56 @@ bool LLInventoryPanel::attachObject(const LLSD& userdata)
return true;
}
+BOOL LLInventoryPanel::getSinceLogoff()
+{
+ return mFolders->getFilter()->isSinceLogoff();
+}
-//----------------------------------------------------------------------------
-
-// static DEBUG ONLY:
+// DEBUG ONLY
+// static
void LLInventoryPanel::dumpSelectionInformation(void* user_data)
{
LLInventoryPanel* iv = (LLInventoryPanel*)user_data;
iv->mFolders->dumpSelectionInformation();
}
-BOOL LLInventoryPanel::getSinceLogoff()
-{
- return mFolders->getFilter()->isSinceLogoff();
-}
-
-void example_param_block_usage()
+// static
+LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel()
{
- LLInventoryPanel::Params param_block;
- param_block.name(std::string("inventory"));
-
- param_block.sort_order_setting(LLInventoryPanel::RECENTITEMS_SORT_ORDER);
- param_block.allow_multi_select(true);
- param_block.filter(LLInventoryPanel::Filter()
- .sort_order(1)
- .types(0xffff0000));
- param_block.inventory(&gInventory);
- param_block.has_border(true);
+ LLInventoryPanel* res = NULL;
- LLUICtrlFactory::create<LLInventoryPanel>(param_block);
-
- param_block = LLInventoryPanel::Params();
- param_block.name(std::string("inventory"));
-
- //LLSD param_block_sd;
- //param_block_sd["sort_order_setting"] = LLInventoryPanel::RECENTITEMS_SORT_ORDER;
- //param_block_sd["allow_multi_select"] = true;
- //param_block_sd["filter"]["sort_order"] = 1;
- //param_block_sd["filter"]["types"] = (S32)0xffff0000;
- //param_block_sd["has_border"] = true;
-
- //LLInitParam::LLSDParser(param_block_sd).parse(param_block);
+ // Iterate through the inventory floaters and return whichever is on top.
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+ S32 z_min = S32_MAX;
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+ {
+ LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter);
+ if (iv && iv->getVisible())
+ {
+ S32 z_order = gFloaterView->getZOrder(iv);
+ if (z_order < z_min)
+ {
+ res = iv->getPanel();
+ z_min = z_order;
+ }
+ }
+ }
- LLUICtrlFactory::create<LLInventoryPanel>(param_block);
-}
+ // Otherwise, open the inventorySP and use that.
+ if (!res)
+ {
+ LLSD key;
+ LLSidepanelInventory *sidepanel_inventory =
+ dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->showPanel("sidepanel_inventory", key));
+ if (sidepanel_inventory)
+ {
+ res = sidepanel_inventory->getActivePanel();
+ if (res)
+ {
+ return res;
+ }
+ }
+ }
-// +=================================================+
-// | LLInventoryPanelObserver |
-// +=================================================+
-void LLInventoryPanelObserver::changed(U32 mask)
-{
- mIP->modelChanged(mask);
+ return res;
}
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index fd83729630..d65fe53812 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -162,11 +162,9 @@ public:
static void onIdle(void* user_data);
-private:
+ // Find whichever inventory panel is active / on top.
+ static LLInventoryPanel *getActiveInventoryPanel();
- // Given the id and the parent, build all of the folder views.
- void rebuildViewsFor(const LLUUID& id);
- virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719
protected:
void defaultOpenInventory(); // open the first level of inventory
@@ -193,12 +191,14 @@ protected:
public:
BOOL getIsViewsInitialized() const { return mViewsInitialized; }
const LLUUID& getStartFolderID() const { return mStartFolderID; }
-private:
+protected:
// Builds the UI. Call this once the inventory is usable.
void initializeViews();
+ void rebuildViewsFor(const LLUUID& id); // Given the id and the parent, build all of the folder views.
+ virtual void buildNewViews(const LLUUID& id);
+private:
BOOL mBuildDefaultHierarchy; // default inventory hierarchy should be created in postBuild()
BOOL mViewsInitialized; // Views have been generated
-
// UUID of category from which hierarchy should be built. Set with the
// "start_folder" xml property. Default is LLUUID::null that means total Inventory hierarchy.
std::string mStartFolderString;
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index d97f1d4d18..09c215e660 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -896,7 +896,7 @@ bool LLLocationInputCtrl::onLocationContextMenuItemEnabled(const LLSD& userdata)
}
else if (item == "can_select_all")
{
- return mTextEntry->canSelectAll();
+ return mTextEntry->canSelectAll() && (mTextEntry->getLength() > 0);
}
else if(item == "show_coordinates")
{
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index ee3be0a5e3..18e5169930 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -54,10 +54,11 @@
#include "llstylemap.h"
#include "lldraghandle.h"
-#include "lltrans.h"
+
#include "llbottomtray.h"
#include "llnearbychatbar.h"
#include "llfloaterreg.h"
+#include "lltrans.h"
static const S32 RESIZE_BAR_THICKNESS = 3;
@@ -146,6 +147,7 @@ std::string appendTime()
return timeStr;
}
+
void LLNearbyChat::addMessage(const LLChat& chat,bool archive)
{
if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
@@ -167,18 +169,15 @@ void LLNearbyChat::addMessage(const LLChat& chat,bool archive)
}
}
+ LLChat& tmp_chat = const_cast<LLChat&>(chat);
+
+ if(tmp_chat.mTimeStr.empty())
+ tmp_chat.mTimeStr = appendTime();
+
bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");
if (!chat.mMuted)
{
- std::string message = chat.mText;
-
-
- LLChat& tmp_chat = const_cast<LLChat&>(chat);
-
- if(tmp_chat.mTimeStr.empty())
- tmp_chat.mTimeStr = appendTime();
-
if (chat.mChatStyle == CHAT_STYLE_IRC)
{
LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
@@ -191,17 +190,9 @@ void LLNearbyChat::addMessage(const LLChat& chat,bool archive)
append_style_params.readonly_color(txt_color);
append_style_params.font.name(font_name);
append_style_params.font.size(font_size);
- if (chat.mFromName.size() > 0)
- {
- append_style_params.font.style = "ITALIC";
- LLChat add_chat=chat;
- add_chat.mText = chat.mFromName + " ";
- mChatHistory->appendMessage(add_chat, use_plain_text_chat_history, append_style_params);
- }
-
- message = message.substr(3);
append_style_params.font.style = "ITALIC";
- mChatHistory->appendText(message, FALSE, append_style_params);
+
+ mChatHistory->appendMessage(chat, use_plain_text_chat_history, append_style_params);
}
else
{
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index b0b6db682c..169560f688 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -318,6 +318,8 @@ void LLNearbyChatHandler::initChannel()
mChannel->init(channel_right_bound - channel_width, channel_right_bound);
}
+
+
void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
{
if(chat_msg.mMuted == TRUE)
@@ -327,6 +329,22 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
if(chat_msg.mText.empty())
return;//don't process empty messages
+
+ LLChat& tmp_chat = const_cast<LLChat&>(chat_msg);
+
+ if (tmp_chat.mChatStyle == CHAT_STYLE_IRC)
+ {
+ if(!tmp_chat.mFromName.empty())
+ tmp_chat.mText = tmp_chat.mFromName + " " + tmp_chat.mText.substr(3);
+ else
+ tmp_chat.mText = tmp_chat.mText.substr(3);
+ }
+
+ {
+ //sometimes its usefull to have no name at all...
+ //if(tmp_chat.mFromName.empty() && tmp_chat.mFromID!= LLUUID::null)
+ // tmp_chat.mFromName = tmp_chat.mFromID.asString();
+ }
LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
nearby_chat->addMessage(chat_msg);
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index 5834c50fbb..6210973dae 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -304,6 +304,9 @@ BOOL LLPanelGroupNotices::postBuild()
void LLPanelGroupNotices::activate()
{
+ if(mNoticesList)
+ mNoticesList->deleteAllItems();
+
BOOL can_send = gAgent.hasPowerInGroup(mGroupID,GP_NOTICES_SEND);
BOOL can_receive = gAgent.hasPowerInGroup(mGroupID,GP_NOTICES_RECEIVE);
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 405c95fc22..8c19865550 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -71,6 +71,11 @@ void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::E
childSetVisible("call_btn", ! is_call_started);
}
+LLPanelChatControlPanel::~LLPanelChatControlPanel()
+{
+ mVoiceChannelStateChangeConnection.disconnect();
+}
+
BOOL LLPanelChatControlPanel::postBuild()
{
childSetAction("call_btn", boost::bind(&LLPanelChatControlPanel::onCallButtonClicked, this));
@@ -113,7 +118,9 @@ void LLPanelChatControlPanel::setSessionId(const LLUUID& session_id)
mSessionId = session_id;
LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionId);
if(voice_channel)
- voice_channel->setStateChangedCallback(boost::bind(&LLPanelChatControlPanel::onVoiceChannelStateChanged, this, _1, _2));
+ {
+ mVoiceChannelStateChangeConnection = voice_channel->setStateChangedCallback(boost::bind(&LLPanelChatControlPanel::onVoiceChannelStateChanged, this, _1, _2));
+ }
}
LLPanelIMControlPanel::LLPanelIMControlPanel()
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index a590232a0b..871779b273 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -47,7 +47,7 @@ public:
LLPanelChatControlPanel() :
mSessionId(LLUUID()),
mInitialized(false) {};
- ~LLPanelChatControlPanel() {};
+ ~LLPanelChatControlPanel();
virtual BOOL postBuild();
virtual void draw();
@@ -64,6 +64,9 @@ public:
private:
LLUUID mSessionId;
bool mInitialized;
+
+ // connection to voice channel state change signal
+ boost::signals2::connection mVoiceChannelStateChangeConnection;
};
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 4ce6d14faa..d731da0ec7 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -122,8 +122,7 @@ void LLLandmarksPanel::onSearchEdit(const std::string& string)
for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
{
LLAccordionCtrlTab* tab = *iter;
- if (tab && !tab->getVisible())
- tab->setVisible(TRUE);
+ tab->setVisible(TRUE);
// expand accordion to see matched items in each one. See EXT-2014.
tab->changeOpenClose(false);
@@ -132,7 +131,9 @@ void LLLandmarksPanel::onSearchEdit(const std::string& string)
if (NULL == inventory_list) continue;
if (inventory_list->getFilter())
+ {
filter_list(inventory_list, string);
+ }
}
if (sFilterSubString != string)
@@ -333,8 +334,12 @@ void LLLandmarksPanel::initLandmarksInventoryPanel()
initLandmarksPanel(mLandmarksInventoryPanel);
+ // Check if mLandmarksInventoryPanel is properly initialized and has a Filter created.
+ // In case of a dummy widget getFilter() will return NULL.
if (mLandmarksInventoryPanel->getFilter())
+ {
mLandmarksInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
+ }
// subscribe to have auto-rename functionality while creating New Folder
mLandmarksInventoryPanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mLandmarksInventoryPanel, _1, _2));
@@ -362,6 +367,8 @@ void LLLandmarksPanel::initLibraryInventoryPanel()
void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_list)
{
+ // In case of a dummy widget further we have no Folder View widget and no Filter,
+ // so further initialization leads to crash.
if (!inventory_list->getFilter())
return;
@@ -388,8 +395,6 @@ void LLLandmarksPanel::initLandmarksPanel(LLInventorySubTreePanel* inventory_lis
void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLInventorySubTreePanel* inventory_list)
{
LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>(accordion_tab_name);
- if (!accordion_tab)
- return;
mAccordionTabs.push_back(accordion_tab);
accordion_tab->setDropDownStateChangedCallback(
@@ -744,8 +749,8 @@ void LLLandmarksPanel::updateFilteredAccordions()
for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
{
accordion_tab = *iter;
- if (accordion_tab && !accordion_tab->getVisible())
- accordion_tab->setVisible(TRUE);
+
+ accordion_tab->setVisible(TRUE);
inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView());
if (NULL == inventory_list) continue;
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 7dea5eaf67..57f3d86d53 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -97,7 +97,7 @@ LLContextMenu* NearbyMenu::createMenu()
registrar.add("Avatar.Profile", boost::bind(&LLAvatarActions::showProfile, id));
registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, id));
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startIM, id));
- registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented
+ registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, id));
registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this));
registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented
registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented
@@ -117,7 +117,7 @@ LLContextMenu* NearbyMenu::createMenu()
// registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs)); // *TODO: unimplemented
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs));
- // registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startConference, mUUIDs)); // *TODO: unimplemented
+ registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs));
// registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, mUUIDs)); // *TODO: unimplemented
// registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, mUUIDs)); // *TODO: unimplemented
enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem, this, _2));
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index cd4bcb6c0a..f7f3c5830d 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -261,6 +261,10 @@ void LLPanelPlaces::onOpen(const LLSD& key)
}
mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal);
+
+ // Disable Save button because there is no item to save yet.
+ // The button will be enabled in onLandmarkLoaded callback.
+ mSaveBtn->setEnabled(FALSE);
}
else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
{
@@ -380,11 +384,16 @@ void LLPanelPlaces::onLandmarkLoaded(LLLandmark* landmark)
landmark->getRegionID(region_id);
landmark->getGlobalPos(mPosGlobal);
mLandmarkInfo->displayParcelInfo(region_id, mPosGlobal);
+
+ mSaveBtn->setEnabled(TRUE);
}
void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_filter)
{
- if (force_filter || LLPanelPlacesTab::sFilterSubString != search_string)
+ if (!mActivePanel)
+ return;
+
+ if (force_filter || mActivePanel->getFilterSubString() != search_string)
{
std::string string = search_string;
@@ -392,8 +401,7 @@ void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_fi
LLStringUtil::toUpper(string);
LLStringUtil::trimHead(string);
- if (mActivePanel)
- mActivePanel->onSearchEdit(string);
+ mActivePanel->onSearchEdit(string);
}
}
@@ -403,7 +411,7 @@ void LLPanelPlaces::onTabSelected()
if (!mActivePanel)
return;
- onFilterEdit(LLPanelPlacesTab::sFilterSubString, true);
+ onFilterEdit(mActivePanel->getFilterSubString(), true);
mActivePanel->updateVerbs();
}
@@ -814,7 +822,7 @@ void LLPanelPlaces::changedInventory(U32 mask)
// Filter applied to show all items.
if (mActivePanel)
- mActivePanel->onSearchEdit(LLPanelPlacesTab::sFilterSubString);
+ mActivePanel->onSearchEdit(mActivePanel->getFilterSubString());
// we don't need to monitor inventory changes anymore,
// so remove the observer
diff --git a/indra/newview/llpanelplacestab.h b/indra/newview/llpanelplacestab.h
index b4d839452e..ce77a42259 100644
--- a/indra/newview/llpanelplacestab.h
+++ b/indra/newview/llpanelplacestab.h
@@ -56,13 +56,15 @@ public:
const LLUUID& snapshot_id,
bool teleport);
-public:
- // Search string for filtering landmarks and teleport history locations
- static std::string sFilterSubString;
+ const std::string& getFilterSubString() { return sFilterSubString; }
+ void setFilterSubString(const std::string& string) { sFilterSubString = string; }
protected:
LLButton* mTeleportBtn;
LLButton* mShowOnMapBtn;
+
+ // Search string for filtering landmarks and teleport history locations
+ static std::string sFilterSubString;
};
#endif //LL_LLPANELPLACESTAB_H
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 155172128b..088884178b 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -62,15 +62,15 @@ LLUUID notification_id_to_object_id(const LLUUID& notification_id)
//////////////////////////////////////////////////////////////////////////
LLScriptFloater::LLScriptFloater(const LLSD& key)
-: LLTransientDockableFloater(NULL, true, key)
+: LLDockableFloater(NULL, true, key)
, mScriptForm(NULL)
-, mObjectId(key.asUUID())
{
}
bool LLScriptFloater::toggle(const LLUUID& object_id)
{
- LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", object_id);
+ LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
+ LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
// show existing floater
if(floater)
@@ -97,7 +97,10 @@ bool LLScriptFloater::toggle(const LLUUID& object_id)
LLScriptFloater* LLScriptFloater::show(const LLUUID& object_id)
{
- LLScriptFloater* floater = LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", object_id);
+ LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
+
+ LLScriptFloater* floater = LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id);
+ floater->setObjectId(object_id);
floater->createForm(object_id);
if (floater->getDockControl() == NULL)
@@ -156,19 +159,22 @@ void LLScriptFloater::createForm(const LLUUID& object_id)
void LLScriptFloater::onClose(bool app_quitting)
{
- LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(getObjectId());
+ if(getObjectId().notNull())
+ {
+ LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(getObjectId());
+ }
}
void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */)
{
- LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+ LLDockableFloater::setDocked(docked, pop_on_undock);
hideToastsIfNeeded();
}
void LLScriptFloater::setVisible(BOOL visible)
{
- LLTransientDockableFloater::setVisible(visible);
+ LLDockableFloater::setVisible(visible);
hideToastsIfNeeded();
}
@@ -206,7 +212,7 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
script_notification_map_t::iterator it = mNotifications.find(object_id);
if(it != mNotifications.end())
{
- onRemoveNotification(notification_id);
+ onRemoveNotification(it->second.notification_id);
}
LLNotificationData nd = {notification_id};
@@ -228,7 +234,7 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
{
- LLUUID object_id = notification_id_to_object_id(notification_id);
+ LLUUID object_id = findObjectId(notification_id);
if(object_id.isNull())
{
llwarns << "Invalid notification, no object id" << llendl;
@@ -241,22 +247,24 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
LLUUID channel_id(gSavedSettings.getString("NotificationChannelUUID"));
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>
(LLChannelManager::getInstance()->findChannelByID(channel_id));
- if(channel)
+ LLUUID n_toast_id = findNotificationToastId(object_id);
+ if(channel && n_toast_id.notNull())
{
- channel->killToastByNotificationID(findNotificationToastId(object_id));
+ channel->killToastByNotificationID(n_toast_id);
}
- mNotifications.erase(object_id);
-
// remove related chiclet
LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(object_id);
// close floater
- LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", object_id);
+ LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
if(floater)
{
+ floater->setObjectId(LLUUID::null);
floater->closeFloater();
}
+
+ mNotifications.erase(object_id);
}
void LLScriptFloaterManager::removeNotificationByObjectId(const LLUUID& object_id)
@@ -301,6 +309,22 @@ void LLScriptFloaterManager::setNotificationToastId(const LLUUID& object_id, con
}
}
+LLUUID LLScriptFloaterManager::findObjectId(const LLUUID& notification_id)
+{
+ if(notification_id.notNull())
+ {
+ script_notification_map_t::const_iterator it = mNotifications.begin();
+ for(; mNotifications.end() != it; ++it)
+ {
+ if(notification_id == it->second.notification_id)
+ {
+ return it->first;
+ }
+ }
+ }
+ return LLUUID::null;
+}
+
LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id)
{
script_notification_map_t::const_iterator it = mNotifications.find(object_id);
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index 0e1a7f36b7..8b5a266691 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -43,6 +43,9 @@ class LLToastNotifyPanel;
*/
class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
{
+ // *TODO
+ // LLScriptFloaterManager and LLScriptFloater will need some refactoring after we
+ // know how script notifications should look like.
public:
/**
@@ -69,6 +72,8 @@ public:
*/
void toggleScriptFloater(const LLUUID& object_id);
+ LLUUID findObjectId(const LLUUID& notification_id);
+
LLUUID findNotificationId(const LLUUID& object_id);
LLUUID findNotificationToastId(const LLUUID& object_id);
@@ -102,7 +107,7 @@ private:
* LLScriptFloater will create script form based on notification data and
* will auto fit the form.
*/
-class LLScriptFloater : public LLTransientDockableFloater
+class LLScriptFloater : public LLDockableFloater
{
public:
@@ -125,6 +130,8 @@ public:
const LLUUID& getObjectId() { return mObjectId; }
+ void setObjectId(const LLUUID& id) { mObjectId = id; }
+
/**
* Close notification if script floater is closed.
*/
@@ -154,8 +161,6 @@ protected:
*/
static void hideToastsIfNeeded();
- void setObjectId(const LLUUID& id) { mObjectId = id; }
-
private:
LLToastNotifyPanel* mScriptForm;
LLUUID mObjectId;
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 824def3d92..9ab459080e 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -277,3 +277,16 @@ LLInventoryItem *LLSidepanelInventory::getSelectedItem()
LLInventoryItem *item = gInventory.getItem(item_id);
return item;
}
+
+LLInventoryPanel *LLSidepanelInventory::getActivePanel()
+{
+ if (!getVisible())
+ {
+ return NULL;
+ }
+ if (mInventoryPanel->getVisible())
+ {
+ return mPanelMainInventory->getActivePanel();
+ }
+ return NULL;
+}
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index 6aa9cc745f..c2ce3badb8 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -36,6 +36,7 @@
class LLFolderViewItem;
class LLInventoryItem;
+class LLInventoryPanel;
class LLPanelMainInventory;
class LLSidepanelItemInfo;
class LLSidepanelTaskInfo;
@@ -49,6 +50,8 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
+ LLInventoryPanel* getActivePanel(); // Returns an active inventory panel, if any.
+
protected:
// Tracks highlighted (selected) item in inventory panel.
LLInventoryItem *getSelectedItem();
diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp
index cc4689062e..1315887c37 100644
--- a/indra/newview/llteleporthistory.cpp
+++ b/indra/newview/llteleporthistory.cpp
@@ -167,7 +167,10 @@ void LLTeleportHistory::onHistoryChanged()
void LLTeleportHistory::purgeItems()
{
- mItems.erase(mItems.begin(), mItems.end()-1);
+ if (mItems.size() > 0)
+ {
+ mItems.erase(mItems.begin(), mItems.end()-1);
+ }
// reset the count
mRequestedItem = -1;
mCurrentItem = 0;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 9bb2a4ad0a..ef49d7f057 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -736,7 +736,8 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
else
{
- llwarns << "Region not found for host: " << mHost << llendl;
+ // This will happen if not logged in or if a region deoes not have HTTP Texture enabled
+ //llwarns << "Region not found for host: " << mHost << llendl;
}
}
if (!mUrl.empty())
@@ -943,11 +944,14 @@ bool LLTextureFetchWorker::doWork(S32 param)
{
llerrs << "Decode entered with invalid mFormattedImage. ID = " << mID << llendl;
}
+ if (mLoadedDiscard < 0)
+ {
+ llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl;
+ }
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
mRawImage = NULL;
mAuxImage = NULL;
llassert_always(mFormattedImage.notNull());
- llassert_always(mLoadedDiscard >= 0);
S32 discard = mHaveAllData ? 0 : mLoadedDiscard;
U32 image_priority = LLWorkerThread::PRIORITY_NORMAL | mWorkPriority;
mDecoded = FALSE;
diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp
index 268a18d2a2..bf6d715c31 100644
--- a/indra/newview/lltoolbar.cpp
+++ b/indra/newview/lltoolbar.cpp
@@ -56,6 +56,7 @@
#include "llfloaterchatterbox.h"
#include "llfloaterfriends.h"
#include "llfloatersnapshot.h"
+#include "llinventorypanel.h"
#include "lltoolmgr.h"
#include "llui.h"
#include "llviewermenu.h"
@@ -157,12 +158,11 @@ BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
LLButton* inventory_btn = getChild<LLButton>("inventory_btn");
if (!inventory_btn) return FALSE;
- LLFloaterInventory* active_inventory = LLFloaterInventory::getActiveInventory();
-
LLRect button_screen_rect;
inventory_btn->localRectToScreen(inventory_btn->getRect(),&button_screen_rect);
-
- if(active_inventory && active_inventory->getVisible())
+
+ const LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if(active_panel)
{
mInventoryAutoOpen = FALSE;
}
@@ -170,8 +170,8 @@ BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
{
if (mInventoryAutoOpen)
{
- if (!(active_inventory && active_inventory->getVisible()) &&
- mInventoryAutoOpenTimer.getElapsedTimeF32() > sInventoryAutoOpenTime)
+ if (!active_panel &&
+ mInventoryAutoOpenTimer.getElapsedTimeF32() > sInventoryAutoOpenTime)
{
LLFloaterInventory::showAgentInventory();
}
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index b5454e7298..7c9bd582dd 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -250,7 +250,6 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
LLFloaterReg::add("volume_pulldown", "floater_volume_pulldown.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVolumePulldown>);
- LLFloaterReg::add("voice_call", "floater_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCall>);
LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>);
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index f9e1a94def..5bdcbc79bd 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -912,8 +912,20 @@ void link_inventory_item(
}
LLUUID transaction_id;
- std::string desc = "Link";
+ std::string desc = "Broken link"; // This should only show if the object can't find its baseobj.
LLInventoryType::EType inv_type = LLInventoryType::IT_NONE;
+ if (dynamic_cast<const LLInventoryCategory *>(baseobj))
+ {
+ inv_type = LLInventoryType::IT_CATEGORY;
+ }
+ else
+ {
+ const LLViewerInventoryItem *baseitem = dynamic_cast<const LLViewerInventoryItem *>(baseobj);
+ if (baseitem)
+ {
+ inv_type = baseitem->getInventoryType();
+ }
+ }
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_LinkInventoryItem);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 0b40492391..e68594ed6f 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -31,188 +31,75 @@
*/
#include "llviewerprecompiledheaders.h"
-
#include "llviewermenu.h"
-// system library includes
-#include <iostream>
-#include <fstream>
-#include <sstream>
-
// linden library includes
-#include "llaudioengine.h"
#include "llfloaterreg.h"
-#include "indra_constants.h"
-#include "llassetstorage.h"
-#include "llchat.h"
#include "llcombobox.h"
-#include "llfeaturemanager.h"
-#include "llfocusmgr.h"
-#include "llfontgl.h"
-#include "llinstantmessage.h"
#include "llinventorypanel.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
-#include "llpermissionsflags.h"
-#include "llrect.h"
-#include "llsecondlifeurls.h"
-#include "lltransactiontypes.h"
-#include "llui.h"
-#include "llview.h"
-#include "llxfermanager.h"
-#include "message.h"
-#include "raytrace.h"
-#include "llsdserialize.h"
-#include "lltimer.h"
-#include "llvfile.h"
-#include "llvolumemgr.h"
// newview includes
#include "llagent.h"
#include "llagentwearables.h"
#include "llagentpilot.h"
-#include "llbox.h"
-#include "llcallingcard.h"
-#include "llclipboard.h"
#include "llcompilequeue.h"
-#include "llconsole.h"
-#include "llviewercontrol.h"
#include "lldebugview.h"
-#include "lldir.h"
-#include "lldrawable.h"
-#include "lldrawpoolalpha.h"
-#include "lldrawpooltree.h"
-#include "llface.h"
#include "llfilepicker.h"
#include "llfirstuse.h"
-#include "llfloater.h"
-#include "llfloaterabout.h"
-#include "llfloaterbuycurrency.h"
-#include "llfloateractivespeakers.h"
-#include "llfloateranimpreview.h"
-#include "llfloateravatartextures.h"
-#include "llfloaterbuildoptions.h"
-#include "llfloaterbump.h"
#include "llfloaterbuy.h"
#include "llfloaterbuycontents.h"
#include "llfloaterbuycurrency.h"
-#include "llfloaterbuyland.h"
#include "llfloaterchat.h"
#include "llfloatercustomize.h"
-#include "llfloaterdaycycle.h"
#include "llfloaterchatterbox.h"
-#include "llfloaterfonttest.h"
#include "llfloatergodtools.h"
-#include "llfloatergroupinvite.h"
-#include "llfloatergroups.h"
-#include "llfloaterhud.h"
-#include "llfloaterinspect.h"
-#include "llfloaterlagmeter.h"
#include "llfloaterland.h"
-#include "llfloaterlandholdings.h"
-#include "llfloatermap.h"
-#include "llfloateropenobject.h"
#include "llfloaterpay.h"
-#include "llfloaterperms.h"
-#include "llfloaterpostprocess.h"
-#include "llfloaterpreference.h"
-#include "llfloaterreg.h"
-#include "llfloaterregioninfo.h"
#include "llfloaterreporter.h"
#include "llfloaterscriptdebug.h"
-#include "llfloatersettingsdebug.h"
-#include "llfloaterenvsettings.h"
#include "llfloatertools.h"
-#include "llfloaterwater.h"
-#include "llfloaterwindlight.h"
#include "llfloaterworldmap.h"
-#include "llfloatermemleak.h"
-#include "llfasttimerview.h"
#include "llavataractions.h"
#include "lllandmarkactions.h"
-#include "llmemoryview.h"
#include "llgroupmgr.h"
#include "lltooltip.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
-#include "llimage.h"
-#include "llimagebmp.h"
-#include "llimagej2c.h"
-#include "llimagetga.h"
#include "llinventorybridge.h"
-#include "llinventorymodel.h"
-#include "llfloaterinventory.h"
-#include "llkeyboard.h"
#include "llpanellogin.h"
#include "llpanelblockedlist.h"
#include "llmenucommands.h"
-#include "llmenugl.h"
-#include "llmimetypes.h"
#include "llmoveview.h"
-#include "llmutelist.h"
-#include "llnotify.h"
-#include "llpanelobject.h"
#include "llparcel.h"
-#include "llprimitive.h"
-#include "llresmgr.h"
#include "llrootview.h"
#include "llselectmgr.h"
#include "llsidetray.h"
-#include "llsky.h"
#include "llstatusbar.h"
-#include "llstatview.h"
-#include "llstring.h"
-#include "llsurfacepatch.h"
-#include "llimview.h"
#include "lltextureview.h"
-#include "lltool.h"
#include "lltoolbar.h"
#include "lltoolcomp.h"
-#include "lltoolfocus.h"
-#include "lltoolgrab.h"
#include "lltoolmgr.h"
#include "lltoolpie.h"
#include "lltoolselectland.h"
-#include "lltrans.h"
-#include "lluictrlfactory.h"
-#include "lluploaddialog.h"
-#include "lluserauth.h"
-#include "lluuid.h"
-#include "llviewercamera.h"
#include "llviewergenericmessage.h"
#include "llviewerhelp.h"
-#include "llviewertexturelist.h" // gTextureList
-#include "llviewerinventory.h"
#include "llviewermenufile.h" // init_menu_file()
#include "llviewermessage.h"
#include "llviewernetwork.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
-#include "llviewerparceloverlay.h"
-#include "llviewerregion.h"
#include "llviewerstats.h"
-#include "llviewerwindow.h"
-#include "llvoavatar.h"
#include "llvoavatarself.h"
-#include "llvolume.h"
-#include "llweb.h"
-#include "llworld.h"
#include "llworldmap.h"
-#include "object_flags.h"
#include "pipeline.h"
-#include "llappviewer.h"
-#include "roles_constants.h"
#include "llviewerjoystick.h"
#include "llwlanimator.h"
#include "llwlparammanager.h"
-#include "llwaterparammanager.h"
-#include "llfloaternotificationsconsole.h"
#include "llfloatercamera.h"
#include "lluilistener.h"
-
-#include "lltexlayer.h"
#include "llappearancemgr.h"
-#include "llimfloater.h"
using namespace LLVOAvatarDefines;
@@ -6963,16 +6850,15 @@ void handle_grab_texture(void* data)
gInventory.updateItem(item);
gInventory.notifyObservers();
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
-
// Show the preview panel for textures to let
// user know that the image is now in inventory.
- if(view)
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if(active_panel)
{
LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus();
- view->getPanel()->setSelection(item_id, TAKE_FOCUS_NO);
- view->getPanel()->openSelected();
+ active_panel->setSelection(item_id, TAKE_FOCUS_NO);
+ active_panel->openSelected();
//LLFloaterInventory::dumpSelectionInformation((void*)view);
// restore keyboard focus
gFocusMgr.setKeyboardFocus(focus_ctrl);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 23d02af73d..85b6051502 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -31,70 +31,31 @@
*/
#include "llviewerprecompiledheaders.h"
-
#include "llviewermessage.h"
-#include <deque>
-
#include "llaudioengine.h"
-#include "indra_constants.h"
#include "lscript_byteformat.h"
-#include "mean_collision_data.h"
-#include "llfloaterbump.h"
-#include "llassetstorage.h"
-#include "llcachename.h"
-
-#include "lldbstrings.h"
#include "lleconomy.h"
-#include "llfilepicker.h"
#include "llfloaterreg.h"
-#include "llfocusmgr.h"
#include "llfollowcamparams.h"
-#include "llinstantmessage.h"
-#include "llquantize.h"
-#include "llregionflags.h"
-#include "llregionhandle.h"
#include "llsdserialize.h"
-#include "llstring.h"
-#include "llteleportflags.h"
-#include "lltracker.h"
#include "lltransactionflags.h"
-#include "llxfermanager.h"
-#include "message.h"
-#include "sound_ids.h"
-#include "lltimer.h"
-#include "llmd5.h"
#include "llagent.h"
#include "llcallingcard.h"
-#include "llconsole.h"
-#include "llvieweraudio.h"
-#include "llviewercontrol.h"
-#include "lldrawpool.h"
#include "llfirstuse.h"
-#include "llfloateranimpreview.h"
#include "llfloaterbuycurrency.h"
#include "llfloaterbuyland.h"
#include "llfloaterchat.h"
-#include "llfloaterimagepreview.h"
#include "llfloaterland.h"
#include "llfloaterregioninfo.h"
#include "llfloaterlandholdings.h"
-#include "llurldispatcher.h"
#include "llfloaterpostcard.h"
#include "llfloaterpreference.h"
-#include "llfollowcam.h"
-#include "llgroupnotify.h"
-#include "llhudeffect.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
-#include "llinventorymodel.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
-#include "llfloaterinventory.h"
-#include "llmenugl.h"
-#include "llmoveview.h"
-#include "llmutelist.h"
#include "llnearbychat.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
@@ -111,22 +72,11 @@
#include "llstatenums.h"
#include "llstatusbar.h"
#include "llimview.h"
-#include "lltool.h"
-#include "lltoolbar.h"
-#include "lltoolmgr.h"
#include "lltrans.h"
-#include "llui.h" // for make_ui_sound
-#include "lluploaddialog.h"
-#include "llviewercamera.h"
-#include "llviewerchat.h"
#include "llviewergenericmessage.h"
-#include "llviewerinventory.h"
#include "llviewermenu.h"
-#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
-#include "llviewerpartsource.h"
-#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llviewertexteditor.h"
#include "llviewerthrottle.h"
@@ -134,10 +84,8 @@
#include "llvlmanager.h"
#include "llvoavatarself.h"
#include "llvotextbubble.h"
-#include "llweb.h"
#include "llworld.h"
#include "pipeline.h"
-#include "llappviewer.h"
#include "llfloaterworldmap.h"
#include "llviewerdisplay.h"
#include "llkeythrottle.h"
@@ -146,15 +94,13 @@
#include "llpanelblockedlist.h"
#include "llpanelplaceprofile.h"
-#include <boost/tokenizer.hpp>
-#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/split.hpp> //
#if LL_WINDOWS // For Windows specific error handler
#include "llwindebug.h" // For the invalid message handler
#endif
-//#include "llnearbychathistory.h"
-#include "llnotificationmanager.h"
+#include "llnotificationmanager.h" //
//
// Constants
@@ -933,56 +879,46 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f
//highlight item, if it's not in the trash or lost+found
// Don't auto-open the inventory floater
- LLFloaterInventory* view = NULL;
if(gSavedSettings.getBOOL("ShowInInventory") &&
asset_type != LLAssetType::AT_CALLINGCARD &&
item->getInventoryType() != LLInventoryType::IT_ATTACHMENT &&
!from_name.empty())
{
- view = LLFloaterInventory::showAgentInventory();
//TODO:this should be moved to the end of method after all the checks,
//but first decide what to do with active inventory if any (EK)
LLSD key;
key["select"] = item->getUUID();
LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
}
- else
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if(active_panel)
{
- view = LLFloaterInventory::getActiveInventory();
- }
- if(!view)
- {
- return;
- }
-
- //Trash Check
- const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
- {
- return;
- }
- const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
- //BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view);
- BOOL user_is_away = gAwayTimer.getStarted();
+ //Trash Check
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ {
+ return;
+ }
+ const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
+ //BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view);
+ BOOL user_is_away = gAwayTimer.getStarted();
- // don't select lost and found items if the user is active
- if (gInventory.isObjectDescendentOf(item->getUUID(), lost_and_found_id)
- && !user_is_away)
- {
- return;
- }
+ // don't select lost and found items if the user is active
+ if (gInventory.isObjectDescendentOf(item->getUUID(), lost_and_found_id)
+ && !user_is_away)
+ {
+ return;
+ }
- //Not sure about this check. Could make it easy to miss incoming items.
- //don't dick with highlight while the user is working
- //if(inventory_has_focus && !user_is_away)
- // break;
- LL_DEBUGS("Messaging") << "Highlighting" << item->getUUID() << LL_ENDL;
- //highlight item
+ //Not sure about this check. Could make it easy to miss incoming items.
+ //don't dick with highlight while the user is working
+ //if(inventory_has_focus && !user_is_away)
+ // break;
+ LL_DEBUGS("Messaging") << "Highlighting" << item->getUUID() << LL_ENDL;
+ //highlight item
- if (view->getPanel())
- {
LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus();
- view->getPanel()->setSelection(item->getUUID(), TAKE_FOCUS_NO);
+ active_panel->setSelection(item->getUUID(), TAKE_FOCUS_NO);
gFocusMgr.setKeyboardFocus(focus_ctrl);
}
}
@@ -5038,7 +4974,7 @@ void container_inventory_arrived(LLViewerObject* object,
gAgent.changeCameraToDefault();
}
- LLFloaterInventory* view = LLFloaterInventory::getActiveInventory();
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
if (inventory->size() > 2)
{
@@ -5076,9 +5012,9 @@ void container_inventory_arrived(LLViewerObject* object,
}
}
gInventory.notifyObservers();
- if(view)
+ if(active_panel)
{
- view->getPanel()->setSelection(cat_id, TAKE_FOCUS_NO);
+ active_panel->setSelection(cat_id, TAKE_FOCUS_NO);
}
}
else if (inventory->size() == 2)
@@ -5112,9 +5048,9 @@ void container_inventory_arrived(LLViewerObject* object,
new_item->updateServer(TRUE);
gInventory.updateItem(new_item);
gInventory.notifyObservers();
- if(view)
+ if(active_panel)
{
- view->getPanel()->setSelection(item_id, TAKE_FOCUS_NO);
+ active_panel->setSelection(item_id, TAKE_FOCUS_NO);
}
}
@@ -5583,17 +5519,6 @@ void process_script_dialog(LLMessageSystem* msg, void**)
notification = LLNotifications::instance().add(
LLNotification::Params("ScriptDialogGroup").substitutions(args).payload(payload).form_elements(form.asLLSD()));
}
-
- // "ScriptDialog" and "ScriptDialogGroup" are handles by LLScriptFloaterManager.
- // We want to inform user that there is a script floater, lets add "ScriptToast"
- LLNotification::Params p("ScriptToast");
- p.substitutions(args).payload(payload).functor.function(boost::bind(
- LLScriptFloaterManager::onToastButtonClick, _1, _2));
-
- notification = LLNotifications::instance().add(p);
-
- LLScriptFloaterManager::getInstance()->setNotificationToastId(
- object_id, notification->getID());
}
//---------------------------------------------------------------------------
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index a0396bc790..608060174a 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -408,28 +408,6 @@ void LLVoiceChannel::doSetState(const EState& new_state)
mStateChangedCallback(old_state, mState);
}
-void LLVoiceChannel::toggleCallWindowIfNeeded(EState state)
-{
- LLFloaterCall* floater = dynamic_cast<LLFloaterCall*>(LLFloaterReg::getInstance("voice_call", mSessionID));
- if (!floater)
- return;
-
- if (state == STATE_CONNECTED)
- {
- floater->init(mSessionID);
- floater->openFloater(mSessionID);
- }
- // By checking that current state is CONNECTED we make sure that the call window
- // has been shown, hence there's something to hide. This helps when user presses
- // the "End call" button right after initiating the call.
- // *TODO: move this check to LLFloaterCall?
- else if (state == STATE_HUNG_UP && mState == STATE_CONNECTED)
- {
- floater->reset();
- floater->closeFloater();
- }
-}
-
//static
void LLVoiceChannel::initClass()
{
@@ -630,9 +608,6 @@ void LLVoiceChannelGroup::handleError(EStatusType status)
void LLVoiceChannelGroup::setState(EState state)
{
- // HACK: Open/close the call window if needed.
- toggleCallWindowIfNeeded(state);
-
switch(state)
{
case STATE_RINGING:
@@ -886,9 +861,6 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s
void LLVoiceChannelP2P::setState(EState state)
{
- // *HACK: Open/close the call window if needed.
- toggleCallWindowIfNeeded(state);
-
llinfos << "P2P CALL STATE CHANGE: incoming=" << int(mReceivedCall) << " oldstate=" << mState << " newstate=" << state << llendl;
if (mReceivedCall) // incoming call
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index fe0114d687..1bed329ba2 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -101,7 +101,6 @@ protected:
* Use this method if you want mStateChangedCallback to be executed while state is changed
*/
void doSetState(const EState& state);
- void toggleCallWindowIfNeeded(EState state);
void setURI(std::string uri);
std::string mURI;
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 3cb0ec4bad..0405b9d28b 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -1094,6 +1094,16 @@ void LLWearable::setLabelUpdated() const
gInventory.addChangedMask(LLInventoryObserver::LABEL, getItemID());
}
+void LLWearable::refreshName()
+{
+ LLUUID item_id = getItemID();
+ LLInventoryItem* item = gInventory.getItem(item_id);
+ if( item )
+ {
+ mName = item->getName();
+ }
+}
+
struct LLWearableSaveData
{
EWearableType mType;
diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h
index 43ffa12420..82d388ab7e 100644
--- a/indra/newview/llwearable.h
+++ b/indra/newview/llwearable.h
@@ -133,6 +133,10 @@ public:
// Something happened that requires the wearable's label to be updated (e.g. worn/unworn).
void setLabelUpdated() const;
+ // the wearable was worn. make sure the name of the wearable object matches the LLViewerInventoryItem,
+ // not the wearable asset itself.
+ void refreshName();
+
private:
typedef std::map<S32, LLLocalTextureObject*> te_map_t;
typedef std::map<S32, LLVisualParam *> visual_param_index_map_t;
diff --git a/indra/newview/skins/default/textures/icons/Inv_LinkFolder.png b/indra/newview/skins/default/textures/icons/Inv_LinkFolder.png
new file mode 100644
index 0000000000..73a708782c
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_LinkFolder.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_LinkItem.png b/indra/newview/skins/default/textures/icons/Inv_LinkItem.png
new file mode 100644
index 0000000000..73a708782c
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_LinkItem.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 607b33fbb1..3e0820544a 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -230,6 +230,8 @@ with the same filename but different name
<texture name="Inv_Gesture" file_name="icons/Inv_Gesture.png" preload="false" />
<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_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" />
<texture name="Inv_LookFolderClosed" file_name="icons/Inv_LookFolderClosed.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
index 643336cf6c..c3a2540b2e 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -27,7 +27,6 @@
function="Avatar.IM" />
</menu_item_call>
<menu_item_call
- enabled="false"
label="Call"
layout="topleft"
name="Call">
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index ae8a1599a9..37136af680 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -3268,6 +3268,17 @@
</menu>
<menu_item_separator
layout="topleft" />
+ <menu_item_check
+ label="HTTP Textures"
+ layout="topleft"
+ name="HTTP Textures">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="ImagePipelineUseHTTP" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="ImagePipelineUseHTTP" />
+ </menu_item_check>
<menu_item_call
label="Compress Images"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
index fe3e010cf9..3c87331199 100644
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -416,6 +416,7 @@
left="10"
label="Edit Profile"
name="edit_profile_btn"
+ tool_tip="Edit your personal information"
width="130" />
<button
follows="bottom|right"
@@ -423,6 +424,7 @@
label="Edit Appearance"
left_pad="10"
name="edit_appearance_btn"
+ tool_tip="Create/edit your appearance: physical data, clothes and etc."
right="-10"
width="130" />
</panel>
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 d805209bf5..51997a2813 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -17,7 +17,7 @@
<accordion_tab
layout="topleft"
name="tab_outfits"
- title="Outfits bar">
+ title="Outfits">
<inventory_panel
allow_multi_select="true"
border="true"
@@ -33,7 +33,7 @@
<accordion_tab
layout="topleft"
name="tab_cof"
- title="Current Outfit bar">
+ title="Current Outfit">
<inventory_panel
allow_multi_select="true"
border="true"
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 4c2bd67337..52bc72fe86 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -106,7 +106,7 @@
layout="topleft"
left_pad="15"
name="new_btn"
- tool_tip="Create new pick at current location"
+ tool_tip="Create new pick or classified at current location"
top="5"
width="18" />
<button
@@ -138,6 +138,7 @@
left="5"
name="info_btn"
tab_stop="false"
+ tool_tip="Show pic information"
top="0"
width="55" />
<button
@@ -149,6 +150,7 @@
left_pad="5"
name="teleport_btn"
tab_stop="false"
+ tool_tip="Teleport to the corresponding area"
top="0"
width="77" />
<button
@@ -160,6 +162,7 @@
left_pad="5"
name="show_on_map_btn"
tab_stop="false"
+ tool_tip="Show corresponding area on the world map"
top="0"
width="50" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 947bb67152..6be203ef9c 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -287,7 +287,7 @@
mouse_opaque="false"
name="add_friend"
top="5"
- width="76" />
+ width="77" />
<button
follows="bottom|left"
height="19"
@@ -296,7 +296,7 @@
name="im"
top="5"
left_pad="5"
- width="31" />
+ width="33" />
<button
follows="bottom|left"
height="19"
@@ -315,7 +315,7 @@
name="show_on_map_btn"
top="5"
left_pad="5"
- width="42" />
+ width="44" />
<button
follows="bottom|left"
height="19"
@@ -324,7 +324,7 @@
name="teleport"
left_pad="5"
top="5"
- width="64" />
+ width="67" />
<button
follows="bottom|right"
height="19"
diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp
index 56c21016bd..6255f7ed15 100644
--- a/indra/viewer_components/login/tests/lllogin_test.cpp
+++ b/indra/viewer_components/login/tests/lllogin_test.cpp
@@ -231,6 +231,7 @@ namespace tut
ensure_equals("Online state", listener.lastEvent()["state"].asString(), "online");
}
+ /*
template<> template<>
void llviewerlogin_object::test<2>()
{
@@ -416,7 +417,8 @@ namespace tut
ensure_equals("Failed to offline", listener.lastEvent()["state"].asString(), "offline");
}
- template<> template<>
+ *FIX:Mani Disabled unit boost::coro is patched
+ template<> template<>
void llviewerlogin_object::test<5>()
{
DEBUG;
@@ -451,4 +453,5 @@ namespace tut
ensure_equals("SRV Failure", listener.lastEvent()["change"].asString(), "fail.login");
}
+*/
}
diff --git a/install.xml b/install.xml
index af94de9f8e..efcfe9420c 100644
--- a/install.xml
+++ b/install.xml
@@ -200,16 +200,16 @@
<key>linux</key>
<map>
<key>md5sum</key>
- <string>8fb4151b883b5f5d2b12da19a6ff8e7d</string>
+ <string>7085044567999489d82b9ed28f16e480</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.34.1-linux-20090804.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20091202.tar.bz2</uri>
</map>
<key>linux64</key>
<map>
<key>md5sum</key>
- <string>77237f33b1740daef0dc1e6c801f68e1</string>
+ <string>b4aeefcba3d749f1e9f2a12c6f70192b</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.34.1-linux64-20090804.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux64-20091202.tar.bz2</uri>
</map>
<key>windows</key>
<map>