summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorKent Quirk <q@lindenlab.com>2010-02-13 19:05:21 -0500
committerKent Quirk <q@lindenlab.com>2010-02-13 19:05:21 -0500
commit0b579ba112e5e4fa5b5348f1c865a3083b5e1175 (patch)
tree599c506927d50f9a4a51c2f776e8fe954505e4d0 /indra
parent96f29d2ba0b66754b3b7b9e0f75deb198a84cb5f (diff)
parent9fee359d1baf6e0046655cb8e4afabb8774754b1 (diff)
Automated merge from viewer-2-0 to normalize beta 3
Diffstat (limited to 'indra')
-rw-r--r--indra/llcommon/llsdserialize_xml.cpp15
-rw-r--r--indra/llimage/llimageworker.cpp11
-rw-r--r--indra/llmessage/tests/llareslistener_test.cpp2
-rw-r--r--indra/llui/lldockablefloater.cpp4
-rw-r--r--indra/llui/lldockablefloater.h2
-rw-r--r--indra/llui/llmultisliderctrl.cpp7
-rw-r--r--indra/llui/llpanel.cpp8
-rw-r--r--indra/llui/llsearcheditor.cpp7
-rw-r--r--indra/llui/lltabcontainer.cpp4
-rw-r--r--indra/llxuixml/llxuiparser.cpp36
-rw-r--r--indra/lscript/lscript_compile/lscript_tree.cpp17
-rw-r--r--indra/lscript/lscript_compile/lscript_tree.h4
-rw-r--r--indra/newview/CMakeLists.txt4
-rw-r--r--indra/newview/llagent.cpp4
-rw-r--r--indra/newview/llagent.h2
-rw-r--r--indra/newview/llagentwearables.cpp49
-rw-r--r--indra/newview/llagentwearables.h3
-rw-r--r--indra/newview/llappearancemgr.cpp39
-rw-r--r--indra/newview/llappearancemgr.h3
-rw-r--r--indra/newview/llcallfloater.cpp5
-rw-r--r--indra/newview/llcallingcard.cpp17
-rw-r--r--indra/newview/llchathistory.cpp35
-rw-r--r--indra/newview/llchiclet.h5
-rw-r--r--indra/newview/llface.cpp45
-rw-r--r--indra/newview/llface.h2
-rw-r--r--indra/newview/llfloaterevent.cpp324
-rw-r--r--indra/newview/llfloaterevent.h96
-rw-r--r--indra/newview/llfloatergesture.cpp12
-rw-r--r--indra/newview/llfloatertopobjects.cpp9
-rw-r--r--indra/newview/llfloaterwater.cpp2
-rw-r--r--indra/newview/llfloaterwindlight.cpp2
-rw-r--r--indra/newview/llfolderviewitem.cpp3
-rw-r--r--indra/newview/llimfloater.cpp1
-rw-r--r--indra/newview/llimfloatercontainer.cpp2
-rw-r--r--indra/newview/llinventorybridge.cpp21
-rw-r--r--indra/newview/llinventorymodel.cpp21
-rw-r--r--indra/newview/llnotificationalerthandler.cpp6
-rw-r--r--indra/newview/llpanelface.cpp20
-rw-r--r--indra/newview/llpanelgroupinvite.cpp40
-rw-r--r--indra/newview/llpanelgroupinvite.h4
-rw-r--r--indra/newview/llpanellandmarkinfo.cpp32
-rw-r--r--indra/newview/llpanellandmarks.cpp53
-rw-r--r--indra/newview/llpanellandmarks.h2
-rw-r--r--indra/newview/llscriptfloater.cpp113
-rw-r--r--indra/newview/llscriptfloater.h34
-rw-r--r--indra/newview/llsearchcombobox.cpp1
-rw-r--r--indra/newview/llstartup.cpp17
-rw-r--r--indra/newview/lltexturefetch.cpp11
-rw-r--r--indra/newview/lltoastnotifypanel.cpp9
-rw-r--r--indra/newview/llviewerfloaterreg.cpp3
-rw-r--r--indra/newview/llviewerinventory.cpp4
-rw-r--r--indra/newview/llviewermenu.cpp21
-rw-r--r--indra/newview/llviewerobjectlist.h4
-rw-r--r--indra/newview/llviewertexture.cpp103
-rw-r--r--indra/newview/llviewertexture.h15
-rw-r--r--indra/newview/llviewerwindow.cpp81
-rw-r--r--indra/newview/llvoavatar.cpp11
-rw-r--r--indra/newview/llvovolume.cpp88
-rw-r--r--indra/newview/llvovolume.h6
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Shoe.pngbin276 -> 54133 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml7
-rw-r--r--indra/newview/skins/default/textures/windows/Volume_Background.pngbin0 -> 589 bytes
-rw-r--r--indra/newview/skins/default/xui/en/floater_event.xml243
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml36
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml16
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_volume_pulldown.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/filter_editor.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/search_editor.xml8
-rw-r--r--indra/newview/tests/lllogininstance_test.cpp2
-rw-r--r--indra/newview/tests/llxmlrpclistener_test.cpp2
72 files changed, 1530 insertions, 356 deletions
diff --git a/indra/llcommon/llsdserialize_xml.cpp b/indra/llcommon/llsdserialize_xml.cpp
index 7e1c2e35e0..fca173df47 100644
--- a/indra/llcommon/llsdserialize_xml.cpp
+++ b/indra/llcommon/llsdserialize_xml.cpp
@@ -139,12 +139,8 @@ S32 LLSDXMLFormatter::format_impl(const LLSD& data, std::ostream& ostr, U32 opti
case LLSD::TypeBoolean:
ostr << pre << "<boolean>";
if(mBoolAlpha ||
-#if( LL_WINDOWS || __GNUC__ > 2)
(ostr.flags() & std::ios::boolalpha)
-#else
- (ostr.flags() & 0x0100)
-#endif
- )
+ )
{
ostr << (data.asBoolean() ? "true" : "false");
}
@@ -511,12 +507,7 @@ void LLSDXMLParser::Impl::reset()
mSkipping = false;
-#if( LL_WINDOWS || __GNUC__ > 2)
mCurrentKey.clear();
-#else
- mCurrentKey = std::string();
-#endif
-
XML_ParserReset(mParser, "utf-8");
XML_SetUserData(mParser, this);
@@ -644,11 +635,7 @@ void LLSDXMLParser::Impl::startElementHandler(const XML_Char* name, const XML_Ch
LLSD& newElement = map[mCurrentKey];
mStack.push_back(&newElement);
-#if( LL_WINDOWS || __GNUC__ > 2)
mCurrentKey.clear();
-#else
- mCurrentKey = std::string();
-#endif
}
else if (mStack.back()->isArray())
{
diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp
index 86d41515e7..20a72d0a28 100644
--- a/indra/llimage/llimageworker.cpp
+++ b/indra/llimage/llimageworker.cpp
@@ -54,9 +54,14 @@ S32 LLImageDecodeThread::update(U32 max_time_ms)
{
creation_info& info = *iter;
ImageRequest* req = new ImageRequest(info.handle, info.image,
- info.priority, info.discard, info.needs_aux,
- info.responder);
- addRequest(req);
+ info.priority, info.discard, info.needs_aux,
+ info.responder);
+
+ bool res = addRequest(req);
+ if (!res)
+ {
+ llerrs << "request added after LLLFSThread::cleanupClass()" << llendl;
+ }
}
mCreationList.clear();
S32 res = LLQueuedThread::update(max_time_ms);
diff --git a/indra/llmessage/tests/llareslistener_test.cpp b/indra/llmessage/tests/llareslistener_test.cpp
index ac4886ccf4..6ee74c8e7a 100644
--- a/indra/llmessage/tests/llareslistener_test.cpp
+++ b/indra/llmessage/tests/llareslistener_test.cpp
@@ -4,7 +4,7 @@
* @date 2009-02-26
* @brief Tests of llareslistener.h.
*
- * $LicenseInfo:firstyear=2009&license=internal$
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
* Copyright (c) 2009, Linden Research, Inc.
* $/LicenseInfo$
*/
diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index 57baf28dab..a94f0206a6 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -223,10 +223,10 @@ void LLDockableFloater::draw()
LLFloater::draw();
}
-void LLDockableFloater::setDockControl(LLDockControl* dockControl)
+void LLDockableFloater::setDockControl(LLDockControl* dockControl, bool docked /* = true */)
{
mDockControl.reset(dockControl);
- setDocked(mDockControl.get() != NULL && mDockControl.get()->isDockVisible());
+ setDocked(docked && mDockControl.get() != NULL && mDockControl.get()->isDockVisible());
}
const LLUIImagePtr& LLDockableFloater::getDockTongue()
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index 2b1ce99ae2..4d747390af 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -127,7 +127,7 @@ private:
void resetInstance();
protected:
- void setDockControl(LLDockControl* dockControl);
+ void setDockControl(LLDockControl* dockControl, bool docked = true);
const LLUIImagePtr& getDockTongue();
private:
diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp
index 50942e55ca..cc26c00a3e 100644
--- a/indra/llui/llmultisliderctrl.cpp
+++ b/indra/llui/llmultisliderctrl.cpp
@@ -330,13 +330,14 @@ void LLMultiSliderCtrl::updateText()
// static
void LLMultiSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata)
{
+ llassert(ctrl);
+ if (!ctrl)
+ return;
+
LLMultiSliderCtrl* self = dynamic_cast<LLMultiSliderCtrl*>(ctrl->getParent());
llassert(self);
if (!self) // cast failed - wrong type! :O
return;
-
- if (!ctrl)
- return;
BOOL success = FALSE;
F32 val = self->mCurValue;
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 7b406e090a..d963cf4c98 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -397,6 +397,12 @@ LLView* LLPanel::fromXML(LLXMLNodePtr node, LLView* parent, LLXMLNodePtr output_
if (!panelp)
{
panelp = LLUICtrlFactory::getInstance()->createFactoryPanel(name);
+ llassert(panelp);
+
+ if (!panelp)
+ {
+ return NULL; // :(
+ }
}
}
@@ -414,7 +420,7 @@ LLView* LLPanel::fromXML(LLXMLNodePtr node, LLView* parent, LLXMLNodePtr output_
panelp->mCommitCallbackRegistrar.popScope();
panelp->mEnableCallbackRegistrar.popScope();
- if (panelp && !panelp->getFactoryMap().empty())
+ if (!panelp->getFactoryMap().empty())
{
LLUICtrlFactory::instance().popFactoryFunctions();
}
diff --git a/indra/llui/llsearcheditor.cpp b/indra/llui/llsearcheditor.cpp
index 6fa99df82e..491eeeab54 100644
--- a/indra/llui/llsearcheditor.cpp
+++ b/indra/llui/llsearcheditor.cpp
@@ -60,6 +60,7 @@ LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p)
line_editor_params.keystroke_callback(boost::bind(&LLSearchEditor::handleKeystroke, this));
mSearchEditor = LLUICtrlFactory::create<LLLineEditor>(line_editor_params);
+ mSearchEditor->setPassDelete(TRUE);
addChild(mSearchEditor);
if (p.search_button_visible)
@@ -79,10 +80,12 @@ LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p)
if (p.clear_button_visible)
{
// Set up clear button.
- S32 clr_btn_width = getRect().getHeight(); // button is square, and as tall as search editor
- LLRect clear_btn_rect(getRect().getWidth() - clr_btn_width, getRect().getHeight(), getRect().getWidth(), 0);
LLButton::Params clr_btn_params(p.clear_button);
clr_btn_params.name(std::string("clear button"));
+ S32 clr_btn_top = clr_btn_params.rect.bottom + clr_btn_params.rect.height;
+ S32 clr_btn_right = getRect().getWidth() - clr_btn_params.pad_right;
+ S32 clr_btn_left = clr_btn_right - clr_btn_params.rect.width;
+ LLRect clear_btn_rect(clr_btn_left, clr_btn_top, clr_btn_right, p.clear_button.rect.bottom);
clr_btn_params.rect(clear_btn_rect) ;
clr_btn_params.follows.flags(FOLLOWS_RIGHT|FOLLOWS_TOP);
clr_btn_params.tab_stop(false);
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 13340e7ded..e810b6fe8f 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -891,6 +891,10 @@ void LLTabContainer::update_images(LLTabTuple* tuple, TabParams params, LLTabCon
void LLTabContainer::addTabPanel(const TabPanelParams& panel)
{
LLPanel* child = panel.panel();
+
+ llassert(child);
+ if (!child) return;
+
const std::string& label = panel.label.isProvided()
? panel.label()
: panel.panel()->getLabel();
diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp
index 17399865e5..dbc20a5a1e 100644
--- a/indra/llxuixml/llxuiparser.cpp
+++ b/indra/llxuixml/llxuiparser.cpp
@@ -324,33 +324,33 @@ void LLXUIXSDWriter::writeXSD(const std::string& type_name, const std::string& p
// add includes for all possible children
const std::type_info* type = *LLWidgetTypeRegistry::instance().getValue(type_name);
const widget_registry_t* widget_registryp = LLChildRegistryRegistry::instance().getValue(type);
-
- // add include declarations for all valid children
- for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
- it != widget_registryp->currentRegistrar().endItems();
- ++it)
- {
- std::string widget_name = it->first;
- if (widget_name == type_name)
- {
- continue;
- }
- LLXMLNodePtr nodep = new LLXMLNode("xs:include", false);
- nodep->createChild("schemaLocation", true)->setStringValue(widget_name + ".xsd");
-
- // add to front of schema
- mSchemaNode->addChild(nodep, mSchemaNode);
- }
// add choices for valid children
if (widget_registryp)
{
+ // add include declarations for all valid children
+ for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
+ it != widget_registryp->currentRegistrar().endItems();
+ ++it)
+ {
+ std::string widget_name = it->first;
+ if (widget_name == type_name)
+ {
+ continue;
+ }
+ LLXMLNodePtr nodep = new LLXMLNode("xs:include", false);
+ nodep->createChild("schemaLocation", true)->setStringValue(widget_name + ".xsd");
+
+ // add to front of schema
+ mSchemaNode->addChild(nodep, mSchemaNode);
+ }
+
for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
it != widget_registryp->currentRegistrar().endItems();
++it)
{
std::string widget_name = it->first;
- //<xs:element name="widget_name" type="widget_name">
+ //<xs:element name="widget_name" type="widget_name">
LLXMLNodePtr widget_node = mElementNode->createChild("xs:element", false);
widget_node->createChild("name", true)->setStringValue(widget_name);
widget_node->createChild("type", true)->setStringValue(widget_name);
diff --git a/indra/lscript/lscript_compile/lscript_tree.cpp b/indra/lscript/lscript_compile/lscript_tree.cpp
index 3b8bbbe805..3d19de193a 100644
--- a/indra/lscript/lscript_compile/lscript_tree.cpp
+++ b/indra/lscript/lscript_compile/lscript_tree.cpp
@@ -9805,6 +9805,9 @@ void LLScriptEventHandler::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
break;
case LSCP_EMIT_BYTE_CODE:
{
+ llassert(mEventp);
+ if (!mEventp) return;
+
// order for event handler
// set jump table value
S32 jumpoffset;
@@ -9818,13 +9821,11 @@ void LLScriptEventHandler::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
chunk->addBytes(4);
// null terminated event name and null terminated parameters
- if (mEventp)
- {
- LLScriptByteCodeChunk *event = new LLScriptByteCodeChunk(FALSE);
- mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, event, heap, stacksize, entry, entrycount, NULL);
- chunk->addBytes(event->mCodeChunk, event->mCurrentOffset);
- delete event;
- }
+ LLScriptByteCodeChunk *event = new LLScriptByteCodeChunk(FALSE);
+ mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, event, heap, stacksize, entry, entrycount, NULL);
+ chunk->addBytes(event->mCodeChunk, event->mCurrentOffset);
+ delete event;
+
chunk->addBytes(1);
// now we're at the first opcode
@@ -10626,6 +10627,8 @@ LLScriptScript::LLScriptScript(LLScritpGlobalStorage *globals,
}
temp = temp->mNextp;
}
+
+ mClassName[0] = '\0';
}
void LLScriptScript::setBytecodeDest(const char* dst_filename)
diff --git a/indra/lscript/lscript_compile/lscript_tree.h b/indra/lscript/lscript_compile/lscript_tree.h
index a667e1eb5b..7de9606dfc 100644
--- a/indra/lscript/lscript_compile/lscript_tree.h
+++ b/indra/lscript/lscript_compile/lscript_tree.h
@@ -1876,7 +1876,7 @@ class LLScriptStateChange : public LLScriptStatement
{
public:
LLScriptStateChange(S32 line, S32 col, LLScriptIdentifier *identifier)
- : LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier)
+ : LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier), mReturnType(LST_NULL)
{
}
@@ -2210,7 +2210,7 @@ class LLScriptState : public LLScriptFilePosition
{
public:
LLScriptState(S32 line, S32 col, LSCRIPTStateType type, LLScriptIdentifier *identifier, LLScriptEventHandler *event)
- : LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL)
+ : LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL), mStateScope(NULL)
{
}
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index cd7c002096..b74530e49a 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -161,6 +161,7 @@ set(viewer_SOURCE_FILES
llfloatercustomize.cpp
llfloaterdaycycle.cpp
llfloaterenvsettings.cpp
+ llfloaterevent.cpp
llfloaterfonttest.cpp
llfloatergesture.cpp
llfloatergodtools.cpp
@@ -300,7 +301,6 @@ set(viewer_SOURCE_FILES
llpanelclassified.cpp
llpanelcontents.cpp
llpaneleditwearable.cpp
- llpanelevent.cpp
llpanelface.cpp
llpanelgroup.cpp
llpanelgroupgeneral.cpp
@@ -661,6 +661,7 @@ set(viewer_HEADER_FILES
llfloatercustomize.h
llfloaterdaycycle.h
llfloaterenvsettings.h
+ llfloaterevent.h
llfloaterfonttest.h
llfloatergesture.h
llfloatergodtools.h
@@ -795,7 +796,6 @@ set(viewer_HEADER_FILES
llpanelclassified.h
llpanelcontents.h
llpaneleditwearable.h
- llpanelevent.h
llpanelface.h
llpanelgroup.h
llpanelgroupgeneral.h
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 59f61dfdfb..3675be16e9 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -5027,9 +5027,9 @@ void LLAgent::buildFullnameAndTitle(std::string& name) const
}
}
-BOOL LLAgent::isInGroup(const LLUUID& group_id) const
+BOOL LLAgent::isInGroup(const LLUUID& group_id, BOOL ignore_god_mode /* FALSE */) const
{
- if (isGodlike())
+ if (!ignore_god_mode && isGodlike())
return true;
S32 count = mGroups.count();
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index beede7fbe3..1573fd7131 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -982,7 +982,7 @@ private:
//--------------------------------------------------------------------
public:
// Checks against all groups in the entire agent group list.
- BOOL isInGroup(const LLUUID& group_id) const;
+ BOOL isInGroup(const LLUUID& group_id, BOOL ingnore_God_mod = FALSE) const;
protected:
// Only used for building titles.
BOOL isGroupMember() const { return !mGroupID.isNull(); }
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 6078620e87..68ee9cd612 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -299,6 +299,10 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i
{
gAgentWearables.makeNewOutfitDone(mType, mIndex);
}
+ if (mTodo & CALL_WEARITEM)
+ {
+ LLAppearanceManager::instance().addCOFItemLink(inv_item, true);
+ }
}
void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type,
@@ -510,7 +514,7 @@ void LLAgentWearables::saveWearableAs(const EWearableType type,
type,
index,
new_wearable,
- addWearableToAgentInventoryCallback::CALL_UPDATE);
+ addWearableToAgentInventoryCallback::CALL_WEARITEM);
LLUUID category_id;
if (save_in_lost_and_found)
{
@@ -1601,31 +1605,32 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
LLWearable* new_wearable = wearables[i];
LLPointer<LLInventoryItem> new_item = items[i];
- const EWearableType type = new_wearable->getType();
- wearables_to_remove[type] = FALSE;
-
- // MULTI_WEARABLE: using 0th
- LLWearable* old_wearable = getWearable(type, 0);
- if (old_wearable)
+ llassert(new_wearable);
+ if (new_wearable)
{
- const LLUUID& old_item_id = getWearableItemID(type, 0);
- if ((old_wearable->getAssetID() == new_wearable->getAssetID()) &&
- (old_item_id == new_item->getUUID()))
- {
- lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl;
- continue;
- }
+ const EWearableType type = new_wearable->getType();
+ wearables_to_remove[type] = FALSE;
- // Assumes existing wearables are not dirty.
- if (old_wearable->isDirty())
+ // MULTI_WEARABLE: using 0th
+ LLWearable* old_wearable = getWearable(type, 0);
+ if (old_wearable)
{
- llassert(0);
- continue;
+ const LLUUID& old_item_id = getWearableItemID(type, 0);
+ if ((old_wearable->getAssetID() == new_wearable->getAssetID()) &&
+ (old_item_id == new_item->getUUID()))
+ {
+ lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl;
+ continue;
+ }
+
+ // Assumes existing wearables are not dirty.
+ if (old_wearable->isDirty())
+ {
+ llassert(0);
+ continue;
+ }
}
- }
- if (new_wearable)
- {
new_wearable->setItemID(new_item->getUUID());
setWearable(type,0,new_wearable);
}
@@ -2147,6 +2152,8 @@ void LLAgentWearables::updateServer()
void LLAgentWearables::populateMyOutfitsFolder(void)
{
+ llinfos << "starting outfit populate" << llendl;
+
LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch();
// Get the complete information on the items in the inventory and
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index b4f58674af..858540a5f5 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -244,7 +244,8 @@ private:
CALL_UPDATE = 1,
CALL_RECOVERDONE = 2,
CALL_CREATESTANDARDDONE = 4,
- CALL_MAKENEWOUTFITDONE = 8
+ CALL_MAKENEWOUTFITDONE = 8,
+ CALL_WEARITEM = 16
};
// MULTI-WEARABLE: index is an EWearableType - more confusing usage.
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 018e9a92a0..eb4a47664b 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -113,6 +113,8 @@ public:
protected:
~LLWearInventoryCategoryCallback()
{
+ llinfos << "done all inventory callbacks" << llendl;
+
// Is the destructor called by ordinary dereference, or because the app's shutting down?
// If the inventory callback manager goes away, we're shutting down, no longer want the callback.
if( LLInventoryCallbackManager::is_instantiated() )
@@ -150,12 +152,15 @@ protected:
void LLOutfitObserver::done()
{
+ llinfos << "done 2nd stage fetch" << llendl;
gInventory.removeObserver(this);
doOnIdle(boost::bind(&LLOutfitObserver::doWearCategory,this));
}
void LLOutfitObserver::doWearCategory()
{
+ llinfos << "starting" << llendl;
+
// We now have an outfit ready to be copied to agent inventory. Do
// it, and wear that outfit normally.
if(mCopyItems)
@@ -244,6 +249,8 @@ void LLOutfitFetch::done()
// What we do here is get the complete information on the items in
// the library, and set up an observer that will wait for that to
// happen.
+ llinfos << "done first stage fetch" << llendl;
+
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t item_array;
gInventory.collectDescendents(mCompleteFolders.front(),
@@ -304,6 +311,8 @@ public:
virtual ~LLUpdateAppearanceOnDestroy()
{
+ llinfos << "done update appearance on destroy" << llendl;
+
if (!LLApp::isExiting())
{
LLAppearanceManager::instance().updateAppearanceFromCOF();
@@ -312,6 +321,7 @@ public:
/* virtual */ void fire(const LLUUID& inv_item)
{
+ llinfos << "callback fired" << llendl;
mFireCount++;
}
private:
@@ -708,6 +718,8 @@ void LLAppearanceManager::linkAll(const LLUUID& category,
void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
{
+ llinfos << "starting" << llendl;
+
const LLUUID cof = getCOF();
// Deactivate currently active gestures in the COF, if replacing outfit
@@ -765,6 +777,7 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
gInventory.notifyObservers();
// Create links to new COF contents.
+ llinfos << "creating LLUpdateAppearanceOnDestroy" << llendl;
LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
linkAll(cof, body_items, link_waiter);
@@ -777,6 +790,7 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
{
createBaseOutfitLink(category, link_waiter);
}
+ llinfos << "waiting for LLUpdateAppearanceOnDestroy" << llendl;
}
void LLAppearanceManager::updatePanelOutfitName(const std::string& name)
@@ -848,6 +862,8 @@ void LLAppearanceManager::updateAppearanceFromCOF()
{
// update dirty flag to see if the state of the COF matches
// the saved outfit stored as a folder link
+ llinfos << "starting" << llendl;
+
updateIsDirty();
dumpCat(getCOF(),"COF, start");
@@ -978,8 +994,9 @@ void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, b
{
if(!category) return;
- lldebugs << "wearInventoryCategory( " << category->getName()
+ llinfos << "wearInventoryCategory( " << category->getName()
<< " )" << llendl;
+
// What we do here is get the complete information on the items in
// the inventory, and set up an observer that will wait for that to
// happen.
@@ -1008,7 +1025,8 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca
// this up front to avoid having to deal with the case of multiple
// wearables being dirty.
if(!category) return;
- lldebugs << "wearInventoryCategoryOnAvatar( " << category->getName()
+
+ llinfos << "wearInventoryCategoryOnAvatar( " << category->getName()
<< " )" << llendl;
if( gFloaterCustomize )
@@ -1285,6 +1303,23 @@ void LLAppearanceManager::updateIsDirty()
}
}
+void LLAppearanceManager::onFirstFullyVisible()
+{
+ // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account)
+ // then auto-populate outfits from the library into the My Outfits folder.
+
+ llinfos << "avatar fully visible" << llendl;
+
+ static bool check_populate_my_outfits = true;
+ if (check_populate_my_outfits &&
+ (LLInventoryModel::getIsFirstTimeInViewer2()
+ || gSavedSettings.getBOOL("MyOutfitsAutofill")))
+ {
+ gAgentWearables.populateMyOutfitsFolder();
+ }
+ check_populate_my_outfits = false;
+}
+
//#define DUMP_CAT_VERBOSE
void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 5fdff45735..28b51ee0f6 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -113,6 +113,9 @@ public:
// should only be necessary to do on initial login.
void updateIsDirty();
+ // Called when self avatar is first fully visible.
+ void onFirstFullyVisible();
+
protected:
LLAppearanceManager();
~LLAppearanceManager();
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index 0aaaa8e705..76e058a1c3 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -304,7 +304,9 @@ void LLCallFloater::updateSession()
updateAgentModeratorState();
//show floater for voice calls & only in CONNECTED to voice channel state
- if (!is_local_chat && LLVoiceChannel::STATE_CONNECTED == voice_channel->getState())
+ if (!is_local_chat &&
+ voice_channel &&
+ LLVoiceChannel::STATE_CONNECTED == voice_channel->getState())
{
LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
bool show_me = !(im_floater && im_floater->getVisible());
@@ -333,6 +335,7 @@ void LLCallFloater::refreshParticipantList()
{
mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT);
mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1));
+ mParticipants->setSortOrder(LLParticipantList::E_SORT_BY_RECENT_SPEAKERS);
if (LLLocalSpeakerMgr::getInstance() == mSpeakerManager)
{
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 996139fccc..c3bda26aac 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -63,6 +63,7 @@
#include "llviewerobjectlist.h"
#include "llviewerwindow.h"
#include "llvoavatar.h"
+#include "llavataractions.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@@ -711,7 +712,21 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
if(notify)
{
// Popup a notify box with online status of this agent
- LLNotificationPtr notification = LLNotificationsUtil::add(online ? "FriendOnline" : "FriendOffline", args);
+ LLNotificationPtr notification;
+
+ if (online)
+ {
+ notification =
+ LLNotificationsUtil::add("FriendOnline",
+ args,
+ LLSD().with("respond_on_mousedown", TRUE),
+ boost::bind(&LLAvatarActions::startIM, agent_id));
+ }
+ else
+ {
+ notification =
+ LLNotificationsUtil::add("FriendOffline", args);
+ }
// If there's an open IM session with this agent, send a notification there too.
LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id);
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 7a5d8be84a..9368d9cb7c 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -259,7 +259,9 @@ public:
mSessionID = chat.mSessionID;
mSourceType = chat.mSourceType;
gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4));
- if(chat.mFromID.isNull())
+
+ //*TODO overly defensive thing, source type should be maintained out there
+ if(chat.mFromID.isNull() || chat.mFromName == SYSTEM_FROM)
{
mSourceType = CHAT_SOURCE_SYSTEM;
}
@@ -269,17 +271,13 @@ public:
userName->setReadOnlyColor(style_params.readonly_color());
userName->setColor(style_params.color());
- if(!chat.mFromName.empty())
- {
- userName->setValue(chat.mFromName);
- mFrom = chat.mFromName;
- }
- else
+ userName->setValue(chat.mFromName);
+ if (chat.mFromName.empty() || CHAT_SOURCE_SYSTEM == mSourceType)
{
- std::string SL = LLTrans::getString("SECOND_LIFE");
- userName->setValue(SL);
+ userName->setValue(LLTrans::getString("SECOND_LIFE"));
}
+
mMinUserNameWidth = style_params.font()->getWidth(userName->getWText().c_str()) + PADDING;
setTimeField(chat);
@@ -289,20 +287,17 @@ public:
if(mSourceType != CHAT_SOURCE_AGENT)
icon->setDrawTooltip(false);
- if(!chat.mFromID.isNull())
+ switch (mSourceType)
{
- if(mSourceType != CHAT_SOURCE_AGENT)
- icon->setValue(LLSD("OBJECT_Icon"));
- else
+ case CHAT_SOURCE_AGENT:
icon->setValue(chat.mFromID);
-
-
- }
- else if (userName->getValue().asString()==LLTrans::getString("SECOND_LIFE"))
- {
- icon->setValue(LLSD("SL_Logo"));
+ break;
+ case CHAT_SOURCE_OBJECT:
+ icon->setValue(LLSD("OBJECT_Icon"));
+ break;
+ case CHAT_SOURCE_SYSTEM:
+ icon->setValue(LLSD("SL_Logo"));
}
-
}
/*virtual*/ void draw()
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index b006ae3420..ba17c5970e 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -1228,12 +1228,15 @@ T* LLChicletPanel::findChiclet(const LLUUID& im_session_id)
{
LLChiclet* chiclet = *it;
+ llassert(chiclet);
+ if (!chiclet) continue;
if(chiclet->getSessionId() == im_session_id)
{
T* result = dynamic_cast<T*>(chiclet);
- if(!result && chiclet)
+ if(!result)
{
llwarns << "Found chiclet but of wrong type " << llendl;
+ continue;
}
return result;
}
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index c0a3eb1316..80acc71a41 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -182,6 +182,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mAtlasInfop = NULL ;
mUsingAtlas = FALSE ;
+ mHasMedia = FALSE ;
}
@@ -1348,11 +1349,12 @@ const F32 LEAST_IMPORTANCE_FOR_LARGE_IMAGE = 0.3f ;
F32 LLFace::getTextureVirtualSize()
{
F32 radius;
- F32 cos_angle_to_view_dir;
- mPixelArea = calcPixelArea(cos_angle_to_view_dir, radius);
+ F32 cos_angle_to_view_dir;
+ BOOL in_frustum = calcPixelArea(cos_angle_to_view_dir, radius);
- if (mPixelArea < 0.0001f)
+ if (mPixelArea < 0.0001f || !in_frustum)
{
+ setVirtualSize(0.f) ;
return 0.f;
}
@@ -1389,30 +1391,36 @@ F32 LLFace::getTextureVirtualSize()
}
}
+ setVirtualSize(face_area) ;
+
return face_area;
}
-F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
+BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
{
//get area of circle around face
LLVector3 center = getPositionAgent();
LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;
LLViewerCamera* camera = LLViewerCamera::getInstance();
- //if has media, check if the face is out of the view frustum.
- BOOL has_media = hasMedia() ;
- if(has_media && !camera->AABBInFrustum(center, size))
- {
- mImportanceToCamera = 0.f ;
- return 0.f ;
- }
-
F32 size_squared = size.lengthSquared() ;
LLVector3 lookAt = center - camera->getOrigin();
- F32 dist = lookAt.normVec() ;
- cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
- if(has_media)
+ F32 dist = lookAt.normVec() ;
+
+ //get area of circle around node
+ F32 app_angle = atanf(fsqrtf(size_squared) / dist);
+ radius = app_angle*LLDrawable::sCurPixelAngle;
+ mPixelArea = radius*radius * 3.14159f;
+ cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
+
+ //if has media, check if the face is out of the view frustum.
+ if(hasMedia())
{
+ if(!camera->AABBInFrustum(center, size))
+ {
+ mImportanceToCamera = 0.f ;
+ return false ;
+ }
if(cos_angle_to_view_dir > camera->getCosHalfFov()) //the center is within the view frustum
{
cos_angle_to_view_dir = 1.0f ;
@@ -1426,11 +1434,6 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
}
}
- //get area of circle around node
- F32 app_angle = atanf(fsqrtf(size_squared) / dist);
- radius = app_angle*LLDrawable::sCurPixelAngle;
- F32 face_area = radius*radius * 3.14159f;
-
if(dist < mBoundingSphereRadius) //camera is very close
{
cos_angle_to_view_dir = 1.0f ;
@@ -1441,7 +1444,7 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ;
}
- return face_area ;
+ return true ;
}
//the projection of the face partially overlaps with the screen
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index bf658dc00c..67dd97e6f7 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -211,7 +211,7 @@ public:
private:
F32 adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius );
- F32 calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;
+ BOOL calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;
public:
static F32 calcImportanceToCamera(F32 to_view_dir, F32 dist);
diff --git a/indra/newview/llfloaterevent.cpp b/indra/newview/llfloaterevent.cpp
new file mode 100644
index 0000000000..64efa10ef9
--- /dev/null
+++ b/indra/newview/llfloaterevent.cpp
@@ -0,0 +1,324 @@
+/**
+ * @file llfloaterevent.cpp
+ * @brief Display for events in the finder
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterevent.h"
+
+#include "message.h"
+#include "llnotificationsutil.h"
+#include "llui.h"
+
+#include "llagent.h"
+#include "llviewerwindow.h"
+#include "llbutton.h"
+#include "llcachename.h"
+#include "llcommandhandler.h" // secondlife:///app/chat/ support
+#include "lleventflags.h"
+#include "lleventnotifier.h"
+#include "llexpandabletextbox.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "llfloaterworldmap.h"
+#include "llinventorymodel.h"
+#include "llsecondlifeurls.h"
+#include "llslurl.h"
+#include "lltextbox.h"
+#include "lltexteditor.h"
+#include "lluiconstants.h"
+#include "llviewercontrol.h"
+#include "llweb.h"
+#include "llworldmap.h"
+#include "lluictrlfactory.h"
+#include "lltrans.h"
+
+
+class LLEventHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLEventHandler() : LLCommandHandler("event", UNTRUSTED_THROTTLE) { }
+ bool handle(const LLSD& params, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ if (params.size() < 1)
+ {
+ return false;
+ }
+
+ LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
+ if (floater)
+ {
+ floater->setEventID(params[0].asInteger());
+ LLFloaterReg::showTypedInstance<LLFloaterEvent>("event");
+ return true;
+ }
+
+ return false;
+ }
+};
+LLEventHandler gEventHandler;
+
+LLFloaterEvent::LLFloaterEvent(const LLSD& key)
+ : LLFloater(key),
+
+ mEventID(0)
+{
+}
+
+
+LLFloaterEvent::~LLFloaterEvent()
+{
+}
+
+
+BOOL LLFloaterEvent::postBuild()
+{
+ mTBName = getChild<LLTextBox>("event_name");
+
+ mTBCategory = getChild<LLTextBox>("event_category");
+
+ mTBDate = getChild<LLTextBox>("event_date");
+
+ mTBDuration = getChild<LLTextBox>("event_duration");
+
+ mTBDesc = getChild<LLExpandableTextBox>("event_desc");
+ mTBDesc->setEnabled(FALSE);
+
+ mTBRunBy = getChild<LLTextBox>("event_runby");
+ mTBLocation = getChild<LLTextBox>("event_location");
+ mTBCover = getChild<LLTextBox>("event_cover");
+
+ mTeleportBtn = getChild<LLButton>( "teleport_btn");
+ mTeleportBtn->setClickedCallback(onClickTeleport, this);
+
+ mMapBtn = getChild<LLButton>( "map_btn");
+ mMapBtn->setClickedCallback(onClickMap, this);
+
+ mNotifyBtn = getChild<LLButton>( "notify_btn");
+ mNotifyBtn->setClickedCallback(onClickNotify, this);
+
+ mCreateEventBtn = getChild<LLButton>( "create_event_btn");
+ mCreateEventBtn->setClickedCallback(onClickCreateEvent, this);
+
+ mGodDeleteEventBtn = getChild<LLButton>( "god_delete_event_btn");
+ mGodDeleteEventBtn->setClickedCallback(boost::bind(&LLFloaterEvent::onClickDeleteEvent, this));
+
+ return TRUE;
+}
+
+void LLFloaterEvent::setEventID(const U32 event_id)
+{
+ mEventID = event_id;
+ // Should reset all of the panel state here
+ resetInfo();
+
+ if (event_id != 0)
+ {
+ sendEventInfoRequest();
+ }
+}
+
+void LLFloaterEvent::onClickDeleteEvent()
+{
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_EventGodDelete);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+
+ msg->nextBlockFast(_PREHASH_EventData);
+ msg->addU32Fast(_PREHASH_EventID, mEventID);
+
+ gAgent.sendReliableMessage();
+}
+
+void LLFloaterEvent::sendEventInfoRequest()
+{
+ LLMessageSystem *msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_EventInfoRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
+ msg->nextBlockFast(_PREHASH_EventData);
+ msg->addU32Fast(_PREHASH_EventID, mEventID);
+ gAgent.sendReliableMessage();
+}
+
+//static
+void LLFloaterEvent::processEventInfoReply(LLMessageSystem *msg, void **)
+{
+ // extract the agent id
+ LLUUID agent_id;
+ msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
+
+ LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
+
+ if(floater)
+ {
+ floater->mEventInfo.unpack(msg);
+ floater->mTBName->setText(floater->mEventInfo.mName);
+ floater->mTBCategory->setText(floater->mEventInfo.mCategoryStr);
+ floater->mTBDate->setText(floater->mEventInfo.mTimeStr);
+ floater->mTBDesc->setText(floater->mEventInfo.mDesc);
+ floater->mTBRunBy->setText(LLSLURL::buildCommand("agent", floater->mEventInfo.mRunByID, "inspect"));
+
+ floater->mTBDuration->setText(llformat("%d:%.2d", floater->mEventInfo.mDuration / 60, floater->mEventInfo.mDuration % 60));
+
+ if (!floater->mEventInfo.mHasCover)
+ {
+ floater->mTBCover->setText(floater->getString("none"));
+ }
+ else
+ {
+ floater->mTBCover->setText(llformat("%d", floater->mEventInfo.mCover));
+ }
+
+ F32 global_x = (F32)floater->mEventInfo.mPosGlobal.mdV[VX];
+ F32 global_y = (F32)floater->mEventInfo.mPosGlobal.mdV[VY];
+
+ S32 region_x = llround(global_x) % REGION_WIDTH_UNITS;
+ S32 region_y = llround(global_y) % REGION_WIDTH_UNITS;
+ S32 region_z = llround((F32)floater->mEventInfo.mPosGlobal.mdV[VZ]);
+
+ std::string desc = floater->mEventInfo.mSimName + llformat(" (%d, %d, %d)", region_x, region_y, region_z);
+ floater->mTBLocation->setText(desc);
+
+ if (floater->mEventInfo.mEventFlags & EVENT_FLAG_MATURE)
+ {
+ floater->childSetVisible("event_mature_yes", TRUE);
+ floater->childSetVisible("event_mature_no", FALSE);
+ }
+ else
+ {
+ floater->childSetVisible("event_mature_yes", FALSE);
+ floater->childSetVisible("event_mature_no", TRUE);
+ }
+
+ if (floater->mEventInfo.mUnixTime < time_corrected())
+ {
+ floater->mNotifyBtn->setEnabled(FALSE);
+ }
+ else
+ {
+ floater->mNotifyBtn->setEnabled(TRUE);
+ }
+
+ if (gEventNotifier.hasNotification(floater->mEventInfo.mID))
+ {
+ floater->mNotifyBtn->setLabel(floater->getString("dont_notify"));
+ }
+ else
+ {
+ floater->mNotifyBtn->setLabel(floater->getString("notify"));
+ }
+
+ floater->mMapBtn->setEnabled(TRUE);
+ floater->mTeleportBtn->setEnabled(TRUE);
+ }
+}
+
+
+void LLFloaterEvent::draw()
+{
+ mGodDeleteEventBtn->setVisible(gAgent.isGodlike());
+
+ LLPanel::draw();
+}
+
+void LLFloaterEvent::resetInfo()
+{
+ mTBName->setText(LLStringUtil::null);
+ mTBCategory->setText(LLStringUtil::null);
+ mTBDate->setText(LLStringUtil::null);
+ mTBDesc->setText(LLStringUtil::null);
+ mTBDuration->setText(LLStringUtil::null);
+ mTBCover->setText(LLStringUtil::null);
+ mTBLocation->setText(LLStringUtil::null);
+ mTBRunBy->setText(LLStringUtil::null);
+ mNotifyBtn->setEnabled(FALSE);
+ mMapBtn->setEnabled(FALSE);
+ mTeleportBtn->setEnabled(FALSE);
+}
+
+// static
+void LLFloaterEvent::onClickTeleport(void* data)
+{
+ LLFloaterEvent* self = (LLFloaterEvent*)data;
+ LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+ if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance)
+ {
+ gAgent.teleportViaLocation(self->mEventInfo.mPosGlobal);
+ worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal);
+ }
+}
+
+
+// static
+void LLFloaterEvent::onClickMap(void* data)
+{
+ LLFloaterEvent* self = (LLFloaterEvent*)data;
+ LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+
+ if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance)
+ {
+ worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal);
+ LLFloaterReg::showInstance("world_map", "center");
+ }
+}
+
+
+// static
+void LLFloaterEvent::onClickCreateEvent(void* data)
+{
+ LLNotificationsUtil::add("PromptGoToEventsPage");//, LLSD(), LLSD(), callbackCreateEventWebPage);
+}
+
+
+// static
+void LLFloaterEvent::onClickNotify(void *data)
+{
+ LLFloaterEvent* self = (LLFloaterEvent*)data;
+
+ if (!gEventNotifier.hasNotification(self->mEventID))
+ {
+ gEventNotifier.add(self->mEventInfo);
+ self->mNotifyBtn->setLabel(self->getString("dont_notify"));
+ }
+ else
+ {
+ gEventNotifier.remove(self->mEventInfo.mID);
+ self->mNotifyBtn->setLabel(self->getString("notify"));
+ }
+}
diff --git a/indra/newview/llfloaterevent.h b/indra/newview/llfloaterevent.h
new file mode 100644
index 0000000000..54aaaf6a0f
--- /dev/null
+++ b/indra/newview/llfloaterevent.h
@@ -0,0 +1,96 @@
+/**
+ * @file llfloaterevent.h
+ * @brief Display for events in the finder
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATEREVENT_H
+#define LL_LLFLOATEREVENT_H
+
+#include "llfloater.h"
+#include "lleventinfo.h"
+#include "lluuid.h"
+#include "v3dmath.h"
+
+class LLTextBox;
+class LLTextEditor;
+class LLButton;
+class LLExpandableTextBox;
+class LLMessageSystem;
+
+class LLFloaterEvent : public LLFloater
+{
+public:
+ LLFloaterEvent(const LLSD& key);
+ /*virtual*/ ~LLFloaterEvent();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void draw();
+
+ void setEventID(const U32 event_id);
+ void sendEventInfoRequest();
+
+ static void processEventInfoReply(LLMessageSystem *msg, void **);
+
+ U32 getEventID() { return mEventID; }
+
+protected:
+ void resetInfo();
+
+ static void onClickTeleport(void*);
+ static void onClickMap(void*);
+ //static void onClickLandmark(void*);
+ static void onClickCreateEvent(void*);
+ static void onClickNotify(void*);
+ void onClickDeleteEvent();
+
+// static bool callbackCreateEventWebPage(const LLSD& notification, const LLSD& response);
+
+protected:
+ U32 mEventID;
+ LLEventInfo mEventInfo;
+
+ LLTextBox* mTBName;
+ LLTextBox* mTBCategory;
+ LLTextBox* mTBDate;
+ LLTextBox* mTBDuration;
+ LLExpandableTextBox* mTBDesc;
+
+ LLTextBox* mTBRunBy;
+ LLTextBox* mTBLocation;
+ LLTextBox* mTBCover;
+
+ LLButton* mTeleportBtn;
+ LLButton* mMapBtn;
+ LLButton* mCreateEventBtn;
+ LLButton* mGodDeleteEventBtn;
+ LLButton* mNotifyBtn;
+};
+
+#endif // LL_LLFLOATEREVENT_H
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index 90617a337a..9c1ac2631d 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -203,12 +203,12 @@ BOOL LLFloaterGesture::postBuild()
gInventory.addObserver(this);
fetchDescendents(folders);
- buildGestureList();
-
- mGestureList->setFocus(TRUE);
-
if (mGestureList)
{
+ buildGestureList();
+
+ mGestureList->setFocus(TRUE);
+
const BOOL ascending = TRUE;
mGestureList->sortByColumn(std::string("name"), ascending);
mGestureList->selectFirstItem();
@@ -223,10 +223,10 @@ BOOL LLFloaterGesture::postBuild()
void LLFloaterGesture::refreshAll()
{
- buildGestureList();
-
if (!mGestureList) return;
+ buildGestureList();
+
if (mSelectedID.isNull())
{
mGestureList->selectFirstItem();
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index c930e99bad..8ab050beaa 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -283,8 +283,13 @@ void LLFloaterTopObjects::updateSelectionInfo()
std::string object_id_string = object_id.asString();
childSetValue("id_editor", LLSD(object_id_string));
- childSetValue("object_name_editor", list->getFirstSelected()->getColumn(1)->getValue().asString());
- childSetValue("owner_name_editor", list->getFirstSelected()->getColumn(2)->getValue().asString());
+ LLScrollListItem* sli = list->getFirstSelected();
+ llassert(sli);
+ if (sli)
+ {
+ childSetValue("object_name_editor", sli->getColumn(1)->getValue().asString());
+ childSetValue("owner_name_editor", sli->getColumn(2)->getValue().asString());
+ }
}
// static
diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp
index 66a1f6701f..1bbee2625c 100644
--- a/indra/newview/llfloaterwater.cpp
+++ b/indra/newview/llfloaterwater.cpp
@@ -574,12 +574,10 @@ bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& r
LLComboBox* combo_box = getChild<LLComboBox>("WaterPresetsCombo");
LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
LLComboBox* key_combo = NULL;
- LLMultiSliderCtrl* mult_sldr = NULL;
if (day_cycle)
{
key_combo = day_cycle->getChild<LLComboBox>("WaterKeyPresets");
- mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WaterDayCycleKeys");
}
std::string name = combo_box->getSelectedValue().asString();
diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp
index ea6fda7303..c1b15c578c 100644
--- a/indra/newview/llfloaterwindlight.cpp
+++ b/indra/newview/llfloaterwindlight.cpp
@@ -749,12 +749,10 @@ bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLS
LLComboBox* combo_box = getChild<LLComboBox>("WLPresetsCombo");
LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
LLComboBox* key_combo = NULL;
- LLMultiSliderCtrl* mult_sldr = NULL;
if (day_cycle)
{
key_combo = day_cycle->getChild<LLComboBox>("WLKeyPresets");
- mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
}
std::string name(combo_box->getSelectedValue().asString());
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 3946224c0c..76607e4874 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -1855,10 +1855,9 @@ EInventorySortGroup LLFolderViewFolder::getSortGroup() const
return SG_TRASH_FOLDER;
}
- // Folders that can't be moved are 'system' folders.
if( mListener )
{
- if( !(mListener->isItemMovable()) )
+ if(LLFolderType::lookupIsProtectedType(mListener->getPreferredType()))
{
return SG_SYSTEM_FOLDER;
}
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 53cdfcc9b2..94b540a7e1 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -271,6 +271,7 @@ BOOL LLIMFloater::postBuild()
mInputEditor->setCommitOnFocusLost( FALSE );
mInputEditor->setRevertOnEsc( FALSE );
mInputEditor->setReplaceNewlinesWithSpaces( FALSE );
+ mInputEditor->setPassDelete( TRUE );
std::string session_name(LLIMModel::instance().getName(mSessionID));
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index 7162386d08..49521b5987 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -93,7 +93,7 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp,
LLIconCtrl* icon = 0;
- if(gAgent.isInGroup(session_id))
+ if(gAgent.isInGroup(session_id, TRUE))
{
LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>();
icon_params.group_id = session_id;
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index da95eaefca..ec2be0e8e9 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -2434,7 +2434,10 @@ void LLFolderBridge::pasteFromClipboard()
//we have to update inventory locally too
LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);
llassert(viitem);
- changeItemParent(model, viitem, parent_id, FALSE);
+ if (viitem)
+ {
+ changeItemParent(model, viitem, parent_id, FALSE);
+ }
}
else
{
@@ -5093,12 +5096,18 @@ void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type,
//static
void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model)
{
- LLAssetType::EType asset_type = model->getItem(uuid)->getType();
- LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
- if(action)
+ llassert(model);
+ LLViewerInventoryItem* item = model->getItem(uuid);
+ llassert(item);
+ if (item)
{
- action->doIt();
- delete action;
+ LLAssetType::EType asset_type = item->getType();
+ LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
+ if(action)
+ {
+ action->doIt();
+ delete action;
+ }
}
}
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 7ec976604a..326f2a5577 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -1937,23 +1937,26 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item)
{
//llinfos << "LLInventoryModel::addItem()" << llendl;
- // This can happen if assettype enums from llassettype.h ever change.
- // For example, there is a known backwards compatibility issue in some viewer prototypes prior to when
- // the AT_LINK enum changed from 23 to 24.
- if ((item->getType() == LLAssetType::AT_NONE)
- || LLAssetType::lookup(item->getType()) == LLAssetType::badLookup())
- {
- llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl;
- return;
- }
+ llassert(item);
if(item)
{
+ // This can happen if assettype enums from llassettype.h ever change.
+ // For example, there is a known backwards compatibility issue in some viewer prototypes prior to when
+ // the AT_LINK enum changed from 23 to 24.
+ if ((item->getType() == LLAssetType::AT_NONE)
+ || LLAssetType::lookup(item->getType()) == LLAssetType::badLookup())
+ {
+ llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl;
+ return;
+ }
+
// This condition means that we tried to add a link without the baseobj being in memory.
// The item will show up as a broken link.
if (item->getIsBrokenLink())
{
llinfos << "Adding broken link [ name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << llendl;
}
+
mItemMap[item->getUUID()] = item;
}
}
diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp
index 52de8355e9..60e41b64ac 100644
--- a/indra/newview/llnotificationalerthandler.cpp
+++ b/indra/newview/llnotificationalerthandler.cpp
@@ -36,6 +36,7 @@
#include "llnotificationhandler.h"
#include "llnotifications.h"
+#include "llprogressview.h"
#include "lltoastnotifypanel.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
@@ -116,6 +117,11 @@ bool LLAlertHandler::processNotification(const LLSD& notify)
p.is_modal = mIsModal;
p.on_delete_toast = boost::bind(&LLAlertHandler::onDeleteToast, this, _1);
+ // Show alert in middle of progress view (during teleport) (EXT-1093)
+ LLProgressView* progress = gViewerWindow->getProgressView();
+ LLRect rc = progress && progress->getVisible() ? progress->getRect() : gViewerWindow->getWorldViewRectScaled();
+ mChannel->updatePositionAndSize(rc, rc);
+
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
if(channel)
channel->addToast(p);
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 8c5208678e..b50c6442e1 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -265,10 +265,13 @@ void LLPanelFace::sendAlpha()
void LLPanelFace::sendGlow()
{
- LLSpinCtrl* mCtrlGlow = getChild<LLSpinCtrl>("glow");
- F32 glow = mCtrlGlow->get();
-
- LLSelectMgr::getInstance()->selectionSetGlow( glow );
+ LLSpinCtrl* mCtrlGlow = getChild<LLSpinCtrl>("glow");
+ llassert(mCtrlGlow);
+ if (mCtrlGlow)
+ {
+ F32 glow = mCtrlGlow->get();
+ LLSelectMgr::getInstance()->selectionSetGlow( glow );
+ }
}
struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
@@ -286,6 +289,9 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
LLCheckBoxCtrl* checkFlipScaleS = mPanel->getChild<LLCheckBoxCtrl>("checkbox flip s");
LLCheckBoxCtrl* checkFlipScaleT = mPanel->getChild<LLCheckBoxCtrl>("checkbox flip t");
LLComboBox* comboTexGen = mPanel->getChild<LLComboBox>("combobox texgen");
+ llassert(comboTexGen);
+ llassert(object);
+
if (ctrlTexScaleS)
{
valid = !ctrlTexScaleS->getTentative() || !checkFlipScaleS->getTentative();
@@ -296,7 +302,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
{
value = -value;
}
- if (comboTexGen->getCurrentIndex() == 1)
+ if (comboTexGen &&
+ comboTexGen->getCurrentIndex() == 1)
{
value *= 0.5f;
}
@@ -314,7 +321,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
{
value = -value;
}
- if (comboTexGen->getCurrentIndex() == 1)
+ if (comboTexGen &&
+ comboTexGen->getCurrentIndex() == 1)
{
value *= 0.5f;
}
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 06a682c905..05261a65de 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -36,6 +36,7 @@
#include "llagent.h"
#include "llfloateravatarpicker.h"
#include "llbutton.h"
+#include "llcallingcard.h"
#include "llcombobox.h"
#include "llgroupactions.h"
#include "llgroupmgr.h"
@@ -405,16 +406,13 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
{
LLUUID agent_id = agent_ids[i];
LLViewerObject* dest = gObjectList.findObject(agent_id);
+ std::string fullname;
if(dest && dest->isAvatar())
{
- std::string fullname;
- LLSD args;
LLNameValue* nvfirst = dest->getNVPair("FirstName");
LLNameValue* nvlast = dest->getNVPair("LastName");
if(nvfirst && nvlast)
{
- args["FIRST"] = std::string(nvfirst->getString());
- args["LAST"] = std::string(nvlast->getString());
fullname = std::string(nvfirst->getString()) + " " + std::string(nvlast->getString());
}
if (!fullname.empty())
@@ -427,10 +425,44 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
names.push_back("(Unknown)");
}
}
+ else
+ {
+ //looks like user try to invite offline friend
+ //for offline avatar_id gObjectList.findObject() will return null
+ //so we need to do this additional search in avatar tracker, see EXT-4732
+ if (LLAvatarTracker::instance().isBuddy(agent_id))
+ {
+ if (!gCacheName->getFullName(agent_id, fullname))
+ {
+ // actually it should happen, just in case
+ gCacheName->get(LLUUID(agent_id), false, boost::bind(
+ &LLPanelGroupInvite::addUserCallback, this, _1, _2,
+ _3));
+ // for this special case!
+ //when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
+ // removed id will be added in callback
+ agent_ids.erase(agent_ids.begin() + i);
+ }
+ else
+ {
+ names.push_back(fullname);
+ }
+ }
+ }
}
mImplementation->addUsers(names, agent_ids);
}
+void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name)
+{
+ std::vector<std::string> names;
+ std::vector<LLUUID> agent_ids;
+ std::string full_name = first_name + " " + last_name;
+ agent_ids.push_back(id);
+ names.push_back(first_name + " " + last_name);
+
+ mImplementation->addUsers(names, agent_ids);
+}
void LLPanelGroupInvite::draw()
{
LLPanel::draw();
diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h
index 37135b488a..b095dd2395 100644
--- a/indra/newview/llpanelgroupinvite.h
+++ b/indra/newview/llpanelgroupinvite.h
@@ -43,6 +43,10 @@ public:
~LLPanelGroupInvite();
void addUsers(std::vector<LLUUID>& agent_ids);
+ /**
+ * this callback is being used to add a user whose fullname isn't been loaded before invoking of addUsers().
+ */
+ void addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name);
void clear();
void update();
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index cd6c727b5c..56d52ccc65 100644
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -376,21 +376,31 @@ void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id)
// static
std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCategory* cat)
{
- std::string name = cat->getName();
+ std::string name;
LLUUID parent_id;
- // translate category name, if it's right below the root
- // FIXME: it can throw notification about non existent string in strings.xml
- if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID())
+ llassert(cat);
+ if (cat)
{
- LLTrans::findString(name, "InvFolder " + name);
- }
+ name = cat->getName();
- // we don't want "My Inventory" to appear in the name
- while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID())
- {
- cat = gInventory.getCategory(parent_id);
- name = cat->getName() + "/" + name;
+ // translate category name, if it's right below the root
+ // FIXME: it can throw notification about non existent string in strings.xml
+ if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID())
+ {
+ LLTrans::findString(name, "InvFolder " + name);
+ }
+
+ // we don't want "My Inventory" to appear in the name
+ while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID())
+ {
+ cat = gInventory.getCategory(parent_id);
+ llassert(cat);
+ if (cat)
+ {
+ name = cat->getName() + "/" + name;
+ }
+ }
}
return name;
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index f1cb6e87a3..40ea75ea7a 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -111,25 +111,76 @@ void LLCheckFolderState::doFolder(LLFolderViewFolder* folder)
}
}
+// Functor searching and opening a folder specified by UUID
+// in a folder view tree.
+class LLOpenFolderByID : public LLFolderViewFunctor
+{
+public:
+ LLOpenFolderByID(const LLUUID& folder_id)
+ : mFolderID(folder_id)
+ , mIsFolderOpen(false)
+ {}
+ virtual ~LLOpenFolderByID() {}
+ /*virtual*/ void doFolder(LLFolderViewFolder* folder);
+ /*virtual*/ void doItem(LLFolderViewItem* item) {}
+
+ bool isFolderOpen() { return mIsFolderOpen; }
+
+private:
+ bool mIsFolderOpen;
+ LLUUID mFolderID;
+};
+
+// virtual
+void LLOpenFolderByID::doFolder(LLFolderViewFolder* folder)
+{
+ if (folder->getListener() && folder->getListener()->getUUID() == mFolderID)
+ {
+ if (!folder->isOpen())
+ {
+ folder->setOpen(TRUE);
+ mIsFolderOpen = true;
+ }
+ }
+}
+
/**
* Bridge to support knowing when the inventory has changed to update Landmarks tab
* ShowFolderState filter setting to show all folders when the filter string is empty and
* empty folder message when Landmarks inventory category has no children.
+ * Ensures that "Landmarks" folder in the Library is open on strart up.
*/
class LLLandmarksPanelObserver : public LLInventoryObserver
{
public:
- LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {}
+ LLLandmarksPanelObserver(LLLandmarksPanel* lp)
+ : mLP(lp),
+ mIsLibraryLandmarksOpen(false)
+ {}
virtual ~LLLandmarksPanelObserver() {}
/*virtual*/ void changed(U32 mask);
private:
LLLandmarksPanel* mLP;
+ bool mIsLibraryLandmarksOpen;
};
void LLLandmarksPanelObserver::changed(U32 mask)
{
mLP->updateShowFolderState();
+
+ LLPlacesInventoryPanel* library = mLP->getLibraryInventoryPanel();
+ if (!mIsLibraryLandmarksOpen && library)
+ {
+ // Search for "Landmarks" folder in the Library and open it once on start up. See EXT-4827.
+ const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true);
+ if (landmarks_cat.notNull())
+ {
+ LLOpenFolderByID opener(landmarks_cat);
+ library->getRootFolder()->applyFunctorRecursively(opener);
+ mIsLibraryLandmarksOpen = opener.isFolderOpen();
+ }
+ }
}
LLLandmarksPanel::LLLandmarksPanel()
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index cbbd10ac26..6358bd6f23 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -78,6 +78,8 @@ public:
*/
void setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_focus);
+ LLPlacesInventoryPanel* getLibraryInventoryPanel() { return mLibraryInventoryPanel; }
+
protected:
/**
* @return true - if current selected panel is not null and selected item is a landmark
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index a81ec61263..d452ef2228 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -67,6 +67,7 @@ LLUUID notification_id_to_object_id(const LLUUID& notification_id)
LLScriptFloater::LLScriptFloater(const LLSD& key)
: LLDockableFloater(NULL, true, key)
, mScriptForm(NULL)
+, mSaveFloaterPosition(false)
{
setMouseDownCallback(boost::bind(&LLScriptFloater::onMouseDown, this));
setOverlapsScreenChannel(true);
@@ -105,27 +106,29 @@ LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)
LLScriptFloater* floater = LLFloaterReg::getTypedInstance<LLScriptFloater>("script_floater", notification_id);
floater->setNotificationId(notification_id);
floater->createForm(notification_id);
- LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, TRUE);
- if (floater->getDockControl() == NULL)
+ if(LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id))
{
- LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(notification_id);
- if (chiclet == NULL)
- {
- llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
- }
- else
- {
- LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
- }
-
- floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
- LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, floater, _1)));
+ floater->setSavePosition(true);
+ floater->restorePosition();
+ }
+ else
+ {
+ floater->dockToChiclet(true);
}
+ LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, TRUE);
+
return floater;
}
+void LLScriptFloater::setNotificationId(const LLUUID& id)
+{
+ mNotificationId = id;
+ // Lets save object id now while notification exists
+ mObjectId = notification_id_to_object_id(id);
+}
+
void LLScriptFloater::getAllowedRect(LLRect& rect)
{
rect = gViewerWindow->getWorldViewRectRaw();
@@ -162,6 +165,8 @@ void LLScriptFloater::createForm(const LLUUID& notification_id)
void LLScriptFloater::onClose(bool app_quitting)
{
+ savePosition();
+
if(getNotificationId().notNull())
{
LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId());
@@ -172,6 +177,8 @@ void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */)
{
LLDockableFloater::setDocked(docked, pop_on_undock);
+ savePosition();
+
hideToastsIfNeeded();
}
@@ -208,6 +215,33 @@ void LLScriptFloater::onMouseDown()
}
}
+void LLScriptFloater::savePosition()
+{
+ if(getSavePosition() && mObjectId.notNull())
+ {
+ LLScriptFloaterManager::FloaterPositionInfo fpi = {getRect(), isDocked()};
+ LLScriptFloaterManager::getInstance()->saveFloaterPosition(mObjectId, fpi);
+ }
+}
+
+void LLScriptFloater::restorePosition()
+{
+ LLScriptFloaterManager::FloaterPositionInfo fpi;
+ if(LLScriptFloaterManager::getInstance()->getFloaterPosition(mObjectId, fpi))
+ {
+ dockToChiclet(fpi.mDockState);
+ if(!fpi.mDockState)
+ {
+ // Un-docked floater is opened in 0,0, now move it to saved position
+ translate(fpi.mRect.mLeft - getRect().mLeft, fpi.mRect.mTop - getRect().mTop);
+ }
+ }
+ else
+ {
+ dockToChiclet(true);
+ }
+}
+
void LLScriptFloater::onFocusLost()
{
if(getNotificationId().notNull())
@@ -225,6 +259,33 @@ void LLScriptFloater::onFocusReceived()
}
}
+void LLScriptFloater::dockToChiclet(bool dock)
+{
+ if (getDockControl() == NULL)
+ {
+ LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId());
+ if (chiclet == NULL)
+ {
+ llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl;
+ return;
+ }
+ else
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+ }
+
+ // Stop saving position while we dock floater
+ bool save = getSavePosition();
+ setSavePosition(false);
+
+ setDockControl(new LLDockControl(chiclet, this, getDockTongue(),
+ LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, this, _1)), dock);
+
+ // Restore saving
+ setSavePosition(save);
+ }
+}
+
void LLScriptFloater::hideToastsIfNeeded()
{
using namespace LLNotificationsUI;
@@ -326,6 +387,7 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
if(floater)
{
+ floater->savePosition();
floater->setNotificationId(LLUUID::null);
floater->closeFloater();
}
@@ -445,4 +507,27 @@ LLScriptFloaterManager::script_notification_map_t::const_iterator LLScriptFloate
return mNotifications.end();
}
+void LLScriptFloaterManager::saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi)
+{
+ if(object_id.notNull())
+ {
+ LLScriptFloaterManager::getInstance()->mFloaterPositions[object_id] = fpi;
+ }
+ else
+ {
+ llwarns << "Invalid object id" << llendl;
+ }
+}
+
+bool LLScriptFloaterManager::getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi)
+{
+ floater_position_map_t::const_iterator it = mFloaterPositions.find(object_id);
+ if(LLScriptFloaterManager::getInstance()->mFloaterPositions.end() != it)
+ {
+ fpi = it->second;
+ return true;
+ }
+ return false;
+}
+
// EOF
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index f7efff83f9..ec3ec4b540 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -84,16 +84,21 @@ public:
static std::string getObjectName(const LLUUID& notification_id);
- /**
- * Callback for notification toast buttons.
- */
- static void onToastButtonClick(const LLSD&notification, const LLSD&response);
-
typedef boost::signals2::signal<void(const LLSD&)> object_signal_t;
boost::signals2::connection addNewObjectCallback(const object_signal_t::slot_type& cb) { return mNewObjectSignal.connect(cb); }
boost::signals2::connection addToggleObjectFloaterCallback(const object_signal_t::slot_type& cb) { return mToggleFloaterSignal.connect(cb); }
+ struct FloaterPositionInfo
+ {
+ LLRect mRect;
+ bool mDockState;
+ };
+
+ void saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi);
+
+ bool getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi);
+
protected:
typedef std::map<std::string, EObjectType> object_type_map;
@@ -111,6 +116,11 @@ private:
object_signal_t mNewObjectSignal;
object_signal_t mToggleFloaterSignal;
+
+ // <object_id, floater position>
+ typedef std::map<LLUUID, FloaterPositionInfo> floater_position_map_t;
+
+ floater_position_map_t mFloaterPositions;
};
/**
@@ -141,7 +151,7 @@ public:
const LLUUID& getNotificationId() { return mNotificationId; }
- void setNotificationId(const LLUUID& id) { mNotificationId = id; }
+ void setNotificationId(const LLUUID& id);
/**
* Close notification if script floater is closed.
@@ -158,6 +168,14 @@ public:
*/
/*virtual*/ void setVisible(BOOL visible);
+ bool getSavePosition() { return mSaveFloaterPosition; }
+
+ void setSavePosition(bool save) { mSaveFloaterPosition = save; }
+
+ void savePosition();
+
+ void restorePosition();
+
protected:
/**
@@ -181,9 +199,13 @@ protected:
/*virtual*/ void onFocusReceived();
+ void dockToChiclet(bool dock);
+
private:
LLToastNotifyPanel* mScriptForm;
LLUUID mNotificationId;
+ LLUUID mObjectId;
+ bool mSaveFloaterPosition;
};
#endif //LL_SCRIPTFLOATER_H
diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp
index 93a70b6471..a130878176 100644
--- a/indra/newview/llsearchcombobox.cpp
+++ b/indra/newview/llsearchcombobox.cpp
@@ -78,6 +78,7 @@ LLSearchComboBox::LLSearchComboBox(const Params&p)
button_params.click_callback.function(boost::bind(&LLSearchComboBox::onSelectionCommit, this));
mSearchButton = LLUICtrlFactory::create<LLButton>(button_params);
mTextEntry->addChild(mSearchButton);
+ mTextEntry->setPassDelete(TRUE);
setButtonVisible(p.dropdown_button_visible);
mTextEntry->setCommitCallback(boost::bind(&LLComboBox::onTextCommit, this, _2));
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index d1b91df6e9..136989166f 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -123,7 +123,7 @@
#include "llmutelist.h"
#include "llpanelavatar.h"
#include "llavatarpropertiesprocessor.h"
-#include "llpanelevent.h"
+#include "llfloaterevent.h"
#include "llpanelclassified.h"
#include "llpanelpick.h"
#include "llpanelplace.h"
@@ -1891,17 +1891,6 @@ bool idle_startup()
}
}
- // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account)
- // then auto-populate outfits from the library into the My Outfits folder.
- static bool check_populate_my_outfits = true;
- if (check_populate_my_outfits &&
- (LLInventoryModel::getIsFirstTimeInViewer2()
- || gSavedSettings.getBOOL("MyOutfitsAutofill")))
- {
- gAgentWearables.populateMyOutfitsFolder();
- }
- check_populate_my_outfits = false;
-
return TRUE;
}
@@ -2484,7 +2473,7 @@ void register_viewer_callbacks(LLMessageSystem* msg)
msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply);
msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply);
- msg->setHandlerFunc("EventInfoReply", LLPanelEvent::processEventInfoReply);
+ msg->setHandlerFunc("EventInfoReply", LLFloaterEvent::processEventInfoReply);
msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply);
// msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply);
msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply);
@@ -2544,6 +2533,8 @@ bool callback_choose_gender(const LLSD& notification, const LLSD& response)
void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
const std::string& gender_name )
{
+ llinfos << "starting" << llendl;
+
// Not going through the processAgentInitialWearables path, so need to set this here.
LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);
// Initiate creation of COF, since we're also bypassing that.
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 4a61130785..6c35464a51 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -982,7 +982,12 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
if (mLoadedDiscard < 0)
{
- llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl;
+ //llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl;
+
+ //abort, don't decode
+ mState = DONE;
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ return true;
}
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
mRawImage = NULL;
@@ -1510,8 +1515,8 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con
unlockQueue() ;
worker->lockWorkMutex();
- worker->mActiveCount++;
- worker->mNeedsAux = needs_aux;
+ worker->mActiveCount++;
+ worker->mNeedsAux = needs_aux;
worker->unlockWorkMutex();
}
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 4d741456c4..980b51337f 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -294,6 +294,15 @@ void LLToastNotifyPanel::adjustPanelForTipNotice()
mControlPanel->setVisible(FALSE);
reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight());
+
+ if (mNotification->getPayload().has("respond_on_mousedown")
+ && mNotification->getPayload()["respond_on_mousedown"] )
+ {
+ mInfoPanel->setMouseDownCallback(
+ boost::bind(&LLNotification::respond,
+ mNotification,
+ mNotification->getResponseTemplate()));
+ }
}
// static
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 29114c33c5..eb070fb3ef 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -55,6 +55,7 @@
#include "llfloaterbump.h"
#include "llfloatercamera.h"
#include "llfloaterdaycycle.h"
+#include "llfloaterevent.h"
#include "llfloatersearch.h"
#include "llfloaterenvsettings.h"
#include "llfloaterfonttest.h"
@@ -160,6 +161,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("env_settings", "floater_env_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvSettings>);
LLFloaterReg::add("env_water", "floater_water.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWater>);
LLFloaterReg::add("env_windlight", "floater_windlight_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWindLight>);
+
+ LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>);
LLFloaterReg::add("font_test", "floater_font_test.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFontTest>);
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 3001992630..b69eaa4853 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -649,6 +649,8 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const
void LLViewerInventoryCategory::determineFolderType()
{
+ /* Do NOT uncomment this code. This is for future 2.1 support of ensembles.
+ llassert(FALSE);
LLFolderType::EType original_type = getPreferredType();
if (LLFolderType::lookupIsProtectedType(original_type))
return;
@@ -692,6 +694,8 @@ void LLViewerInventoryCategory::determineFolderType()
{
changeType(LLFolderType::FT_NONE);
}
+ llassert(FALSE);
+ */
}
void LLViewerInventoryCategory::changeType(LLFolderType::EType new_folder_type)
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index af89df448d..8c61ba7558 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -2555,7 +2555,7 @@ void handle_object_inspect()
key["task"] = "task";
LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
}
-
+
/*
// Old floater properties
LLFloaterReg::showInstance("inspect", LLSD());
@@ -4842,9 +4842,10 @@ class LLToolsEnableUnlink : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
+ LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject();
bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() &&
- LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject() &&
- !LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject()->isAttachment();
+ first_editable_object &&
+ !first_editable_object->isAttachment();
return new_value;
}
};
@@ -5599,6 +5600,19 @@ void handle_buy_currency()
LLFloaterBuyCurrency::buyCurrency();
}
+class LLFloaterVisible : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string floater_name = userdata.asString();
+ bool new_value = false;
+ {
+ new_value = LLFloaterReg::instanceVisible(floater_name);
+ }
+ return new_value;
+ }
+};
+
class LLShowHelp : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -8030,6 +8044,7 @@ void initialize_menus()
enable.add("EnableEdit", boost::bind(&enable_object_edit));
enable.add("VisibleBuild", boost::bind(&enable_object_build));
+ view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");
view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel");
view_listener_t::addMenu(new LLSidetrayPanelVisible(), "SidetrayPanelVisible");
view_listener_t::addMenu(new LLSomethingSelected(), "SomethingSelected");
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index ace5c5038e..2858081dc9 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -233,6 +233,10 @@ public:
extern LLViewerObjectList gObjectList;
// Inlines
+/**
+ * Note:
+ * it will return NULL for offline avatar_id
+ */
inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)
{
std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id);
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 984f003411..28998d409e 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -496,7 +496,9 @@ void LLViewerTexture::init(bool firstinit)
mAdditionalDecodePriority = 0.f ;
mParcelMedia = NULL ;
mNumFaces = 0 ;
+ mNumVolumes = 0;
mFaceList.clear() ;
+ mVolumeList.clear();
}
//virtual
@@ -508,7 +510,7 @@ S8 LLViewerTexture::getType() const
void LLViewerTexture::cleanup()
{
mFaceList.clear() ;
-
+ mVolumeList.clear();
if(mGLTexturep)
{
mGLTexturep->cleanup();
@@ -661,6 +663,42 @@ S32 LLViewerTexture::getNumFaces() const
return mNumFaces ;
}
+
+//virtual
+void LLViewerTexture::addVolume(LLVOVolume* volumep)
+{
+ if( mNumVolumes >= mVolumeList.size())
+ {
+ mVolumeList.resize(2 * mNumVolumes + 1) ;
+ }
+ mVolumeList[mNumVolumes] = volumep ;
+ volumep->setIndexInTex(mNumVolumes) ;
+ mNumVolumes++ ;
+ mLastVolumeListUpdateTimer.reset() ;
+}
+
+//virtual
+void LLViewerTexture::removeVolume(LLVOVolume* volumep)
+{
+ if(mNumVolumes > 1)
+ {
+ S32 index = volumep->getIndexInTex() ;
+ mVolumeList[index] = mVolumeList[--mNumVolumes] ;
+ mVolumeList[index]->setIndexInTex(index) ;
+ }
+ else
+ {
+ mVolumeList.clear() ;
+ mNumVolumes = 0 ;
+ }
+ mLastVolumeListUpdateTimer.reset() ;
+}
+
+S32 LLViewerTexture::getNumVolumes() const
+{
+ return mNumVolumes ;
+}
+
void LLViewerTexture::reorganizeFaceList()
{
static const F32 MAX_WAIT_TIME = 20.f; // seconds
@@ -680,6 +718,27 @@ void LLViewerTexture::reorganizeFaceList()
mFaceList.erase(mFaceList.begin() + mNumFaces, mFaceList.end());
}
+void LLViewerTexture::reorganizeVolumeList()
+{
+ static const F32 MAX_WAIT_TIME = 20.f; // seconds
+ static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ;
+
+ if(mNumVolumes + MAX_EXTRA_BUFFER_SIZE > mVolumeList.size())
+ {
+ return ;
+ }
+
+ if(mLastVolumeListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME)
+ {
+ return ;
+ }
+
+ mLastVolumeListUpdateTimer.reset() ;
+ mVolumeList.erase(mVolumeList.begin() + mNumVolumes, mVolumeList.end());
+}
+
+
+
//virtual
void LLViewerTexture::switchToCachedImage()
{
@@ -1519,12 +1578,12 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
}
else if (!isJustBound() && mCachedRawImageReady)
{
- if(mBoostLevel < BOOST_HIGH)
- {
- // We haven't rendered this in a while, de-prioritize it
- desired_discard += 2;
- }
- else
+ //if(mBoostLevel < BOOST_HIGH)
+ //{
+ // // We haven't rendered this in a while, de-prioritize it
+ // desired_discard += 2;
+ //}
+ //else
{
// We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is
desired_discard = cur_discard;
@@ -1610,6 +1669,7 @@ void LLViewerFetchedTexture::updateVirtualSize()
}
mNeedsResetMaxVirtualSize = TRUE ;
reorganizeFaceList() ;
+ reorganizeVolumeList();
}
bool LLViewerFetchedTexture::updateFetch()
@@ -2250,13 +2310,13 @@ void LLViewerFetchedTexture::destroyRawImage()
if (mRawImage.notNull())
{
- sRawCount--;
- setCachedRawImage() ;
+ sRawCount--;
if(mForceToSaveRawImage)
{
saveRawImage() ;
}
+ setCachedRawImage() ;
}
mRawImage = NULL;
@@ -2342,17 +2402,12 @@ void LLViewerFetchedTexture::setCachedRawImage()
{
--i ;
}
- //if(mForSculpt)
- //{
- // mRawImage->scaleDownWithoutBlending(w >> i, h >> i) ;
- //}
- //else
- {
- mRawImage->scale(w >> i, h >> i) ;
- }
+
+ mRawImage->scale(w >> i, h >> i) ;
}
mCachedRawImage = mRawImage ;
- mCachedRawDiscardLevel = mRawDiscardLevel + i ;
+ mRawDiscardLevel += i ;
+ mCachedRawDiscardLevel = mRawDiscardLevel ;
}
}
@@ -2422,7 +2477,7 @@ BOOL LLViewerFetchedTexture::hasSavedRawImage() const
F32 LLViewerFetchedTexture::getElapsedLastReferencedSavedRawImageTime() const
{
- return mLastReferencedSavedRawImageTime - sCurrentTime ;
+ return sCurrentTime - mLastReferencedSavedRawImageTime ;
}
//----------------------------------------------------------------------------------------------
//atlasing
@@ -2699,7 +2754,7 @@ void LLViewerLODTexture::processTextureStats()
}
else
{
- if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 1.0f)
+ if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 0.3f)
{
//if is a big image and not being used recently, nor close to the view point, do not load hi-res data.
mMaxVirtualSize = llmin(mMaxVirtualSize, (F32)LLViewerTexture::sMinLargeImageSize) ;
@@ -2885,12 +2940,11 @@ LLViewerMediaTexture::~LLViewerMediaTexture()
void LLViewerMediaTexture::reinit(BOOL usemipmaps /* = TRUE */)
{
- mGLTexturep = NULL ;
- init(false);
+ llassert(mGLTexturep.notNull()) ;
+
mUseMipMaps = usemipmaps ;
getLastReferencedTimer()->reset() ;
-
- generateGLTexture() ;
+ mGLTexturep->setUseMipMaps(mUseMipMaps) ;
mGLTexturep->setNeedsAlphaAndPickMask(FALSE) ;
}
@@ -3270,6 +3324,7 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()
mNeedsResetMaxVirtualSize = TRUE ;
reorganizeFaceList() ;
+ reorganizeVolumeList();
return mMaxVirtualSize ;
}
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 79d9c4e7bb..85f03b5839 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -134,7 +134,9 @@ public:
static S32 getIndexFromCategory(S32 category) ;
static S32 getCategoryFromIndex(S32 index) ;
- typedef std::vector<LLFace*> ll_face_list_t ;
+ typedef std::vector<LLFace*> ll_face_list_t;
+ typedef std::vector<LLVOVolume*> ll_volume_list_t;
+
protected:
virtual ~LLViewerTexture();
@@ -178,6 +180,11 @@ public:
S32 getNumFaces() const;
const ll_face_list_t* getFaceList() const {return &mFaceList;}
+ virtual void addVolume(LLVOVolume* volumep);
+ virtual void removeVolume(LLVOVolume* volumep);
+ S32 getNumVolumes() const;
+ const ll_volume_list_t* getVolumeList() const { return &mVolumeList; }
+
void generateGLTexture() ;
void destroyGLTexture() ;
@@ -242,7 +249,7 @@ protected:
void cleanup() ;
void init(bool firstinit) ;
void reorganizeFaceList() ;
-
+ void reorganizeVolumeList() ;
private:
//note: do not make this function public.
/*virtual*/ LLImageGL* getGLTexture() const ;
@@ -269,6 +276,10 @@ protected:
U32 mNumFaces ;
LLFrameTimer mLastFaceListUpdateTimer ;
+ ll_volume_list_t mVolumeList;
+ U32 mNumVolumes;
+ LLFrameTimer mLastVolumeListUpdateTimer;
+
//do not use LLPointer here.
LLViewerMediaTexture* mParcelMedia ;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index b76a2e150f..1dcc7389cb 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -852,56 +852,71 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
LLVOVolume *obj = dynamic_cast<LLVOVolume*>(static_cast<LLViewerObject*>(pick_info.getObject()));
- if (obj && obj->permModify() && !obj->getRegion()->getCapability("ObjectMedia").empty())
+ if (obj && !obj->getRegion()->getCapability("ObjectMedia").empty())
{
LLTextureEntry *te = obj->getTE(object_face);
if (te)
{
if (drop)
{
- if (! te->hasMedia())
+ // object does NOT have media already
+ if ( ! te->hasMedia() )
{
- // Create new media entry
- LLSD media_data;
- // XXX Should we really do Home URL too?
- media_data[LLMediaEntry::HOME_URL_KEY] = url;
- media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
- media_data[LLMediaEntry::AUTO_PLAY_KEY] = true;
- obj->syncMediaData(object_face, media_data, true, true);
- // XXX This shouldn't be necessary, should it ?!?
- if (obj->getMediaImpl(object_face))
- obj->getMediaImpl(object_face)->navigateReload();
- obj->sendMediaDataUpdate();
-
- result = LLWindowCallbacks::DND_COPY;
- }
- else {
- // Check the whitelist
- if (te->getMediaData()->checkCandidateUrl(url))
+ // we are allowed to modify the object
+ if ( obj->permModify() )
{
- // just navigate to the URL
+ // Create new media entry
+ LLSD media_data;
+ // XXX Should we really do Home URL too?
+ media_data[LLMediaEntry::HOME_URL_KEY] = url;
+ media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
+ media_data[LLMediaEntry::AUTO_PLAY_KEY] = true;
+ obj->syncMediaData(object_face, media_data, true, true);
+ // XXX This shouldn't be necessary, should it ?!?
if (obj->getMediaImpl(object_face))
+ obj->getMediaImpl(object_face)->navigateReload();
+ obj->sendMediaDataUpdate();
+
+ result = LLWindowCallbacks::DND_COPY;
+ }
+ }
+ else
+ // object HAS media already
+ {
+ // URL passes the whitelist
+ if (te->getMediaData()->checkCandidateUrl( url ) )
+ {
+ // we are allowed to modify the object or we have navigate permissions
+ // NOTE: Design states you you can change the URL if you have media
+ // navigate permissions even if you do not have prim modify rights
+ if ( obj->permModify() || obj->hasMediaPermission( te->getMediaData(), LLVOVolume::MEDIA_PERM_INTERACT ) )
{
- obj->getMediaImpl(object_face)->navigateTo(url);
+ // just navigate to the URL
+ if (obj->getMediaImpl(object_face))
+ {
+ obj->getMediaImpl(object_face)->navigateTo(url);
+ }
+ else
+ {
+ // This is very strange. Navigation should
+ // happen via the Impl, but we don't have one.
+ // This sends it to the server, which /should/
+ // trigger us getting it. Hopefully.
+ LLSD media_data;
+ media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
+ obj->syncMediaData(object_face, media_data, true, true);
+ obj->sendMediaDataUpdate();
+ }
+ result = LLWindowCallbacks::DND_LINK;
}
- else {
- // This is very strange. Navigation should
- // happen via the Impl, but we don't have one.
- // This sends it to the server, which /should/
- // trigger us getting it. Hopefully.
- LLSD media_data;
- media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
- obj->syncMediaData(object_face, media_data, true, true);
- obj->sendMediaDataUpdate();
- }
- result = LLWindowCallbacks::DND_LINK;
}
}
LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject);
mDragHoveredObject = NULL;
}
- else {
+ else
+ {
// Check the whitelist, if there's media (otherwise just show it)
if (te->getMediaData() == NULL || te->getMediaData()->checkCandidateUrl(url))
{
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 698b6be98b..7a6a48d1b3 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -2538,6 +2538,17 @@ void LLVOAvatar::idleUpdateLoadingEffect()
// update visibility when avatar is partially loaded
if (updateIsFullyLoaded()) // changed?
{
+ if (isFullyLoaded() && isSelf())
+ {
+ llinfos << "self isFullyLoaded" << llendl;
+
+ static bool first_fully_visible = true;
+ if (first_fully_visible)
+ {
+ first_fully_visible = false;
+ LLAppearanceManager::instance().onFirstFullyVisible();
+ }
+ }
if (isFullyLoaded())
{
deleteParticleSource();
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index bfe38c14ba..9fbcd1d32a 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -192,6 +192,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re
mMediaImplList.resize(getNumTEs());
mLastFetchedMediaVersion = -1;
+ mIndexInTex = 0;
}
LLVOVolume::~LLVOVolume()
@@ -226,6 +227,11 @@ void LLVOVolume::markDead()
{
removeMediaImpl(i);
}
+
+ if (mSculptTexture.notNull())
+ {
+ mSculptTexture->removeVolume(this);
+ }
}
LLViewerObject::markDead();
@@ -679,6 +685,7 @@ void LLVOVolume::updateTextureVirtualSize()
vsize = area;
imagep->setBoostLevel(LLViewerTexture::BOOST_HUD);
face->setPixelArea(area); // treat as full screen
+ face->setVirtualSize(vsize);
}
else
{
@@ -695,8 +702,7 @@ void LLVOVolume::updateTextureVirtualSize()
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, FALSE);
}
}
-
- face->setVirtualSize(vsize);
+
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
if (vsize < min_vsize) min_vsize = vsize;
@@ -725,7 +731,9 @@ void LLVOVolume::updateTextureVirtualSize()
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
LLUUID id = sculpt_params->getSculptTexture();
- mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+
+ updateSculptTexture();
+
if (mSculptTexture.notNull())
{
mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(),
@@ -914,35 +922,53 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail
{
mVolumeImpl->onSetVolume(volume_params, detail);
}
-
+
+ updateSculptTexture();
+
if (isSculpted())
{
- mSculptTexture = LLViewerTextureManager::getFetchedTexture(volume_params.getSculptID(), TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ updateSculptTexture();
+
if (mSculptTexture.notNull())
{
- //ignore sculpt GL usage since bao fixed this in a separate branch
- if (!gGLActive)
- {
- gGLActive = TRUE;
- sculpt();
- gGLActive = FALSE;
- }
- else
- {
- sculpt();
- }
+ sculpt();
}
}
- else
- {
- mSculptTexture = NULL;
- }
return TRUE;
}
return FALSE;
}
+void LLVOVolume::updateSculptTexture()
+{
+ LLPointer<LLViewerFetchedTexture> old_sculpt = mSculptTexture;
+
+ if (isSculpted())
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ LLUUID id = sculpt_params->getSculptTexture();
+ mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ }
+ else
+ {
+ mSculptTexture = NULL;
+ }
+
+ if (mSculptTexture != old_sculpt)
+ {
+ if (old_sculpt.notNull())
+ {
+ old_sculpt->removeVolume(this);
+ }
+ if (mSculptTexture.notNull())
+ {
+ mSculptTexture->addVolume(this);
+ }
+ }
+
+}
+
// sculpt replaces generate() for sculpted surfaces
void LLVOVolume::sculpt()
{
@@ -1006,6 +1032,17 @@ void LLVOVolume::sculpt()
}
}
getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level);
+
+ //notify rebuild any other VOVolumes that reference this sculpty volume
+ for (S32 i = 0; i < mSculptTexture->getNumVolumes(); ++i)
+ {
+ LLVOVolume* volume = (*(mSculptTexture->getVolumeList()))[i];
+ if (volume != this && volume->getVolume() == getVolume())
+ {
+ gPipeline.markRebuild(volume->mDrawable, LLDrawable::REBUILD_GEOMETRY, FALSE);
+ volume->mSculptChanged = TRUE;
+ }
+ }
}
}
@@ -3457,7 +3494,8 @@ static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry");
void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
{
llpushcallstacks ;
- if (group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY))
+ llassert(group);
+ if (group && group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY))
{
LLFastTimer tm(FTM_VOLUME_GEOM);
S32 num_mapped_veretx_buffer = LLVertexBuffer::sMappedCount ;
@@ -3511,9 +3549,9 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
}
// don't forget alpha
- if( group != NULL &&
- !group->mVertexBuffer.isNull() &&
- group->mVertexBuffer->isLocked())
+ if(group != NULL &&
+ !group->mVertexBuffer.isNull() &&
+ group->mVertexBuffer->isLocked())
{
group->mVertexBuffer->setBuffer(0);
}
@@ -3539,7 +3577,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO);
}
- if (group->isState(LLSpatialGroup::NEW_DRAWINFO))
+ if (group && group->isState(LLSpatialGroup::NEW_DRAWINFO))
{
llerrs << "WTF?" << llendl;
}
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index a287d34402..a8bb597f93 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -179,8 +179,10 @@ public:
/*virtual*/ BOOL setMaterial(const U8 material);
void setTexture(const S32 face);
-
+ S32 getIndexInTex() const {return mIndexInTex ;}
/*virtual*/ BOOL setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false);
+ void updateSculptTexture();
+ void setIndexInTex(S32 index) { mIndexInTex = index ;}
void sculpt();
void updateRelativeXform();
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
@@ -303,7 +305,7 @@ private:
LLPointer<LLViewerFetchedTexture> mLightTexture;
media_list_t mMediaImplList;
S32 mLastFetchedMediaVersion; // as fetched from the server, starts as -1
-
+ S32 mIndexInTex;
// statics
public:
static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop
diff --git a/indra/newview/skins/default/textures/icons/Inv_Shoe.png b/indra/newview/skins/default/textures/icons/Inv_Shoe.png
index 51e1c7bbb7..1f52b0a6b6 100644
--- a/indra/newview/skins/default/textures/icons/Inv_Shoe.png
+++ b/indra/newview/skins/default/textures/icons/Inv_Shoe.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 18d1779702..0065d824d2 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -633,8 +633,8 @@ with the same filename but different name
<texture name="Unread_Msg" file_name="bottomtray/Unread_Msg.png" preload="false" />
<texture name="Unread_IM" file_name="bottomtray/Unread_IM.png" preload="false" />
- <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false"
+ scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" />
<texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" />
<texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" />
@@ -642,6 +642,9 @@ with the same filename but different name
<texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
<texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
+ <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+
<texture name="WebBasedMediaBackground" file_name="windows/WebBasedMediaBackground.png" preload="false" />
<texture name="Widget_DownArrow" file_name="icons/Widget_DownArrow.png" preload="true" />
diff --git a/indra/newview/skins/default/textures/windows/Volume_Background.png b/indra/newview/skins/default/textures/windows/Volume_Background.png
new file mode 100644
index 0000000000..43aaa441f5
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Volume_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/xui/en/floater_event.xml b/indra/newview/skins/default/xui/en/floater_event.xml
new file mode 100644
index 0000000000..9ce0c9c86d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_event.xml
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ follows="all"
+ height="350"
+ label="Event"
+ layout="topleft"
+ name="Event"
+ width="330">
+ <floater.string
+ name="none">
+ none
+ </floater.string>
+ <floater.string
+ name="notify">
+ Notify
+ </floater.string>
+ <floater.string
+ name="dont_notify">
+ Don&apos;t Notify
+ </floater.string>
+ <layout_stack
+ name="layout"
+ orientation="vertical"
+ follows="all"
+ layout="topleft"
+ left="0"
+ top="0"
+ height="350"
+ width="330"
+ border_size="0">
+ <layout_panel
+ name="profile_stack"
+ follows="all"
+ layout="topleft"
+ top="0"
+ left="0"
+ height="305"
+ width="330">
+ <text
+ follows="top|left|right"
+ font="SansSerifLarge"
+ text_color="white"
+ height="17"
+ layout="topleft"
+ left="10"
+ name="event_name"
+ top="5"
+ use_ellipses="true"
+ width="310">
+ Nameless Event...of Doom! De doom! Doom doom.
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ height="13"
+ text_color="LtGray_50"
+ layout="topleft"
+ left="25"
+ name="event_category"
+ width="300">
+ (no category)
+ </text>
+
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ layout="topleft"
+ left="10"
+ top_pad="7"
+ name="event_runby_label"
+ width="310">
+ Run by:
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ initial_value="(retrieving)"
+ layout="topleft"
+ left="10"
+ link="true"
+ name="event_runby"
+ top_pad="2"
+ use_ellipses="true"
+ width="310" />
+ <text
+ type="string"
+ length="1"
+ left="10"
+ height="17"
+ font="SansSerifMedium"
+ text_color="EmphasisColor"
+ top_pad="5"
+ follows="top|left"
+ layout="topleft"
+ name="event_date"
+ width="310">
+ 10/10/2010
+ </text>
+ <text
+ type="string"
+ height="14"
+ length="1"
+ left="10"
+ follows="top|left"
+ layout="topleft"
+ name="event_duration"
+ width="310">
+ 1 hour
+ </text>
+ <text
+ font="SansSerifMedium"
+ text_color="EmphasisColor"
+ type="string"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="event_cover"
+ visible="true"
+ width="310">
+ Free
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ layout="topleft"
+ left="10"
+ top_pad="5"
+ name="event_location_label">
+ Location:
+ </text>
+ <text
+ type="string"
+ length="1"
+ height="20"
+ left="10"
+ follows="top|left"
+ layout="topleft"
+ name="event_location"
+ use_ellipses="true"
+ value="SampleParcel, Name Long (145, 228, 26)"
+ width="310" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Parcel_PG_Dark"
+ layout="topleft"
+ left="10"
+ name="rating_icon"
+ width="18" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="12"
+ name="rating_label"
+ top_delta="3"
+ value="Rating:"
+ width="60" />
+ <text
+ follows="left|right|top"
+ height="16"
+ layout="topleft"
+ left_pad="0"
+ name="rating_value"
+ top_delta="0"
+ value="unknown"
+ width="200" />
+ <expandable_text
+ follows="left|top|right"
+ height="106"
+ layout="topleft"
+ left="6"
+ name="event_desc"
+ width="313" />
+ </layout_panel>
+ <layout_panel
+ follows="left|right"
+ height="24"
+ layout="topleft"
+ mouse_opaque="false"
+ name="button_panel"
+ top="0"
+ left="0"
+ user_resize="false">
+ <button
+ follows="left|top"
+ height="18"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ image_disabled="AddItem_Disabled"
+ layout="topleft"
+ left="6"
+ name="create_event_btn"
+ picture_style="true"
+ tool_tip="Create Event"
+ width="18" />
+ <button
+ follows="left|top"
+ height="18"
+ image_selected="MinusItem_Press"
+ image_unselected="MinusItem_Off"
+ image_disabled="MinusItem_Disabled"
+ layout="topleft"
+ visible="false"
+ left="6"
+ top_pad="-7"
+ name="god_delete_event_btn"
+ picture_style="true"
+ tool_tip="Delete Event"
+ width="18" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Notify Me"
+ layout="topleft"
+ left_pad="3"
+ top_delta="-12"
+ name="notify_btn"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ left_pad="5"
+ name="teleport_btn"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Map"
+ layout="topleft"
+ left_pad="5"
+ name="map_btn"
+ width="85" />
+ </layout_panel>
+ </layout_stack>
+ </floater>
+
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 95ce6d6ff4..07a366da7f 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -55,34 +55,42 @@
</menu_item_call>
<menu_item_check
label="My Inventory"
- layout="topleft"
name="Inventory"
- shortcut="control|I">
+ layout="topleft"
+ shortcut="control|shift|I"
+ visible="false">
<menu_item_check.on_check
- function="SidetrayPanelVisible"
- parameter="sidepanel_inventory" />
+ function="Floater.Visible"
+ parameter="inventory" />
<menu_item_check.on_click
- function="ShowSidetrayPanel"
- parameter="sidepanel_inventory" />
+ function="Floater.Toggle"
+ parameter="inventory" />
</menu_item_check>
- <menu_item_call
- label="Show Inventory in Side Tray"
+ <menu_item_check
+ label="My Inventory"
name="ShowSidetrayInventory"
+ layout="topleft"
shortcut="control|I"
- visible="false">
- <menu_item_call.on_click
+ visible="true">
+ <menu_item_check.on_check
+ function="SidetrayPanelVisible"
+ parameter="sidepanel_inventory" />
+ <menu_item_check.on_click
function="ShowSidetrayPanel"
parameter="sidepanel_inventory" />
- </menu_item_call>
- <menu_item_call
+ </menu_item_check>
+ <menu_item_check
label="My Gestures"
layout="topleft"
name="Gestures"
shortcut="control|G">
- <menu_item_call.on_click
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="gestures" />
+ <menu_item_check.on_click
function="Floater.Toggle"
parameter="gestures" />
- </menu_item_call>
+ </menu_item_check>
<menu
label="My Status"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 51f0f6839c..0fbd860648 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -19,7 +19,7 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okbutton"
text="$yestext"/>
</form>
</template>
@@ -29,7 +29,7 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okignore"
text="$yestext"/>
<ignore text="$ignoretext"/>
</form>
@@ -40,11 +40,11 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okcancelbuttons"
text="$yestext"/>
<button
index="1"
- name="Cancel"
+ name="Cancel_okcancelbuttons"
text="$notext"/>
</form>
</template>
@@ -54,11 +54,11 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okcancelignore"
text="$yestext"/>
<button
index="1"
- name="Cancel"
+ name="Cancel_okcancelignore"
text="$notext"/>
<ignore text="$ignoretext"/>
</form>
@@ -69,7 +69,7 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okhelpbuttons"
text="$yestext"/>
<button
index="1"
@@ -91,7 +91,7 @@
text="$notext"/>
<button
index="2"
- name="Cancel"
+ name="Cancel_yesnocancelbuttons"
text="$canceltext"/>
</form>
</template>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 1f16aea2ef..5f46ad7860 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -159,7 +159,6 @@ Maximum 200 per group daily
left_pad="3"
max_length="511"
name="create_message"
- text_type="ascii"
top_delta="0"
width="220"
word_wrap="true" />
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 433dfc17fe..2e81139ef2 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -9,13 +9,22 @@
name="chat"
top="1"
width="517">
- <radio_group
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ width="120"
+ top="10">
+ Font size:
+ </text>
+ <radio_group
height="30"
layout="topleft"
- left="30"
- control_name="ChatFontSize"
+ left="40"
+ control_name="ChatFontSize"
name="chat_font_size"
- top="10"
+ top_pad="0"
width="440">
<radio_item
height="16"
@@ -45,12 +54,24 @@
top_delta="0"
width="125" />
</radio_group>
+
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ top_pad="10"
+ width="120"
+ >
+ Font colors:
+ </text>
+
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="47"
layout="topleft"
- left="30"
+ left="40"
name="user"
top_pad="10"
width="44" >
@@ -79,7 +100,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="agent"
top_pad="-17"
width="44" >
@@ -110,7 +131,7 @@
height="47"
label_width="60"
layout="topleft"
- left="350"
+ left="360"
name="im"
top_pad="-17"
width="44">
@@ -141,7 +162,7 @@
height="47"
label_width="44"
layout="topleft"
- left="30"
+ left="40"
name="system"
top_pad="40"
width="44" >
@@ -171,7 +192,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="script_error"
top_pad="-17"
width="44">
@@ -201,7 +222,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="350"
+ left="360"
name="objects"
top_pad="-17"
width="44" >
@@ -231,7 +252,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="30"
+ left="40"
name="owner"
top_pad="40"
width="44" >
@@ -261,7 +282,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="links"
top_pad="-17"
width="44" >
@@ -314,6 +335,8 @@
top_pad="5"
width="400" />
<text
+ follows="left|top"
+ layout="topleft"
left="30"
height="20"
width="120"
@@ -321,17 +344,20 @@
Show IMs in:
</text>
<text
- left_pad="6"
- height="20"
- width="100"
- text_color="White_25"
- >
+ follows="left|top"
+ layout="topleft"
+ top_delta="0"
+ left="120"
+ height="20"
+ width="100"
+ text_color="White_25"
+ >
(requires restart)
</text>
<radio_group
height="30"
layout="topleft"
- left="30"
+ left="40"
control_name="ChatWindow"
name="chat_window"
top_pad="0"
diff --git a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
index 60d4a7e00b..55ab95bfe9 100644
--- a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
+++ b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
@@ -4,7 +4,7 @@
background_visible="false"
border_visible="false"
border="false"
- chrome="true"
+ chrome="true"
follows="bottom"
height="150"
layout="topleft"
@@ -13,7 +13,7 @@
<!-- floater background image -->
<icon
height="150"
- image_name="Inspector_Background"
+ image_name="Volume_Background"
layout="topleft"
left="0"
name="normal_background"
diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
index 1228f6be3d..0720621f0b 100644
--- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
@@ -16,6 +16,6 @@
image_unselected="Search"
image_selected="Search" />
<clear_button label=""
- image_unselected="Icon_Close_Foreground"
- image_selected="Icon_Close_Press" />
+ image_unselected="Icon_Close_Toast"
+ image_selected="Icon_Close_Toast" />
</filter_editor>
diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
index 1616e4c3f7..a9a760b3a4 100644
--- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
@@ -15,7 +15,11 @@
height="13"
image_unselected="Search"
image_selected="Search" />
- <clear_button
+ <clear_button
+ bottom="4"
+ height="16"
image_unselected="Icon_Close_Foreground"
- image_selected="Icon_Close_Press" />
+ image_selected="Icon_Close_Press"
+ pad_right="4"
+ width="16" />
</search_editor>
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index f7ac5361c5..ef93586c6e 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -2,7 +2,7 @@
* @file lllogininstance_test.cpp
* @brief Test for lllogininstance.cpp.
*
- * $LicenseInfo:firstyear=2008&license=internal$
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
* Copyright (c) 2008, Linden Research, Inc.
* $/LicenseInfo$
*/
diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp
index c94ba0a3e8..c2c7e963b9 100644
--- a/indra/newview/tests/llxmlrpclistener_test.cpp
+++ b/indra/newview/tests/llxmlrpclistener_test.cpp
@@ -4,7 +4,7 @@
* @date 2009-03-20
* @brief Test for llxmlrpclistener.
*
- * $LicenseInfo:firstyear=2009&license=internal$
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
* Copyright (c) 2009, Linden Research, Inc.
* $/LicenseInfo$
*/