diff options
92 files changed, 895 insertions, 691 deletions
diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp index 528a7bb4a5..40a9752268 100644 --- a/indra/llcharacter/llcharacter.cpp +++ b/indra/llcharacter/llcharacter.cpp @@ -181,16 +181,18 @@ void LLCharacter::requestStopMotion( LLMotion* motion) // updateMotions() //----------------------------------------------------------------------------- static LLFastTimer::DeclareTimer FTM_UPDATE_ANIMATION("Update Animation"); +static LLFastTimer::DeclareTimer FTM_UPDATE_HIDDEN_ANIMATION("Update Hidden Anim"); void LLCharacter::updateMotions(e_update_t update_type) { - LLFastTimer t(FTM_UPDATE_ANIMATION); if (update_type == HIDDEN_UPDATE) { + LLFastTimer t(FTM_UPDATE_HIDDEN_ANIMATION); mMotionController.updateMotionsMinimal(); } else { + LLFastTimer t(FTM_UPDATE_ANIMATION); // unpause if the number of outstanding pause requests has dropped to the initial one if (mMotionController.isPaused() && mPauseRequest->getNumRefs() == 1) { diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp index 0237c80efa..a4f69e7ac1 100644 --- a/indra/llui/llconsole.cpp +++ b/indra/llui/llconsole.cpp @@ -244,23 +244,6 @@ void LLConsole::draw() } } -void LLConsole::addLine(const std::string& utf8line) -{ - LLWString wline = utf8str_to_wstring(utf8line); - addLine(wline, 0.f, LLColor4(1.f, 1.f, 1.f, 1.f)); -} - -void LLConsole::addLine(const LLWString& wline) -{ - addLine(wline, 0.f, LLColor4(1.f, 1.f, 1.f, 1.f)); -} - -void LLConsole::addLine(const std::string& utf8line, F32 size, const LLColor4 &color) -{ - LLWString wline = utf8str_to_wstring(utf8line); - addLine(wline, size, color); -} - //Generate highlight color segments for this paragraph. Pass in default color of paragraph. void LLConsole::Paragraph::makeParagraphColorSegments (const LLColor4 &color) { @@ -383,21 +366,45 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, b //Pass in the string and the default color for this block of text. LLConsole::Paragraph::Paragraph (LLWString str, const LLColor4 &color, F32 add_time, const LLFontGL* font, F32 screen_width) - : mParagraphText(str), mAddTime(add_time), mMaxWidth(-1) +: mParagraphText(str), mAddTime(add_time), mMaxWidth(-1) { makeParagraphColorSegments(color); updateLines( screen_width, font ); } -void LLConsole::addLine(const LLWString& wline, F32 size, const LLColor4 &color) +// called once per frame regardless of console visibility +// static +void LLConsole::updateClass() { - Paragraph paragraph(wline, color, mTimer.getElapsedTimeF32(), mFont, (F32)getRect().getWidth() ); - - mParagraphs.push_back ( paragraph ); + LLInstanceTrackerScopedGuard guard; + + for (instance_iter it = guard.beginInstances(); it != guard.endInstances(); ++it) + { + it->update(); + } +} + +void LLConsole::update() +{ + { + LLMutexLock lock(&mMutex); + + while (!mLines.empty()) + { + mParagraphs.push_back( + Paragraph( mLines.front(), + LLColor4::white, + mTimer.getElapsedTimeF32(), + mFont, + (F32)getRect().getWidth())); + mLines.pop_front(); + } + } // remove old paragraphs which can't possibly be visible any more. ::draw() will do something similar but more conservative - we do this here because ::draw() isn't guaranteed to ever be called! (i.e. the console isn't visible) - while ((S32)mParagraphs.size() > llmax((S32)0, (S32)(mMaxLines))) - { - mParagraphs.pop_front(); - } + while ((S32)mParagraphs.size() > llmax((S32)0, (S32)(mMaxLines))) + { + mParagraphs.pop_front(); + } } + diff --git a/indra/llui/llconsole.h b/indra/llui/llconsole.h index 4719950f28..f38e2bc9c2 100644 --- a/indra/llui/llconsole.h +++ b/indra/llui/llconsole.h @@ -40,7 +40,7 @@ class LLSD; -class LLConsole : public LLFixedBuffer, public LLUICtrl +class LLConsole : public LLFixedBuffer, public LLUICtrl, public LLInstanceTracker<LLConsole> { public: typedef enum e_font_size @@ -68,6 +68,9 @@ protected: friend class LLUICtrlFactory; public: + // call once per frame to pull data out of LLFixedBuffer + static void updateClass(); + //A paragraph color segment defines the color of text in a line //of text that was received for console display. It has no //notion of line wraps, screen position, or the text it contains. @@ -139,14 +142,12 @@ public: // -1 = monospace, 0 means small, font size = 1 means big void setFontSize(S32 size_index); - void addLine(const std::string& utf8line, F32 size, const LLColor4 &color); - void addLine(const LLWString& wline, F32 size, const LLColor4 &color); // Overrides /*virtual*/ void draw(); - /*virtual*/ void addLine(const std::string& utf8line); - /*virtual*/ void addLine(const LLWString& line); private: + void update(); + F32 mLinePersistTime; // Age at which to stop drawing. F32 mFadeTime; // Age at which to start fading const LLFontGL* mFont; 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 cb81c39103..50942e55ca 100644 --- a/indra/llui/llmultisliderctrl.cpp +++ b/indra/llui/llmultisliderctrl.cpp @@ -331,6 +331,10 @@ void LLMultiSliderCtrl::updateText() void LLMultiSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata) { LLMultiSliderCtrl* self = dynamic_cast<LLMultiSliderCtrl*>(ctrl->getParent()); + llassert(self); + if (!self) // cast failed - wrong type! :O + return; + if (!ctrl) return; 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 fe699cfa01..13340e7ded 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -1631,14 +1631,9 @@ void LLTabContainer::setTabImage(LLPanel* child, LLIconCtrl* icon) void LLTabContainer::reshapeTuple(LLTabTuple* tuple) { static LLUICachedControl<S32> tab_padding ("UITabPadding", 0); - static LLUICachedControl<S32> image_top_padding ("UIButtonImageTopPadding", 2); - static LLUICachedControl<S32> image_bottom_padding ("UIButtonImageBottomPadding", 2); if (!mIsVertical) { - tuple->mButton->setImageOverlayTopPad(image_top_padding); - tuple->mButton->setImageOverlayBottomPad(image_bottom_padding); - // remove current width from total tab strip width mTotalTabWidth -= tuple->mButton->getRect().getWidth(); diff --git a/indra/lscript/lscript_compile/lscript_tree.cpp b/indra/lscript/lscript_compile/lscript_tree.cpp index 3b8bbbe805..4ba41db2fc 100644 --- a/indra/lscript/lscript_compile/lscript_tree.cpp +++ b/indra/lscript/lscript_compile/lscript_tree.cpp @@ -10626,6 +10626,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/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index db4e0b5afd..d0c2f3cb34 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8456,6 +8456,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>ShowVoiceVisualizersInCalls</key> + <map> + <key>Comment</key> + <string>Enables in-world voice visualizers, voice gestures and lip-sync while in group or P2P calls.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>ShowVolumeSettingsPopup</key> <map> <key>Comment</key> @@ -9949,28 +9960,6 @@ <key>Value</key> <integer>15</integer> </map> - <key>UIButtonImageTopPadding</key> - <map> - <key>Comment</key> - <string>Button Overlay Image Top Padding</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>S32</string> - <key>Value</key> - <integer>2</integer> - </map> - <key>UIButtonImageBottomPadding</key> - <map> - <key>Comment</key> - <string>Button Overlay Image Bottom Padding</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>S32</string> - <key>Value</key> - <integer>2</integer> - </map> <key>UploadBakedTexOld</key> <map> <key>Comment</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 59f61dfdfb..7929946620 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 ingnore_God_mod /* FALSE */) const { - if (isGodlike()) + if (!ingnore_God_mod && 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/llagentui.cpp b/indra/newview/llagentui.cpp index 7404fe5bc4..72ab9235cf 100644 --- a/indra/newview/llagentui.cpp +++ b/indra/newview/llagentui.cpp @@ -150,11 +150,17 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const sim_access_string.c_str()); break; case LOCATION_FORMAT_NO_MATURITY: - case LOCATION_FORMAT_FULL: buffer = llformat("%s (%d, %d, %d)", region_name.c_str(), pos_x, pos_y, pos_z); break; + case LOCATION_FORMAT_FULL: + buffer = llformat("%s (%d, %d, %d)%s%s", + region_name.c_str(), + pos_x, pos_y, pos_z, + sim_access_string.empty() ? "" : " - ", + sim_access_string.c_str()); + break; } } else diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 9ff5de29c3..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) { @@ -1290,25 +1294,29 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name, j, new_wearable, todo); - if (isWearableCopyable((EWearableType)type, j)) - { - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - folder_id, - new_name, - cb); - } - else + llassert(item); + if (item) { - move_inventory_item( - gAgent.getID(), - gAgent.getSessionID(), - item->getUUID(), - folder_id, - new_name, - cb); + if (isWearableCopyable((EWearableType)type, j)) + { + copy_inventory_item( + gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + folder_id, + new_name, + cb); + } + else + { + move_inventory_item( + gAgent.getID(), + gAgent.getSessionID(), + item->getUUID(), + folder_id, + new_name, + cb); + } } } } @@ -1597,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); } 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 062e291161..eb4a47664b 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -676,6 +676,11 @@ void LLAppearanceManager::filterWearableItems( if (!item->isWearableType()) continue; EWearableType type = item->getWearableType(); + if(type < 0 || type >= WT_COUNT) + { + LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL; + continue; + } items_by_type[type].push_back(item); } 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 13a5df353d..9368d9cb7c 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -66,6 +66,8 @@ static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history"); const static std::string NEW_LINE(rawstr_to_utf8("\n")); +const static U32 LENGTH_OF_TIME_STR = std::string("12:00").length(); + // support for secondlife:///app/objectim/{UUID}/ SLapps class LLObjectIMHandler : public LLCommandHandler { @@ -257,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; } @@ -267,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); @@ -287,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() @@ -544,6 +541,7 @@ void LLChatHistory::clear() void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LLStyle::Params& input_append_params) { bool use_plain_text_chat_history = args["use_plain_text_chat_history"].asBoolean(); + if (!mEditor->scrolledToEnd() && chat.mFromID != gAgent.getID() && !chat.mFromName.empty()) { mUnreadChatSources.insert(chat.mFromName); @@ -609,6 +607,14 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL style_params.font.style = "ITALIC"; } + //*HACK we graying out chat history by graying out messages that contains full date in a time string + bool message_from_log = chat.mTimeStr.length() > LENGTH_OF_TIME_STR; + if (message_from_log) + { + style_params.color(LLColor4::grey); + style_params.readonly_color(LLColor4::grey); + } + if (use_plain_text_chat_history) { mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params); @@ -644,10 +650,10 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter, false, link_params); } - else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() ) + else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log) { LLStyle::Params link_params(style_params); - link_params.fillFrom(LLStyleMap::instance().lookupAgent(chat.mFromID)); + link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID)); // Convert the name to a hotlink and add to message. mEditor->appendText(chat.mFromName + delimiter, false, link_params); } diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index d12fd48ffb..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 ; } @@ -1327,17 +1328,33 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, return TRUE; } +//check if the face has a media +BOOL LLFace::hasMedia() const +{ + if(mHasMedia) + { + return TRUE ; + } + if(mTexture.notNull()) + { + return mTexture->hasParcelMedia() ; //if has a parcel media + } + + return FALSE ; //no media. +} + const F32 LEAST_IMPORTANCE = 0.05f ; 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) + if (mPixelArea < 0.0001f || !in_frustum) { + setVirtualSize(0.f) ; return 0.f; } @@ -1374,23 +1391,48 @@ 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; - + LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f; LLViewerCamera* camera = LLViewerCamera::getInstance(); + + F32 size_squared = size.lengthSquared() ; LLVector3 lookAt = center - camera->getOrigin(); - F32 dist = lookAt.normVec() ; + F32 dist = lookAt.normVec() ; //get area of circle around node - F32 app_angle = atanf(size.length()/dist); + F32 app_angle = atanf(fsqrtf(size_squared) / dist); radius = app_angle*LLDrawable::sCurPixelAngle; - F32 face_area = radius*radius * 3.14159f; + 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 ; + } + else + { + if(dist * dist * (lookAt - camera->getXAxis()).lengthSquared() < size_squared) + { + cos_angle_to_view_dir = 1.0f ; + } + } + } if(dist < mBoundingSphereRadius) //camera is very close { @@ -1398,12 +1440,11 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) mImportanceToCamera = 1.0f ; } else - { - cos_angle_to_view_dir = lookAt * camera->getXAxis() ; + { 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 e12b64a2f2..67dd97e6f7 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -194,6 +194,9 @@ public: F32 getTextureVirtualSize() ; F32 getImportanceToCamera()const {return mImportanceToCamera ;} + void setHasMedia(bool has_media) { mHasMedia = has_media ;} + BOOL hasMedia() const ; + //for atlas LLTextureAtlasSlot* getAtlasInfo() ; void setAtlasInUse(BOOL flag); @@ -208,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); @@ -262,7 +265,7 @@ private: //based on the distance from the face to the view point and the angle from the face center to the view direction. F32 mImportanceToCamera ; F32 mBoundingSphereRadius ; - + bool mHasMedia ; //atlas LLPointer<LLTextureAtlasSlot> mAtlasInfop ; diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 1e8a739d78..bf7c735488 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -1264,8 +1264,11 @@ LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLIn void LLFavoritesBarCtrl::insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem) { LLViewerInventoryItem* beforeItem = gInventory.getItem(beforeItemId); - - items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem); + llassert(beforeItem); + if (beforeItem) + { + items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem); + } } // EOF diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index fb724f30e0..fbb90c69f3 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -287,6 +287,7 @@ BOOL LLFeatureManager::loadFeatureTables() if (!flp) { LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL; + return FALSE; } S32 available; F32 recommended; diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index b684e1f985..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(); @@ -427,8 +427,13 @@ void LLFloaterGesture::onClickPlay() BOOL inform_server = TRUE; BOOL deactivate_similar = FALSE; LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id)); - LLGestureManager::instance().activateGestureWithAsset(item_id, gInventory.getItem(item_id)->getAssetUUID(), inform_server, deactivate_similar); - LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL; + LLViewerInventoryItem *item = gInventory.getItem(item_id); + llassert(item); + if (item) + { + LLGestureManager::instance().activateGestureWithAsset(item_id, item->getAssetUUID(), inform_server, deactivate_similar); + LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL; + } } else { @@ -510,15 +515,16 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command) if(ids.empty() || !gInventory.isCategoryComplete(mGestureFolderID)) return; LLInventoryCategory* gesture_dir = gInventory.getCategory(mGestureFolderID); + llassert(gesture_dir); LLPointer<GestureCopiedCallback> cb = new GestureCopiedCallback(this); for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++) { LLInventoryItem* item = gInventory.getItem(*it); - LLStringUtil::format_map_t string_args; - string_args["[COPY_NAME]"] = item->getName(); - if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE) + if(gesture_dir && item && item->getInventoryType() == LLInventoryType::IT_GESTURE) { + LLStringUtil::format_map_t string_args; + string_args["[COPY_NAME]"] = item->getName(); LL_DEBUGS("Gesture")<< "Copying gesture " << item->getName() << " "<< item->getUUID() << " into " << gesture_dir->getName() << " "<< gesture_dir->getUUID() << LL_ENDL; copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(), diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp index 90db8988b2..94b5ebba00 100644 --- a/indra/newview/llfloaternotificationsconsole.cpp +++ b/indra/newview/llfloaternotificationsconsole.cpp @@ -112,10 +112,15 @@ void LLNotificationChannelPanel::onClickNotification(void* user_data) { LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data; if (!self) return; - void* data = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected()->getUserdata(); - if (data) + LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected(); + llassert(firstselected); + if (firstselected) { - gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE); + void* data = firstselected->getUserdata(); + if (data) + { + gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE); + } } } @@ -124,10 +129,15 @@ void LLNotificationChannelPanel::onClickNotificationReject(void* user_data) { LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data; if (!self) return; - void* data = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected()->getUserdata(); - if (data) + LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected(); + llassert(firstselected); + if (firstselected) { - gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE); + void* data = firstselected->getUserdata(); + if (data) + { + gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE); + } } } diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 3c9f7492a2..43111d76f7 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -110,8 +110,6 @@ const F32 MAX_USER_FAR_CLIP = 512.f; const F32 MIN_USER_FAR_CLIP = 64.f; -const S32 ASPECT_RATIO_STR_LEN = 100; - class LLVoiceSetKeyDialog : public LLModalDialog { public: @@ -283,7 +281,6 @@ void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator) } // static std::string LLFloaterPreference::sSkin = ""; -F32 LLFloaterPreference::sAspectRatio = 0.0; ////////////////////////////////////////////// // LLFloaterPreference @@ -324,11 +321,9 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.VertexShaderEnable", boost::bind(&LLFloaterPreference::onVertexShaderEnable, this)); mCommitCallbackRegistrar.add("Pref.WindowedMod", boost::bind(&LLFloaterPreference::onCommitWindowedMode, this)); mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2)); - mCommitCallbackRegistrar.add("Pref.AutoDetectAspect", boost::bind(&LLFloaterPreference::onCommitAutoDetectAspect, this)); mCommitCallbackRegistrar.add("Pref.ParcelMediaAutoPlayEnable", boost::bind(&LLFloaterPreference::onCommitParcelMediaAutoPlayEnable, this)); mCommitCallbackRegistrar.add("Pref.MediaEnabled", boost::bind(&LLFloaterPreference::onCommitMediaEnabled, this)); mCommitCallbackRegistrar.add("Pref.MusicEnabled", boost::bind(&LLFloaterPreference::onCommitMusicEnabled, this)); - mCommitCallbackRegistrar.add("Pref.onSelectAspectRatio", boost::bind(&LLFloaterPreference::onKeystrokeAspectRatio, this)); mCommitCallbackRegistrar.add("Pref.QualityPerformance", boost::bind(&LLFloaterPreference::onChangeQuality, this, _2)); mCommitCallbackRegistrar.add("Pref.applyUIColor", boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2)); mCommitCallbackRegistrar.add("Pref.getUIColor", boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2)); @@ -359,12 +354,7 @@ BOOL LLFloaterPreference::postBuild() LLFloaterPreference::~LLFloaterPreference() { // clean up user data - LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio"); LLComboBox* ctrl_window_size = getChild<LLComboBox>("windowsize combo"); - for (S32 i = 0; i < ctrl_aspect_ratio->getItemCount(); i++) - { - ctrl_aspect_ratio->setCurrentByIndex(i); - } for (S32 i = 0; i < ctrl_window_size->getItemCount(); i++) { ctrl_window_size->setCurrentByIndex(i); @@ -514,8 +504,6 @@ void LLFloaterPreference::cancel() LLFloaterReg::hideInstance("pref_voicedevicesettings"); - gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio); - } void LLFloaterPreference::onOpen(const LLSD& key) @@ -968,37 +956,6 @@ void LLFloaterPreference::disableUnavailableSettings() } } -void LLFloaterPreference::onCommitAutoDetectAspect() -{ - BOOL auto_detect = getChild<LLCheckBoxCtrl>("aspect_auto_detect")->get(); - F32 ratio; - - if (auto_detect) - { - S32 numerator = 0; - S32 denominator = 0; - - // clear any aspect ratio override - gViewerWindow->mWindow->setNativeAspectRatio(0.f); - fractionFromDecimal(gViewerWindow->mWindow->getNativeAspectRatio(), numerator, denominator); - - std::string aspect; - if (numerator != 0) - { - aspect = llformat("%d:%d", numerator, denominator); - } - else - { - aspect = llformat("%.3f", gViewerWindow->mWindow->getNativeAspectRatio()); - } - - getChild<LLComboBox>( "aspect_ratio")->setLabel(aspect); - - ratio = gViewerWindow->mWindow->getNativeAspectRatio(); - gSavedSettings.setF32("FullScreenAspectRatio", ratio); - } -} - void LLFloaterPreference::onCommitParcelMediaAutoPlayEnable() { BOOL autoplay = getChild<LLCheckBoxCtrl>("autoplay_enabled")->get(); @@ -1266,56 +1223,9 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b } } -void LLFloaterPreference::onKeystrokeAspectRatio() -{ - getChild<LLCheckBoxCtrl>("aspect_auto_detect")->set(FALSE); -} - void LLFloaterPreference::applyResolution() { - LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio"); gGL.flush(); - char aspect_ratio_text[ASPECT_RATIO_STR_LEN]; /*Flawfinder: ignore*/ - if (ctrl_aspect_ratio->getCurrentIndex() == -1) - { - // *Can't pass const char* from c_str() into strtok - strncpy(aspect_ratio_text, ctrl_aspect_ratio->getSimple().c_str(), sizeof(aspect_ratio_text) -1); /*Flawfinder: ignore*/ - aspect_ratio_text[sizeof(aspect_ratio_text) -1] = '\0'; - char *element = strtok(aspect_ratio_text, ":/\\"); - if (!element) - { - sAspectRatio = 0.f; // will be clamped later - } - else - { - LLLocale locale(LLLocale::USER_LOCALE); - sAspectRatio = (F32)atof(element); - } - - // look for denominator - element = strtok(NULL, ":/\\"); - if (element) - { - LLLocale locale(LLLocale::USER_LOCALE); - - F32 denominator = (F32)atof(element); - if (denominator != 0.f) - { - sAspectRatio /= denominator; - } - } - } - else - { - sAspectRatio = (F32)ctrl_aspect_ratio->getValue().asReal(); - } - - // presumably, user entered a non-numeric value if aspect_ratio == 0.f - if (sAspectRatio != 0.f) - { - sAspectRatio = llclamp(sAspectRatio, 0.2f, 5.f); - gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio); - } // Screen resolution S32 num_resolutions; @@ -1393,48 +1303,6 @@ BOOL LLPanelPreference::postBuild() childSetText("email_address",getString("log_in_to_change") ); // childSetText("busy_response", getString("log_in_to_change")); } - - - if(hasChild("aspect_ratio")) - { - // We used to set up fullscreen resolution and window size - // controls here, see LLFloaterWindowSize::initWindowSizeControls() - - if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio")) - { - LLFloaterPreference::sAspectRatio = gViewerWindow->getDisplayAspectRatio(); - } - else - { - LLFloaterPreference::sAspectRatio = gSavedSettings.getF32("FullScreenAspectRatio"); - } - - getChild<LLComboBox>("aspect_ratio")->setTextEntryCallback(boost::bind(&LLPanelPreference::setControlFalse, this, LLSD("FullScreenAutoDetectAspectRatio") )); - - - S32 numerator = 0; - S32 denominator = 0; - fractionFromDecimal(LLFloaterPreference::sAspectRatio, numerator, denominator); - - LLUIString aspect_ratio_text = getString("aspect_ratio_text"); - if (numerator != 0) - { - aspect_ratio_text.setArg("[NUM]", llformat("%d", numerator)); - aspect_ratio_text.setArg("[DEN]", llformat("%d", denominator)); - } - else - { - aspect_ratio_text = llformat("%.3f", LLFloaterPreference::sAspectRatio); - } - - LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio"); - //mCtrlAspectRatio->setCommitCallback(onSelectAspectRatio, this); - // add default aspect ratios - ctrl_aspect_ratio->add(aspect_ratio_text, &LLFloaterPreference::sAspectRatio, ADD_TOP); - ctrl_aspect_ratio->setCurrentByIndex(0); - - refresh(); - } //////////////////////PanelPrivacy /////////////////// if (hasChild("media_enabled")) diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 0827c7c2b2..93b39d72bc 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -128,10 +128,8 @@ public: void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box); void onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name); - void onKeystrokeAspectRatio(); // void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator); - void onCommitAutoDetectAspect(); void onCommitParcelMediaAutoPlayEnable(); void onCommitMediaEnabled(); void onCommitMusicEnabled(); @@ -142,7 +140,6 @@ public: void buildPopupLists(); static void refreshSkin(void* data); static void cleanupBadSetting(); - static F32 sAspectRatio; private: static std::string sSkin; bool mGotPersonalInfo; diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index bde86a4034..5c0593ad29 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -880,7 +880,11 @@ void LLFloaterProperties::dirtyAll() iter != inst_list.end(); ++iter) { LLFloaterProperties* floater = dynamic_cast<LLFloaterProperties*>(*iter); - floater->dirty(); + llassert(floater); // else cast failed - wrong type D: + if (floater) + { + floater->dirty(); + } } } diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 4edd09b02c..e2b083a29b 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -666,8 +666,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask) if (mCheckCopyCenters) mCheckCopyCenters ->setVisible( create_visible ); if (mCheckCopyRotates) mCheckCopyRotates ->setVisible( create_visible ); - if (mCheckCopyCenters) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() ); - if (mCheckCopyRotates) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() ); + if (mCheckCopyCenters && mCheckCopySelection) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() ); + if (mCheckCopyRotates && mCheckCopySelection) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() ); // Land buttons BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() ); diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 3e804bef9d..f61c86db14 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -362,8 +362,7 @@ BOOL LLFadeEventTimer::tick() if(NULL == mParent) // no more need to tick, so suicide { - delete this; - return FALSE; + return TRUE; } // Set up colors 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/llfolderview.cpp b/indra/newview/llfolderview.cpp index 57c7ba8e27..8dbdfff635 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -195,7 +195,8 @@ LLFolderView::LLFolderView(const Params& p) mCallbackRegistrar(NULL), mParentPanel(p.parent_panel), mUseEllipses(false), - mDraggingOverItem(NULL) + mDraggingOverItem(NULL), + mStatusTextBox(NULL) { LLRect rect = p.rect; LLRect new_rect(rect.mLeft, rect.mBottom + getRect().getHeight(), rect.mLeft + getRect().getWidth(), rect.mBottom); @@ -231,6 +232,18 @@ LLFolderView::LLFolderView(const Params& p) mRenamer = LLUICtrlFactory::create<LLLineEditor> (params); addChild(mRenamer); + // Textbox + LLTextBox::Params text_p; + LLRect new_r(5, 13-50, 300, 0-50); + text_p.name(std::string(p.name)); + text_p.rect(new_r); + text_p.font(getLabelFontForStyle(mLabelStyle)); + text_p.visible(false); + text_p.allow_html(true); + mStatusTextBox = LLUICtrlFactory::create<LLTextBox> (text_p); + //addChild(mStatusTextBox); + + // make the popup menu available LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); if (!menu) @@ -253,6 +266,7 @@ LLFolderView::~LLFolderView( void ) mScrollContainer = NULL; mRenameItem = NULL; mRenamer = NULL; + mStatusTextBox = NULL; if( gEditMenuHandler == this ) { @@ -874,7 +888,7 @@ void LLFolderView::draw() LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); } - LLFontGL* font = getLabelFontForStyle(mLabelStyle); + //LLFontGL* font = getLabelFontForStyle(mLabelStyle); // if cursor has moved off of me during drag and drop // close all auto opened folders @@ -911,19 +925,23 @@ void LLFolderView::draw() || mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS) { mStatusText.clear(); + mStatusTextBox->setVisible( FALSE ); } else { if (gInventory.backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration()) { mStatusText = LLTrans::getString("Searching"); - font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); + //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); } else { mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage()); - font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); + //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); } + mStatusTextBox->setValue(mStatusText); + mStatusTextBox->setVisible( TRUE ); + } LLFolderViewFolder::draw(); diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 56ebdfcf79..faf6a9cf23 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -62,6 +62,7 @@ class LLLineEditor; class LLMenuGL; class LLScrollContainer; class LLUICtrl; +class LLTextBox; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLFolderViewFunctor @@ -327,7 +328,7 @@ protected: LLUUID mSelectThisID; // if non null, select this item - LLPanel* mParentPanel; + LLPanel* mParentPanel; /** * Is used to determine if we need to cut text In LLFolderViewItem to avoid horizontal scroll. @@ -344,6 +345,8 @@ protected: public: static F32 sAutoOpenTime; + LLTextBox* mStatusTextBox; + }; bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b); diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 4c1019a882..4db75bbd8a 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -677,9 +677,12 @@ void LLGroupMgrGroupData::sendRoleChanges() break; } case RC_UPDATE_ALL: + // fall through case RC_UPDATE_POWERS: need_power_recalc = true; + // fall through case RC_UPDATE_DATA: + // fall through default: { LLGroupRoleData* group_role_data = (*role_it).second; @@ -762,7 +765,7 @@ void LLGroupMgr::addObserver(LLGroupMgrObserver* observer) mObservers.insert(std::pair<LLUUID, LLGroupMgrObserver*>(observer->getID(), observer)); } -void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer) +void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer) { if(group_id.notNull() && observer) { @@ -792,7 +795,7 @@ void LLGroupMgr::removeObserver(LLGroupMgrObserver* observer) } } -void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer) +void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer) { if(group_id.isNull() || !observer) { @@ -1364,7 +1367,7 @@ void LLGroupMgr::notifyObservers(LLGroupChange gc) gi->second->mChanged = FALSE; - // notify LLParticularGroupMgrObserver + // notify LLParticularGroupObserver observer_map_t::iterator obs_it = mParticularObservers.find(group_id); if(obs_it == mParticularObservers.end()) return; diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index 588b4a9034..2c86de8b97 100644 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -53,10 +53,10 @@ protected: LLUUID mID; }; -class LLParticularGroupMgrObserver +class LLParticularGroupObserver { public: - virtual ~LLParticularGroupMgrObserver(){} + virtual ~LLParticularGroupObserver(){} virtual void changed(const LLUUID& group_id, LLGroupChange gc) = 0; }; @@ -313,9 +313,9 @@ public: ~LLGroupMgr(); void addObserver(LLGroupMgrObserver* observer); - void addObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer); + void addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer); void removeObserver(LLGroupMgrObserver* observer); - void removeObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer); + void removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer); LLGroupMgrGroupData* getGroupData(const LLUUID& id); void sendGroupPropertiesRequest(const LLUUID& group_id); @@ -374,7 +374,7 @@ private: typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t; group_map_t mGroups; - typedef std::set<LLParticularGroupMgrObserver*> observer_set_t; + typedef std::set<LLParticularGroupObserver*> observer_set_t; typedef std::map<LLUUID,observer_set_t> observer_map_t; observer_map_t mParticularObservers; }; 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 ba034609e9..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; @@ -121,36 +121,6 @@ void LLIMFloaterContainer::onCloseFloater(LLUUID& id) mSessions.erase(id); } -void LLIMFloaterContainer::processProperties(void* data, enum EAvatarProcessorType type) -{ - if (APT_PROPERTIES == type) - { - LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data); - if (avatar_data) - { - LLUUID avatar_id = avatar_data->avatar_id; - LLUUID* cached_avatarId = LLAvatarIconIDCache::getInstance()->get(avatar_id); - if(cached_avatarId && cached_avatarId->notNull() && avatar_data->image_id != *cached_avatarId) - { - LLAvatarIconIDCache::getInstance()->add(avatar_id,avatar_data->image_id); - mTabContainer->setTabImage(get_ptr_in_map(mSessions, avatar_id), avatar_data->image_id); - } - } - } -} - -void LLIMFloaterContainer::changed(const LLUUID& group_id, LLGroupChange gc) -{ - if (GC_PROPERTIES == gc) - { - LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id); - if (group_data && group_data->mInsigniaID.notNull()) - { - mTabContainer->setTabImage(get_ptr_in_map(mSessions, group_id), group_data->mInsigniaID); - } - } -} - void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data) { LLUUID session_id = data["from_id"].asUUID(); diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index b07ef2d71d..46c0617c01 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -43,7 +43,7 @@ class LLTabContainer; -class LLIMFloaterContainer : public LLMultiFloater, public LLAvatarPropertiesObserver, public LLParticularGroupMgrObserver +class LLIMFloaterContainer : public LLMultiFloater { public: LLIMFloaterContainer(const LLSD& seed); @@ -57,9 +57,6 @@ public: BOOL select_added_floater, LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END); - void processProperties(void* data, EAvatarProcessorType type); - void changed(const LLUUID& group_id, LLGroupChange gc); - static LLFloater* getCurrentVoiceFloater(); static LLIMFloaterContainer* findInstance(); diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 32482a065c..77e3012d26 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -77,6 +77,9 @@ const static std::string IM_FROM_ID("from_id"); const static std::string NO_SESSION("(IM Session Doesn't Exist)"); const static std::string ADHOC_NAME_SUFFIX(" Conference"); +const static std::string NEARBY_P2P_BY_OTHER("nearby_P2P_by_other"); +const static std::string NEARBY_P2P_BY_AGENT("nearby_P2P_by_agent"); + std::string LLCallDialogManager::sPreviousSessionlName = ""; LLIMModel::LLIMSession::SType LLCallDialogManager::sPreviousSessionType = LLIMModel::LLIMSession::P2P_SESSION; std::string LLCallDialogManager::sCurrentSessionlName = ""; @@ -253,12 +256,12 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES { case LLVoiceChannel::STATE_CALL_STARTED : message = other_avatar_name + " " + started_call; - LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message); break; case LLVoiceChannel::STATE_CONNECTED : message = you + " " + joined_call; - LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message); default: break; } @@ -269,11 +272,11 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES { case LLVoiceChannel::STATE_CALL_STARTED : message = you + " " + started_call; - LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message); break; case LLVoiceChannel::STATE_CONNECTED : message = other_avatar_name + " " + joined_call; - LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message); default: break; } @@ -288,7 +291,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES { case LLVoiceChannel::STATE_CONNECTED : message = you + " " + joined_call; - LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message); default: break; } @@ -299,7 +302,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES { case LLVoiceChannel::STATE_CALL_STARTED : message = you + " " + started_call; - LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message); + LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message); break; default: break; @@ -1372,7 +1375,7 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id) } sSession = session; - sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3)); + sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3, _4)); if(sCurrentSessionlName != session->mName) { sPreviousSessionlName = sCurrentSessionlName; @@ -1403,7 +1406,7 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id) } -void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction) +void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent) { LLSD mCallDialogPayload; LLOutgoingCallDialog* ocd = NULL; @@ -1423,6 +1426,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat mCallDialogPayload["state"] = new_state; mCallDialogPayload["disconnected_channel_name"] = sSession->mName; mCallDialogPayload["session_type"] = sSession->mSessionType; + mCallDialogPayload["ended_by_agent"] = ended_by_agent; switch(new_state) { @@ -1618,14 +1622,16 @@ void LLOutgoingCallDialog::show(const LLSD& key) channel_name = LLTextUtil::formatPhoneNumber(channel_name); } childSetTextArg("nearby", "[VOICE_CHANNEL_NAME]", channel_name); - childSetTextArg("nearby_P2P", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString()); + childSetTextArg("nearby_P2P_by_other", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString()); // skipping "You will now be reconnected to nearby" in notification when call is ended by disabling voice, // so no reconnection to nearby chat happens (EXT-4397) bool voice_works = LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking(); std::string reconnect_nearby = voice_works ? LLTrans::getString("reconnect_nearby") : std::string(); childSetTextArg("nearby", "[RECONNECT_NEARBY]", reconnect_nearby); - childSetTextArg("nearby_P2P", "[RECONNECT_NEARBY]", reconnect_nearby); + + const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER; + childSetTextArg(nearby_str, "[RECONNECT_NEARBY]", reconnect_nearby); } std::string callee_name = mPayload["session_name"].asString(); @@ -1659,6 +1665,7 @@ void LLOutgoingCallDialog::show(const LLSD& key) { case LLVoiceChannel::STATE_CALL_STARTED : getChild<LLTextBox>("calling")->setVisible(true); + getChild<LLButton>("Cancel")->setVisible(true); if(show_oldchannel) { getChild<LLTextBox>("leaving")->setVisible(true); @@ -1680,7 +1687,8 @@ void LLOutgoingCallDialog::show(const LLSD& key) case LLVoiceChannel::STATE_HUNG_UP : if (mPayload["session_type"].asInteger() == LLIMModel::LLIMSession::P2P_SESSION) { - getChild<LLTextBox>("nearby_P2P")->setVisible(true); + const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER; + getChild<LLTextBox>(nearby_str)->setVisible(true); } else { @@ -1699,7 +1707,8 @@ void LLOutgoingCallDialog::hideAllText() getChild<LLTextBox>("calling")->setVisible(false); getChild<LLTextBox>("leaving")->setVisible(false); getChild<LLTextBox>("connecting")->setVisible(false); - getChild<LLTextBox>("nearby_P2P")->setVisible(false); + getChild<LLTextBox>("nearby_P2P_by_other")->setVisible(false); + getChild<LLTextBox>("nearby_P2P_by_agent")->setVisible(false); getChild<LLTextBox>("nearby")->setVisible(false); getChild<LLTextBox>("noanswer")->setVisible(false); } diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 21c7626109..ad6cede727 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -452,7 +452,7 @@ public: static void initClass(); static void onVoiceChannelChanged(const LLUUID &session_id); - static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction); + static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent); protected: static std::string sPreviousSessionlName; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index da95eaefca..019a4b22c3 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 { diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 33623539e9..3553137f53 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -195,6 +195,62 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder) } } +static void assign_clothing_bodypart_icon(EInventoryIcon &idx, U32 attachment_point) +{ + const EWearableType wearable_type = EWearableType(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point); + switch(wearable_type) + { + case WT_SHAPE: + idx = BODYPART_SHAPE_ICON_NAME; + break; + case WT_SKIN: + idx = BODYPART_SKIN_ICON_NAME; + break; + case WT_HAIR: + idx = BODYPART_HAIR_ICON_NAME; + break; + case WT_EYES: + idx = BODYPART_EYES_ICON_NAME; + break; + case WT_SHIRT: + idx = CLOTHING_SHIRT_ICON_NAME; + break; + case WT_PANTS: + idx = CLOTHING_PANTS_ICON_NAME; + break; + case WT_SHOES: + idx = CLOTHING_SHOES_ICON_NAME; + break; + case WT_SOCKS: + idx = CLOTHING_SOCKS_ICON_NAME; + break; + case WT_JACKET: + idx = CLOTHING_JACKET_ICON_NAME; + break; + case WT_GLOVES: + idx = CLOTHING_GLOVES_ICON_NAME; + break; + case WT_UNDERSHIRT: + idx = CLOTHING_UNDERSHIRT_ICON_NAME; + break; + case WT_UNDERPANTS: + idx = CLOTHING_UNDERPANTS_ICON_NAME; + break; + case WT_SKIRT: + idx = CLOTHING_SKIRT_ICON_NAME; + break; + case WT_ALPHA: + idx = CLOTHING_ALPHA_ICON_NAME; + break; + case WT_TATTOO: + idx = CLOTHING_TATTOO_ICON_NAME; + break; + default: + break; + } +} + + const std::string& get_item_icon_name(LLAssetType::EType asset_type, LLInventoryType::EType inventory_type, U32 attachment_point, @@ -249,62 +305,11 @@ const std::string& get_item_icon_name(LLAssetType::EType asset_type, break; case LLAssetType::AT_CLOTHING: idx = CLOTHING_ICON_NAME; - case LLAssetType::AT_BODYPART : - if(LLAssetType::AT_BODYPART == asset_type) - { - idx = BODYPART_ICON_NAME; - } - switch(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point) - { - case WT_SHAPE: - idx = BODYPART_SHAPE_ICON_NAME; - break; - case WT_SKIN: - idx = BODYPART_SKIN_ICON_NAME; - break; - case WT_HAIR: - idx = BODYPART_HAIR_ICON_NAME; - break; - case WT_EYES: - idx = BODYPART_EYES_ICON_NAME; - break; - case WT_SHIRT: - idx = CLOTHING_SHIRT_ICON_NAME; - break; - case WT_PANTS: - idx = CLOTHING_PANTS_ICON_NAME; - break; - case WT_SHOES: - idx = CLOTHING_SHOES_ICON_NAME; - break; - case WT_SOCKS: - idx = CLOTHING_SOCKS_ICON_NAME; - break; - case WT_JACKET: - idx = CLOTHING_JACKET_ICON_NAME; - break; - case WT_GLOVES: - idx = CLOTHING_GLOVES_ICON_NAME; - break; - case WT_UNDERSHIRT: - idx = CLOTHING_UNDERSHIRT_ICON_NAME; - break; - case WT_UNDERPANTS: - idx = CLOTHING_UNDERPANTS_ICON_NAME; - break; - case WT_SKIRT: - idx = CLOTHING_SKIRT_ICON_NAME; - break; - case WT_ALPHA: - idx = CLOTHING_ALPHA_ICON_NAME; - break; - case WT_TATTOO: - idx = CLOTHING_TATTOO_ICON_NAME; - break; - default: - // no-op, go with choice above - break; - } + assign_clothing_bodypart_icon(idx, attachment_point); + break; + case LLAssetType::AT_BODYPART: + idx = BODYPART_ICON_NAME; + assign_clothing_bodypart_icon(idx, attachment_point); break; case LLAssetType::AT_NOTECARD: idx = NOTECARD_ICON_NAME; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 467255d1a7..ca9b942629 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -143,6 +143,7 @@ BOOL LLInventoryPanel::postBuild() addChild(mScroller); mScroller->addChild(mFolders); mFolders->setScrollContainer(mScroller); + mFolders->addChild(mFolders->mStatusTextBox); } // Set up the callbacks from the inventory we're viewing, and then build everything. 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/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/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index cbd6f64a48..8e305a5674 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -224,14 +224,6 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) childSetEnabled("share_btn", FALSE); childSetEnabled("teleport_btn", FALSE); childSetEnabled("pay_btn", FALSE); - - getChild<LLTextBox>("avatar_name")->setValue(im_session->mName); - getChild<LLTextBox>("avatar_name")->setToolTip(im_session->mName); - } - else - { - // If the participant is an avatar, fetch the currect name - gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4)); } } @@ -247,19 +239,6 @@ void LLPanelIMControlPanel::changed(U32 mask) } } -void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) -{ - if ( id == mAvatarID ) - { - std::string avatar_name; - avatar_name.assign(first); - avatar_name.append(" "); - avatar_name.append(last); - getChild<LLTextBox>("avatar_name")->setValue(avatar_name); - getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name); - } -} - LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id): mParticipantList(NULL) { diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index 3ab505a084..ce8fc58e56 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -89,9 +89,6 @@ public: // LLFriendObserver trigger virtual void changed(U32 mask); -protected: - void nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); - private: void onViewProfileButtonClicked(); void onAddFriendButtonClicked(); diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 36a542cfa0..cd6c727b5c 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -406,21 +406,24 @@ void LLPanelLandmarkInfo::populateFoldersList() // Put the "Landmarks" folder first in list. LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK); - const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id); - if (!cat) + const LLViewerInventoryCategory* lmcat = gInventory.getCategory(landmarks_id); + if (!lmcat) { llwarns << "Cannot find the landmarks folder" << llendl; } - std::string cat_full_name = getFullFolderName(cat); - mFolderCombo->add(cat_full_name, cat->getUUID()); + else + { + std::string cat_full_name = getFullFolderName(lmcat); + mFolderCombo->add(cat_full_name, lmcat->getUUID()); + } typedef std::vector<folder_pair_t> folder_vec_t; folder_vec_t folders; // Sort the folders by their full name. for (S32 i = 0; i < cats.count(); i++) { - cat = cats.get(i); - cat_full_name = getFullFolderName(cat); + const LLViewerInventoryCategory* cat = cats.get(i); + std::string cat_full_name = getFullFolderName(cat); folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name)); } sort(folders.begin(), folders.end(), cmp_folders); diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index f601a8d51c..64a265219b 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -206,7 +206,7 @@ void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable) { LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata; self->mAutoLoop->clear(); - self->mAutoPlay->clear(); + self->mAutoPlay->setValue(LLSD(TRUE)); // set default value for auto play to true; self->mAutoScale->clear(); self->mAutoZoom ->clear(); self->mCurrentURL->clear(); diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index ada65c98a4..8eb0b69491 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -843,10 +843,13 @@ void LLPanelPicks::onPanelClassifiedClose(LLPanelClassifiedInfo* panel) { LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>( mClassifiedsList->getItemByValue(values[n])); - - c_item->setClassifiedName(panel->getClassifiedName()); - c_item->setDescription(panel->getDescription()); - c_item->setSnapshotId(panel->getSnapshotId()); + llassert(c_item); + if (c_item) + { + c_item->setClassifiedName(panel->getClassifiedName()); + c_item->setDescription(panel->getDescription()); + c_item->setSnapshotId(panel->getSnapshotId()); + } } } } diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 17a970cfcf..26b57c003b 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -1048,14 +1048,13 @@ void LLPanelPlaces::updateVerbs() mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); - mOverflowBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); + mOverflowBtn->setVisible(is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn); mEditBtn->setVisible(mPlaceInfoType == LANDMARK_INFO_TYPE && !isLandmarkEditModeOn); mSaveBtn->setVisible(isLandmarkEditModeOn); mCancelBtn->setVisible(isLandmarkEditModeOn); mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn); mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos); - mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible); if (is_place_info_visible) { diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp index 6c6eb7c719..f1e450a083 100644 --- a/indra/newview/llplacesinventorypanel.cpp +++ b/indra/newview/llplacesinventorypanel.cpp @@ -118,6 +118,7 @@ BOOL LLPlacesInventoryPanel::postBuild() mScroller->addChild(mFolders); mFolders->setScrollContainer(mScroller); + mFolders->addChild(mFolders->mStatusTextBox); // cut subitems diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index a8feaf690d..3221745fa3 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -661,7 +661,9 @@ void LLScriptEdCore::onBtnDynamicHelp() live_help_floater = new LLFloater(LLSD()); LLUICtrlFactory::getInstance()->buildFloater(live_help_floater, "floater_lsl_guide.xml", NULL); LLFloater* parent = dynamic_cast<LLFloater*>(getParent()); - parent->addDependentFloater(live_help_floater, TRUE); + llassert(parent); + if (parent) + parent->addDependentFloater(live_help_floater, TRUE); live_help_floater->childSetCommitCallback("lock_check", onCheckLock, this); live_help_floater->childSetValue("lock_check", gSavedSettings.getBOOL("ScriptHelpFollowsCursor")); live_help_floater->childSetCommitCallback("history_combo", onHelpComboCommit, this); 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¬ification, 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/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 44348ba429..0275736f6d 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -231,20 +231,23 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item) // PERMISSIONS LOOKUP // //////////////////////// + llassert(item); + if (!item) return; + // do not enable the UI for incomplete items. BOOL is_complete = item->isComplete(); const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(item->getInventoryType()); const BOOL is_calling_card = (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD); const LLPermissions& perm = item->getPermissions(); const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm, - GP_OBJECT_MANIPULATE); + GP_OBJECT_MANIPULATE); const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm, - GP_OBJECT_SET_SALE) && + GP_OBJECT_SET_SALE) && !cannot_restrict_permissions; const BOOL is_link = item->getIsLinkType(); const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); - bool not_in_trash = item && (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id); + bool not_in_trash = (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id); // You need permission to modify the object to modify an inventory // item in it. diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp index 3343ee88bd..e4773f99c5 100644 --- a/indra/newview/llslurl.cpp +++ b/indra/newview/llslurl.cpp @@ -40,6 +40,12 @@ const std::string LLSLURL::PREFIX_SL_HELP = "secondlife://app."; const std::string LLSLURL::PREFIX_SL = "sl://"; const std::string LLSLURL::PREFIX_SECONDLIFE = "secondlife://"; const std::string LLSLURL::PREFIX_SLURL_OLD = "http://slurl.com/secondlife/"; + +// For DnD - even though www.slurl.com redirects to slurl.com in a browser, you can copy and drag +// text with www.slurl.com or a link explicitly pointing at www.slurl.com so testing for this +// version is required also. +const std::string LLSLURL::PREFIX_SLURL_WWW = "http://www.slurl.com/secondlife/"; + const std::string LLSLURL::PREFIX_SLURL = "http://maps.secondlife.com/secondlife/"; const std::string LLSLURL::APP_TOKEN = "app/"; @@ -68,7 +74,10 @@ std::string LLSLURL::stripProtocol(const std::string& url) { stripped.erase(0, PREFIX_SLURL_OLD.length()); } - + else if (matchPrefix(stripped, PREFIX_SLURL_WWW)) + { + stripped.erase(0, PREFIX_SLURL_WWW.length()); + } return stripped; } @@ -81,6 +90,7 @@ bool LLSLURL::isSLURL(const std::string& url) if (matchPrefix(url, PREFIX_SECONDLIFE)) return true; if (matchPrefix(url, PREFIX_SLURL)) return true; if (matchPrefix(url, PREFIX_SLURL_OLD)) return true; + if (matchPrefix(url, PREFIX_SLURL_WWW)) return true; return false; } @@ -91,6 +101,7 @@ bool LLSLURL::isSLURLCommand(const std::string& url) if (matchPrefix(url, PREFIX_SL + APP_TOKEN) || matchPrefix(url, PREFIX_SECONDLIFE + "/" + APP_TOKEN) || matchPrefix(url, PREFIX_SLURL + APP_TOKEN) || + matchPrefix(url, PREFIX_SLURL_WWW + APP_TOKEN) || matchPrefix(url, PREFIX_SLURL_OLD + APP_TOKEN) ) { return true; diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h index 21b32ce409..6a695e84f3 100644 --- a/indra/newview/llslurl.h +++ b/indra/newview/llslurl.h @@ -51,6 +51,7 @@ public: static const std::string PREFIX_SECONDLIFE; static const std::string PREFIX_SLURL; static const std::string PREFIX_SLURL_OLD; + static const std::string PREFIX_SLURL_WWW; static const std::string APP_TOKEN; diff --git a/indra/newview/llstylemap.cpp b/indra/newview/llstylemap.cpp index 2485563cbc..61705c4eb3 100644 --- a/indra/newview/llstylemap.cpp +++ b/indra/newview/llstylemap.cpp @@ -49,6 +49,7 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source) if (source != LLUUID::null && source != gAgent.getID() ) { style_params.color.control = "HTMLLinkColor"; + style_params.readonly_color.control = "HTMLLinkColor"; style_params.link_href = LLSLURL::buildCommand("agent", source, "inspect"); } @@ -56,6 +57,7 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source) { // Make the resident's own name white and don't make the name clickable. style_params.color = LLColor4::white; + style_params.readonly_color = LLColor4::white; } mMap[source] = style_params; @@ -75,11 +77,13 @@ const LLStyle::Params &LLStyleMap::lookup(const LLUUID& id, const std::string& l if (id != LLUUID::null && !link.empty()) { style_params.color.control = "HTMLLinkColor"; + style_params.readonly_color.control = "HTMLLinkColor"; style_params.link_href = link; } else { style_params.color = LLColor4::white; + style_params.readonly_color = LLColor4::white; } mMap[id] = style_params; } diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 4a61130785..6dcf4bc798 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; diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index 7ae2404203..cb43beb819 100644 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -141,32 +141,6 @@ BOOL LLToastIMPanel::handleToolTip(S32 x, S32 y, MASK mask) return LLToastPanel::handleToolTip(x, y, mask); } -void LLToastIMPanel::showInspector() -{ - LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID); - if(!im_session) - { - llwarns << "Invalid IM session" << llendl; - return; - } - - switch(im_session->mSessionType) - { - case LLIMModel::LLIMSession::P2P_SESSION: - LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID)); - break; - case LLIMModel::LLIMSession::GROUP_SESSION: - LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID)); - break; - case LLIMModel::LLIMSession::ADHOC_SESSION: - LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", im_session->mOtherParticipantID)); - break; - default: - llwarns << "Unknown IM session type" << llendl; - break; - } -} - void LLToastIMPanel::spawnNameToolTip() { // Spawn at right side of the name textbox. @@ -176,7 +150,7 @@ void LLToastIMPanel::spawnNameToolTip() LLToolTip::Params params; params.background_visible(false); - params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this)); + params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_avatar", LLSD().with("avatar_id", mAvatarID), FALSE)); params.delay_time(0.0f); // spawn instantly on hover params.image(LLUI::getUIImage("Info_Small")); params.message(""); @@ -201,7 +175,7 @@ void LLToastIMPanel::spawnGroupIconToolTip() LLInspector::Params params; params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>()); - params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this)); + params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_group", LLSD().with("group_id", mSessionID), FALSE)); params.delay_time(0.100f); params.image(LLUI::getUIImage("Info_Small")); params.message(g_data.mName); @@ -214,16 +188,15 @@ void LLToastIMPanel::spawnGroupIconToolTip() void LLToastIMPanel::initIcon() { - LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon"); - mAvatarIcon->setVisible(FALSE); mGroupIcon->setVisible(FALSE); - sys_msg_icon->setVisible(FALSE); mAdhocIcon->setVisible(FALSE); if(mAvatarName->getValue().asString() == SYSTEM_FROM) { - sys_msg_icon->setVisible(TRUE); + // "sys_msg_icon" was disabled by Erica in the changeset: 5109 (85181bc92cbe) + // and "dummy widget" warnings appeared in log. + // It does not make sense to have such image with empty name. Removed for EXT-5057. } else { 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/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index bf1e307d71..fdf9e1df2e 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -1485,6 +1485,12 @@ BOOL LLToolPie::pickRightMouseDownCallback() while( object && object->isAttachment()) { object = (LLViewerObject*)object->getParent(); + llassert(object); + } + + if (!object) + { + return TRUE; // unexpected, but escape } // Object is an avatar, so check for mute by id. diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 8aae90ec3c..b15a9a9e99 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()); @@ -5599,8 +5599,6 @@ void handle_buy_currency() LLFloaterBuyCurrency::buyCurrency(); } - - class LLFloaterVisible : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -5644,6 +5642,25 @@ class LLShowSidetrayPanel : public view_listener_t } }; +class LLSidetrayPanelVisible : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + std::string panel_name = userdata.asString(); + // Toggle the panel + if (LLSideTray::getInstance()->isPanelActive(panel_name)) + { + return true; + } + else + { + return false; + } + + } +}; + + bool callback_show_url(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -8028,6 +8045,7 @@ void initialize_menus() 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"); view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD"); view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected"); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 6bad8843fd..84b270f8cc 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -796,84 +796,88 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt //LLAssetType::EType pref_loc = data->mPreferredLocation; BOOL is_balance_sufficient = TRUE; - if(result >= 0) + if(data) { - LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation; - - if (LLAssetType::AT_SOUND == data->mAssetInfo.mType || - LLAssetType::AT_TEXTURE == data->mAssetInfo.mType || - LLAssetType::AT_ANIMATION == data->mAssetInfo.mType) + if (result >= 0) { - // Charge the user for the upload. - LLViewerRegion* region = gAgent.getRegion(); - - if(!(can_afford_transaction(expected_upload_cost))) - { - LLFloaterBuyCurrency::buyCurrency( - llformat(LLTrans::getString("UploadingCosts").c_str(), - data->mAssetInfo.getName().c_str()), - expected_upload_cost); - is_balance_sufficient = FALSE; - } - else if(region) + LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation; + + if (LLAssetType::AT_SOUND == data->mAssetInfo.mType || + LLAssetType::AT_TEXTURE == data->mAssetInfo.mType || + LLAssetType::AT_ANIMATION == data->mAssetInfo.mType) { - // Charge user for upload - gStatusBar->debitBalance(expected_upload_cost); + // Charge the user for the upload. + LLViewerRegion* region = gAgent.getRegion(); - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_MoneyTransferRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_MoneyData); - msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_DestID, LLUUID::null); - msg->addU8("Flags", 0); - // we tell the sim how much we were expecting to pay so it - // can respond to any discrepancy - msg->addS32Fast(_PREHASH_Amount, expected_upload_cost); - msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY); - msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY); - msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE); - msg->addStringFast(_PREHASH_Description, NULL); - msg->sendReliable(region->getHost()); + if(!(can_afford_transaction(expected_upload_cost))) + { + LLFloaterBuyCurrency::buyCurrency( + llformat(LLTrans::getString("UploadingCosts").c_str(), + data->mAssetInfo.getName().c_str()), + expected_upload_cost); + is_balance_sufficient = FALSE; + } + else if(region) + { + // Charge user for upload + gStatusBar->debitBalance(expected_upload_cost); + + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_MoneyTransferRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_MoneyData); + msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_DestID, LLUUID::null); + msg->addU8("Flags", 0); + // we tell the sim how much we were expecting to pay so it + // can respond to any discrepancy + msg->addS32Fast(_PREHASH_Amount, expected_upload_cost); + msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY); + msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY); + msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE); + msg->addStringFast(_PREHASH_Description, NULL); + msg->sendReliable(region->getHost()); + } } - } - if(is_balance_sufficient) - { - // Actually add the upload to inventory - llinfos << "Adding " << uuid << " to inventory." << llendl; - const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc); - if(folder_id.notNull()) + if(is_balance_sufficient) { - U32 next_owner_perms = data->mNextOwnerPerm; - if(PERM_NONE == next_owner_perms) + // Actually add the upload to inventory + llinfos << "Adding " << uuid << " to inventory." << llendl; + const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc); + if(folder_id.notNull()) { - next_owner_perms = PERM_MOVE | PERM_TRANSFER; + U32 next_owner_perms = data->mNextOwnerPerm; + if(PERM_NONE == next_owner_perms) + { + next_owner_perms = PERM_MOVE | PERM_TRANSFER; + } + create_inventory_item(gAgent.getID(), gAgent.getSessionID(), + folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(), + data->mAssetInfo.getDescription(), data->mAssetInfo.mType, + data->mInventoryType, NOT_WEARABLE, next_owner_perms, + LLPointer<LLInventoryCallback>(NULL)); + } + else + { + llwarns << "Can't find a folder to put it in" << llendl; } - create_inventory_item(gAgent.getID(), gAgent.getSessionID(), - folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(), - data->mAssetInfo.getDescription(), data->mAssetInfo.mType, - data->mInventoryType, NOT_WEARABLE, next_owner_perms, - LLPointer<LLInventoryCallback>(NULL)); - } - else - { - llwarns << "Can't find a folder to put it in" << llendl; } } - } - else // if(result >= 0) - { - LLSD args; - args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType); - args["REASON"] = std::string(LLAssetStorage::getErrorString(result)); - LLNotificationsUtil::add("CannotUploadReason", args); + else // if(result >= 0) + { + LLSD args; + args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType); + args["REASON"] = std::string(LLAssetStorage::getErrorString(result)); + LLNotificationsUtil::add("CannotUploadReason", args); + } } LLUploadDialog::modalUploadFinished(); delete data; + data = NULL; // *NOTE: This is a pretty big hack. What this does is check the // file picker if there are any more pending uploads. If so, 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 9893eb5dce..b66f58d853 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1519,12 +1519,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; @@ -2342,14 +2342,8 @@ 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 ; @@ -2699,7 +2693,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 +2879,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) ; } @@ -2995,6 +2988,10 @@ void LLViewerMediaTexture::initVirtualSize() void LLViewerMediaTexture::addMediaToFace(LLFace* facep) { + if(facep) + { + facep->setHasMedia(true) ; + } if(!mIsPlaying) { return ; //no need to add the face because the media is not in playing. @@ -3005,14 +3002,16 @@ void LLViewerMediaTexture::addMediaToFace(LLFace* facep) void LLViewerMediaTexture::removeMediaFromFace(LLFace* facep) { - if(!mIsPlaying) - { - return ; //no need to remove the face because the media is not in playing. - } if(!facep) { return ; } + facep->setHasMedia(false) ; + + if(!mIsPlaying) + { + return ; //no need to remove the face because the media is not in playing. + } mIsPlaying = FALSE ; //set to remove the media from the face. switchTexture(facep) ; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 4a86e1ca41..b76a2e150f 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2463,6 +2463,8 @@ void LLViewerWindow::updateUI() { static std::string last_handle_msg; + LLConsole::updateClass(); + // animate layout stacks so we have up to date rect for world view LLLayoutStack::updateClass(); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index f2f769980b..7a6a48d1b3 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1492,9 +1492,9 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename) //------------------------------------------------------------------------- // parse the file //------------------------------------------------------------------------- - BOOL success = sSkeletonXMLTree.parseFile( filename, FALSE ); + BOOL parsesuccess = sSkeletonXMLTree.parseFile( filename, FALSE ); - if (!success) + if (!parsesuccess) { llerrs << "Can't parse skeleton file: " << filename << llendl; return FALSE; @@ -1505,11 +1505,13 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename) if (!root) { llerrs << "No root node found in avatar skeleton file: " << filename << llendl; + return FALSE; } if( !root->hasName( "linden_skeleton" ) ) { llerrs << "Invalid avatar skeleton file header: " << filename << llendl; + return FALSE; } std::string version; @@ -1517,6 +1519,7 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename) if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") ) { llerrs << "Invalid avatar skeleton file version: " << version << " in file: " << filename << llendl; + return FALSE; } return TRUE; @@ -2192,13 +2195,16 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) // store off last frame's root position to be consistent with camera position LLVector3 root_pos_last = mRoot.getWorldPosition(); BOOL detailed_update = updateCharacter(agent); - BOOL voice_enabled = gVoiceClient->getVoiceEnabled( mID ) && gVoiceClient->inProximalChannel(); if (gNoRender) { return TRUE; } + static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false); + bool voice_enabled = (visualizers_in_calls || gVoiceClient->inProximalChannel()) && + gVoiceClient->getVoiceEnabled(mID); + idleUpdateVoiceVisualizer( voice_enabled ); idleUpdateMisc( detailed_update ); idleUpdateAppearanceAnimation(); @@ -3090,7 +3096,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) if (!visible) { - //updateMotions(LLCharacter::HIDDEN_UPDATE); + updateMotions(LLCharacter::HIDDEN_UPDATE); return FALSE; } diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index bb09a18cc3..dfd67d0c38 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -122,7 +122,8 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess mState(STATE_NO_CHANNEL_INFO), mSessionName(session_name), mCallDirection(OUTGOING_CALL), - mIgnoreNextSessionLeave(FALSE) + mIgnoreNextSessionLeave(FALSE), + mCallEndedByAgent(false) { mNotifyArgs["VOICE_CHANNEL_NAME"] = mSessionName; @@ -412,7 +413,7 @@ void LLVoiceChannel::doSetState(const EState& new_state) EState old_state = mState; mState = new_state; if (!mStateChangedCallback.empty()) - mStateChangedCallback(old_state, mState, mCallDirection); + mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent); } //static @@ -779,7 +780,8 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type) } else { - // other user hung up + // other user hung up, so we didn't end the call + mCallEndedByAgent = false; } deactivate(); } @@ -810,6 +812,9 @@ void LLVoiceChannelP2P::activate() { if (callStarted()) return; + //call will be counted as ended by user unless this variable is changed in handleStatusChange() + mCallEndedByAgent = true; + LLVoiceChannel::activate(); if (callStarted()) diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index cb86671305..941cccacc3 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -58,7 +58,7 @@ public: OUTGOING_CALL } EDirection; - typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction)> state_changed_signal_t; + typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction, bool ended_by_agent)> state_changed_signal_t; // on current channel changed signal typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t; @@ -122,6 +122,8 @@ protected: std::string mSessionName; LLSD mNotifyArgs; LLSD mCallDialogPayload; + // true if call was ended by agent + bool mCallEndedByAgent; BOOL mIgnoreNextSessionLeave; LLHandle<LLPanel> mLoginNotificationHandle; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index bfe38c14ba..fa00396c34 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -679,6 +679,7 @@ void LLVOVolume::updateTextureVirtualSize() vsize = area; imagep->setBoostLevel(LLViewerTexture::BOOST_HUD); face->setPixelArea(area); // treat as full screen + face->setVirtualSize(vsize); } else { @@ -695,8 +696,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; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index bd22fc5f2e..dd9634a234 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1355,6 +1355,7 @@ void LLPipeline::updateMoveNormalAsync(LLDrawable* drawablep) if (!drawablep) { llerrs << "updateMove called with NULL drawablep" << llendl; + return; } if (drawablep->isState(LLDrawable::EARLY_MOVE)) { diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 44c9284b36..593bbe4b5e 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -369,7 +369,7 @@ Leyla Linden </text> layout="topleft" left_delta="0" name="Sell with landowners objects in parcel." - top_pad="-3" + top_pad="-2" width="186"> Objects included in sale </text> diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml index cc9afe4474..2bafd1bdef 100644 --- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml @@ -96,13 +96,24 @@ No Answer. Please try again later. height="40" layout="topleft" left="77" - name="nearby_P2P" + name="nearby_P2P_by_other" top="27" width="315" word_wrap="true"> [VOICE_CHANNEL_NAME] has ended the call. [RECONNECT_NEARBY] </text> <text + font="SansSerifLarge" + height="40" + layout="topleft" + left="77" + name="nearby_P2P_by_agent" + top="27" + width="315" + word_wrap="true"> + You have ended the call. [RECONNECT_NEARBY] + </text> + <text font="SansSerif" height="50" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index df6c7bd9cb..07a366da7f 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -55,9 +55,10 @@ </menu_item_call> <menu_item_check label="My Inventory" - layout="topleft" name="Inventory" - shortcut="control|shift|I"> + layout="topleft" + shortcut="control|shift|I" + visible="false"> <menu_item_check.on_check function="Floater.Visible" parameter="inventory" /> @@ -65,24 +66,31 @@ 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/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_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml index c7e5b25e06..28c4adf67c 100644 --- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml @@ -11,15 +11,6 @@ name="avatar_icon" top="-5" width="105"/> - <text - follows="top|left|right" - font="SansSerifLarge" - height="19" - layout="topleft" - name="avatar_name" - use_ellipses="true" - value="Unknown" - width="110" /> <layout_stack mouse_opaque="false" border_size="0" @@ -30,7 +21,7 @@ left="5" name="button_stack" orientation="vertical" - top_pad="-5" + top_pad="5" width="105"> <layout_panel mouse_opaque="false" diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml index a0ad38cf76..34fd3352a3 100644 --- a/indra/newview/skins/default/xui/en/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml @@ -56,16 +56,6 @@ name="adhoc_icon" top="3" width="18" /> - <!--<icon - follows="right" - height="20" - image_name="" - layout="topleft" - left="3" - mouse_opaque="true" - name="sys_msg_icon" - top="0" - width="20" />--> <text follows="left|right" font.style="BOLD" diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 4030c7184a..c6a4233c9c 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -37,7 +37,7 @@ halign="center" top_pad="4" width="305"> <inventory_panel - border="false" + border="false" follows="all" height="295" label="MY INVENTORY" @@ -48,7 +48,7 @@ halign="center" top="16" width="290" /> <inventory_panel - border="false" + border="false" follows="all" height="295" label="RECENT" @@ -67,7 +67,7 @@ halign="center" height="30" layout="bottomleft" left="0" - visible="true" + visible="true" name="bottom_panel" width="330"> <button @@ -118,7 +118,7 @@ halign="center" mouse_opaque="false" name="Inventory Menu" top="0" - visible="true" + visible="true" width="290"> <menu height="101" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 31ea54cf40..446bf0dc6e 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -236,7 +236,7 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t layout="topleft" left="0" name="group_list" - no_filtered_groups_msg="No groups" + no_filtered_groups_msg="[secondlife:///app/search/groups Try fine the group in search?]" no_groups_msg="[secondlife:///app/search/groups Try searching for some groups to join.]" top="0" width="313" /> diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index 887a89d518..9ef3649d9c 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -24,6 +24,7 @@ bg_opaque_color="DkGray2" layout="topleft" left="6" name="picks_panel_text" + wrap="true" top="10" width="313"/> <accordion 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_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index f7e3ede93c..f78d90c434 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -17,6 +17,7 @@ follows="left|bottom" height="23" label="Clear History" + tool_tip="Clear login image, last location, teleport history, web, and texture cache" layout="topleft" left="30" name="clear_cache" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index a5dc14c69d..39762d57fb 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -1805,7 +1805,7 @@ Clears (deletes) the media and all params from the given face. <string name="LeaveMouselook">Press ESC to return to World View</string> <!-- inventory --> - <string name="InventoryNoMatchingItems">No matching items found in inventory.</string> + <string name="InventoryNoMatchingItems">[secondlife:///app/search/groups No matching items found in inventory.Try "Search"?]</string> <string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string> <string name="InventoryNoTexture"> You do not have a copy of @@ -2129,7 +2129,7 @@ this texture in your inventory <string name="ClassifiedUpdateAfterPublish">(will update after publish)</string> <!-- panel picks --> - <string name="NoPicksClassifiedsText">There are no picks/classifieds here</string> + <string name="NoPicksClassifiedsText">You haven't created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.</string> <string name="PicksClassifiedsLoadingText">Loading...</string> <!-- Multi Preview Floater --> 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/install.xml b/install.xml index 1e8fa70d46..2461ac8786 100644 --- a/install.xml +++ b/install.xml @@ -962,9 +962,9 @@ anguage Infrstructure (CLI) international standard</string> <key>windows</key> <map> <key>md5sum</key> - <string>df0f751818dddb566d55499286c727a8</string> + <string>1e9798dc424a6f6c2bea50649bbcc7ae</string> <key>url</key> - <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100208.tar.bz2</uri> + <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100210.tar.bz2</uri> </map> </map> </map> |