diff options
53 files changed, 657 insertions, 397 deletions
diff --git a/autobuild.xml b/autobuild.xml index d381035248..c6e1a425d5 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -138,9 +138,9 @@ <key>archive</key> <map> <key>hash</key> - <string>e6caaeea16131e1f2343ecd7765e3147</string> + <string>6299f1fd01147820e05195b84a3fe1d7</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-darwin-20110217.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/233053/arch/Darwin/installer/ares-1.7.4-darwin-20110616.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -150,9 +150,9 @@ <key>archive</key> <map> <key>hash</key> - <string>0745872db83d45f4ab3bdc697d98e264</string> + <string>b62efd5a68e5dd38314f60a20e651d43</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/223275/arch/Linux/installer/ares-1.7.1-linux-20110310.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/233053/arch/Linux/installer/ares-1.7.4-linux-20110616.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -162,9 +162,9 @@ <key>archive</key> <map> <key>hash</key> - <string>1dcec6babd249a2597114d4ac226c461</string> + <string>c2f4ea23619f3d453e799d6e89ff6930</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/220963/arch/CYGWIN/installer/ares-1.7.1-windows-20110211.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/233053/arch/CYGWIN/installer/ares-1.7.4-windows-20110616.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -282,9 +282,9 @@ <key>archive</key> <map> <key>hash</key> - <string>aaea644191807f51051cefa2fac11069</string> + <string>463e4cc99ec8659eeee518beb41f31b6</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-darwin-20110316.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/236200/arch/Darwin/installer/curl-7.21.1-darwin-20110719.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -306,9 +306,9 @@ <key>archive</key> <map> <key>hash</key> - <string>fea96aa2a7d513397317194f3d6c979b</string> + <string>23d603a7bb864d0a8b6001f19a1b7335</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-windows-20110211.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/236200/arch/CYGWIN/installer/curl-7.21.1-windows-20110719.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1206,9 +1206,9 @@ <key>archive</key> <map> <key>hash</key> - <string>a7c80fd8516df3b879b669b2b220067f</string> + <string>c6c28da2f262b4a146a90724b635f13f</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/232420/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20110608.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/236284/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20110720.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1218,9 +1218,9 @@ <key>archive</key> <map> <key>hash</key> - <string>c05a33ee8b6f253b5a744596dfc3707d</string> + <string>67505bb5e72ed5912c818d506e9eac22</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-qt4.6-20101013.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/236284/arch/Linux/installer/llqtwebkit-4.7.1-linux-20110720.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1230,9 +1230,9 @@ <key>archive</key> <map> <key>hash</key> - <string>b9cc0333cc274c9cc40256ab7146b4fc</string> + <string>433e15cbb4d59aae9be10c18d19b094e</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/232420/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20110608.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/236284/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20110720.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1359,36 +1359,26 @@ </map> </map> </map> - <key>openSSL</key> + <key>openal_soft</key> <map> <key>license</key> - <string>openSSL</string> + <string>lgpl</string> <key>license_file</key> - <string>LICENSES/openssl.txt</string> + <string>LICENSES/OPENAL.txt</string> <key>name</key> - <string>openSSL</string> + <string>openal_soft</string> <key>platforms</key> <map> - <key>darwin</key> - <map> - <key>archive</key> - <map> - <key>hash</key> - <string>facee34b8bd57ad602157e65a5af1a49</string> - <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openssl-0.9.8q-darwin-20110211.tar.bz2</string> - </map> - <key>name</key> - <string>darwin</string> - </map> <key>linux</key> <map> <key>archive</key> <map> <key>hash</key> - <string>3d40be8566fa4b9df9a38e2a0f9ea467</string> + <string>fccdca18a950ac9363c6fb39118b80e1</string> + <key>hash_algorithm</key> + <string>md5</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/226882/arch/Linux/installer/openssl-1.0.0d-linux-20110418.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-3ad86a1c-linux-20110114.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1398,35 +1388,47 @@ <key>archive</key> <map> <key>hash</key> - <string>774c7f0a0312bee3054757a623e227bc</string> + <string>04df406f3e5d04cf176660bdac66c3a1</string> <key>url</key> - <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/220986/arch/CYGWIN/installer/openssl-0.9.8q-windows-20110211.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-1.12.854-1.1.0-windows-20110301.tar.bz2</string> </map> <key>name</key> <string>windows</string> </map> </map> + <key>version</key> + <string>3ad86a1c</string> </map> - <key>openal_soft</key> + <key>openjpeg</key> <map> <key>license</key> - <string>lgpl</string> + <string>openjpeg</string> <key>license_file</key> - <string>LICENSES/OPENAL.txt</string> + <string>LICENSES/openjpeg.txt</string> <key>name</key> - <string>openal_soft</string> + <string>openjpeg</string> <key>platforms</key> <map> + <key>darwin</key> + <map> + <key>archive</key> + <map> + <key>hash</key> + <string>4be51c7cca7d84831e30b63279df7ae5</string> + <key>url</key> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-darwin-20110302.tar.bz2</string> + </map> + <key>name</key> + <string>darwin</string> + </map> <key>linux</key> <map> <key>archive</key> <map> <key>hash</key> - <string>fccdca18a950ac9363c6fb39118b80e1</string> - <key>hash_algorithm</key> - <string>md5</string> + <string>fb2382014c79e0049746e4e29bd834f9</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-3ad86a1c-linux-20110114.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-linux-20110314.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1436,25 +1438,23 @@ <key>archive</key> <map> <key>hash</key> - <string>04df406f3e5d04cf176660bdac66c3a1</string> + <string>ca5765af55f798724d601720afdf6953</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-1.12.854-1.1.0-windows-20110301.tar.bz2</string> + <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-windows-20110302.tar.bz2</string> </map> <key>name</key> <string>windows</string> </map> </map> - <key>version</key> - <string>3ad86a1c</string> </map> - <key>openjpeg</key> + <key>openssl</key> <map> <key>license</key> - <string>openjpeg</string> + <string>openssl</string> <key>license_file</key> - <string>LICENSES/openjpeg.txt</string> + <string>LICENSES/openssl.txt</string> <key>name</key> - <string>openjpeg</string> + <string>openssl</string> <key>platforms</key> <map> <key>darwin</key> @@ -1462,9 +1462,9 @@ <key>archive</key> <map> <key>hash</key> - <string>4be51c7cca7d84831e30b63279df7ae5</string> + <string>1aecd89fee54741f2c4fd65c082d2604</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-darwin-20110302.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/227862/arch/Darwin/installer/openssl-1.0.0d-darwin-20110427.tar.bz2</string> </map> <key>name</key> <string>darwin</string> @@ -1474,9 +1474,9 @@ <key>archive</key> <map> <key>hash</key> - <string>fb2382014c79e0049746e4e29bd834f9</string> + <string>eab3a49d1ef77a651a3896d1d4864a78</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-linux-20110314.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/227862/arch/Linux/installer/openssl-1.0.0d-linux-20110427.tar.bz2</string> </map> <key>name</key> <string>linux</string> @@ -1486,9 +1486,9 @@ <key>archive</key> <map> <key>hash</key> - <string>ca5765af55f798724d601720afdf6953</string> + <string>8ba049ecc76bb1adf3ab3e5bad64c39e</string> <key>url</key> - <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-windows-20110302.tar.bz2</string> + <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/227862/arch/CYGWIN/installer/openssl-1.0.0d-windows-20110427.tar.bz2</string> </map> <key>name</key> <string>windows</string> @@ -1907,12 +1907,12 @@ <map> <key>build</key> <map> + <key>command</key> + <string>xcodebuild</string> <key>filters</key> <array> <string>setenv</string> </array> - <key>command</key> - <string>xcodebuild</string> <key>options</key> <array> <string>-configuration Debug</string> @@ -1961,12 +1961,12 @@ <map> <key>build</key> <map> + <key>command</key> + <string>xcodebuild</string> <key>filters</key> <array> <string>setenv</string> </array> - <key>command</key> - <string>xcodebuild</string> <key>options</key> <array> <string>-configuration RelWithDebInfo</string> @@ -2017,12 +2017,12 @@ <map> <key>build</key> <map> + <key>command</key> + <string>xcodebuild</string> <key>filters</key> <array> <string>setenv</string> </array> - <key>command</key> - <string>xcodebuild</string> <key>options</key> <array> <string>-configuration Release</string> diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake index 5982ee9a49..dc50b1b8e7 100644 --- a/indra/cmake/OpenSSL.cmake +++ b/indra/cmake/OpenSSL.cmake @@ -7,7 +7,7 @@ set(OpenSSL_FIND_REQUIRED ON) if (STANDALONE) include(FindOpenSSL) else (STANDALONE) - use_prebuilt_binary(openSSL) + use_prebuilt_binary(openssl) if (WINDOWS) set(OPENSSL_LIBRARIES ssleay32 libeay32) else (WINDOWS) diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp index bd594b06cf..1dfc194d7c 100644 --- a/indra/llcommon/llfasttimer_class.cpp +++ b/indra/llcommon/llfasttimer_class.cpp @@ -228,6 +228,13 @@ void LLFastTimer::DeclareTimer::updateCachedPointers() // update cached pointer it->mFrameState = &it->mTimer.getFrameState(); } + // also update frame states of timers on stack + LLFastTimer* cur_timerp = LLFastTimer::sCurTimerData.mCurTimer; + while(cur_timerp->mLastTimerData.mCurTimer != cur_timerp) + { + cur_timerp->mFrameState = &cur_timerp->mFrameState->mTimer->getFrameState(); + cur_timerp = cur_timerp->mLastTimerData.mCurTimer; + } } //static diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 0bbdcfd6ff..673494820f 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -29,6 +29,7 @@ set(llui_SOURCE_FILES llaccordionctrl.cpp llaccordionctrltab.cpp llbadge.cpp + llbadgeholder.cpp llbadgeowner.cpp llbutton.cpp llcheckboxctrl.cpp @@ -123,6 +124,7 @@ set(llui_HEADER_FILES llaccordionctrl.h llaccordionctrltab.h llbadge.h + llbadgeholder.h llbadgeowner.h llbutton.h llcallbackmap.h diff --git a/indra/llui/llbadge.cpp b/indra/llui/llbadge.cpp index c28a947a7f..fde3c53a65 100644 --- a/indra/llui/llbadge.cpp +++ b/indra/llui/llbadge.cpp @@ -43,6 +43,8 @@ LLBadge::Params::Params() , image_color("image_color") , label("label") , label_color("label_color") + , label_offset_horiz("label_offset_horiz") + , label_offset_vert("label_offset_vert") , location("location", LLRelPos::TOP_LEFT) , location_percent_hcenter("location_percent_hcenter") , location_percent_vcenter("location_percent_vcenter") @@ -65,6 +67,8 @@ bool LLBadge::Params::equals(const Params& a) const comp &= (image_color() == a.image_color()); comp &= (label() == a.label()); comp &= (label_color() == a.label_color()); + comp &= (label_offset_horiz() == a.label_offset_horiz()); + comp &= (label_offset_vert() == a.label_offset_vert()); comp &= (location() == a.location()); comp &= (location_percent_hcenter() == a.location_percent_hcenter()); comp &= (location_percent_vcenter() == a.location_percent_vcenter()); @@ -84,6 +88,8 @@ LLBadge::LLBadge(const LLBadge::Params& p) , mImageColor(p.image_color) , mLabel(p.label) , mLabelColor(p.label_color) + , mLabelOffsetHoriz(p.label_offset_horiz) + , mLabelOffsetVert(p.label_offset_vert) , mLocation(p.location) , mLocationPercentHCenter(0.5f) , mLocationPercentVCenter(0.5f) @@ -131,6 +137,18 @@ LLBadge::~LLBadge() { } +bool LLBadge::addToView(LLView * view) +{ + bool child_added = view->addChild(this); + + if (child_added) + { + setShape(view->getLocalRect()); + } + + return child_added; +} + void LLBadge::setLabel(const LLStringExplicit& label) { mLabel = label; @@ -241,8 +259,10 @@ void LLBadge::draw() // Draw the label // - mGLFont->render(badge_label_wstring, badge_label_begin_offset, - badge_center_x, badge_center_y, + mGLFont->render(badge_label_wstring, + badge_label_begin_offset, + badge_center_x + mLabelOffsetHoriz, + badge_center_y + mLabelOffsetVert, mLabelColor % alpha, LLFontGL::HCENTER, LLFontGL::VCENTER, // centered around the position LLFontGL::NORMAL, // normal text (not bold, italics, etc.) diff --git a/indra/llui/llbadge.h b/indra/llui/llbadge.h index 0f923ef01b..f81ccdf0cd 100644 --- a/indra/llui/llbadge.h +++ b/indra/llui/llbadge.h @@ -104,6 +104,9 @@ public: Optional< std::string > label; Optional< LLUIColor > label_color; + Optional< S32 > label_offset_horiz; + Optional< S32 > label_offset_vert; + Optional< LLRelPos::Location > location; Optional< U32 > location_percent_hcenter; Optional< U32 > location_percent_vcenter; @@ -123,7 +126,9 @@ protected: public: ~LLBadge(); - + + bool addToView(LLView * view); + virtual void draw(); const std::string getLabel() const { return wstring_to_utf8str(mLabel); } @@ -141,6 +146,9 @@ private: LLUIString mLabel; LLUIColor mLabelColor; + S32 mLabelOffsetHoriz; + S32 mLabelOffsetVert; + LLRelPos::Location mLocation; F32 mLocationPercentHCenter; F32 mLocationPercentVCenter; diff --git a/indra/llui/llbadgeholder.cpp b/indra/llui/llbadgeholder.cpp new file mode 100644 index 0000000000..1f786f36ae --- /dev/null +++ b/indra/llui/llbadgeholder.cpp @@ -0,0 +1,45 @@ +/** + * @file llbadgeholder.cpp + * @brief Source for badge holders + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llbadgeholder.h" + +#include "llbadge.h" +#include "llview.h" + + +bool LLBadgeHolder::addBadge(LLBadge * badge) +{ + bool badge_added = false; + + LLView * this_view = dynamic_cast<LLView *>(this); + + if (this_view && mAcceptsBadge) + { + badge_added = badge->addToView(this_view); + } + + return badge_added; +} diff --git a/indra/llui/llbadgeholder.h b/indra/llui/llbadgeholder.h new file mode 100644 index 0000000000..2538eaae91 --- /dev/null +++ b/indra/llui/llbadgeholder.h @@ -0,0 +1,56 @@ +/** + * @file llbadgeholder.h + * @brief Header for badge holders + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLBADGEHOLDER_H +#define LL_LLBADGEHOLDER_H + +// +// Classes +// + +class LLBadge; + +class LLBadgeHolder +{ +public: + + LLBadgeHolder(bool acceptsBadge) + : mAcceptsBadge(acceptsBadge) + { + } + + void setAcceptsBadge(bool acceptsBadge) { mAcceptsBadge = acceptsBadge; } + bool acceptsBadge() const { return mAcceptsBadge; } + + virtual bool addBadge(LLBadge * badge); + +private: + + bool mAcceptsBadge; + +}; + +#endif // LL_LLBADGEHOLDER_H diff --git a/indra/llui/llbadgeowner.cpp b/indra/llui/llbadgeowner.cpp index 77f15567bf..1860a05edd 100644 --- a/indra/llui/llbadgeowner.cpp +++ b/indra/llui/llbadgeowner.cpp @@ -26,6 +26,7 @@ #include "linden_common.h" +#include "llbadgeholder.h" #include "llbadgeowner.h" #include "llpanel.h" @@ -81,40 +82,44 @@ void LLBadgeOwner::setBadgeVisibility(bool visible) } } -void LLBadgeOwner::addBadgeToParentPanel() +bool LLBadgeOwner::addBadgeToParentPanel() { + bool badge_added = false; + LLView * owner_view = mBadgeOwnerView.get(); if (mBadge && owner_view) { - // Badge parent is badge owner by default - LLView * badge_parent = owner_view; + LLBadgeHolder * badge_holder = NULL; - // Find the appropriate parent for the badge + // Find the appropriate holder for the badge LLView * parent = owner_view->getParent(); while (parent) { - LLPanel * parent_panel = dynamic_cast<LLPanel *>(parent); + LLBadgeHolder * badge_holder_panel = dynamic_cast<LLBadgeHolder *>(parent); - if (parent_panel && parent_panel->acceptsBadge()) + if (badge_holder_panel && badge_holder_panel->acceptsBadge()) { - badge_parent = parent; + badge_holder = badge_holder_panel; break; } parent = parent->getParent(); } - if (badge_parent) + if (badge_holder) { - badge_parent->addChild(mBadge); + badge_added = badge_holder->addBadge(mBadge); } else { - llwarns << "Unable to find parent panel for badge " << mBadge->getName() << " on " << owner_view->getName() << llendl; + // Badge parent is fallback badge owner if no valid holder exists in the hierarchy + badge_added = mBadge->addToView(owner_view); } } + + return badge_added; } LLBadge* LLBadgeOwner::createBadge(const LLBadge::Params& p) diff --git a/indra/llui/llbadgeowner.h b/indra/llui/llbadgeowner.h index a2399189a5..8d03e30645 100644 --- a/indra/llui/llbadgeowner.h +++ b/indra/llui/llbadgeowner.h @@ -41,7 +41,7 @@ public: LLBadgeOwner(LLHandle< LLView > viewHandle); void initBadgeParams(const LLBadge::Params& p); - void addBadgeToParentPanel(); + bool addBadgeToParentPanel(); bool badgeHasParent() const { return (mBadge && mBadge->getParent()); } diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 5b7b020881..9aae1afc62 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -253,7 +253,7 @@ public: LLHandle<LLFloater> getHandle() const { return mHandle; } const LLSD& getKey() { return mKey; } - BOOL matchesKey(const LLSD& key) { return mSingleInstance || KeyCompare::equate(key, mKey); } + virtual bool matchesKey(const LLSD& key) { return mSingleInstance || KeyCompare::equate(key, mKey); } const std::string& getInstanceName() { return mInstanceName; } diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index 4677d535db..f5e6444287 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -129,7 +129,10 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key) } // Note: key should eventually be a non optional LLFloater arg; for now, set mKey to be safe - res->mKey = key; + if (res->mKey.isUndefined()) + { + res->mKey = key; + } res->setInstanceName(name); res->applySavedVariables(); // Can't apply rect and dock state until setting instance name if (res->mAutoTile && !res->getHost() && index > 0) @@ -221,7 +224,7 @@ LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, LLFloater* instance = getInstance(name, key); if (instance) { - instance->openFloater(key); + instance->openFloater(instance->mKey); if (focus) instance->setFocus(TRUE); } diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 1dcdd79efa..775db6bc9d 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -99,6 +99,7 @@ LLPanel::Params::Params() LLPanel::LLPanel(const LLPanel::Params& p) : LLUICtrl(p), + LLBadgeHolder(p.accepts_badge), mBgVisible(p.background_visible), mBgOpaque(p.background_opaque), mBgOpaqueColor(p.bg_opaque_color()), @@ -114,8 +115,7 @@ LLPanel::LLPanel(const LLPanel::Params& p) mCommitCallbackRegistrar(false), mEnableCallbackRegistrar(false), mXMLFilename(p.filename), - mVisibleSignal(NULL), - mAcceptsBadge(p.accepts_badge) + mVisibleSignal(NULL) // *NOTE: Be sure to also change LLPanel::initFromParams(). We have too // many classes derived from LLPanel to retrofit them all to pass in params. { @@ -488,7 +488,7 @@ void LLPanel::initFromParams(const LLPanel::Params& p) mBgOpaqueImageOverlay = p.bg_opaque_image_overlay; mBgAlphaImageOverlay = p.bg_alpha_image_overlay; - mAcceptsBadge = p.accepts_badge; + setAcceptsBadge(p.accepts_badge); } static LLFastTimer::DeclareTimer FTM_PANEL_SETUP("Panel Setup"); diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index 67674fab7e..1b777ee1cb 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -35,6 +35,7 @@ #include "lluiimage.h" #include "lluistring.h" #include "v4color.h" +#include "llbadgeholder.h" #include <list> #include <queue> @@ -51,7 +52,7 @@ class LLUIImage; * With or without border, * Can contain LLUICtrls. */ -class LLPanel : public LLUICtrl +class LLPanel : public LLUICtrl, public LLBadgeHolder { public: struct LocalizedString : public LLInitParam::Block<LocalizedString> @@ -252,8 +253,6 @@ public: boost::signals2::connection setVisibleCallback( const commit_signal_t::slot_type& cb ); - bool acceptsBadge() const { return mAcceptsBadge; } - protected: // Override to set not found list LLButton* getDefaultButton() { return mDefaultBtn; } @@ -268,7 +267,6 @@ protected: static factory_stack_t sFactoryStack; private: - bool mAcceptsBadge; BOOL mBgVisible; // any background at all? BOOL mBgOpaque; // use opaque color or image LLUIColor mBgOpaqueColor; diff --git a/indra/llui/llsdparam.h b/indra/llui/llsdparam.h index 69dab2b411..f776c781b3 100644 --- a/indra/llui/llsdparam.h +++ b/indra/llui/llsdparam.h @@ -93,8 +93,17 @@ class LLSDParamAdapter : public T LLParamSDParser parser; parser.readSD(sd, *this); } + + operator LLSD() const + { + LLParamSDParser parser; + LLSD sd; + parser.writeSD(sd, *this); + return sd; + } LLSDParamAdapter(const T& val) + : T(val) { T::operator=(val); } diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 8020ca802b..bc2432f6f7 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -2082,7 +2082,7 @@ namespace LLInitParam alpha("alpha"), control("") { - updateBlockFromValue(); + updateBlockFromValue(false); } void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock() @@ -2097,14 +2097,14 @@ namespace LLInitParam } } - void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue() + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue(bool make_block_authoritative) { LLColor4 color = getValue(); - red.set(color.mV[VRED], false); - green.set(color.mV[VGREEN], false); - blue.set(color.mV[VBLUE], false); - alpha.set(color.mV[VALPHA], false); - control.set("", false); + red.set(color.mV[VRED], make_block_authoritative); + green.set(color.mV[VGREEN], make_block_authoritative); + blue.set(color.mV[VBLUE], make_block_authoritative); + alpha.set(color.mV[VALPHA], make_block_authoritative); + control.set("", make_block_authoritative); } bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b) @@ -2124,7 +2124,7 @@ namespace LLInitParam updateValue(LLFontGL::getFontDefault()); } addSynonym(name, ""); - updateBlockFromValue(); + updateBlockFromValue(false); } void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock() @@ -2150,13 +2150,13 @@ namespace LLInitParam } } - void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue() + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue(bool make_block_authoritative) { if (getValue()) { - name.set(LLFontGL::nameFromFont(getValue()), false); - size.set(LLFontGL::sizeFromFont(getValue()), false); - style.set(LLFontGL::getStringFromStyle(getValue()->getFontDesc().getStyle()), false); + name.set(LLFontGL::nameFromFont(getValue()), make_block_authoritative); + size.set(LLFontGL::sizeFromFont(getValue()), make_block_authoritative); + style.set(LLFontGL::getStringFromStyle(getValue()->getFontDesc().getStyle()), make_block_authoritative); } } @@ -2169,7 +2169,7 @@ namespace LLInitParam width("width"), height("height") { - updateBlockFromValue(); + updateBlockFromValue(false); } void ParamValue<LLRect, TypeValues<LLRect> >::updateValueFromBlock() @@ -2236,19 +2236,19 @@ namespace LLInitParam updateValue(rect); } - void ParamValue<LLRect, TypeValues<LLRect> >::updateBlockFromValue() + void ParamValue<LLRect, TypeValues<LLRect> >::updateBlockFromValue(bool make_block_authoritative) { // because of the ambiguity in specifying a rect by position and/or dimensions - // we clear the "provided" flag so that values from xui/etc have priority - // over those calculated from the rect object - + // we use the lowest priority pairing so that any valid pairing in xui + // will override those calculated from the rect object + // in this case, that is left+width and bottom+height LLRect& value = getValue(); - left.set(value.mLeft, false); - right.set(value.mRight, false); - bottom.set(value.mBottom, false); - top.set(value.mTop, false); - width.set(value.getWidth(), false); - height.set(value.getHeight(), false); + + left.set(value.mLeft, make_block_authoritative); + width.set(value.getWidth(), make_block_authoritative); + + bottom.set(value.mBottom, make_block_authoritative); + height.set(value.getHeight(), make_block_authoritative); } ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::ParamValue(const LLCoordGL& coord) @@ -2256,7 +2256,7 @@ namespace LLInitParam x("x"), y("y") { - updateBlockFromValue(); + updateBlockFromValue(false); } void ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::updateValueFromBlock() @@ -2264,10 +2264,10 @@ namespace LLInitParam updateValue(LLCoordGL(x, y)); } - void ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::updateBlockFromValue() + void ParamValue<LLCoordGL, TypeValues<LLCoordGL> >::updateBlockFromValue(bool make_block_authoritative) { - x.set(getValue().mX, false); - y.set(getValue().mY, false); + x.set(getValue().mX, make_block_authoritative); + y.set(getValue().mY, make_block_authoritative); } diff --git a/indra/llui/llui.h b/indra/llui/llui.h index c583d58d5a..4e622033b3 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -408,7 +408,7 @@ namespace LLInitParam ParamValue(const LLRect& value); void updateValueFromBlock(); - void updateBlockFromValue(); + void updateBlockFromValue(bool make_block_authoritative); }; template<> @@ -426,7 +426,7 @@ namespace LLInitParam ParamValue(const LLUIColor& color); void updateValueFromBlock(); - void updateBlockFromValue(); + void updateBlockFromValue(bool make_block_authoritative); }; template<> @@ -441,7 +441,7 @@ namespace LLInitParam ParamValue(const LLFontGL* value); void updateValueFromBlock(); - void updateBlockFromValue(); + void updateBlockFromValue(bool make_block_authoritative); }; template<> @@ -480,7 +480,7 @@ namespace LLInitParam ParamValue(const LLCoordGL& val); void updateValueFromBlock(); - void updateBlockFromValue(); + void updateBlockFromValue(bool make_block_authoritative); }; } diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp index f37947a50b..1d9ce29ba9 100644 --- a/indra/llui/lluiimage.cpp +++ b/indra/llui/lluiimage.cpp @@ -172,15 +172,15 @@ namespace LLInitParam } } - void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue() + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue(bool make_block_authoritative) { if (getValue() == NULL) { - name.set("none", false); + name.set("none", make_block_authoritative); } else { - name.set(getValue()->getName(), false); + name.set(getValue()->getName(), make_block_authoritative); } } diff --git a/indra/llui/lluiimage.h b/indra/llui/lluiimage.h index 139d88e0ac..f07e8fa746 100644 --- a/indra/llui/lluiimage.h +++ b/indra/llui/lluiimage.h @@ -103,12 +103,12 @@ namespace LLInitParam ParamValue(LLUIImage* const& image) : super_t(image) { - updateBlockFromValue(); + updateBlockFromValue(false); addSynonym(name, "name"); } void updateValueFromBlock(); - void updateBlockFromValue(); + void updateBlockFromValue(bool make_block_authoritative); }; // Need custom comparison function for our test app, which only loads diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp index 26b3b17577..d522123260 100644 --- a/indra/llui/tests/llurlentry_stub.cpp +++ b/indra/llui/tests/llurlentry_stub.cpp @@ -137,7 +137,7 @@ namespace LLInitParam void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock() {} - void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue() + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue(bool) {} bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b) @@ -152,7 +152,7 @@ namespace LLInitParam void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock() {} - void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue() + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue(bool) {} void TypeValues<LLFontGL::HAlign>::declareValues() @@ -167,7 +167,7 @@ namespace LLInitParam void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock() {} - void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue() + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue(bool) {} diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp index 3cd61e574e..fb6a2eabf1 100644 --- a/indra/llui/tests/llurlmatch_test.cpp +++ b/indra/llui/tests/llurlmatch_test.cpp @@ -111,7 +111,7 @@ namespace LLInitParam void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateValueFromBlock() {} - void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue() + void ParamValue<LLUIColor, TypeValues<LLUIColor> >::updateBlockFromValue(bool) {} bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b) @@ -127,7 +127,7 @@ namespace LLInitParam void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateValueFromBlock() {} - void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue() + void ParamValue<const LLFontGL*, TypeValues<const LLFontGL*> >::updateBlockFromValue(bool) {} void TypeValues<LLFontGL::HAlign>::declareValues() @@ -142,7 +142,7 @@ namespace LLInitParam void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateValueFromBlock() {} - void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue() + void ParamValue<LLUIImage*, TypeValues<LLUIImage*> >::updateBlockFromValue(bool) {} bool ParamCompare<LLUIImage*, false>::equals( diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 35c889b69f..194ef8af6a 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -740,7 +740,6 @@ namespace LLInitParam if (src_typed_param.isProvided() && (overwrite || !dst_typed_param.isProvided())) { - dst_typed_param.clearValueName(); dst_typed_param.set(src_typed_param.getValue()); return true; } @@ -1744,39 +1743,35 @@ namespace LLInitParam : mValue(value), mValueAge(VALUE_AUTHORITATIVE), mKeyVersion(0), - mValidatedVersion(-1) + mValidatedVersion(-1), + mValidated(false) {} bool deserializeBlock(Parser& parser, Parser::name_stack_range_t name_stack, S32 generation) { derived_t& typed_param = static_cast<derived_t&>(*this); - // type to apply parse direct value T + // try to parse direct value T if (name_stack.first == name_stack.second) { if(parser.readValue(typed_param.mValue)) { - typed_param.clearValueName(); typed_param.mValueAge = VALUE_AUTHORITATIVE; - typed_param.updateBlockFromValue(); + typed_param.updateBlockFromValue(false); + + typed_param.clearValueName(); return true; } } // fall back on parsing block components for T - // if we deserialized at least one component... - if (typed_param.BaseBlock::deserializeBlock(parser, name_stack, generation)) - { - return true; - } - - return false; + return typed_param.BaseBlock::deserializeBlock(parser, name_stack, generation); } void serializeBlock(Parser& parser, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const { - const self_t& typed_param = static_cast<const self_t&>(*this); - const self_t* diff_param = static_cast<const self_t*>(diff_block); + const derived_t& typed_param = static_cast<const derived_t&>(*this); + const derived_t* diff_param = static_cast<const derived_t*>(diff_block); std::string key = typed_param.getValueName(); @@ -1801,7 +1796,20 @@ namespace LLInitParam // be exported as <color green="1"/>, since it was probably the intent of the user to // be specific about the RGB color values. This also fixes an issue where we distinguish // between rect.left not being provided and rect.left being explicitly set to 0 (same as default) - block_t::serializeBlock(parser, name_stack, NULL); + + if (typed_param.mValueAge == VALUE_AUTHORITATIVE) + { + // if the value is authoritative but the parser doesn't accept the value type + // go ahead and make a copy, and splat the value out to its component params + // and serialize those params + derived_t copy(typed_param); + copy.updateBlockFromValue(true); + copy.block_t::serializeBlock(parser, name_stack, NULL); + } + else + { + block_t::serializeBlock(parser, name_stack, NULL); + } } } } @@ -1850,7 +1858,7 @@ namespace LLInitParam { BaseBlock::paramChanged(changed_param, user_provided); if (user_provided) - { + { // a parameter changed, so our value is out of date mValueAge = VALUE_NEEDS_UPDATE; } @@ -1863,7 +1871,7 @@ namespace LLInitParam mValueAge = VALUE_AUTHORITATIVE; mValue = val; typed_param.clearValueName(); - static_cast<derived_t*>(const_cast<self_t*>(this))->updateBlockFromValue(); + static_cast<derived_t*>(this)->updateBlockFromValue(false); } value_assignment_t getValue() const @@ -1918,7 +1926,6 @@ namespace LLInitParam mutable bool mValidated; // lazy validation flag private: - mutable T mValue; mutable EValueAge mValueAge; }; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 58b0879fde..ba4a11f0b9 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -16,8 +16,10 @@ <key>AFKTimeout</key> <map> <key>Comment</key> - <string>Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never). - Valid values are: 0, 120, 300, 600, 1800</string> + <string> + Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never). + Valid values are: 0, 120, 300, 600, 1800 +</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -4444,17 +4446,6 @@ <key>Value</key> <real>2.0</real> </map> - <key>LastInventoryInboxExpand</key> - <map> - <key>Comment</key> - <string>The last time the received items inbox was expanded.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string /> - </map> <key>LCDDestination</key> <map> <key>Comment</key> @@ -6054,10 +6045,12 @@ <key>ToastButtonWidth</key> <map> <key>Comment</key> - <string>Default width of buttons in the toast. + <string> + Default width of buttons in the toast. Notes: If required width will be less then this one, a button will be reshaped to default size , otherwise to required - Change of this parameter will affect the layout of buttons in notification toast.</string> + Change of this parameter will affect the layout of buttons in notification toast. +</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -7349,8 +7342,10 @@ <key>RenderPerformanceTest</key> <map> <key>Comment</key> - <string>Disable rendering of everything but in-world content for - performance testing</string> + <string> + Disable rendering of everything but in-world content for + performance testing +</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -13414,9 +13409,9 @@ <integer>650</integer> <integer>490</integer> <integer>0</integer> - </array> - </map> - <key>HelpFloaterOpen</key> + </array> + </map> + <key>HelpFloaterOpen</key> <map> <key>Comment</key> <string>Show Help Floater on login?</string> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index ff24efaf2c..1142f01232 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -33,6 +33,17 @@ <key>Value</key> <string /> </map> + <key>LastInventoryInboxExpand</key> + <map> + <key>Comment</key> + <string>The last time the received items inbox was expanded.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string /> + </map> <key>LastLogoff</key> <map> <key>Comment</key> diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 8344b08bfb..cd6754facd 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -316,7 +316,11 @@ static void on_avatar_name_show_profile(const LLUUID& agent_id, const LLAvatarNa // PROFILES: open in webkit window const bool show_chrome = false; static LLCachedControl<LLRect> profile_rect(gSavedSettings, "WebProfileRect"); - LLFloaterWebContent::create(url, "", agent_id.asString(), show_chrome, profile_rect); + LLFloaterWebContent::create(LLFloaterWebContent::Params(). + url(url). + id(agent_id). + show_chrome(show_chrome). + preferred_media_size(profile_rect)); } // static @@ -331,7 +335,9 @@ void LLAvatarActions::showProfile(const LLUUID& id) //static bool LLAvatarActions::profileVisible(const LLUUID& id) { - LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("web_content", id.asString())); + LLSD sd; + sd["id"] = id; + LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("web_content", sd)); return browser && browser->isShown(); } @@ -339,7 +345,9 @@ bool LLAvatarActions::profileVisible(const LLUUID& id) //static void LLAvatarActions::hideProfile(const LLUUID& id) { - LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("web_content", id.asString())); + LLSD sd; + sd["id"] = id; + LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("web_content", sd)); if (browser) { browser->closeFloater(); diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index d5806e375c..ce0bba802d 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -70,21 +70,28 @@ public: } // create the LLSD arguments for the search floater - LLSD args; - args["category"] = category; - args["id"] = LLURI::unescape(search_text); + LLFloaterSearch::Params p; + p.category = category; + p.query = LLURI::unescape(search_text); // open the search floater and perform the requested search - LLFloaterReg::showInstance("search", args); + LLFloaterReg::showInstance("search", p); return true; } }; LLSearchHandler gSearchHandler; -LLFloaterSearch::LLFloaterSearch(const LLSD& key) : - LLFloater(key), - LLViewerMediaObserver(), - mBrowser(NULL), +LLFloaterSearch::_Params::_Params() +: category("category", ""), + query("query") +{ + trusted_content = true; + allow_address_entry = false; +} + + +LLFloaterSearch::LLFloaterSearch(const Params& key) : + LLFloaterWebContent(key), mSearchGodLevel(0) { // declare a map that transforms a category name into @@ -102,53 +109,43 @@ LLFloaterSearch::LLFloaterSearch(const LLSD& key) : BOOL LLFloaterSearch::postBuild() { - mBrowser = getChild<LLMediaCtrl>("browser"); - mBrowser->addObserver(this); + LLFloaterWebContent::postBuild(); + mWebBrowser->addObserver(this); return TRUE; } void LLFloaterSearch::onOpen(const LLSD& key) { + LLFloaterWebContent::onOpen(key); search(key); } void LLFloaterSearch::onClose(bool app_quitting) { + LLFloaterWebContent::onClose(app_quitting); // tear down the web view so we don't show the previous search // result when the floater is opened next time destroy(); } -void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event) -{ - switch (event) - { - case MEDIA_EVENT_NAVIGATE_BEGIN: - getChild<LLUICtrl>("status_text")->setValue(getString("loading_text")); - break; - - case MEDIA_EVENT_NAVIGATE_COMPLETE: - getChild<LLUICtrl>("status_text")->setValue(getString("done_text")); - break; - - default: - break; - } -} - void LLFloaterSearch::godLevelChanged(U8 godlevel) { // search results can change based upon god level - if the user // changes god level, then give them a warning (we don't refresh // the search as this might undo any page navigation or // AJAX-driven changes since the last search). - getChildView("refresh_search")->setVisible( (godlevel != mSearchGodLevel)); + + //FIXME: set status bar text + + //getChildView("refresh_search")->setVisible( (godlevel != mSearchGodLevel)); } void LLFloaterSearch::search(const LLSD &key) { - if (! mBrowser) + Params p(key); + + if (! mWebBrowser || !p.validateBlock()) { return; } @@ -159,10 +156,9 @@ void LLFloaterSearch::search(const LLSD &key) // work out the subdir to use based on the requested category LLSD subs; - std::string category = key.has("category") ? key["category"].asString() : ""; - if (mCategoryPaths.has(category)) + if (mCategoryPaths.has(p.category)) { - subs["CATEGORY"] = mCategoryPaths[category].asString(); + subs["CATEGORY"] = mCategoryPaths[p.category].asString(); } else { @@ -170,8 +166,7 @@ void LLFloaterSearch::search(const LLSD &key) } // add the search query string - std::string search_text = key.has("id") ? key["id"].asString() : ""; - subs["QUERY"] = LLURI::escape(search_text); + subs["QUERY"] = LLURI::escape(p.query); // add the permissions token that login.cgi gave us // We use "search_token", and fallback to "auth_token" if not present. @@ -207,5 +202,5 @@ void LLFloaterSearch::search(const LLSD &key) url = LLWeb::expandURLSubstitutions(url, subs); // and load the URL in the web view - mBrowser->navigateTo(url, "text/html"); + mWebBrowser->navigateTo(url, "text/html"); } diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h index ba4dc4c0fa..a4043b2353 100644 --- a/indra/newview/llfloatersearch.h +++ b/indra/newview/llfloatersearch.h @@ -28,7 +28,7 @@ #ifndef LL_LLFLOATERSEARCH_H #define LL_LLFLOATERSEARCH_H -#include "llfloater.h" +#include "llfloaterwebcontent.h" #include "llviewermediaobserver.h" #include <string> @@ -43,11 +43,20 @@ class LLMediaCtrl; /// so that the user can click on teleport links in search results. /// class LLFloaterSearch : - public LLFloater, - public LLViewerMediaObserver + public LLFloaterWebContent { public: - LLFloaterSearch(const LLSD& key); + struct _Params : public LLInitParam::Block<_Params, LLFloaterWebContent::Params> + { + Optional<std::string> category; + Optional<std::string> query; + + _Params(); + }; + + typedef LLSDParamAdapter<_Params> Params; + + LLFloaterSearch(const Params& key); /// show the search floater with a new search /// see search() for details on the key parameter. @@ -70,10 +79,6 @@ public: private: /*virtual*/ BOOL postBuild(); - // inherited from LLViewerMediaObserver - /*virtual*/ void handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event); - - LLMediaCtrl *mBrowser; LLSD mCategoryPaths; U8 mSearchGodLevel; }; diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index 43eecbf048..785441a67e 100644 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -40,8 +40,18 @@ #include "llfloaterwebcontent.h" -LLFloaterWebContent::LLFloaterWebContent( const LLSD& key ) - : LLFloater( key ) +LLFloaterWebContent::_Params::_Params() +: url("url"), + target("target"), + id("id"), + show_chrome("show_chrome", true), + allow_address_entry("allow_address_entry", true), + preferred_media_size("preferred_media_size"), + trusted_content("trusted_content", false) +{} + +LLFloaterWebContent::LLFloaterWebContent( const Params& key ) +: LLFloater( key ) { mCommitCallbackRegistrar.add( "WebContent.Back", boost::bind( &LLFloaterWebContent::onClickBack, this )); mCommitCallbackRegistrar.add( "WebContent.Forward", boost::bind( &LLFloaterWebContent::onClickForward, this )); @@ -75,6 +85,20 @@ BOOL LLFloaterWebContent::postBuild() return TRUE; } +bool LLFloaterWebContent::matchesKey(const LLSD& key) +{ + LLUUID id = key["id"]; + if (id.notNull()) + { + return id == mKey["id"].asUUID(); + } + else + { + return key["target"].asString() == mKey["target"].asString(); + } +} + + void LLFloaterWebContent::initializeURLHistory() { // start with an empty list @@ -99,30 +123,23 @@ void LLFloaterWebContent::initializeURLHistory() } //static -void LLFloaterWebContent::create( const std::string &url, const std::string& target, const std::string& uuid, bool show_chrome, const LLRect& preferred_media_size) +void LLFloaterWebContent::create( Params p) { - lldebugs << "url = " << url << ", target = " << target << ", uuid = " << uuid << llendl; + lldebugs << "url = " << p.url() << ", target = " << p.target() << ", uuid = " << p.id().asString() << llendl; - std::string tag = target; + if (!p.id.isProvided()) + { + p.id = LLUUID::generateNewID(); + } - if(target.empty() || target == "_blank") + if(!p.target.isProvided() || p.target() == "_blank") { - if(!uuid.empty()) - { - tag = uuid; - } - else - { - // create a unique tag for this instance - LLUUID id; - id.generate(); - tag = id.asString(); - } + p.target = p.id().asString(); } S32 browser_window_limit = gSavedSettings.getS32("WebContentWindowLimit"); - if(LLFloaterReg::findInstance("web_content", tag) != NULL) + if(LLFloaterReg::findInstance("web_content", p.target()) != NULL) { // There's already a web browser for this tag, so we won't be opening a new window. } @@ -136,7 +153,7 @@ void LLFloaterWebContent::create( const std::string &url, const std::string& tar for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++) { - lldebugs << " " << (*iter)->getKey() << llendl; + lldebugs << " " << (*iter)->getKey()["target"] << llendl; } if(instances.size() >= (size_t)browser_window_limit) @@ -146,30 +163,7 @@ void LLFloaterWebContent::create( const std::string &url, const std::string& tar } } - LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::showInstance("web_content", tag)); - llassert(browser); - if(browser) - { - browser->mUUID = uuid; - - // tell the browser instance to load the specified URL - browser->open_media(url, target); - LLViewerMedia::proxyWindowOpened(target, uuid); - - browser->getChild<LLLayoutPanel>("status_bar")->setVisible(show_chrome); - browser->getChild<LLLayoutPanel>("nav_controls")->setVisible(show_chrome); - - if (!show_chrome) - { - browser->setResizeLimits(100, 100); - } - - if (!preferred_media_size.isEmpty()) - { - //ignore x, y for now - browser->geometryChanged(browser->getRect().mLeft, browser->getRect().mBottom, preferred_media_size.getWidth(), preferred_media_size.getHeight()); - } - } + LLFloaterReg::showInstance("web_content", p); } //static @@ -227,13 +221,52 @@ void LLFloaterWebContent::geometryChanged(S32 x, S32 y, S32 width, S32 height) setShape(geom); } -void LLFloaterWebContent::open_media(const std::string& web_url, const std::string& target) +void LLFloaterWebContent::open_media(const Params& p) { // Specifying a mime type of text/html here causes the plugin system to skip the MIME type probe and just open a browser plugin. - mWebBrowser->setHomePageUrl(web_url, "text/html"); - mWebBrowser->setTarget(target); - mWebBrowser->navigateTo(web_url, "text/html"); - set_current_url(web_url); + LLViewerMedia::proxyWindowOpened(p.target(), p.id().asString()); + mWebBrowser->setHomePageUrl(p.url, "text/html"); + mWebBrowser->setTarget(p.target); + mWebBrowser->navigateTo(p.url, "text/html"); + + set_current_url(p.url); + + getChild<LLLayoutPanel>("status_bar")->setVisible(p.show_chrome); + getChild<LLLayoutPanel>("nav_controls")->setVisible(p.show_chrome); + getChild<LLUICtrl>("address")->setEnabled(p.allow_address_entry && !p.trusted_content); + + if (!p.show_chrome) + { + setResizeLimits(100, 100); + } + + if (!p.preferred_media_size().isEmpty()) + { + //ignore x, y for now + geometryChanged(getRect().mLeft, getRect().mBottom, p.preferred_media_size().getWidth(), p.preferred_media_size().getHeight()); + } + +} + +void LLFloaterWebContent::onOpen(const LLSD& key) +{ + Params params(key); + + if (!params.validateBlock()) + { + closeFloater(); + return; + } + + if (params.target() == params.id().asString()) + { + setRectControl(""); + } + mUUID = params.id().asString(); + mWebBrowser->setTrustedContent(params.trusted_content); + + // tell the browser instance to load the specified URL + open_media(params); } //virtual diff --git a/indra/newview/llfloaterwebcontent.h b/indra/newview/llfloaterwebcontent.h index 56b6ef12c8..3a99d49b5a 100644 --- a/indra/newview/llfloaterwebcontent.h +++ b/indra/newview/llfloaterwebcontent.h @@ -29,6 +29,7 @@ #include "llfloater.h" #include "llmediactrl.h" +#include "llsdparam.h" class LLMediaCtrl; class LLComboBox; @@ -42,20 +43,39 @@ class LLFloaterWebContent : { public: LOG_CLASS(LLFloaterWebContent); - LLFloaterWebContent(const LLSD& key); + + struct _Params : public LLInitParam::Block<_Params> + { + Optional<std::string> url, + target; + Optional<LLUUID> id; + Optional<bool> show_chrome, + allow_address_entry, + trusted_content; + Optional<LLRect> preferred_media_size; + + _Params(); + }; + + typedef LLSDParamAdapter<_Params> Params; + + LLFloaterWebContent(const Params& key); void initializeURLHistory(); - static void create(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null, bool show_chrome = true, const LLRect& preferred_media_size = LLRect() ); + static void create(Params); static void closeRequest(const std::string &uuid); static void geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height); void geometryChanged(S32 x, S32 y, S32 width, S32 height); /* virtual */ BOOL postBuild(); + /* virtual */ void onOpen(const LLSD& key); + /* virtual */ bool matchesKey(const LLSD& key); /* virtual */ void onClose(bool app_quitting); /* virtual */ void draw(); +protected: // inherited from LLViewerMediaObserver /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); @@ -66,8 +86,7 @@ public: void onEnterAddress(); void onPopExternal(); -private: - void open_media(const std::string& media_url, const std::string& target); + void open_media(const Params& ); void set_current_url(const std::string& url); LLMediaCtrl* mWebBrowser; diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index e90b6c1c3d..7581fa91c5 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -402,6 +402,16 @@ static LLFastTimer::DeclareTimer FTM_ARRANGE("Arrange"); // This view grows and shinks to enclose all of its children items and folders. S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_generation ) { + if (getListener()->getUUID().notNull()) + { + if (mNeedsSort) + { + mFolders.sort(mSortFunction); + mItems.sort(mSortFunction); + mNeedsSort = false; + } + } + LLFastTimer t2(FTM_ARRANGE); filter_generation = mFilter->getMinRequiredGeneration(); @@ -1916,8 +1926,8 @@ BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, } else { - handled = mFolders.front()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg); - } + handled = mFolders.front()->handleDragAndDropFromChild(mask,drop,cargo_type,cargo_data,accept,tooltip_msg); + } } if (handled) diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 6e4f55fb2f..e2b7c45eab 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -286,7 +286,7 @@ void LLFolderViewItem::refreshFromListener() time_t creation_date = mListener->getCreationDate(); if (mCreationDate != creation_date) { - mCreationDate = mListener->getCreationDate(); + setCreationDate(mListener->getCreationDate()); dirtyFilter(); } if (mRoot->useLabelSuffix()) @@ -2430,7 +2430,7 @@ time_t LLFolderViewFolder::getCreationDate() const if (item_creation_date) { - mCreationDate = item_creation_date; + setCreationDate(item_creation_date); break; } } @@ -2446,7 +2446,7 @@ time_t LLFolderViewFolder::getCreationDate() const if (folder_creation_date) { - mCreationDate = folder_creation_date; + setCreationDate(folder_creation_date); break; } } diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index e2f94a2b63..f70e63ecdf 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -173,6 +173,8 @@ protected: static LLFontGL* getLabelFontForStyle(U8 style); + virtual void setCreationDate(time_t creation_date_utc) const { mCreationDate = creation_date_utc; } + public: BOOL postBuild(); @@ -228,7 +230,7 @@ public: void deselectItem(); // this method is used to select this element - void selectItem(); + virtual void selectItem(); // gets multiple-element selection virtual std::set<LLUUID> getSelectionList() const; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 75d4c4e80d..4ed39da5cb 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2483,8 +2483,6 @@ void LLFolderBridge::staticFolderOptionsMenu() void LLFolderBridge::folderOptionsMenu() { - menuentry_vec_t disabled_items; - LLInventoryModel* model = getInventoryModel(); if(!model) return; @@ -2552,18 +2550,18 @@ void LLFolderBridge::folderOptionsMenu() mItems.push_back(std::string("Remove From Outfit")); if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID)) { - disabled_items.push_back(std::string("Remove From Outfit")); + mDisabledItems.push_back(std::string("Remove From Outfit")); } if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID)) { - disabled_items.push_back(std::string("Replace Outfit")); + mDisabledItems.push_back(std::string("Replace Outfit")); } mItems.push_back(std::string("Outfit Separator")); } LLMenuGL* menup = dynamic_cast<LLMenuGL*>(mMenu.get()); if (menup) { - hide_context_entries(*menup, mItems, disabled_items, TRUE); + hide_context_entries(*menup, mItems, mDisabledItems, TRUE); // Reposition the menu, in case we're adding items to an existing menu. menup->needsArrange(); diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index afaf660cb7..91fdd67806 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -105,7 +105,7 @@ BOOL LLInventoryModelBackgroundFetch::backgroundFetchActive() const void LLInventoryModelBackgroundFetch::start(const LLUUID& cat_id, BOOL recursive) { - if (!mAllFoldersFetched) + if (!mAllFoldersFetched || cat_id.notNull()) { LL_DEBUGS("InventoryFetch") << "Start fetching category: " << cat_id << ", recursive: " << recursive << LL_ENDL; @@ -211,7 +211,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetch() // Double timeouts on failure. mMinTimeBetweenFetches = llmin(mMinTimeBetweenFetches * 2.f, 10.f); mMaxTimeBetweenFetches = llmin(mMaxTimeBetweenFetches * 2.f, 120.f); - llinfos << "Inventory fetch times grown to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; + lldebugs << "Inventory fetch times grown to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; // fetch is no longer considered "timely" although we will wait for full time-out. mTimelyFetchPending = FALSE; } @@ -280,7 +280,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetch() // Shrink timeouts based on success. mMinTimeBetweenFetches = llmax(mMinTimeBetweenFetches * 0.8f, 0.3f); mMaxTimeBetweenFetches = llmax(mMaxTimeBetweenFetches * 0.8f, 10.f); - //llinfos << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; + lldebugs << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; } mTimelyFetchPending = FALSE; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 702e8d5a1f..d5d40ca65d 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -902,6 +902,18 @@ void LLInventoryPanel::onFocusReceived() LLPanel::onFocusReceived(); } +bool LLInventoryPanel::addBadge(LLBadge * badge) +{ + bool badge_added = false; + + if (acceptsBadge()) + { + badge_added = badge->addToView(mFolderRoot); + } + + return badge_added; +} + void LLInventoryPanel::openAllFolders() { mFolderRoot->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index a4287a438e..7676bbb6d7 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -125,6 +125,9 @@ public: /*virtual*/ void onFocusLost(); /*virtual*/ void onFocusReceived(); + // LLBadgeHolder methods + bool addBadge(LLBadge * badge); + // Call this method to set the selection. void openAllFolders(); void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus); diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 03ccabc994..1eb786f433 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -1164,3 +1164,12 @@ void LLMediaCtrl::hideNotification() mWindowShade->hide(); } } + +void LLMediaCtrl::setTrustedContent(bool trusted) +{ + mTrusted = trusted; + if (mMediaSource) + { + mMediaSource->setTrustedBrowser(trusted); + } +} diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 28666e620f..6833453616 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -149,6 +149,8 @@ public: void showNotification(boost::shared_ptr<class LLNotification> notify); void hideNotification(); + void setTrustedContent(bool trusted); + // over-rides virtual BOOL handleKeyHere( KEY key, MASK mask); virtual void handleVisibilityChange ( BOOL new_visibility ); @@ -176,7 +178,7 @@ public: LLViewBorder* mBorder; bool mFrequentUpdates; bool mForceUpdate; - const bool mTrusted; + bool mTrusted; std::string mHomePageUrl; std::string mHomePageMimeType; std::string mCurrentNavUrl; diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index b8832dfd8e..9d54ad7463 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -716,7 +716,7 @@ void LLNavigationBar::handleLoginComplete() void LLNavigationBar::invokeSearch(std::string search_text) { - LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("id", LLSD(search_text))); + LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("query", LLSD(search_text))); } void LLNavigationBar::clearHistoryCache() diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp index af74f8f261..c505ad85a3 100644 --- a/indra/newview/llpanelmarketplaceinbox.cpp +++ b/indra/newview/llpanelmarketplaceinbox.cpp @@ -27,15 +27,14 @@ #include "llviewerprecompiledheaders.h"
#include "llpanelmarketplaceinbox.h"
+#include "llpanelmarketplaceinboxinventory.h"
#include "llappviewer.h"
#include "llbutton.h"
#include "llinventorypanel.h"
#include "llfolderview.h"
#include "llsidepanelinventory.h"
-
-
-#define SUPPORTING_FRESH_ITEM_COUNT 0
+#include "llviewercontrol.h"
static LLRegisterPanelClassWrapper<LLPanelMarketplaceInbox> t_panel_marketplace_inbox("panel_marketplace_inbox");
@@ -54,6 +53,10 @@ LLPanelMarketplaceInbox::LLPanelMarketplaceInbox(const Params& p) LLPanelMarketplaceInbox::~LLPanelMarketplaceInbox()
{
+ if (getChild<LLButton>("inbox_btn")->getToggleState())
+ {
+ gSavedPerAccountSettings.setString("LastInventoryInboxExpand", LLDate::now().asString());
+ }
}
// virtual
@@ -157,10 +160,10 @@ U32 LLPanelMarketplaceInbox::getFreshItemCount() const for (; folders_it != folders_end; ++folders_it)
{
- const LLFolderViewFolder * folder = *folders_it;
+ const LLFolderViewFolder * folder_view = *folders_it;
+ const LLInboxFolderViewFolder * inbox_folder_view = dynamic_cast<const LLInboxFolderViewFolder*>(folder_view);
- // TODO: Replace this check with new "fresh" flag
- if (folder->getCreationDate() > 1500)
+ if (inbox_folder_view && inbox_folder_view->isFresh())
{
fresh_item_count++;
}
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp index b644f0e5cb..2c97d539a1 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.cpp +++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp @@ -141,9 +141,11 @@ LLFolderViewFolder * LLInboxInventoryPanel::createFolderViewFolder(LLInvFVBridge LLInboxFolderViewFolder::LLInboxFolderViewFolder(const Params& p) : LLFolderViewFolder(p) , LLBadgeOwner(getHandle()) - , mFresh(false) + , mFresh(true) { +#if SUPPORTING_FRESH_ITEM_COUNT initBadgeParams(p.new_badge()); +#endif } LLInboxFolderViewFolder::~LLInboxFolderViewFolder() @@ -151,17 +153,56 @@ LLInboxFolderViewFolder::~LLInboxFolderViewFolder() } // virtual +time_t LLInboxFolderViewFolder::getCreationDate() const +{ + time_t ret_val = LLFolderViewFolder::getCreationDate(); + + if (!mCreationDate) + { + updateFlag(); + } + + return ret_val; +} + +// virtual void LLInboxFolderViewFolder::draw() { +#if SUPPORTING_FRESH_ITEM_COUNT if (!badgeHasParent()) { addBadgeToParentPanel(); } setBadgeVisibility(mFresh); +#endif LLFolderViewFolder::draw(); } +void LLInboxFolderViewFolder::updateFlag() const +{ + LLDate saved_freshness_date = LLDate(gSavedPerAccountSettings.getString("LastInventoryInboxExpand")); + mFresh = (mCreationDate > saved_freshness_date.secondsSinceEpoch()); +} + +void LLInboxFolderViewFolder::selectItem() +{ + mFresh = false; + LLFolderViewFolder::selectItem(); +} + +void LLInboxFolderViewFolder::toggleOpen() +{ + mFresh = false; + LLFolderViewFolder::toggleOpen(); +} + +void LLInboxFolderViewFolder::setCreationDate(time_t creation_date_utc) const +{ + mCreationDate = creation_date_utc; + updateFlag(); +} + // eof diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h index 8f198c41c1..8946b9dc98 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.h +++ b/indra/newview/llpanelmarketplaceinboxinventory.h @@ -32,6 +32,11 @@ #include "llinventorypanel.h" #include "llfolderviewitem.h" + +#define SUPPORTING_FRESH_ITEM_COUNT 0 + + + class LLInboxInventoryPanel : public LLInventoryPanel { public: @@ -66,11 +71,21 @@ public: LLInboxFolderViewFolder(const Params& p); ~LLInboxFolderViewFolder(); + + time_t getCreationDate() const; void draw(); + void updateFlag() const; + void selectItem(); + void toggleOpen(); + + bool isFresh() const { return mFresh; } + protected: - bool mFresh; + void setCreationDate(time_t creation_date_utc) const; + + mutable bool mFresh; }; diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 65655f82cd..6f809ba3ca 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -61,8 +61,6 @@ static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_ // Constants // -static const char * const INBOX_EXPAND_TIME_SETTING = "LastInventoryInboxExpand"; - static const char * const INBOX_BUTTON_NAME = "inbox_btn"; static const char * const OUTBOX_BUTTON_NAME = "outbox_btn"; @@ -404,7 +402,7 @@ void LLSidepanelInventory::onInboxChanged(const LLUUID& inbox_id) // Expand the inbox since we have fresh items LLPanelMarketplaceInbox * inbox = findChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL); - if (inbox && (inbox->getFreshItemCount() > 0)) + if (inbox) { getChild<LLButton>(INBOX_BUTTON_NAME)->setToggleState(true); onToggleInboxBtn(); @@ -458,13 +456,9 @@ void LLSidepanelInventory::onToggleInboxBtn() LLButton* otherButton = getChild<LLButton>(OUTBOX_BUTTON_NAME); LLLayoutPanel* otherPanel = getChild<LLLayoutPanel>(OUTBOX_LAYOUT_PANEL_NAME); - bool inboxExpanded = manageInboxOutboxPanels(stack, pressedButton, pressedPanel, otherButton, otherPanel); + manageInboxOutboxPanels(stack, pressedButton, pressedPanel, otherButton, otherPanel); - if (inboxExpanded) - { - // Save current time as a setting for future new-ness tests - gSavedSettings.setString(INBOX_EXPAND_TIME_SETTING, LLDate::now().asString()); - } + gSavedPerAccountSettings.setString("LastInventoryInboxExpand", LLDate::now().asString()); } void LLSidepanelInventory::onToggleOutboxBtn() diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 6ae8e79be4..0e58f54f8b 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -274,7 +274,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>); LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>); LLFloaterReg::add("snapshot", "floater_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSnapshot>); - LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>); + LLFloaterReg::add("search", "floater_web_content.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>); LLFloaterUIPreviewUtil::registerFloater(); LLFloaterReg::add("upload_anim", "floater_animation_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAnimPreview>, "upload"); diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index b73017a51a..e4cdfaaaaf 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -81,19 +81,20 @@ void LLWeb::initClass() // static void LLWeb::loadURL(const std::string& url, const std::string& target, const std::string& uuid) { - if(target == "_internal") - { - // Force load in the internal browser, as if with a blank target. - loadURLInternal(url, "", uuid); - } - else if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external")) - { - loadURLExternal(url); - } - else - { - loadURLInternal(url, target, uuid); - } + loadWebURL(url, target, uuid); + //if(target == "_internal") + //{ + // // Force load in the internal browser, as if with a blank target. + // loadURLInternal(url, "", uuid); + //} + //else if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external")) + //{ + // loadURLExternal(url); + //} + //else + //{ + // loadURLInternal(url, target, uuid); + //} } // static @@ -124,17 +125,15 @@ void LLWeb::loadURLInternal(const std::string &url, const std::string& target, c // Explicitly open a Web URL using the Web content floater void LLWeb::loadWebURLInternal(const std::string &url, const std::string& target, const std::string& uuid) { - LLFloaterWebContent::create(url, target, uuid); + LLFloaterWebContent::create(LLFloaterWebContent::Params().url(url).target(target).id(LLUUID(uuid))); } - // static void LLWeb::loadURLExternal(const std::string& url, const std::string& uuid) { loadURLExternal(url, true, uuid); } - // static void LLWeb::loadURLExternal(const std::string& url, bool async, const std::string& uuid) { diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 8cdb615686..265d5dc801 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1752,13 +1752,13 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask ) case MAP_ITEM_LAND_FOR_SALE_ADULT: { LLFloaterReg::hideInstance("world_map"); - LLFloaterReg::showInstance("search", LLSD().with("category", "destinations").with("id", id)); + LLFloaterReg::showInstance("search", LLSD().with("category", "destinations").with("query", id)); break; } case MAP_ITEM_CLASSIFIED: { LLFloaterReg::hideInstance("world_map"); - LLFloaterReg::showInstance("search", LLSD().with("category", "classifieds").with("id", id)); + LLFloaterReg::showInstance("search", LLSD().with("category", "classifieds").with("query", id)); break; } default: diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 76965ad14b..31b6fc77f5 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -134,7 +134,7 @@ reference="AvatarListItemIconOfflineColor" /> <color name="BadgeImageColor" - value="0.44 0.69 0.56 1.0" /> + value="1.0 0.40 0.0 1.0" /> <color name="BadgeBorderColor" value="0.9 0.9 0.9 1.0" /> diff --git a/indra/newview/skins/default/textures/widgets/Badge_Background_New.png b/indra/newview/skins/default/textures/widgets/Badge_Background_New.png Binary files differnew file mode 100644 index 0000000000..9f114f2e4a --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/Badge_Background_New.png diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml deleted file mode 100644 index 8770ede7e9..0000000000 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ /dev/null @@ -1,71 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="13" - can_resize="true" - height="600" - layout="topleft" - min_height="400" - min_width="450" - name="floater_search" - help_topic="floater_search" - save_rect="true" - save_visibility="true" - single_instance="true" - title="FIND" - width="650"> - <floater.string - name="loading_text"> - Loading... - </floater.string> - <floater.string - name="done_text"> - Done - </floater.string> - <layout_stack - height="580" - follows="left|right|top|bottom" - layout="topleft" - left="10" - name="stack1" - top="20" - width="630"> - <layout_panel - height="570" - layout="topleft" - left_delta="0" - top_delta="0" - name="browser_layout" - user_resize="false" - width="630"> - <web_browser - trusted_content="true" - follows="left|right|top|bottom" - layout="topleft" - left="0" - name="browser" - top="0" - height="540" - width="630" /> - <text - follows="bottom|left" - height="16" - layout="topleft" - left_delta="0" - name="status_text" - top_pad="10" - width="150" /> - <text - visible="false" - follows="bottom|right" - height="16" - left_delta="0" - name="refresh_search" - left_pad="0" - right="-10" - halign="right" - width="450"> - Redo search to reflect current God level - </text> - </layout_panel> - </layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml index 69e6057556..0eda9ae62a 100644 --- a/indra/newview/skins/default/xui/en/floater_web_content.xml +++ b/indra/newview/skins/default/xui/en/floater_web_content.xml @@ -40,6 +40,7 @@ image_disabled_selected="PushButton_Disabled" image_selected="PushButton_Selected" image_unselected="PushButton_Off" + chrome="true" hover_glow_amount="0.15" tool_tip="Navigate back" follows="left|top" @@ -58,6 +59,7 @@ image_disabled_selected="PushButton_Disabled" image_selected="PushButton_Selected" image_unselected="PushButton_Off" + chrome="true" tool_tip="Navigate forward" follows="left|top" height="22" @@ -75,6 +77,7 @@ image_disabled_selected="PushButton_Disabled" image_selected="PushButton_Selected" image_unselected="PushButton_Off" + chrome="true" tool_tip="Stop navigation" enabled="true" follows="left|top" @@ -93,6 +96,7 @@ image_disabled_selected="PushButton_Disabled" image_selected="PushButton_Selected" image_unselected="PushButton_Off" + chrome="true" tool_tip="Reload page" follows="left|top" height="22" @@ -137,6 +141,7 @@ image_disabled_selected="PushButton_Disabled" image_selected="PushButton_Selected" image_unselected="PushButton_Off" + chrome="true" tool_tip="Open current URL in your desktop browser" follows="right|top" enabled="true" diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 661165069e..1bc377126e 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4991,19 +4991,19 @@ Would you like to automatically wear the clothing you are about to create? name="NotAgeVerified" type="alertmodal"> <tag>fail</tag> -You must be age-verified to visit this area. Do you want to go to the [SECOND_LIFE] website and verify your age? +To access adult content and areas in Second Life you must be at least 18 years old. Please visit our age verification page to confirm you are over 18. +Note this will launch your web browser. [_URL] <tag>confirm</tag> <url option="0" name="url"> - - https://secondlife.com/account/verification.php + https://secondlife.com/my/account/verification.php </url> <usetemplate ignoretext="I have not verified my age" name="okcancelignore" - notext="No" - yestext="Yes"/> + notext="Cancel" + yestext="Go to Age Verification"/> </notification> <notification diff --git a/indra/newview/skins/default/xui/en/widgets/badge.xml b/indra/newview/skins/default/xui/en/widgets/badge.xml index f77c4b7178..2d4c02b092 100644 --- a/indra/newview/skins/default/xui/en/widgets/badge.xml +++ b/indra/newview/skins/default/xui/en/widgets/badge.xml @@ -7,11 +7,14 @@ image="Badge_Background" image_color="BadgeImageColor" label_color="BadgeLabelColor" + label_offset_horiz="0" + label_offset_vert="0" location="top_left" location_percent_hcenter="85" location_percent_vcenter="85" padding_horiz="7" padding_vert="4" requests_front="true" + mouse_opaque="false" > </badge> diff --git a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml index 2c987b158d..95f5cf2ecd 100644 --- a/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml +++ b/indra/newview/skins/default/xui/en/widgets/inbox_folder_view_folder.xml @@ -6,5 +6,14 @@ item_top_pad="4" selection_image="Rounded_Square" > - <new_badge label="New" location="right" location_percent_hcenter="70" /> + <new_badge + label="New" + label_offset_horiz="-1" + location="right" + padding_horiz="4" + padding_vert="1" + location_percent_hcenter="70" + border_image="" + image="Badge_Background_New" + /> </inbox_folder_view_folder> |