diff options
author | Christian Goetze (CG) <cg@lindenlab.com> | 2010-08-02 16:59:20 -0700 |
---|---|---|
committer | Christian Goetze (CG) <cg@lindenlab.com> | 2010-08-02 16:59:20 -0700 |
commit | 6a1fefac22b62c45542208928918e9616e85977c (patch) | |
tree | c85c576b93754ec67ac5e93884b2fd26af192325 | |
parent | f423a69864c40f760c1c7e64a2e544fd1dba77fb (diff) | |
parent | 15247f086989a43881d79c1ee5416bb00721eb68 (diff) |
Redo the same merge as in changeset "2026f824953f", but this time with feeeeling.
79 files changed, 1246 insertions, 358 deletions
diff --git a/doc/contributions.txt b/doc/contributions.txt index 8c6bd5e0fe..c8125c675f 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -517,6 +517,7 @@ Ringo Tuxing Robin Cornelius SNOW-108 SNOW-204 + SNOW-484 VWR-2488 VWR-9557 VWR-11128 diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp index f4dc3b927b..7bc9e97eb1 100644 --- a/indra/llcharacter/llkeyframemotion.cpp +++ b/indra/llcharacter/llkeyframemotion.cpp @@ -1248,6 +1248,12 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) return FALSE; } + if(mJointMotionList->mEmoteName==mID.asString()) + { + llwarns << "Malformed animation mEmoteName==mID" << llendl; + return FALSE; + } + //------------------------------------------------------------------------- // get loop //------------------------------------------------------------------------- diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp index 809a626c93..e0b56b7973 100644 --- a/indra/llcommon/llqueuedthread.cpp +++ b/indra/llcommon/llqueuedthread.cpp @@ -428,9 +428,11 @@ S32 LLQueuedThread::processNextRequest() llassert_always(req->getStatus() == STATUS_QUEUED); break; } + U32 start_priority = 0 ; if (req) { req->setStatus(STATUS_INPROGRESS); + start_priority = req->getPriority(); } unlockData(); @@ -439,8 +441,7 @@ S32 LLQueuedThread::processNextRequest() // safe to access req. if (req) { - // process request - U32 start_priority = req->getPriority(); + // process request bool complete = req->processRequest(); if (complete) diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index ad950685c0..c3ef734823 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -40,8 +40,6 @@ #include "llfocusmgr.h" #include "lllocalcliprect.h" -#include "lltrans.h" - #include "boost/bind.hpp" static const S32 DRAGGER_BAR_MARGIN = 4; @@ -74,7 +72,6 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params) { initNoTabsWidget(params.no_matched_tabs_text); - mNoVisibleTabsOrigString = LLTrans::getString(params.no_visible_tabs_text.initial_value().asString()); mSingleExpansion = params.single_expansion; if(mFitParent && !mSingleExpansion) { @@ -389,7 +386,7 @@ void LLAccordionCtrl::initNoTabsWidget(const LLTextBox::Params& tb_params) { LLTextBox::Params tp = tb_params; tp.rect(getLocalRect()); - mNoMatchedTabsOrigString = LLTrans::getString(tp.initial_value().asString()); + mNoMatchedTabsOrigString = tp.initial_value().asString(); mNoVisibleTabsHelpText = LLUICtrlFactory::create<LLTextBox>(tp, this); } diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 39e46a7ccb..aeedf62379 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -1,3 +1,4 @@ + /** * @file llbutton.cpp * @brief LLButton base class diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index d1c0b38809..5b4fee0051 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -157,7 +157,7 @@ bool LLFlatListView::insertItemAfter(LLPanel* after_item, LLPanel* item_to_add, } -bool LLFlatListView::removeItem(LLPanel* item) +bool LLFlatListView::removeItem(LLPanel* item, bool rearrange) { if (!item) return false; if (item->getParent() != mItemsPanel) return false; @@ -165,22 +165,22 @@ bool LLFlatListView::removeItem(LLPanel* item) item_pair_t* item_pair = getItemPair(item); if (!item_pair) return false; - return removeItemPair(item_pair); + return removeItemPair(item_pair, rearrange); } -bool LLFlatListView::removeItemByValue(const LLSD& value) +bool LLFlatListView::removeItemByValue(const LLSD& value, bool rearrange) { if (value.isUndefined()) return false; item_pair_t* item_pair = getItemPair(value); if (!item_pair) return false; - return removeItemPair(item_pair); + return removeItemPair(item_pair, rearrange); } -bool LLFlatListView::removeItemByUUID(const LLUUID& uuid) +bool LLFlatListView::removeItemByUUID(const LLUUID& uuid, bool rearrange) { - return removeItemByValue(LLSD(uuid)); + return removeItemByValue(LLSD(uuid), rearrange); } LLPanel* LLFlatListView::getItemByValue(const LLSD& value) const @@ -327,6 +327,9 @@ U32 LLFlatListView::size(const bool only_visible_items) const void LLFlatListView::clear() { + // This will clear mSelectedItemPairs, calling all appropriate callbacks. + resetSelection(); + // do not use LLView::deleteAllChildren to avoid removing nonvisible items. drag-n-drop for ex. for (pairs_iterator_t it = mItemPairs.begin(); it != mItemPairs.end(); ++it) { @@ -335,7 +338,6 @@ void LLFlatListView::clear() delete *it; } mItemPairs.clear(); - mSelectedItemPairs.clear(); // also set items panel height to zero. Reshape it to allow reshaping of non-item children LLRect rc = mItemsPanel->getRect(); @@ -970,11 +972,12 @@ bool LLFlatListView::isSelected(item_pair_t* item_pair) const return std::find(mSelectedItemPairs.begin(), it_end, item_pair) != it_end; } -bool LLFlatListView::removeItemPair(item_pair_t* item_pair) +bool LLFlatListView::removeItemPair(item_pair_t* item_pair, bool rearrange) { llassert(item_pair); bool deleted = false; + bool selection_changed = false; for (pairs_iterator_t it = mItemPairs.begin(); it != mItemPairs.end(); ++it) { item_pair_t* _item_pair = *it; @@ -994,6 +997,7 @@ bool LLFlatListView::removeItemPair(item_pair_t* item_pair) if (selected_item_pair == item_pair) { it = mSelectedItemPairs.erase(it); + selection_changed = true; break; } } @@ -1002,8 +1006,16 @@ bool LLFlatListView::removeItemPair(item_pair_t* item_pair) item_pair->first->die(); delete item_pair; + if (rearrange) + { rearrangeItems(); notifyParentItemsRectChanged(); + } + + if (selection_changed && mCommitOnSelectionChange) + { + onCommit(); + } return true; } @@ -1080,7 +1092,7 @@ void LLFlatListView::onFocusReceived() { if (size()) { - mSelectedItemsBorder->setVisible(TRUE); + mSelectedItemsBorder->setVisible(TRUE); } gEditMenuHandler = this; } diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index ded46d8122..50d06fbc94 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -117,6 +117,9 @@ public: Params(); }; + // disable traversal when finding widget to hand focus off to + /*virtual*/ BOOL canFocusChildren() const { return FALSE; } + /** * Connects callback to signal called when Return key is pressed. */ @@ -149,19 +152,19 @@ public: * Remove specified item * @return true if the item was removed, false otherwise */ - virtual bool removeItem(LLPanel* item); + virtual bool removeItem(LLPanel* item, bool rearrange = true); /** * Remove an item specified by value * @return true if the item was removed, false otherwise */ - virtual bool removeItemByValue(const LLSD& value); + virtual bool removeItemByValue(const LLSD& value, bool rearrange = true); /** * Remove an item specified by uuid * @return true if the item was removed, false otherwise */ - virtual bool removeItemByUUID(const LLUUID& uuid); + virtual bool removeItemByUUID(const LLUUID& uuid, bool rearrange = true); /** * Get an item by value @@ -262,6 +265,7 @@ public: void setAllowSelection(bool can_select) { mAllowSelection = can_select; } /** Sets flag whether onCommit should be fired if selection was changed */ + // FIXME: this should really be a separate signal, since "Commit" implies explicit user action, and selection changes can happen more indirectly. void setCommitOnSelectionChange(bool b) { mCommitOnSelectionChange = b; } /** Get number of selected items in the list */ @@ -349,7 +353,7 @@ protected: virtual bool isSelected(item_pair_t* item_pair) const; - virtual bool removeItemPair(item_pair_t* item_pair); + virtual bool removeItemPair(item_pair_t* item_pair, bool rearrange); /** * Notify parent about changed size of internal controls with "size_changes" action diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index ee70dadbd0..7fa3c2cf65 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -34,6 +34,7 @@ #include "llnotifications.h" +#include "llinstantmessage.h" #include "llxmlnode.h" #include "lluictrl.h" #include "lluictrlfactory.h" @@ -41,6 +42,7 @@ #include "llsdserialize.h" #include "lltrans.h" #include "llnotificationslistener.h" +#include "llstring.h" #include <algorithm> #include <boost/regex.hpp> @@ -1488,7 +1490,14 @@ std::ostream& operator<<(std::ostream& s, const LLNotification& notification) void LLPostponedNotification::onCachedNameReceived(const LLUUID& id, const std::string& first, const std::string& last, bool is_group) { - gCacheName->getFullName(id, mName); + mName = first + " " + last; + + LLStringUtil::trim(mName); + if (mName.empty()) + { + llwarns << "Empty name received for Id: " << id << llendl; + mName = SYSTEM_FROM; + } modifyNotificationParams(); LLNotifications::instance().add(mParams); cleanup(); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index e220013274..d3b2a368a5 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -66,7 +66,10 @@ bool LLTextBase::compare_segment_end::operator()(const LLTextSegmentPtr& a, cons { return a->getStart() < b->getStart(); } - return a->getEnd() < b->getEnd(); + else + { + return a->getEnd() < b->getEnd(); + } } @@ -174,7 +177,7 @@ LLTextBase::Params::Params() LLTextBase::LLTextBase(const LLTextBase::Params &p) : LLUICtrl(p, LLTextViewModelPtr(new LLTextViewModel)), - mURLClickSignal(), + mURLClickSignal(NULL), mMaxTextByteLength( p.max_text_length ), mDefaultFont(p.font), mFontShadow(p.font_shadow), @@ -209,7 +212,8 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p) mParseHTML(p.allow_html), mParseHighlights(p.parse_highlights), mBGVisible(p.bg_visible), - mScroller(NULL) + mScroller(NULL), + mStyleDirty(true) { if(p.allow_scroll) { @@ -248,9 +252,8 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p) LLTextBase::~LLTextBase() { - // Menu, like any other LLUICtrl, is deleted by its parent - gMenuHolder - mSegments.clear(); + delete mURLClickSignal; } void LLTextBase::initFromParams(const LLTextBase::Params& p) @@ -296,13 +299,18 @@ bool LLTextBase::truncate() return did_truncate; } -LLStyle::Params LLTextBase::getDefaultStyleParams() +const LLStyle::Params& LLTextBase::getDefaultStyleParams() { - return LLStyle::Params() - .color(LLUIColor(&mFgColor)) - .readonly_color(LLUIColor(&mReadOnlyFgColor)) - .font(mDefaultFont) - .drop_shadow(mFontShadow); + if (mStyleDirty) + { + mDefaultStyle + .color(LLUIColor(&mFgColor)) + .readonly_color(LLUIColor(&mReadOnlyFgColor)) + .font(mDefaultFont) + .drop_shadow(mFontShadow); + mStyleDirty = false; + } + return mDefaultStyle; } void LLTextBase::onValueChange(S32 start, S32 end) @@ -861,11 +869,12 @@ BOOL LLTextBase::handleMouseUp(S32 x, S32 y, MASK mask) if (cur_segment && cur_segment->handleMouseUp(x, y, mask)) { // Did we just click on a link? - if (cur_segment->getStyle() + if (mURLClickSignal + && cur_segment->getStyle() && cur_segment->getStyle()->isLink()) { // *TODO: send URL here? - mURLClickSignal(this, LLSD() ); + (*mURLClickSignal)(this, LLSD() ); } return TRUE; } @@ -1039,12 +1048,14 @@ void LLTextBase::draw() void LLTextBase::setColor( const LLColor4& c ) { mFgColor = c; + mStyleDirty = true; } //virtual void LLTextBase::setReadOnlyColor(const LLColor4 &c) { mReadOnlyFgColor = c; + mStyleDirty = true; } //virtual @@ -1488,12 +1499,22 @@ void LLTextBase::getSegmentAndOffset( S32 startpos, segment_set_t::iterator* seg LLTextBase::segment_set_t::iterator LLTextBase::getSegIterContaining(S32 index) { + if (index > getLength()) { return mSegments.end(); } + + // when there are no segments, we return the end iterator, which must be checked by caller + if (mSegments.size() <= 1) { return mSegments.begin(); } + segment_set_t::iterator it = mSegments.upper_bound(new LLIndexSegment(index)); return it; } LLTextBase::segment_set_t::const_iterator LLTextBase::getSegIterContaining(S32 index) const { + if (index > getLength()) { return mSegments.end(); } + + // when there are no segments, we return the end iterator, which must be checked by caller + if (mSegments.size() <= 1) { return mSegments.begin(); } + LLTextBase::segment_set_t::const_iterator it = mSegments.upper_bound(new LLIndexSegment(index)); return it; } @@ -2330,6 +2351,15 @@ LLRect LLTextBase::getVisibleDocumentRect() const } } +boost::signals2::connection LLTextBase::setURLClickedCallback(const commit_signal_t::slot_type& cb) +{ + if (!mURLClickSignal) + { + mURLClickSignal = new commit_signal_t(); + } + return mURLClickSignal->connect(cb); +} + // // LLTextSegment // diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 300ee0f05f..4b0eeeb7d6 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -361,10 +361,7 @@ public: virtual void appendLineBreakSegment(const LLStyle::Params& style_params); virtual void appendImageSegment(const LLStyle::Params& style_params); virtual void appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo); - -public: - // Fired when a URL link is clicked - commit_signal_t mURLClickSignal; + boost::signals2::connection setURLClickedCallback(const commit_signal_t::slot_type& cb); protected: // helper structs @@ -457,7 +454,7 @@ protected: void createDefaultSegment(); virtual void updateSegments(); void insertSegment(LLTextSegmentPtr segment_to_insert); - LLStyle::Params getDefaultStyleParams(); + const LLStyle::Params& getDefaultStyleParams(); // manage lines S32 getLineStart( S32 line ) const; @@ -497,6 +494,12 @@ protected: LLRect mVisibleTextRect; // The rect in which text is drawn. Excludes borders. LLRect mTextBoundingRect; + // default text style + LLStyle::Params mDefaultStyle; + bool mStyleDirty; + const LLFontGL* const mDefaultFont; // font that is used when none specified, can only be set by constructor + const LLFontGL::ShadowType mFontShadow; // shadow style, can only be set by constructor + // colors LLUIColor mCursorColor; LLUIColor mFgColor; @@ -523,8 +526,6 @@ protected: LLFontGL::VAlign mVAlign; F32 mLineSpacingMult; // multiple of line height used as space for a single line of text (e.g. 1.5 to get 50% padding) S32 mLineSpacingPixels; // padding between lines - const LLFontGL* mDefaultFont; // font that is used when none specified - LLFontGL::ShadowType mFontShadow; bool mBorderVisible; bool mParseHTML; // make URLs interactive bool mParseHighlights; // highlight user-defined keywords @@ -547,6 +548,9 @@ protected: bool mScrollNeeded; // need to change scroll region because of change to cursor position S32 mScrollIndex; // index of first character to keep visible in scroll region + // Fired when a URL link is clicked + commit_signal_t* mURLClickSignal; + }; #endif diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index c9474d66b7..130cda3784 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -264,8 +264,6 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) : mContextMenu(NULL), mShowContextMenu(p.show_context_menu) { - mDefaultFont = p.font; - mSourceID.generate(); //FIXME: use image? diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 3ade46d367..ff330f863a 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -675,7 +675,7 @@ BOOL LLUICtrl::getIsChrome() const class CompareByDefaultTabGroup: public LLCompareByTabOrder { public: - CompareByDefaultTabGroup(LLView::child_tab_order_t order, S32 default_tab_group): + CompareByDefaultTabGroup(const LLView::child_tab_order_t& order, S32 default_tab_group): LLCompareByTabOrder(order), mDefaultTabGroup(default_tab_group) {} private: @@ -699,13 +699,16 @@ class LLUICtrl::DefaultTabGroupFirstSorter : public LLQuerySorter, public LLSing { public: /*virtual*/ void operator() (LLView * parent, viewList_t &children) const - { + { children.sort(CompareByDefaultTabGroup(parent->getCtrlOrder(), parent->getDefaultTabGroup())); } }; +LLFastTimer::DeclareTimer FTM_FOCUS_FIRST_ITEM("Focus First Item"); + BOOL LLUICtrl::focusFirstItem(BOOL prefer_text_fields, BOOL focus_flash) { + LLFastTimer _(FTM_FOCUS_FIRST_ITEM); // try to select default tab group child LLCtrlQuery query = getTabOrderQuery(); // sort things such that the default tab group is at the front diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h index c99acee48e..dc43b311a7 100644 --- a/indra/llui/lluictrlfactory.h +++ b/indra/llui/lluictrlfactory.h @@ -182,7 +182,7 @@ public: void popFactoryFunctions(); template<typename T> - static T* createWidget(typename T::Params& params, LLView* parent = NULL) + static T* createWidget(const typename T::Params& params, LLView* parent = NULL) { T* widget = NULL; diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp index f7a53e87de..ac9e71665f 100644 --- a/indra/llui/lluistring.cpp +++ b/indra/llui/lluistring.cpp @@ -135,9 +135,16 @@ void LLUIString::updateResult() const mResult = mOrig; // get the defailt args + local args - LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs(); - combined_args.insert(mArgs.begin(), mArgs.end()); - LLStringUtil::format(mResult, combined_args); + if (mArgs.empty()) + { + LLStringUtil::format(mResult, LLTrans::getDefaultArgs()); + } + else + { + LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs(); + combined_args.insert(mArgs.begin(), mArgs.end()); + LLStringUtil::format(mResult, combined_args); + } } void LLUIString::updateWResult() const diff --git a/indra/llui/llview.h b/indra/llui/llview.h index aba6c310f1..8e705ed701 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -265,7 +265,7 @@ public: virtual BOOL postBuild() { return TRUE; } - child_tab_order_t getCtrlOrder() const { return mCtrlOrder; } + const child_tab_order_t& getCtrlOrder() const { return mCtrlOrder; } ctrl_list_t getCtrlList() const; ctrl_list_t getCtrlListSorted() const; @@ -620,12 +620,13 @@ public: class LLCompareByTabOrder { public: - LLCompareByTabOrder(LLView::child_tab_order_t order) : mTabOrder(order) {} + LLCompareByTabOrder(const LLView::child_tab_order_t& order) : mTabOrder(order) {} virtual ~LLCompareByTabOrder() {} bool operator() (const LLView* const a, const LLView* const b) const; private: virtual bool compareTabOrders(const LLView::tab_order_t & a, const LLView::tab_order_t & b) const { return a < b; } - LLView::child_tab_order_t mTabOrder; + // ok to store a reference, as this should only be allocated on stack during view query operations + const LLView::child_tab_order_t& mTabOrder; }; template <class T> T* LLView::getChild(const std::string& name, BOOL recurse) const diff --git a/indra/llui/llviewquery.cpp b/indra/llui/llviewquery.cpp index bdb3d223a6..1b44cc528e 100644 --- a/indra/llui/llviewquery.cpp +++ b/indra/llui/llviewquery.cpp @@ -95,8 +95,8 @@ viewList_t LLViewQuery::run(LLView* view) const if (pre.first) { post = runFilters(view, filtered_children, mPostFilters); + } } - } if(pre.first && post.first) { @@ -119,12 +119,12 @@ void LLViewQuery::filterChildren(LLView * view, viewList_t & filtered_children) (*mSorterp)(view, views); // sort the children per the sorter } for(LLView::child_list_iter_t iter = views.begin(); - iter != views.end(); - iter++) - { - viewList_t indiv_children = this->run(*iter); - filtered_children.insert(filtered_children.end(), indiv_children.begin(), indiv_children.end()); - } + iter != views.end(); + iter++) + { + viewList_t indiv_children = this->run(*iter); + filtered_children.splice(filtered_children.end(), indiv_children); + } } filterResult_t LLViewQuery::runFilters(LLView * view, const viewList_t children, const filterList_t filters) const diff --git a/indra/llui/llviewquery.h b/indra/llui/llviewquery.h index 98d9bf8796..68af31933d 100644 --- a/indra/llui/llviewquery.h +++ b/indra/llui/llviewquery.h @@ -122,7 +122,7 @@ public: viewList_t operator () (LLView * view) const { return run(view); } // override this method to provide iteration over other types of children - virtual void filterChildren(LLView * view, viewList_t & filtered_children) const; + virtual void filterChildren(LLView * view, viewList_t& filtered_children) const; private: diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c2236233dc..810b2d9a1d 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4678,7 +4678,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string> + <string>http://marketplace.secondlife.com/</string> </map> <key>MarketplaceURL_objectFemale</key> <map> @@ -4733,7 +4733,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string> + <string>http://marketplace.secondlife.com</string> </map> <key>MarketplaceURL_bodypartMale</key> <map> @@ -4744,7 +4744,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string> + <string>http://marketplace.secondlife.com/</string> </map> <key>MarketplaceURL_glovesMale</key> <map> @@ -11869,5 +11869,16 @@ <key>Value</key> <integer>1</integer> </map> + <key>TipToastMessageLineCount</key> + <map> + <key>Comment</key> + <string>Max line count of text message on tip toast.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>10</integer> + </map> </map> </llsd> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 7c92a5a756..a4bf56fc96 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3406,6 +3406,9 @@ void LLAgent::setTeleportState(ETeleportState state) } else if(mTeleportState == TELEPORT_ARRIVING) { + // First two position updates after a teleport tend to be weird + LLViewerStats::getInstance()->mAgentPositionSnaps.mCountOfNextUpdatesToIgnore = 2; + // Let the interested parties know we've teleported. LLViewerParcelMgr::getInstance()->onTeleportFinished(false, getPositionGlobal()); } diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp index 0a2f0e9399..d911d123f4 100644 --- a/indra/newview/llagentwearablesfetch.cpp +++ b/indra/newview/llagentwearablesfetch.cpp @@ -48,7 +48,7 @@ public: virtual ~LLOrderMyOutfitsOnDestroy() { - if (LLApp::isExiting()) + if (!LLApp::isRunning()) { llwarns << "called during shutdown, skipping" << llendl; return; diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index e1635461db..78edcb3e25 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -999,7 +999,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up { removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1), false); } - addCOFItemLink(item_to_wear, do_update); + addCOFItemLink(item_to_wear, do_update, cb); } break; case LLAssetType::AT_BODYPART: @@ -2183,17 +2183,19 @@ void LLAppearanceMgr::updateIsDirty() } else { + LLIsOfAssetType collector = LLIsOfAssetType(LLAssetType::AT_LINK); + LLInventoryModel::cat_array_t cof_cats; LLInventoryModel::item_array_t cof_items; - gInventory.collectDescendents(cof, cof_cats, cof_items, - LLInventoryModel::EXCLUDE_TRASH); + gInventory.collectDescendentsIf(cof, cof_cats, cof_items, + LLInventoryModel::EXCLUDE_TRASH, collector); LLInventoryModel::cat_array_t outfit_cats; LLInventoryModel::item_array_t outfit_items; - gInventory.collectDescendents(base_outfit, outfit_cats, outfit_items, - LLInventoryModel::EXCLUDE_TRASH); + gInventory.collectDescendentsIf(base_outfit, outfit_cats, outfit_items, + LLInventoryModel::EXCLUDE_TRASH, collector); - if(outfit_items.count() != cof_items.count() -1) + if(outfit_items.count() != cof_items.count()) { // Current outfit folder should have one more item than the outfit folder. // this one item is the link back to the outfit folder itself. @@ -2201,16 +2203,6 @@ void LLAppearanceMgr::updateIsDirty() return; } - //getting rid of base outfit folder link to simplify comparison - for (LLInventoryModel::item_array_t::iterator it = cof_items.begin(); it != cof_items.end(); ++it) - { - if (*it == base_outfit_item) - { - cof_items.erase(it); - break; - } - } - //"dirty" - also means a difference in linked UUIDs and/or a difference in wearables order (links' descriptions) std::sort(cof_items.begin(), cof_items.end(), sort_by_linked_uuid); std::sort(outfit_items.begin(), outfit_items.end(), sort_by_linked_uuid); diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 3275d784a3..99156b9d9d 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -211,7 +211,7 @@ void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/) void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name) { LL_DEBUGS("Avaline") << "Adding avaline item into the list: " << item_name << "|" << item_id << ", session: " << session_id << LL_ENDL; - LLAvalineListItem* item = new LLAvalineListItem; + LLAvalineListItem* item = new LLAvalineListItem(/*hide_number=*/false); item->setAvatarId(item_id, session_id, true, false); item->setName(item_name); diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 6897f4ee8e..2826899cb0 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -1886,7 +1886,7 @@ void LLScriptChiclet::onMenuItemClicked(const LLSD& user_data) if("end" == action) { - LLScriptFloaterManager::instance().onRemoveNotification(getSessionId()); + LLScriptFloaterManager::instance().removeNotification(getSessionId()); } } @@ -1969,7 +1969,7 @@ void LLInvOfferChiclet::onMenuItemClicked(const LLSD& user_data) if("end" == action) { - LLScriptFloaterManager::instance().onRemoveNotification(getSessionId()); + LLScriptFloaterManager::instance().removeNotification(getSessionId()); } } diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index 629a92db11..893400185c 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -284,7 +284,8 @@ LLCOFWearables::LLCOFWearables() : LLPanel(), mAttachmentsTab(NULL), mBodyPartsTab(NULL), mLastSelectedTab(NULL), - mAccordionCtrl(NULL) + mAccordionCtrl(NULL), + mCOFVersion(-1) { mClothingMenu = new CofClothingContextMenu(this); mAttachmentMenu = new CofAttachmentContextMenu(this); @@ -381,6 +382,23 @@ void LLCOFWearables::onAccordionTabStateChanged(LLUICtrl* ctrl, const LLSD& expa void LLCOFWearables::refresh() { + const LLUUID cof_id = LLAppearanceMgr::instance().getCOF(); + if (cof_id.isNull()) + { + llwarns << "COF ID cannot be NULL" << llendl; + return; + } + + LLViewerInventoryCategory* catp = gInventory.getCategory(cof_id); + if (!catp) + { + llwarns << "COF category cannot be NULL" << llendl; + return; + } + + if (mCOFVersion == catp->getVersion()) return; + mCOFVersion = catp->getVersion(); + typedef std::vector<LLSD> values_vector_t; typedef std::map<LLFlatListView*, values_vector_t> selection_map_t; @@ -396,7 +414,7 @@ void LLCOFWearables::refresh() LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t cof_items; - gInventory.collectDescendents(LLAppearanceMgr::getInstance()->getCOF(), cats, cof_items, LLInventoryModel::EXCLUDE_TRASH); + gInventory.collectDescendents(cof_id, cats, cof_items, LLInventoryModel::EXCLUDE_TRASH); populateAttachmentsAndBodypartsLists(cof_items); @@ -504,7 +522,7 @@ LLPanelClothingListItem* LLCOFWearables::buildClothingListItem(LLViewerInventory item_panel->childSetAction("btn_edit", mCOFCallbacks.mEditWearable); //turning on gray separator line for the last item in the items group of the same wearable type - item_panel->childSetVisible("wearable_type_separator_icon", last); + item_panel->setSeparatorVisible(last); return item_panel; } diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h index 9a259600a9..cd7cc060e5 100644 --- a/indra/newview/llcofwearables.h +++ b/indra/newview/llcofwearables.h @@ -82,6 +82,7 @@ public: LLPanel* getSelectedItem(); void getSelectedItems(std::vector<LLPanel*>& selected_items) const; + /* Repopulate the COF wearables list if the COF category has been changed since the last refresh */ void refresh(); void clear(); @@ -127,6 +128,9 @@ protected: LLListContextMenu* mBodyPartMenu; LLAccordionCtrl* mAccordionCtrl; + + /* COF category version since last refresh */ + S32 mCOFVersion; }; diff --git a/indra/newview/lldndbutton.cpp b/indra/newview/lldndbutton.cpp index 22f2bb1d16..4f4c7dead7 100644 --- a/indra/newview/lldndbutton.cpp +++ b/indra/newview/lldndbutton.cpp @@ -42,7 +42,7 @@ LLDragAndDropButton::Params::Params() } -LLDragAndDropButton::LLDragAndDropButton(Params& params) +LLDragAndDropButton::LLDragAndDropButton(const Params& params) : LLButton(params) { diff --git a/indra/newview/lldndbutton.h b/indra/newview/lldndbutton.h index c888268187..433b3f7ff5 100644 --- a/indra/newview/lldndbutton.h +++ b/indra/newview/lldndbutton.h @@ -54,7 +54,7 @@ public: Params(); }; - LLDragAndDropButton(Params& params); + LLDragAndDropButton(const Params& params); typedef boost::function<bool ( S32 /*x*/, S32 /*y*/, MASK /*mask*/, BOOL /*drop*/, diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 149ba2478d..92fda31cc2 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -140,7 +140,13 @@ void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,cons // LLTextBox::setText will obliterate the expander segment, so make sure // we generate it again by clearing mExpanderVisible mExpanderVisible = false; - LLTextEditor::setText(text, input_params); + + // Workaround for EXT-8259: trim text before rendering it. + { + std::string trimmed_text(text); + LLStringUtil::trim(trimmed_text); + LLTextEditor::setText(trimmed_text, input_params); + } // text contents have changed, segments are cleared out // so hide the expander and determine if we need it diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 24cd7b8018..f1d39a41ae 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -263,6 +263,7 @@ public: BOOL needsAutoRename() { return mNeedsAutoRename; } void setNeedsAutoRename(BOOL val) { mNeedsAutoRename = val; } void setPinningSelectedItem(BOOL val) { mPinningSelectedItem = val; } + void setAutoSelectOverride(BOOL val) { mAutoSelectOverride = val; } void setCallbackRegistrar(LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* registrar) { mCallbackRegistrar = registrar; } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index a2b72e7d74..21313f9df7 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1022,6 +1022,14 @@ void LLIMModel::sendMessage(const std::string& utf8_text, } else { + // IM_SESSION_INVITE means that this is an Ad-hoc incoming chat + // (it can be also Group chat but it is checked above) + // In this case mInitialTargetIDs contains Ad-hoc session ID and it should not be added + // to Recent People to prevent showing of an item with (???)(???). See EXT-8246. + // Concrete participants will be added into this list once they sent message in chat. + if (IM_SESSION_INVITE == dialog) return; + + // implemented adding of all participants of an outgoing to Recent People List. See EXT-5694. for(uuid_vec_t::iterator it = session->mInitialTargetIDs.begin(); it!=session->mInitialTargetIDs.end();++it) { diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp index a2b5ffbac4..cb7b338e95 100644 --- a/indra/newview/llinspectobject.cpp +++ b/indra/newview/llinspectobject.cpp @@ -161,8 +161,7 @@ BOOL LLInspectObject::postBuild(void) // Hide floater when name links clicked LLTextBox* textbox = getChild<LLTextBox>("object_creator"); - textbox->mURLClickSignal.connect( - boost::bind(&LLInspectObject::closeFloater, this, false) ); + textbox->setURLClickedCallback(boost::bind(&LLInspectObject::closeFloater, this, false) ); // Hook up functionality getChild<LLUICtrl>("buy_btn")->setCommitCallback( diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index ba357b2361..3d350606c6 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -519,6 +519,19 @@ bool LLIsNotType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) return TRUE; } +bool LLIsOfAssetType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + if(mType == LLAssetType::AT_CATEGORY) + { + if(cat) return TRUE; + } + if(item) + { + if(item->getActualType() == mType) return TRUE; + } + return FALSE; +} + bool LLIsTypeWithPermissions::operator()(LLInventoryCategory* cat, LLInventoryItem* item) { if(mType == LLAssetType::AT_CATEGORY) diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 1c3f82c531..4a7721098d 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -174,6 +174,25 @@ protected: LLAssetType::EType mType; }; +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLIsOfAssetType +// +// Implementation of a LLInventoryCollectFunctor which returns TRUE if +// the item or category is of asset type passed in during construction. +// Link types are treated as links, not as the types they point to. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLIsOfAssetType : public LLInventoryCollectFunctor +{ +public: + LLIsOfAssetType(LLAssetType::EType type) : mType(type) {} + virtual ~LLIsOfAssetType() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +protected: + LLAssetType::EType mType; +}; + class LLIsTypeWithPermissions : public LLInventoryCollectFunctor { public: @@ -271,9 +290,7 @@ public: }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLFindNonLinksByMask -// -// +// Class LLFindByMask //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLFindByMask : public LLInventoryCollectFunctor { @@ -382,6 +399,19 @@ public: } }; +/* Filters out items of a particular asset type */ +class LLIsTypeActual : public LLIsType +{ +public: + LLIsTypeActual(LLAssetType::EType type) : LLIsType(type) {} + virtual ~LLIsTypeActual() {} + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) + { + if (item && item->getIsLinkType()) return false; + return LLIsType::operator()(cat, item); + } +}; + // Collect non-removable folders and items. class LLFindNonRemovableObjects : public LLInventoryCollectFunctor { diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp index fbb3774917..e01f05c0f2 100644 --- a/indra/newview/llinventoryitemslist.cpp +++ b/indra/newview/llinventoryitemslist.cpp @@ -107,9 +107,12 @@ void LLInventoryItemsList::idle(void* user_data) } } +LLFastTimer::DeclareTimer FTM_INVENTORY_ITEMS_REFRESH("Inventory List Refresh"); + void LLInventoryItemsList::refresh() { - static const unsigned ADD_LIMIT = 50; + LLFastTimer _(FTM_INVENTORY_ITEMS_REFRESH); + static const unsigned ADD_LIMIT = 20; uuid_vec_t added_items; uuid_vec_t removed_items; @@ -140,7 +143,8 @@ void LLInventoryItemsList::refresh() it = removed_items.begin(); for( ; removed_items.end() != it; ++it) { - removeItemByUUID(*it); + // don't filter items right away + removeItemByUUID(*it, false); } // Filter, rearrange and notify parent about shape changes diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp index c487aa10a7..e4a7a158a3 100644 --- a/indra/newview/llinventorylistitem.cpp +++ b/indra/newview/llinventorylistitem.cpp @@ -51,7 +51,12 @@ static const S32 WIDGET_SPACING = 3; LLPanelInventoryListItemBase::Params::Params() : default_style("default_style"), - worn_style("worn_style") + worn_style("worn_style"), + hover_image("hover_image"), + selected_image("selected_image"), + separator_image("separator_image"), + item_icon("item_icon"), + item_name("item_name") {}; LLPanelInventoryListItemBase* LLPanelInventoryListItemBase::create(LLViewerInventoryItem* item) @@ -59,8 +64,10 @@ LLPanelInventoryListItemBase* LLPanelInventoryListItemBase::create(LLViewerInven LLPanelInventoryListItemBase* list_item = NULL; if (item) { - list_item = new LLPanelInventoryListItemBase(item); - list_item->init(); + const LLPanelInventoryListItemBase::Params& params = LLUICtrlFactory::getDefaultParams<LLPanelInventoryListItemBase>(); + list_item = new LLPanelInventoryListItemBase(item, params); + list_item->initFromParams(params); + list_item->postBuild(); } return list_item; } @@ -76,6 +83,25 @@ void LLPanelInventoryListItemBase::draw() } setNeedsRefresh(false); } + + if (mHovered && mHoverImage) + { + mHoverImage->draw(getLocalRect()); + } + + if (mSelected && mSelectedImage) + { + mSelectedImage->draw(getLocalRect()); + } + + if (mSeparatorVisible && mSeparatorImage) + { + // stretch along bottom of listitem, using image height + LLRect separator_rect = getLocalRect(); + separator_rect.mTop = mSeparatorImage->getHeight(); + mSeparatorImage->draw(separator_rect); + } + LLPanel::draw(); } @@ -134,9 +160,6 @@ void LLPanelInventoryListItemBase::setShowWidget(LLUICtrl* ctrl, bool show) BOOL LLPanelInventoryListItemBase::postBuild() { - setIconCtrl(getChild<LLIconCtrl>("item_icon")); - setTitleCtrl(getChild<LLTextBox>("item_name")); - LLViewerInventoryItem* inv_item = getItem(); if (inv_item) { @@ -156,18 +179,18 @@ void LLPanelInventoryListItemBase::setValue(const LLSD& value) { if (!value.isMap()) return; if (!value.has("selected")) return; - childSetVisible("selected_icon", value["selected"]); + mSelected = value["selected"]; } void LLPanelInventoryListItemBase::onMouseEnter(S32 x, S32 y, MASK mask) { - childSetVisible("hovered_icon", true); + mHovered = true; LLPanel::onMouseEnter(x, y, mask); } void LLPanelInventoryListItemBase::onMouseLeave(S32 x, S32 y, MASK mask) { - childSetVisible("hovered_icon", false); + mHovered = false; LLPanel::onMouseLeave(x, y, mask); } @@ -244,21 +267,47 @@ S32 LLPanelInventoryListItemBase::notify(const LLSD& info) return rv; } -LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem* item) -: LLPanel() -, mInventoryItemUUID(item ? item->getUUID() : LLUUID::null) -, mIconCtrl(NULL) -, mTitleCtrl(NULL) -, mWidgetSpacing(WIDGET_SPACING) -, mLeftWidgetsWidth(0) -, mRightWidgetsWidth(0) -, mNeedsRefresh(false) +LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem* item, const LLPanelInventoryListItemBase::Params& params) +: LLPanel(params), + mInventoryItemUUID(item ? item->getUUID() : LLUUID::null), + mIconCtrl(NULL), + mTitleCtrl(NULL), + mWidgetSpacing(WIDGET_SPACING), + mLeftWidgetsWidth(0), + mRightWidgetsWidth(0), + mNeedsRefresh(false), + mHovered(false), + mSelected(false), + mSeparatorVisible(false), + mHoverImage(params.hover_image), + mSelectedImage(params.selected_image), + mSeparatorImage(params.separator_image) { -} + LLIconCtrl::Params icon_params(params.item_icon); + applyXUILayout(icon_params, this); -void LLPanelInventoryListItemBase::init() -{ - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory_item.xml"); + mIconCtrl = LLUICtrlFactory::create<LLIconCtrl>(icon_params); + if (mIconCtrl) + { + addChild(mIconCtrl); + } + else + { + mIconCtrl = dynamic_cast<LLIconCtrl*>(LLUICtrlFactory::createDefaultWidget<LLIconCtrl>("item_icon")); + } + + LLTextBox::Params text_params(params.item_name); + applyXUILayout(text_params, this); + + mTitleCtrl = LLUICtrlFactory::create<LLTextBox>(text_params); + if (mTitleCtrl) + { + addChild(mTitleCtrl); + } + else + { + mTitleCtrl = dynamic_cast<LLTextBox*>(LLUICtrlFactory::createDefaultWidget<LLTextBox>("item_title")); + } } class WidgetVisibilityChanger diff --git a/indra/newview/llinventorylistitem.h b/indra/newview/llinventorylistitem.h index f29d92d51c..575f6aec19 100644 --- a/indra/newview/llinventorylistitem.h +++ b/indra/newview/llinventorylistitem.h @@ -41,12 +41,12 @@ // llui #include "llpanel.h" #include "llstyle.h" +#include "lliconctrl.h" +#include "lltextbox.h" // newview #include "llwearabletype.h" -class LLIconCtrl; -class LLTextBox; class LLViewerInventoryItem; /** @@ -70,6 +70,11 @@ public: { Optional<LLStyle::Params> default_style, worn_style; + Optional<LLUIImage*> hover_image, + selected_image, + separator_image; + Optional<LLIconCtrl::Params> item_icon; + Optional<LLTextBox::Params> item_name; Params(); }; @@ -149,30 +154,22 @@ public: /** Get the associated inventory item */ LLViewerInventoryItem* getItem() const; + void setSeparatorVisible(bool visible) { mSeparatorVisible = visible; } + virtual ~LLPanelInventoryListItemBase(){} protected: - LLPanelInventoryListItemBase(LLViewerInventoryItem* item); + LLPanelInventoryListItemBase(LLViewerInventoryItem* item, const Params& params); typedef std::vector<LLUICtrl*> widget_array_t; /** - * Use it from a factory function to build panel, do not build panel in constructor - */ - virtual void init(); - - /** * Called after inventory item was updated, update panel widgets to reflect inventory changes. */ virtual void updateItem(const std::string& name, EItemState item_state = IS_DEFAULT); - /** setter for mIconCtrl */ - void setIconCtrl(LLIconCtrl* icon) { mIconCtrl = icon; } - /** setter for MTitleCtrl */ - void setTitleCtrl(LLTextBox* tb) { mTitleCtrl = tb; } - void setLeftWidgetsWidth(S32 width) { mLeftWidgetsWidth = width; } void setRightWidgetsWidth(S32 width) { mRightWidgetsWidth = width; } @@ -221,6 +218,14 @@ private: LLTextBox* mTitleCtrl; LLUIImagePtr mIconImage; + LLUIImagePtr mHoverImage; + LLUIImagePtr mSelectedImage; + LLUIImagePtr mSeparatorImage; + + bool mHovered; + bool mSelected; + bool mSeparatorVisible; + std::string mHighlightedText; widget_array_t mLeftSideWidgets; diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index b8590d838e..46ebb54786 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -1052,7 +1052,7 @@ void LLLocationInputCtrl::changeLocationPresentation() //needs unescaped one LLSLURL slurl; LLAgentUI::buildSLURL(slurl, false); - mTextEntry->setText(slurl.getSLURLString()); + mTextEntry->setText(LLURI::unescape(slurl.getSLURLString())); mTextEntry->selectAll(); mMaturityButton->setVisible(FALSE); diff --git a/indra/newview/llpanelgenerictip.cpp b/indra/newview/llpanelgenerictip.cpp index e0658554a4..8ba2e6d01c 100644 --- a/indra/newview/llpanelgenerictip.cpp +++ b/indra/newview/llpanelgenerictip.cpp @@ -35,6 +35,7 @@ #include "llpanelgenerictip.h" #include "llnotifications.h" +#include "llviewercontrol.h" // for gSavedSettings LLPanelGenericTip::LLPanelGenericTip( @@ -45,7 +46,8 @@ LLPanelGenericTip::LLPanelGenericTip( childSetValue("message", notification->getMessage()); - // set line max count to 3 in case of a very long name - snapToMessageHeight(getChild<LLTextBox> ("message"), 3); + + S32 max_line_count = gSavedSettings.getS32("TipToastMessageLineCount"); + snapToMessageHeight(getChild<LLTextBox> ("message"), max_line_count); } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 17ec0d3a56..56b73fe55b 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -197,14 +197,15 @@ BOOL LLPanelMainInventory::postBuild() mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2)); } + initListCommandsHandlers(); + // *TODO:Get the cost info from the server const std::string upload_cost("10"); - childSetLabelArg("Upload Image", "[COST]", upload_cost); - childSetLabelArg("Upload Sound", "[COST]", upload_cost); - childSetLabelArg("Upload Animation", "[COST]", upload_cost); - childSetLabelArg("Bulk Upload", "[COST]", upload_cost); + mMenuAdd->getChild<LLMenuItemGL>("Upload Image")->setLabelArg("[COST]", upload_cost); + mMenuAdd->getChild<LLMenuItemGL>("Upload Sound")->setLabelArg("[COST]", upload_cost); + mMenuAdd->getChild<LLMenuItemGL>("Upload Animation")->setLabelArg("[COST]", upload_cost); + mMenuAdd->getChild<LLMenuItemGL>("Bulk Upload")->setLabelArg("[COST]", upload_cost); - initListCommandsHandlers(); return TRUE; } diff --git a/indra/newview/llpanelonlinestatus.cpp b/indra/newview/llpanelonlinestatus.cpp index 6ba015b11c..b21fd7d385 100644 --- a/indra/newview/llpanelonlinestatus.cpp +++ b/indra/newview/llpanelonlinestatus.cpp @@ -34,6 +34,7 @@ #include "llnotifications.h" #include "llpanelonlinestatus.h" +#include "llviewercontrol.h" // for gSavedSettings LLPanelOnlineStatus::LLPanelOnlineStatus( const LLNotificationPtr& notification) : @@ -54,7 +55,7 @@ LLPanelOnlineStatus::LLPanelOnlineStatus( notification, notification->getResponseTemplate())); } - // set line max count to 3 in case of a very long name - snapToMessageHeight(getChild<LLTextBox> ("message"), 3); + S32 max_line_count = gSavedSettings.getS32("TipToastMessageLineCount"); + snapToMessageHeight(getChild<LLTextBox> ("message"), max_line_count); } diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 5195b719d4..8b9baef54a 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -71,6 +71,7 @@ #include "llsdutil.h" #include "llsidepanelappearance.h" #include "lltoggleablemenu.h" +#include "llvoavatarself.h" #include "llwearablelist.h" #include "llwearableitemslist.h" #include "llwearabletype.h" @@ -263,7 +264,7 @@ LLPanelOutfitEdit::LLPanelOutfitEdit() observer.addBOFReplacedCallback(boost::bind(&LLPanelOutfitEdit::updateCurrentOutfitName, this)); observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this)); observer.addOutfitLockChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this)); - observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitEdit::update, this)); + observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitEdit::onCOFChanged, this)); gAgentWearables.addLoadingStartedCallback(boost::bind(&LLPanelOutfitEdit::onOutfitChanging, this, true)); gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitEdit::onOutfitChanging, this, false)); @@ -297,9 +298,9 @@ BOOL LLPanelOutfitEdit::postBuild() mFolderViewItemTypes[FVIT_ATTACHMENT] = LLLookItemType(getString("Filter.Objects"), ATTACHMENT_MASK); //order is important, see EListViewItemType for order information - mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.All"), new LLFindByMask(ALL_ITEMS_MASK))); - mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Clothing"), new LLIsType(LLAssetType::AT_CLOTHING))); - mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Bodyparts"), new LLIsType(LLAssetType::AT_BODYPART))); + mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.All"), new LLFindNonLinksByMask(ALL_ITEMS_MASK))); + mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Clothing"), new LLIsTypeActual(LLAssetType::AT_CLOTHING))); + mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Bodyparts"), new LLIsTypeActual(LLAssetType::AT_BODYPART))); mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Objects"), new LLFindByMask(ATTACHMENT_MASK)));; mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shape"), new LLFindActualWearablesOfType(LLWearableType::WT_SHAPE))); mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skin"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIN))); @@ -331,7 +332,7 @@ BOOL LLPanelOutfitEdit::postBuild() childSetCommitCallback("shop_btn_1", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL); childSetCommitCallback("shop_btn_2", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL); - setVisibleCallback(boost::bind(&LLPanelOutfitEdit::onVisibilityChange, this)); + setVisibleCallback(boost::bind(&LLPanelOutfitEdit::onVisibilityChange, this, _2)); mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list"); mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::filterWearablesBySelectedItem, this)); @@ -347,8 +348,8 @@ BOOL LLPanelOutfitEdit::postBuild() mInventoryItemsPanel = getChild<LLInventoryPanel>("folder_view"); mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK); mInventoryItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this)); - mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this)); + mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::updatePlusButton, this)); + mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::updatePlusButton, this)); mCOFDragAndDropObserver = new LLCOFDragAndDropObserver(mInventoryItemsPanel->getModel()); @@ -388,7 +389,7 @@ BOOL LLPanelOutfitEdit::postBuild() mWearablesListViewPanel = getChild<LLPanel>("filtered_wearables_panel"); mWearableItemsList = getChild<LLInventoryItemsList>("list_view"); mWearableItemsList->setCommitOnSelectionChange(true); - mWearableItemsList->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this)); + mWearableItemsList->setCommitCallback(boost::bind(&LLPanelOutfitEdit::updatePlusButton, this)); mWearableItemsList->setDoubleClickCallback(boost::bind(&LLPanelOutfitEdit::onPlusBtnClicked, this)); mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this)); @@ -442,6 +443,9 @@ void LLPanelOutfitEdit::showAddWearablesPanel(bool show_add_wearables) mListViewFilterCmbBox->setVisible(false); showWearablesFilter(); + + // Reset mWearableItemsList position to top. See EXT-8180. + mWearableItemsList->goToTop(); } //switching button bars @@ -583,11 +587,16 @@ void LLPanelOutfitEdit::onPlusBtnClicked(void) } } -void LLPanelOutfitEdit::onVisibilityChange() +void LLPanelOutfitEdit::onVisibilityChange(const LLSD &in_visible_chain) { showAddWearablesPanel(false); mWearableItemsList->resetSelection(); mInventoryItemsPanel->clearSelection(); + + if (in_visible_chain.asBoolean()) + { + update(); + } } void LLPanelOutfitEdit::onAddWearableClicked(void) @@ -614,15 +623,52 @@ void LLPanelOutfitEdit::onShopButtonClicked() { static LLShopURLDispatcher url_resolver; + // will contain the resultant URL std::string url; + + if (isAgentAvatarValid()) + { + // try to get wearable type from 'Add More' panel first (EXT-7639) + LLWearableType::EType type = getAddMorePanelSelectionType(); + + if (type == LLWearableType::WT_NONE) + { + type = getCOFWearablesSelectionType(); + } + + ESex sex = gAgentAvatarp->getSex(); + + // WT_INVALID comes for attachments + if (type != LLWearableType::WT_INVALID && type != LLWearableType::WT_NONE) + { + url = url_resolver.resolveURL(type, sex); + } + + if (url.empty()) + { + url = url_resolver.resolveURL(mCOFWearables->getExpandedAccordionAssetType(), sex); + } + } + else + { + llwarns << "Agent avatar is invalid" << llendl; + + // the second argument is not important in this case: generic market place will be opened + url = url_resolver.resolveURL(LLWearableType::WT_NONE, SEX_FEMALE); + } + + LLWeb::loadURLExternal(url); +} + +LLWearableType::EType LLPanelOutfitEdit::getCOFWearablesSelectionType() const +{ std::vector<LLPanel*> selected_items; - mCOFWearables->getSelectedItems(selected_items); + LLWearableType::EType type = LLWearableType::WT_NONE; - ESex sex = gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE; + mCOFWearables->getSelectedItems(selected_items); if (selected_items.size() == 1) { - LLWearableType::EType type = LLWearableType::WT_NONE; LLPanel* item = selected_items.front(); // LLPanelDummyClothingListItem is lower then LLPanelInventoryListItemBase in hierarchy tree @@ -634,20 +680,45 @@ void LLPanelOutfitEdit::onShopButtonClicked() { type = real_item->getWearableType(); } + } - // WT_INVALID comes for attachments - if (type != LLWearableType::WT_INVALID) + return type; +} + +LLWearableType::EType LLPanelOutfitEdit::getAddMorePanelSelectionType() const +{ + LLWearableType::EType type = LLWearableType::WT_NONE; + + if (mAddWearablesPanel != NULL && mAddWearablesPanel->getVisible()) + { + if (mInventoryItemsPanel != NULL && mInventoryItemsPanel->getVisible()) { - url = url_resolver.resolveURL(type, sex); + std::set<LLUUID> selected_uuids = mInventoryItemsPanel->getRootFolder()->getSelectionList(); + + if (selected_uuids.size() == 1) + { + type = getWearableTypeByItemUUID(*(selected_uuids.begin())); + } } - } + else if (mWearableItemsList != NULL && mWearableItemsList->getVisible()) + { + std::vector<LLUUID> selected_uuids; + mWearableItemsList->getSelectedUUIDs(selected_uuids); - if (url.empty()) - { - url = url_resolver.resolveURL(mCOFWearables->getExpandedAccordionAssetType(), sex); + if (selected_uuids.size() == 1) + { + type = getWearableTypeByItemUUID(selected_uuids.front()); + } + } } - LLWeb::loadURLExternal(url); + return type; +} + +LLWearableType::EType LLPanelOutfitEdit::getWearableTypeByItemUUID(const LLUUID& item_uuid) const +{ + LLViewerInventoryItem* item = gInventory.getLinkedItem(item_uuid); + return (item != NULL) ? item->getWearableType() : LLWearableType::WT_NONE; } void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void) @@ -667,7 +738,7 @@ void LLPanelOutfitEdit::onEditWearableClicked(void) } } -void LLPanelOutfitEdit::onInventorySelectionChange() +void LLPanelOutfitEdit::updatePlusButton() { uuid_vec_t selected_items; getSelectedItemsUUID(selected_items); @@ -910,6 +981,9 @@ void LLPanelOutfitEdit::updateVerbs() mStatus->setText(outfit_is_dirty ? getString("unsaved_changes") : getString("now_editing")); updateCurrentOutfitName(); + + //updating state of "Wear Item" button previously known as "Plus" button + updatePlusButton(); } bool LLPanelOutfitEdit::switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel) @@ -957,9 +1031,6 @@ void LLPanelOutfitEdit::showFilteredWearablesListView(LLWearableType::EType type showAddWearablesPanel(true); showWearablesListView(); - // Reset mWearableItemsList position to top. See EXT-8180. - mWearableItemsList->goToTop(); - //e_list_view_item_type implicitly contains LLWearableType::EType starting from LVIT_SHAPE applyListViewFilter((EListViewItemType) (LVIT_SHAPE + type)); } @@ -1026,5 +1097,13 @@ void LLPanelOutfitEdit::getSelectedItemsUUID(uuid_vec_t& uuid_list) // return selected_id; } +void LLPanelOutfitEdit::onCOFChanged() +{ + //the panel is only updated when is visible to a user + if (!isInVisibleChain()) return; + + update(); +} + // EOF diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 5009de0fef..0efc6dc189 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -145,10 +145,10 @@ public: void onFolderViewFilterCommitted(LLUICtrl* ctrl); void onListViewFilterCommitted(LLUICtrl* ctrl); void onSearchEdit(const std::string& string); - void onInventorySelectionChange(); + void updatePlusButton(); void onPlusBtnClicked(void); - void onVisibilityChange(); + void onVisibilityChange(const LLSD &in_visible_chain); void applyFolderViewFilter(EFolderViewItemType type); void applyListViewFilter(EListViewItemType type); @@ -198,6 +198,11 @@ private: void onOutfitChanging(bool started); void getSelectedItemsUUID(uuid_vec_t& uuid_list); void getCurrentItemUUID(LLUUID& selected_id); + void onCOFChanged(); + + LLWearableType::EType getCOFWearablesSelectionType() const; + LLWearableType::EType getAddMorePanelSelectionType() const; + LLWearableType::EType getWearableTypeByItemUUID(const LLUUID& item_uuid) const; LLTextBox* mCurrentOutfitName; LLTextBox* mStatus; diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 8fe78a0f81..f2e6969998 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -582,7 +582,7 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id) else { std::string display_name = LLVoiceClient::getInstance()->getDisplayName(avatar_id); - mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? display_name : LLTrans::getString("AvatarNameWaiting")); + mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? LLTrans::getString("AvatarNameWaiting") : display_name); mAvalineUpdater->watchAvalineCaller(avatar_id); } adjustParticipant(avatar_id); diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index ef6ceb5f2e..7fdc5c8b5f 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -75,7 +75,8 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key) mLastWidth(0), mAspectRatio(0.f), mPreviewToSave(FALSE), - mImage(NULL) + mImage(NULL), + mImageOldBoostLevel(LLViewerTexture::BOOST_NONE) { updateImageID(); if (key.has("save_as")) @@ -93,7 +94,7 @@ LLPreviewTexture::~LLPreviewTexture() { getWindow()->decBusyCount(); } - + mImage->setBoostLevel(mImageOldBoostLevel); mImage = NULL; } @@ -543,6 +544,7 @@ void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata) void LLPreviewTexture::loadAsset() { mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + mImageOldBoostLevel = mImage->getBoostLevel(); mImage->setBoostLevel(LLViewerTexture::BOOST_PREVIEW); mImage->forceToSaveRawImage(0) ; mAssetStatus = PREVIEW_ASSET_LOADING; diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index 0f29a741c1..cbdb057781 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -82,9 +82,10 @@ private: void updateDimensions(); LLUUID mImageID; LLPointer<LLViewerFetchedTexture> mImage; - BOOL mLoadingFullImage; + S32 mImageOldBoostLevel; std::string mSaveFileName; LLFrameTimer mSavedFileTimer; + BOOL mLoadingFullImage; BOOL mShowKeepDiscard; BOOL mCopyToInv; @@ -94,11 +95,10 @@ private: // This is stored off in a member variable, because the save-as // button and drag and drop functionality need to know. BOOL mIsCopyable; - + BOOL mUpdateDimensions; S32 mLastHeight; S32 mLastWidth; - F32 mAspectRatio; - BOOL mUpdateDimensions; + F32 mAspectRatio; LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ; }; diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index b68fc3b002..75797dae81 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -176,7 +176,15 @@ void LLScriptFloater::onClose(bool app_quitting) if(getNotificationId().notNull()) { - LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId()); + // we shouldn't kill notification on exit since it may be used as persistent. + if (app_quitting) + { + LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId()); + } + else + { + LLScriptFloaterManager::getInstance()->removeNotification(getNotificationId()); + } } } @@ -352,7 +360,7 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id) set_new_message |= !floater->hasFocus(); } - onRemoveNotification(it->first); + removeNotification(it->first); } } @@ -379,6 +387,17 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id) toggleScriptFloater(notification_id, set_new_message); } +void LLScriptFloaterManager::removeNotification(const LLUUID& notification_id) +{ + LLNotificationPtr notification = LLNotifications::instance().find(notification_id); + if (notification != NULL && !notification->isCancelled()) + { + LLNotificationsUtil::cancel(notification); + } + + onRemoveNotification(notification_id); +} + void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id) { if(notification_id.isNull()) @@ -392,6 +411,8 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id) LLIMWellWindow::getInstance()->removeObjectRow(notification_id); + mNotifications.erase(notification_id); + // close floater LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id); if(floater) @@ -400,8 +421,6 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id) floater->setNotificationId(LLUUID::null); floater->closeFloater(); } - - mNotifications.erase(notification_id); } void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& notification_id, bool set_new_message) diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h index dc0cfc2400..6990234fd7 100644 --- a/indra/newview/llscriptfloater.h +++ b/indra/newview/llscriptfloater.h @@ -65,6 +65,11 @@ public: void onAddNotification(const LLUUID& notification_id); /** + * Removes notification. + */ + void removeNotification(const LLUUID& notification_id); + + /** * Handles notification removal. * Removes script notification toast, removes script chiclet, closes script floater */ diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 98282c1673..7104f3934d 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -230,15 +230,15 @@ LLSideTrayTab* LLSideTrayTab::createInstance () LLSideTray::Params::Params() : collapsed("collapsed",false), - tab_btn_image_normal("tab_btn_image","sidebar_tab_left.tga"), - tab_btn_image_selected("tab_btn_image_selected","button_enabled_selected_32x128.tga"), + tab_btn_image_normal("tab_btn_image",LLUI::getUIImage("sidebar_tab_left.tga")), + tab_btn_image_selected("tab_btn_image_selected",LLUI::getUIImage("button_enabled_selected_32x128.tga")), default_button_width("tab_btn_width",32), default_button_height("tab_btn_height",32), default_button_margin("tab_btn_margin",0) {} //virtual -LLSideTray::LLSideTray(Params& params) +LLSideTray::LLSideTray(const Params& params) : LLPanel(params) ,mActiveTab(0) ,mCollapsed(false) @@ -373,10 +373,10 @@ LLButton* LLSideTray::createButton (const std::string& name,const std::string& i bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_TOP); bparams.rect (rect); bparams.tab_stop(false); - bparams.image_unselected.name(sidetray_params.tab_btn_image_normal); - bparams.image_selected.name(sidetray_params.tab_btn_image_selected); - bparams.image_disabled.name(sidetray_params.tab_btn_image_normal); - bparams.image_disabled_selected.name(sidetray_params.tab_btn_image_selected); + bparams.image_unselected(sidetray_params.tab_btn_image_normal); + bparams.image_selected(sidetray_params.tab_btn_image_selected); + bparams.image_disabled(sidetray_params.tab_btn_image_normal); + bparams.image_disabled_selected(sidetray_params.tab_btn_image_selected); LLButton* button = LLUICtrlFactory::create<LLButton> (bparams); button->setLabel(name); diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 3a8d308425..406cdc9055 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -54,13 +54,13 @@ public: : public LLInitParam::Block<Params, LLPanel::Params> { // initial state - Optional<bool> collapsed; - Optional<std::string> tab_btn_image_normal; - Optional<std::string> tab_btn_image_selected; + Optional<bool> collapsed; + Optional<LLUIImage*> tab_btn_image_normal, + tab_btn_image_selected; - Optional<S32> default_button_width; - Optional<S32> default_button_height; - Optional<S32> default_button_margin; + Optional<S32> default_button_width, + default_button_height, + default_button_margin; Params(); }; @@ -68,7 +68,7 @@ public: static LLSideTray* getInstance (); static bool instanceCreated (); protected: - LLSideTray(Params& params); + LLSideTray(const Params& params); typedef std::vector<LLSideTrayTab*> child_vector_t; typedef child_vector_t::iterator child_vector_iter_t; typedef child_vector_t::const_iterator child_vector_const_iter_t; diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index e6b4aeb6c2..1a8c2b8fc0 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -371,7 +371,7 @@ LLIMWellWindow::ObjectRowPanel::~ObjectRowPanel() //--------------------------------------------------------------------------------- void LLIMWellWindow::ObjectRowPanel::onClosePanel() { - LLScriptFloaterManager::getInstance()->onRemoveNotification(mChiclet->getSessionId()); + LLScriptFloaterManager::getInstance()->removeNotification(mChiclet->getSessionId()); } void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& notification_id, bool new_message/* = false*/) @@ -832,7 +832,7 @@ void LLIMWellWindow::closeAllImpl() ObjectRowPanel* obj_panel = dynamic_cast <ObjectRowPanel*> (panel); if (obj_panel) { - LLScriptFloaterManager::instance().onRemoveNotification(*iter); + LLScriptFloaterManager::instance().removeNotification(*iter); } } } diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index d324cb1565..c0518b705b 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -426,6 +426,10 @@ BOOL LLFloaterTexturePicker::postBuild() mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); mInventoryPanel->setAllowMultiSelect(FALSE); + // Disable auto selecting first filtered item because it takes away + // selection from the item set by LLTextureCtrl owning this floater. + mInventoryPanel->getRootFolder()->setAutoSelectOverride(TRUE); + // Commented out to scroll to currently selected texture. See EXT-5403. // // store this filter as the default one // mInventoryPanel->getRootFolder()->getFilter()->markDefault(); diff --git a/indra/newview/llurllineeditorctrl.cpp b/indra/newview/llurllineeditorctrl.cpp index 8488527185..333f682e8f 100644 --- a/indra/newview/llurllineeditorctrl.cpp +++ b/indra/newview/llurllineeditorctrl.cpp @@ -89,9 +89,10 @@ void LLURLLineEditor::copyEscapedURLToClipboard() const std::string unescaped_text = wstring_to_utf8str(mText.getWString().substr(left_pos, length)); LLWString text_to_copy; - if (LLSLURL(unescaped_text).isValid()) + // *HACK: Because LLSLURL is currently broken we cannot use it to check if unescaped_text is a valid SLURL (see EXT-8335). + if (LLStringUtil::startsWith(unescaped_text, "http://")) // SLURL text_to_copy = utf8str_to_wstring(LLWeb::escapeURL(unescaped_text)); - else + else // human-readable location text_to_copy = utf8str_to_wstring(unescaped_text); gClipboard.copyFromString( text_to_copy ); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 7e8f11c41a..9926c8d15f 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -873,6 +873,21 @@ LLInventoryCallbackManager::~LLInventoryCallbackManager() sInstance = NULL; } +//static +void LLInventoryCallbackManager::destroyClass() +{ + if (sInstance) + { + for (callback_map_t::iterator it = sInstance->mMap.begin(), end_it = sInstance->mMap.end(); it != end_it; ++it) + { + // drop LLPointer reference to callback + it->second = NULL; + } + sInstance->mMap.clear(); + } +} + + U32 LLInventoryCallbackManager::registerCB(LLPointer<LLInventoryCallback> cb) { if (cb.isNull()) diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 690c23e6a5..ef3586537b 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -36,6 +36,7 @@ #include "llinventory.h" #include "llframetimer.h" #include "llwearable.h" +#include "llui.h" //for LLDestroyClass #include <boost/signals2.hpp> // boost::signals2::trackable @@ -304,8 +305,9 @@ private: // misc functions //void inventory_reliable_callback(void**, S32 status); -class LLInventoryCallbackManager +class LLInventoryCallbackManager : public LLDestroyClass<LLInventoryCallbackManager> { + friend class LLDestroyClass<LLInventoryCallbackManager>; public: LLInventoryCallbackManager(); ~LLInventoryCallbackManager(); @@ -313,9 +315,12 @@ public: void fire(U32 callback_id, const LLUUID& item_id); U32 registerCB(LLPointer<LLInventoryCallback> cb); private: - std::map<U32, LLPointer<LLInventoryCallback> > mMap; + typedef std::map<U32, LLPointer<LLInventoryCallback> > callback_map_t; + callback_map_t mMap; U32 mLastCallback; static LLInventoryCallbackManager *sInstance; + static void destroyClass(); + public: static bool is_instantiated() { return sInstance != NULL; } }; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 04545d2549..fa0e860ae9 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2614,7 +2614,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) params.substitutions = substitutions; params.payload = payload; - LLPostponedNotification::add<LLPostponedServerObjectNotification>(params, from_id, false); + LLPostponedNotification::add<LLPostponedServerObjectNotification>(params, from_id, from_group); } break; case IM_FROM_TASK_AS_ALERT: diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 6d93de2383..15bdf126c5 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -79,6 +79,7 @@ #include "llviewerparceloverlay.h" #include "llviewerpartsource.h" #include "llviewerregion.h" +#include "llviewerstats.h" #include "llviewertextureanim.h" #include "llviewerwindow.h" // For getSpinAxis #include "llvoavatar.h" @@ -1916,6 +1917,12 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, avatar->clampAttachmentPositions(); } + + // If we're snapping the position by more than 0.5m, update LLViewerStats::mAgentPositionSnaps + if ( asAvatar() && asAvatar()->isSelf() && (mag_sqr > 0.25f) ) + { + LLViewerStats::getInstance()->mAgentPositionSnaps.push( diff.length() ); + } } if (new_rot != mLastRot diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index bdc34d0f18..a706e77f19 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -280,6 +280,8 @@ LLViewerStats::LLViewerStats() : { mStats[ST_HAS_BAD_TIMER] = 1.0; } + + mAgentPositionSnaps.reset(); } LLViewerStats::~LLViewerStats() @@ -299,6 +301,8 @@ void LLViewerStats::resetStats() LLViewerStats::getInstance()->mPacketsOutStat.reset(); LLViewerStats::getInstance()->mFPSStat.reset(); LLViewerStats::getInstance()->mTexturePacketsStat.reset(); + + LLViewerStats::getInstance()->mAgentPositionSnaps.reset(); } @@ -393,6 +397,10 @@ void LLViewerStats::addToMessage(LLSD &body) const << llendl; } } + + body["AgentPositionSnaps"] = mAgentPositionSnaps.getData(); + llinfos << "STAT: AgentPositionSnaps: Mean = " << mAgentPositionSnaps.getMean() << "; StdDev = " << mAgentPositionSnaps.getStdDev() + << "; Count = " << mAgentPositionSnaps.getCount() << llendl; } // static diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index 13d73000d2..694eeaf097 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -197,6 +197,61 @@ public: void addToMessage(LLSD &body) const; + struct StatsAccumulator + { + S32 mCount; + F32 mSum; + F32 mSumOfSquares; + U32 mCountOfNextUpdatesToIgnore; + + inline void push( F32 val ) + { + if ( mCountOfNextUpdatesToIgnore > 0 ) + { + mCountOfNextUpdatesToIgnore--; + return; + } + + mCount++; + mSum += val; + mSumOfSquares += val * val; + } + + inline F32 getMean() const + { + return (mCount == 0) ? 0.f : ((F32)mSum)/mCount; + } + + inline F32 getStdDev() const + { + const F32 mean = getMean(); + return (mCount == 0) ? 0.f : sqrt( mSumOfSquares/mCount - (mean * mean) ); + } + + inline U32 getCount() const + { + return mCount; + } + + inline void reset() + { + mCount = 0; + mSum = mSumOfSquares = 0.f; + mCountOfNextUpdatesToIgnore = 0; + } + + inline LLSD getData() const + { + LLSD data; + data["mean"] = getMean(); + data["std_dev"] = getStdDev(); + data["count"] = (S32)mCount; + return data; + } + }; + + StatsAccumulator mAgentPositionSnaps; + private: F64 mStats[ST_COUNT]; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 2929dce898..e38608bcfc 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -493,6 +493,7 @@ LLViewerTexture::LLViewerTexture(const U32 width, const U32 height, const U8 com mFullHeight = height ; mUseMipMaps = usemipmaps ; mComponents = components ; + setTexelsPerImage(); mID.generate(); sImageCount++; @@ -521,6 +522,7 @@ void LLViewerTexture::init(bool firstinit) mFullWidth = 0; mFullHeight = 0; + mTexelsPerImage = 0 ; mUseMipMaps = FALSE ; mComponents = 0 ; @@ -529,7 +531,7 @@ void LLViewerTexture::init(bool firstinit) mMaxVirtualSize = 0.f; mNeedsGLTexture = FALSE ; mMaxVirtualSizeResetInterval = 1; - mMaxVirtualSizeResetCounter = 1 ; + mMaxVirtualSizeResetCounter = mMaxVirtualSizeResetInterval ; mAdditionalDecodePriority = 0.f ; mParcelMedia = NULL ; mNumFaces = 0 ; @@ -836,7 +838,8 @@ BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* image { mFullWidth = mGLTexturep->getCurrentWidth() ; mFullHeight = mGLTexturep->getCurrentHeight() ; - mComponents = mGLTexturep->getComponents() ; + mComponents = mGLTexturep->getComponents() ; + setTexelsPerImage(); } return ret ; @@ -1054,9 +1057,16 @@ void LLViewerTexture::destroyGLTexture() } } +void LLViewerTexture::setTexelsPerImage() +{ + S32 fullwidth = llmin(mFullWidth,(S32)MAX_IMAGE_SIZE_DEFAULT); + S32 fullheight = llmin(mFullHeight,(S32)MAX_IMAGE_SIZE_DEFAULT); + mTexelsPerImage = (F32)fullwidth * fullheight; +} + BOOL LLViewerTexture::isLargeImage() { - return mFullWidth * mFullHeight > LLViewerTexture::sMinLargeImageSize ; + return (S32)mTexelsPerImage > LLViewerTexture::sMinLargeImageSize ; } //virtual @@ -1410,6 +1420,7 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) mFullWidth = mRawImage->getWidth(); mFullHeight = mRawImage->getHeight(); + setTexelsPerImage(); } else { @@ -1615,11 +1626,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority() { // priority range = 100,000 - 500,000 S32 desired_discard = mDesiredDiscardLevel; - if (getDontDiscard()) - { - desired_discard -= 2; - } - else if (!isJustBound() && mCachedRawImageReady) + if (!isJustBound() && mCachedRawImageReady) { if(mBoostLevel < BOOST_HIGH) { @@ -1635,7 +1642,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority() S32 ddiscard = cur_discard - desired_discard; ddiscard = llclamp(ddiscard, -1, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY); - priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR; + priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR; } // Priority Formula: @@ -1643,19 +1650,51 @@ F32 LLViewerFetchedTexture::calcDecodePriority() // [10,000,000] + [1,000,000-9,000,000] + [100,000-500,000] + [1-20,000] + [0-999] if (priority > 0.0f) { + bool large_enough = mCachedRawImageReady && ((S32)mTexelsPerImage > sMinLargeImageSize) ; + if(large_enough) + { + //Note: + //to give small, low-priority textures some chance to be fetched, + //cut the priority in half if the texture size is larger than 256 * 256 and has a 64*64 ready. + priority *= 0.5f ; + } + pixel_priority = llclamp(pixel_priority, 0.0f, MAX_PRIORITY_PIXEL); priority += pixel_priority + PRIORITY_BOOST_LEVEL_FACTOR * mBoostLevel; if ( mBoostLevel > BOOST_HIGH) { - priority += PRIORITY_BOOST_HIGH_FACTOR; + if(mBoostLevel > BOOST_SUPER_HIGH) + { + //for very important textures, always grant the highest priority. + priority += PRIORITY_BOOST_HIGH_FACTOR; + } + else if(mCachedRawImageReady) + { + //Note: + //to give small, low-priority textures some chance to be fetched, + //if high priority texture has a 64*64 ready, lower its fetching priority. + setAdditionalDecodePriority(0.5f) ; + } + else + { + priority += PRIORITY_BOOST_HIGH_FACTOR; + } } if(mAdditionalDecodePriority > 0.0f) { // priority range += 1,000,000.f-9,000,000.f - priority += PRIORITY_ADDITIONAL_FACTOR * (1.0 + mAdditionalDecodePriority * MAX_ADDITIONAL_LEVEL_FOR_PRIORITY); + F32 additional = PRIORITY_ADDITIONAL_FACTOR * (1.0 + mAdditionalDecodePriority * MAX_ADDITIONAL_LEVEL_FOR_PRIORITY); + if(large_enough) + { + //Note: + //to give small, low-priority textures some chance to be fetched, + //cut the additional priority to a quarter if the texture size is larger than 256 * 256 and has a 64*64 ready. + additional *= 0.25f ; + } + priority += additional; } } return priority; @@ -1698,11 +1737,6 @@ void LLViewerFetchedTexture::updateVirtualSize() addTextureStats(0.f, FALSE) ;//reset } - if(mForceToSaveRawImage) - { - setAdditionalDecodePriority(0.75f) ; //boost the fetching priority - } - for(U32 i = 0 ; i < mNumFaces ; i++) { LLFace* facep = mFaceList[i] ; @@ -1815,6 +1849,7 @@ bool LLViewerFetchedTexture::updateFetch() { mFullWidth = mRawImage->getWidth() << mRawDiscardLevel; mFullHeight = mRawImage->getHeight() << mRawDiscardLevel; + setTexelsPerImage(); if(mFullWidth > MAX_IMAGE_SIZE || mFullHeight > MAX_IMAGE_SIZE) { @@ -2890,10 +2925,6 @@ void LLViewerLODTexture::processTextureStats() //static const F64 log_2 = log(2.0); static const F64 log_4 = log(4.0); - S32 fullwidth = llmin(mFullWidth,(S32)MAX_IMAGE_SIZE_DEFAULT); - S32 fullheight = llmin(mFullHeight,(S32)MAX_IMAGE_SIZE_DEFAULT); - mTexelsPerImage = (F32)fullwidth * fullheight; - F32 discard_level = 0.f; // If we know the output width and height, we can force the discard diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index f071c6e392..1f0d760daf 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -124,15 +124,16 @@ public: BOOST_HIGH = 10, BOOST_BUMP , BOOST_TERRAIN , // has to be high priority for minimap / low detail - BOOST_SELECTED , - BOOST_HUD , + BOOST_SELECTED , BOOST_AVATAR_BAKED_SELF , + BOOST_AVATAR_SELF , // needed for baking avatar + BOOST_SUPER_HIGH , //textures higher than this need to be downloaded at the required resolution without delay. + BOOST_HUD , BOOST_ICON , BOOST_UI , BOOST_PREVIEW , BOOST_MAP , - BOOST_MAP_VISIBLE , - BOOST_AVATAR_SELF , // needed for baking avatar + BOOST_MAP_VISIBLE , BOOST_MAX_LEVEL, //other texture Categories @@ -266,6 +267,7 @@ protected: void init(bool firstinit) ; void reorganizeFaceList() ; void reorganizeVolumeList() ; + void setTexelsPerImage(); private: //note: do not make this function public. /*virtual*/ LLImageGL* getGLTexture() const ; @@ -278,6 +280,7 @@ protected: S32 mFullHeight; BOOL mUseMipMaps ; S8 mComponents; + F32 mTexelsPerImage; // Texels per image. mutable S8 mNeedsGLTexture; mutable F32 mMaxVirtualSize; // The largest virtual size of the image, in pixels - how much data to we need? mutable S32 mMaxVirtualSizeResetCounter ; @@ -596,8 +599,6 @@ private: void scaleDown() ; private: - - F32 mTexelsPerImage; // Texels per image. F32 mDiscardVirtualSize; // Virtual size used to calculate desired discard F32 mCalculatedDiscardLevel; // Last calculated discard level }; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 32723dfe3d..72aec07e67 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3190,29 +3190,26 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) { // muted avatars update at 16 hz mUpdatePeriod = 16; } - else if (visible && mVisibilityRank <= LLVOAvatar::sMaxVisible) + else if (mVisibilityRank <= LLVOAvatar::sMaxVisible) { //first 25% of max visible avatars are not impostored mUpdatePeriod = 1; } - else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 4) + else if (mVisibilityRank > LLVOAvatar::sMaxVisible * 4) { //background avatars are REALLY slow updating impostors mUpdatePeriod = 16; } - else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 3) + else if (mVisibilityRank > LLVOAvatar::sMaxVisible * 3) { //back 25% of max visible avatars are slow updating impostors mUpdatePeriod = 8; } - else if (visible && mImpostorPixelArea <= impostor_area) + else if (mImpostorPixelArea <= impostor_area) { // stuff in between gets an update period based on pixel area mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mImpostorPixelArea), 2, 8); } - else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible) - { // force nearby impostors in ultra crowded areas - mUpdatePeriod = 2; - } else - { // not impostored - mUpdatePeriod = 1; + { + //nearby avatars, update the impostors more frequently. + mUpdatePeriod = 4; } visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE; @@ -4288,6 +4285,8 @@ void LLVOAvatar::checkTextureLoading() return ; } +const F32 SELF_ADDITIONAL_PRI = 0.75f ; +const F32 ADDITIONAL_PRI = 0.5f; void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level) { //Note: @@ -4303,9 +4302,14 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel mMinPixelArea = llmin(pixel_area, mMinPixelArea); imagep->addTextureStats(pixel_area / texel_area_ratio); imagep->setBoostLevel(boost_level); - if(boost_level == LLViewerTexture::BOOST_AVATAR_BAKED_SELF) + + if(boost_level != LLViewerTexture::BOOST_AVATAR_BAKED_SELF) + { + imagep->setAdditionalDecodePriority(ADDITIONAL_PRI) ; + } + else { - imagep->setAdditionalDecodePriority(1.0f) ; + imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; } } @@ -7312,7 +7316,7 @@ void LLVOAvatar::cullAvatarsByPixelArea() std::sort(LLCharacter::sInstances.begin(), LLCharacter::sInstances.end(), CompareScreenAreaGreater()); // Update the avatars that have changed status - U32 rank = 0; + U32 rank = 2; //1 is reserved for self. for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); iter != LLCharacter::sInstances.end(); ++iter) { @@ -7336,7 +7340,7 @@ void LLVOAvatar::cullAvatarsByPixelArea() if (inst->isSelf()) { - inst->setVisibilityRank(0); + inst->setVisibilityRank(1); } else if (inst->mDrawable.notNull() && inst->mDrawable->isVisible()) { diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index bb04511a8d..2ef333a0a0 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -869,7 +869,7 @@ private: public: // Responsible for detecting the user's voice signal (and when the // user speaks, it puts a voice symbol over the avatar's head) and gesticulations - LLVoiceVisualizer* mVoiceVisualizer; + LLPointer<LLVoiceVisualizer> mVoiceVisualizer; int mCurrentGesticulationLevel; //-------------------------------------------------------------------- @@ -1050,5 +1050,6 @@ protected: // Shared with LLVOAvatarSelf }; // LLVOAvatar extern const S32 MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL; +extern const F32 SELF_ADDITIONAL_PRI; #endif // LL_VO_AVATAR_H diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 46d987353f..3a283e7aa6 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -2037,7 +2037,7 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe imagep->resetTextureStats(); imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); imagep->addTextureStats( desired_pixels / texel_area_ratio ); - imagep->setAdditionalDecodePriority(1.0f) ; + imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; imagep->forceUpdateBindStats() ; if (imagep->getDiscardLevel() < 0) { diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index c01d7fa62f..fe8c09e329 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -85,8 +85,8 @@ void LLPanelWearableListItem::onMouseLeave(S32 x, S32 y, MASK mask) reshapeWidgets(); } -LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item) -: LLPanelInventoryListItemBase(item) +LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item, const LLPanelWearableListItem::Params& params) +: LLPanelInventoryListItemBase(item, params) { } @@ -101,15 +101,19 @@ LLPanelWearableOutfitItem* LLPanelWearableOutfitItem::create(LLViewerInventoryIt LLPanelWearableOutfitItem* list_item = NULL; if (item) { - list_item = new LLPanelWearableOutfitItem(item, worn_indication_enabled); - list_item->init(); + const LLPanelInventoryListItemBase::Params& params = LLUICtrlFactory::getDefaultParams<LLPanelInventoryListItemBase>(); + + list_item = new LLPanelWearableOutfitItem(item, worn_indication_enabled, params); + list_item->initFromParams(params); + list_item->postBuild(); } return list_item; } LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item, - bool worn_indication_enabled) -: LLPanelInventoryListItemBase(item) + bool worn_indication_enabled, + const LLPanelWearableOutfitItem::Params& params) +: LLPanelInventoryListItemBase(item, params) , mWornIndicationEnabled(worn_indication_enabled) { } @@ -132,6 +136,17 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name, ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// +static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelClothingListItem(&typeid(LLPanelClothingListItem::Params), "clothing_list_item"); + + +LLPanelClothingListItem::Params::Params() +: up_btn("up_btn"), + down_btn("down_btn"), + edit_btn("edit_btn"), + lock_panel("lock_panel"), + edit_panel("edit_panel"), + lock_icon("lock_icon") +{} // static LLPanelClothingListItem* LLPanelClothingListItem::create(LLViewerInventoryItem* item) @@ -139,24 +154,54 @@ LLPanelClothingListItem* LLPanelClothingListItem::create(LLViewerInventoryItem* LLPanelClothingListItem* list_item = NULL; if(item) { - list_item = new LLPanelClothingListItem(item); - list_item->init(); + const LLPanelClothingListItem::Params& params = LLUICtrlFactory::getDefaultParams<LLPanelClothingListItem>(); + list_item = new LLPanelClothingListItem(item, params); + list_item->initFromParams(params); + list_item->postBuild(); } return list_item; } -LLPanelClothingListItem::LLPanelClothingListItem(LLViewerInventoryItem* item) - : LLPanelDeletableWearableListItem(item) +LLPanelClothingListItem::LLPanelClothingListItem(LLViewerInventoryItem* item, const LLPanelClothingListItem::Params& params) + : LLPanelDeletableWearableListItem(item, params) +{ + LLButton::Params button_params = params.up_btn; + applyXUILayout(button_params, this); + addChild(LLUICtrlFactory::create<LLButton>(button_params)); + + button_params = params.down_btn; + applyXUILayout(button_params, this); + addChild(LLUICtrlFactory::create<LLButton>(button_params)); + + LLPanel::Params panel_params = params.lock_panel; + applyXUILayout(panel_params, this); + LLPanel* lock_panelp = LLUICtrlFactory::create<LLPanel>(panel_params); + addChild(lock_panelp); + + panel_params = params.edit_panel; + applyXUILayout(panel_params, this); + LLPanel* edit_panelp = LLUICtrlFactory::create<LLPanel>(panel_params); + addChild(edit_panelp); + + if (lock_panelp) { + LLIconCtrl::Params icon_params = params.lock_icon; + applyXUILayout(icon_params, this); + lock_panelp->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_params)); } -LLPanelClothingListItem::~LLPanelClothingListItem() + if (edit_panelp) { + button_params = params.edit_btn; + applyXUILayout(button_params, this); + edit_panelp->addChild(LLUICtrlFactory::create<LLButton>(button_params)); + } + + setSeparatorVisible(false); } -void LLPanelClothingListItem::init() +LLPanelClothingListItem::~LLPanelClothingListItem() { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_clothing_list_item.xml"); } BOOL LLPanelClothingListItem::postBuild() @@ -178,30 +223,62 @@ BOOL LLPanelClothingListItem::postBuild() ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// +static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelBodyPartsListItem(&typeid(LLPanelBodyPartsListItem::Params), "bodyparts_list_item"); + + +LLPanelBodyPartsListItem::Params::Params() +: edit_btn("edit_btn"), + edit_panel("edit_panel"), + lock_panel("lock_panel"), + lock_icon("lock_icon") +{} + // static LLPanelBodyPartsListItem* LLPanelBodyPartsListItem::create(LLViewerInventoryItem* item) { LLPanelBodyPartsListItem* list_item = NULL; if(item) { - list_item = new LLPanelBodyPartsListItem(item); - list_item->init(); + const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelBodyPartsListItem>(); + list_item = new LLPanelBodyPartsListItem(item, params); + list_item->initFromParams(params); + list_item->postBuild(); } return list_item; } -LLPanelBodyPartsListItem::LLPanelBodyPartsListItem(LLViewerInventoryItem* item) -: LLPanelWearableListItem(item) +LLPanelBodyPartsListItem::LLPanelBodyPartsListItem(LLViewerInventoryItem* item, const LLPanelBodyPartsListItem::Params& params) +: LLPanelWearableListItem(item, params) { + LLPanel::Params panel_params = params.edit_panel; + applyXUILayout(panel_params, this); + LLPanel* edit_panelp = LLUICtrlFactory::create<LLPanel>(panel_params); + addChild(edit_panelp); + + panel_params = params.lock_panel; + applyXUILayout(panel_params, this); + LLPanel* lock_panelp = LLUICtrlFactory::create<LLPanel>(panel_params); + addChild(lock_panelp); + + if (edit_panelp) + { + LLButton::Params btn_params = params.edit_btn; + applyXUILayout(btn_params, this); + edit_panelp->addChild(LLUICtrlFactory::create<LLButton>(btn_params)); } -LLPanelBodyPartsListItem::~LLPanelBodyPartsListItem() + if (lock_panelp) { + LLIconCtrl::Params icon_params = params.lock_icon; + applyXUILayout(icon_params, this); + lock_panelp->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_params)); + } + + setSeparatorVisible(true); } -void LLPanelBodyPartsListItem::init() +LLPanelBodyPartsListItem::~LLPanelBodyPartsListItem() { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_body_parts_list_item.xml"); } BOOL LLPanelBodyPartsListItem::postBuild() @@ -214,6 +291,11 @@ BOOL LLPanelBodyPartsListItem::postBuild() return TRUE; } +static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDeletableWearableListItem(&typeid(LLPanelDeletableWearableListItem::Params), "deletable_wearable_list_item"); + +LLPanelDeletableWearableListItem::Params::Params() +: delete_btn("delete_btn") +{} // static LLPanelDeletableWearableListItem* LLPanelDeletableWearableListItem::create(LLViewerInventoryItem* item) @@ -221,20 +303,22 @@ LLPanelDeletableWearableListItem* LLPanelDeletableWearableListItem::create(LLVie LLPanelDeletableWearableListItem* list_item = NULL; if(item) { - list_item = new LLPanelDeletableWearableListItem(item); - list_item->init(); + const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelDeletableWearableListItem>(); + list_item = new LLPanelDeletableWearableListItem(item, params); + list_item->initFromParams(params); + list_item->postBuild(); } return list_item; } -LLPanelDeletableWearableListItem::LLPanelDeletableWearableListItem(LLViewerInventoryItem* item) -: LLPanelWearableListItem(item) +LLPanelDeletableWearableListItem::LLPanelDeletableWearableListItem(LLViewerInventoryItem* item, const LLPanelDeletableWearableListItem::Params& params) +: LLPanelWearableListItem(item, params) { -} + LLButton::Params button_params = params.delete_btn; + applyXUILayout(button_params, this); + addChild(LLUICtrlFactory::create<LLButton>(button_params)); -void LLPanelDeletableWearableListItem::init() -{ - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_deletable_wearable_list_item.xml"); + setSeparatorVisible(true); } BOOL LLPanelDeletableWearableListItem::postBuild() @@ -260,8 +344,11 @@ LLPanelAttachmentListItem* LLPanelAttachmentListItem::create(LLViewerInventoryIt LLPanelAttachmentListItem* list_item = NULL; if(item) { - list_item = new LLPanelAttachmentListItem(item); - list_item->init(); + const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelDeletableWearableListItem>(); + + list_item = new LLPanelAttachmentListItem(item, params); + list_item->initFromParams(params); + list_item->postBuild(); } return list_item; } @@ -284,27 +371,32 @@ void LLPanelAttachmentListItem::updateItem(const std::string& name, ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// +static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDummyClothingListItem(&typeid(LLPanelDummyClothingListItem::Params), "dummy_clothing_list_item"); + +LLPanelDummyClothingListItem::Params::Params() +: add_panel("add_panel"), + add_btn("add_btn") +{} LLPanelDummyClothingListItem* LLPanelDummyClothingListItem::create(LLWearableType::EType w_type) { - LLPanelDummyClothingListItem* list_item = new LLPanelDummyClothingListItem(w_type); - list_item->init(); + const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelDummyClothingListItem>(); + + LLPanelDummyClothingListItem* list_item = new LLPanelDummyClothingListItem(w_type, params); + list_item->initFromParams(params); + list_item->postBuild(); return list_item; } BOOL LLPanelDummyClothingListItem::postBuild() { - LLIconCtrl* icon = getChild<LLIconCtrl>("item_icon"); - setIconCtrl(icon); - setTitleCtrl(getChild<LLTextBox>("item_name")); - addWidgetToRightSide("btn_add_panel"); setIconImage(LLInventoryIcon::getIcon(LLAssetType::AT_CLOTHING, LLInventoryType::IT_NONE, mWearableType, FALSE)); updateItem(wearableTypeToString(mWearableType)); // Make it look loke clothing item - reserve space for 'delete' button - setLeftWidgetsWidth(icon->getRect().mLeft); + setLeftWidgetsWidth(getChildView("item_icon")->getRect().mLeft); setWidgetsVisible(false); reshapeWidgets(); @@ -317,15 +409,23 @@ LLWearableType::EType LLPanelDummyClothingListItem::getWearableType() const return mWearableType; } -LLPanelDummyClothingListItem::LLPanelDummyClothingListItem(LLWearableType::EType w_type) - : LLPanelWearableListItem(NULL) - , mWearableType(w_type) +LLPanelDummyClothingListItem::LLPanelDummyClothingListItem(LLWearableType::EType w_type, const LLPanelDummyClothingListItem::Params& params) +: LLPanelWearableListItem(NULL, params), + mWearableType(w_type) { -} + LLPanel::Params panel_params(params.add_panel); + applyXUILayout(panel_params, this); + LLPanel* add_panelp = LLUICtrlFactory::create<LLPanel>(panel_params); + addChild(add_panelp); -void LLPanelDummyClothingListItem::init() + if (add_panelp) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_dummy_clothing_list_item.xml"); + LLButton::Params button_params(params.add_btn); + applyXUILayout(button_params, this); + add_panelp->addChild(LLUICtrlFactory::create<LLButton>(button_params)); +} + + setSeparatorVisible(true); } typedef std::map<LLWearableType::EType, std::string> clothing_to_string_map_t; diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 0e5403f30c..f2f81968ee 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -68,7 +68,7 @@ public: protected: - LLPanelWearableListItem(LLViewerInventoryItem* item); + LLPanelWearableListItem(LLViewerInventoryItem* item, const Params& params); }; /** @@ -93,7 +93,7 @@ public: protected: LLPanelWearableOutfitItem(LLViewerInventoryItem* item, - bool worn_indication_enabled); + bool worn_indication_enabled, const Params& params); private: bool mWornIndicationEnabled; @@ -103,6 +103,13 @@ class LLPanelDeletableWearableListItem : public LLPanelWearableListItem { LOG_CLASS(LLPanelDeletableWearableListItem); public: + struct Params : public LLInitParam::Block<Params, LLPanelWearableListItem::Params> + { + Optional<LLButton::Params> delete_btn; + + Params(); + }; + static LLPanelDeletableWearableListItem* create(LLViewerInventoryItem* item); @@ -116,9 +123,7 @@ public: inline void setShowDeleteButton(bool show) { setShowWidget("btn_delete", show); } protected: - LLPanelDeletableWearableListItem(LLViewerInventoryItem* item); - - /*virtual*/ void init(); + LLPanelDeletableWearableListItem(LLViewerInventoryItem* item, const Params& params); }; /** Outfit list item for an attachment */ @@ -134,7 +139,7 @@ public: EItemState item_state = IS_DEFAULT); protected: - LLPanelAttachmentListItem(LLViewerInventoryItem* item) : LLPanelDeletableWearableListItem(item) {}; + LLPanelAttachmentListItem(LLViewerInventoryItem* item, const Params& params) : LLPanelDeletableWearableListItem(item, params) {}; }; /** @@ -147,6 +152,18 @@ class LLPanelClothingListItem : public LLPanelDeletableWearableListItem LOG_CLASS(LLPanelClothingListItem); public: + struct Params : public LLInitParam::Block<Params, LLPanelDeletableWearableListItem::Params> + { + Optional<LLButton::Params> up_btn, + down_btn, + edit_btn; + Optional<LLPanel::Params> lock_panel, + edit_panel; + Optional<LLIconCtrl::Params> lock_icon; + + Params(); + }; + static LLPanelClothingListItem* create(LLViewerInventoryItem* item); virtual ~LLPanelClothingListItem(); @@ -162,18 +179,25 @@ public: inline void setShowLockButton(bool show) { setShowWidget("btn_lock", show); } inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); } - protected: - LLPanelClothingListItem(LLViewerInventoryItem* item); - - /*virtual*/ void init(); + LLPanelClothingListItem(LLViewerInventoryItem* item, const Params& params); + }; class LLPanelBodyPartsListItem : public LLPanelWearableListItem { LOG_CLASS(LLPanelBodyPartsListItem); public: + struct Params : public LLInitParam::Block<Params, LLPanelWearableListItem::Params> + { + Optional<LLButton::Params> edit_btn; + Optional<LLPanel::Params> lock_panel, + edit_panel; + Optional<LLIconCtrl::Params> lock_icon; + + Params(); + }; static LLPanelBodyPartsListItem* create(LLViewerInventoryItem* item); @@ -188,9 +212,7 @@ public: inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); } protected: - LLPanelBodyPartsListItem(LLViewerInventoryItem* item); - - /*virtual*/ void init(); + LLPanelBodyPartsListItem(LLViewerInventoryItem* item, const Params& params); }; @@ -202,15 +224,19 @@ protected: class LLPanelDummyClothingListItem : public LLPanelWearableListItem { public: + struct Params : public LLInitParam::Block<Params, LLPanelWearableListItem::Params> + { + Optional<LLPanel::Params> add_panel; + Optional<LLButton::Params> add_btn; + Params(); + }; static LLPanelDummyClothingListItem* create(LLWearableType::EType w_type); /*virtual*/ BOOL postBuild(); LLWearableType::EType getWearableType() const; protected: - LLPanelDummyClothingListItem(LLWearableType::EType w_type); - - /*virtual*/ void init(); + LLPanelDummyClothingListItem(LLWearableType::EType w_type, const Params& params); static std::string wearableTypeToString(LLWearableType::EType w_type); diff --git a/indra/newview/llwindebug.cpp b/indra/newview/llwindebug.cpp index 502fefd4ef..660245b02b 100644 --- a/indra/newview/llwindebug.cpp +++ b/indra/newview/llwindebug.cpp @@ -97,6 +97,9 @@ void LLWinDebug::init() // Load the dbghelp dll now, instead of waiting for the crash. // Less potential for stack mangling + // Don't install vectored exception handler if being debugged. + if(IsDebuggerPresent()) return; + if (s_first_run) { // First, try loading from the directory that the app resides in. @@ -135,36 +138,42 @@ void LLWinDebug::init() void LLWinDebug::writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename) { - if(f_mdwp == NULL || gDirUtilp == NULL) - { - return; - } - else + // Temporary fix to switch out the code that writes the DMP file. + // Fix coming that doesn't write a mini dump file for regular C++ exceptions. + const bool enable_write_dump_file = false; + if ( enable_write_dump_file ) { - std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, filename); - - HANDLE hFile = CreateFileA(dump_path.c_str(), - GENERIC_WRITE, - FILE_SHARE_WRITE, - NULL, - CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, - NULL); - - if (hFile != INVALID_HANDLE_VALUE) + if(f_mdwp == NULL || gDirUtilp == NULL) { - // Write the dump, ignoring the return value - f_mdwp(GetCurrentProcess(), - GetCurrentProcessId(), - hFile, - type, - ExInfop, - NULL, - NULL); - - CloseHandle(hFile); + return; } + else + { + std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, filename); + + HANDLE hFile = CreateFileA(dump_path.c_str(), + GENERIC_WRITE, + FILE_SHARE_WRITE, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (hFile != INVALID_HANDLE_VALUE) + { + // Write the dump, ignoring the return value + f_mdwp(GetCurrentProcess(), + GetCurrentProcessId(), + hFile, + type, + ExInfop, + NULL, + NULL); + + CloseHandle(hFile); + } + } } } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 7d0f763bd1..b578cb9f69 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7111,7 +7111,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) if (LLPipeline::sWaterReflections && assertInitialized() && LLDrawPoolWater::sNeedsReflectionUpdate) { BOOL skip_avatar_update = FALSE; - if (gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK) + if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK) { skip_avatar_update = TRUE; } diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index 8c3aa2c9a4..da2be18db6 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -71,7 +71,8 @@ image_name="Cam_Preset_Front_Off" /> <panel_camera_item.selected_picture image_name="Cam_Preset_Front_On" /> - <panel_camera_item.text> + <panel_camera_item.text + name="front_view_text"> Front View </panel_camera_item.text> </panel_camera_item> @@ -85,7 +86,8 @@ image_name="Cam_Preset_Side_Off" /> <panel_camera_item.selected_picture image_name="Cam_Preset_Side_On" /> - <panel_camera_item.text> + <panel_camera_item.text + name="side_view_text"> Side View </panel_camera_item.text> </panel_camera_item> @@ -100,7 +102,8 @@ image_name="Cam_Preset_Back_Off" /> <panel_camera_item.selected_picture image_name="Cam_Preset_Back_On" /> - <panel_camera_item.text> + <panel_camera_item.text + name="rear_view_text"> Rear View </panel_camera_item.text> </panel_camera_item> @@ -122,7 +125,8 @@ <panel_camera_item.mousedown_callback function="CameraPresets.ChangeView" parameter="object_view" /> - <panel_camera_item.text> + <panel_camera_item.text + name="object_view_text"> Object View </panel_camera_item.text> <panel_camera_item.picture @@ -136,7 +140,8 @@ <panel_camera_item.mousedown_callback function="CameraPresets.ChangeView" parameter="mouselook_view" /> - <panel_camera_item.text> + <panel_camera_item.text + name="mouselook_view_text"> Mouselook View </panel_camera_item.text> <panel_camera_item.picture diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml index 5ad099e2d9..ae98abf4fb 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml @@ -50,8 +50,13 @@ function="File.UploadBulk" parameter="" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_call + label="Set Default Upload Permissions" + name="perm prefs"> + <menu_item_call.on_click + function="Floater.Toggle" + parameter="perm_prefs" /> + </menu_item_call> </menu> <menu_item_call diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 3557318705..63ff7047b4 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -707,13 +707,6 @@ label="Options" name="Options" tear_off="true"> - <menu_item_call - label="Set Default Upload Permissions" - name="perm prefs"> - <menu_item_call.on_click - function="Floater.Toggle" - parameter="perm_prefs" /> - </menu_item_call> <menu_item_check label="Show Advanced Permissions" name="DebugPermissions"> @@ -873,8 +866,13 @@ function="File.UploadBulk" parameter="" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + <menu_item_call + label="Set Default Upload Permissions" + name="perm prefs"> + <menu_item_call.on_click + function="Floater.Toggle" + parameter="perm_prefs" /> + </menu_item_call> </menu> </menu> <menu diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 1bb282dff9..95ee374e39 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -819,7 +819,7 @@ Delete pick <nolink>[PICK]</nolink>? icon="alertmodal.tga" name="DeleteOutfits" type="alertmodal"> - Delete the selected outfit/s? + Delete the selected outfit? <usetemplate name="okcancelbuttons" notext="Cancel" @@ -5493,7 +5493,6 @@ If you stay in this region you will be logged out. <notification icon="notify.tga" name="LoadWebPage" - persist="true" type="notify"> Load web page [URL]? @@ -5593,7 +5592,6 @@ Grant this request? <notification icon="notify.tga" name="ScriptDialog" - persist="true" type="notify"> [FIRST] [LAST]'s '[TITLE]' [MESSAGE] @@ -5608,7 +5606,6 @@ Grant this request? <notification icon="notify.tga" name="ScriptDialogGroup" - persist="true" type="notify"> [GROUPNAME]'s '[TITLE]' [MESSAGE] diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml index a4cac97af6..8c13ced8f3 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml @@ -104,6 +104,7 @@ follows="top|left" font="SansSerif" left="10" + name="nearby_media_title" width="100"> Nearby Media </text> @@ -114,6 +115,7 @@ font="SansSerif" top_pad="15" left="10" + name="show_text" width="40"> Show: </text> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml index b43aa0a824..d18f0d57ca 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -14,9 +14,9 @@ background_visible="true" bg_alpha_color="DkGray2" bg_opaque_color="DkGray2" - no_matched_tabs_text.value="NoOutfitsTabsMatched" + no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]." no_matched_tabs_text.v_pad="10" - no_visible_tabs_text.value="NoOutfits" + no_visible_tabs_text.value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]" follows="all" height="400" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 20d49fac04..048de70045 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -1958,6 +1958,9 @@ Clears (deletes) the media and all params from the given face. <string name="InvFolder Animations">Animations</string> <string name="InvFolder Gestures">Gestures</string> <string name="InvFolder Favorite">Favorites</string> + <!-- historically default name of the Favorites folder can start from either "f" or "F" letter. + We should localize both of them with the same value --> + <string name="InvFolder favorite">Favorites</string> <string name="InvFolder Current Outfit">Current Outfit</string> <string name="InvFolder Initial Outfits">Initial Outfits</string> <string name="InvFolder My Outfits">My Outfits</string> @@ -2198,10 +2201,6 @@ Clears (deletes) the media and all params from the given face. <!-- panel preferences general --> <string name="BusyModeResponseDefault">The Resident you messaged is in 'busy mode' which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string> - <!-- Outfits Panel --> - <string name="NoOutfits">You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]</string> - <string name="NoOutfitsTabsMatched">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string> - <!-- Mute --> <string name="MuteByName">(By name)</string> <string name="MuteAgent">(Resident)</string> diff --git a/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml b/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml new file mode 100644 index 0000000000..c08267de82 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/bodyparts_list_item.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<bodyparts_list_item + follows="top|right|left" + height="23" + layout="topleft" + left="0" + name="wearable_item" + bottom="0" + width="380"> + <item_icon + height="16" + follows="top|left" + image_name="Inv_Object" + layout="topleft" + left="0" + name="item_icon" + top="2" + width="16" /> + <item_name + follows="left|right" + height="16" + layout="topleft" + left="21" + allow_html="false" + use_ellipses="true" + name="item_name" + text_color="white" + top="5" + value="..." + width="359" /> + <lock_panel + background_visible="false" + name="btn_lock" + layout="topleft" + follows="top|right" + top="0" + left="0" + height="23" + width="23" + tab_stop="false" + tool_tip="You don't have permission to edit"/> + <lock_icon + name="btn_lock1" + layout="topleft" + follows="top|right" + image_name="Locked_Icon" + top="2" + left="5" + height="13" + width="9" + tab_stop="false" /> + <edit_panel + background_visible="false" + name="btn_edit_panel" + layout="topleft" + follows="top|right" + top="1" + left="17" + height="23" + width="26" + tab_stop="false"/> + <edit_btn + name="btn_edit" + layout="topleft" + follows="top|right" + image_overlay="Edit_Wrench" + top="0" + left="0" + height="23" + width="23" + tab_stop="false" + tool_tip="Edit this shape"/> +</bodyparts_list_item> diff --git a/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml b/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml new file mode 100644 index 0000000000..f7a05e9bc4 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/clothing_list_item.xml @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<clothing_list_item + follows="top|right|left" + height="23" + layout="topleft" + left="0" + name="wearable_item" + bottom="0" + width="380"> + <lock_icon + height="16" + follows="top|left" + image_name="Inv_Object" + layout="topleft" + left="21" + name="item_icon" + top="2" + width="16" /> + <item_name + follows="left|right" + height="16" + layout="topleft" + left="42" + allow_html="false" + use_ellipses="true" + name="item_name" + text_color="white" + top="5" + value="..." + width="359" /> + <up_btn + name="btn_move_up" + layout="topleft" + follows="top|right" + image_overlay="UpArrow_Off" + top="1" + left="0" + height="23" + width="23" + tab_stop="false" /> + <down_btn + name="btn_move_down" + layout="topleft" + follows="top|right" + image_overlay="DownArrow_Off" + top="1" + left="26" + height="23" + width="23" + tab_stop="false" /> + <lock_panel + background_visible="false" + name="btn_lock" + layout="topleft" + follows="top|right" + top="0" + left="0" + height="23" + width="23" + tab_stop="false" + tool_tip="You don't have permission to edit"/> + <lock_icon + name="btn_lock1" + layout="topleft" + follows="top|right" + image_name="Locked_Icon" + top="2" + left="5" + height="13" + width="9" + tab_stop="false" /> + <edit_panel + background_visible="false" + name="btn_edit_panel" + layout="topleft" + follows="top|right" + top="0" + left="26" + height="23" + width="26" + tab_stop="false"/> + <edit_btn + name="btn_edit" + layout="topleft" + follows="top|right" + image_overlay="Edit_Wrench" + top="1" + left="0" + height="23" + width="23" + tab_stop="false" + tool_tip="Edit this wearable"/> +</clothing_list_item> diff --git a/indra/newview/skins/default/xui/en/widgets/deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/en/widgets/deletable_wearable_list_item.xml new file mode 100644 index 0000000000..88a4682e13 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/deletable_wearable_list_item.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<deletable_wearable_list_item + follows="top|right|left" + height="23" + layout="topleft" + left="0" + name="deletable_wearable_item" + bottom="0" + width="380"> + <delete_btn + name="btn_delete" + layout="topleft" + follows="top|left" + image_unselected="Toast_CloseBtn" + image_selected="Toast_CloseBtn" + top="3" + left="0" + height="18" + width="18" + tab_stop="false" + tool_tip="Remove from outfit"/> + <item_icon + height="16" + follows="top|left" + image_name="Inv_Object" + layout="topleft" + left="24" + name="item_icon" + top="2" + width="16" /> + <item_name + follows="left|right" + height="16" + layout="topleft" + left="45" + allow_html="false" + use_ellipses="true" + name="item_name" + text_color="white" + top="5" + value="..." + width="359" /> +</deletable_wearable_list_item> diff --git a/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml new file mode 100644 index 0000000000..80a877a6c2 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/dummy_clothing_list_item.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<dummy_clothing_list_item + follows="top|right|left" + height="23" + layout="topleft" + left="0" + name="dummy_clothing_item" + bottom="0" + width="380"> + <item_icon + height="16" + color="0.75 0.75 0.75 1" + follows="top|left" + image_name="Inv_Object" + layout="topleft" + left="20" + name="item_icon" + top="2" + width="16" /> + <item_name + follows="left|right" + height="16" + layout="topleft" + left="41" + allow_html="false" + use_ellipses="true" + name="item_name" + text_color="LtGray_50" + top="4" + value="..." + width="359" /> + <add_panel + name="btn_add_panel" + layout="topleft" + follows="top|right" + top="0" + left="0" + height="23" + width="26" + tab_stop="false"/> + <add_btn + name="btn_add" + layout="topleft" + follows="top|right" + image_overlay="AddItem_Off" + top="0" + left="0" + height="23" + width="23" + tab_stop="false" + tool_tip="Add more items of this type" /> +</dummy_clothing_list_item> diff --git a/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml b/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml index 50be0ac1a1..0a5930c820 100644 --- a/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/inventory_list_item.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <inventory_list_item - height="0" - layout="topleft" - left="0" - name="inventory_list_item" - top="0" - width="0"> + follows="top|right|left" + height="20" + name="inventory_item" + tab_stop="false" + hover_image="ListItem_Over" + selected_image="ListItem_Select" + separator_image="Wearables_Divider" + width="380"> <!-- DEFAULT style for inventory list item --> <default_style font="SansSerifSmall" @@ -16,4 +18,25 @@ font="SansSerifSmall" font.style="BOLD" color="EmphasisColor" /> + <item_icon + height="16" + follows="top|left" + image_name="Inv_Object" + layout="topleft" + left="0" + name="item_icon" + top="0" + width="16" /> + <item_name + follows="left|right" + height="20" + layout="topleft" + left="21" + allow_html="false" + use_ellipses="true" + name="item_name" + text_color="white" + top="4" + value="..." + width="359" /> </inventory_list_item> |